@tradecanvas/core 1.18.0 → 1.18.1
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/axis/TimeAxis.d.ts +8 -0
- package/dist/axis/TimeAxis.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/interaction/CrosshairHandler.d.ts +9 -1
- package/dist/interaction/CrosshairHandler.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./gpuContexts-DYrOp3uo.cjs`);let t=require(`@tradecanvas/commons`);var n=class{canvas;ctx;dpr=1;constructor(e,t){this.canvas=document.createElement(`canvas`),this.canvas.style.position=`absolute`,this.canvas.style.top=`0`,this.canvas.style.left=`0`,this.canvas.style.zIndex=String(t),this.canvas.style.pointerEvents=`none`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas)}resize(e,t){this.dpr=t;let n=Math.round(e.width*t),r=Math.round(e.height*t);(this.canvas.width!==n||this.canvas.height!==r)&&(this.canvas.width=n,this.canvas.height=r),this.canvas.style.width=`${e.width}px`,this.canvas.style.height=`${e.height}px`,this.ctx.setTransform(t,0,0,t,0,0)}clear(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.setTransform(this.dpr,0,0,this.dpr,0,0)}getSize(){return{width:this.canvas.width/this.dpr,height:this.canvas.height/this.dpr}}destroy(){this.canvas.remove()}},r=class{scene=null;top=null;back=null;gpuCanvas=null;size=null;dpr=1;constructor(e){this.container=e}createLayers(){this.destroy(),this.scene=new n(this.container,0),this.top=new n(this.container,1)}getLayer(e){return(e===t.LayerType.Hover?this.top:this.scene)??void 0}backLayer(){return this.gpuCanvas?(this.back||(this.back=new n(this.container,0),this.container.insertBefore(this.back.canvas,this.gpuCanvas),this.size&&this.back.resize(this.size,this.dpr)),this.back):null}getDpr(){return this.dpr}dropBackLayer(){this.back?.destroy(),this.back=null}attachGpu(e){this.detachGpu(),e.style.position=`absolute`,e.style.top=`0`,e.style.left=`0`,e.style.zIndex=`0`,e.style.pointerEvents=`none`,this.container.insertBefore(e,this.scene?.canvas??null),this.gpuCanvas=e,this.size&&this.sizeGpu(this.size,this.dpr)}detachGpu(){this.dropBackLayer(),this.gpuCanvas?.remove(),this.gpuCanvas=null}resize(e,t){this.size=e,this.dpr=t,this.scene?.resize(e,t),this.top?.resize(e,t),this.back?.resize(e,t),this.sizeGpu(e,t)}destroy(){this.detachGpu(),this.scene?.destroy(),this.top?.destroy(),this.scene=null,this.top=null}sizeGpu(e,t){let n=this.gpuCanvas;if(!n)return;let r=Math.round(e.width*t),i=Math.round(e.height*t);(n.width!==r||n.height!==i)&&(n.width=r,n.height=i),n.style.width=`${e.width}px`,n.style.height=`${e.height}px`}},i=class{animFrameId=0;running=!1;dirtyLayers=new Set;swapLayers=new Set;callback=null;setCallback(e){this.callback=e}markDirty(e){this.dirtyLayers.add(e),this.running&&!this.animFrameId&&this.scheduleFrame()}markAllDirty(){this.dirtyLayers.add(t.LayerType.Background),this.dirtyLayers.add(t.LayerType.Main),this.dirtyLayers.add(t.LayerType.Overlay),this.dirtyLayers.add(t.LayerType.UI),this.dirtyLayers.add(t.LayerType.Hover),this.running&&!this.animFrameId&&this.scheduleFrame()}start(){this.running=!0,this.markAllDirty()}stop(){this.running=!1,this.animFrameId&&=(cancelAnimationFrame(this.animFrameId),0)}scheduleFrame(){this.animFrameId=requestAnimationFrame(()=>{if(this.animFrameId=0,!(!this.running||!this.callback)&&this.dirtyLayers.size>0){let e=this.dirtyLayers;this.dirtyLayers=this.swapLayers,this.callback(e),e.clear(),this.swapLayers=e}})}},a=class{observer=null;callback=null;currentDpr=1;resizeScheduled=!1;cachedSize;constructor(e){this.container=e,this.currentDpr=window.devicePixelRatio||1,this.cachedSize={width:e.clientWidth,height:e.clientHeight}}getDpr(){return this.currentDpr}getContainerSize(){return this.cachedSize}readContainerSize(){let e=this.container.clientWidth,t=this.container.clientHeight;return(e!==this.cachedSize.width||t!==this.cachedSize.height)&&(this.cachedSize={width:e,height:t}),this.cachedSize}onResize(e){this.callback=e,this.observer=new ResizeObserver(()=>{this.resizeScheduled||(this.resizeScheduled=!0,requestAnimationFrame(()=>{this.resizeScheduled=!1,this.currentDpr=window.devicePixelRatio||1;let e=this.container.clientWidth,t=this.container.clientHeight;e===this.cachedSize.width&&t===this.cachedSize.height||(this.cachedSize={width:e,height:t},this.callback?.(this.cachedSize,this.currentDpr))}))}),this.observer.observe(this.container)}destroy(){this.observer?.disconnect(),this.observer=null,this.callback=null}};function o(e,n,r,i){let a=n.scaleMode??(n.logScale?`logarithmic`:`regular`);return(a===`percentage`||a===`indexedTo100`)&&n.scaleBaseline?(0,t.formatPriceScaleLabel)(e,a,n.scaleBaseline,r,i):n.formatPrice?n.formatPrice(e):(0,t.formatPriceScaleLabel)(e,`regular`,void 0,r,i)}function s(e,t,n){return n!==null&&n>0?Math.max(1,Math.ceil(e/n-1e-9))*n:t===null?e:Math.max(e,10**-t)}function c(e,t,n){return Math.floor(t/n+1e-9)-Math.ceil(e/n-1e-9)+1}function l(e,t){if(!t||!(t>0)||e>=1)return e;let n=t;for(;n<e;)n*=2;return n}var u=12,d=14,f=class{locale=`en-US`;reservedPrice=null;precision=null;tick=null;setPricePrecision(e){this.precision=e!==null&&Number.isInteger(e)&&e>=0?e:null}setPriceTick(e){this.tick=e!==null&&Number.isFinite(e)&&e>0?e:null}scale(e){let{min:n,max:r}=e.priceRange,i=(0,t.computeTickStep)(n,r,8),a=(0,t.autoPricePrecision)(n,r);if(e.priceUnit)return{step:l(i,e.priceUnit),precision:this.precision??a};let o=s(i,this.precision,this.tick);return c(n,r,o)<2?{step:i,precision:Math.max(this.precision??0,a)}:{step:o,precision:this.precision??a}}labelText(e,t){return o(e,t,this.scale(t).precision,this.locale)}setReservedPriceProvider(e){this.reservedPrice=e}setLocale(e){this.locale=e}render(t,n,r,i=`right`,a=[]){let{chartRect:s,priceRange:c}=n,l=i===`left`,f=l?s.x:s.x+s.width;if(c.max-c.min<=0)return;let p=e.T(n);t.strokeStyle=r.style?.axis.price.line??r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(f+.5,s.y),t.lineTo(f+.5,s.y+s.height),t.stroke(),t.globalAlpha=1;let{step:m,precision:h}=this.scale(n),g=Math.ceil(c.min/m-1e-9)*m,_=`500 ${r.font.sizeSmall}px ${r.font.family}`,v=[],y=l?null:this.reservedPrice?.()??null,b=y===null?null:e.w(y,n);for(let e=0;g+e*m<=c.max+m*1e-9;e++){let t=g+e*m,r=p(t);b!==null&&Math.abs(r-b)<u||a.some(e=>Math.abs(r-e)<d)||v.push({y:r,text:o(t,n,h,this.locale)})}t.font=_,t.textBaseline=`middle`,t.textAlign=l?`right`:`left`,t.strokeStyle=r.style?.axis.price.line??r.axisLine,t.globalAlpha=.45,t.beginPath();let x=l?-1:1;for(let{y:e}of v)t.moveTo(f+x,e+.5),t.lineTo(f+4*x,e+.5);t.stroke(),t.globalAlpha=1,t.fillStyle=r.style?.axis.price.text??r.axisLabel;for(let{y:e,text:n}of v)t.fillText(n,f+8*x,e)}};function p(e,t,n,r,i,a){let o=a.shape?.tagRadius,s=typeof o==`number`&&Number.isFinite(o)?Math.max(0,Math.min(o,i/2,r/2)):0;if(!(s>0)){e.fillRect(t,n,r,i);return}e.beginPath(),e.moveTo(t+s,n),e.lineTo(t+r-s,n),e.arcTo(t+r,n,t+r,n+s,s),e.lineTo(t+r,n+i-s),e.arcTo(t+r,n+i,t+r-s,n+i,s),e.lineTo(t+s,n+i),e.arcTo(t,n+i,t,n+i-s,s),e.lineTo(t,n+s),e.arcTo(t,n,t+s,n,s),e.closePath(),e.fill()}function m(e){let t=Math.abs(e);return t>=1e3?1:t>=1?2:t>=.01?4:6}var h=16;function g(e,t,n,r=16){let i=r/2,a=e.map(e=>Math.min(Math.max(e,t+i),n-i));for(let e=1;e<a.length;e++)a[e]=Math.max(a[e],a[e-1]+r);a.length>0&&(a[a.length-1]=Math.min(a[a.length-1],n-i));for(let e=a.length-2;e>=0;e--)a[e]=Math.min(a[e],a[e+1]-r);if(a.length>0&&a[0]<t+i){a[0]=t+i;for(let e=1;e<a.length;e++)a[e]=Math.max(a[e],a[e-1]+r)}return a}function _(e){let t=v(e);if(!t)return`#ffffff`;let[n,r,i]=t;return(.299*n+.587*r+.114*i)/255>.62?`#10131a`:`#ffffff`}function v(e){let t=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(t){let e=t[1].length===3?t[1].replace(/./g,e=>e+e):t[1];return[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16)]}let n=/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/i.exec(e.trim());return n?[Number(n[1]),Number(n[2]),Number(n[3])]:null}function y(e,t,n=[],r=16){let i=r/2,a=n.filter(e=>e.y+e.half>t.top&&e.y-e.half<t.bottom).sort((e,t)=>e.y-t.y),o=e.filter(e=>e.y>=t.top&&e.y<=t.bottom).sort((e,t)=>e.y-t.y),s=[],c=0,l=t.top;for(let e=0;e<=a.length;e++){e>0&&(l=Math.max(l,a[e-1].y+a[e-1].half));let n=l,u=e===a.length?t.bottom:a[e].y-a[e].half,d=e===a.length?1/0:a[e].y,f=c;for(;c<o.length&&o[c].y<d;)c++;let p=o.slice(f,c);if(p.length===0||u-n<r)continue;let m=g(p.map(e=>e.y),n,u,r);p.forEach((e,t)=>{m[t]-i>=n-.5&&m[t]+i<=u+.5&&s.push({...e,y:m[t]})})}return s}function b(e,t,n,r,i){if(t.length!==0){e.save(),e.font=`bold ${i.font.sizeSmall}px ${i.font.family}`,e.textBaseline=`middle`,e.textAlign=`left`;for(let a of t){let t=Math.min(e.measureText(a.text).width+10,r-2);e.fillStyle=a.color,p(e,n+1,Math.round(a.y-8),t,16,i),e.fillStyle=_(a.color),e.fillText(a.text,n+5,Math.round(a.y))}e.restore()}}function x(e,t,n,r,i,a){b(e,y(t,i),n,r,a)}function S(e){return{plot:e,plotText:null,panes:new Map}}function C(e,t,n,r){let i=e.region(t),a=0;for(;a<n.length&&i.step(n[a]);)a++;let o=new Map;for(let t of r){let n=e.region(t.rect).step(t.background),r=e.region(t.inner),i=0;if(n)for(;i<t.steps.length&&r.step(t.steps[i]);)i++;o.set(t.id,{background:n,text:r,rest:t.steps.slice(i)})}return{plot:n.slice(a),plotText:i,panes:o}}var w=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s+r.barSpacing,l=-r.offset+r.chartRect.x+s/2,{min:u,max:d}=r.priceRange;if(d-u===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let f=e.T(r);e.v(t,r=>{let{body:u,wick:d}=e.h(s,r.ratio),p=(u-d)/2,m=new Path2D,h=new Path2D,g=new Path2D,_=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],i=t.close>=t.open,a=r.left(e*c+l,d),o=r.y(f(t.high)),s=r.y(f(t.low));(i?m:h).rect(a,Math.min(o,s),d,Math.max(Math.abs(s-o),1));let v=r.y(f(t.open)),y=r.y(f(t.close));(i?g:_).rect(a-p,Math.min(v,y),u,Math.max(Math.abs(y-v),d))}t.fillStyle=i.candleUpWick,t.fill(m),t.fillStyle=i.candleDownWick,t.fill(h),t.fillStyle=i.candleUp,t.fill(g),t.fillStyle=i.candleDown,t.fill(_)})}};function T(e){if(e.style)return e.style.crosshair;let t=()=>({visible:!0,color:e.crosshair,style:`dashed`,width:1});return{horizontal:t(),vertical:t(),labelBackground:e.text,labelText:e.background}}var E=20,D=8;function O(e,t,n){if(!e)return null;let r=e.region(t,{text:!1});return n.every(e=>r.step(e))?e:null}function k(e){return e<1?Math.ceil(-Math.log10(e))+1:+(e<10)}var ee=class{layerManager;renderLoop;dprManager;renderCtx=null;sceneLayer;topLayer;gpu=null;lostGpu=null;onGpuLost=null;onGpuRestored=null;onContainerResize=null;constructor(e){this.layerManager=new r(e),this.renderLoop=new i,this.dprManager=new a(e),this.layerManager.createLayers(),this.cacheLayerRefs(),this.renderLoop.setCallback(e=>this.render(e)),this.dprManager.onResize((e,t)=>{this.layerManager.resize(e,t),this.renderLoop.markAllDirty(),this.onContainerResize?.(e)});let t=this.dprManager.getContainerSize(),n=this.dprManager.getDpr();this.layerManager.resize(t,n)}cacheLayerRefs(){this.sceneLayer=this.layerManager.getLayer(t.LayerType.Main),this.topLayer=this.layerManager.getLayer(t.LayerType.Hover)}setRenderContext(e){this.renderCtx=e}attachGpu(e){this.detachGpu(),this.placeGpu(e),e.onLost(()=>{this.gpu===e&&(this.gpu=null,this.lostGpu=e,this.layerManager.detachGpu(),this.renderLoop.markAllDirty(),this.onGpuLost?.())}),e.onRestored?.(()=>{this.lostGpu===e&&(this.lostGpu=null,this.placeGpu(e),this.onGpuRestored?.())})}placeGpu(e){this.gpu=e,this.layerManager.attachGpu(e.canvas),this.renderLoop.markAllDirty()}detachGpu(){let e=this.gpu??this.lostGpu;e&&(this.gpu=null,this.lostGpu=null,this.layerManager.detachGpu(),e.destroy(),this.renderLoop.markAllDirty())}renderNow(){this.render(new Set([t.LayerType.Main,t.LayerType.Hover]))}getGpu(){return this.gpu}start(){this.renderLoop.start()}stop(){this.renderLoop.stop()}requestRender(e){e===void 0?this.renderLoop.markAllDirty():this.renderLoop.markDirty(e)}render(e){let n=this.renderCtx;if(!n)return;let{chartRect:r}=n.viewport;if(r.width<=0||r.height<=0)return;let i=!1;for(let n of e)if(n!==t.LayerType.Hover){i=!0;break}i&&this.sceneLayer&&this.renderScene(this.sceneLayer,n),this.topLayer&&this.renderTop(this.topLayer,n)}renderScene(e,n){let{viewport:r,theme:i,data:a}=n;e.clear();let o=e.ctx,s=this.gpu,c=!!s&&n.chartRenderer instanceof w,l=n.chartRenderer?[e=>n.chartRenderer.render(e,a,r,i)]:[],u=[...c?[]:l,...n.compareRenderer?[e=>n.compareRenderer.render(e,a,r,i)]:[],...n.indicatorEngine?.overlayDraws(r,n.leftViewport??void 0)??[]],d=this.paneSteps(n),f={series:!1,volume:!1,background:!1},p=S(u);s?({drawn:f,plan:p}=this.renderGpu(s,n,o,u,d),c&&!f.series&&(p={...p,plot:[...l,...p.plot]})):this.renderBackground(o,n),o.save(),o.beginPath(),o.rect(r.chartRect.x,r.chartRect.y,r.chartRect.width,r.chartRect.height),o.clip(),s||n.depthHeatmap?.render(o,r,i),f.volume||n.volumeRenderer?.render(o,a,r,i),s||(n.volumeProfile?.render(o,a,r,i),n.marketProfile?.render(o,a,r,i)),p.plotText?.drawText(o);for(let e of p.plot)e(o);n.sessionBreaks?.renderLabels(o,r,i,a),n.periodLevels?.render(o,a,r,i),n.pivotMarkers?.render(o,a,r,i),n.renderOverlayPlugins?.(o,`main`),o.restore(),this.renderPanels(o,n,d,p),n.priceLimits&&this.renderPriceLimits(o,r,i,n.priceLimits),n.tradeZoneManager?.render(o,r,i),n.drawingRenderer?.render(o,r,i),n.tradingRenderer?.render(o,r,i),n.signalMarkerManager?.render(o,r,i),n.alertManager?.render(o,r,i),n.priceLines?.render(o,r,i,a);let m=this.fixedAxisTags(n),h=n.indicatorValueLabels===!1?[]:this.overlayValueTags(n,m);n.priceAxis?.render(o,r,i,`right`,[...m.map(e=>e.y),...h.map(e=>e.y)]),b(o,h,r.chartRect.x+r.chartRect.width,r.priceAxisWidth??t.PRICE_AXIS_WIDTH,i),n.leftViewport&&(n.leftPriceAxis?.render(o,n.leftViewport,i,`left`),n.indicatorValueLabels!==!1&&this.renderLeftValueLabels(o,n,n.leftViewport)),n.tradingRenderer?.renderAxisBadges(o,r,i),n.priceLines?.renderAxisTags(o,r,i,a),n.currentPriceLine?.render(o,r,i),n.timeAxis?.render(o,r,i,a,n.timeAxisY),this.renderPanelAxes(o,n)}renderGpu(t,n,r,i,a){let{viewport:o,theme:s,data:c}=n,l=this.layerManager.getDpr(),u=this.underSteps(n),d=!!(n.marketProfile?.isVisible()&&n.marketProfile.drawsText()),f=u.length>0&&!d?O(t.recorder?.(l,r)??null,o.chartRect,u):null,p=u.length>0&&!f,m=t.recorder?.(l,r)??null,h=m?C(m,o.chartRect,i,a):S(i),g=!!(n.volumeProfile?.isVisible()||n.marketProfile?.isVisible()),_=!!n.gridRenderer?.isVisible()&&!e.s(s),v=n.watermark?.isVisible()||p||_?null:{grid:n.gridRenderer?.isVisible()??!1,rects:[...n.sessionShading?.rects(c,o,s)??[],...n.sessionBreaks?.lineRects(o,s,c)??[]]},y=n.volumeRenderer?.isVisible()&&!g?{heightRatio:n.volumeRenderer.getHeightRatio()}:null,b=t.render({data:c,viewport:o,theme:s,dpr:l,candles:n.chartRenderer instanceof w,volume:y,background:v,under:f,recorded:m}),x=b.recorded?h:S(i),T={drawn:{...b,volume:b.volume||g},plan:x},E=v!==null&&!!b.background,D=f!==null&&b.under?[]:u;return E&&D.length===0?(this.layerManager.dropBackLayer(),T):(this.renderBackCanvas(n,D,!E),T)}underSteps(e){let{viewport:t,theme:n,data:r}=e,i=[];return e.depthHeatmap?.isVisible()&&i.push(r=>e.depthHeatmap.render(r,t,n)),(e.volumeProfile?.isVisible()||e.marketProfile?.isVisible())&&(e.volumeRenderer?.isVisible()&&i.push(i=>e.volumeRenderer.render(i,r,t,n)),e.volumeProfile?.isVisible()&&i.push(i=>e.volumeProfile.render(i,r,t,n)),e.marketProfile?.isVisible()&&i.push(i=>e.marketProfile.render(i,r,t,n))),i}renderBackCanvas(e,t,n){let r=this.layerManager.backLayer();r&&(r.clear(),n&&this.renderBackground(r.ctx,e),t.length>0&&this.inPlot(r.ctx,e.viewport,()=>t.forEach(e=>e(r.ctx))))}renderBackground(e,t){let{viewport:n,theme:r,data:i}=t;t.gridRenderer?.render(e,n,r),t.sessionShading?.render(e,i,n,r),t.sessionBreaks?.renderLines(e,n,r,i),t.watermark?.render(e,n,r)}inPlot(e,t,n){e.save(),e.beginPath(),e.rect(t.chartRect.x,t.chartRect.y,t.chartRect.width,t.chartRect.height),e.clip(),n(),e.restore()}renderTop(e,t){let{viewport:n,theme:r,data:i}=t;e.clear();let a=e.ctx;t.measureOverlay?.render(a,n,r),t.selectionBoxOverlay?.render(a,n,r),t.crosshairHandler?.render(a,n,r),t.renderOverlayPlugins?.(a,`overlay`),this.renderPanelCrosshair(a,t),t.crosshairHandler?.renderAxisLabels(a,n,r,i,t.timeAxisY),t.priceAxisAddButton?.render(a,n,r,t.crosshairHandler?.getPosition()??null),t.chartLegend?.render(a,n,r,i),t.barCountdown?.render(a,n,r,i),t.renderOverlayPlugins?.(a,`ui`),this.renderPanelHoverValues(a,t)}paneSteps(e){let{theme:t,panels:n}=e,r=e.indicatorEngine;if(!r||n.length===0)return[];let i=[];for(let e of n){let{rect:n,viewport:a}=e;if(n.width<=0||n.height<=0)continue;let o=e.members?.length?[e.instanceId,...e.members]:[e.instanceId],s=[];for(let e of o){let n=r.isVisible(e)?r.getLevels(e):[];n.length>0&&s.push(e=>this.renderLevels(e,n,a,t))}for(let e of o)s.push(t=>r.renderPanel(t,e,a));i.push({id:e.instanceId,rect:n,inner:{x:n.x,y:n.y+E,width:n.width,height:n.height-E},background:r=>{r.fillStyle=e.style?.background??t.style?.panes.background??t.background,r.fillRect(n.x,n.y,n.width,n.height)},steps:s})}return i}renderPanels(e,t,n,r){let{theme:i}=t,a=t.indicatorEngine;if(!a||n.length===0)return;let o=`10px ${i.font.family}`,s=this.panelDescriptors(a),c=new Map(t.panels.map(e=>[e.instanceId,e.style]));for(let a of n){let{rect:n,inner:l}=a,u=r.panes.get(a.id),d=c.get(a.id);e.save(),e.beginPath(),e.rect(n.x,n.y,n.width,n.height),e.clip(),u?.background||a.background(e),e.fillStyle=d?.separator??i.style?.panes.separator??i.axisLine,e.fillRect(n.x,n.y,n.width,3),e.fillStyle=i.style?.panes.title??i.textSecondary,e.font=o,e.textBaseline=`top`,e.textAlign=`left`;let f=s.get(a.id);f&&t.paneTitles!==!1&&e.fillText(f.descriptor.name,n.x+6,n.y+6),e.save(),e.beginPath(),e.rect(l.x,l.y,l.width,l.height),e.clip(),u?.text?.drawText(e);for(let t of u?u.rest:a.steps)t(e);e.restore(),e.restore()}}fixedAxisTags(t){let{viewport:n,data:r}=t,{chartRect:i}=n,a=[],o=t.currentPriceLine?.isVisible()&&t.theme.style?.lastPrice.visible!==!1?t.currentPriceLine.getPrice():null;o!=null&&a.push({y:e.w(o,n),half:10});for(let i of t.priceLines?.levels(r,n)??[])a.push({y:e.w(i.price,n),half:8});for(let e of t.tradingRenderer?.axisTagYs(n)??[])a.push({y:e,half:9});return a.filter(e=>e.y>=i.y&&e.y<=i.y+i.height)}overlayValueTags(n,r){let i=n.indicatorEngine?.getLatestOverlayValues();if(!i?.length)return[];let{viewport:a}=n,{chartRect:o}=a,s=n.formatPrice??(e=>(0,t.formatPrice)(e,2,n.numberLocale??`en-US`));return y(i.map(t=>({y:e.w(t.value,a),text:s(t.value),color:t.color})),{top:o.y,bottom:o.y+o.height},r)}renderLeftValueLabels(n,r,i){let a=r.indicatorEngine?.getLatestOverlayValues(`left`);if(!a?.length)return;let{chartRect:o}=i,s=r.leftAxisWidth??t.PRICE_AXIS_WIDTH,c=(0,t.autoPricePrecision)(i.priceRange.min,i.priceRange.max),l=r.numberLocale??`en-US`;x(n,a.map(n=>({y:e.w(n.value,i),text:(0,t.formatPrice)(n.value,c,l),color:n.color})),o.x-s,s,{top:o.y,bottom:o.y+o.height},r.theme)}renderLevels(t,n,r,i){if(n.length===0)return;let{chartRect:a}=r;t.save(),t.strokeStyle=i.axisLabel,t.globalAlpha=.45,t.lineWidth=1,t.setLineDash([4,4]),t.beginPath();for(let i of n){let n=Math.round(e.w(i,r))+.5;t.moveTo(a.x,n),t.lineTo(a.x+a.width,n)}t.stroke(),t.restore()}renderPanelAxes(n,r){let{theme:i}=r,a=r.numberLocale??`en-US`,s=`${i.font.sizeSmall}px ${i.font.family}`;for(let c of r.panels){let l=c.viewport,u=c.rect,{min:d,max:f}=l.priceRange;if(f-d<=0||u.height<=0||l.chartRect.height<D)continue;let p=u.x+u.width,h=l.chartRect,g=i.style?.axis.price.line??i.axisLine,_=i.style?.axis.price.text??i.axisLabel;n.strokeStyle=g,n.lineWidth=1,n.beginPath(),n.moveTo(p+.5,u.y),n.lineTo(p+.5,u.y+u.height),n.stroke();let v=(0,t.computeTickStep)(d,f,4),y=Math.ceil(d/v)*v,b=k(v);n.font=s,n.textBaseline=`middle`,n.textAlign=`left`;for(let t=y;t<=f;t+=v){let r=Math.abs(t)<v*1e-6?0:t,i=e.w(r,l);i<h.y||i>h.y+h.height||(n.strokeStyle=g,n.beginPath(),n.moveTo(p,Math.round(i)+.5),n.lineTo(p+4,Math.round(i)+.5),n.stroke(),n.fillStyle=_,n.fillText(o(r,l,b,a),p+6,i))}let S=r.indicatorValueLabels===!1?null:[c.instanceId,...c.members??[]].flatMap(e=>r.indicatorEngine?.getLatestValues(e)??[]);S?.length&&x(n,S.map(n=>({y:e.w(n.value,l),text:l.scaleMode===`percentage`&&l.scaleBaseline?o(n.value,l,2,a):(0,t.formatPrice)(n.value,m(n.value),a),color:n.color})),p,r.viewport.priceAxisWidth??t.PRICE_AXIS_WIDTH,{top:h.y,bottom:h.y+h.height},i)}}renderPanelCrosshair(n,r){let i=r.crosshairHandler?.getPosition();if(!i||r.panels.length===0)return;let{theme:a}=r;for(let o of r.panels){let s=o.rect;if(i.x<s.x||i.x>s.x+s.width||i.y<s.y||i.y>s.y+s.height)continue;let c=o.viewport;if(c.chartRect.height<D)continue;let l=e.k(i.x,c),u=e.b(Math.max(0,Math.min((r.data?.length??1)-1,Math.round(l))),c),d=T(a);if(n.save(),n.beginPath(),n.rect(s.x,s.y,s.width,s.height),n.clip(),d.vertical.visible){n.setLineDash((0,t.lineDash)(d.vertical.style,[4,4],d.vertical.width)),n.strokeStyle=d.vertical.color;let r=e.g(n,u,d.vertical.width);n.lineWidth=r.width,n.beginPath(),n.moveTo(r.x,s.y),n.lineTo(r.x,s.y+s.height),n.stroke()}if(d.horizontal.visible){n.setLineDash((0,t.lineDash)(d.horizontal.style,[4,4],d.horizontal.width)),n.strokeStyle=d.horizontal.color;let r=e._(n,i.y,d.horizontal.width);n.lineWidth=r.width,n.beginPath(),n.moveTo(s.x,r.y),n.lineTo(s.x+s.width,r.y),n.stroke()}n.setLineDash([]),n.restore();break}}renderPanelHoverValues(n,r){let i=r.crosshairHandler?.getPosition(),a=r.indicatorEngine;if(!i||r.panels.length===0)return;let{theme:s,viewport:c,data:l}=r,u=r.numberLocale??`en-US`,d=`${s.font.sizeSmall}px ${s.font.family}`,f=a?this.panelDescriptors(a):null;for(let m of r.panels){let h=m.viewport,g=m.rect,{min:_,max:v}=h.priceRange;if(v-_<=0||g.height<=0||h.chartRect.height<D)continue;let y=g.x+g.width,b=k((0,t.computeTickStep)(_,v,4));if(i.x>=g.x&&i.x<=g.x+g.width&&i.y>=g.y&&i.y<=g.y+g.height){let r=o(e.j(i.y,h),h,b,u);n.font=`bold ${s.font.sizeSmall}px ${s.font.family}`;let a=n.measureText(r).width,l=Math.min(a+10,(c.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2),d=T(s);n.fillStyle=d.labelBackground,p(n,y+1,i.y-9,l,18,s),n.fillStyle=d.labelText,n.textBaseline=`middle`,n.textAlign=`left`,n.fillText(r,y+5,i.y)}if(!a||r.paneTitles===!1)continue;let x=Math.max(0,Math.min((l?.length??1)-1,Math.round(e.k(i.x,h)))),S=a.getOutput(m.instanceId),C=S?.series&&x<S.series.length?S.series[x]:null;if(!C)continue;let w=f?.get(m.instanceId),E=w?.descriptor.plots,O=[];if(E)for(let e of E){let t=C[e.key];t!==void 0&&Number.isFinite(t)&&O.push(`${e.title} ${o(t,h,b,u)}`)}else for(let e in C){let t=C[e];t!==void 0&&O.push(`${e}: ${t.toFixed(b)}`)}if(O.length===0)continue;n.font=d;let ee=w?n.measureText(w.descriptor.name).width+14:10;n.fillStyle=s.textSecondary,n.textBaseline=`top`,n.textAlign=`left`,n.fillText(O.join(` `),g.x+ee,g.y+6)}}panelDescriptors(e){let t=new Map;for(let n of e.getPanelIndicators())t.set(n.instanceId,n);return t}renderPriceLimits(n,r,i,a){let{chartRect:o}=r,s=[{price:a.ceiling,color:a.colors?.ceiling??`#FF00FF`,label:`CE`},{price:a.floor,color:a.colors?.floor??`#00FFFF`,label:`FL`},{price:a.reference,color:a.colors?.reference??`#FFD700`,label:`REF`}],c=`bold 9px ${i.font.family}`,l=`10px ${i.font.family}`;for(let{price:a,color:u,label:d}of s){let s=e.w(a,r);if(s<o.y||s>o.y+o.height)continue;n.setLineDash([8,4]),n.strokeStyle=u,n.lineWidth=1,n.beginPath(),n.moveTo(o.x,Math.round(s)+.5),n.lineTo(o.x+o.width,Math.round(s)+.5),n.stroke(),n.setLineDash([]),n.font=c,n.fillStyle=u,n.textBaseline=`bottom`,n.textAlign=`left`,n.fillText(`${d} ${r.formatPrice?.(a)??a.toFixed(2)}`,o.x+4,s-2);let f=o.x+o.width+1;n.fillStyle=u,p(n,f,s-7,(r.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2,14,i),n.fillStyle=`#000`,n.font=l,n.textBaseline=`middle`,n.textAlign=`left`,n.fillText(r.formatPrice?.(a)??a.toFixed(2),f+4,s)}}destroy(){this.renderLoop.stop(),this.detachGpu(),this.dprManager.destroy(),this.layerManager.destroy()}};async function te(t){let n=e.n();if(!n)return{gpu:null,reason:`limit`};let r;try{r=await Promise.resolve().then(()=>require(`./WebGLSeriesRenderer-Bclv4lzZ.cjs`))}catch(e){return n(),console.warn(`TradeCanvas: the WebGL renderer failed to load, drawing with Canvas 2D.`,e),{gpu:null,reason:`unsupported`}}let i=r.WebGLSeriesRenderer.create({failIfMajorPerformanceCaveat:t===`auto`,release:n});return i?{gpu:i}:(n(),{gpu:null,reason:`unsupported`})}async function ne(e){return(await te(e)).gpu}var re=.25,ie=class{state;priceAxisWidth=t.PRICE_AXIS_WIDTH;stateCache=null;dataLength=0;minBarWidth;maxBarWidth;rightMarginBars;freePan=!0;minVisibleBars=3;constructor(e,n,r=2,i=30,a=5){this.minBarWidth=r,this.maxBarWidth=i,this.rightMarginBars=a;let o=this.computeChartRect(e,n);this.state={visibleRange:{from:0,to:0},priceRange:{min:0,max:1},barWidth:t.DEFAULT_BAR_WIDTH,barSpacing:t.DEFAULT_BAR_SPACING,offset:0,chartRect:o}}getState(){return this.stateCache||={visibleRange:{...this.state.visibleRange},priceRange:{...this.state.priceRange},barWidth:this.state.barWidth,barSpacing:this.state.barSpacing,offset:this.state.offset,chartRect:{...this.state.chartRect},logScale:this.state.logScale,scaleMode:this.state.scaleMode,scaleBaseline:this.state.scaleBaseline,invertScale:this.state.invertScale,priceAxisWidth:this.state.priceAxisWidth,formatPrice:this.state.formatPrice,priceUnit:this.state.priceUnit},this.stateCache}invalidate(){this.stateCache=null}setLogScale(e){this.setScaleMode(e?`logarithmic`:`regular`)}isLogScale(){return(this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`))===`logarithmic`}setScaleMode(e){this.state.scaleMode=e,this.state.logScale=e===`logarithmic`,this.invalidate()}getScaleMode(){return this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`)}setInvertScale(e){this.state.invertScale=e,this.invalidate()}isInvertScale(){return this.state.invertScale===!0}setPriceFormat(e,t=null){this.state.formatPrice=e??void 0,this.state.priceUnit=t??void 0,this.invalidate()}setScaleBaseline(e){this.state.scaleBaseline=e,this.invalidate()}setRightMargin(e){this.rightMarginBars=e}getRightMargin(){return this.rightMarginBars}setPanLimits(e){e.freePan!==void 0&&(this.freePan=e.freePan),e.minVisibleBars!==void 0&&(this.minVisibleBars=Math.max(1,Math.floor(e.minVisibleBars))),this.clampOffset(),this.updateVisibleRange()}endOffset(){let e=this.state.barWidth+this.state.barSpacing;return this.dataLength*e-this.state.chartRect.width+this.rightMarginBars*e}setPriceAxisWidth(e){this.priceAxisWidth!==e&&(this.priceAxisWidth=e,this.state.priceAxisWidth=e,this.invalidate())}computeChartRect(e,n){return{x:0,y:0,width:Math.max(0,e-this.priceAxisWidth),height:Math.max(0,n-t.TIME_AXIS_HEIGHT)}}resize(e,t){this.state.chartRect=this.computeChartRect(e,t),this.invalidate(),this.clampUnit(),this.clampOffset()}setChartRect(e){this.state.chartRect={x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)},this.invalidate(),this.clampUnit(),this.clampOffset(),this.updateVisibleRange()}floorUnit(){return this.minBarWidth+t.DEFAULT_BAR_SPACING}minUnit(){let e=this.floorUnit(),t=this.state.chartRect.width,n=this.dataLength+this.rightMarginBars;return t<=0||n<=0?e:Math.max(re,Math.min(e,t/n))}maxUnit(){return this.maxBarWidth+t.DEFAULT_BAR_SPACING}applyUnit(e){let n=this.floorUnit();if(e>=n)this.state.barWidth=e-t.DEFAULT_BAR_SPACING,this.state.barSpacing=t.DEFAULT_BAR_SPACING;else{let t=this.minBarWidth/n;this.state.barWidth=e*t,this.state.barSpacing=e-this.state.barWidth}this.invalidate()}clampUnit(){let e=this.state.barWidth+this.state.barSpacing,n=(0,t.clamp)(e,this.minUnit(),this.maxUnit());n===e||e<=0||(this.state.offset=this.state.offset/e*n,this.applyUnit(n))}updateData(e,n){let r=this.dataLength===0;this.dataLength=e.length,this.dataLength!==0&&(this.clampUnit(),r&&(this.state.offset=this.endOffset()),this.clampOffset(),this.updateVisibleRange(),n&&(this.state.priceRange=(0,t.computePriceRange)(e,this.state.visibleRange.from,Math.min(this.state.visibleRange.to,this.dataLength-1),.08),this.invalidate()))}prependBars(e){e===0||!Number.isFinite(e)||(this.dataLength+=e,this.state.offset+=e*(this.state.barWidth+this.state.barSpacing),this.invalidate(),this.updateVisibleRange())}setPriceRange(e,t){this.state.priceRange={min:e,max:t},this.invalidate()}scalePriceRange(e){if(!Number.isFinite(e)||e<=0)return;let{min:t,max:n}=this.state.priceRange,r=(t+n)/2,i=(n-t)/2,a=Math.max(i*e,1e-9);this.state.priceRange={min:r-a,max:r+a},this.invalidate()}scrollBy(e){this.state.offset+=e,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}panPriceRange(e){let t=this.state.chartRect.height;if(t<=0||e===0)return;let{min:n,max:r}=this.state.priceRange,i=(this.state.invertScale?-e:e)/t;if(this.isLogScale()&&n>0&&r>0){let e=Math.log(n),t=Math.log(r),a=(t-e)*i;this.state.priceRange={min:Math.exp(e-a),max:Math.exp(t-a)},this.invalidate();return}let a=(r-n)*i;this.state.priceRange={min:n-a,max:r-a},this.invalidate()}isAtEnd(){let e=this.state.barWidth+this.state.barSpacing;return Math.abs(this.state.offset-this.endOffset())<=e*2}scrollToEnd(){this.state.offset=this.endOffset(),this.invalidate(),this.updateVisibleRange()}zoom(e,n){let r=this.state.barWidth+this.state.barSpacing,i=this.state.barWidth*(1+e),a=(0,t.clamp)(r>=this.floorUnit()&&i>=this.minBarWidth?i+t.DEFAULT_BAR_SPACING:r*(1+e),this.minUnit(),this.maxUnit());if(a===r)return;let o=this.isAtEnd(),s=(this.state.offset+n)/r;this.applyUnit(a),this.state.offset=o?this.endOffset():s*a-n,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}zoomToBarRange(e,n){let r=this.state.chartRect.width;if(r<=0||!Number.isFinite(e)||!Number.isFinite(n)||n<e)return;let i=(0,t.clamp)(r/(n-e+1),this.minUnit(),this.maxUnit());this.applyUnit(i),this.state.offset=(e+n+1)/2*i-r/2,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}clampOffset(){if(this.state.chartRect.width<=0)return;let e=this.state.barWidth+this.state.barSpacing,n=this.state.chartRect.width,r=this.endOffset(),i,a;if(this.freePan&&this.dataLength>0){let t=Math.min(this.minVisibleBars,this.dataLength);i=t*e-n,a=(this.dataLength-t)*e,i=Math.min(i,r),a=Math.max(a,r)}else if(r>0)i=-(n*.5),a=r;else{let e=n*.5;i=r-e,a=r+e}this.state.offset=(0,t.clamp)(this.state.offset,i,a),this.invalidate()}updateVisibleRange(){let e=this.state.barWidth+this.state.barSpacing;if(e<=0||this.state.chartRect.width<=0)return;let t=Math.floor(this.state.offset/e),n=Math.ceil(this.state.chartRect.width/e)+1,r=Math.min(t+n,this.dataLength-1);this.state.visibleRange={from:Math.max(0,t),to:Math.max(0,r)},this.invalidate()}};function ae(e,n){return(0,t.sliceVisibleData)(e,n.visibleRange.from,n.visibleRange.to)}var oe=[`1D`,`5D`,`1M`,`3M`,`6M`,`YTD`,`1Y`,`5Y`,`All`],se=864e5,ce=6e4,le={"1M":1,"3M":3,"6M":6,"1Y":12,"5Y":60};function ue(e,t){let n=new Date(e),r=n.getUTCFullYear(),i=n.getUTCMonth()+t,a=new Date(Date.UTC(r,i+1,0)).getUTCDate();return Date.UTC(r,i,Math.min(n.getUTCDate(),a),n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds(),n.getUTCMilliseconds())}function de(e,n,r=0){if(e===`All`)return null;if(e===`1D`)return n-se;if(e===`5D`)return n-5*se;let i=n+(0,t.offsetAt)(r,n)*ce;return e===`YTD`?(0,t.wallToUtc)(Date.UTC(new Date(i).getUTCFullYear(),0,1),r):(0,t.wallToUtc)(ue(i,-(le[e]??0)),r)}function fe(e,t,n){if(t>=e){let t=Array(Math.max(0,e));for(let n=0;n<e;n++)t[n]=n;return t}if(t<=2)return e>=2?[0,e-1]:e===1?[0]:[];let r=[0],i=(e-2)/(t-2),a=0;for(let o=0;o<t-2;o++){let t=Math.floor((o+1)*i)+1,s=Math.floor((o+2)*i)+1;s>e&&(s=e);let c=0,l=0,u=0;for(let e=t;e<s;e++)c+=e,l+=n(e),u++;if(u>0)c/=u,l/=u;else{let r=Math.min(t,e-1);c=r,l=n(r)}let d=Math.floor(o*i)+1,f=Math.floor((o+1)*i)+1,p=n(a),m=-1,h=d;for(let e=d;e<f;e++){let t=Math.abs((a-c)*(n(e)-p)-(a-e)*(l-p));t>m&&(m=t,h=e)}r.push(h),a=h}return r.push(e-1),r}var pe=64;function me(e,t,n,r,i){let a=Math.max(0,e),o=Math.min(t,n-1);if(o<a)return[];let s=o-a+1,c=Math.max(pe,Math.ceil(r*2));if(s<=c){let e=Array(s);for(let t=0;t<s;t++)e[t]=a+t;return e}let l=fe(s,c,e=>i(a+e));for(let e=0;e<l.length;e++)l[e]+=a;return l}var he=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let s=r.barWidth+r.barSpacing,c=-r.offset+r.chartRect.x+r.barWidth/2,{min:l,max:u}=r.priceRange;if(u-l===0)return;let d=e.T(r);t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`;let f=me(a,o,n.length,r.chartRect.width,e=>n[e].close),p=!1;for(let e of f){let r=e*s+c,i=d(n[e].close);p?t.lineTo(r,i):(t.moveTo(r,i),p=!0)}t.stroke()}},ge=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let s=r.barWidth+r.barSpacing,c=-r.offset+r.chartRect.x+r.barWidth/2,{min:l,max:u}=r.priceRange;if(u-l===0)return;let d=e.T(r),f=d(l),p=me(a,o,n.length,r.chartRect.width,e=>n[e].close);if(p.length===0)return;let m=p[0],h=m*s+c,g=d(n[m].close),_=t.createLinearGradient(0,d(u),0,f);_.addColorStop(0,i.areaTopColor),_.addColorStop(1,i.areaBottomColor),t.beginPath(),t.moveTo(h,f),t.lineTo(h,g);let v=h;for(let e=1;e<p.length;e++){let r=p[e];v=r*s+c,t.lineTo(v,d(n[r].close))}t.lineTo(v,f),t.closePath(),t.fillStyle=_,t.fill(),t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`,t.moveTo(h,g);for(let e=1;e<p.length;e++){let r=p[e];t.lineTo(r*s+c,d(n[r].close))}t.stroke()}},_e=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s+r.barSpacing,l=-r.offset+r.chartRect.x+s/2,{min:u,max:d}=r.priceRange;if(d-u===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let f=e.T(r);e.v(t,r=>{let{body:u,wick:d}=e.h(s,r.ratio),p=Math.max((u-d)/2,d),m=new Path2D,h=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],i=t.close>=t.open?m:h,a=r.left(e*c+l,d),o=r.y(f(t.high)),s=r.y(f(t.low));i.rect(a,Math.min(o,s),d,Math.max(Math.abs(s-o),d)),i.rect(a-p,r.y(f(t.open))-Math.floor(d/2),p,d),i.rect(a+d,r.y(f(t.close))-Math.floor(d/2),p,d)}t.fillStyle=i.candleUp,t.fill(m),t.fillStyle=i.candleDown,t.fill(h)})}},ve=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s+r.barSpacing,l=-r.offset+r.chartRect.x+s/2,{min:u,max:d}=r.priceRange;if(d-u===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let f=e.T(r);e.v(t,r=>{let{body:u,wick:d}=e.h(s,r.ratio),p=(u-d)/2,m={up:new Path2D,down:new Path2D},h={up:new Path2D,down:new Path2D},g={up:new Path2D,down:new Path2D};for(let e=a;e<=o&&e<n.length;e++){let t=n[e],i=e===0||t.close>=n[e-1].close?`up`:`down`,a=r.left(e*c+l,d),o=a-p,s=r.y(f(t.high)),_=r.y(f(t.low)),v=r.y(f(t.open)),y=r.y(f(t.close)),b=Math.min(v,y),x=Math.max(Math.abs(y-v),d);t.close>=t.open?(b>s&&m[i].rect(a,s,d,b-s),_>b+x&&m[i].rect(a,b+x,d,_-b-x),g[i].rect(o+d/2,b+d/2,Math.max(u-d,0),Math.max(x-d,0))):(m[i].rect(a,Math.min(s,_),d,Math.max(Math.abs(_-s),1)),h[i].rect(o,b,u,x))}for(let e of[`up`,`down`]){let n=e===`up`?i.candleUp:i.candleDown;t.fillStyle=n,t.fill(m[e]),t.fill(h[e]),t.strokeStyle=n,t.lineWidth=d,t.stroke(g[e])}})}},ye=32/255,be=class{baselinePrice=null;setBaseline(e){this.baselinePrice=e}render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=e.T(r),h=m(this.baselinePrice??this.computeBaseline(n,a,o)),{chartRect:g}=r,_=[],v=[];for(let e=a;e<=o&&e<n.length;e++)_.push(p(e)),v.push(m(n[e].close));if(_.length<2)return;let y=_.length-1;t.save();let b=m(f),x=m(d),S=new Path2D;S.rect(g.x,Math.min(h,b),g.width,Math.abs(b-h)),t.clip(S);let C=new Path2D;C.moveTo(_[0],h);for(let e=0;e<=y;e++)C.lineTo(_[e],v[e]);C.lineTo(_[y],h),C.closePath(),t.globalAlpha*=ye,t.fillStyle=i.candleUp,t.fill(C),t.restore(),t.save();let w=new Path2D;w.rect(g.x,Math.min(h,x),g.width,Math.abs(x-h)),t.clip(w);let T=new Path2D;T.moveTo(_[0],h);for(let e=0;e<=y;e++)T.lineTo(_[e],v[e]);T.lineTo(_[y],h),T.closePath(),t.globalAlpha*=ye,t.fillStyle=i.candleDown,t.fill(T),t.restore();let E=new Path2D,D=new Path2D,O=null;for(let e=1;e<=y;e++){let t=r.invertScale?v[e]>=h:v[e]<=h,n=t?E:D;t!==O&&n.moveTo(_[e-1],v[e-1]),O=t,n.lineTo(_[e],v[e])}t.save(),t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`,t.strokeStyle=i.candleUp,t.stroke(E),t.strokeStyle=i.candleDown,t.stroke(D),t.restore(),t.setLineDash([6,4]),t.strokeStyle=i.textSecondary,t.lineWidth=1;let k=new Path2D;k.moveTo(g.x,h),k.lineTo(g.x+g.width,h),t.stroke(k),t.setLineDash([])}computeBaseline(e,t,n){let r=0,i=0;for(let a=t;a<=n&&a<e.length;a++)r+=e[a].close,i++;return i>0?r/i:0}},xe=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=e.T(r),h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=p(e),i=t.close>=t.open,a=m(Math.max(t.open,t.close)),o=m(Math.min(t.open,t.close)),l=Math.min(a,o),u=Math.max(Math.abs(o-a),1),d=r-c;i?(h.rect(d,l,s,u),_.rect(d,l,s,u)):(g.rect(d,l,s,u),v.rect(d,l,s,u))}t.fillStyle=i.candleUp,t.fill(h),t.fillStyle=i.candleDown,t.fill(g),t.lineWidth=1,t.strokeStyle=i.candleUp,t.stroke(_),t.strokeStyle=i.candleDown,t.stroke(v)}},Se=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=e.T(r),h=new Path2D,g=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=p(e),i=t.close>=t.open,a=m(t.high),s=m(t.low),c=i?s:a,l=i?h:g;l.moveTo(r,i?a:s),l.lineTo(r,c),e<o&&e+1<n.length&&l.lineTo(p(e+1),c)}t.save(),t.lineJoin=`round`,t.strokeStyle=i.candleUp,t.lineWidth=3,t.stroke(h),t.strokeStyle=i.candleDown,t.lineWidth=1,t.stroke(g),t.restore()}},Ce=class{boxSize=1;setBoxSize(e){this.boxSize=e}render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange,p=f-d;if(p===0||!(this.boxSize>0))return;let m=r.chartRect.height/p,h=e=>e*l+u,g=e.T(r),_=Math.abs(this.boxSize*m),v=Math.min(c*.8,_*.8)*.5,y=new Path2D,b=new Path2D,x=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=h(e),i=t.close>=t.open,a=t.high,o=t.low,s=Math.max(1,Math.round((a-o)/this.boxSize)),c=Math.max(0,Math.floor((d-o)/this.boxSize)-1),l=Math.min(s-1,Math.ceil((f-o)/this.boxSize)),u=Math.max(1,Math.ceil(1/_));for(let e=c;e<=l;e+=u){let t=g(o+(e+.5)*this.boxSize);i?(y.moveTo(r-v,t-v),y.lineTo(r+v,t+v),b.moveTo(r+v,t-v),b.lineTo(r-v,t+v)):(x.moveTo(r+v,t),x.arc(r,t,v,0,Math.PI*2))}}t.lineWidth=1.5,t.strokeStyle=i.candleUp,t.stroke(y),t.stroke(b),t.strokeStyle=i.candleDown,t.stroke(x)}},we=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,{min:s,max:c}=r.priceRange;if(c-s===0||a>o||n.length===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=r.barWidth,f=0;for(let e=a;e<=o&&e<n.length;e++)n[e].volume>f&&(f=n[e].volume);f===0&&(f=1);let p=e=>e*l+u,m=e.T(r);e.v(t,r=>{let{wick:s}=e.h(d,r.ratio),c=new Path2D,l=new Path2D,u=new Path2D,h=new Path2D;for(let t=a;t<=o&&t<n.length;t++){let i=n[t],a=i.close>=i.open,o=r.left(p(t),s),g=r.y(m(i.high)),_=r.y(m(i.low));(a?c:l).rect(o,Math.min(g,_),s,Math.max(Math.abs(_-g),1));let{body:v}=e.h(d*Math.max(.2,i.volume/f),r.ratio),y=r.y(m(i.open)),b=r.y(m(i.close));(a?u:h).rect(o-(v-s)/2,Math.min(y,b),v,Math.max(Math.abs(b-y),s))}t.fillStyle=i.candleUpWick,t.fill(c),t.fillStyle=i.candleDownWick,t.fill(l),t.fillStyle=i.candleUp,t.fill(u),t.fillStyle=i.candleDown,t.fill(h)})}},Te=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,{min:s,max:c}=r.priceRange;if(c-s===0||a>o||n.length===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=r.barWidth,f=0;for(let e=a;e<=o&&e<n.length;e++)n[e].volume>f&&(f=n[e].volume);f===0&&(f=1);let p=new Path2D,m=new Path2D,h=new Path2D,g=new Path2D,_=e=>e*l+u,v=e.T(r);for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=e>0?n[e-1]:t,i=_(e),a=v(t.high),o=v(t.low),s=t.close>=r.close,c=d*Math.max(.15,t.volume/f),l=c/2,u=Math.min(a,o),y=Math.max(Math.abs(o-a),1),b=s?p:m,x=s?h:g;b.rect(i-l,u,c,y),x.rect(i-l,u,c,y)}t.fillStyle=Ee(i.candleUp,.55),t.fill(p),t.fillStyle=Ee(i.candleDown,.55),t.fill(m),t.lineWidth=1,t.strokeStyle=i.candleUpWick,t.stroke(h),t.strokeStyle=i.candleDownWick,t.stroke(g)}};function Ee(e,t){if(e.startsWith(`#`)){let n=Math.round(Math.max(0,Math.min(1,t))*255).toString(16).padStart(2,`0`);if(e.length===7)return`${e}${n}`;if(e.length===9)return`${e.slice(0,7)}${n}`}return e}var De=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let{min:s,max:c}=r.priceRange;if(c-s===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=e=>e*l+u,f=e.T(r),p=[],m=[];for(let e=a;e<=o&&e<n.length;e++){let t=d(e);p.push({x:t,y:f(n[e].high)}),m.push({x:t,y:f(n[e].low)})}if(p.length===0)return;let h=t.createLinearGradient(0,f(c),0,f(s));h.addColorStop(0,i.areaTopColor),h.addColorStop(1,i.areaBottomColor),t.beginPath(),t.moveTo(p[0].x,p[0].y);for(let e=1;e<p.length;e++)t.lineTo(p[e].x,p[e].y);for(let e=m.length-1;e>=0;e--)t.lineTo(m[e].x,m[e].y);t.closePath(),t.fillStyle=h,t.fill(),t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`;for(let e=a;e<=o&&e<n.length;e++){let r=d(e),i=f(n[e].close);e===a?t.moveTo(r,i):t.lineTo(r,i)}t.stroke()}},Oe=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let{min:s,max:c}=r.priceRange;if(c-s===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=e=>e*l+u,f=e.T(r);t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`miter`;let p=0;for(let e=a;e<=o&&e<n.length;e++){let r=d(e),i=f(n[e].close);e===a?t.moveTo(r,i):(t.lineTo(r,p),t.lineTo(r,i)),p=i}t.stroke()}},ke=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let{min:s,max:c}=r.priceRange;if(c-s===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=e=>e*l+u,f=e.T(r);t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`;let p=[];for(let e=a;e<=o&&e<n.length;e++){let r=d(e),i=f(n[e].close);p.push({x:r,y:i}),e===a?t.moveTo(r,i):t.lineTo(r,i)}t.stroke();let m=Math.max(2,Math.min(4,r.barWidth*.3)),h=new Path2D;for(let{x:e,y:t}of p)h.moveTo(e+m,t),h.arc(e,t,m,0,Math.PI*2);t.fillStyle=i.lineColor,t.fill(h),t.strokeStyle=i.background,t.lineWidth=1,t.stroke(h)}},Ae=28,je=3,Me=class{priceText=null;setPriceText(e){this.priceText=e}render(n,r,i,a){let{from:o,to:s}=i.visibleRange,{min:c,max:l}=i.priceRange;if(l===c)return;if(e.f(i)){e.p(n,r,i,a.candleUp,a.candleDown);return}let u=i.barWidth+i.barSpacing,d=-i.offset+i.chartRect.x+i.barWidth/2,f=e.T(i),p=Math.max(1,Math.round(i.barWidth*.6)),m=i.barWidth>=Ae,h=(0,t.autoPricePrecision)(c,l),g=e=>i.formatPrice?.(e)??this.priceText?.(e)??(0,t.formatPrice)(e,h);m&&(n.font=`${a.font.sizeSmall}px ${a.font.family}`,n.textAlign=`center`);for(let e=Math.max(0,o);e<=s&&e<r.length;e++){let t=r[e],i=e*u+d,o=Math.min(f(t.high),f(t.low)),s=Math.max(f(t.high),f(t.low));if(n.fillStyle=t.close>=t.open?a.candleUp:a.candleDown,n.fillRect(Math.round(i-p/2),o,p,Math.max(1,s-o)),!m)continue;let c=f(t.high)<=f(t.low);n.textBaseline=`bottom`,n.fillText(g(c?t.high:t.low),i,o-je),n.textBaseline=`top`,n.fillText(g(c?t.low:t.high),i,s+je)}}},Ne=class{visible=!0;heightRatio=.15;setVisible(e){this.visible=e}isVisible(){return this.visible}setHeightRatio(e){this.heightRatio=Math.max(.05,Math.min(.5,e))}getHeightRatio(){return this.heightRatio}render(n,r,i,a){if(!this.visible||r.length===0)return;let{from:o,to:s}=i.visibleRange,{chartRect:c}=i,l=i.barWidth,u=l+i.barSpacing,d=-i.offset+c.x+l/2,f=0;for(let e=o;e<=s&&e<r.length;e++)r[e].volume>f&&(f=r[e].volume);if(f===0)return;let p=c.y+c.height,m=c.height*this.heightRatio/f;e.v(n,c=>{let f=new Path2D,h=new Path2D,g=c.y(p),_=(e,t,n,r)=>{let i=c.y(p-r*m);g-i>=1&&e.rect(t,i,n,g-i)};if(e.f(i))e.d(r,o,s,e=>e*u+d,e=>{let t=c.x(e.x);_(e.close>=e.open?f:h,t,Math.max(1,c.x(e.x+1)-t),e.volume)});else{let{body:t,wick:n}=e.h(l,c.ratio),i=(t-n)/2;for(let e=o;e<=s&&e<r.length;e++){let a=r[e];_(a.close>=a.open?f:h,c.left(e*u+d,n)-i,t,a.volume)}}let v=(0,t.resolveVolumeColors)(a);n.fillStyle=v.up,n.fill(f),n.fillStyle=v.down,n.fill(h)})}},Pe=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;highlightPoC=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setHighlightPoC(e){this.highlightPoC=e}render(t,n,r,i){if(!this.visible||n.length===0)return;let{from:a,to:o}=r.visibleRange,{chartRect:s,priceRange:c}=r,l=c.max-c.min;if(l<=0)return;let u=new Float64Array(this.buckets),d=new Float64Array(this.buckets),f=new Float64Array(this.buckets);for(let e=a;e<=o&&e<n.length;e++){let t=n[e];if(t.volume<=0)continue;let r=Math.max(t.low,c.min),i=Math.min(t.high,c.max);if(i<=r)continue;let a=(r-c.min)/l,o=(i-c.min)/l,s=Math.max(0,Math.floor(a*this.buckets)),p=Math.min(this.buckets-1,Math.floor(o*this.buckets)),m=Math.max(1,p-s+1),h=t.volume/m,g=t.close>=t.open;for(let e=s;e<=p;e++)u[e]+=h,g?d[e]+=h:f[e]+=h}let p=0,m=-1;for(let e=0;e<u.length;e++)u[e]>p&&(p=u[e],m=e);if(p===0)return;let h=s.width*this.widthRatio,g=s.x+s.width,_=e.T(r),v=1/p;t.save(),t.globalAlpha=this.opacity;for(let n=0;n<this.buckets;n++){let a=u[n];if(a===0)continue;let o=e.C(n,this.buckets,r,_),c=a*v*h,l=d[n]*v*h,p=f[n]*v*h;l>0&&(t.fillStyle=i.candleUp,t.fillRect(g-l,o.top+.5,l,o.height-1)),p>0&&(t.fillStyle=i.candleDown,t.fillRect(g-c,o.top+.5,p,o.height-1)),this.highlightPoC&&n===m&&(t.globalAlpha=1,t.strokeStyle=i.crosshair,t.lineWidth=1,t.setLineDash([3,2]),t.beginPath(),t.moveTo(s.x,o.mid+.5),t.lineTo(g-c-2,o.mid+.5),t.stroke(),t.setLineDash([]),t.globalAlpha=this.opacity)}t.restore()}};function Fe(e,t){return e<0?0:e>t?t:e}function Ie(e,t,n,r={}){let i=Math.max(4,Math.min(500,Math.floor(r.buckets??48))),a=n-t;if(a<=0||e.length===0)return null;let o=a/i,s=new Float64Array(i);for(let r of e){let e=Math.min(r.low,r.high),a=Math.max(r.low,r.high);if(a<t||e>n)continue;let c=Fe(Math.floor((e-t)/o),i-1),l=Fe(Math.floor((a-t)/o),i-1);for(let e=c;e<=l;e++)s[e]+=1}let c=0,l=0,u=0;for(let e=0;e<i;e++)u+=s[e],s[e]>l&&(l=s[e],c=e);if(u===0)return null;let d=u*(r.valueAreaPct??.7),f=c,p=c,m=s[c];for(;m<d&&(f>0||p<i-1);){let e=f>0?s[f-1]:-1;(p<i-1?s[p+1]:-1)>=e?(p+=1,m+=s[p]):(--f,m+=s[f])}let h=[];for(let e=0;e<i;e++){let n=t+e*o;h.push({low:n,high:n+o,mid:n+o/2,count:s[e]})}return{buckets:h,pocIndex:c,maxCount:l,totalCount:u,valueAreaLow:t+f*o,valueAreaHigh:t+(p+1)*o}}function Le(e){let t=(e%52+52)%52;return t<26?String.fromCharCode(65+t):String.fromCharCode(97+t-26)}function Re(e,t,n,r=48){let i=Math.max(4,Math.min(500,Math.floor(r))),a=n-t,o=Array.from({length:i},()=>[]);if(a<=0)return o;let s=a/i;return e.forEach((e,r)=>{let a=Math.min(e.low,e.high),c=Math.max(e.low,e.high);if(c<t||a>n)return;let l=Math.max(0,Math.min(i-1,Math.floor((a-t)/s))),u=Math.max(0,Math.min(i-1,Math.floor((c-t)/s)));for(let e=l;e<=u;e++)o[e].push(r)}),o}function ze(e,n,r,i={}){if(e.length===0||r-n<=0)return[];let a=[],o=0,s=(0,t.timeframeBucketStart)(e[0].time,`1d`),c=(t,o,s)=>{let c=Ie(e.slice(t,o+1),n,r,i);c&&a.push({startIndex:t,endIndex:o,startTime:s,profile:c})};for(let n=1;n<e.length;n++){let r=(0,t.timeframeBucketStart)(e[n].time,`1d`);r!==s&&(c(o,n-1,s),o=n,s=r)}return c(o,e.length-1,s),a}var Be=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;valueAreaPct=.7;highlightPoC=!0;showStats=!0;splitBySession=!1;letters=!1;lastStats=null;setVisible(e){this.visible=e,e||(this.lastStats=null)}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setValueAreaPct(e){this.valueAreaPct=Math.max(.3,Math.min(.95,e))}setHighlightPoC(e){this.highlightPoC=e}setShowStats(e){this.showStats=e}setSplitBySession(e){this.splitBySession=e}isSplitBySession(){return this.splitBySession}setLetters(e){this.letters=e}drawsText(){return this.splitBySession?this.letters:this.showStats}getStats(){return this.lastStats}render(t,n,r,i){if(!this.visible||n.length===0)return;let{from:a,to:o}=r.visibleRange,{chartRect:s,priceRange:c}=r,l=Math.max(0,a),u=Math.min(o,n.length-1);if(u<l)return;let d=n.slice(l,u+1);if(this.splitBySession){this.lastStats=null,this.renderSplit(t,d,l,r,i);return}let f=Ie(d,c.min,c.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(!f){this.lastStats=null;return}let p=f.buckets[f.pocIndex].mid;this.lastStats={poc:p,vah:f.valueAreaHigh,val:f.valueAreaLow,valueAreaPct:this.valueAreaPct};let m=f.buckets.length,h=s.width*this.widthRatio,g=s.x,_=e.T(r),v=1/f.maxCount;t.save();for(let n=0;n<m;n++){let a=f.buckets[n];if(a.count===0)continue;let o=e.C(n,m,r,_),s=a.count*v*h,c=a.mid>=f.valueAreaLow&&a.mid<=f.valueAreaHigh;t.globalAlpha=c?Math.min(1,this.opacity+.18):this.opacity,t.fillStyle=c?i.candleUp:i.textSecondary,t.fillRect(g,o.top+.5,s,o.height-1)}t.globalAlpha=.6,t.strokeStyle=i.candleUp,t.lineWidth=1,t.setLineDash([1,3]);for(let e of[f.valueAreaHigh,f.valueAreaLow]){let n=_(e);t.beginPath(),t.moveTo(g,Math.round(n)+.5),t.lineTo(s.x+s.width,Math.round(n)+.5),t.stroke()}if(t.setLineDash([]),this.highlightPoC){let e=_(p);t.globalAlpha=1,t.strokeStyle=i.crosshair,t.lineWidth=1,t.setLineDash([3,2]),t.beginPath(),t.moveTo(g,Math.round(e)+.5),t.lineTo(s.x+s.width,Math.round(e)+.5),t.stroke(),t.setLineDash([])}this.showStats&&this.drawStats(t,s.x+6,s.y+6,p,f.valueAreaHigh,f.valueAreaLow,i),t.restore()}renderSplit(t,n,r,i,a){let{chartRect:o,priceRange:s}=i,c=ze(n,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(c.length===0)return;let l=e.T(i),u=i.barWidth/2;t.save();for(let d of c){let c=d.profile,f=c.buckets.length,p=o.height/f,m=e.b(r+d.startIndex,i)-u,h=e.b(r+d.endIndex,i)+u,g=Math.max(2,h-m),_=1/c.maxCount,v=this.letters&&p>=7,y=v?Re(n.slice(d.startIndex,d.endIndex+1),s.min,s.max,this.buckets):null;if(v&&y){t.font=`${Math.min(11,Math.floor(p))}px ui-monospace, monospace`,t.textBaseline=`middle`,t.textAlign=`left`;let n=Math.max(1,Math.floor(g/6));for(let r=0;r<f;r++){let o=y[r];if(o.length===0)continue;let s=e.C(r,f,i,l).mid,u=c.buckets[r].mid>=c.valueAreaLow&&c.buckets[r].mid<=c.valueAreaHigh;t.globalAlpha=u?.95:.6,t.fillStyle=u?a.candleUp:a.textSecondary;let d=Math.min(o.length,n);for(let e=0;e<d;e++)t.fillText(Le(o[e]),m+e*6,s)}}else for(let n=0;n<f;n++){let r=c.buckets[n];if(r.count===0)continue;let o=e.C(n,f,i,l),s=r.count*_*g,u=r.mid>=c.valueAreaLow&&r.mid<=c.valueAreaHigh;t.globalAlpha=u?Math.min(1,this.opacity+.18):this.opacity,t.fillStyle=u?a.candleUp:a.textSecondary,t.fillRect(m,o.top+.5,s,o.height-1)}if(this.highlightPoC){let e=l(c.buckets[c.pocIndex].mid);t.globalAlpha=1,t.strokeStyle=a.crosshair,t.lineWidth=1,t.setLineDash([3,2]),t.beginPath(),t.moveTo(m,Math.round(e)+.5),t.lineTo(Math.min(h,o.x+o.width),Math.round(e)+.5),t.stroke(),t.setLineDash([])}}t.restore()}drawStats(e,t,n,r,i,a,o){let s=Ve(r),c=[[`POC`,r.toFixed(s),o.crosshair],[`VAH`,i.toFixed(s),o.candleUp],[`VAL`,a.toFixed(s),o.candleUp]];e.globalAlpha=1,e.font=`600 10px ${o.font.family}`,e.textBaseline=`middle`;let l=0;for(let[,t]of c)l=Math.max(l,e.measureText(t).width);let u=38+l,d=6+c.length*14;e.fillStyle=o.background,e.globalAlpha=.82,He(e,t,n,u,d,4),e.fill(),e.globalAlpha=1,c.forEach(([r,i,a],s)=>{let c=n+6/2+14/2+s*14;e.fillStyle=a,e.textAlign=`left`,e.fillText(r,t+6,c),e.fillStyle=o.text,e.textAlign=`right`,e.fillText(i,t+u-6,c)}),e.textAlign=`left`}};function Ve(e){let t=Math.abs(e);return t>=1e3?2:t>=1?4:6}function He(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 Ue(e,n){let r=n===`day`?`1d`:`1w`,i=[];for(let n of e){let e=(0,t.timeframeBucketStart)(n.time,r),a=i[i.length-1];a&&a.key===e?(a.high=Math.max(a.high,n.high),a.low=Math.min(a.low,n.low),a.close=n.close):i.push({key:e,open:n.open,high:n.high,low:n.low,close:n.close})}return i}function We(e,t=`day`){let n=Ue(e,t);if(n.length<2)return[];let r=n[n.length-2],i=n[n.length-1],a=t===`day`?`D`:`W`;return[{id:`p${a}h`,label:`P${a}H`,price:r.high},{id:`p${a}c`,label:`P${a}C`,price:r.close},{id:`p${a}l`,label:`P${a}L`,price:r.low},{id:`open`,label:t===`day`?`Day Open`:`Week Open`,price:i.open}]}var Ge=class{visible=!1;period=`day`;setVisible(e){this.visible=e}isVisible(){return this.visible}setPeriod(e){this.period=e}getPeriod(){return this.period}render(t,n,r,i){if(!this.visible||n.length===0)return;let a=We(n,this.period);if(a.length===0)return;let{chartRect:o}=r,s=o.y,c=o.y+o.height;t.save(),t.font=`600 10px ${i.font.family}`,t.textBaseline=`middle`;for(let n of a){let a=e.w(n.price,r);if(a<s||a>c)continue;let l=Ke(n,i);t.strokeStyle=l,t.globalAlpha=.7,t.lineWidth=1,t.setLineDash([5,4]),t.beginPath(),t.moveTo(o.x,Math.round(a)+.5),t.lineTo(o.x+o.width,Math.round(a)+.5),t.stroke(),t.setLineDash([]),t.globalAlpha=1;let u=n.label,d=t.measureText(u).width,f=o.x+o.width-d-10;t.fillStyle=i.background,t.globalAlpha=.85,p(t,f-4,a-7,d+8,14,i),t.globalAlpha=1,t.fillStyle=l,t.textAlign=`left`,t.fillText(u,f,a+.5)}t.restore()}};function Ke(e,t){return e.id.endsWith(`h`)?t.candleUp:e.id.endsWith(`l`)?t.candleDown:t.textSecondary}function qe(e){let t,n;return e.map(e=>{let r;return e.type===`high`?(r=t===void 0||e.price>t?`HH`:`LH`,t=e.price):(r=n===void 0||e.price<n?`LL`:`HL`,n=e.price),{...e,label:r}})}function Je(e,t=5,n=5){let r=Math.max(1,Math.floor(t)),i=Math.max(1,Math.floor(n)),a=[];for(let t=r;t<e.length-i;t++){let n=e[t].high,o=e[t].low,s=!0,c=!0;for(let a=t-r;a<=t+i&&!(a!==t&&(e[a].high>=n&&(s=!1),e[a].low<=o&&(c=!1),!s&&!c));a++);s?a.push({index:t,price:n,type:`high`}):c&&a.push({index:t,price:o,type:`low`})}return a}var Ye=class{visible=!1;left=5;right=5;showLabels=!1;structureLabels=!1;setVisible(e){this.visible=e}isVisible(){return this.visible}setStrength(e,t){this.left=Math.max(1,Math.floor(e)),this.right=Math.max(1,Math.floor(t))}setShowLabels(e){this.showLabels=e}setStructureLabels(e){this.structureLabels=e}render(t,n,r,i){if(!this.visible||n.length===0)return;let a=Je(n,this.left,this.right);if(a.length===0)return;let o=this.structureLabels?qe(a):a,{from:s,to:c}=r.visibleRange;t.save(),t.font=`10px ${i.font.family}`,t.textAlign=`center`;for(let n of o){if(n.index<s-1||n.index>c+1)continue;let a=e.b(n.index,r),o=e.w(n.price,r),l=n.type===`high`,u=l?i.candleDown:i.candleUp,d=l!==(r.invertScale===!0),f=d?o-8:o+8;t.fillStyle=u,t.beginPath(),d?(t.moveTo(a-5,f-5),t.lineTo(a+5,f-5),t.lineTo(a,f)):(t.moveTo(a-5,f+5),t.lineTo(a+5,f+5),t.lineTo(a,f)),t.closePath(),t.fill();let p=this.structureLabels&&`label`in n?String(n.label):this.showLabels?r.formatPrice?.(n.price)??Xe(n.price):null;p&&(t.textBaseline=d?`bottom`:`top`,t.fillText(p,a,d?f-5-1:f+5+1))}t.restore()}};function Xe(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var Ze=class{buffer=[];constructor(e=240){this.capacity=e,this.capacity=Math.max(1,Math.floor(e))}push(e,t){let n={time:e,bids:t.bids.map(e=>({...e})),asks:t.asks.map(e=>({...e}))},r=this.indexAfter(e);if(r>0&&this.buffer[r-1].time===e){this.buffer[r-1]=n;return}this.buffer.splice(r,0,n),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}indexAfter(e){let t=this.buffer;if(t.length===0||t[t.length-1].time<=e)return t.length;let n=0,r=t.length;for(;n<r;){let i=n+r>>1;t[i].time<=e?n=i+1:r=i}return n}snapshots(){return this.buffer}maxVolume(){let e=0;for(let t of this.buffer){for(let n of t.bids)n.volume>e&&(e=n.volume);for(let n of t.asks)n.volume>e&&(e=n.volume)}return e}setCapacity(e){this.capacity=Math.max(1,Math.floor(e)),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}clear(){this.buffer=[]}get size(){return this.buffer.length}},Qe=class{buffer=new Ze(240);visible=!1;opacity=.7;setVisible(e){this.visible=e}isVisible(){return this.visible}setOpacity(e){this.opacity=Math.max(.1,Math.min(1,e))}setCapacity(e){this.buffer.setCapacity(e)}push(e,t){this.buffer.push(e,t)}clear(){this.buffer.clear()}render(t,n,r){if(!this.visible)return;let i=this.buffer.snapshots();if(i.length===0)return;let a=this.buffer.maxVolume();if(a<=0)return;let o=1/a,{chartRect:s}=n,c=Math.max(2,n.barWidth+n.barSpacing),l=s.x,u=s.x+s.width,d=s.y,f=s.y+s.height;t.save();for(let a of i){let i=e.D(a.time,n);if(i<l-c||i>u+c)continue;let s=i-c/2;this.drawSide(t,a.bids,r.candleUp,s,c,n,o,d,f),this.drawSide(t,a.asks,r.candleDown,s,c,n,o,d,f)}t.restore()}drawSide(t,n,r,i,a,o,s,c,l){if(n.length===0)return;let u=$e(n,o);t.fillStyle=r;for(let r of n){let n=e.w(r.price,o);n<c-u||n>l+u||(t.globalAlpha=Math.min(1,Math.sqrt(r.volume*s))*this.opacity,t.fillRect(i,n-u/2,a,u))}t.globalAlpha=1}};function $e(t,n){if(t.length<2)return 3;let r=t.map(e=>e.price).sort((e,t)=>e-t),i=[];for(let e=1;e<r.length;e++){let t=r[e]-r[e-1];t>0&&i.push(t)}if(i.length===0)return 3;i.sort((e,t)=>e-t);let a=i[Math.floor(i.length/2)],o=Math.abs(e.w(r[0],n)-e.w(r[0]+a,n));return Math.max(2,Math.min(o,12))}var et=class{series=new Map;set(e,n){if(!n||n.length===0){this.series.delete(e);return}let r=[...n].sort((e,n)=>(0,t.normalizeBarTime)(e.time)-(0,t.normalizeBarTime)(n.time)),i=r.map(e=>(0,t.normalizeBarTime)(e.time)),a=i[i.length-1],o=i.length>1?a-i[i.length-2]:0;this.series.set(e,{bars:r,times:i,end:a+o})}has(e){return this.series.has(e)}get(e){return this.series.get(e)?.bars}symbols(){return[...this.series.keys()]}closeAt(e,n){let r=this.series.get(e);if(!r)return;let i=(0,t.normalizeBarTime)(n),{times:a,bars:o}=r;if(i<a[0])return;let s=a.length-1;if(i>a[s]&&(r.end<=a[s]||i>=r.end))return;let c=0,l=s;for(;c<l;){let e=c+l+1>>1;a[e]<=i?c=e:l=e-1}return o[c].close}},tt=class{symbols=new Map;mode=`percent`;store=new et;aligned=new Map;setMode(e){this.mode=e}getMode(){return this.mode}addSymbol(e){this.symbols.set(e.id,e),this.store.set(e.id,e.data),this.aligned.delete(e.id)}removeSymbol(e){this.symbols.delete(e),this.store.set(e,null),this.aligned.delete(e)}setSymbolData(e,t){let n=this.symbols.get(e);n&&(n.data=t,this.store.set(e,t),this.aligned.delete(e))}setSymbolVisible(e,t){let n=this.symbols.get(e);n&&(n.visible=t)}getSymbols(){return Array.from(this.symbols.values())}clear(){for(let e of this.symbols.keys())this.store.set(e,null);this.symbols.clear(),this.aligned.clear()}getPriceRange(e,t){let n=1/0,r=-1/0;for(let i of this.symbols.values()){if(!i.visible||i.data.length===0)continue;let a=this.line(i,e,t);if(a)for(let e=a.from;e<=a.to;e++){let t=a.priceAt(e);t!==null&&(t<n&&(n=t),t>r&&(r=t))}}return n<=r?{min:n,max:r}:null}render(e,t,n,r){if(this.symbols.size===0||t.length===0)return;let{chartRect:i}=n;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let r of this.symbols.values())!r.visible||r.data.length===0||this.renderSymbol(e,r,t,n);e.restore()}closesOn(e,t){let n=t.length>0?t[t.length-1].time:NaN,r=this.aligned.get(e.id);if(r&&r.main===t&&r.data===e.data&&r.length===t.length&&r.lastTime===n)return r.closes;let i=new Float64Array(t.length);for(let n=0;n<t.length;n++)i[n]=this.store.closeAt(e.id,t[n].time)??NaN;return this.aligned.set(e.id,{main:t,data:e.data,length:t.length,lastTime:n,closes:i}),i}line(e,t,n){let r=this.closesOn(e,t),i=Math.max(0,n.visibleRange.from),a=Math.min(t.length-1,n.visibleRange.to),o=-1;for(let e=i;e<=a;e++)if(Number.isFinite(r[e])&&r[e]!==0&&t[e].close!==0){o=e;break}if(o<0)return null;let s=t[o].close,c=r[o],l=this.mode===`percent`;return{from:o,to:a,priceAt:e=>{let t=r[e];return Number.isFinite(t)?l?t/c*s:t:null}}}renderSymbol(t,n,r,i){let a=this.line(n,r,i);if(!a)return;t.strokeStyle=n.color,t.lineWidth=n.lineWidth??1.5,t.lineJoin=`round`,t.beginPath();let o=0,s=null;for(let n=a.from;n<=a.to;n++){let r=a.priceAt(n);if(r===null)continue;let c=e.b(n,i),l=e.w(r,i);o===0?t.moveTo(c,l):t.lineTo(c,l),(o===2||o===0&&s===null)&&(s={x:c+4,y:l-4}),o++}t.stroke(),s&&(t.fillStyle=n.color,t.font=`bold 10px sans-serif`,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(n.label,s.x,s.y))}};function nt(e){if(e.length===0)return[];let t=[],n=e[0].open,r=(e[0].open+e[0].high+e[0].low+e[0].close)/4;for(let i=0;i<e.length;i++){let a=e[i],o=(a.open+a.high+a.low+a.close)/4,s=i===0?a.open:(n+r)/2,c=Math.max(a.high,s,o),l=Math.min(a.low,s,o);t.push({time:a.time,open:s,high:c,low:l,close:o,volume:a.volume}),n=s,r=o}return t}function rt(e,t){if(e.length===0)return[];let n=t.brickSize;t.useATR&&e.length>2&&(n=it(e,t.atrPeriod??14)),n>0||(n=Math.abs(e[e.length-1].close)/100||1);let r=[],i=Math.round(e[0].close/n)*n,a=e[0].time;for(let t=1;t<e.length;t++){let o=e[t].close-i,s=Math.floor(Math.abs(o)/n);if(s>=1){let c=o>0?1:-1;for(let o=0;o<s;o++){let o=i;i+=c*n,r.push({time:a++,open:o,high:Math.max(o,i),low:Math.min(o,i),close:i,volume:e[t].volume/s})}}}return r}function it(e,t){let n=e.length-1,r=Math.max(1,n-t),i=0;for(let t=r;t<n;t++)i+=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));let a=n>r?i/(n-r):0;if(!(a>0))return 0;let o=10**(Math.floor(Math.log10(a))-1);return Math.round(a/o)*o}function at(e,t=3){if(e.length===0)return[];let n=[],r=0;n.push({time:r++,open:e[0].open,high:Math.max(e[0].open,e[0].close),low:Math.min(e[0].open,e[0].close),close:e[0].close,volume:e[0].volume});for(let i=1;i<e.length;i++){let a=e[i].close,o=n[n.length-1],s=o.close>=o.open,c=Math.min(t,n.length),l=-1/0,u=1/0;for(let e=n.length-c;e<n.length;e++)l=Math.max(l,n[e].high),u=Math.min(u,n[e].low);s&&a>o.close?n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume}):!s&&a<o.close||s&&a<u?n.push({time:r++,open:o.close,high:o.close,low:a,close:a,volume:e[i].volume}):!s&&a>l&&n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume})}return n}function ot(e,t=4,n=`percent`){if(e.length<2)return e.slice();let r=[],i=e[1].close>=e[0].close?1:-1,a=e[0].close,o=e[0].close,s=e[0].close,c=0;for(let l=1;l<e.length;l++){let u=e[l].close,d=n===`price`?t:t/100*s;i===1?(u>a&&(a=u),a-u>=d&&(r.push({time:c++,open:s,high:a,low:s,close:a,volume:e[l].volume}),i=-1,s=a,o=u,a=u)):(u<o&&(o=u),u-o>=d&&(r.push({time:c++,open:s,high:s,low:o,close:o,volume:e[l].volume}),i=1,s=o,a=u,o=u))}return i===1?r.push({time:c,open:s,high:a,low:s,close:a,volume:0}):r.push({time:c,open:s,high:s,low:o,close:o,volume:0}),r}function st(e,t,n=3){if(e.length===0||t<=0)return[];let r=[],i=0,a=0,o=0,s=0,c=Math.round(e[0].close/t)*t;a=c,o=c,i=1;for(let c=1;c<e.length;c++){let l=e[c].close,u=Math.round(l/t)*t;i===1?u>a?a=u:a-u>=t*n&&(r.push({time:s++,open:o,high:a,low:o,close:a,volume:e[c].volume}),i=-1,o=u,a-=t):u<o?o=u:u-o>=t*n&&(r.push({time:s++,open:a,high:a,low:o,close:o,volume:e[c].volume}),i=1,a=u,o+=t)}return r.push({time:s,open:i===1?o:a,high:a,low:o,close:i===1?a:o,volume:0}),r}function ct(e,t){if(e.length===0||t.rangeSize<=0)return[];let n=[],r=e[0].time,i=e[0].open,a=i,o=i,s=0,c=(e,c)=>{for(e>a&&(a=e),e<o&&(o=e),s+=c;a-o>=t.rangeSize;){let c=e>=i,l=c?i+t.rangeSize:i-t.rangeSize;n.push({time:r++,open:i,high:c?l:i,low:c?i:l,close:l,volume:s}),i=l,a=l,o=l,s=0}};for(let t of e){let e=t.close>=t.open?[t.low,t.high,t.close]:[t.high,t.low,t.close],n=t.volume/e.length;for(let t of e)c(t,n)}return n}function A(e){return e.barWidth+e.barSpacing<1}function lt(e,t,n){return e>1.5*(Math.abs(n-t)+1)}var j=class{started=!1;lastX=NaN;lastY=NaN;col=NaN;lo=0;hi=0;width;constructor(e,t,n,r,i=[]){this.ctx=e,this.dense=r,this.dash=i,this.width=Number.isFinite(n)&&n>0?n:1,e.beginPath(),r?e.fillStyle=t:(e.strokeStyle=t,e.lineWidth=this.width,e.lineJoin=`round`)}add(e,t){!Number.isFinite(e)||!Number.isFinite(t)||(this.dense?this.addDense(e,t):this.started?this.ctx.lineTo(e,t):this.ctx.moveTo(e,t),this.started=!0,this.lastX=e,this.lastY=t)}gap(){this.flush(),this.started=!1,this.lastY=NaN}segment(e,t,n,r){(!this.started||e!==this.lastX||t!==this.lastY)&&(this.gap(),this.add(e,t)),this.add(n,r)}finish(){this.flush(),this.dense?this.ctx.fill():this.dash.length>0?(this.ctx.setLineDash([...this.dash]),this.ctx.stroke(),this.ctx.setLineDash([])):this.ctx.stroke()}addDense(e,t){let n=Math.floor(e);n!==this.col&&(this.flush(),this.col=n,this.lo=this.hi=Number.isNaN(this.lastY)?t:this.lastY),t<this.lo&&(this.lo=t),t>this.hi&&(this.hi=t)}flush(){if(Number.isNaN(this.col))return;let e=this.width/2,t=Math.max(1,this.width);this.ctx.rect(this.col+.5-t/2,this.lo-e,t,this.hi-this.lo+2*e),this.col=NaN}};function ut(e,t,n,r,i,a=t.length){e.beginPath(),e.fillStyle=i;let o=NaN,s=0,c=0,l=NaN,u=NaN,d=()=>{Number.isNaN(o)||e.rect(o,s,1,c-s)};for(let e=0;e<a;e++){let i=Math.floor(t[e]),a=Math.min(n[e],r[e]),f=Math.max(n[e],r[e]);i!==o&&(d(),o=i,s=Number.isNaN(l)?a:Math.min(a,l),c=Number.isNaN(u)?f:Math.max(f,u)),a<s&&(s=a),f>c&&(c=f),l=a,u=f}d(),e.fill()}var dt=.1;function ft(e){return e.plots?e.plots.map(e=>e.key):null}function pt(e,t){return e.tone?e.tone===`sign`?(t[e.key]??0)>=0:t[e.tone.field]===1:!0}function mt(e,t){return t.plots?.[e.key]?.visible!==!1}var ht=[6,4];function M(e,n,r){let i=e.plots?.[n];return{visible:i?.visible!==!1,dash:(0,t.lineDash)(i?.lineStyle??`solid`,ht,r)}}function gt(e,t,n){let r=t.colors[e.color]??t.colors[0];return!e.tone||e.downColor===void 0||!n||pt(e,n)?r:t.colors[e.downColor]??r}function _t(e,t,n,r){let{lo:i,hi:a}=yt(e,t,n,r.keys),o=r.scale,s=o?.min,c=o?.max;if(i===1/0){if(s===void 0&&c===void 0)return null;i=s??0,a=c??i+1}else{let e=a-i||Math.abs(a)||1;i-=e*dt,a+=e*dt}for(let e of r.levels??[])e<i&&(i=e),e>a&&(a=e);return(r.zero||o?.zero)&&(i>0&&(i=0),a<0&&(a=0)),s!==void 0&&(i=s),c!==void 0&&(a=c),a>i||(a=i+1),{min:i,max:a}}function vt(e,t,n,r){let{lo:i,hi:a}=yt(e,t,n,r.keys),o=e=>e!==void 0&&e>0,s=o(r.scale?.min)?r.scale?.min:void 0,c=o(r.scale?.max)?r.scale?.max:void 0;if(i===1/0){if(s===void 0||c===void 0)return null;i=s,a=c}else{if(!(i>0))return!1;let e=Math.exp((Math.log(a/i)||Math.LN2/4)*dt);i/=e,a*=e}for(let e of r.levels??[])e>0&&(e<i&&(i=e),e>a&&(a=e));return s!==void 0&&(i=s),c!==void 0&&(a=c),a>i?{min:i,max:a}:null}function yt(e,t,n,r){let i=1/0,a=-1/0,o=e=>{e===void 0||!Number.isFinite(e)||(e<i&&(i=e),e>a&&(a=e))},s=e=>{if(e){if(r){for(let t=0;t<r.length;t++)o(e[r[t]]);return}for(let t in e)o(e[t])}},c=e?.series;if(c){let e=Math.min(n,c.length-1);for(let n=Math.max(0,t);n<=e;n++)s(c[n])}else if(e){let r=0;for(let i of e.values.values()){if(r>n)break;r>=t&&s(i),r++}}return{lo:i,hi:a}}function bt(e){return!!e?.some(e=>e.kind===`histogram`)}function xt(n,r,i,a,o){let s=r.series;if(!s)return;let c=Math.max(0,i.visibleRange.from),l=Math.min(i.visibleRange.to,s.length-1);if(l<c)return;let u=e.T(i);for(let e=0;e<o.length;e++){let r=o[e];if(!mt(r,a))continue;let d=a.lineWidths[e]??a.lineWidths[0]??1.5,f=(0,t.lineDash)(a.plots?.[r.key]?.lineStyle??`solid`,ht,d),p=r.kind??`line`,m=r.tone&&r.downColor!==void 0?[!0,!1]:[null];for(let e of m){let t=a.colors[r.color]??a.colors[0],o=e===!1?a.colors[r.downColor]??t:t,m=t=>e===null||pt(r,t)===e;p===`histogram`?Tt(n,s,r.key,c,l,i,u,o,m):p===`dots`?wt(n,s,r.key,c,l,i,u,o,m):Ct(n,s,r.key,c,l,i,u,o,d,p===`step`,e===null?null:m,f)}}}function St(e,t){let n=e?.[t];return n!==void 0&&Number.isFinite(n)?n:void 0}function Ct(t,n,r,i,a,o,s,c,l,u,d,f=[]){let p=new j(t,c,l,A(o),f),m=0,h=0,g=!1;for(let t=i;t<=a;t++){let i=n[t],a=St(i,r);if(a===void 0){g=!1,p.gap();continue}let c=e.b(t,o),l=s(a);d?g&&d(i)&&(u?(p.segment(m,h,c,h),p.add(c,l)):p.segment(m,h,c,l)):(g&&u&&p.add(c,h),p.add(c,l)),m=c,h=l,g=!0}p.finish()}function wt(t,n,r,i,a,o,s,c,l){let u=Math.max(1.5,o.barWidth*.15),d=A(o),f=NaN;t.beginPath(),t.fillStyle=c;for(let c=i;c<=a;c++){let i=n[c],a=St(i,r);if(a===void 0||!l(i))continue;let p=e.b(c,o);if(d){let e=Math.floor(p);if(e===f)continue;f=e}let m=s(a);t.moveTo(p+u,m),t.arc(p,m,u,0,Math.PI*2)}t.fill()}function Tt(t,n,r,i,a,o,s,c,l){let u=s(0);if(t.beginPath(),t.fillStyle=c,A(o)){let c=NaN,d=0,f=()=>{if(Number.isNaN(c))return;let e=s(d);t.rect(c,Math.min(e,u),1,Math.max(1,Math.abs(e-u)))};for(let t=i;t<=a;t++){let i=n[t],a=St(i,r);if(a===void 0||!l(i))continue;let s=Math.floor(e.b(t,o));s===c?Math.abs(a)>Math.abs(d)&&(d=a):(f(),c=s,d=a)}f(),t.fill();return}let d=Math.max(1,o.barWidth);for(let c=i;c<=a;c++){let i=n[c],a=St(i,r);if(a===void 0||!l(i))continue;let f=e.b(c,o),p=s(a);t.rect(f-d/2,Math.min(p,u),d,Math.max(1,Math.abs(p-u)))}t.fill()}var N=class{canResume(e,t,n){let r=t.series;if(!r||n<=0||n>r.length||r.length>e.length)return!1;for(let i=n;i<r.length;i++)if(r[i]&&!t.values.has(e[i].time))return!1;return!0}writePoint(e,t,n,r){e.series[n]=r,r?e.values.set(t[n].time,r):e.values.delete(t[n].time)}render(e,t,n,r){this.descriptor.plots&&xt(e,t,n,r,this.descriptor.plots)}drawLine(e,t,n,r,i){if(t.length<2||i?.visible===!1)return;let a=new j(e,n,r,lt(t.length,t[0].x,t[t.length-1].x),i?.dash);for(let e of t)a.add(e.x,e.y);a.finish()}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){if(t.length===n.length&<(t.length,t[0].x,t[t.length-1].x)){ut(e,t.map(e=>e.x),t.map(e=>e.y),n.map(e=>e.y),r);return}e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(t,n,r,i){let a=[],{from:o,to:s}=i.visibleRange;for(let c=o;c<=s&&c<r.length;c++){let o=t.values.get(r[c].time);o&&o[n]!==void 0&&a.push({x:e.b(c,i),y:e.w(o[n],i)})}return a}};function Et(e){let t=e.inputs;if(!t)return null;for(let e in t)if(t[e]?.source)return e;return null}function Dt(e,n){let r=Et(e);if(!r)return{kind:`bars`};let i=n[r],a=(0,t.parseIndicatorSource)(i);return a?{kind:`line`,...a}:(0,t.isPriceSource)(i)&&i!==`close`?{kind:`price`,source:i}:{kind:`bars`}}function Ot(e,n,r=null,i=0){let a=r&&i>0&&i<=r.length?r:[],o=a===r?i:0;a.length=e.length;for(let r=o;r<e.length;r++){let i=e[r];a[r]={...i,close:(0,t.sourcePrice)(i,n)}}return a}function kt(e,t,n){if(!t)return null;let r=-1;for(let i=0;i<e.length&&i<t.length;i++){let e=t[i]?.[n];if(e!==void 0&&Number.isFinite(e)){r=i;break}}if(r<0)return null;let i=Array(e.length-r),a=t[r][n];for(let o=r;o<e.length;o++){let s=t[o]?.[n];s!==void 0&&Number.isFinite(s)&&(a=s);let c=e[o];i[o-r]={time:c.time,open:a,high:a,low:a,close:a,volume:c.volume}}return{bars:i,start:r}}function At(e,t,n){if(t===0||!e.series)return e;let r=Array(n).fill(null);for(let i=0;i<e.series.length&&t+i<n;i++)r[t+i]=e.series[i];return{...e,series:r}}function jt(e){return{values:new Map,series:Array(e).fill(null)}}var Mt=1,Nt=class{registry=new Map;instances=new Map;styleDefaults=new Map;order=null;register(e){this.registry.set(e.descriptor.id,e)}getAvailableIndicators(){return Array.from(this.registry.values()).map(e=>e.descriptor)}addIndicator(e,t={},n,r={}){let i=this.registry.get(e);if(!i)throw Error(`Unknown indicator: ${e}`);let a=this.claimInstanceId(e,r.instanceId),o={id:e,instanceId:a,params:{...i.descriptor.defaultConfig,...t},visible:!0};r.pane&&this.canHost(r.pane)&&(o.pane=r.pane),r.scale===`left`&&i.descriptor.placement===`overlay`&&!o.pane&&(o.scale=`left`);let s=this.styleDefaults.get(e),c={...s?.plots,...o.style?.plots},l={plugin:i,config:o,output:null,style:{colors:o.style?.colors??s?.colors?.slice()??Lt(this.freeColor(e,i.descriptor.placement,o.pane??null)),lineWidths:o.style?.lineWidths??s?.lineWidths?.slice()??[1.5],opacity:o.style?.opacity??s?.opacity??1,...Object.keys(c).length>0?{plots:Ft(c)}:{}},changedFrom:0};return this.instances.set(a,l),this.order=null,n&&this.compute(l,n),a}removeIndicator(e){this.instances.delete(e),this.order=null}updateIndicator(e,t,n){let r=this.instances.get(e);if(!r)return;let i=Et(r.plugin.descriptor);if(i&&i in t&&this.readsFromItself(e,{...r.config.params,...t})){let{[i]:e,...n}=t;t=n}if(Object.assign(r.config.params,t),delete r.sourceBars,delete r.lineInput,this.order=null,!n)return;let a=new Set([e,...this.getDependents(e)]);for(let e of this.ordered())a.has(e.config.instanceId)&&this.compute(e,n)}recalculateAll(e){for(let t of this.ordered())this.compute(t,e)}recalculateFrom(e,t){for(let n of this.ordered())this.compute(n,e,t)}compute(e,t,n){let{plugin:r,config:i}=e,a=Dt(r.descriptor,i.params);if(a.kind===`line`){this.computeFromLine(e,t,a.instanceId,a.key,n);return}delete e.lineInput;let o=t;a.kind===`price`?(e.sourceBars=Ot(t,a.source,e.sourceBars??null,n??0),o=e.sourceBars):delete e.sourceBars;let s=e.output,c=null;n!==void 0&&n>0&&s&&r.update&&(c=r.update(o,i,s,n)),e.changedFrom=c?Math.max(0,n-(r.revisesBefore?.(i)??0)):0,e.output=c??r.calculate(o,i)}computeFromLine(e,t,n,r,i){let{plugin:a,config:o}=e,s=this.instances.get(n),c=s?.output?.series,l=e.lineInput,u=i===void 0?void 0:Math.min(i,s?.changedFrom??0);if(u!==void 0&&c&&a.update&&l&&l.raw.series&&l.aligned.series&&l.sourceId===n&&l.key===r&&l.start<u&&u<=l.start+l.bars.length){let{start:n,bars:i}=l;i.length=t.length-n;let s=i[u-1-n].close;for(let e=u;e<t.length;e++){let a=c[e]?.[r];a!==void 0&&Number.isFinite(a)&&(s=a),i[e-n]={time:t[e].time,open:s,high:s,low:s,close:s,volume:t[e].volume}}let d=a.update(i,o,l.raw,u-n);if(d?.series){let r=Math.max(n,u-(a.revisesBefore?.(o)??0));if(l.raw=d,n===0)l.aligned=d;else{let e=l.aligned.series;e.length=t.length;for(let i=r;i<t.length;i++)e[i]=d.series[i-n]??null;l.aligned.values=d.values,l.aligned.meta=d.meta}e.output=l.aligned,e.changedFrom=r;return}}e.changedFrom=0;let d=kt(t,c,r);if(!d){delete e.lineInput,e.output=jt(t.length);return}let f=a.calculate(d.bars,o),p=At(f,d.start,t.length);e.lineInput={sourceId:n,key:r,start:d.start,bars:d.bars,raw:f,aligned:p},e.output=p}ordered(){if(this.order)return this.order;let e=[],t=new Map,n=r=>{let i=r.config.instanceId;if(t.get(i))return;t.set(i,`visiting`);let a=Dt(r.plugin.descriptor,r.config.params),o=a.kind===`line`?this.instances.get(a.instanceId):void 0;o&&n(o),t.set(i,`done`),e.push(r)};for(let e of this.instances.values())n(e);return this.order=e,e}readsFromItself(e,t){let n=this.instances.get(e);if(!n)return!1;let r=Dt(n.plugin.descriptor,t),i=new Set;for(;r.kind===`line`;){if(r.instanceId===e)return!0;if(i.has(r.instanceId))return!1;i.add(r.instanceId);let t=this.instances.get(r.instanceId);if(!t)return!1;r=Dt(t.plugin.descriptor,t.config.params)}return!1}canHost(e){let t=this.instances.get(e);return!!t&&t.plugin.descriptor.placement===`panel`&&!t.config.pane}getDependents(e){let t=[],n=new Set([e]),r=[e];for(;r.length;){let e=r.shift();for(let i of this.instances.values()){let a=Dt(i.plugin.descriptor,i.config.params),o=i.config.instanceId;a.kind===`line`&&a.instanceId===e&&!n.has(o)&&(n.add(o),t.push(o),r.push(o))}}return t}claimInstanceId(e,t){if(t&&!this.instances.has(t)){let e=Number(/_(\d+)$/.exec(t)?.[1]);return Number.isSafeInteger(e)&&e>=Mt&&(Mt=e+1),t}let n=`tc_${e}_${Mt++}`;for(;this.instances.has(n);)n=`tc_${e}_${Mt++}`;return n}getPaneMembers(e){let t=[];for(let n of this.instances.values())n.config.pane===e&&t.push(n.config.instanceId);return t}setPane(e,t){let n=this.instances.get(e);if(!n||t===e||t!==null&&!this.canHost(t))return!1;if(t===null?delete n.config.pane:(n.config.pane=t,delete n.config.scale),Rt(n.style.colors)){let t=n.plugin.descriptor.placement,r=n.config.pane??null;this.colorsInPane(t,r,e).has(n.style.colors[0])&&(n.style.colors=Lt(this.freeColor(n.config.id,t,r,e)))}return!0}colorsInPane(e,t,n){let r=new Set;for(let i of this.instances.values())i.config.instanceId!==n&&(t===null?e===`overlay`&&i.plugin.descriptor.placement===`overlay`&&!i.config.pane:i.config.instanceId===t||i.config.pane===t)&&r.add(i.style.colors[0]);return r}freeColor(e,n,r,i){let a=this.colorsInPane(n,r,i);for(let t of this.instances.values())t.config.id===e&&t.config.instanceId!==i&&a.add(t.style.colors[0]);let o=t.TC_SERIES_COLORS.findIndex(e=>!a.has(e));return o>=0?o:a.size%t.TC_SERIES_COLORS.length}getOutput(e){return this.instances.get(e)?.output??null}renderOverlays(e,t,n){for(let r of this.overlayDraws(t,n))r(e)}overlayDraws(e,t){let n=[];for(let r of this.instances.values()){let i=r.output;if(!i||!r.config.visible||r.plugin.descriptor.placement!==`overlay`||r.config.pane)continue;let a=r.config.scale===`left`?t??e:e;n.push(e=>r.plugin.render(e,i,a,r.style))}return n}hasLeftScaleOverlays(){for(let e of this.instances.values())if(e.config.scale===`left`&&e.config.visible)return!0;return!1}setScale(e,t){let n=this.instances.get(e);return!n||n.plugin.descriptor.placement!==`overlay`||n.config.pane?!1:(t===`left`?n.config.scale=`left`:delete n.config.scale,!0)}renderPanel(e,t,n){let r=this.instances.get(t);!r?.output||!r.config.visible||r.plugin.render(e,r.output,n,r.style)}getLatestValues(e){let t=this.instances.get(e);return t?It(t):[]}getLatestOverlayValues(e=`right`){let t=[];for(let n of this.instances.values())n.plugin.descriptor.placement!==`overlay`||n.config.pane||n.config.scale===`left`==(e===`left`)&&t.push(...It(n));return t}getIndicatorConfig(e){return this.instances.get(e)?.config??null}setVisible(e,t){let n=this.instances.get(e);return n?(n.config.visible=t,t):null}isVisible(e){return this.instances.get(e)?.config.visible??!1}getLevels(e){let t=this.instances.get(e);return t?[...t.config.levels??t.plugin.descriptor.levels??[]]:[]}setLevels(e,t){let n=this.instances.get(e);return n?(t===null?delete n.config.levels:n.config.levels=t.filter(e=>Number.isFinite(e)),!0):!1}getPaneValueRange(e,t,n,r=!1){let i=null;for(let a of[e,...this.getPaneMembers(e)]){let e=this.instances.get(a);if(!e||e.config.visible===!1)continue;let o=e.plugin.descriptor,s={keys:Pt(e),scale:o.scale,levels:e.config.levels??o.levels,zero:bt(o.plots)},c=r?vt(e.output,t,n,s):_t(e.output,t,n,s);if(c===!1)return null;c&&(i=i?{min:Math.min(i.min,c.min),max:Math.max(i.max,c.max)}:c)}return i}getIndicatorDescriptor(e){return this.instances.get(e)?.plugin.descriptor??null}getActiveIndicators(){let e=[];for(let[t,n]of this.instances)e.push({instanceId:t,id:n.config.id,params:{...n.config.params},descriptor:n.plugin.descriptor,visible:n.config.visible??!0,...n.config.pane?{pane:n.config.pane}:{}});return e}getIndicatorStyle(e){let t=this.instances.get(e)?.style;return t?{colors:[...t.colors],lineWidths:[...t.lineWidths],opacity:t.opacity,...t.plots?{plots:Ft(t.plots)}:{}}:null}updateIndicatorStyle(e,t){let n=this.instances.get(e);if(!n)return;let{plots:r,...i}=t;if(Object.assign(n.style,i),r){let e=Ft(n.style.plots??{});for(let[t,n]of Object.entries(r))e[t]={...e[t],...n};n.style.plots=e}}setPlotStyles(e,t){let n=this.instances.get(e);n&&(t&&Object.keys(t).length>0?n.style.plots=Ft(t):delete n.style.plots)}setStyleDefaults(e,t){t?this.styleDefaults.set(e,{...t,...t.plots?{plots:Ft(t.plots)}:{}}):this.styleDefaults.delete(e)}getOverlayPriceRange(e,t,n=`right`){let r=1/0,i=-1/0;for(let a of this.instances.values()){if(!a.output||!a.config.visible||a.plugin.descriptor.placement!==`overlay`||a.config.pane||a.config.scale===`left`!=(n===`left`))continue;let o=a.output.series;if(!o)continue;let s=Pt(a),c=Math.min(t,o.length-1);for(let t=Math.max(0,e);t<=c;t++){let e=o[t];if(e){if(s){for(let t=0;t<s.length;t++){let n=e[s[t]];n!==void 0&&isFinite(n)&&(n<r&&(r=n),n>i&&(i=n))}continue}for(let t in e){let n=e[t];n!==void 0&&isFinite(n)&&(n<r&&(r=n),n>i&&(i=n))}}}}return r===1/0?null:{min:r,max:i}}getPanelIndicators(){let e=[];for(let[t,n]of this.instances)n.plugin.descriptor.placement===`panel`&&e.push({instanceId:t,descriptor:n.plugin.descriptor});return e}};function Pt(e){let t=ft(e.plugin.descriptor),n=e.style.plots;return t&&n?t.filter(e=>n[e]?.visible!==!1):t}function Ft(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,{...t}]))}function It(e){let t=e.output?.series,n=e.plugin.descriptor.plots;if(!t||!n||e.config.visible===!1)return[];let r=t[t.length-1];if(!r)return[];let i=[];for(let t of n){if(!mt(t,e.style))continue;let n=r[t.key];n!==void 0&&Number.isFinite(n)&&i.push({value:n,color:gt(t,e.style,r)})}return i}function Lt(e){return[...t.TC_SERIES_COLORS.slice(e),...t.TC_SERIES_COLORS.slice(0,e)]}function Rt(e){let n=t.TC_SERIES_COLORS.length;if(e.length!==n)return!1;let r=t.TC_SERIES_COLORS.indexOf(e[0]);return r>=0&&e.every((e,i)=>e===t.TC_SERIES_COLORS[(r+i)%n])}var P=class extends Map{keyBuf=[];valBuf=[];folded=!1;constructor(){super()}set(e,t){if(this.folded)return super.set(e,t);let n=this.keyBuf,r=n.length;if(r===0||e>n[r-1])return n.push(e),this.valBuf.push(t),this;let i=this.indexOf(e);return i>=0?(this.valBuf[i]=t,this):(this.fold(),super.set(e,t))}get(e){if(this.folded)return super.get(e);let t=this.indexOf(e);return t>=0?this.valBuf[t]:void 0}has(e){return this.folded?super.has(e):this.indexOf(e)>=0}delete(e){if(this.folded)return super.delete(e);let t=this.indexOf(e);return t<0?!1:(this.keyBuf.splice(t,1),this.valBuf.splice(t,1),!0)}clear(){super.clear(),this.keyBuf=[],this.valBuf=[],this.folded=!1}get size(){return this.folded?super.size:this.keyBuf.length}forEach(e,t){this.fold(),super.forEach(e,t)}entries(){return this.fold(),super.entries()}keys(){return this.fold(),super.keys()}values(){return this.fold(),super.values()}[Symbol.iterator](){return this.fold(),super[Symbol.iterator]()}indexOf(e){let t=this.keyBuf,n=0,r=t.length-1;for(;n<=r;){let i=n+r>>1,a=t[i];if(a===e)return i;a<e?n=i+1:r=i-1}return-1}fold(){if(this.folded)return;this.folded=!0;let e=this.keyBuf,t=this.valBuf;for(let n=0;n<e.length;n++)super.set(e[n],t[n]);this.keyBuf=[],this.valBuf=[]}};function F(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function I(e,t,n,r=1){let i=F(e,t,n);return Math.max(r,Math.floor(i))}var zt=class extends N{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`SMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`SMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;this.writePoint(n,e,t,{value:r/i})}return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},Bt=class extends N{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`EMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`EMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=2/(n+1),i=new P,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}update(e,t,n,r){let i=I(t,`period`,20,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;let o=2/(i+1);for(let t=r;t<e.length;t++)a=(e[t].close-a)*o+a,this.writePoint(n,e,t,{value:a});return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},Vt=class extends N{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`BB`,inputs:{source:{source:!0}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=F(t,`stdDev`,2),i=new P,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1),a=F(t,`stdDev`,2);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=0;for(let n=t-i+1;n<=t;n++){let t=e[n].close;r+=t,o+=t*t}let s=r/i,c=Math.sqrt(Math.max(0,o/i-s*s));this.writePoint(n,e,t,{middle:s,upper:s+a*c,lower:s-a*c})}return n}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=0,u=c-s+1,d=new Float64Array(u),f=new Float64Array(u),p=new Float64Array(u),m=new Float64Array(u);for(let t=s;t<=c&&t<o.length;t++){let n=o[t];!n||n.upper===void 0||(d[l]=e.b(t,i),f[l]=e.w(n.upper,i),p[l]=e.w(n.middle,i),m[l]=e.w(n.lower,i),l++)}if(l<2)return;let h=A(i),g=d.subarray(0,l);if(h)ut(n,g,f,m,(0,t.withAlpha)(a.colors[0],.1),l);else{n.beginPath(),n.moveTo(d[0],f[0]);for(let e=1;e<l;e++)n.lineTo(d[e],f[e]);for(let e=l-1;e>=0;e--)n.lineTo(d[e],m[e]);n.closePath(),n.fillStyle=(0,t.withAlpha)(a.colors[0],.1),n.fill()}let _=(e,t,r)=>{let i=M(a,r,a.lineWidths[0]);if(!i.visible)return;let o=new j(n,t,a.lineWidths[0],h,i.dash);for(let t=0;t<l;t++)o.add(g[t],e[t]);o.finish()};_(f,a.colors[0],`upper`),_(p,a.colors[1]??a.colors[0],`middle`),_(m,a.colors[0],`lower`)}},Ht=class extends N{descriptor={id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{},shortName:`VWAP`,plots:[{key:`value`,title:`VWAP`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null),i=0,a=0;for(let t=0;t<e.length;t++){let o=(e[t].high+e[t].low+e[t].close)/3;if(i+=e[t].volume,a+=o*e[t].volume,i>0){let o={value:a/i};n.set(e[t].time,o),r[t]=o}}return{values:n,series:r}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},Ut=class extends N{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26},shortName:`Ichimoku`,plots:[{key:`tenkan`,title:`Conversion`,color:0},{key:`kijun`,title:`Base`,color:1},{key:`senkouA`,title:`Lead A`,color:2},{key:`senkouB`,title:`Lead B`,color:3}]};calculate(e,t){let n=I(t,`tenkan`,9,1),r=I(t,`kijun`,26,1),i=I(t,`senkou`,52,1),a=new P,o=Array(e.length).fill(null),s=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},c=s(n),l=s(r),u=s(i);for(let t=0;t<e.length;t++){let s={};t>=n-1&&(s.tenkan=(c.highs[t]+c.lows[t])/2),t>=r-1&&(s.kijun=(l.highs[t]+l.lows[t])/2),s.tenkan!==void 0&&s.kijun!==void 0&&(s.senkouA=(s.tenkan+s.kijun)/2),t>=i-1&&(s.senkouB=(u.highs[t]+u.lows[t])/2),t>=r-1&&(s.chikou=e[t].close),(s.tenkan!==void 0||s.kijun!==void 0||s.senkouA!==void 0||s.senkouB!==void 0)&&(a.set(e[t].time,s),o[t]=s)}return{values:a,series:o}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=c-s+1,u=new Float64Array(l),d=new Float64Array(l),f=0,p=new Float64Array(l),m=new Float64Array(l),h=0,g=new Float64Array(l),_=new Float64Array(l),v=0,y=new Float64Array(l),b=new Float64Array(l),x=0;for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.tenkan!==void 0&&(u[f]=r,d[f]=e.w(n.tenkan,i),f++),n.kijun!==void 0&&(p[h]=r,m[h]=e.w(n.kijun,i),h++),n.senkouA!==void 0&&(g[v]=r,_[v]=e.w(n.senkouA,i),v++),n.senkouB!==void 0&&(y[x]=r,b[x]=e.w(n.senkouB,i),x++)}if(v>1&&x>1){let e=Math.min(v,x);n.beginPath(),n.moveTo(g[0],_[0]);for(let t=1;t<e;t++)n.lineTo(g[t],_[t]);for(let t=e-1;t>=0;t--)n.lineTo(y[t],b[t]);n.closePath(),n.fillStyle=(0,t.withAlpha)(a.colors[2]??`#1fa874`,.15),n.fill()}let S=(e,t,r,i,o,s)=>{let c=M(a,e,s);if(!(i<2||!c.visible)){n.beginPath(),n.strokeStyle=o,n.lineWidth=s,n.lineJoin=`round`,n.setLineDash(c.dash),n.moveTo(t[0],r[0]);for(let e=1;e<i;e++)n.lineTo(t[e],r[e]);n.stroke(),n.setLineDash([])}};S(`tenkan`,u,d,f,a.colors[0],a.lineWidths[0]),S(`kijun`,p,m,h,a.colors[1]??`#f2a93b`,a.lineWidths[0]),S(`senkouA`,g,_,v,a.colors[2]??`#1fa874`,1),S(`senkouB`,y,b,x,a.colors[3]??`#e8505b`,1)}},Wt=class extends N{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2},shortName:`SAR`,plots:[{key:`value`,title:`SAR`,color:0,kind:`dots`,tone:{field:`trend`},downColor:1}]};calculate(e,t){let n=F(t,`step`,.02),r=F(t,`max`,.2),i=new P,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}render(t,n,r,i){let a=n.series;if(!a||i.plots?.value?.visible===!1)return;let{from:o,to:s}=r.visibleRange,c=Math.max(1.5,r.barWidth*.15);for(let n=o;n<=s&&n<a.length;n++){let o=a[n];if(!o||o.value===void 0)continue;let s=e.b(n,r),l=e.w(o.value,r);t.beginPath(),t.arc(s,l,c,0,Math.PI*2),t.fillStyle=o.trend===1?i.colors[0]:i.colors[1]??`#e8505b`,t.fill()}}},Gt=class extends N{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3},shortName:`Supertrend`,plots:[{key:`value`,title:`Supertrend`,color:0,tone:{field:`trend`},downColor:1}]};calculate(e,t){let n=I(t,`period`,10,1),r=F(t,`multiplier`,3),i=new P,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s;c=g<u||e[t-1].close>u?g:u,l=_>d||e[t-1].close<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let v={value:f,trend:m};i.set(e[t].time,v),a[t]=v,u=c,d=l,p=f}return{values:i,series:a}}render(t,n,r,i){let a=n.series;if(!a||i.plots?.value?.visible===!1)return;let{from:o,to:s}=r.visibleRange,c=i.colors[0],l=i.colors[1]??`#e8505b`,u=A(r),d=i.lineWidths[0]+.5;for(let[n,i]of[[c,1],[l,-1]]){let c=new j(t,n,d,u),l=0,f=0,p=!1;for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let o=e.b(t,r),s=e.w(n.value,r);p&&(n.trend??1)===i&&c.segment(l,f,o,s),l=o,f=s,p=!0}c.finish()}}},Kt=class extends N{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5},shortName:`KC`,plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`emaPeriod`,20,1),r=I(t,`atrPeriod`,10,1),i=F(t,`multiplier`,1.5),a=new P;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.upper!==void 0&&l.push({x:r,y:e.w(n.upper,i)}),n.middle!==void 0&&u.push({x:r,y:e.w(n.middle,i)}),n.lower!==void 0&&d.push({x:r,y:e.w(n.lower,i)})}this.drawBand(n,l,d,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??a.colors[0],a.lineWidths[0],M(a,`middle`,a.lineWidths[0])),this.drawLine(n,d,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0]))}},qt=class extends N{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20},shortName:`DC`,plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.upper!==void 0&&l.push({x:r,y:e.w(n.upper,i)}),n.middle!==void 0&&u.push({x:r,y:e.w(n.middle,i)}),n.lower!==void 0&&d.push({x:r,y:e.w(n.lower,i)})}this.drawBand(n,l,d,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??`#7d8696`,1,M(a,`middle`,1)),this.drawLine(n,d,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0]))}},Jt=[`s3`,`s2`,`s1`,`pp`,`r1`,`r2`,`r3`],Yt=[`traditional`,`fibonacci`,`woodie`,`classic`,`camarilla`,`dm`],Xt=class extends N{descriptor={id:`pivots`,name:`Pivot Points`,placement:`overlay`,defaultConfig:{lookback:24,type:`traditional`},shortName:`Pivots`,inputs:{lookback:{min:1},type:{options:Yt}},plots:[{key:`r3`,title:`R3`,color:1},{key:`r2`,title:`R2`,color:1},{key:`r1`,title:`R1`,color:1},{key:`pp`,title:`P`,color:0},{key:`s1`,title:`S1`,color:2},{key:`s2`,title:`S2`,color:2},{key:`s3`,title:`S3`,color:2}]};calculate(e,t){let n=I(t,`lookback`,24,1),r=Yt.includes(t.params.type)?t.params.type:`traditional`,i=new P,a=Array(e.length).fill(null);if(e.length<=n)return{values:i,series:a};for(let t=n;t<e.length;t++){let o=-1/0,s=1/0;for(let r=t-n;r<t;r++)e[r].high>o&&(o=e[r].high),e[r].low<s&&(s=e[r].low);let c=Zt(r,e[t-n].open,o,s,e[t-1].close);i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=a.colors[0],u=a.colors[1]??`#e8505b`,d=a.colors[2]??`#1fa874`,f=a.lineWidths[0],p=e=>e===`pp`?l:e.startsWith(`r`)?u:d;for(let r of Jt){let l=a.plots?.[r];if(l?.visible===!1)continue;n.beginPath(),n.strokeStyle=p(r),n.lineWidth=r===`pp`?f:Math.max(1,f-1),n.setLineDash((0,t.lineDash)(l?.lineStyle??(r===`pp`?`solid`:`dashed`),[4,3],n.lineWidth));let u=!1;for(let t=s;t<=c&&t<o.length;t++){let a=o[t]?.[r];if(a===void 0)continue;let s=e.b(t,i),c=e.w(a,i);u?n.lineTo(s,c):(n.moveTo(s,c),u=!0)}n.stroke(),n.setLineDash([])}}};function Zt(e,t,n,r,i){let a=n-r;if(e===`dm`){let e=i<t?n+2*r+i:i>t?2*n+r+i:n+r+2*i;return{pp:e/4,r1:e/2-r,s1:e/2-n}}if(e===`camarilla`){let e=a*1.1;return{pp:(n+r+i)/3,r1:i+e/12,s1:i-e/12,r2:i+e/6,s2:i-e/6,r3:i+e/4,s3:i-e/4}}let o=e===`woodie`?(n+r+2*i)/4:(n+r+i)/3;if(e===`fibonacci`)return{pp:o,r1:o+.382*a,s1:o-.382*a,r2:o+.618*a,s2:o-.618*a,r3:o+a,s3:o-a};let s=2*o-r,c=2*o-n;return e===`classic`?{pp:o,r1:s,s1:c,r2:o+a,s2:o-a,r3:o+2*a,s3:o-2*a}:{pp:o,r1:s,s1:c,r2:o+a,s2:o-a,r3:n+2*(o-r),s3:r-2*(n-o)}}var Qt=class extends N{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0},shortName:`AVWAP`,plots:[{key:`value`,title:`AVWAP`,color:0}]};calculate(e,t){let n=F(t,`anchorTime`,0),r=new P,i=Array(e.length).fill(null),a=0;if(n>0&&(a=e.findIndex(e=>e.time>=n),a<0))return{values:r,series:i};let o=0,s=0;for(let t=a;t<e.length;t++){let n=(e[t].high+e[t].low+e[t].close)/3;if(o+=e[t].volume,s+=n*e[t].volume,o>0){let n={value:s/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},$t=class extends N{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5},shortName:`ZigZag`,plots:[{key:`pivot`,title:`Pivot`,color:0}]};calculate(e,t){let n=Math.max(.01,F(t,`deviation`,5))/100,r=new P,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(t,n,r,i){if(i.plots?.pivot?.visible===!1)return;let a=n.meta?.pivots;if(!(!a||a.length<2)){t.beginPath(),t.strokeStyle=i.colors[0],t.lineWidth=i.lineWidths[0],t.lineJoin=`round`;for(let n=0;n<a.length;n++){let i=a[n],o=e.b(i.idx,r),s=e.w(i.price,r);n===0?t.moveTo(o,s):t.lineTo(o,s)}t.stroke()}}},en=class extends N{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2,source:`close`},shortName:`LRC`,inputs:{source:{source:!0}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,100,2),r=F(t,`stdDev`,2),i=new P,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.middle!==void 0&&u.push({x:r,y:e.w(n.middle,i)}),n.upper!==void 0&&l.push({x:r,y:e.w(n.upper,i)}),n.lower!==void 0&&d.push({x:r,y:e.w(n.lower,i)})}this.drawBand(n,l,d,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??a.colors[0],a.lineWidths[0],M(a,`middle`,a.lineWidths[0])),this.drawLine(n,d,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0]))}},tn=class extends N{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21,source:`close`},shortName:`HMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`HMA`,color:0}]};calculate(e,t){let n=I(t,`period`,21,2),r=new P,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=nn(a,n),l=nn(a,o),u=rn(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}};function nn(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function rn(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var an=class extends N{descriptor={id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`,source:`close`},shortName:`MTF MA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`MA`,color:0}]};calculate(e,n){let r=I(n,`period`,50,1),i=String(n.params.timeframe??`1d`),a=new P,o=Array(e.length).fill(null);if(e.length===0)return{values:a,series:o};let s=[],c=(0,t.timeframeBucketStart)(e[0].time,i),l=e[0].close,u=null,d=()=>{if(s.length<r)return;let e=0;for(let t=s.length-r;t<s.length;t++)e+=s[t];u=e/r};for(let n=0;n<e.length;n++){let r=(0,t.timeframeBucketStart)(e[n].time,i);if(r!==c&&(s.push(l),d(),c=r),l=e[n].close,u!==null){let t={value:u};a.set(e[n].time,t),o[n]=t}}return{values:a,series:o}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},on=class extends N{descriptor={id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1},shortName:`SVWAP`,plots:[{key:`value`,title:`VWAP`,color:0},{key:`u1`,title:`+1σ`,color:1},{key:`l1`,title:`−1σ`,color:1},{key:`u2`,title:`+2σ`,color:1},{key:`l2`,title:`−2σ`,color:1},{key:`u3`,title:`+3σ`,color:1},{key:`l3`,title:`−3σ`,color:1}]};calculate(e,n){let r=Math.min(3,I(n,`bands`,1,0)),i=new P,a=Array(e.length).fill(null);if(e.length===0)return{values:i,series:a};let o=(0,t.timeframeBucketStart)(e[0].time,`1d`),s=0,c=0,l=0;for(let n=0;n<e.length;n++){let u=e[n],d=(0,t.timeframeBucketStart)(u.time,`1d`);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,t={value:e,session:o};if(r>0){let n=Math.max(0,c/l-e*e),i=Math.sqrt(n);for(let n=1;n<=r;n++)t[`u${n}`]=e+n*i,t[`l${n}`]=e-n*i}i.set(u.time,t),a[n]=t}}return{values:i,series:a}}render(e,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange;e.globalAlpha=.55,e.lineWidth=1,e.strokeStyle=i.colors[1]??i.colors[0];let c=n=>{let c=i.plots?.[n];c?.visible!==!1&&(e.setLineDash(c?.lineStyle?(0,t.lineDash)(c.lineStyle,[4,3],1):[4,3]),this.strokeBandSeries(e,a,r,o,s,e=>e[n]))};for(let e=1;e<=3;e++)c(`u${e}`),c(`l${e}`);e.setLineDash([]),e.globalAlpha=1;let l=i.plots?.value;l?.visible!==!1&&(e.strokeStyle=i.colors[0],e.lineWidth=i.lineWidths[0],e.lineJoin=`round`,e.setLineDash((0,t.lineDash)(l?.lineStyle??`solid`,[6,4],i.lineWidths[0])),this.strokeBandSeries(e,a,r,o,s,e=>e.value),e.setLineDash([]))}strokeBandSeries(t,n,r,i,a,o){let s=new j(t,String(t.strokeStyle),t.lineWidth,A(r)),c;for(let t=i;t<=a&&t<n.length;t++){let i=n[t],a=i?o(i):void 0;if(i===null||a===void 0){s.gap();continue}let l=e.b(t,r),u=e.w(a,r);i.session!==c&&s.gap(),s.add(l,u),c=i.session}s.finish()}},sn=class extends N{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3},shortName:`CE`,plots:[{key:`long`,title:`Long`,color:0},{key:`short`,title:`Short`,color:1}]};calculate(e,t){let n=I(t,`period`,22,1),r=F(t,`multiplier`,3),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=(r,l)=>{let u=a.plots?.[r];if(u?.visible===!1)return;n.beginPath(),n.strokeStyle=l,n.lineWidth=a.lineWidths[0],n.lineJoin=`round`,n.setLineDash(u?.lineStyle?(0,t.lineDash)(u.lineStyle,[5,3],a.lineWidths[0]):[5,3]);let d=!1;for(let t=s;t<=c&&t<o.length;t++){let a=o[t];if(!a||a[r]===void 0){d=!1;continue}let s=e.b(t,i),c=e.w(a[r],i);d?n.lineTo(s,c):(n.moveTo(s,c),d=!0)}n.stroke(),n.setLineDash([])};l(`long`,a.colors[0]??`#1fa874`),l(`short`,a.colors[1]??`#e8505b`)}},cn=class extends N{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3},shortName:`Alligator`,plots:[{key:`jaw`,title:`Jaw`,color:0},{key:`teeth`,title:`Teeth`,color:1},{key:`lips`,title:`Lips`,color:2}]};calculate(e,t){let n=I(t,`jaw`,13,1),r=I(t,`teeth`,8,1),i=I(t,`lips`,5,1),a=I(t,`jawShift`,8,0),o=I(t,`teethShift`,5,0),s=I(t,`lipsShift`,3,0),c=new P,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=ln(d,n),p=ln(d,r),m=ln(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=(n,c)=>{let l=M(i,n,i.lineWidths[0]);if(!l.visible)return;let u=new j(t,c,i.lineWidths[0],A(r),l.dash);for(let t=o;t<=s&&t<a.length;t++){let i=a[t];if(!i||i[n]===void 0){u.gap();continue}let o=e.b(t,r),s=e.w(i[n],r);u.add(o,s)}u.finish()};c(`jaw`,i.colors[0]??`#4c8dff`),c(`teeth`,i.colors[1]??`#e8505b`),c(`lips`,i.colors[2]??`#1fa874`)}};function ln(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var un=class extends N{descriptor={id:`vwma`,name:`Volume Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`VWMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`VWMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=0,o=0;for(let t=0;t<e.length;t++){let s=e[t].close*e[t].volume;if(a+=s,o+=e[t].volume,t>=n){let r=e[t-n];a-=r.close*r.volume,o-=r.volume}if(t>=n-1&&o>0){let n={value:a/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,a=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close*e[n].volume,a+=e[n].volume;this.writePoint(n,e,t,a>0?{value:r/a}:null)}return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},dn=class extends N{descriptor={id:`wma`,name:`Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`WMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`WMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=n*(n+1)/2,o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(s+=c*n-o,o+=c,t>=n&&(o-=e[t-n].close),t>=n-1){let n={value:s/a};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1),a=i*(i+1)/2;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=t-i+1;for(let t=0;t<i;t++)r+=e[o+t].close*(t+1);this.writePoint(n,e,t,{value:r/a})}return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},fn=class extends N{descriptor={id:`envelope`,name:`Moving Average Envelope`,placement:`overlay`,defaultConfig:{period:20,percent:2.5,source:`close`},shortName:`Env`,inputs:{source:{source:!0}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`basis`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=F(t,`percent`,2.5)/100,i=new P,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let s=o/n,c={basis:s,upper:s*(1+r),lower:s*(1-r)};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1),a=F(t,`percent`,2.5)/100;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;let o=r/i;this.writePoint(n,e,t,{basis:o,upper:o*(1+a),lower:o*(1-a)})}return n}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n||n.upper===void 0)continue;let r=e.b(t,i);l.push({x:r,y:e.w(n.upper,i)}),u.push({x:r,y:e.w(n.lower,i)}),d.push({x:r,y:e.w(n.basis,i)})}this.drawBand(n,l,u,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0])),this.drawLine(n,d,a.colors[1]??a.colors[0],a.lineWidths[0],M(a,`basis`,a.lineWidths[0]))}};function pn(e,t){let n=2/(t+1),r=Array(e.length).fill(null),i=0,a=0;for(let o=0;o<e.length;o++){if(o<t-1){a+=e[o];continue}i=o===t-1?(a+e[o])/t:(e[o]-i)*n+i,r[o]=i}return r}function mn(e,t,n){let r=Array(n).fill(null);for(let n=0;n<e.length;n++)e[n]!==null&&(r[t[n]]=e[n]);return r}function hn(e){let t=[],n=[];for(let r=0;r<e.length;r++)e[r]!==null&&(t.push(e[r]),n.push(r));return{values:t,indices:n}}var gn=class extends N{descriptor={id:`tema`,name:`Triple EMA`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`TEMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`TEMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=pn(e.map(e=>e.close),n),o=hn(a),s=mn(pn(o.values,n),o.indices,e.length),c=hn(s),l=mn(pn(c.values,n),c.indices,e.length);for(let t=0;t<e.length;t++){let n=a[t],o=s[t],c=l[t];if(n===null||o===null||c===null)continue;let u={value:3*n-3*o+c};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},_n=class extends N{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34},shortName:`AO`,plots:[{key:`value`,title:`AO`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e,t){let n=I(t,`fast`,5,1),r=I(t,`slow`,34,1),i=new P,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}},vn=class extends N{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10},shortName:`Chaikin Osc`,plots:[{key:`value`,title:`Chaikin`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=I(t,`fast`,3,1),r=I(t,`slow`,10,1),i=new P,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}},yn=class extends N{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`RSI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`RSI`,color:0}],scale:{min:0,max:100},levels:[30,70]};smoothing=new WeakMap;calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a={values:r,series:i};if(e.length<n+1)return a;let o=[],s=[],c=0,l=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?c+=n:l-=n}c/=n,l/=n,o[n]=c,s[n]=l;let u={value:l===0?100:100-100/(1+c/l)};r.set(e[n].time,u),i[n]=u;for(let t=n+1;t<e.length;t++){let a=e[t].close-e[t-1].close,u=a>0?a:0,d=a<0?-a:0;c=(c*(n-1)+u)/n,l=(l*(n-1)+d)/n,o[t]=c,s[t]=l;let f={value:l===0?100:100-100/(1+c/l)};r.set(e[t].time,f),i[t]=f}return this.smoothing.set(a,{gain:o,loss:s}),a}update(e,t,n,r){let i=I(t,`period`,14,1),a=this.smoothing.get(n);if(!a||r<=i||!this.canResume(e,n,r))return null;let o=a.gain[r-1],s=a.loss[r-1];if(o===void 0||s===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close-e[t-1].close,c=r>0?r:0,l=r<0?-r:0;o=(o*(i-1)+c)/i,s=(s*(i-1)+l)/i,a.gain[t]=o,a.loss[t]=s;let u=s===0?100:100-100/(1+o/s);this.writePoint(n,e,t,{value:u})}return n}},bn=class extends N{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9,source:`close`},shortName:`MACD`,inputs:{source:{source:!0}},plots:[{key:`histogram`,title:`Histogram`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`macd`,title:`MACD`,color:0},{key:`signal`,title:`Signal`,color:1}]};emas=new WeakMap;calculate(e,t){let n=I(t,`fast`,12,1),r=I(t,`slow`,26,1),i=I(t,`signal`,9,1),a=new P,o=Array(e.length).fill(null),s={values:a,series:o};if(e.length<r)return s;let c=2/(n+1),l=2/(r+1),u=2/(i+1),d=Array(e.length),f=Array(e.length),p=e[0].close,m=e[0].close,h=0,g=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(p=n,m=n):(p=(n-p)*c+p,m=(n-m)*l+m),d[t]=p,f[t]=m,t>=r-1){let n=p-m;g?h=(n-h)*u+h:(h=n,g=!0);let r=n-h,i={macd:n,signal:h,histogram:r};a.set(e[t].time,i),o[t]=i}}return this.emas.set(s,{fast:d,slow:f}),s}update(e,t,n,r){let i=I(t,`fast`,12,1),a=I(t,`slow`,26,1),o=I(t,`signal`,9,1),s=this.emas.get(n);if(!s||r<a||!this.canResume(e,n,r))return null;let c=s.fast[r-1],l=s.slow[r-1],u=n.series[r-1]?.signal;if(c===void 0||l===void 0||u===void 0)return null;let d=2/(i+1),f=2/(a+1),p=2/(o+1);for(let t=r;t<e.length;t++){let r=e[t].close;c=(r-c)*d+c,l=(r-l)*f+l,s.fast[t]=c,s.slow[t]=l;let i=c-l;u=(i-u)*p+u,this.writePoint(n,e,t,{macd:i,signal:u,histogram:i-u})}return n}},xn=class extends N{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3},shortName:`Stoch`,plots:[{key:`k`,title:`%K`,color:0},{key:`d`,title:`%D`,color:1}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=I(t,`kPeriod`,14,1),r=I(t,`dPeriod`,3,1),i=I(t,`smooth`,3,1),a=new P,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`kPeriod`,14,1),a=I(t,`dPeriod`,3,1),o=I(t,`smooth`,3,1),s=i-1+o-1,c=t=>{let n=-1/0,r=1/0;for(let a=t-i+1;a<=t;a++)e[a].high>n&&(n=e[a].high),e[a].low<r&&(r=e[a].low);return n===r?50:(e[t].close-r)/(n-r)*100},l=e=>{let t=0;for(let n=e-o+1;n<=e;n++)t+=c(n);return t/o};for(let t=r;t<e.length;t++){if(t<s||e.length<i){this.writePoint(n,e,t,null);continue}let r={k:l(t)};if(t>=s+a-1){let e=0;for(let n=t-a+1;n<=t;n++)e+=l(n);r.d=e/a}this.writePoint(n,e,t,r)}return n}},Sn=class extends N{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14},shortName:`ATR`,plots:[{key:`value`,title:`ATR`,color:0}]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<Math.max(2,n))return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}update(e,t,n,r){let i=I(t,`period`,14,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;for(let t=r;t<e.length;t++){let r=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a=(a*(i-1)+r)/i,this.writePoint(n,e,t,{value:a})}return n}},Cn=class extends N{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14},shortName:`ADX`,plots:[{key:`adx`,title:`ADX`,color:0},{key:`plusDI`,title:`+DI`,color:1},{key:`minusDI`,title:`−DI`,color:2}],scale:{min:0}};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}},wn=class extends N{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{},shortName:`OBV`,plots:[{key:`value`,title:`OBV`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;for(let t=r;t<e.length;t++)e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume),this.writePoint(n,e,t,{value:i});return n}},Tn=class extends N{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14},shortName:`%R`,plots:[{key:`value`,title:`%R`,color:0}],scale:{min:-100,max:0},levels:[-80,-20]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},En=class extends N{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20},shortName:`CCI`,plots:[{key:`value`,title:`CCI`,color:0}],levels:[-100,0,100]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}},Dn=class extends N{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14},shortName:`MFI`,plots:[{key:`value`,title:`MFI`,color:0}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}},On=class extends N{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25},shortName:`Aroon`,plots:[{key:`up`,title:`Up`,color:0},{key:`down`,title:`Down`,color:1}],scale:{min:0,max:100}};calculate(e,t){let n=I(t,`period`,25,1),r=new P,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}},kn=class extends N{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12,source:`close`},shortName:`ROC`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`ROC`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,12,1),r=new P,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}},An=class extends N{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7,source:`close`},shortName:`TSI`,inputs:{source:{source:!0}},plots:[{key:`tsi`,title:`TSI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=I(t,`longPeriod`,25,1),r=I(t,`shortPeriod`,13,1),i=I(t,`signalPeriod`,7,1),a=new P,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}},jn=class extends N{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20},shortName:`CMF`,plots:[{key:`value`,title:`CMF`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},Mn=class extends N{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0},shortName:`Vol Δ`,plots:[{key:`value`,title:`Delta`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e,t){let n=F(t,`mode`,0)>=1,r=new P,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}},Nn=class extends N{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14},shortName:`VI`,plots:[{key:`viPlus`,title:`VI+`,color:0},{key:`viMinus`,title:`VI−`,color:1}],levels:[1]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}},Pn=class extends N{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14},shortName:`CHOP`,plots:[{key:`value`,title:`CHOP`,color:0}],scale:{min:0,max:100},levels:[38.2,61.8]};calculate(e,t){let n=I(t,`period`,14,2),r=new P,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}},Fn=class extends N{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28},shortName:`UO`,plots:[{key:`value`,title:`UO`,color:0}],scale:{min:0,max:100},levels:[30,70]};calculate(e,t){let n=I(t,`fast`,7,1),r=I(t,`mid`,14,1),i=I(t,`slow`,28,1),a=new P,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=In(l(s,t,n),l(c,t,n)),d=In(l(s,t,r),l(c,t,r)),f=In(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}};function In(e,t){return t===0?0:e/t}var Ln=class extends N{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13},shortName:`EFI`,plots:[{key:`value`,title:`EFI`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,13,1),r=new P,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}},Rn=class extends N{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100,source:`close`},shortName:`CRSI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`CRSI`,color:0}],scale:{min:0,max:100},levels:[10,90]};calculate(e,t){let n=I(t,`rsiPeriod`,3,1),r=I(t,`streakPeriod`,2,1),i=I(t,`rankPeriod`,100,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=zn(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=zn(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}};function zn(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var Bn=class extends N{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10,source:`close`},shortName:`Coppock`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`Coppock`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`longRoc`,14,1),r=I(t,`shortRoc`,11,1),i=I(t,`wma`,10,1),a=new P,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}},Vn=class extends N{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9,source:`close`},shortName:`KST`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`KST`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`roc1`,10,1),r=I(t,`roc2`,15,1),i=I(t,`roc3`,20,1),a=I(t,`roc4`,30,1),o=I(t,`sma1`,10,1),s=I(t,`sma2`,10,1),c=I(t,`sma3`,10,1),l=I(t,`sma4`,15,1),u=I(t,`signal`,9,1),d=new P,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=Un(Hn(m,n),o),g=Un(Hn(m,r),s),_=Un(Hn(m,i),c),v=Un(Hn(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=Un(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}};function Hn(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function Un(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var Wn=class extends N{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13},shortName:`Elder Ray`,plots:[{key:`bull`,title:`Bull`,color:0,kind:`histogram`},{key:`bear`,title:`Bear`,color:1,kind:`histogram`}]};calculate(e,t){let n=I(t,`period`,13,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let o=Math.max(0,r.visibleRange.from),s=Math.min(r.visibleRange.to,a.length-1),c=e.T(r),l=c(0),u=Math.max(1,r.barWidth/2),d=[[`bull`,i.colors[0],-u],[`bear`,i.colors[1]??i.colors[0],0]];for(let[n,f,p]of d)if(i.plots?.[n]?.visible!==!1){t.beginPath(),t.fillStyle=f;for(let i=o;i<=s;i++){let o=a[i]?.[n];if(o===void 0||!Number.isFinite(o))continue;let s=c(o);t.rect(e.b(i,r)+p,Math.min(s,l),u,Math.max(1,Math.abs(s-l)))}t.fill()}}},Gn=class extends N{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10,source:`close`},shortName:`STC`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`STC`,color:0}],scale:{min:0,max:100},levels:[25,75]};calculate(e,t){let n=I(t,`fast`,23,1),r=I(t,`slow`,50,1),i=I(t,`cycle`,10,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=Kn(Kn(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}};function Kn(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var qn=class extends N{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13},shortName:`KVO`,plots:[{key:`value`,title:`KVO`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`fast`,34,1),r=I(t,`slow`,55,1),i=I(t,`signal`,13,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}},Jn=class extends N{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9},shortName:`Fisher`,plots:[{key:`value`,title:`Fisher`,color:0},{key:`trigger`,title:`Trigger`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`period`,9,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}},Yn=class extends N{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20,source:`close`},shortName:`DPO`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`DPO`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=I(t,`period`,20,2),r=Math.floor(n/2)+1,i=new P,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}},Xn=class extends N{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14},shortName:`BOP`,plots:[{key:`value`,title:`BOP`,color:0}],scale:{min:-1,max:1},levels:[0]};calculate(e,t){let n=I(t,`smooth`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},Zn=class extends N{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25},shortName:`Mass`,plots:[{key:`value`,title:`Mass`,color:0}],levels:[26.5,27]};calculate(e,t){let n=I(t,`ema`,9,1),r=I(t,`sum`,25,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}},Qn=class extends N{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9,source:`close`},shortName:`CMO`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`CMO`,color:0}],scale:{min:-100,max:100},levels:[-50,0,50]};calculate(e,t){let n=I(t,`period`,9,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},$n=class extends N{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9,source:`close`},shortName:`TRIX`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`TRIX`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`period`,15,1),r=I(t,`signal`,9,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=er(er(er(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=er(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}};function er(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var tr=class extends N{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14},shortName:`EOM`,plots:[{key:`value`,title:`EOM`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},nr=class extends N{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{},shortName:`PVT`,plots:[{key:`value`,title:`PVT`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}},rr=class extends N{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{},shortName:`WAD`,plots:[{key:`value`,title:`WAD`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}},ir=class extends N{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10},shortName:`CV`,plots:[{key:`value`,title:`CV`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`ema`,10,1),r=I(t,`roc`,10,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}},ar=class extends N{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10},shortName:`RVGI`,plots:[{key:`value`,title:`RVGI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`period`,10,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}},or=class extends N{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3,source:`close`},shortName:`Stoch RSI`,inputs:{source:{source:!0}},plots:[{key:`k`,title:`%K`,color:0},{key:`d`,title:`%D`,color:1}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=I(t,`rsiPeriod`,14,1),r=I(t,`stochPeriod`,14,1),i=I(t,`k`,3,1),a=I(t,`d`,3,1),o=new P,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=sr(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=cr(u,i),f=cr(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}};function sr(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function cr(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var lr=class extends N{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9,source:`close`},shortName:`PPO`,inputs:{source:{source:!0}},plots:[{key:`hist`,title:`Histogram`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`value`,title:`PPO`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`fast`,12,1),r=I(t,`slow`,26,1),i=I(t,`signal`,9,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=ur(c,n),u=ur(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=ur(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}};function ur(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var dr=class extends N{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{},shortName:`AC`,plots:[{key:`value`,title:`AC`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e){let t=new P,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=fr(i,e,5)-fr(i,e,34);let o;for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let s=a[i]-r/5,c=o===void 0?s>=0:s>=o;o=s;let l={value:s,up:+!!c};t.set(e[i].time,l),n[i]=l}return{values:t,series:n}}};function fr(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var pr=class extends N{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5,source:`close`},shortName:`RMI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`RMI`,color:0}],scale:{min:0,max:100},levels:[30,70]};calculate(e,t){let n=I(t,`period`,20,1),r=I(t,`momentum`,5,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}},mr=class extends N{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`DI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`DI`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},hr=class extends N{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8},shortName:`Qstick`,plots:[{key:`value`,title:`Qstick`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,8,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}},gr=class extends N{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14},shortName:`PGO`,plots:[{key:`value`,title:`PGO`,color:0}],levels:[-3,0,3]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}},_r=class extends N{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20,source:`close`},shortName:`StdDev`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`StdDev`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}},vr=class extends N{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`overlay`,defaultConfig:{rows:24},shortName:`VP`,plots:[]};calculate(e,t){let n=I(t,`rows`,24,1),r=new P,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(t,n,r,i){let{chartRect:a}=r,o=n.meta;if(!o||o.maxVolume===0)return;let{minPrice:s,rows:c,rowHeight:l,bins:u,maxVolume:d}=o,f=a.width*.3,p=e.T(r);for(let e=0;e<c;e++){let n=p(s+e*l),r=p(s+(e+1)*l),o=u[e]/d*f;t.fillStyle=u[e]>d*.7?i.colors[1]??`rgba(242, 169, 59, 0.5)`:i.colors[0]??`rgba(76, 141, 255, 0.3)`,t.fillRect(a.x,Math.min(n,r),o,Math.max(Math.abs(n-r)-1,1))}}},yr=class extends N{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{},shortName:`A/D`,plots:[{key:`value`,title:`A/D`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}},br=class extends N{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14},shortName:`VROC`,plots:[{key:`value`,title:`VROC`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}};function L(e,t){let n=new P;for(let r=0;r<t.length;r++){let i=t[r];i&&n.set(e[r].time,i)}return{values:n,series:t}}function R(e){return e.map(e=>e.close)}function xr(e,t){let n=Array(e.length).fill(void 0),r=0,i=0;for(let a=0;a<e.length;a++){let o=e[a];if(o===void 0){r=0,i=0;continue}r+=o,i++,i>t&&(r-=e[a-t]),i>=t&&(n[a]=r/t)}return n}function Sr(e,t,n){let r=Array(e.length).fill(void 0),i=0,a=0,o;for(let s=0;s<e.length;s++){let c=e[s];if(c!==void 0){if(o===void 0){i+=c,a++,a===t&&(r[s]=o=i/t);continue}o+=n*(c-o),r[s]=o}}return r}function z(e,t){return Sr(e,t,2/(t+1))}function Cr(e,t){let n=Array(e.length).fill(void 0),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-t+1+n];if(r===void 0){o=!1;break}a+=r*(n+1)}o&&(n[i]=a/r)}return n}function wr(e,t){return Sr(e,t,1/t)}function Tr(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=0,o=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){o=!1;break}i+=t,a+=t*t}if(!o)continue;let s=i/t;n[r]=Math.sqrt(Math.max(0,a/t-s*s))}return n}function Er(e){return e.map((t,n)=>{if(n===0)return t.high-t.low;let r=e[n-1].close;return Math.max(t.high-t.low,Math.abs(t.high-r),Math.abs(t.low-r))})}function Dr(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return;t>r&&(r=t)}return r}function Or(e,t,n){if(t<n-1)return;let r=1/0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return;t<r&&(r=t)}return r}function kr(e,t=`value`){return e.map(e=>e!==void 0&&Number.isFinite(e)?{[t]:e}:null)}function Ar(e,t,n){if(t<n-1||t>=e.length)return;let r=0,i=0;for(let a=t-n+1;a<=t;a++){let t=e[a].close;r+=t,i+=t*t}let a=r/n;return{mean:a,sd:Math.sqrt(Math.max(0,i/n-a*a))}}function jr(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++)e[i].high>r&&(r=e[i].high);return r}function Mr(e,t,n){if(t<n-1)return;let r=1/0;for(let i=t-n+1;i<=t;i++)e[i].low<r&&(r=e[i].low);return r}function Nr(e,t,n){if(t<n-1)return;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].close;return r/n}function Pr(e,t,n){if(n<2||t<n-1)return;let r=n,i=(r-1)/2,a=0;for(let n=0;n<r;n++)a+=e[t-r+1+n].close;a/=r;let o=0,s=0,c=0;for(let n=0;n<r;n++){let l=n-i,u=e[t-r+1+n].close-a;o+=l*u,s+=l*l,c+=u*u}let l=o/s,u=a-l*i,d=0;for(let n=0;n<r;n++){let i=e[t-r+1+n].close-(u+l*n);d+=i*i}return{slope:l,end:u+l*(r-1),stdErr:r>2?Math.sqrt(d/(r-2)):0,r:c===0?0:o/Math.sqrt(s*c)}}var Fr=class extends N{descriptor={id:`dema`,name:`Double Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`DEMA`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`DEMA`,color:0}]};emas=new WeakMap;calculate(e,t){let n=I(t,`period`,20,1),r=z(R(e),n),i=z(r,n),a=L(e,kr(r.map((e,t)=>e!==void 0&&i[t]!==void 0?2*e-i[t]:void 0)));return this.emas.set(a,{e1:r,e2:i}),a}update(e,t,n,r){let i=this.emas.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.e1[r-1],o=i.e2[r-1];if(a===void 0||o===void 0)return null;let s=2/(I(t,`period`,20,1)+1);for(let t=r;t<e.length;t++)a+=s*(e[t].close-a),o+=s*(a-o),i.e1[t]=a,i.e2[t]=o,this.writePoint(n,e,t,{value:2*a-o});return n}},Ir=class extends N{descriptor={id:`smma`,name:`Smoothed Moving Average`,placement:`overlay`,defaultConfig:{period:14,source:`close`},shortName:`SMMA`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`SMMA`,color:0}]};calculate(e,t){return L(e,kr(wr(R(e),I(t,`period`,14,1))))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;let a=I(t,`period`,14,1);for(let t=r;t<e.length;t++)i+=(e[t].close-i)/a,this.writePoint(n,e,t,{value:i});return n}},B=class extends N{times=new WeakMap;lookback(e){return 0}revisesBefore(e){return this.lookback(this.read(e))}calculate(e,t){let n=this.read(t),r=Array(e.length);for(let t=0;t<e.length;t++)r[t]=this.pointAt(e,t,n);let i=L(e,r);return this.times.set(i,e.map(e=>e.time)),i}update(e,t,n,r){let i=this.times.get(n);if(!i||!this.canResume(e,n,r))return null;for(let t=r;t<i.length&&t<e.length;t++)if(i[t]!==e[t].time)return null;let a=this.read(t);for(let t=Math.max(0,r-this.lookback(a));t<e.length;t++)this.writePoint(n,e,t,this.pointAt(e,t,a));i.length=e.length;for(let t=r;t<e.length;t++)i[t]=e[t].time;return n}},Lr=class extends B{descriptor={id:`alma`,name:`Arnaud Legoux Moving Average`,placement:`overlay`,defaultConfig:{period:9,offset:.85,sigma:6,source:`close`},shortName:`ALMA`,inputs:{period:{min:1,max:5e3},offset:{min:0,max:1,step:.05},sigma:{min:.5,step:.5},source:{source:!0}},plots:[{key:`value`,title:`ALMA`,color:0}]};read(e){let t=Math.min(5e3,I(e,`period`,9,1)),n=Math.min(1,Math.max(0,F(e,`offset`,.85))),r=Math.max(.5,F(e,`sigma`,6)),i=n*(t-1),a=t/r,o=Array.from({length:t},(e,t)=>Math.exp(-((t-i)**2)/(2*a*a)));return{period:t,weights:o,norm:o.reduce((e,t)=>e+t,0)}}pointAt(e,t,{period:n,weights:r,norm:i}){if(t<n-1)return null;let a=0;for(let i=0;i<n;i++)a+=r[i]*e[t-n+1+i].close;return{value:a/i}}},Rr=class extends N{descriptor={id:`kama`,name:`Kaufman Adaptive Moving Average`,placement:`overlay`,defaultConfig:{period:10,fast:2,slow:30,source:`close`},shortName:`KAMA`,inputs:{period:{min:1},fast:{min:1},slow:{min:1},source:{source:!0}},plots:[{key:`value`,title:`KAMA`,color:0}]};calculate(e,t){let n=L(e,Array(e.length).fill(null)),r=I(t,`period`,10,1);return e.length<=r||this.extend(e,t,n,r,e[r-1].close),n}update(e,t,n,r){if(r<=I(t,`period`,10,1)||!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;return i===void 0?null:(this.extend(e,t,n,r,i),n)}extend(e,t,n,r,i){let a=I(t,`period`,10,1),o=2/(I(t,`fast`,2,1)+1),s=2/(I(t,`slow`,30,1)+1);for(let t=r;t<e.length;t++){let r=0;for(let n=t-a+1;n<=t;n++)r+=Math.abs(e[n].close-e[n-1].close);let c=Math.abs(e[t].close-e[t-a].close),l=((r>0?c/r:0)*(o-s)+s)**2;i+=l*(e[t].close-i),this.writePoint(n,e,t,{value:i})}}},zr=class extends B{descriptor={id:`lsma`,name:`Least Squares Moving Average`,placement:`overlay`,defaultConfig:{period:25,offset:0,source:`close`},shortName:`LSMA`,inputs:{period:{min:2,max:5e3},offset:{step:1},source:{source:!0}},plots:[{key:`value`,title:`LSMA`,color:0}]};read(e){let t=Math.min(5e3,I(e,`period`,25,2)),n=Math.round(I(e,`offset`,0,-1e3)),r=t*(t-1)/2;return{period:t,offset:n,sx:r,denom:t*((t-1)*t*(2*t-1)/6)-r*r}}pointAt(e,t,{period:n,offset:r,sx:i,denom:a}){if(t<n-1)return null;let o=0,s=0;for(let r=0;r<n;r++){let i=e[t-n+1+r].close;o+=i,s+=r*i}let c=(n*s-i*o)/a;return{value:(o-c*i)/n+c*(n-1-r)}}},Br=class extends N{descriptor={id:`mcginley`,name:`McGinley Dynamic`,placement:`overlay`,defaultConfig:{period:14,source:`close`},shortName:`McGinley`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`McGinley`,color:0}]};calculate(e,t){let n=I(t,`period`,14,1),r=z(R(e),n),i=Array(e.length).fill(void 0),a;for(let t=0;t<e.length;t++)a=a===void 0?r[t]:Vr(a,e[t].close,n),i[t]=a;return L(e,kr(i))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;let a=I(t,`period`,14,1);for(let t=r;t<e.length;t++)i=Vr(i,e[t].close,a),this.writePoint(n,e,t,{value:i});return n}};function Vr(e,t,n){return e>0&&t>0?e+(t-e)/(n*(t/e)**4):t}function Hr(e){return e.params.type===`ema`?[`ema`,`ema`]:e.params.type===`sma-ema`?[`sma`,`ema`]:[`sma`,`sma`]}var Ur=class extends N{descriptor={id:`macross`,name:`MA Cross`,placement:`overlay`,defaultConfig:{fast:9,slow:21,type:`sma`,source:`close`},shortName:`MA Cross`,inputs:{fast:{min:1},slow:{min:1},type:{options:[`sma`,`ema`,`sma-ema`]},source:{source:!0}},plots:[{key:`fast`,title:`Fast`,color:0},{key:`slow`,title:`Slow`,color:1}]};calculate(e,t){let[n,r]=Hr(t),i=R(e),a=(t,n)=>t===`ema`?z(i,n):e.map((t,r)=>Nr(e,r,n)),o=a(n,I(t,`fast`,9,1)),s=a(r,I(t,`slow`,21,1));return L(e,o.map((e,t)=>Wr(e,s[t])))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let[i,a]=Hr(t),o=I(t,`fast`,9,1),s=I(t,`slow`,21,1),c=n.series[r-1]?.fast,l=n.series[r-1]?.slow;if(i===`ema`&&c===void 0||a===`ema`&&l===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close;c=i===`ema`?c+2/(o+1)*(r-c):Nr(e,t,o),l=a===`ema`?l+2/(s+1)*(r-l):Nr(e,t,s),this.writePoint(n,e,t,Wr(c,l))}return n}};function Wr(e,t){return e===void 0&&t===void 0?null:{...e===void 0?{}:{fast:e},...t===void 0?{}:{slow:t}}}var Gr=class extends B{descriptor={id:`fractals`,name:`Williams Fractals`,placement:`overlay`,defaultConfig:{period:2},shortName:`Fractals`,inputs:{period:{min:1,max:10}},plots:[{key:`up`,title:`Up`,color:0,kind:`dots`},{key:`down`,title:`Down`,color:1,kind:`dots`}]};read(e){return I(e,`period`,2,1)}lookback(e){return e}pointAt(e,t,n){if(t<n||t>e.length-n-1)return null;let r=!0,i=!0;for(let a=t-n;a<=t+n&&(r||i);a++)a!==t&&(e[a].high>=e[t].high&&(r=!1),e[a].low<=e[t].low&&(i=!1));return!r&&!i?null:{...r?{up:e[t].high}:{},...i?{down:e[t].low}:{}}}},Kr=class extends N{descriptor={id:`cks`,name:`Chande Kroll Stop`,placement:`overlay`,defaultConfig:{p:10,x:1,q:9},shortName:`CKS`,inputs:{p:{label:`ATR length`,min:1},x:{label:`ATR multiplier`,min:0,step:.1},q:{label:`Stop length`,min:1}},plots:[{key:`long`,title:`Stop Long`,color:0},{key:`short`,title:`Stop Short`,color:1}]};states=new WeakMap;calculate(e,t){let n=I(t,`p`,10,1),r=F(t,`x`,1),i=I(t,`q`,9,1),a={atr:wr(Er(e),n),firstHigh:[],firstLow:[]};for(let t=0;t<e.length;t++)qr(e,a,t,n,r);let o=L(e,e.map((e,t)=>Jr(a,t,i)));return this.states.set(o,a),o}update(e,t,n,r){let i=this.states.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.atr[r-1];if(a===void 0)return null;let o=I(t,`p`,10,1),s=F(t,`x`,1),c=I(t,`q`,9,1);for(let t=r;t<e.length;t++){let r=e[t-1].close,l=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-r),Math.abs(e[t].low-r));a+=(l-a)/o,i.atr[t]=a,qr(e,i,t,o,s),this.writePoint(n,e,t,Jr(i,t,c))}return n}};function qr(e,t,n,r,i){let a=t.atr[n],o=jr(e,n,r),s=Mr(e,n,r);t.firstHigh[n]=o!==void 0&&a!==void 0?o-i*a:void 0,t.firstLow[n]=s!==void 0&&a!==void 0?s+i*a:void 0}function Jr(e,t,n){let r=Dr(e.firstHigh,t,n),i=Or(e.firstLow,t,n);return r!==void 0&&i!==void 0?{long:i,short:r}:null}var Yr=class extends B{descriptor={id:`bbpb`,name:`Bollinger Bands %B`,placement:`panel`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`%B`,inputs:{period:{min:2},stdDev:{min:.1,step:.1},source:{source:!0}},plots:[{key:`value`,title:`%B`,color:0}],levels:[0,.5,1]};read(e){return{period:I(e,`period`,20,2),k:F(e,`stdDev`,2)}}pointAt(e,t,{period:n,k:r}){let i=Ar(e,t,n);return!i||i.sd===0?null:{value:(e[t].close-(i.mean-r*i.sd))/(2*r*i.sd)}}},Xr=class extends B{descriptor={id:`bbw`,name:`Bollinger BandWidth`,placement:`panel`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`BBW`,inputs:{period:{min:2},stdDev:{min:.1,step:.1},source:{source:!0}},plots:[{key:`value`,title:`BBW`,color:0}]};read(e){return{period:I(e,`period`,20,2),k:F(e,`stdDev`,2)}}pointAt(e,t,{period:n,k:r}){let i=Ar(e,t,n);return!i||i.mean===0?null:{value:2*r*i.sd/i.mean}}},Zr=class extends B{descriptor={id:`mom`,name:`Momentum`,placement:`panel`,defaultConfig:{period:10,source:`close`},shortName:`MOM`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`MOM`,color:0}],levels:[0]};read(e){return I(e,`period`,10,1)}pointAt(e,t,n){return t>=n?{value:e[t].close-e[t-n].close}:null}},Qr=class extends B{descriptor={id:`hv`,name:`Historical Volatility`,placement:`panel`,defaultConfig:{period:10,annual:365,source:`close`},shortName:`HV`,inputs:{period:{min:2},annual:{label:`Bars per year`,min:1},source:{source:!0}},plots:[{key:`value`,title:`HV`,color:0}],scale:{min:0}};read(e){return{period:I(e,`period`,10,2),annual:Math.max(1,F(e,`annual`,365))}}pointAt(e,t,{period:n,annual:r}){if(t<n)return null;let i=0,a=0;for(let r=t-n+1;r<=t;r++){let t=e[r-1].close,n=e[r].close;if(!(t>0&&n>0))return null;let o=Math.log(n/t);i+=o,a+=o*o}let o=i/n;return{value:100*Math.sqrt(Math.max(0,a/n-o*o))*Math.sqrt(r)}}},$r=class extends N{descriptor={id:`vo`,name:`Volume Oscillator`,placement:`panel`,defaultConfig:{short:5,long:10},shortName:`Vol Osc`,inputs:{short:{min:1},long:{min:1}},plots:[{key:`value`,title:`Vol Osc`,color:0}],levels:[0]};emas=new WeakMap;calculate(e,t){let n=e.map(e=>e.volume),r=z(n,I(t,`short`,5,1)),i=z(n,I(t,`long`,10,1)),a=L(e,kr(r.map((e,t)=>ei(e,i[t]))));return this.emas.set(a,{fast:r,slow:i}),a}update(e,t,n,r){let i=this.emas.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.fast[r-1],o=i.slow[r-1];if(a===void 0||o===void 0)return null;let s=2/(I(t,`short`,5,1)+1),c=2/(I(t,`long`,10,1)+1);for(let t=r;t<e.length;t++){a+=s*(e[t].volume-a),o+=c*(e[t].volume-o),i.fast[t]=a,i.slow[t]=o;let r=ei(a,o);this.writePoint(n,e,t,r===void 0?null:{value:r})}return n}};function ei(e,t){return e===void 0||t===void 0||t===0?void 0:100*(e-t)/t}var ti=class extends N{descriptor={id:`ulcer`,name:`Ulcer Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`Ulcer`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`Ulcer`,color:0}],scale:{min:0}};drawdowns=new WeakMap;calculate(e,t){let n=I(t,`period`,14,1),r=e.map((t,r)=>ni(e,r,n)),i=L(e,e.map((e,t)=>ri(r,t,n)));return this.drawdowns.set(i,r),i}update(e,t,n,r){let i=this.drawdowns.get(n);if(!i||!this.canResume(e,n,r))return null;let a=I(t,`period`,14,1);for(let t=r;t<e.length;t++)i[t]=ni(e,t,a);i.length=e.length;for(let t=r;t<e.length;t++)this.writePoint(n,e,t,ri(i,t,a));return n}};function ni(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++)e[i].close>r&&(r=e[i].close);return r===0?void 0:100*(e[t].close-r)/r}function ri(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return null;r+=t*t}return{value:Math.sqrt(r/n)}}var ii=class extends N{descriptor={id:`smi`,name:`Stochastic Momentum Index`,placement:`panel`,defaultConfig:{period:10,smooth:3,signal:3},shortName:`SMI`,inputs:{period:{min:1},smooth:{min:1},signal:{min:1}},plots:[{key:`smi`,title:`SMI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[40,-40]};calculate(e,t){let n=I(t,`period`,10,1),r=I(t,`smooth`,3,1),i=I(t,`signal`,3,1),a=Array(e.length).fill(void 0),o=Array(e.length).fill(void 0);for(let t=n-1;t<e.length;t++){let r=jr(e,t,n),i=Mr(e,t,n);r===void 0||i===void 0||(a[t]=e[t].close-(r+i)/2,o[t]=r-i)}let s=z(z(a,r),r),c=z(z(o,r),r),l=s.map((e,t)=>{let n=c[t]===void 0?void 0:c[t]/2;if(!(e===void 0||n===void 0))return n===0?0:Math.max(-100,Math.min(100,100*e/n))}),u=z(l,i);return L(e,l.map((e,t)=>{if(e===void 0)return null;let n={smi:e};return u[t]!==void 0&&(n.signal=u[t]),n}))}},ai=class extends N{descriptor={id:`rvix`,name:`Relative Volatility Index`,placement:`panel`,defaultConfig:{period:10,smooth:14},shortName:`RVI (vol)`,inputs:{period:{min:2},smooth:{min:1}},plots:[{key:`value`,title:`RVI`,color:0}],levels:[80,50,20],scale:{min:0,max:100}};calculate(e,t){let n=I(t,`period`,10,2),r=I(t,`smooth`,14,1),i=Tr(R(e),n),a=i.map((t,n)=>t===void 0||n===0?void 0:e[n].close>e[n-1].close?t:0),o=i.map((t,n)=>t===void 0||n===0?void 0:e[n].close<e[n-1].close?t:0),s=z(a,r),c=z(o,r);return L(e,kr(s.map((e,t)=>{let n=c[t];if(!(e===void 0||n===void 0))return e+n===0?50:100*e/(e+n)})))}},oi=class extends B{descriptor={id:`trendstrength`,name:`Trend Strength Index`,placement:`panel`,defaultConfig:{period:14},shortName:`TSI (trend)`,inputs:{period:{min:2}},plots:[{key:`value`,title:`Trend`,color:0}],levels:[0],scale:{min:-1,max:1}};read(e){return I(e,`period`,14,2)}pointAt(e,t,n){let r=Pr(e,t,n);return r?{value:r.r}:null}},si=class extends B{descriptor={id:`lrslope`,name:`Linear Regression Slope`,placement:`panel`,defaultConfig:{period:14},shortName:`LR Slope`,inputs:{period:{min:2}},plots:[{key:`value`,title:`Slope`,color:0}],levels:[0]};read(e){return I(e,`period`,14,2)}pointAt(e,t,n){let r=Pr(e,t,n);return r?{value:r.slope}:null}},ci=class extends B{descriptor={id:`stderror`,name:`Standard Error`,placement:`panel`,defaultConfig:{period:14},shortName:`StdErr`,inputs:{period:{min:3}},plots:[{key:`value`,title:`StdErr`,color:0}],scale:{min:0}};read(e){return I(e,`period`,14,3)}pointAt(e,t,n){let r=Pr(e,t,n);return r?{value:r.stdErr}:null}},li=class extends B{descriptor={id:`adr`,name:`Average Day Range`,placement:`panel`,defaultConfig:{period:14},shortName:`ADR`,inputs:{period:{min:1}},plots:[{key:`value`,title:`ADR`,color:0}],scale:{min:0}};read(e){return I(e,`period`,14,1)}pointAt(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].high-e[i].low;return{value:r/n}}},ui=class extends B{descriptor={id:`netvolume`,name:`Net Volume`,placement:`panel`,defaultConfig:{},shortName:`Net Vol`,plots:[{key:`value`,title:`Net`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}],levels:[0]};read(e){return null}pointAt(e,t){if(t===0)return null;let n=e[t].close-e[t-1].close,r=e[t].volume??0;return{value:n>0?r:n<0?-r:0,up:+(n>=0)}}lookback(){return 1}},di=class extends N{descriptor={id:`seb`,name:`Standard Error Bands`,placement:`overlay`,defaultConfig:{period:21,mult:2,smooth:3},shortName:`SEB`,inputs:{period:{min:3},mult:{min:0,step:.1},smooth:{min:1}},plots:[{key:`upper`,title:`Upper`,color:1},{key:`middle`,title:`Middle`,color:0},{key:`lower`,title:`Lower`,color:1}]};calculate(e,t){let n=I(t,`period`,21,3),r=F(t,`mult`,2),i=I(t,`smooth`,3,1),a=Array(e.length).fill(void 0),o=Array(e.length).fill(void 0),s=Array(e.length).fill(void 0);for(let t=0;t<e.length;t++){let i=Pr(e,t,n);i&&(a[t]=i.end,o[t]=i.end+r*i.stdErr,s[t]=i.end-r*i.stdErr)}let c=xr(a,i),l=xr(o,i),u=xr(s,i);return L(e,c.map((e,t)=>e===void 0||l[t]===void 0||u[t]===void 0?null:{middle:e,upper:l[t],lower:u[t]}))}},fi=[3,5,8,10,12,15],pi=[30,35,40,45,50,60],mi=class extends N{descriptor={id:`gmma`,name:`Guppy Multiple Moving Average`,placement:`overlay`,defaultConfig:{},shortName:`GMMA`,plots:[...fi.map(e=>({key:`s${e}`,title:`EMA ${e}`,color:0})),...pi.map(e=>({key:`l${e}`,title:`EMA ${e}`,color:1}))]};calculate(e,t){let n=R(e),r=[...fi.map(e=>[`s${e}`,z(n,e)]),...pi.map(e=>[`l${e}`,z(n,e)])];return L(e,e.map((e,t)=>{let n={},i=!1;for(let[e,a]of r)a[t]!==void 0&&(n[e]=a[t],i=!0);return i?n:null}))}},hi=class extends N{descriptor={id:`maribbon`,name:`Moving Average Ribbon`,placement:`overlay`,defaultConfig:{ma1:20,ma2:50,ma3:100,ma4:200,exponential:0},shortName:`MA Ribbon`,inputs:{ma1:{min:1},ma2:{min:1},ma3:{min:1},ma4:{min:1},exponential:{min:0,max:1}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1},{key:`ma3`,title:`MA 3`,color:2},{key:`ma4`,title:`MA 4`,color:3}]};calculate(e,t){let n=F(t,`exponential`,0)>=1?z:xr,r=R(e),i=[`ma1`,`ma2`,`ma3`,`ma4`],a=[20,50,100,200],o=i.map((e,i)=>[e,n(r,I(t,e,a[i],1))]);return L(e,e.map((e,t)=>{let n={},r=!1;for(let[e,i]of o)i[t]!==void 0&&(n[e]=i[t],r=!0);return r?n:null}))}},gi=class extends B{read(e){return null}pointAt(e,t){return{value:this.price(e[t])}}},_i=class extends gi{descriptor={id:`avgprice`,name:`Average Price`,placement:`overlay`,defaultConfig:{},shortName:`OHLC4`,plots:[{key:`value`,title:`Average`,color:0}]};price(e){return(e.open+e.high+e.low+e.close)/4}},vi=class extends gi{descriptor={id:`medprice`,name:`Median Price`,placement:`overlay`,defaultConfig:{},shortName:`HL2`,plots:[{key:`value`,title:`Median`,color:0}]};price(e){return(e.high+e.low)/2}},yi=class extends gi{descriptor={id:`typprice`,name:`Typical Price`,placement:`overlay`,defaultConfig:{},shortName:`HLC3`,plots:[{key:`value`,title:`Typical`,color:0}]};price(e){return(e.high+e.low+e.close)/3}},bi=500,xi=class extends N{descriptor={id:`machannel`,name:`Moving Average Channel`,placement:`overlay`,defaultConfig:{upperLength:20,lowerLength:20,upperOffset:0,lowerOffset:0},shortName:`MA Channel`,inputs:{upperLength:{min:1},lowerLength:{min:1},upperOffset:{min:-bi,max:bi},lowerOffset:{min:-bi,max:bi}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`lower`,title:`Lower`,color:1}]};calculate(e,t){let n=Ci(xr(e.map(e=>e.high),I(t,`upperLength`,20,1)),Si(t,`upperOffset`)),r=Ci(xr(e.map(e=>e.low),I(t,`lowerLength`,20,1)),Si(t,`lowerOffset`));return L(e,n.map((e,t)=>{let n=r[t];return e===void 0&&n===void 0?null:{...e===void 0?{}:{upper:e},...n===void 0?{}:{lower:n}}}))}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[],f=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i),a=n.upper===void 0?null:{x:r,y:e.w(n.upper,i)},s=n.lower===void 0?null:{x:r,y:e.w(n.lower,i)};a&&l.push(a),s&&u.push(s),a&&s&&(d.push(a),f.push(s))}this.drawBand(n,d,f,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??a.colors[0],a.lineWidths[1]??a.lineWidths[0],M(a,`lower`,a.lineWidths[1]??a.lineWidths[0]))}};function Si(e,t){let n=Number(e.params[t]??0);return Number.isFinite(n)?Math.max(-bi,Math.min(bi,Math.round(n))):0}function Ci(e,t){return e.map((n,r)=>e[r-t])}var wi=500,Ti=class extends B{descriptor={id:`hamming`,name:`Moving Average Hamming`,placement:`overlay`,defaultConfig:{period:10,source:`close`},shortName:`HMA (Hamming)`,inputs:{period:{min:2,max:wi},source:{source:!0}},plots:[{key:`value`,title:`MA`,color:0}]};read(e){let t=Math.min(wi,I(e,`period`,10,2)),n=Array.from({length:t},(e,n)=>.54-.46*Math.cos(2*Math.PI*n/(t-1)));return{weights:n,total:n.reduce((e,t)=>e+t,0)}}pointAt(e,t,{weights:n,total:r}){let i=t-n.length+1;if(i<0)return null;let a=0;for(let t=0;t<n.length;t++)a+=n[t]*e[i+t].close;return{value:a/r}}},Ei=[`sma`,`ema`,`wma`];function Di(e,t,n){return e===`ema`?z(t,n):e===`wma`?Cr(t,n):xr(t,n)}var Oi=class extends N{calculate(e,t){let n=Ei.includes(t.params.type)?t.params.type:`sma`,r=R(e),i=this.lengths.map(([e,i])=>Di(n,r,I(t,e,i,1)));return L(e,e.map((e,t)=>{let n={};return i.forEach((e,r)=>{let i=e[t];i!==void 0&&(n[`ma${r+1}`]=i)}),Object.keys(n).length>0?n:null}))}},ki=class extends Oi{lengths=[[`first`,20],[`second`,50]];descriptor={id:`madouble`,name:`Moving Average Double`,placement:`overlay`,defaultConfig:{first:20,second:50,type:`sma`,source:`close`},shortName:`MA x2`,inputs:{first:{min:1},second:{min:1},type:{options:Ei},source:{source:!0}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1}]}},Ai=class extends Oi{lengths=[[`first`,10],[`second`,20],[`third`,50]];descriptor={id:`matriple`,name:`Moving Average Triple`,placement:`overlay`,defaultConfig:{first:10,second:20,third:50,type:`sma`,source:`close`},shortName:`MA x3`,inputs:{first:{min:1},second:{min:1},third:{min:1},type:{options:Ei},source:{source:!0}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1},{key:`ma3`,title:`MA 3`,color:2}]}},ji=class extends N{descriptor={id:`volindex`,name:`Volatility Index`,placement:`overlay`,defaultConfig:{period:7,mult:3},shortName:`VI`,inputs:{period:{min:1},mult:{label:`ATR multiple`,min:.1,step:.1}},plots:[{key:`sar`,title:`Stop`,color:0,kind:`dots`,tone:{field:`long`},downColor:1}]};calculate(e,t){let n=I(t,`period`,7,1),r=Math.max(.1,F(t,`mult`,3)),i=wr(Er(e),n),a=Array(e.length).fill(null),o=null,s=0;for(let t=0;t<e.length;t++){let n=i[t];if(n===void 0)continue;let c=e[t].close,l=n*r;o===null?(o=c>=e[0].close,s=c):o?(s=Math.max(s,c),c<s-l&&(o=!1,s=c)):(s=Math.min(s,c),c>s+l&&(o=!0,s=c)),a[t]={sar:o?s-l:s+l,long:+!!o}}return L(e,a)}},Mi=class extends N{descriptor={id:`asi`,name:`Accumulative Swing Index`,placement:`panel`,defaultConfig:{limit:10},shortName:`ASI`,inputs:{limit:{label:`Limit move`,min:1e-4,step:.1}},plots:[{key:`value`,title:`ASI`,color:0}],scale:{zero:!0}};calculate(e,t){let n=Math.max(1e-9,F(t,`limit`,10)),r=Array(e.length).fill(null),i=0;for(let t=1;t<e.length;t++)i+=Ni(e[t-1],e[t],n),r[t]={value:i};return L(e,r)}};function Ni(e,t,n){let r=Math.abs(t.high-e.close),i=Math.abs(t.low-e.close),a=t.high-t.low,o=Math.abs(e.close-e.open),s;return s=r>=i&&r>=a?r-.5*i+.25*o:i>=r&&i>=a?i-.5*r+.25*o:a+.25*o,s===0?0:50*(t.close-e.close+.5*(t.close-t.open)+.25*(e.close-e.open))/s*(Math.max(r,i)/n)}var Pi=class extends B{descriptor={id:`advdecline`,name:`Advance/Decline`,placement:`panel`,defaultConfig:{length:10},shortName:`A/D Ratio`,inputs:{length:{min:1}},plots:[{key:`value`,title:`Ratio`,color:0}],scale:{min:0}};read(e){return{length:I(e,`length`,10,1)}}pointAt(e,t,{length:n}){if(t<n-1)return null;let r=0,i=0;for(let a=t-n+1;a<=t;a++)e[a].close>e[a].open?r++:e[a].close<e[a].open&&i++;return{value:i===0?r:r/i}}},Fi=class extends B{descriptor={id:`majority`,name:`Majority Rule`,placement:`panel`,defaultConfig:{period:14},shortName:`Majority`,inputs:{period:{min:1}},plots:[{key:`value`,title:`Majority`,color:0}],scale:{min:0,max:100},levels:[50]};read(e){return{period:I(e,`period`,14,1)}}pointAt(e,t,{period:n}){if(t<n)return null;let r=0;for(let i=t-n+1;i<=t;i++)e[i].close>e[i-1].close&&r++;return{value:100*r/n}}},Ii=34,Li=30,Ri=class extends N{descriptor={id:`chopzone`,name:`Chop Zone`,placement:`panel`,defaultConfig:{},shortName:`Chop Zone`,plots:[{key:`angle`,title:`Angle`,color:0,kind:`histogram`}],scale:{zero:!0}};calculate(e,t){let n=z(R(e),Ii),r=Array(e.length).fill(null);for(let t=1;t<e.length;t++){let i=n[t],a=n[t-1],o=jr(e,t,Li),s=Mr(e,t,Li);if(i===void 0||a===void 0||o===void 0||s===void 0||o===s)continue;let c=e[t],l=(c.high+c.low+c.close)/3;if(!(l>0&&s>0))continue;let u=(i-a)/l*(25/(o-s)*s);r[t]={angle:Math.atan(u)*180/Math.PI}}return L(e,r)}render(t,n,r,i){if(i.plots?.angle?.visible===!1)return;let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=e.w(0,r),l=[];for(let t=o;t<=s&&t<a.length;t++){let n=a[t]?.angle;n!==void 0&&l.push({x:e.b(t,r),y:e.w(n,r),baseY:c,color:zi(n)})}this.drawHistogram(t,l,Math.max(1,r.barWidth))}};function zi(e){return e>=5?`#26C6DA`:e>=3.57?`#43A047`:e>=2.14?`#A5D6A7`:e>=.71?`#009688`:e<=-5?`#D50000`:e<=-3.57?`#E91E63`:e<=-2.14?`#FF6D00`:e<=-.71?`#FFB74D`:`#FDD835`}var Bi=class extends N{descriptor={id:`smiergodic`,name:`SMI Ergodic`,placement:`panel`,defaultConfig:{short:5,long:20,signal:5,source:`close`},shortName:`SMIIO`,inputs:{short:{min:1},long:{min:1},signal:{min:1},source:{source:!0}},plots:[{key:`oscillator`,title:`Oscillator`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`indicator`,title:`Indicator`,color:0},{key:`signal`,title:`Signal`,color:1}],scale:{zero:!0}};calculate(e,t){let n=I(t,`short`,5,1),r=I(t,`long`,20,1),i=e.map((t,n)=>n===0?void 0:t.close-e[n-1].close),a=z(z(i,r),n),o=z(z(i.map(e=>e===void 0?void 0:Math.abs(e)),r),n),s=a.map((e,t)=>e===void 0||!o[t]?void 0:e/o[t]),c=z(s,I(t,`signal`,5,1));return L(e,s.map((e,t)=>{if(e===void 0)return null;let n=c[t];return n===void 0?{indicator:e}:{indicator:e,signal:n,oscillator:e-n}}))}},Vi=class extends N{descriptor={id:`po`,name:`Price Oscillator`,placement:`panel`,defaultConfig:{short:10,long:21,source:`close`},shortName:`PO`,inputs:{short:{min:1},long:{min:1},source:{source:!0}},plots:[{key:`value`,title:`PO`,color:0}],scale:{zero:!0}};calculate(e,t){let n=R(e),r=xr(n,I(t,`short`,10,1)),i=xr(n,I(t,`long`,21,1));return L(e,kr(r.map((e,t)=>e===void 0||i[t]===void 0?void 0:e-i[t])))}},Hi=e=>({period:I(e,`period`,10,1),annual:Math.max(1,F(e,`annual`,365))}),Ui={period:{min:1},annual:{label:`Bars per year`,min:1}},Wi=class extends B{descriptor={id:`volohlc`,name:`Volatility O-H-L-C`,placement:`panel`,defaultConfig:{period:10,annual:365},shortName:`Vol OHLC`,inputs:Ui,plots:[{key:`value`,title:`Volatility`,color:0}],scale:{min:0}};read(e){return Hi(e)}pointAt(e,t,{period:n,annual:r}){if(t<n-1)return null;let i=0;for(let r=t-n+1;r<=t;r++){let{open:t,high:n,low:a,close:o}=e[r];if(!(t>0&&n>0&&a>0&&o>0))return null;i+=.5*Math.log(n/a)**2-(2*Math.LN2-1)*Math.log(o/t)**2}return{value:100*Math.sqrt(Math.max(0,i/n*r))}}},Gi=class extends B{descriptor={id:`volzt`,name:`Volatility Zero Trend Close-to-Close`,placement:`panel`,defaultConfig:{period:10,annual:365},shortName:`Vol ZT`,inputs:Ui,plots:[{key:`value`,title:`Volatility`,color:0}],scale:{min:0}};read(e){return Hi(e)}pointAt(e,t,{period:n,annual:r}){if(t<n)return null;let i=0;for(let r=t-n+1;r<=t;r++){let t=e[r-1].close,n=e[r].close;if(!(t>0&&n>0))return null;i+=Math.log(n/t)**2}return{value:100*Math.sqrt(i/n*r)}}};function Ki(e){e.register(new zt),e.register(new Bt),e.register(new Vt),e.register(new Ht),e.register(new Ut),e.register(new Wt),e.register(new Gt),e.register(new Kt),e.register(new qt),e.register(new Xt),e.register(new Qt),e.register(new $t),e.register(new en),e.register(new tn),e.register(new an),e.register(new on),e.register(new sn),e.register(new cn),e.register(new un),e.register(new dn),e.register(new fn),e.register(new gn),e.register(new yn),e.register(new bn),e.register(new xn),e.register(new Sn),e.register(new Cn),e.register(new wn),e.register(new Tn),e.register(new En),e.register(new Dn),e.register(new On),e.register(new kn),e.register(new An),e.register(new jn),e.register(new _r),e.register(new vr),e.register(new yr),e.register(new br),e.register(new _n),e.register(new vn),e.register(new Mn),e.register(new Nn),e.register(new Pn),e.register(new Fn),e.register(new Ln),e.register(new Rn),e.register(new Bn),e.register(new Vn),e.register(new Wn),e.register(new Gn),e.register(new qn),e.register(new Jn),e.register(new Yn),e.register(new Xn),e.register(new Zn),e.register(new Qn),e.register(new $n),e.register(new tr),e.register(new nr),e.register(new rr),e.register(new ir),e.register(new ar),e.register(new or),e.register(new lr),e.register(new dr),e.register(new pr),e.register(new mr),e.register(new hr),e.register(new gr),e.register(new Fr),e.register(new Ir),e.register(new Lr),e.register(new Rr),e.register(new zr),e.register(new Br),e.register(new Ur),e.register(new Gr),e.register(new Kr),e.register(new Yr),e.register(new Xr),e.register(new Zr),e.register(new Qr),e.register(new $r),e.register(new ti),e.register(new ii),e.register(new ai),e.register(new oi),e.register(new si),e.register(new ci),e.register(new li),e.register(new ui),e.register(new di),e.register(new mi),e.register(new hi),e.register(new _i),e.register(new vi),e.register(new yi),e.register(new xi),e.register(new Ti),e.register(new ki),e.register(new Ai),e.register(new ji),e.register(new Mi),e.register(new Pi),e.register(new Fi),e.register(new Ri),e.register(new Bi),e.register(new Vi),e.register(new Wi),e.register(new Gi)}function qi(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`number`?t.type===`result`||t.type===`pong`||t.type===`error`:!1}var Ji=class{worker;fallbackPlugins;timeoutMs;nextRequestId=1;pending=new Map;messageHandler;constructor(e,t={}){this.worker=e,this.fallbackPlugins=t.fallbackPlugins??new Map,this.timeoutMs=t.timeoutMs??3e4,this.messageHandler=e=>this.handleMessage(e),this.worker&&(this.worker.addEventListener(`message`,this.messageHandler),this.worker.addEventListener(`error`,this.messageHandler))}hasWorker(){return this.worker!==null}registerFallbackPlugin(e){this.fallbackPlugins.set(e.descriptor.id,e)}async calculate(e,t,n){if(!this.worker){let r=this.fallbackPlugins.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);return r.calculate(n,t)}let r=this.nextRequestId++,i={type:`calculate`,requestId:r,indicatorId:e,config:t,data:n};return new Promise((t,n)=>{let a={resolve:t,reject:n,timer:null};this.timeoutMs>0&&(a.timer=setTimeout(()=>{this.pending.delete(r),n(Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`))},this.timeoutMs)),this.pending.set(r,a),this.worker.postMessage(i)})}ping(){if(!this.worker)return Promise.resolve();let e=this.nextRequestId++;return new Promise((t,n)=>{let r={resolve:()=>t(),reject:n,timer:this.timeoutMs>0?setTimeout(()=>{this.pending.delete(e),n(Error(`Indicator worker ping timeout`))},this.timeoutMs):null};this.pending.set(e,r),this.worker.postMessage({type:`ping`,requestId:e})})}terminate(){this.worker&&=(this.worker.removeEventListener(`message`,this.messageHandler),this.worker.removeEventListener(`error`,this.messageHandler),this.worker.terminate(),null);for(let e of this.pending.values())e.timer&&clearTimeout(e.timer),e.reject(Error(`Indicator worker terminated`));this.pending.clear()}handleMessage(e){let t=e.data;if(t!==void 0){if(!qi(t))return;this.dispatchResponse(t);return}let n=e.message??`Indicator worker error`;for(let[e,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(Error(n)),this.pending.delete(e)}dispatchResponse(e){let t=this.pending.get(e.requestId);if(t){if(this.pending.delete(e.requestId),t.timer&&clearTimeout(t.timer),e.type===`error`){t.reject(Error(e.message));return}if(e.type===`pong`){t.resolve(void 0);return}t.resolve(e.output)}}},Yi=e=>typeof e.params.symbol==`string`?e.params.symbol.trim():``,Xi=class extends B{descriptor={id:`compareSymbol`,name:`Compare Symbol`,placement:`overlay`,defaultConfig:{symbol:``},shortName:`Compare`,plots:[{key:`value`,title:`Close`,color:0}]};constructor(e){super(),this.store=e}read(e){return{symbol:Yi(e)}}pointAt(e,t,{symbol:n}){if(!n)return null;let r=this.store.closeAt(n,e[t].time);return r===void 0?null:{value:r}}},Zi=class extends B{descriptor={id:`spread`,name:`Spread / Ratio`,placement:`panel`,defaultConfig:{symbol:``,mode:`spread`},shortName:`Spread`,plots:[{key:`value`,title:`Spread`,color:0}],inputs:{mode:{options:[`spread`,`ratio`]}}};constructor(e){super(),this.store=e}read(e){return{symbol:Yi(e),ratio:e.params.mode===`ratio`}}pointAt(e,t,{symbol:n,ratio:r}){if(!n)return null;let i=this.store.closeAt(n,e[t].time);return i===void 0?null:r?i===0?null:{value:e[t].close/i}:{value:e[t].close-i}}},Qi=e=>{let t=Math.round(Number(e.params.length??20));return{symbol:Yi(e),length:Number.isFinite(t)?Math.max(2,t):20}};function $i(e,t){if(e.every(t=>t===e[0])||t.every(e=>e===t[0]))return null;let n=e.length,r=0,i=0;for(let a=0;a<n;a++)r+=e[a],i+=t[a];r/=n,i/=n;let a=0,o=0,s=0;for(let c=0;c<n;c++){let n=e[c]-r,l=t[c]-i;a+=n*l,o+=n*n,s+=l*l}return o>0&&s>0?Math.max(-1,Math.min(1,a/Math.sqrt(o*s))):null}var ea={placement:`panel`,defaultConfig:{symbol:``,length:20},inputs:{length:{min:2}},plots:[{key:`value`,title:`Correlation`,color:0}],scale:{min:-1,max:1},levels:[0]},ta=class extends B{descriptor={...ea,id:`correlation`,name:`Correlation Coefficient`,shortName:`Correlation`};constructor(e){super(),this.store=e}read(e){return Qi(e)}pointAt(e,t,{symbol:n,length:r}){if(!n||t<r-1)return null;let i=[],a=[];for(let o=t-r+1;o<=t;o++){let t=this.store.closeAt(n,e[o].time);if(t===void 0)return null;i.push(e[o].close),a.push(t)}let o=$i(i,a);return o===null?null:{value:o}}},na=class extends B{descriptor={...ea,id:`correlationlog`,name:`Correlation Log`,shortName:`Correlation Log`};constructor(e){super(),this.store=e}read(e){return Qi(e)}pointAt(e,t,{symbol:n,length:r}){if(!n||t<r)return null;let i=[],a=[],o=this.store.closeAt(n,e[t-r].time);for(let s=t-r+1;s<=t;s++){let t=this.store.closeAt(n,e[s].time),r=e[s-1].close,c=e[s].close;if(t===void 0||o===void 0||!(r>0&&c>0&&t>0&&o>0))return null;i.push(Math.log(c/r)),a.push(Math.log(t/o)),o=t}let s=$i(i,a);return s===null?null:{value:s}}},ra=e=>e<10?`0`+e:``+e,ia=class{tz=null;timeFormatter=null;setTimezoneOffset(e){this.tz=e}setTimeFormatter(e){this.timeFormatter=e}render(n,r,i,a,o){let{chartRect:s}=r,c=o??s.y+s.height;n.strokeStyle=i.style?.axis.time.line??i.axisLine,n.lineWidth=1,n.globalAlpha=.65,n.beginPath(),n.moveTo(s.x,c+.5),n.lineTo(s.x+s.width,c+.5),n.stroke(),n.globalAlpha=1;let l=r.barWidth+r.barSpacing,u=Math.max(1,Math.ceil(80/l)),d=-r.offset+s.x+r.barWidth/2,f=Math.floor(r.offset/l),p=Math.ceil((r.offset+s.width)/l),m=a.length>0?e.y(Math.min(p,a.length-1),a):Date.now(),h=(0,t.tzLabel)(this.tz,m>0xe8d4a51000?m:m*1e3),g=`500 ${i.font.sizeSmall-1}px ${i.font.family}`,_=s.x+s.width-4;n.font=g;let v=_-n.measureText(h).width-8;n.font=`500 ${i.font.sizeSmall}px ${i.font.family}`,n.textBaseline=`top`,n.textAlign=`center`,n.fillStyle=i.style?.axis.time.text??i.axisLabel;let y=(0,t.barsAreDaily)(a),b=-1;for(let r=f;r<=p&&a.length>0;r++){if(r%u!==0)continue;let i=r*l+d,o=e.y(r,a),s=o>0xe8d4a51000?o:o*1e3,f=(0,t.timeParts)(s,this.tz),{year:p,day:m,month:h,hours:g,minutes:_}=f,x;y??(0,t.isDateOnly)(f)?x=`date`:m===b?x=`time`:(x=`day`,b=m);let S=this.timeFormatter?this.timeFormatter(s,{kind:x,timeZone:this.tz}):x===`date`?`${h}/${m}/${p}`:x===`day`?`${h}/${m}`:`${ra(g)}:${ra(_)}`;i+n.measureText(S).width/2>v||n.fillText(S,i,c+7)}n.font=g,n.textAlign=`right`,n.textBaseline=`top`,n.globalAlpha=.75,n.fillStyle=i.textSecondary,n.fillText(h,_,c+7),n.globalAlpha=1}},aa=new Set,oa=null;function sa(){let e=typeof document<`u`?document.activeElement:null;return e instanceof Element&&e.closest(`[aria-modal="true"], [role="dialog"], [role="menu"]`)!==null}var ca=class{panHandler=null;zoomHandler=null;crosshairHandler=null;axisDragHandler=null;alertDragHandler=null;axisViewportGetter=null;onAxisDoubleClick=null;onDrawingDoubleClick=null;onDrawingContextMenu=null;zoomArea=!1;onChartContextMenu=null;priceAxisAdd=null;axisStrips=null;savedTouchAction=``;measureHandlers=null;measuring=!1;boxSelectHandlers=null;boxSelecting=!1;onAltClick=null;onEscape=null;onConfirm=null;onClick=null;markerAt=null;onMarkerHover=null;markerClickable=()=>!0;markerPos={x:0,y:0};hoveredMarker=null;downPos=null;downMoved=!1;pressForClick=!1;drawingManager=null;tradingManager=null;paneResizeHandler=null;viewportGetter=null;onOverlayDirty=null;boundHandlers=[];lastTouchDist=0;lastTouchMid={x:0,y:0};touchActive=!1;touchStartPos={x:0,y:0};longPressTimer=null;longPressMs=500;longPressMaxMove=8;cachedRect=null;constructor(e){this.element=e}setOverlayDirtyCallback(e){this.onOverlayDirty=e}setPanHandler(e){this.panHandler=e}setZoomHandler(e){this.zoomHandler=e}setCrosshairHandler(e){this.crosshairHandler=e}setAltClickHandler(e){this.onAltClick=e}setEscapeHandler(e){this.onEscape=e}setConfirmHandler(e){this.onConfirm=e}setSignalMarkerHitTest(e,t,n=()=>!0){this.markerAt=e,this.onMarkerHover=t,this.markerClickable=n,e||(this.hoveredMarker=null)}leaveMarker(){this.hoveredMarker!==null&&(this.hoveredMarker=null,this.onMarkerHover?.(null,this.markerPos))}setClickHandler(e){this.onClick=e}setBoxSelectHandlers(e){this.boxSelectHandlers=e}setMeasureHandlers(e){this.measureHandlers=e}setAxisDragHandler(e,t,n){this.axisDragHandler=e,this.axisViewportGetter=t,this.onAxisDoubleClick=n??null}setDrawingManager(e,t){this.drawingManager=e,this.viewportGetter=t}setChartContextMenu(e){this.onChartContextMenu=e}setPriceAxisAddButton(e,t){this.priceAxisAdd={button:e,onClick:t}}setZoomAreaMode(e){this.zoomArea=e}setDrawingContextMenu(e){this.onDrawingContextMenu=e}setDrawingDoubleClick(e){this.onDrawingDoubleClick=e}setAlertDragHandler(e){this.alertDragHandler=e}setTradingManager(e,t){this.tradingManager=e,this.viewportGetter=t}setAxisStrips(e){this.axisStrips=e}setPaneResizeHandler(e){this.paneResizeHandler=e}attach(){let e=()=>this.viewportGetter?.()??null;aa.add(this.element),this.savedTouchAction=this.element.style.getPropertyValue(`touch-action`),this.element.style.setProperty(`touch-action`,`none`);let t=e=>{let t=this.axisStrips?.()??null,n=t?.plot??this.axisViewportGetter?.()?.chartRect;if(!n)return null;let r=this.axisDragHandler!==null;if(e.y>(t?.timeAxisTop??n.y+n.height))return r?`time`:null;let i=e.y>=n.y&&e.y<=n.y+n.height;if(e.x>n.x+n.width)return i?r?`price`:null:`inert`;let a=t?.left;return a&&a.width>0&&e.x<n.x&&e.x>=n.x-a.width?i&&a.scales&&r?`price`:`inert`:null},n=e=>{let t=this.axisStrips?.()??null,n=t?.plot??this.axisViewportGetter?.()?.chartRect;if(!n)return`plot`;if(e.y>(t?.timeAxisTop??n.y+n.height))return`timeAxis`;let r=e.y>=n.y&&e.y<=n.y+n.height,i=t?.left,a=!!i&&i.width>0&&e.x<n.x&&e.x>=n.x-i.width;return e.x>n.x+n.width||a?r?`priceAxis`:`pane`:r?`plot`:`pane`},r=e=>{let t=(this.viewportGetter?.()??this.axisViewportGetter?.())?.chartRect;return t?{x:Math.max(t.x,Math.min(t.x+t.width,e.x)),y:Math.max(t.y,Math.min(t.y+t.height,e.y))}:e},i=()=>this.zoomArea?`zoom-in`:this.crosshairHandler&&this.crosshairHandler.getMode()!==`hidden`?`crosshair`:``,a=e=>{this.element.style.cursor!==e&&(this.element.style.cursor=e)},o=n=>{let r=t(n);if(r===`price`)return`ns-resize`;if(r===`time`)return`ew-resize`;if(r===`inert`)return`default`;let a=this.paneResizeHandler?.cursorAt(n);if(a)return a;if(this.alertDragHandler?.isOverAlert(n))return`ns-resize`;let o=e();return this.tradingManager?.isOverButton(n)?`pointer`:o&&this.tradingManager?.isOverDraggableLine(n,o)?`ns-resize`:this.zoomArea?`zoom-in`:(o?this.drawingManager?.hoverCursorAt(n,o):null)||(o&&this.priceAxisAdd?.button.hit(n,o)?`pointer`:i())},s=!1,c=``,l=e=>{if(!(e.buttons&1)){g(e);return}h(e)},u=()=>{s||(s=!0,this.leaveMarker(),c=document.documentElement.style.userSelect,document.documentElement.style.userSelect=`none`,document.addEventListener(`mousemove`,l))},d=()=>{s&&(s=!1,document.documentElement.style.userSelect=c,document.removeEventListener(`mousemove`,l))},f=e=>e===this.element||e instanceof HTMLCanvasElement,p=n=>{if(oa=this.element,n.button!==0||!f(n.target))return;this.panHandler?.cancelMomentum(),u(),this.invalidateRect();let r=this.getMousePos(n),o=e();this.downPos=r,this.downMoved=!1,this.pressForClick=!1;let s=t(r);if(s===`inert`)return;if(s&&this.axisDragHandler){this.axisDragHandler.begin(s,r);return}if(this.paneResizeHandler?.tryBegin(r))return;let c=!!this.drawingManager?.getActiveTool()||!!this.tradingManager?.isBracketActive()||!!this.tradingManager?.isOrderDraftActive();if(this.boxSelectHandlers&&(this.zoomArea||(n.ctrlKey||n.metaKey)&&!c)){this.boxSelecting=!0,this.boxSelectHandlers.begin(r),a(i()),this.onOverlayDirty?.(!0);return}if(n.shiftKey&&this.measureHandlers){this.measuring=!0,this.measureHandlers.begin(r),this.onOverlayDirty?.(!0);return}if(n.altKey&&this.onAltClick){this.onAltClick(r);return}if(this.priceAxisAdd&&o&&!c&&this.priceAxisAdd.button.hit(r,o)&&!this.alertDragHandler?.isOverAlert(r)&&!this.tradingManager?.isOverButton(r)&&!this.tradingManager?.isOverDraggableLine(r,o)&&!this.drawingManager?.hoverCursorAt(r,o)){n.preventDefault(),this.priceAxisAdd.onClick(r);return}if(this.tradingManager&&o&&this.tradingManager.onPointerDown(r,o)){a(this.tradingManager.isOverButton(r)?`pointer`:`ns-resize`);return}if(this.drawingManager&&o&&this.drawingManager.onPointerDown(r,o)){this.drawingManager.isDragging()&&a(`grabbing`);return}if(this.alertDragHandler?.tryBegin(r)){this.onOverlayDirty?.();return}this.pressForClick=!0,this.panHandler&&(this.panHandler.onPointerDown(r),a(`grabbing`))},m=e=>{if(!s){if(!f(e.target)){this.leaveMarker();return}h(e)}},h=t=>{let n=this.getMousePos(t),i=e();if(this.downPos&&!this.downMoved){let e=n.x-this.downPos.x,t=n.y-this.downPos.y;e*e+t*t>16&&(this.downMoved=!0)}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n);return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n);return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.move(r(n)),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measureHandlers.move(n),this.onOverlayDirty?.(!0);return}if(this.boxSelecting&&this.boxSelectHandlers){this.boxSelectHandlers.move(n),this.onOverlayDirty?.(!0);return}if(!s){let e=this.markerAt?.(n)??null;e!==this.hoveredMarker&&(this.hoveredMarker=e,this.onMarkerHover?.(e,n)),e&&(this.markerPos=n),a(e&&this.markerClickable()?`pointer`:o(n))}if(this.tradingManager&&i&&this.tradingManager.onPointerMove(s?r(n):n,i)){this.crosshairHandler?.onPointerMove(n),this.onOverlayDirty?.();return}if(this.drawingManager&&i&&this.drawingManager.onPointerMove(n,i)){this.crosshairHandler?.onPointerMove(n),this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n),this.onOverlayDirty?.(!s)},g=e=>{if(!(e.button!==0&&e.type===`mouseup`)&&s){if(d(),a(o(this.getMousePos(e))),this.boxSelecting&&this.boxSelectHandlers){this.boxSelecting=!1,this.boxSelectHandlers.end(),this.onOverlayDirty?.(!0);return}if(this.axisDragHandler?.isActive()){this.axisDragHandler.end();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.end();return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.end(),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measuring=!1,this.measureHandlers.end(),this.onOverlayDirty?.(!0);return}this.tradingManager?.onPointerUp(this.getMousePos(e))||this.drawingManager?.onPointerUp()||(this.panHandler?.onPointerUp(),this.pressForClick&&!this.downMoved&&this.downPos&&this.onClick&&this.onClick(this.downPos),this.pressForClick=!1,this.downPos=null)}},_=n=>{let r=this.getMousePos(n),i=t(r);if(i){i!==`inert`&&this.onAxisDoubleClick?.(i);return}let a=e();if(!a||this.drawingManager?.justFinished())return;let o=this.drawingManager?.drawingAt(r,a);o&&this.onDrawingDoubleClick?.(o)},v=()=>{if(this.leaveMarker(),s){this.crosshairHandler?.onPointerLeave(),this.onOverlayDirty?.(!0);return}a(``),this.panHandler?.onPointerUp(),this.drawingManager?.onPointerUp(),this.tradingManager?.onPointerUp(),this.alertDragHandler?.end(),this.paneResizeHandler?.end(),this.crosshairHandler?.onPointerLeave(),this.pressForClick=!1,this.downPos=null,this.onOverlayDirty?.()},y=e=>{e.preventDefault();let t=this.getMousePos(e);this.zoomHandler?.onWheel(e.deltaY,t)},b=e=>{if(!sa()){if(e.key===`Escape`&&this.boxSelecting&&this.boxSelectHandlers&&(this.boxSelecting=!1,this.boxSelectHandlers.cancel(),this.onOverlayDirty?.(!0)),e.key===`Escape`&&this.onEscape&&this.onEscape(),e.key===`Enter`&&this.onConfirm&&this.onConfirm()){e.preventDefault();return}e.key!==`Escape`&&!this.ownsShortcuts()||this.drawingManager?.onKeyDown(e.key,e.ctrlKey||e.metaKey,e.shiftKey)&&e.preventDefault()}},x=t=>{let r=e();if(!r)return;let i=this.getMousePos(t),a=r.chartRect,o=i.x>=a.x&&i.x<=a.x+a.width&&i.y>=a.y&&i.y<=a.y+a.height,s=this.onDrawingContextMenu&&o&&!this.drawingManager?.getActiveTool()?this.drawingManager?.drawingAt(i,r):null;if(s){t.preventDefault(),this.onDrawingContextMenu?.(s,i);return}if(this.tradingManager?.onContextMenu(i,r)){t.preventDefault();return}this.onChartContextMenu?.(n(i),i)&&t.preventDefault()},S=n=>{if(oa=this.element,!(!this.touchActive&&!f(n.target)))if(n.preventDefault(),this.invalidateRect(),n.touches.length===1){let r=this.getTouchPos(n.touches[0]);this.touchStartPos=r;let i=t(r);if(i===`inert`){this.touchActive=!0;return}if(i&&this.axisDragHandler){this.axisDragHandler.begin(i,r),this.touchActive=!0;return}if(this.paneResizeHandler?.tryBegin(r)){this.touchActive=!0;return}let a=e();if(this.tradingManager&&a&&this.tradingManager.onPointerDown(r,a)){this.touchActive=!0,this.onOverlayDirty?.();return}this.onAltClick&&(this.clearLongPress(),this.longPressTimer=setTimeout(()=>{this.longPressTimer=null,this.onAltClick?.(r),this.panHandler?.onPointerUp(),this.onOverlayDirty?.(!0)},this.longPressMs)),this.panHandler?.onPointerDown(r),this.crosshairHandler?.onPointerMove(r),this.touchActive=!0}else n.touches.length===2&&(this.clearLongPress(),this.panHandler?.onPointerUp(),this.lastTouchDist=this.getTouchDistance(n.touches[0],n.touches[1]),this.lastTouchMid=this.getTouchMidpoint(n.touches[0],n.touches[1]),this.touchActive=!0)},C=t=>{if(!(!this.touchActive&&!f(t.target))){if(t.preventDefault(),t.touches.length===1&&this.touchActive){let n=this.getTouchPos(t.touches[0]);if(this.longPressTimer){let e=n.x-this.touchStartPos.x,t=n.y-this.touchStartPos.y;Math.hypot(e,t)>this.longPressMaxMove&&this.clearLongPress()}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n),this.onOverlayDirty?.();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n),this.onOverlayDirty?.();return}let r=e();if(this.tradingManager&&r&&this.tradingManager.onPointerMove(n,r)){this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n)}else if(t.touches.length===2){let e=this.getTouchDistance(t.touches[0],t.touches[1]),n=this.getTouchMidpoint(t.touches[0],t.touches[1]);this.lastTouchDist>0&&e>0&&this.zoomHandler?.onPinch(e/this.lastTouchDist,n);let r=this.lastTouchMid.x-n.x;Math.abs(r)>1&&(this.panHandler?.onPointerDown(this.lastTouchMid),this.panHandler?.onPointerMove({x:n.x,y:this.lastTouchMid.y})),this.lastTouchDist=e,this.lastTouchMid=n}this.onOverlayDirty?.()}},w=e=>{if(this.clearLongPress(),e.touches.length===0){this.axisDragHandler?.isActive()&&this.axisDragHandler.end(),this.paneResizeHandler?.end();let t=e.changedTouches[0];this.tradingManager?.onPointerUp(t?this.getTouchPos(t):void 0),this.panHandler?.onPointerUp(),this.crosshairHandler?.onPointerLeave(),this.touchActive=!1,this.lastTouchDist=0}else if(e.touches.length===1){let t=this.getTouchPos(e.touches[0]);this.panHandler?.onPointerDown(t)}},T=()=>this.invalidateRect(),E=()=>this.invalidateRect(),D=()=>this.invalidateRect(),O=e=>{let t=e.target instanceof Node&&this.element.contains(e.target)&&f(e.target);(s||t)&&e.preventDefault()};this.element.addEventListener(`mousedown`,p),this.element.addEventListener(`mousemove`,m),document.addEventListener(`dragstart`,O,!0),document.addEventListener(`mouseup`,g),this.element.addEventListener(`mouseleave`,v),this.element.addEventListener(`dblclick`,_),this.element.addEventListener(`wheel`,y,{passive:!1}),this.element.addEventListener(`contextmenu`,x),this.element.addEventListener(`touchstart`,S,{passive:!1}),this.element.addEventListener(`touchmove`,C,{passive:!1}),this.element.addEventListener(`touchend`,w),document.addEventListener(`keydown`,b),window.addEventListener(`resize`,T),document.addEventListener(`scroll`,E,{capture:!0,passive:!0}),this.element.addEventListener(`mouseenter`,D),this.boundHandlers.push(d,()=>this.element.removeEventListener(`mousedown`,p),()=>document.removeEventListener(`dragstart`,O,!0),()=>this.element.removeEventListener(`mousemove`,m),()=>document.removeEventListener(`mouseup`,g),()=>this.element.removeEventListener(`mouseleave`,v),()=>this.element.removeEventListener(`dblclick`,_),()=>this.element.removeEventListener(`wheel`,y),()=>this.element.removeEventListener(`contextmenu`,x),()=>this.element.removeEventListener(`touchstart`,S),()=>this.element.removeEventListener(`touchmove`,C),()=>this.element.removeEventListener(`touchend`,w),()=>document.removeEventListener(`keydown`,b),()=>window.removeEventListener(`resize`,T),()=>document.removeEventListener(`scroll`,E,{capture:!0}),()=>this.element.removeEventListener(`mouseenter`,D))}detach(){aa.delete(this.element),this.savedTouchAction?this.element.style.setProperty(`touch-action`,this.savedTouchAction):this.element.style.removeProperty(`touch-action`),oa===this.element&&(oa=null);for(let e of this.boundHandlers)e();this.boundHandlers=[],this.cachedRect=null,this.clearLongPress()}clearLongPress(){this.longPressTimer&&=(clearTimeout(this.longPressTimer),null)}invalidateRect(){this.cachedRect=null}getRect(){return this.cachedRect||=this.element.getBoundingClientRect(),this.cachedRect}ownsShortcuts(){let e=document.activeElement;if(e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable))return!1;for(let t of aa)if(e&&t.contains(e))return t===this.element;return oa===null||oa===this.element}getMousePos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchPos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchDistance(e,t){return Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY)}getTouchMidpoint(e,t){let n=this.getRect();return{x:(e.clientX+t.clientX)/2-n.left,y:(e.clientY+t.clientY)/2-n.top}}},la=16,ua=3,da=class{enabled=!1;setEnabled(e){this.enabled=e}isEnabled(){return this.enabled}hit(e,t){if(!this.enabled)return!1;let{x:n,y:r,width:i,height:a}=t.chartRect,o=n+i-la-ua;return e.x>=o&&e.x<=n+i&&e.y>=r&&e.y<=r+a}render(e,t,n,r){if(!this.enabled||!r)return;let{x:i,y:a,width:o,height:s}=t.chartRect;if(r.y<a||r.y>a+s||r.x<i||r.x>i+o)return;let c=i+o-ua-la/2,l=la/2;e.fillStyle=n.background,e.strokeStyle=n.axisLabelBackground,e.lineWidth=1,e.beginPath(),e.arc(c,r.y,l-.5,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle=n.text,e.lineWidth=1.5,e.beginPath(),e.moveTo(c-l*.45,r.y),e.lineTo(c+l*.45,r.y),e.moveTo(c,r.y-l*.45),e.lineTo(c,r.y+l*.45),e.stroke()}},fa=100,pa=50,ma=.1,ha=60,ga=16,_a=class{dragging=!1;lastX=0;lastY=0;samples=[];momentumId=0;callback;onStart;friction=.92;constructor(e,t){this.callback=e,this.onStart=t}isDragging(){return this.dragging}onPointerDown(e){this.dragging=!0,this.lastX=e.x,this.lastY=e.y,this.samples=[{t:Date.now(),x:e.x,y:e.y}],this.stopMomentum(),this.onStart?.()}onPointerMove(e){if(!this.dragging)return;let t=this.lastX-e.x,n=this.lastY-e.y;this.lastX=e.x,this.lastY=e.y;let r=Date.now();for(this.samples.push({t:r,x:e.x,y:e.y});this.samples.length>2&&r-this.samples[1].t>fa;)this.samples.shift();(t||n)&&this.callback(t,n)}onPointerUp(){if(!this.dragging)return;this.dragging=!1;let e=this.releaseVelocity(Date.now());this.samples=[],e&&Math.hypot(e.x,e.y)>ma&&this.startMomentum(e.x,e.y)}cancelMomentum(){this.stopMomentum()}releaseVelocity(e){let t=this.samples[this.samples.length-1];if(!t||e-t.t>pa)return null;let n=this.samples.find(e=>t.t-e.t<=fa)??this.samples[0],r=t.t-n.t;return r<=0?null:{x:(n.x-t.x)/r,y:(n.y-t.y)/r}}startMomentum(e,t){this.stopMomentum();let n=e*ga,r=t*ga,i=Math.hypot(n,r);i>ha&&(n*=ha/i,r*=ha/i);let a=()=>{if(n*=this.friction,r*=this.friction,Math.hypot(n,r)<.5){this.momentumId=0;return}this.callback(n,r),this.momentumId=requestAnimationFrame(a)};this.momentumId=requestAnimationFrame(a)}stopMomentum(){this.momentumId&&=(cancelAnimationFrame(this.momentumId),0)}},va=class{callback;sensitivity;pendingDelta=0;pendingScale=1;pendingCenterX=0;rafId=0;constructor(e,t=.001){this.callback=e,this.sensitivity=t}onWheel(e,t){this.pendingDelta+=-e*this.sensitivity,this.pendingCenterX=t.x,this.schedule()}onPinch(e,t){!(e>0)||!Number.isFinite(e)||(this.pendingScale*=e,this.pendingCenterX=t.x,this.schedule())}schedule(){this.rafId||=requestAnimationFrame(()=>{this.rafId=0;let e=(1+this.pendingDelta)*this.pendingScale-1,t=this.pendingCenterX;this.pendingDelta=0,this.pendingScale=1,this.callback(e,t)})}dispose(){this.rafId&&=(cancelAnimationFrame(this.rafId),0)}},ya=class{dragging=!1;axis=null;startPos={x:0,y:0};lastPos={x:0,y:0};moved=!1;threshold=3;sensitivity=.005;constructor(e,t){this.onPriceScale=e,this.onTimeScale=t}begin(e,t){this.dragging=!0,this.axis=e,this.startPos=t,this.lastPos=t,this.moved=!1}move(e){if(!this.dragging||!this.axis)return!1;let t=e.x-this.startPos.x,n=e.y-this.startPos.y;if(!this.moved&&Math.hypot(t,n)<this.threshold)return!1;if(this.moved=!0,this.axis===`price`){let t=e.y-this.lastPos.y,n=Math.exp(t*this.sensitivity);this.onPriceScale(n)}else{let t=e.x-this.lastPos.x,n=Math.exp(t*this.sensitivity);this.onTimeScale(n)}return this.lastPos=e,!0}end(){let e=this.dragging&&this.moved;return this.dragging=!1,this.axis=null,this.moved=!1,e}isActive(){return this.dragging}},ba=class{draggingId=null;constructor(e,t){this.alerts=e,this.viewportGetter=t}isOverAlert(e){let t=this.viewportGetter();return t?this.alerts.getAlertAtPoint(e,t)!==null:!1}tryBegin(e){let t=this.viewportGetter();if(!t)return!1;let n=this.alerts.getAlertAtPoint(e,t);return n?(this.draggingId=n.id,!0):!1}move(t){if(this.draggingId===null)return;let n=this.viewportGetter();n&&this.alerts.updateAlertPrice(this.draggingId,e.j(t.y,n))}end(){this.draggingId=null}isActive(){return this.draggingId!==null}},xa=class{state=null;layoutGetter=null;onResize=null;constructor(e=4){this.tolerance=e}configure(e,t){this.layoutGetter=e,this.onResize=t}hitTest(e,t){for(let n of t.dividers)if(Sa(e,n.rect,this.tolerance)){let e=t.panels.find(e=>e.config.id===n.panelId);if(e)return{panelId:n.panelId,orientation:n.orientation,position:e.config.position,size:n.orientation===`horizontal`?e.rect.height:e.rect.width}}return null}cursorAt(e){let t=this.layoutGetter?.();if(!t)return null;let n=this.hitTest(e,t);return n?n.orientation===`horizontal`?`ns-resize`:`ew-resize`:null}tryBegin(e){let t=this.layoutGetter?.();if(!t)return!1;let n=this.hitTest(e,t);return n?(this.state={panelId:n.panelId,position:n.position,startSize:n.size,startPos:e},!0):!1}move(e){let t=this.computeSize(e);t&&this.onResize?.(t.panelId,t.size)}computeSize(e){let t=this.state;if(!t)return null;let n=0;switch(t.position){case`bottom`:n=t.startPos.y-e.y;break;case`top`:n=e.y-t.startPos.y;break;case`left`:n=e.x-t.startPos.x;break;case`right`:n=t.startPos.x-e.x;break}return{panelId:t.panelId,size:t.startSize+n}}end(){this.state=null}isActive(){return this.state!==null}};function Sa(e,t,n){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var Ca=class{position=null;callback=null;data=[];tz=null;timeFormatter=null;setTimeFormatter(e){this.timeFormatter=e}setTimezoneOffset(e){this.tz=e}magnetMode=!0;mode=`magnet`;pricePrecision=null;locale=`en-US`;syncedSlot=null;pendingBarIndex=null;pendingPoint=null;callbackScheduled=!1;lastCallbackBarIndex=-1;reportTop=null;reportBottom=null;setCallback(e){this.callback=e}setData(e){this.data=e}setMagnetMode(e){this.magnetMode=e,this.mode=e?`magnet`:`normal`}setMode(e){this.mode=e,this.magnetMode=e===`magnet`}getMode(){return this.mode}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}getPosition(){return this.position}setSyncedSlot(e){this.syncedSlot=e!==null&&Number.isFinite(e)?e:null}getSyncedSlot(){return this.syncedSlot}setReportBounds(e){this.reportTop=e?.top??null,this.reportBottom=e?.bottom??null}onPointerMove(e){this.position=e}onPointerLeave(){this.position=null,this.pendingBarIndex=null,this.pendingPoint=null,this.lastCallbackBarIndex=-1,this.flushCallback(null,null)}render(n,r,i){if(this.mode===`hidden`)return;if(!this.position){this.syncedSlot!==null&&this.renderSynced(n,r,i,this.syncedSlot);return}let{chartRect:a}=r,{x:o,y:s}=this.position;if(o<a.x||o>a.x+a.width)return;let c=a.y+a.height;if(s<Math.min(this.reportTop??a.y,a.y)||s>Math.max(this.reportBottom??c,c))return;let l=s>=a.y&&s<=c,u=e.k(o,r),d=Math.max(0,Math.min(this.data.length-1,u)),f=u>=0&&u<this.data.length;if(this.magnetMode&&(o=e.b(u,r)),d!==this.lastCallbackBarIndex&&(this.pendingBarIndex=d,this.pendingPoint={x:o,y:s},this.lastCallbackBarIndex=d,this.scheduleCallback()),!l)return;let p=T(i);this.magnetMode&&f&&Ta(n,o,r,p.vertical.color),Ea(n,o,a,p.vertical);let m=p.horizontal;if(m.visible){n.setLineDash((0,t.lineDash)(m.style,wa,m.width)),n.strokeStyle=m.color;let r=e._(n,s,m.width);n.lineWidth=r.width,n.beginPath(),n.moveTo(a.x,r.y),n.lineTo(a.x+a.width,r.y),n.stroke()}n.setLineDash([])}renderAxisLabels(n,r,i,a,s){if(this.mode===`hidden`)return;if(!this.position){this.syncedSlot!==null&&this.renderSyncedTimeLabel(n,r,i,a,this.syncedSlot,s);return}let{chartRect:c}=r,{x:l,y:u}=this.position;if(l<c.x||l>c.x+c.width||u<c.y||u>c.y+c.height)return;let d=e.k(l,r);this.magnetMode&&(l=e.b(d,r));let f=`600 ${i.font.sizeSmall}px ${i.font.family}`;Da(n,{text:o(e.j(u,r),r,this.pricePrecision??(0,t.autoPricePrecision)(r.priceRange.min,r.priceRange.max),this.locale),anchorX:c.x+c.width,anchorY:u,orientation:`right`,bg:T(i).labelBackground,fg:T(i).labelText,theme:i,font:f}),this.drawTimePill(n,r,i,a,d,l,s)}renderSynced(t,n,r,i){let a=e.b(i,n),{chartRect:o}=n;if(a<o.x||a>o.x+o.width)return;let s=T(r);this.magnetMode&&i>=0&&i<this.data.length&&Ta(t,a,n,s.vertical.color),Ea(t,a,o,s.vertical)}renderSyncedTimeLabel(t,n,r,i,a,o){let s=e.b(a,n),{chartRect:c}=n;s<c.x||s>c.x+c.width||this.drawTimePill(t,n,r,i,a,s,o)}drawTimePill(n,r,i,a,o,s,c){if(a.length===0)return;let l=e.y(o,a);Da(n,{text:this.timeFormatter?this.timeFormatter(l>0xe8d4a51000?l:l*1e3,{kind:`crosshair`,timeZone:this.tz}):Oa(l,this.tz,(0,t.barsAreDaily)(a)),anchorX:s,anchorY:c??r.chartRect.y+r.chartRect.height,orientation:`bottom`,bg:T(i).labelBackground,fg:T(i).labelText,theme:i,font:`600 ${i.font.sizeSmall}px ${i.font.family}`})}scheduleCallback(){this.callbackScheduled||(this.callbackScheduled=!0,queueMicrotask(()=>{this.callbackScheduled=!1,this.flushCallback(this.pendingBarIndex,this.pendingPoint)}))}flushCallback(e,t){this.callback?.(e,t)}},wa=[4,4];function Ta(e,t,n,r){let i=n.barWidth+n.barSpacing;e.fillStyle=r,e.globalAlpha=.08,e.fillRect(t-i/2,n.chartRect.y,i,n.chartRect.height),e.globalAlpha=1}function Ea(n,r,i,a){if(!a.visible)return;n.setLineDash((0,t.lineDash)(a.style,wa,a.width)),n.strokeStyle=a.color;let o=e.g(n,r,a.width);n.lineWidth=o.width,n.beginPath(),n.moveTo(o.x,i.y),n.lineTo(o.x,i.y+i.height),n.stroke(),n.setLineDash([])}function Da(e,t){e.save(),e.font=t.font;let n=Math.ceil(e.measureText(t.text).width)+16;if(e.fillStyle=t.bg,e.textBaseline=`middle`,t.orientation===`right`){let r=t.anchorX+5;p(e,r,t.anchorY-20/2,n,20,t.theme),e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(r+2,t.anchorY-5),e.lineTo(r+2,t.anchorY+5),e.closePath(),e.fill(),e.fillStyle=t.fg,e.textAlign=`left`,e.fillText(t.text,r+8,t.anchorY)}else{let r=t.anchorX-n/2,i=t.anchorY+5;p(e,r,i,n,20,t.theme),e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(t.anchorX-5,i+1),e.lineTo(t.anchorX+5,i+1),e.closePath(),e.fill(),e.fillStyle=t.fg,e.textAlign=`center`,e.fillText(t.text,t.anchorX,i+20/2)}e.restore()}function Oa(e,n,r){let i=(0,t.timeParts)(e>0xe8d4a51000?e:e*1e3,n),{year:a,month:o,day:s,hours:c,minutes:l}=i;return r??(0,t.isDateOnly)(i)?`${o}/${s}/${a}`:`${o}/${s} ${c<10?`0`+c:c}:${l<10?`0`+l:l}`}var ka=class{callbacks;enabled=!0;constructor(e){this.callbacks=e}setEnabled(e){this.enabled=e}handleKey(e){if(!this.enabled)return!1;let t=e.shiftKey?10:1;switch(e.key){case`ArrowLeft`:return this.callbacks.scrollBars(-t),!0;case`ArrowRight`:return this.callbacks.scrollBars(t),!0;case`ArrowUp`:case`+`:case`=`:return this.callbacks.zoom(.1),!0;case`ArrowDown`:case`-`:return this.callbacks.zoom(-.1),!0;case`Home`:return this.callbacks.goToStart(),!0;case`End`:return this.callbacks.goToEnd(),!0;case` `:return this.callbacks.fitContent(),!0;default:return!1}}},Aa=16,ja=80,Ma=864e5,Na={month:`short`,day:`numeric`},Pa={month:`short`,day:`numeric`,year:`numeric`};function Fa(e,n,r,i){return(0,t.zonedDateFormatter)(r,i?Pa:Na,n)(e)}var Ia=e=>e<10?`0${e}`:`${e}`;function La(e,n,r,i=`en-US`){let a=(0,t.normalizeBarTime)(e),o=(0,t.timeParts)(a,n);if(r!==void 0&&r>0?r>=Ma:(0,t.isDateOnly)(o))return Fa(a,n,i,!0);let s=Fa(a,n,i,!1),c=`${Ia(o.hours)}:${Ia(o.minutes)}`;return r!==void 0&&r>0&&r<6e4?`${s} · ${c}:${Ia(new Date(a).getUTCSeconds())}`:`${s} · ${c}`}function Ra(e,n){return Number.isFinite(e)?e>=1e9?`${(0,t.formatPrice)(e/1e9,2,n)}B`:e>=1e6?`${(0,t.formatPrice)(e/1e6,2,n)}M`:e>=1e3?`${(0,t.formatPrice)(e/1e3,1,n)}K`:(0,t.formatPrice)(e,e%1==0?0:2,n):`—`}var za=class{el=null;visible=!1;appliedTheme=null;locale=`en-US`;pricePrecision=null;tz=null;priceFormatter=null;timeFormatter=null;dirEl;timeEl;changeEl;valueEls;labelEls=[];dividerEl;width=176;height=112;create(e){if(this.el)return;let t=document.createElement(`div`);t.setAttribute(`aria-hidden`,`true`),Object.assign(t.style,{position:`absolute`,left:`0`,top:`0`,display:`none`,minWidth:`168px`,padding:`8px 10px 9px`,borderRadius:`var(--tcw-tooltip-radius, 8px)`,fontSize:`11.5px`,lineHeight:`1.45`,fontVariantNumeric:`tabular-nums`,pointerEvents:`none`,zIndex:`100`,whiteSpace:`nowrap`,willChange:`transform`,contain:`layout paint`,backdropFilter:`blur(10px)`});let n=V({display:`flex`,alignItems:`center`,gap:`7px`,marginBottom:`6px`});this.dirEl=V({width:`3px`,height:`12px`,borderRadius:`2px`,flex:`none`}),this.timeEl=V({flex:`1`,fontSize:`11px`,letterSpacing:`0.01em`}),this.changeEl=V({padding:`1px 6px`,borderRadius:`999px`,fontSize:`10.5px`,fontWeight:`600`}),n.append(this.dirEl,this.timeEl,this.changeEl);let r=V({display:`grid`,gridTemplateColumns:`auto 1fr auto 1fr`,columnGap:`8px`,rowGap:`1px`,alignItems:`baseline`}),i=e=>{let t=V({fontSize:`10px`,letterSpacing:`0.04em`});t.textContent=e,this.labelEls.push(t);let n=V({textAlign:`right`,fontWeight:`500`});return r.append(t,n),n},a=i(`O`),o=i(`H`),s=i(`L`),c=i(`C`);this.dividerEl=V({height:`1px`,margin:`6px 0 5px`});let l=V({display:`flex`,justifyContent:`space-between`,gap:`12px`}),u=V({fontSize:`10px`,letterSpacing:`0.04em`});u.textContent=`VOL`,this.labelEls.push(u);let d=V({fontWeight:`500`});l.append(u,d),this.valueEls={open:a,high:o,low:s,close:c,volume:d},t.append(n,r,this.dividerEl,l),e.appendChild(t),this.el=t}setLocale(e){this.locale=e}setPricePrecision(e){this.pricePrecision=e}setTimezoneOffset(e){this.tz=e}setPriceFormatter(e){this.priceFormatter=e}setTimeFormatter(e){this.timeFormatter=e}show(e,n,r,i,a={}){let o=this.el;if(!o)return;this.appliedTheme!==r&&this.applyTheme(r);let s=this.pricePrecision??(a.priceRange?(0,t.autoPricePrecision)(a.priceRange.min,a.priceRange.max):(0,t.autoPricePrecision)(n.low,n.high)),c=e=>this.priceFormatter?.(e)??(0,t.formatPrice)(e,s,this.locale),l=a.prevClose??n.open,u=n.close-l,d=l===0?0:u/l*100,f=u>=0,p=f?r.candleUp:r.candleDown,m=f?`+`:`−`;this.timeEl.textContent=this.timeFormatter?this.timeFormatter((0,t.normalizeBarTime)(n.time),{kind:`crosshair`,timeZone:this.tz}):La(n.time,this.tz,a.barStepMs,this.locale),this.changeEl.textContent=`${m}${(0,t.formatPrice)(Math.abs(d),2,this.locale)}%`,this.changeEl.style.color=p,this.changeEl.style.background=Ha(p,.14),this.dirEl.style.background=n.close>=n.open?r.candleUp:r.candleDown,this.valueEls.open.textContent=c(n.open),this.valueEls.high.textContent=c(n.high),this.valueEls.low.textContent=c(n.low),this.valueEls.close.textContent=c(n.close),this.valueEls.close.style.color=n.close>=n.open?r.candleUp:r.candleDown,this.valueEls.volume.textContent=Ra(n.volume,this.locale),this.visible||=(o.style.display=`block`,!0),this.width=o.offsetWidth||this.width,this.height=o.offsetHeight||this.height;let h=a.plot??{x:0,y:0,width:i.width-ja,height:i.height},g=h.x+h.width,_=h.y+h.height,v=e.x+Aa,y=e.y-this.height/2;v+this.width>g-4&&(v=e.x-this.width-Aa),v<h.x+4&&(v=h.x+4),y+this.height>_-4&&(y=_-this.height-4),y<h.y+4&&(y=h.y+4),o.style.transform=`translate(${Math.round(v)}px, ${Math.round(y)}px)`}hide(){this.el&&this.visible&&(this.el.style.display=`none`,this.visible=!1)}isVisible(){return this.visible}destroy(){this.el?.remove(),this.el=null,this.visible=!1,this.appliedTheme=null,this.labelEls=[]}applyTheme(e){let t=this.el,n=Ba(e.background);t.style.background=Ha(e.background,n?.9:.94),t.style.border=`1px solid ${e.axisLine}`,t.style.boxShadow=n?`0 12px 32px -8px rgba(0, 0, 0, 0.6), 0 2px 6px rgba(0, 0, 0, 0.35)`:`0 12px 32px -10px rgba(15, 19, 26, 0.22), 0 2px 6px rgba(15, 19, 26, 0.08)`,t.style.color=e.text,t.style.fontFamily=e.font.family,this.timeEl.style.color=e.textSecondary;for(let t of this.labelEls)t.style.color=e.textSecondary;this.dividerEl.style.background=e.axisLine,this.appliedTheme=e}};function V(e){let t=document.createElement(`div`);return Object.assign(t.style,e),t}function Ba(e){let t=Va(e);return t?(.299*t[0]+.587*t[1]+.114*t[2])/255<.5:!0}function Va(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6);return[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]}let t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function Ha(e,t){let n=Va(e);return n?`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t})`:`color-mix(in srgb, ${e} ${Math.round(t*100)}%, transparent)`}var Ua=class{el=null;deltaEl=null;timeEl=null;ohlcEl=null;pinnedBar=null;pinnedIndex=-1;tz=null;priceFormatter=null;setTimezone(e){this.tz=e}setPriceFormatter(e){this.priceFormatter=e}fmt(e){return Wa(this.priceFormatter?this.priceFormatter(e):e.toFixed(2))}create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`var(--tcw-tooltip-radius, 4px)`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`auto`,cursor:`pointer`,zIndex:`99`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=document.createElement(`div`),this.ohlcEl=document.createElement(`div`),this.deltaEl=document.createElement(`div`),this.deltaEl.style.marginTop=`4px`,this.deltaEl.style.paddingTop=`4px`,this.deltaEl.style.borderTop=`1px solid currentColor`,this.deltaEl.style.opacity=`0.85`,this.deltaEl.style.fontVariantNumeric=`tabular-nums`,this.el.appendChild(this.timeEl),this.el.appendChild(this.ohlcEl),this.el.appendChild(this.deltaEl);let t=document.createElement(`div`);t.textContent=`📌 pinned`,t.style.fontSize=`9px`,t.style.opacity=`0.6`,t.style.marginBottom=`2px`,t.style.letterSpacing=`0.04em`,t.style.textTransform=`uppercase`,this.el.insertBefore(t,this.timeEl),e.appendChild(this.el)}pin(e,n,r){if(!this.el||!this.timeEl||!this.ohlcEl)return;this.pinnedBar=e,this.pinnedIndex=n;let i=e.close>=e.open?r.candleUp:r.candleDown,a=(0,t.timeParts)(e.time>0xe8d4a51000?e.time:e.time*1e3,this.tz);this.timeEl.textContent=`${a.month}/${a.day} ${Ga(a.hours)}:${Ga(a.minutes)}`,this.timeEl.style.color=r.textSecondary;let o=[];for(let[t,n]of[[`O `,e.open],[` H `,e.high],[` L `,e.low],[` C `,e.close]]){let e=document.createElement(`span`);e.style.opacity=`.6`,e.textContent=t;let r=document.createElement(`span`);r.style.color=i,r.textContent=this.fmt(n),o.push(e,r)}this.ohlcEl.replaceChildren(...o);let s=Ka(r.background);this.el.style.background=qa(r.background,s?.96:.97),this.el.style.border=`1px solid ${i}`,this.el.style.boxShadow=s?`0 4px 12px rgba(0,0,0,0.55)`:`0 4px 12px rgba(0,0,0,0.18)`,this.el.style.color=r.text,this.el.style.backdropFilter=`blur(8px)`,this.el.style.display=`block`}unpin(){this.pinnedBar=null,this.pinnedIndex=-1,this.el&&(this.el.style.display=`none`)}isPinned(){return this.pinnedBar!==null}getPinnedIndex(){return this.pinnedIndex}reposition(t,n,r,i){if(!this.el||!this.pinnedBar)return;let a=e.b(this.pinnedIndex,t),o=e.w(this.pinnedBar.close,t),s=t.chartRect,c=a>=s.x-4&&a<=s.x+s.width+4;this.el.style.opacity=c?`1`:`0.35`;let l=Math.max(s.x,Math.min(s.x+s.width-180,a+8)),u=Math.max(s.y,Math.min(s.y+s.height-90,o-64));if(this.el.style.transform=`translate(${Math.round(l)}px, ${Math.round(u)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.deltaEl)if(n&&r!==null&&r!==this.pinnedIndex){let e=n.close-this.pinnedBar.close,t=this.pinnedBar.close===0?0:e/this.pinnedBar.close*100,a=e>0?`+`:e<0?`−`:``,o=r-this.pinnedIndex,s=e>=0?i.candleUp:i.candleDown;this.deltaEl.style.color=s,this.deltaEl.innerHTML=`Δ ${a}${this.fmt(Math.abs(e))} <span style="opacity:.7">(${a}${Math.abs(t).toFixed(2)}%)</span> · ${o>0?`+`:``}${o} bars`,this.deltaEl.style.display=`block`}else this.deltaEl.style.display=`none`}destroy(){this.el?.remove(),this.el=null,this.deltaEl=null,this.timeEl=null,this.ohlcEl=null,this.pinnedBar=null,this.pinnedIndex=-1}};function Wa(e){return e.replace(/[&<>"']/g,e=>`&#${e.charCodeAt(0)};`)}function Ga(e){return e<10?`0`+e:``+e}function Ka(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}return!0}function qa(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var Ja=class{listeners=new Map;tauriBridge=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)}hasListeners(e){return(this.listeners.get(e)?.size??0)>0}emit(e,t){let n={type:e,timestamp:Date.now(),payload:t},r=this.listeners.get(e);if(r)for(let e of r)e(n);if(this.tauriBridge?.enabled&&window.__TAURI__){let t=this.tauriBridge.eventPrefix??`tc-chart`;window.__TAURI__.event.emit(`${t}:${e}`,n).catch(()=>{})}}enableTauriBridge(e){this.tauriBridge=e}disableTauriBridge(){this.tauriBridge=null}destroy(){this.listeners.clear(),this.tauriBridge=null}},Ya=`#FFFFFF`;function Xa(e){for(let t in e)if(e[t]!==null)return!0;return!1}function Za(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];i!==null&&(n[t[r]]=i)}return n}function Qa(e,t){let n=t.style?.trading;return!n||!Xa(n)?e:{...e,orderColors:{...e.orderColors,...Za({buy:n.buy,sell:n.sell},{buy:`buy`,sell:`sell`})},positionColors:{...e.positionColors,...Za({profit:n.profit,loss:n.loss,entry:n.entry},{profit:`profit`,loss:`loss`,entry:`entry`})}}}function $a(e,t){let n=t.style?.markers;return!n||!Xa(n)?e:{...e,...Za(n,{long:`longColor`,short:`shortColor`,neutral:`neutralColor`})}}function eo(e,t){let n=t.style?.tradeZones;return!n||!Xa(n)?e:{...e,...Za(n,{profit:`profitColor`,loss:`lossColor`,active:`activeColor`})}}function to(e){return e?.style?.drawings.handle??Ya}var no=`rgba(12, 16, 22, 0.85)`,ro=no,io=t.DEFAULT_FONT_FAMILY,ao=to(null);function oo(e){ro=e?.background??no,io=e?.font?.family||t.DEFAULT_FONT_FAMILY,ao=to(e)}function so(){return ao}function co(){return io}function H(e,t){return`${t?`${t} `:``}${e}px ${io}`}function U(e,t,n,r){e.save(),e.lineJoin=`round`,e.lineWidth=3,e.strokeStyle=ro,e.globalAlpha*=.85,e.setLineDash([]),e.strokeText(t,n,r),e.restore(),e.fillText(t,n,r)}function lo(e,t){return Math.ceil(e.measureText(t).width)+12}function uo(e,t,n,r,i,a=`#ffffff`){let o=lo(e,t),s=Math.round(r-18/2);return e.fillStyle=i,e.beginPath(),typeof e.roundRect==`function`?e.roundRect(n,s,o,18,4):e.rect(n,s,o,18),e.fill(),e.fillStyle=a,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(t,n+6,s+18/2+.5),o}var fo=14,po=6,mo=4,ho=`rgba(19, 23, 34, 0.85)`,go=`#FFFFFF`,_o=6e4,vo=60*_o,yo=24*vo;function bo(e){let t=Math.abs(e);return t>=10||t===0?2:t>=1?4:Math.min(10,Math.ceil(-Math.log10(t))+3)}function W(e,t=e,n){return n?.formatPrice?n.formatPrice(e):e.toFixed(bo(t))}function xo(e,t,n){let r=t-e,i=e===0?0:r/e*100,a=r>=0?`+`:``;return`${a}${W(r,e,n)} (${a}${i.toFixed(2)}%)`}function So(e){let t=Math.abs(e);if(t<vo)return`${Math.round(t/_o)}m`;if(t<yo){let e=Math.floor(t/vo),n=Math.round((t-e*vo)/_o);return n>0?`${e}h ${n}m`:`${e}h`}let n=Math.floor(t/yo),r=Math.round((t-n*yo)/vo);if(n>=7){let e=Math.floor(n/7),t=n-e*7;return t>0?`${e}w ${t}d`:`${e}w`}return r>0?`${n}d ${r}h`:`${n}d`}function Co(e){return!!e.data&&e.data.length>0}function wo(t,n,r,i){let a=e.E(t.anchors[n].time,i),o=e.E(t.anchors[r].time,i);return Math.round(Math.abs(o-a))}function To(e,t,n,r){return Co(r)?So(e.anchors[n].time-e.anchors[t].time):null}function Eo(e,t,n,r,i=`center`,a=!0){e.font=H(11);let o=0;for(let n of t)o=Math.max(o,e.measureText(n).width);let s=o+po*2,c=t.length*fo+mo*2,l=i===`left`?n:i===`right`?n-s:n-s/2,u=a?r-c:r;e.fillStyle=ho,e.fillRect(l,u,s,c),e.fillStyle=go,e.textAlign=`left`,e.textBaseline=`top`;for(let n=0;n<t.length;n++)e.fillText(t[n],l+po,u+mo+n*fo);return{x:l,y:u,width:s,height:c}}function Do(e,t,n){let r=Math.abs(e.anchors[t[1]].price-e.anchors[t[0]].price),i=Math.abs(e.anchors[n[1]].price-e.anchors[n[0]].price);return i===0?`—`:(r/i).toFixed(3)}var Oo={at:e=>e,value:e=>e,price:e=>e};function ko(t){if(!t)return Oo;let{min:n,max:r}=t.priceRange,i=t.logScale===!0&&n>0&&r>0;return{at:n=>e.E(n,t),value:i?e=>Math.log(Math.max(e,2**-52)):e=>e,price:i?Math.exp:e=>e}}function G(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r*r+i*i;if(a===0)return Math.hypot(e.x-t.x,e.y-t.y);let o=Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/a));return Math.hypot(e.x-(t.x+o*r),e.y-(t.y+o*i))}function Ao(e,t,n,r=!1){for(let r=0;r<t.length-1;r++)if(G(e,t[r],t[r+1])<=n)return!0;return r&&t.length>2&&G(e,t[t.length-1],t[0])<=n}function jo(e,t){switch(e.kind){case`boolean`:return typeof t==`boolean`;case`number`:return typeof t==`number`&&Number.isFinite(t);case`levels`:return Array.isArray(t);default:return typeof t==`string`}}var K=class{hitTestAnchor(e,t,n,r){for(let i=0;i<t.anchors.length;i++){let a=this.anchorToPixel(t.anchors[i],n);if(Math.hypot(e.x-a.x,e.y-a.y)<=r)return i}return-1}option(e,t){let n=this.descriptor.options?.[t],r=e.options?.[t];return n?r!==void 0&&jo(n,r)?r:n.default:r}visibleLevels(e,t=`levels`){return this.option(e,t).filter(e=>e.visible&&Number.isFinite(e.value))}extendLine(e,t,n,r,i){let a=t.x-e.x,o=t.y-e.y,s=Math.hypot(a,o);if(s===0||!r&&!i)return[e,t];let c=Math.hypot(n.chartRect.width,n.chartRect.height)*2,l=a/s*c,u=o/s*c;return[r?{x:e.x-l,y:e.y-u}:e,i?{x:t.x+l,y:t.y+u}:t]}linePriceAt(e,t,n,r,i,a=Oo){let o=this.lineValueAt(e,t,n,r,i,a);return o===null?null:a.price(o)}lineValueAt(e,t,n,r,i,a){let o=a.at(e.time),s=a.at(t.time);if(o===s)return null;let c=(a.at(n)-o)/(s-o);if(!Number.isFinite(c)||c<0&&!r||c>1&&!i)return null;let l=a.value(e.price);return l+(a.value(t.price)-l)*c}anchorToPixel(t,n){return{x:e.D(t.time,n),y:e.w(t.price,n)}}pixelToAnchor(t,n){return{time:e.A(t.x,n),price:e.j(t.y,n)}}applyLineStyle(e,t){switch(e.strokeStyle=t.color,e.lineWidth=t.lineWidth,e.lineCap=`butt`,e.lineJoin=`round`,t.lineStyle){case`dashed`:e.setLineDash([6,4]);break;case`dotted`:e.setLineDash([2,2]);break;default:e.setLineDash([]);break}}strokeHorizontal(t,n,r,i){let a=e._(t,i,Number(t.lineWidth)||1);t.lineWidth=a.width,t.beginPath(),t.moveTo(n,a.y),t.lineTo(r,a.y),t.stroke()}strokeVertical(t,n,r,i){let a=e.g(t,n,Number(t.lineWidth)||1);t.lineWidth=a.width,t.beginPath(),t.moveTo(a.x,r),t.lineTo(a.x,i),t.stroke()}resetLineStyle(e){e.setLineDash([]),e.lineCap=`butt`,e.lineJoin=`miter`}renderAnchorHandles(e,t,n){e.fillStyle=so(),e.strokeStyle=t.style.color,e.lineWidth=1;for(let r of t.anchors){let t=this.anchorToPixel(r,n);e.fillRect(t.x-4,t.y-4,8,8),e.strokeRect(t.x-4,t.y-4,8,8)}}distanceToLine(e,t,n){return G(e,t,n)}distanceToInfiniteLine(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=Math.hypot(r,i);return a===0?Math.hypot(e.x-t.x,e.y-t.y):Math.abs(r*(t.y-e.y)-i*(t.x-e.x))/a}};function Mo(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r)?r.map(e=>({...e})):r;return t}function q(e){return{...e,anchors:e.anchors.map(e=>({...e})),style:{...e.style},options:e.options?Mo(e.options):void 0,group:e.group?{...e.group}:void 0,meta:e.meta?{...e.meta}:void 0}}function No(e,t){return JSON.stringify(e??{})===JSON.stringify(t??{})}function Po(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n].time!==t[n].time||e[n].price!==t[n].price)return!1;return!0}var Fo=1,Io=1,Lo=/^tc_drawing_(\d+)$/,Ro=/^tc_group_(\d+)$/;function zo(){return`tc_drawing_${Fo++}`}function Bo(){let e=Io++;return{id:`tc_group_${e}`,number:e}}function Vo(e){for(let t of e){let e=Lo.exec(t.id);e&&(Fo=Math.max(Fo,Number(e[1])+1));let n=t.group?Ro.exec(t.group.id):null;n&&(Io=Math.max(Io,Number(n[1])+1))}}function Ho(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t);return[...t.map(e=>n.get(e)).filter(e=>e!==void 0),...e.filter(e=>!r.has(e.id))]}function Uo(e,t,n){let r=t-1;switch(n){case`front`:return r;case`back`:return 0;case`forward`:return Math.min(r,e+1);case`backward`:return Math.max(0,e-1)}}function Wo(e,t){return e.map(e=>e.id===t.id?structuredClone(t):e)}function Go(e,t){switch(t.type){case`drawingBatch`:return[...t.actions??[]].reverse().reduce(Go,[...e]);case`drawingCreate`:return t.after?e.filter(e=>e.id!==t.after.id):[...e];case`drawingRemove`:{if(!t.before)return[...e];let n=[...e];return n.splice(Math.min(t.index??n.length,n.length),0,structuredClone(t.before)),n}case`drawingOrder`:return t.order?Ho(e,t.order.before):[...e];case`drawingModify`:return t.before?Wo(e,t.before):[...e];default:return[...e]}}function Ko(e,t){switch(t.type){case`drawingBatch`:return(t.actions??[]).reduce(Ko,[...e]);case`drawingCreate`:return t.after?[...e,structuredClone(t.after)]:[...e];case`drawingRemove`:return t.before?e.filter(e=>e.id!==t.before.id):[...e];case`drawingOrder`:return t.order?Ho(e,t.order.after):[...e];case`drawingModify`:return t.after?Wo(e,t.after):[...e];default:return[...e]}}var qo={"]":[`forward`,`front`],"}":[`front`,`front`],"[":[`backward`,`back`],"{":[`back`,`back`]};function Jo(e,t,n){if(e===`Escape`)return`escape`;if(e===`Enter`&&!t)return`finish`;if(e===`Delete`||e===`Backspace`)return`delete`;if(!t)return null;let r=n??(e.length===1&&e!==e.toLowerCase()),i=qo[e];if(i)return i[+!!r];switch(e.toLowerCase()){case`c`:return`copy`;case`v`:return`paste`;case`d`:return`duplicate`;case`g`:return r?`ungroup`:`group`;case`z`:return r?`redo`:`undo`;case`y`:return`redo`;default:return null}}var Yo=2,Xo=6;function Zo(e){return e.descriptor.creation??`clicks`}var Qo=class{drawing=null;plugin=null;preview=null;lastPos=null;dragging=!1;step=Yo;get current(){return this.drawing}reset(){this.drawing=null,this.plugin=null,this.preview=null,this.lastPos=null,this.dragging=!1,this.step=Yo}press(e,t,n,r,i){if(this.dragging)return`continue`;let a=Zo(e);if(!this.drawing)return this.plugin=e,this.drawing={...t(),anchors:[n]},this.preview=null,this.lastPos=r,a===`freehand`?(this.dragging=!0,`continue`):a===`clicks`&&e.descriptor.requiredAnchors<=1?`done`:`continue`;let o=this.drawing.anchors[this.drawing.anchors.length-1],s=i?i(o):this.lastPos;if(a===`path`&&s&&Math.hypot(r.x-s.x,r.y-s.y)<=Xo)return this.finish();this.commit(n,r);let c=a===`path`?e.descriptor.maxAnchors??100:e.descriptor.requiredAnchors;return this.drawing.anchors.length>=c?`done`:`continue`}move(e,t){if(!this.drawing||!this.plugin)return!1;if(this.dragging){let n=this.lastPos;return n&&Math.hypot(t.x-n.x,t.y-n.y)<this.step?!0:(this.drawing.anchors.length>=2e3&&(this.drawing.anchors=this.drawing.anchors.filter((e,t)=>t%2==0),this.step*=2),this.commit(e,t),!0)}return Zo(this.plugin)===`path`||this.drawing.anchors.length<this.plugin.descriptor.requiredAnchors?(this.preview=e,!0):!1}release(){return this.dragging?(this.dragging=!1,this.hasEnough()?`done`:`cancel`):null}undoPoint(){return!this.drawing||this.dragging||this.drawing.anchors.length<=1?(this.reset(),!1):(this.drawing.anchors.pop(),this.preview=null,this.lastPos=null,!0)}finish(){return!this.plugin||Zo(this.plugin)!==`path`||!this.hasEnough()?`continue`:(this.preview=null,`done`)}previewState(){return this.drawing?this.preview?{...this.drawing,anchors:[...this.drawing.anchors,this.preview]}:this.drawing:null}take(){let e=this.drawing;return this.reset(),e}hasEnough(){return!!this.drawing&&!!this.plugin&&this.drawing.anchors.length>=Math.max(2,this.plugin.descriptor.requiredAnchors)}commit(e,t){this.drawing.anchors.push(e),this.preview=null,this.lastPos=t}},$o=30;function es(t,n,r,i,a){if(r===`none`||i.length===0)return{time:t,price:n};let o=!!(a?.data&&a.data.length>0),s=Math.round(o?e.O(t,i):t);if(s<0||s>i.length-1)return{time:t,price:n};let c=i[s],l=o?c.time:s,u=c.open;for(let e of[c.high,c.low,c.close])Math.abs(n-e)<Math.abs(n-u)&&(u=e);return r===`magnet`&&a&&Math.abs(e.w(n,a)-e.w(u,a))>$o?{time:l,price:n}:{time:l,price:u}}var ts=class{primaryId=null;others=new Set;listener=null;setListener(e){this.listener=e}change(e){let t=this.ids().join(`\0`),n=e();return this.listener&&this.ids().join(`\0`)!==t&&this.listener(this.ids()),n}get primary(){return this.primaryId}has(e){return e===this.primaryId||this.others.has(e)}ids(){return this.primaryId?[this.primaryId,...this.others]:[]}clear(){this.change(()=>{this.primaryId=null,this.others.clear()})}add(e){this.change(()=>{this.primaryId?e!==this.primaryId&&this.others.add(e):this.primaryId=e})}only(e,t=[]){this.change(()=>{this.primaryId=e,this.others.clear();for(let n of t)n!==e&&this.others.add(n)})}focus(e){e===this.primaryId||!this.others.has(e)||this.change(()=>{this.primaryId&&this.others.add(this.primaryId),this.others.delete(e),this.primaryId=e})}remove(e){return this.change(()=>this.removeNow(e))}removeNow(e){let t=!1;for(let n of e)this.others.delete(n)&&(t=!0),n===this.primaryId&&(this.primaryId=null,t=!0);if(!this.primaryId){let e=this.others.values().next();e.done||(this.primaryId=e.value,this.others.delete(e.value))}return t}},ns=3,rs=class{start=null;handle=-1;grabbed=[];constructor(e){this.find=e}isActive(){return this.start!==null}beginMove(e,t){this.start=e,this.handle=-1,this.grabbed=t.map(e=>({id:e.id,anchors:e.anchors.map(e=>({...e})),before:q(e)}))}beginResize(e,t,n){this.start=e,this.handle=n,this.grabbed=[{id:t.id,anchors:t.anchors.map(e=>({...e})),before:q(t)}]}move(e,t,n){return!this.start||this.grabbed.length===0?!1:this.handle>=0?this.reshape(e,t,n):this.translate(e,t)}end(){let e=this.grabbed.flatMap(({id:e,before:t})=>{let n=this.find(e);return n?[{before:t,drawing:n}]:[]});return this.start=null,this.handle=-1,this.grabbed=[],e}translate(t,n){let r=this.start,i=t.x-r.x,a=t.y-r.y;if(Math.hypot(i,a)<ns&&this.unmoved())return!0;let o=n.barWidth+n.barSpacing,s=o>0?Math.round(i/o):0,c=n.data,l=t=>{let r=e.E(t,n)+s;return c&&c.length>0?e.y(r,c):r};for(let{id:t,anchors:r}of this.grabbed){let i=this.find(t);!i||i.locked||(i.anchors=r.map(t=>({time:s===0?t.time:l(t.time),price:a===0?t.price:e.j(e.w(t.price,n)+a,n)})))}return!0}unmoved(){return this.grabbed.every(({id:e,anchors:t})=>{let n=this.find(e)?.anchors;return!n||n.every((e,n)=>e.time===t[n]?.time&&e.price===t[n]?.price)})}reshape(n,r,i){let a=this.find(this.grabbed[0].id);if(!a)return!1;let o={time:e.A(n.x,r),price:e.j(n.y,r)};if(i?.moveHandle){let e=i.moveHandle(q(a),this.handle,o);a.anchors=e.anchors,a.options=e.options&&Object.keys(e.options).length>0?(0,t.sanitizeDrawingOptions)(i.descriptor.options,e.options):void 0}else this.handle<a.anchors.length&&(a.anchors[this.handle]=o);return!0}},is={drawings:[],pastes:0},as=class{registry=new Map;drawings=[];state=`idle`;activeTool=null;activeStyle={color:`#4c8dff`,lineWidth:1,lineStyle:`solid`,fillColor:`rgba(76, 141, 255, 0.1)`,fillOpacity:.1,fontSize:12};creator=new Qo;finishedAt=-1/0;creationPressAt=-1/0;eraser=!1;selection=new ts;drag=new rs(e=>this.drawings.find(t=>t.id===e));eventCallback=null;requestRender=null;undoRedo=null;magnetMode=`none`;dataGetter=null;displayDataGetter=null;stayInDrawingMode=!1;toolAllowed=()=>!0;toolDefaults=new Map;edits=new Map;batch=null;register(e){this.registry.set(e.descriptor.type,e),this.dataGetter&&e.setDataGetter?.(this.dataGetter)}setEventCallback(e){this.eventCallback=e}setRequestRender(e){this.requestRender=e}setUndoRedoManager(e){this.undoRedo=e}setMagnetMode(e){this.magnetMode=e}getMagnetMode(){return this.magnetMode}setDataGetter(e){this.dataGetter=e;for(let t of this.registry.values())t.setDataGetter?.(e)}setDisplayDataGetter(e){this.displayDataGetter=e}snapToOHLC(e,t,n){let r=this.magnetMode===`none`?[]:this.displayDataGetter?.()??this.dataGetter?.()??[];return es(e,t,this.magnetMode,r,n)}undo(){if(!this.undoRedo)return!1;let e=this.undoRedo.undo();return e?(this.applyUndoAction(e),!0):!1}redo(){if(!this.undoRedo)return!1;let e=this.undoRedo.redo();return e?(this.applyRedoAction(e),!0):!1}foreignHistory=null;setForeignHistory(e){this.foreignHistory=e}applyUndoAction(e){if(e.type===`indicators`||e.type===`custom`){this.foreignHistory?.(e,`undo`);return}this.applyHistory(Go(this.drawings,e))}applyRedoAction(e){if(e.type===`indicators`||e.type===`custom`){this.foreignHistory?.(e,`redo`);return}this.applyHistory(Ko(this.drawings,e))}applyHistory(e){let t=new Map(this.drawings.map((e,t)=>[e.id,{d:e,index:t}]));this.drawings=e,this.settleAfterHistory();let n=new Set(e.map(e=>e.id));for(let e of t.keys())n.has(e)||(this.edits.delete(e),this.eventCallback?.(`drawingRemove`,{id:e}));e.forEach((e,n)=>{let r=t.get(e.id);r?(r.d!==e||r.index!==n)&&this.eventCallback?.(`drawingUpdate`,{id:e.id}):this.eventCallback?.(`drawingCreate`,{id:e.id,type:e.type,drawing:e})})}settleAfterHistory(){this.selection.clear(),this.creator.reset(),this.state=this.activeTool?`creating`:`idle`,this.requestRender?.()}record(e){this.batch?this.batch.push(e):this.undoRedo?.push(e)}batchUndo(e){if(this.batch){e();return}let t=[];this.batch=t;try{e()}finally{this.batch=null}t.length===1?this.undoRedo?.push(t[0]):t.length>1&&this.undoRedo?.push({type:`drawingBatch`,before:null,after:null,actions:t})}deselect(e){this.selection.remove(e)&&!this.selection.primary&&this.state===`selected`&&(this.state=`idle`)}addToSelection(e){this.selection.add(e),this.state=`selected`}groupMates(e){let t=e.group?.id;return t?this.drawings.filter(n=>n.group?.id===t&&n.id!==e.id).map(e=>e.id):[]}select(e){if(this.state===`creating`)return!1;let t=this.drawings.find(t=>t.id===e);return!t||!t.visible?!1:(this.selection.has(e)||this.selection.only(e,this.groupMates(t)),this.state=`selected`,this.requestRender?.(),!0)}setSelectionListener(e){this.selection.setListener(e)}getSelectedDrawingIds(){return this.selection.ids()}selectInRect(t,n){if(this.state===`creating`)return 0;this.selection.clear(),this.state=`idle`;let r=Math.min(t.x0,t.x1),i=Math.max(t.x0,t.x1),a=Math.min(t.y0,t.y1),o=Math.max(t.y0,t.y1);for(let t of this.drawings)t.visible&&t.anchors.some(t=>{let s=e.D(t.time,n),c=e.w(t.price,n);return s>=r&&s<=i&&c>=a&&c<=o})&&this.addToSelection(t.id);return this.requestRender?.(),this.getSelectedDrawingIds().length}toggleSelectionAt(e,t){if(this.state===`creating`)return!1;for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(r.visible&&this.registry.get(r.type)?.hitTest(e,r,t,8))return this.selection.has(r.id)?this.deselect([r.id]):this.addToSelection(r.id),this.requestRender?.(),!0}return!1}beginMove(e,t){this.state=`moving`;let n=this.getSelectedDrawingIds().filter(e=>e!==t.id).map(e=>this.drawings.find(t=>t.id===e)).filter(e=>e!==void 0&&!e.locked);this.drag.beginMove(e,[t,...n])}setFlags(e,t){this.batchUndo(()=>{for(let n of e){if((t.visible===void 0||n.visible===t.visible)&&(t.locked===void 0||n.locked===t.locked))continue;let e=q(n);Object.assign(n,t),this.record({type:`drawingModify`,before:e,after:q(n)})}}),t.visible===!1&&this.deselect(e.map(e=>e.id)),this.requestRender?.()}lockAllDrawings(){this.setFlags(this.drawings,{locked:!0})}unlockAllDrawings(){this.setFlags(this.drawings,{locked:!1})}hideAllDrawings(){this.setFlags(this.drawings,{visible:!1})}showAllDrawings(){this.setFlags(this.drawings,{visible:!0})}setDrawingVisible(e,t){let n=this.drawings.find(t=>t.id===e);return n?(this.setFlags([n],{visible:t}),t):null}setDrawingsVisible(e,t){let n=new Set(e);this.setFlags(this.drawings.filter(e=>n.has(e.id)),{visible:t})}setDrawingsLocked(e,t){let n=new Set(e);this.setFlags(this.drawings.filter(e=>n.has(e.id)),{locked:t})}setDrawingLocked(e,t){let n=this.drawings.find(t=>t.id===e);return n?(this.setFlags([n],{locked:t}),t):null}setActiveTool(e){e&&this.setEraser(!1);let t=e!==this.activeTool;this.activeTool=e,this.state=e?`creating`:`idle`,this.creator.reset(),t&&this.eventCallback?.(`drawingToolChange`,{tool:e})}setStayInDrawingMode(e){this.stayInDrawingMode=e}isStayInDrawingMode(){return this.stayInDrawingMode}setToolFilter(e){this.toolAllowed=e}copySelection(){let e=this.getSelectedDrawingIds().map(e=>this.drawings.find(t=>t.id===e)).filter(e=>e!==void 0);return e.length===0?0:(is.drawings=e.map(e=>structuredClone(e)),is.pastes=0,e.length)}paste(){if(is.drawings.length===0||this.state===`creating`)return[];let e=is.drawings.every(e=>this.drawings.some(t=>t.id===e.id));is.pastes+=1;let t=e?this.computeBarOffsetTime(3*is.pastes):0,n=[];if(this.batchUndo(()=>{for(let e of is.drawings)!this.registry.has(e.type)||!this.toolAllowed(e.type)||n.push(this.addDrawing({type:e.type,anchors:e.anchors.map(e=>({...e,time:e.time+t})),style:{...e.style},options:e.options?Mo(e.options):void 0,meta:e.meta?structuredClone(e.meta):void 0}))}),n.length===0)return n;this.selection.clear();for(let e of n)this.addToSelection(e);return this.requestRender?.(),n}getActiveTool(){return this.activeTool}setStyle(e){Object.assign(this.activeStyle,e)}getActiveStyle(){return{...this.activeStyle}}setSelectedDrawingStyle(e,t){let n=t?[t]:this.getSelectedDrawingIds(),r=!1;return this.batchUndo(()=>{for(let t of n){let n=this.drawings.find(e=>e.id===t);if(!n||n.locked)continue;let i=q(n);n.style={...n.style,...e},this.record({type:`drawingModify`,before:i,after:q(n)}),r=!0}}),r&&this.requestRender?.(),r}onPointerDown(e,t){return this.eraser?this.erase(e,t):this.state===`creating`&&this.activeTool?this.handleCreationClick(e,t):this.state===`idle`||this.state===`selected`?this.handleSelectionClick(e,t):!1}onPointerMove(e,t){let n=this.state===`creating`?this.creator.current:null;if(n&&this.creator.move(this.creationAnchor(n.type,e,t),e))return this.requestRender?.(),!0;if((this.state===`moving`||this.state===`resizing`)&&this.drag.isActive()){let n=this.drawings.find(e=>e.id===this.selection.primary);return this.drag.move(e,t,n&&this.registry.get(n.type))?(this.requestRender?.(),!0):!1}return!1}onPointerUp(){let e=this.state===`creating`?this.creator.release():null;if(e)return this.afterCreationStep(e),!0;if(this.state===`moving`||this.state===`resizing`){let e=this.drag.end();return this.batchUndo(()=>{for(let{before:t,drawing:n}of e)Po(n.anchors,t.anchors)&&No(n.options,t.options)||this.record({type:`drawingModify`,before:t,after:q(n)})}),this.state=`selected`,!0}return!1}onKeyDown(e,t=!1,n){let r=Jo(e,t,n);if(!r)return!1;let i=this.state===`selected`?this.selection.primary:null;switch(r){case`copy`:return i!==null&&this.copySelection()>0;case`paste`:return this.paste().length>0;case`duplicate`:return i!==null&&this.duplicateDrawing(i)!==null;case`group`:return i!==null&&this.groupDrawings(this.getSelectedDrawingIds())!==null;case`ungroup`:return this.ungroupSelection();case`front`:case`forward`:case`backward`:case`back`:return i!==null&&this.moveDrawing(i,r);case`undo`:return this.state===`creating`&&this.creator.current?(this.creator.undoPoint(),this.requestRender?.(),!0):this.undo();case`redo`:return this.redo();case`escape`:return this.escape();case`delete`:return i!==null&&this.removeDrawings(this.getSelectedDrawingIds())>0;case`finish`:{if(this.state!==`creating`||!this.creator.current)return!1;let e=this.creator.finish();return e===`done`?(this.afterCreationStep(e),!0):!1}}}escape(){return this.eraser?(this.setEraser(!1),!0):this.state===`creating`?(this.setActiveTool(null),this.requestRender?.(),!0):this.state===`selected`?(this.selection.clear(),this.state=`idle`,this.requestRender?.(),!0):!1}ungroupSelection(){let e=new Set;for(let t of this.getSelectedDrawingIds()){let n=this.drawings.find(e=>e.id===t)?.group;n&&e.add(n.id)}for(let t of e)this.ungroup(t);return e.size>0}getDrawings(){return this.drawings}setDrawings(e){Vo(e),this.drawings=this.upgradeLegacyAnchors(e).map(e=>{if(!e.options)return e;let n=(0,t.sanitizeDrawingOptions)(this.optionDefs(e.type),e.options);return{...e,options:Object.keys(n).length>0?n:void 0}});let n=new Set(this.drawings.map(e=>e.id));this.deselect(this.getSelectedDrawingIds().filter(e=>!n.has(e)));for(let e of[...this.edits.keys()])n.has(e)||this.edits.delete(e);this.requestRender?.()}moveDrawing(e,t){let n=this.drawings.findIndex(t=>t.id===e);if(n<0)return!1;let r=Uo(n,this.drawings.length,t);if(r===n)return!1;let i=this.drawings.map(e=>e.id),a=[...this.drawings],[o]=a.splice(n,1);return a.splice(r,0,o),this.drawings=a,this.record({type:`drawingOrder`,before:null,after:null,order:{before:i,after:a.map(e=>e.id)}}),this.eventCallback?.(`drawingUpdate`,{id:e}),this.requestRender?.(),!0}getGroups(){let e=new Map;for(let t of this.drawings){if(!t.group)continue;let n=e.get(t.group.id)??{id:t.group.id,name:t.group.name,ids:[]};n.ids.push(t.id),e.set(t.group.id,n)}return[...e.values()]}updateGroup(e,t){let n=this.drawings.filter(t=>t.group?.id===e);return n.length===0?!1:(this.batchUndo(()=>{for(let e of n){let n=q(e);t(e),this.record({type:`drawingModify`,before:n,after:q(e)}),this.eventCallback?.(`drawingUpdate`,{id:e.id})}}),this.requestRender?.(),!0)}groupDrawings(e,t){let n=new Set(e),r=this.drawings.filter(e=>n.has(e.id));if(r.length<2)return null;let{id:i,number:a}=Bo(),o={id:i,name:os(t)||`Group ${a}`};return this.batchUndo(()=>{for(let e of r){let t=q(e);e.group={...o},this.record({type:`drawingModify`,before:t,after:q(e)}),this.eventCallback?.(`drawingUpdate`,{id:e.id})}}),this.requestRender?.(),o.id}ungroup(e){return this.updateGroup(e,e=>{delete e.group})}renameGroup(e,t){let n=os(t);return n.length>0&&this.updateGroup(e,t=>{t.group={id:e,name:n}})}setGroupVisible(e,t){let n=this.updateGroup(e,e=>{e.visible=t});return n&&!t&&this.deselect(this.drawings.filter(t=>t.group?.id===e).map(e=>e.id)),n}setGroupLocked(e,t){return this.updateGroup(e,e=>{e.locked=t})}priceAt(e,t,n){let r=this.drawings.find(t=>t.id===e);if(!r)return null;let i=this.registry.get(r.type)?.priceAt?.(r,t,n)??null;return i&&i.every(Number.isFinite)?i:null}hasPriceLevels(e){let t=this.drawings.find(t=>t.id===e);return!!t&&typeof this.registry.get(t.type)?.priceAt==`function`}getDescriptor(e){return this.registry.get(e)?.descriptor??null}getOptionDefs(e){return this.optionDefs(e)??{}}optionDefs(e){return this.registry.get(e)?.descriptor.options}initialOptions(e,n){let r=this.optionDefs(e),i={...Mo(this.toolDefaults.get(e)??{}),...(0,t.sanitizeDrawingOptions)(r,n)};return Object.keys(i).length>0?i:void 0}setToolDefaults(e,n){let r=n?(0,t.sanitizeDrawingOptions)(this.optionDefs(e),n):{};Object.keys(r).length>0?this.toolDefaults.set(e,r):this.toolDefaults.delete(e)}getToolDefaults(e){return Mo(this.toolDefaults.get(e)??{})}getDrawingOptions(e){let n=this.drawings.find(t=>t.id===e);return n?(0,t.resolveDrawingOptions)(this.optionDefs(n.type),n.options):{}}setDrawingOptions(e,t){return this.updateDrawing(e,{options:t})}updateDrawing(e,n){let r=this.drawings.find(t=>t.id===e);if(!r||n.anchors&&!(n.anchors.length===r.anchors.length&&n.anchors.every(e=>Number.isFinite(e.time)&&Number.isFinite(e.price))))return!1;let i=this.edits.has(e)?null:q(r);if(n.anchors&&(r.anchors=n.anchors.map(e=>({time:e.time,price:e.price}))),n.style&&(r.style={...r.style,...n.style}),n.options){let e={...r.options,...(0,t.sanitizeDrawingOptions)(this.optionDefs(r.type),n.options)};r.options=Object.keys(e).length>0?e:void 0}return i&&this.record({type:`drawingModify`,before:i,after:q(r)}),this.eventCallback?.(`drawingUpdate`,{id:e}),this.requestRender?.(),!0}beginEdit(e){let t=this.drawings.find(t=>t.id===e);return t?(this.edits.has(e)||this.edits.set(e,q(t)),!0):!1}endEdit(e,{cancel:t=!1}={}){let n=this.edits.get(e);if(!n)return;this.edits.delete(e);let r=this.drawings.findIndex(t=>t.id===e);r<0||(t?(this.drawings[r]=n,this.requestRender?.()):JSON.stringify(n)!==JSON.stringify(this.drawings[r])&&this.record({type:`drawingModify`,before:n,after:q(this.drawings[r])}),this.eventCallback?.(`drawingUpdate`,{id:e}))}addDrawing(e){e.id&&Vo([{id:e.id}]);let t=e.id??zo(),n={id:t,type:e.type,anchors:e.anchors.map(e=>({...e})),style:{...this.activeStyle,...e.style},visible:e.visible??!0,locked:e.locked??!1,options:this.initialOptions(e.type,e.options),meta:e.meta};return this.drawings=[...this.drawings,n],this.record({type:`drawingCreate`,before:null,after:q(n)}),this.eventCallback?.(`drawingCreate`,{id:t,type:n.type,drawing:n}),this.requestRender?.(),t}upgradeLegacyAnchors(e){let t=this.dataGetter?.();return!t||t.length===0?e:e.map(e=>({...e,anchors:e.anchors.map(e=>{if(e.time>=1e9)return e;let n=Math.max(0,Math.min(t.length-1,Math.round(e.time)));return{...e,time:t[n].time}})}))}removeDrawing(e){let t=this.drawings.findIndex(t=>t.id===e),n=this.drawings[t];this.drawings=this.drawings.filter(t=>t.id!==e),n&&this.record({type:`drawingRemove`,before:structuredClone(n),after:null,index:t}),this.deselect([e]),this.edits.delete(e),this.eventCallback?.(`drawingRemove`,{id:e}),this.requestRender?.()}removeDrawings(e){let t=[...new Set(e)].filter(e=>{let t=this.drawings.find(t=>t.id===e);return t!==void 0&&!t.locked});return t.length===0?0:(this.batchUndo(()=>{for(let e of t)this.removeDrawing(e)}),t.length)}duplicateDrawing(e){let t=this.drawings.find(t=>t.id===e);if(!t)return null;let n=structuredClone(t);n.id=zo();let r=this.computeBarOffsetTime(3);return n.anchors=n.anchors.map(e=>({...e,time:e.time+r})),n.locked=!1,this.drawings.push(n),this.record({type:`drawingCreate`,before:null,after:structuredClone(n)}),this.selection.only(n.id),this.state=`selected`,this.eventCallback?.(`drawingCreate`,{id:n.id,type:n.type,drawing:n}),this.requestRender?.(),n.id}clearDrawings(){this.drawings=[],this.selection.clear(),this.state=`idle`,this.requestRender?.()}getSelectedDrawingId(){return this.selection.primary}render(e,t){e.save(),e.beginPath(),e.rect(t.chartRect.x,t.chartRect.y,t.chartRect.width,t.chartRect.height),e.clip();for(let n of this.drawings){if(!n.visible)continue;let r=this.registry.get(n.type);if(!r)continue;let i=this.selection.has(n.id);r.render(e,n,t,i)}let n=this.creator.previewState();n&&this.registry.get(n.type)?.render(e,n,t,!1),e.restore()}computeBarOffsetTime(e){let t=this.dataGetter?.();if(!t||t.length<2)return e;let n=Math.max(0,t.length-20),r=[];for(let e=n+1;e<t.length;e++)r.push(t[e].time-t[e-1].time);return r.length===0?e:(r.sort((e,t)=>e-t),e*r[Math.floor(r.length/2)])}creationAnchor(t,n,r){let i=e.A(n.x,r),a=e.j(n.y,r);return this.registry.get(t)?.descriptor.creation===`freehand`?{time:i,price:a}:this.snapToOHLC(i,a,r)}handleCreationClick(t,n){let r=this.activeTool,i=r?this.registry.get(r):void 0;if(!r||!i)return!1;let a=()=>({id:zo(),type:r,anchors:[],style:{...this.activeStyle},visible:!0,locked:!1,options:this.initialOptions(r)});return this.creationPressAt=Date.now(),this.afterCreationStep(this.creator.press(i,a,this.creationAnchor(r,t,n),t,t=>({x:e.D(t.time,n),y:e.w(t.price,n)}))),!0}afterCreationStep(e){e===`done`?this.finalizeCreation():e===`cancel`&&this.creator.reset(),this.requestRender?.()}setEraser(e){e!==this.eraser&&(this.eraser=e,e&&(this.setActiveTool(null),this.selection.clear(),this.state=`idle`),this.eventCallback?.(`toolModeChange`,{eraser:e}),this.requestRender?.())}isEraser(){return this.eraser}erase(e,t){let n=this.erasableAt(e,t);return n?(this.removeDrawing(n),!0):!1}erasableAt(e,t){for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!(!r.visible||r.locked)&&this.registry.get(r.type)?.hitTest(e,r,t,8))return r.id}return null}justFinished(e=500){return Date.now()-this.creationPressAt<e&&this.finishedAt>=this.creationPressAt}finalizeCreation(){let e=this.creator.take();if(e){if(this.finishedAt=Date.now(),this.drawings.push(e),this.selection.only(e.id),this.record({type:`drawingCreate`,before:null,after:structuredClone(e)}),this.eventCallback?.(`drawingCreate`,{id:e.id,type:e.type,drawing:e}),this.stayInDrawingMode&&this.activeTool){this.selection.clear(),this.state=`creating`;return}this.activeTool=null,this.state=`selected`,this.eventCallback?.(`drawingToolChange`,{tool:null})}}isDragging(){return this.state===`moving`||this.state===`resizing`}drawingAt(e,t,n=8){for(let r=this.drawings.length-1;r>=0;r--){let i=this.drawings[r];if(i.visible&&this.registry.get(i.type)?.hitTest(e,i,t,n))return i.id}return null}hoverCursorAt(e,t){if(this.eraser)return this.erasableAt(e,t)?`pointer`:null;if(this.activeTool||this.state===`creating`)return null;if(this.selection.primary){let n=this.drawings.find(e=>e.id===this.selection.primary),r=n&&n.visible&&!n.locked?this.registry.get(n.type):void 0;if(n&&r&&r.hitTestAnchor(e,n,t,8)>=0)return`move`}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!(!r.visible||r.locked)&&this.registry.get(r.type)?.hitTest(e,r,t,8))return`pointer`}return null}handleSelectionClick(e,t){if(this.selection.primary){let n=this.drawings.find(e=>e.id===this.selection.primary);if(n&&n.visible&&!n.locked){let r=this.registry.get(n.type);if(r){let i=r.hitTestAnchor(e,n,t,8);if(i>=0)return this.state=`resizing`,this.drag.beginResize(e,n,i),!0;if(r.hitTest(e,n,t,8))return this.beginMove(e,n),!0}}}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!r.visible)continue;let i=this.registry.get(r.type);if(i&&i.hitTest(e,r,t,8))return this.selection.has(r.id)?this.selection.focus(r.id):this.selection.only(r.id,this.groupMates(r)),this.requestRender?.(),r.locked?(this.state=`selected`,!1):(this.beginMove(e,r),!0)}return this.selection.primary&&(this.selection.clear(),this.state=`idle`,this.requestRender?.()),!1}};function os(e){return(e??``).trim().slice(0,80)}var ss=class{constructor(e){this.manager=e}render(e,t,n){oo(n??null),this.manager.render(e,t)}};function cs(e,t,n){let r=Math.max(0,t),i=Math.min(e.length-1,n);if(i<=r)return null;let a=r,o=r;for(let t=r;t<=i;t++)e[t].high>e[a].high&&(a=t),e[t].low<e[o].low&&(o=t);if(a===o)return null;let s={time:e[a].time,price:e[a].high},c={time:e[o].time,price:e[o].low};return a<o?[s,c]:[c,s]}var ls={0:`#7d8696`,.236:`#e8505b`,.25:`#e8505b`,.382:`#c98316`,.5:`#1fa874`,.618:`#1398a8`,.75:`#1398a8`,.786:`#4c8dff`,1:`#7d8696`,1.272:`#a57cff`,1.414:`#e25592`,1.618:`#4c8dff`,2:`#a57cff`,2.618:`#e8505b`,3.618:`#a57cff`,4.236:`#e25592`};function us(e,t=[]){return ds(e,t).map(e=>{let t=ls[e.value];return t?{...e,color:t}:e})}function ds(e,t=[]){return[...e.map(e=>({value:e,visible:!0})),...t.map(e=>({value:e,visible:!1}))].sort((e,t)=>e.value-t.value)}function fs(e=!1,t=!1){return{extendLeft:{kind:`boolean`,label:`Extend left`,default:e},extendRight:{kind:`boolean`,label:`Extend right`,default:t}}}var ps={showLevels:{kind:`boolean`,label:`Show levels`,default:!0},showPrices:{kind:`boolean`,label:`Show prices`,default:!0},labelPosition:{kind:`choice`,label:`Labels`,default:`left`,choices:[{value:`left`,label:`Left`},{value:`right`,label:`Right`}]}},ms=class extends K{descriptor={type:`trendLine`,name:`Trend Line`,requiredAnchors:2,options:fs()};segment(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return this.extendLine(n,r,t,this.option(e,`extendLeft`),this.option(e,`extendRight`))}render(e,t,n,r){if(t.anchors.length<2)return;let[i,a]=this.segment(t,n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<2)return null;let r=this.linePriceAt(e.anchors[0],e.anchors[1],t,this.option(e,`extendLeft`),this.option(e,`extendRight`),ko(n));return r===null?null:[r]}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let[i,a]=this.segment(t,n);return this.distanceToLine(e,i,a)<=r}},hs=class extends K{descriptor={type:`horizontalLine`,name:`Horizontal Line`,requiredAnchors:1};priceAt(e){return e.anchors.length<1?null:[e.anchors[0].price]}render(t,n,r,i){if(n.anchors.length<1)return;let a=e.w(n.anchors[0].price,r),{chartRect:o}=r;this.applyLineStyle(t,n.style),this.strokeHorizontal(t,o.x,o.x+o.width,a),this.resetLineStyle(t),t.fillStyle=n.style.color,t.font=H(11),t.textBaseline=`bottom`,U(t,W(n.anchors[0].price,n.anchors[0].price,r),o.x+4,a-3),i&&this.renderAnchorHandles(t,n,r)}hitTest(t,n,r,i){if(n.anchors.length<1)return!1;let a=e.w(n.anchors[0].price,r);return Math.abs(t.y-a)<=i&&t.x>=r.chartRect.x&&t.x<=r.chartRect.x+r.chartRect.width}},gs=class extends K{descriptor={type:`horizontalRay`,name:`Horizontal Ray`,requiredAnchors:1};priceAt(e,t){return e.anchors.length<1||t<e.anchors[0].time?null:[e.anchors[0].price]}render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=i.y,{chartRect:o}=n;this.applyLineStyle(e,t.style),this.strokeHorizontal(e,i.x,o.x+o.width,a),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=H(11),e.textBaseline=`bottom`,U(e,W(t.anchors[0].price,t.anchors[0].price,n),i.x+4,a-3),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r&&e.x>=i.x-r&&e.x<=n.chartRect.x+n.chartRect.width}},_s=class extends K{descriptor={type:`verticalLine`,name:`Vertical Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style),this.strokeVertical(e,i.x,a.y,a.y+a.height),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;return Math.abs(e.x-i.x)<=r&&e.y>=a.y&&e.y<=a.y+a.height}},vs=class extends K{descriptor={type:`ray`,name:`Ray`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x+s/l*u,f=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(d,f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<2)return null;let r=this.linePriceAt(e.anchors[0],e.anchors[1],t,!1,!0,ko(n));return r===null?null:[r]}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;return((e.x-i.x)*o+(e.y-i.y)*s)/(o*o+s*s)<0?!1:this.distanceToInfiniteLine(e,i,a)<=r}},ys=class extends K{descriptor={type:`extendedLine`,name:`Extended Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x-s/l*u,f=i.y-c/l*u,p=i.x+s/l*u,m=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(d,f),e.lineTo(p,m),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<2)return null;let r=this.linePriceAt(e.anchors[0],e.anchors[1],t,!0,!0,ko(n));return r===null?null:[r]}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToInfiniteLine(e,i,a)<=r}},bs=class extends K{descriptor={type:`parallelChannel`,name:`Parallel Channel`,requiredAnchors:3,fill:!0,options:{...fs(),middleLine:{kind:`boolean`,label:`Middle line`,default:!1}}};lines(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t),i=this.option(e,`extendLeft`),a=this.option(e,`extendRight`),o=this.extendLine(n,r,t,i,a);if(e.anchors.length<3)return{base:o,parallel:null,middle:null,corners:null};let s=this.anchorToPixel(e.anchors[2],t),c=r.x-n.x,l=r.y-n.y,u=Math.hypot(c,l)||1,d=-l/u,f=c/u,p=(s.x-n.x)*d+(s.y-n.y)*f,m=(e,t)=>({x:e.x+d*p*t,y:e.y+f*p*t}),h=m(n,1),g=m(r,1);return{base:o,parallel:this.extendLine(h,g,t,i,a),middle:this.option(e,`middleLine`)?this.extendLine(m(n,.5),m(r,.5),t,i,a):null,corners:[n,r,g,h]}}render(e,t,n,r){if(t.anchors.length<2)return;let{base:i,parallel:a,middle:o,corners:s}=this.lines(t,n);this.applyLineStyle(e,t.style);for(let t of[i,a])t&&(e.beginPath(),e.moveTo(t[0].x,t[0].y),e.lineTo(t[1].x,t[1].y),e.stroke());if(o&&(e.setLineDash([4,4]),e.beginPath(),e.moveTo(o[0].x,o[0].y),e.lineTo(o[1].x,o[1].y),e.stroke()),s&&t.style.fillColor){e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(s[0].x,s[0].y);for(let t of s.slice(1))e.lineTo(t.x,t.y);e.closePath(),e.fill()}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<3)return null;let[r,i,a]=e.anchors,o=ko(n),s=this.lineValueAt(r,i,t,this.option(e,`extendLeft`),this.option(e,`extendRight`),o),c=this.lineValueAt(r,i,a.time,!0,!0,o);if(s===null||c===null)return null;let l=o.value(a.price)-c,u=[s,s+l];return this.option(e,`middleLine`)&&u.push(s+l/2),u.map(o.price)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{base:i,parallel:a,middle:o}=this.lines(t,n);return[i,a,o].some(t=>t!==null&&this.distanceToLine(e,t[0],t[1])<=r)}},xs=class extends K{descriptor={type:`regressionChannel`,name:`Regression Channel`,requiredAnchors:2,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=a.x-i.x,s=a.y-i.y,c=Math.hypot(o,s);if(c===0){this.resetLineStyle(e);return}let l=Math.max(10,Math.min(c*.2,100)),u=-s/c*l,d=o/c*l;e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.stroke(),e.beginPath(),e.moveTo(i.x-u,i.y-d),e.lineTo(a.x-u,a.y-d),e.stroke(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.lineTo(a.x-u,a.y-d),e.lineTo(i.x-u,i.y-d),e.closePath(),e.fill()),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.hypot(a.x-i.x,a.y-i.y),s=Math.max(10,Math.min(o*.2,100));return this.distanceToLine(e,i,a)<=r+s}};function Ss(e,t,n,r,i=e=>e.toFixed(2)){let a=`${(e*100).toFixed(1)}%`,o=i(t);return n&&r?`${a} (${o})`:n?a:r?o:``}function Cs(t,n,r,i,a,o){let s=a.x1-a.x0;if(a.background&&i.length>1){let o=[...i].sort((e,t)=>e.level.value-t.level.value);for(let i=0;i<o.length-1;i++){let c=e.w(o[i].price,r),l=e.w(o[i+1].price,r),u=o[i+1].level.color,d=u??n.style.fillColor;d&&(t.fillStyle=d,t.globalAlpha=u?.07:.05+i*.02,t.fillRect(a.x0,Math.min(c,l),s,Math.abs(l-c)))}t.globalAlpha=1}t.font=H(11),t.textBaseline=`bottom`,t.textAlign=a.labelPosition===`right`?`right`:`left`;let c=a.labelPosition===`right`?a.x1-4:a.x0+4;for(let{level:s,price:l}of i){let i=e.w(l,r),u=s.color??n.style.color;o(u),t.globalAlpha=s.value===0||s.value===1?1:.8;let d=e._(t,i,Number(t.lineWidth)||1);t.lineWidth=d.width,t.beginPath(),t.moveTo(a.x0,d.y),t.lineTo(a.x1,d.y),t.stroke();let f=Ss(s.value,l,a.showLevels,a.showPrices,e=>W(e,e,r));f&&(t.globalAlpha=1,t.fillStyle=u,U(t,f,c,i-3))}t.globalAlpha=1}function ws(t,n,r,i,a,o){return t.x<i-o||t.x>a+o?!1:r.some(({price:r})=>Math.abs(t.y-e.w(r,n))<=o)}var Ts=us([0,.236,.382,.5,.618,.786,1],[1.272,1.414,1.618,2.618,3.618,4.236]),Es=class extends K{descriptor={type:`fibRetracement`,name:`Fibonacci Retracement`,requiredAnchors:2,fill:!0,options:{levels:{kind:`levels`,label:`Levels`,default:Ts},...fs(!0,!0),reverse:{kind:`boolean`,label:`Reverse`,default:!1},...ps,background:{kind:`boolean`,label:`Background`,default:!0}}};levels(e){let t=this.option(e,`reverse`),n=e.anchors[+!!t].price,r=e.anchors[+!t].price;return this.visibleLevels(e).map(e=>({level:e,price:n+(r-n)*e.value}))}span(e,t){let{chartRect:n}=t,r=this.anchorToPixel(e.anchors[0],t).x,i=this.anchorToPixel(e.anchors[1],t).x;return[this.option(e,`extendLeft`)?n.x:Math.min(r,i),this.option(e,`extendRight`)?n.x+n.width:Math.max(r,i)]}render(e,t,n,r){if(t.anchors.length<2)return;let[i,a]=this.span(t,n);Cs(e,t,n,this.levels(t),{x0:i,x1:a,showLevels:this.option(t,`showLevels`),showPrices:this.option(t,`showPrices`),labelPosition:this.option(t,`labelPosition`),background:this.option(t,`background`)},n=>this.applyLineStyle(e,{...t.style,color:n})),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let[i,a]=this.span(t,n);return ws(e,n,this.levels(t),i,a,r)}},Ds=us([0,.618,1,1.618,2,2.618,3.618,4.236],[.382,.5,.786,1.272,1.414]),Os=class extends K{descriptor={type:`fibExtension`,name:`Fibonacci Extension`,requiredAnchors:3,fill:!0,options:{levels:{kind:`levels`,label:`Levels`,default:Ds},...fs(!0,!0),...ps,background:{kind:`boolean`,label:`Background`,default:!1}}};levels(e){let t=e.anchors[1].price-e.anchors[0].price,n=e.anchors[2].price;return this.visibleLevels(e).map(e=>({level:e,price:n+t*e.value}))}span(e,t){let{chartRect:n}=t,r=e.anchors.map(e=>this.anchorToPixel(e,t).x);return[this.option(e,`extendLeft`)?n.x:Math.min(...r),this.option(e,`extendRight`)?n.x+n.width:Math.max(...r)]}render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let[i,a]=this.span(t,n);Cs(e,t,n,this.levels(t),{x0:i,x1:a,showLevels:this.option(t,`showLevels`),showPrices:this.option(t,`showPrices`),labelPosition:this.option(t,`labelPosition`),background:this.option(t,`background`)},n=>this.applyLineStyle(e,{...t.style,color:n})),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let[i,a]=this.span(t,n);return ws(e,n,this.levels(t),i,a,r)}},ks=class extends K{descriptor={type:`rectangle`,name:`Rectangle`,requiredAnchors:2,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y);t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fillRect(o,s,c,l)),this.applyLineStyle(e,t.style),e.strokeRect(o,s,c,l),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.min(i.y,a.y)-r,c=Math.max(i.x,a.x)+r,l=Math.max(i.y,a.y)+r;if(e.x<o||e.x>c||e.y<s||e.y>l)return!1;let u=Math.min(i.x,a.x)+r,d=Math.min(i.y,a.y)+r,f=Math.max(i.x,a.x)-r,p=Math.max(i.y,a.y)-r;return!(e.x>u&&e.x<f&&e.y>d&&e.y<p)||!!t.style.fillColor}},As=class extends K{descriptor={type:`ellipse`,name:`Ellipse`,requiredAnchors:2,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.abs(a.x-i.x)/2,l=Math.abs(a.y-i.y)/2;e.beginPath(),e.ellipse(o,s,Math.max(c,1),Math.max(l,1),0,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.max(Math.abs(a.x-i.x)/2,1),l=Math.max(Math.abs(a.y-i.y)/2,1),u=(e.x-o)/c,d=(e.y-s)/l,f=Math.sqrt(u*u+d*d),p=r/Math.max(Math.min(c,l),4);return t.style.fillColor?f<=1+p:Math.abs(f-1)<=p}},js=class extends K{descriptor={type:`triangle`,name:`Triangle`,requiredAnchors:3,fill:!0};render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=t.anchors.map(e=>this.anchorToPixel(e,n));e.beginPath(),e.moveTo(i[0].x,i[0].y),e.lineTo(i[1].x,i[1].y),e.lineTo(i[2].x,i[2].y),e.closePath(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<3;t++){let n=(t+1)%3;if(this.distanceToLine(e,i[t],i[n])<=r)return!0}return!1}},Ms=class extends K{descriptor={type:`pitchfork`,name:`Andrews' Pitchfork`,requiredAnchors:3};origin(e,t){return e}render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n),s=this.origin(i,a),c={x:(a.x+o.x)/2,y:(a.y+o.y)/2};(s.x!==i.x||s.y!==i.y)&&(e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(s.x,s.y),e.stroke(),e.setLineDash([]));let l=c.x-s.x,u=c.y-s.y,d=Math.hypot(l,u)||1,f=Math.hypot(n.chartRect.width,n.chartRect.height),p=s.x+l/d*f,m=s.y+u/d*f;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(p,m),e.stroke(),e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x+l/d*f,a.y+u/d*f),e.stroke(),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(o.x+l/d*f,o.y+u/d*f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[1],n),a=this.anchorToPixel(t.anchors[2],n),o=this.origin(this.anchorToPixel(t.anchors[0],n),i),s={x:(i.x+a.x)/2,y:(i.y+a.y)/2};if(this.distanceToInfiniteLine(e,o,s)<=r)return!0;let c=s.x-o.x,l=s.y-o.y,u={x:i.x+c,y:i.y+l},d={x:a.x+c,y:a.y+l};return this.distanceToInfiniteLine(e,i,u)<=r||this.distanceToInfiniteLine(e,a,d)<=r}},Ns=class extends Ms{descriptor={type:`schiffPitchfork`,name:`Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:e.x,y:(e.y+t.y)/2}}},Ps=class extends Ms{descriptor={type:`modifiedSchiffPitchfork`,name:`Modified Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}},Fs=[`0`,`i`,`ii`,`iii`,`iv`,`v`];function Is(e,t){let n=/^[0-9]$/.test(e);switch(t){case`primary`:return n?e===`0`?`⓪`:String.fromCodePoint(9312+Number(e)-1):/^[A-Z]$/.test(e)?String.fromCodePoint(9398+e.charCodeAt(0)-65):e;case`intermediate`:return`(${e})`;case`minute`:return n?Fs[Number(e)]??e:e.toLowerCase();default:return e}}var Ls={degree:{kind:`choice`,label:`Degree`,default:`minor`,choices:[{value:`primary`,label:`Primary`},{value:`intermediate`,label:`Intermediate`},{value:`minor`,label:`Minor`},{value:`minute`,label:`Minute`}]}},Rs=class extends K{render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));this.applyLineStyle(e,t.style),e.beginPath(),i.forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),e.stroke(),this.resetLineStyle(e);let a=this.option(t,`degree`);e.font=H(12,`bold`),e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<i.length&&t<this.labels.length;t++){let n=i[t-1]??i[t+1],r=i[t+1]??i[t-1],o=i[t].y<=Math.min(n.y,r.y);e.textBaseline=o?`bottom`:`top`,U(e,Is(this.labels[t],a),i[t].x,i[t].y+(o?-6:6))}r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:Ao(e,t.anchors.map(e=>this.anchorToPixel(e,n)),r)}},zs=class extends Rs{descriptor={type:`elliottWave`,name:`Elliott Wave`,requiredAnchors:8,options:Ls};labels=[`1`,`2`,`3`,`4`,`5`,`A`,`B`,`C`]},Bs=class extends Rs{descriptor={type:`elliottImpulse`,name:`Elliott Impulse Wave`,requiredAnchors:6,options:Ls};labels=[`0`,`1`,`2`,`3`,`4`,`5`]},Vs=class extends Rs{descriptor={type:`elliottCorrection`,name:`Elliott Correction Wave`,requiredAnchors:4,options:Ls};labels=[`0`,`A`,`B`,`C`]},Hs=class extends Rs{descriptor={type:`elliottTriangle`,name:`Elliott Triangle Wave`,requiredAnchors:6,options:Ls};labels=[`0`,`A`,`B`,`C`,`D`,`E`]},Us=class extends Rs{descriptor={type:`elliottDoubleCombo`,name:`Elliott Double Combo Wave`,requiredAnchors:4,options:Ls};labels=[`0`,`W`,`X`,`Y`]},Ws=class extends Rs{descriptor={type:`elliottTripleCombo`,name:`Elliott Triple Combo Wave`,requiredAnchors:6,options:Ls};labels=[`0`,`W`,`X`,`Y`,`X`,`Z`]},Gs=class extends K{descriptor={type:`priceRange`,name:`Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.abs(a.x-i.x),c=Math.min(i.y,a.y),l=Math.abs(a.y-i.y),u=t.anchors[1].price>t.anchors[0].price;e.fillStyle=u?`rgba(31, 168, 116, 0.15)`:`rgba(232, 80, 91, 0.15)`,e.fillRect(o,c,s,l),this.applyLineStyle(e,t.style),e.strokeRect(o,c,s,l),this.resetLineStyle(e);let d=xo(t.anchors[0].price,t.anchors[1].price,n);e.font=H(12),e.fillStyle=u?`#1fa874`:`#e8505b`,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(d,o+s/2,c+l/2),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return e.x>=o-r&&e.x<=s+r&&e.y>=c-r&&e.y<=l+r}},Ks=class extends K{descriptor={type:`dateRange`,name:`Date Range`,requiredAnchors:2};render(t,n,r,i){if(n.anchors.length<2)return;let a=this.anchorToPixel(n.anchors[0],r),o=this.anchorToPixel(n.anchors[1],r),{chartRect:s}=r,c=Math.min(a.x,o.x),l=Math.max(a.x,o.x);t.fillStyle=`rgba(76, 141, 255, 0.08)`,t.fillRect(c,s.y,l-c,s.height),this.applyLineStyle(t,n.style),t.beginPath(),t.moveTo(c,s.y),t.lineTo(c,s.y+s.height),t.stroke(),t.beginPath(),t.moveTo(l,s.y),t.lineTo(l,s.y+s.height),t.stroke(),this.resetLineStyle(t);let u=e.E(n.anchors[0].time,r),d=e.E(n.anchors[1].time,r),f=Math.max(0,Math.round(Math.abs(d-u)));t.font=H(12),t.fillStyle=n.style.color,t.textAlign=`center`,t.textBaseline=`top`,t.fillText(`${f} bars`,(c+l)/2,s.y+4),i&&this.renderAnchorHandles(t,n,r)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=Math.min(i.x,a.x),c=Math.max(i.x,a.x);return e.x>=s-r&&e.x<=c+r&&e.y>=o.y&&e.y<=o.y+o.height}},qs=class extends K{descriptor={type:`measure`,name:`Measure`,requiredAnchors:2};render(t,n,r,i){if(n.anchors.length<2)return;let a=this.anchorToPixel(n.anchors[0],r),o=this.anchorToPixel(n.anchors[1],r);this.applyLineStyle(t,n.style),t.setLineDash([4,4]),t.beginPath(),t.moveTo(a.x,a.y),t.lineTo(o.x,o.y),t.stroke(),this.resetLineStyle(t);let s=e.E(n.anchors[0].time,r),c=e.E(n.anchors[1].time,r),l=Math.max(0,Math.round(Math.abs(c-s))),u=[`Price: ${xo(n.anchors[0].price,n.anchors[1].price,r)}`,`Bars: ${l}`],d=(a.x+o.x)/2,f=(a.y+o.y)/2;t.font=H(11),t.textAlign=`center`,t.textBaseline=`bottom`;let p=Math.max(...u.map(e=>t.measureText(e).width));t.fillStyle=`rgba(0, 0, 0, 0.7)`,t.fillRect(d-p/2-6,f-u.length*14-4,p+12,u.length*14+8),t.fillStyle=`#FFFFFF`;for(let e=0;e<u.length;e++)t.fillText(u[e],d,f-(u.length-1-e)*14);i&&this.renderAnchorHandles(t,n,r)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}};function Js(e,t=`Text`){if(typeof e.style.text==`string`&&e.style.text.length>0)return e.style.text;let n=e.meta?.text;return typeof n==`string`&&n.length>0?n:t}var Ys=class extends K{descriptor={type:`text`,name:`Text`,requiredAnchors:1,text:!0};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=Js(t),o=t.style.fontSize||14;if(e.font=`${o}px ${co()}`,e.fillStyle=t.style.color,e.textAlign=`left`,e.textBaseline=`top`,r){let n=e.measureText(a);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.strokeRect(i.x-2,i.y-2,n.width+4,o+4),e.setLineDash([])}e.fillText(a,i.x,i.y),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=t.style.fontSize||14;return e.x>=i.x-r&&e.x<=i.x+80+r&&e.y>=i.y-r&&e.y<=i.y+a+r}},Xs=class extends K{descriptor={type:`arrow`,name:`Arrow`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=Math.atan2(a.y-i.y,a.x-i.x);e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x-12*Math.cos(o-Math.PI/6),a.y-12*Math.sin(o-Math.PI/6)),e.lineTo(a.x-12*Math.cos(o+Math.PI/6),a.y-12*Math.sin(o+Math.PI/6)),e.closePath(),e.fillStyle=t.style.color,e.fill(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Zs=[{label:`8x1`,ratio:8},{label:`4x1`,ratio:4},{label:`3x1`,ratio:3},{label:`2x1`,ratio:2},{label:`1x1`,ratio:1},{label:`1x2`,ratio:.5},{label:`1x3`,ratio:1/3},{label:`1x4`,ratio:.25},{label:`1x8`,ratio:.125}],Qs=class extends K{descriptor={type:`gannFan`,name:`Gann Fan`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;this.applyLineStyle(e,t.style);for(let{label:n,ratio:r}of Zs){let a=c*r,o=d,s=i.y+a*(o-i.x);e.globalAlpha=r===1?1:.5,e.lineWidth=r===1?t.style.lineWidth:Math.max(.5,t.style.lineWidth*.7),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o,s),e.stroke();let f=o-l*4,p=s;p>u.y&&p<u.y+u.height&&(e.globalAlpha=.7,e.fillStyle=t.style.color,e.font=H(9),e.textAlign=l>0?`right`:`left`,e.textBaseline=`bottom`,U(e,n,f,p-2))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return!1;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;for(let{ratio:t}of Zs){let n=c*t,a=d,o=i.y+n*(a-i.x);if(this.distanceToLine(e,i,{x:a,y:o})<=r)return!0}return!1}},$s=[0,.25,.333,.5,.667,.75,1],ec=class extends K{descriptor={type:`gannBox`,name:`Gann Box`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y),u=s-o,d=l-c;if(!(u<2||d<2)){this.applyLineStyle(e,t.style),e.strokeRect(o,c,u,d),e.save(),e.globalAlpha=.35;for(let t of $s){if(t===0||t===1)continue;let n=c+d*t;e.beginPath(),e.moveTo(o,n),e.lineTo(s,n),e.stroke()}for(let t of $s){if(t===0||t===1)continue;let n=o+u*t;e.beginPath(),e.moveTo(n,c),e.lineTo(n,l),e.stroke()}e.globalAlpha=.5,e.setLineDash([4,3]),e.beginPath(),e.moveTo(o,c),e.lineTo(s,l),e.stroke(),e.beginPath(),e.moveTo(s,c),e.lineTo(o,l),e.stroke(),e.restore(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=H(8),e.globalAlpha=.6,e.textBaseline=`bottom`,e.textAlign=`right`;for(let t of $s){if(t===0||t===1)continue;let n=c+d*t;e.fillText(`${(t*100).toFixed(0)}%`,o-3,n)}e.globalAlpha=1,r&&this.renderAnchorHandles(e,t,n)}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return Math.abs(e.x-o)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.x-s)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.y-c)<=r&&e.x>=o-r&&e.x<=s+r||Math.abs(e.y-l)<=r&&e.x>=o-r&&e.x<=s+r||this.distanceToLine(e,{x:o,y:c},{x:s,y:l})<=r||this.distanceToLine(e,{x:s,y:c},{x:o,y:l})<=r}},tc=class extends K{descriptor={type:`anchoredVWAP`,name:`Anchored VWAP`,requiredAnchors:1};dataGetter=null;showBands=!0;setDataGetter(e){this.dataGetter=e}setShowBands(e){this.showBands=e}render(t,n,r,i){if(n.anchors.length<1||!this.dataGetter)return;let a=this.dataGetter(),o=Math.max(0,Math.round(e.E(n.anchors[0].time,r)));if(o>=a.length)return;let{vwap:s,upper1:c,lower1:l,upper2:u,lower2:d}=this.computeVWAP(a,o),{chartRect:f}=r,p=r.barWidth+r.barSpacing;if(this.applyLineStyle(t,n.style),t.lineWidth=n.style.lineWidth+.5,this.drawLine(t,s,o,r,f,p),this.showBands&&s.length>1&&(t.globalAlpha=.4,t.lineWidth=Math.max(.5,n.style.lineWidth*.6),t.setLineDash([4,3]),this.drawLine(t,c,o,r,f,p),this.drawLine(t,l,o,r,f,p),t.globalAlpha=.25,this.drawLine(t,u,o,r,f,p),this.drawLine(t,d,o,r,f,p),t.globalAlpha=1),this.resetLineStyle(t),s.length>0){let i=s[s.length-1],a=e.b(o+s.length-1,r),c=e.w(i,r);a>=f.x&&a<=f.x+f.width&&(t.fillStyle=n.style.color,t.font=H(9,`bold`),t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(`AVWAP ${W(i,i,r)}`,a+6,c))}i&&this.renderAnchorHandles(t,n,r)}drawLine(t,n,r,i,a,o){t.beginPath();let s=!1;for(let c=0;c<n.length;c++){let l=e.b(r+c,i);if(l<a.x-o)continue;if(l>a.x+a.width+o)break;let u=e.w(n[c],i);s?t.lineTo(l,u):(t.moveTo(l,u),s=!0)}t.stroke()}vwapCache=null;computeVWAP(e,t){let n=e[e.length-1],r=this.vwapCache;if(r&&r.data===e&&r.length===e.length&&r.startIdx===t&&r.lastClose===n?.close&&r.lastVolume===(n?.volume??0))return r.result;let i=this.computeVWAPUncached(e,t);return this.vwapCache={data:e,length:e.length,startIdx:t,lastClose:n?.close,lastVolume:n?.volume??0,result:i},i}computeVWAPUncached(e,t){let n=e.length-t,r=Array(n),i=Array(n),a=Array(n),o=Array(n),s=Array(n),c=0,l=0,u=0;for(let d=0;d<n;d++){let n=e[t+d],f=(n.high+n.low+n.close)/3,p=n.volume??1;c+=f*p,l+=p,u+=f*f*p;let m=l>0?c/l:f;r[d]=m;let h=l>0?u/l-m*m:0,g=Math.sqrt(Math.max(0,h));i[d]=m+g,a[d]=m-g,o[d]=m+2*g,s[d]=m-2*g}return{vwap:r,upper1:i,lower1:a,upper2:o,lower2:s}}hitTest(t,n,r,i){if(n.anchors.length<1||!this.dataGetter)return!1;let a=this.dataGetter(),o=Math.max(0,Math.round(e.E(n.anchors[0].time,r)));if(o>=a.length)return!1;let{vwap:s}=this.computeVWAP(a,o);for(let n=1;n<s.length;n++){let a=e.b(o+n-1,r),c=e.w(s[n-1],r),l=e.b(o+n,r),u=e.w(s[n],r);if(this.distanceToLine(t,{x:a,y:c},{x:l,y:u})<=i)return!0}return!1}},nc=class extends K{descriptor={type:`volumeProfileRange`,name:`Volume Profile (Range)`,requiredAnchors:2,fill:!0};dataGetter=null;numBins=40;setDataGetter(e){this.dataGetter=e}render(t,n,r,i){if(n.anchors.length<2||!this.dataGetter)return;let a=this.dataGetter(),o=Math.round(e.E(n.anchors[0].time,r)),s=Math.round(e.E(n.anchors[1].time,r)),c=Math.max(0,Math.min(o,s)),l=Math.min(a.length-1,Math.max(o,s));if(c>=a.length||l<0||c>l)return;let u=1/0,d=-1/0;for(let e=c;e<=l;e++)a[e].low<u&&(u=a[e].low),a[e].high>d&&(d=a[e].high);if(u>=d)return;let f=(d-u)/this.numBins,p=new Float64Array(this.numBins),m=0;for(let e=c;e<=l;e++){let t=a[e],n=t.volume??1,r=Math.max(0,Math.floor((t.low-u)/f)),i=Math.min(this.numBins-1,Math.floor((t.high-u)/f)),o=n/(i-r+1);for(let e=r;e<=i;e++)p[e]+=o,p[e]>m&&(m=p[e])}if(m===0)return;let h=0;for(let e=1;e<this.numBins;e++)p[e]>p[h]&&(h=e);let g=e.b(l,r)+r.barWidth,_=n.style.color,v=n.style.fillColor??`#f2a93b`;t.save();for(let n=0;n<this.numBins;n++){let i=p[n]/m*100,a=u+(n+1)*f,o=u+n*f,s=e.w(a,r),c=e.w(o,r),l=Math.abs(c-s);t.globalAlpha=.35,t.fillStyle=n===h?v:_,t.fillRect(g,Math.min(s,c),i,Math.max(1,l-.5))}let y=u+(h+.5)*f,b=e.w(y,r);t.globalAlpha=.7,t.strokeStyle=v,t.lineWidth=1,t.setLineDash([4,3]),t.beginPath();let x=e.b(c,r)-r.barWidth/2;t.moveTo(x,b),t.lineTo(g+100,b),t.stroke(),t.fillStyle=v,t.font=H(9),t.textAlign=`left`,t.textBaseline=`bottom`,t.globalAlpha=.8,t.fillText(`POC ${W(y,y,r)}`,g+100+4,b-2),t.restore(),i&&this.renderAnchorHandles(t,n,r)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.max(i.x,a.x)+100+r,c=Math.min(i.y,a.y)-r,l=Math.max(i.y,a.y)+r;return e.x>=o&&e.x<=s&&e.y>=c&&e.y<=l}},rc=[1,2,3,5,8,13,21,34,55],ic=class extends K{descriptor={type:`fibTimeZones`,name:`Fibonacci Time Zones`,requiredAnchors:2,options:{levels:{kind:`levels`,label:`Levels`,default:ds(rc,[0,89,144])}}};render(t,n,r,i){if(n.anchors.length<2)return;let a=n.anchors[0],o=n.anchors[1].time-a.time;if(o===0)return;let{chartRect:s}=r;t.font=H(11),t.textBaseline=`top`,t.textAlign=`center`;for(let{value:i,color:c}of this.visibleLevels(n)){this.applyLineStyle(t,{...n.style,color:c??n.style.color});let l=e.D(a.time+o*i,r);l<s.x||l>s.x+s.width||(t.globalAlpha=i===1?1:.55,t.beginPath(),t.moveTo(l,s.y),t.lineTo(l,s.y+s.height),t.stroke(),t.fillStyle=c??n.style.color,U(t,String(i),l,s.y+2))}t.globalAlpha=1,this.resetLineStyle(t),i&&this.renderAnchorHandles(t,n,r)}hitTest(t,n,r,i){if(n.anchors.length<2)return!1;let a=n.anchors[0],o=n.anchors[1].time-a.time;if(o===0)return!1;let{chartRect:s}=r;if(t.y<s.y||t.y>s.y+s.height)return!1;for(let{value:s}of this.visibleLevels(n)){let n=e.D(a.time+o*s,r);if(Math.abs(t.x-n)<=i)return!0}return!1}},ac=40,oc=2,sc=.1,cc=100,lc=0x38d7ea4c68000,uc=class extends K{descriptor={type:`riskReward`,name:`Long/Short Position`,requiredAnchors:2,options:{rewardRatio:{kind:`number`,label:`Reward:risk`,default:2,min:sc,max:cc,step:.1},accountSize:{kind:`number`,label:`Account size`,default:1e3,min:0,max:lc},riskMode:{kind:`choice`,label:`Risk as`,default:`percent`,choices:[{value:`percent`,label:`Percent of account`},{value:`amount`,label:`Amount`}]},risk:{kind:`number`,label:`Risk`,default:1,min:0,max:lc},qtyDecimals:{kind:`number`,label:`Quantity decimals`,default:2,min:0,max:8,step:1},showLabels:{kind:`boolean`,label:`Show labels`,default:!0}}};geometry(e){let t=e.anchors[0].price,n=e.anchors[1].price,r=this.option(e,`rewardRatio`),i=Math.abs(t-n),a=n<t,o=a?t+i*r:t-i*r,s=this.option(e,`risk`),c=this.option(e,`riskMode`)===`amount`?s:this.option(e,`accountSize`)*s/100,l=i>0?c/i:0;return{entry:t,stop:n,target:o,ratio:r,isLong:a,qty:l,riskAmount:c,rewardAmount:l*i*r}}span(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return{x:Math.min(n.x,r.x),width:Math.max(Math.abs(r.x-n.x),ac),stopX:r.x}}handles(e,t){let{target:n}=this.geometry(e),r=this.anchorToPixel(e.anchors[0],t),i=this.anchorToPixel(e.anchors[1],t),a=this.anchorToPixel({time:e.anchors[1].time,price:n},t).y;return[r,i,{x:i.x,y:a}]}render(e,n,r,i){if(n.anchors.length<2)return;let a=this.geometry(n),{x:o,width:s}=this.span(n,r),[c,l,u]=this.handles(n,r);e.fillStyle=`rgba(232, 80, 91, 0.18)`,e.fillRect(o,Math.min(c.y,l.y),s,Math.abs(l.y-c.y)),e.fillStyle=`rgba(31, 168, 116, 0.18)`,e.fillRect(o,Math.min(c.y,u.y),s,Math.abs(u.y-c.y)),e.strokeStyle=n.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(o,c.y),e.lineTo(o+s,c.y),e.stroke();let{chartRect:d}=r,f=d.x,p=d.x+d.width;if(this.option(n,`showLabels`)&&o+s>=f&&o<=p){let i=(0,t.autoPricePrecision)(Math.min(a.stop,a.target),Math.max(a.stop,a.target)),s=this.option(n,`qtyDecimals`),m=e=>(a.entry===0?0:(e-a.entry)/a.entry*100).toFixed(2),h=Number(a.ratio.toFixed(2));e.font=H(11);let g=e=>r.formatPrice?.(e)??e.toFixed(i),_=e=>`${e>=a.entry?`+`:`−`}${Math.abs(Number(m(e))).toFixed(2)}%`,v=e=>{let t=e<c.y,n=e+(t?-1:1)*11,r=t?Math.min(n,c.y-20):Math.max(n,c.y+20);return Math.min(Math.max(r,d.y+9),d.y+d.height-9)},y=(t,n,r)=>{uo(e,t,Math.max(f+4,Math.min(o+4,p-4-lo(e,t))),n,r)};y(`${a.isLong?`Long`:`Short`} · Qty ${a.qty.toFixed(s)} · R:R ${h}`,c.y,n.style.color),Math.abs(l.y-c.y)>=1&&(y(`Target ${g(a.target)} (${_(a.target)}) · ${a.rewardAmount.toFixed(2)}`,v(u.y),`#1fa874`),y(`Stop ${g(a.stop)} (${_(a.stop)}) · ${a.riskAmount.toFixed(2)}`,v(l.y),`#e8505b`))}i&&this.renderHandles(e,n,r)}renderHandles(e,t,n){e.fillStyle=`#FFFFFF`,e.strokeStyle=t.style.color,e.lineWidth=1;for(let r of this.handles(t,n))e.fillRect(r.x-4,r.y-4,8,8),e.strokeRect(r.x-4,r.y-4,8,8)}hitTestAnchor(e,t,n,r){return t.anchors.length<2?super.hitTestAnchor(e,t,n,r):this.handles(t,n).findIndex(t=>Math.hypot(e.x-t.x,e.y-t.y)<=r)}moveHandle(e,t,n){if(t!==oc){let r=e.anchors.map((e,r)=>r===t?{...n}:{...e});return{...e,anchors:r}}let{entry:r,isLong:i}=this.geometry(e),a=Math.abs(r-e.anchors[1].price),o=i?n.price-r:r-n.price,s=a>0?Math.min(cc,Math.max(sc,o/a)):sc;return{...e,options:{...e.options,rewardRatio:Math.round(s*100)/100}}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{x:i,width:a}=this.span(t,n),o=this.handles(t,n).map(e=>e.y);return e.x>=i-r&&e.x<=i+a+r&&e.y>=Math.min(...o)-r&&e.y<=Math.max(...o)+r}},dc=class extends K{descriptor={type:`crossLine`,name:`Cross Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style);let o=e.lineWidth;this.strokeHorizontal(e,a.x,a.x+a.width,i.y),e.lineWidth=o,this.strokeVertical(e,i.x,a.y,a.y+a.height),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r||Math.abs(e.x-i.x)<=r}},fc=28,pc=48;function mc(e,t){return Math.atan2(e.y-t.y,t.x-e.x)*180/Math.PI}var hc=class extends K{descriptor={type:`trendAngle`,name:`Trend Angle`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=mc(i,a),s=a.x>=i.x?1:-1;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(i.x+s*pc,i.y),e.stroke(),e.setLineDash([]);let c=Math.atan2(a.y-i.y,a.x-i.x),l=s>0?0:Math.PI;s<0&&c<0&&(c+=2*Math.PI),e.beginPath(),e.arc(i.x,i.y,fc,Math.min(l,c),Math.max(l,c)),e.stroke(),e.font=H(11),e.fillStyle=t.style.color,e.textAlign=s>0?`left`:`right`,e.textBaseline=`middle`,U(e,`${o.toFixed(1)}°`,i.x+s*(fc+6),i.y+(o>=0?-8:8)),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}};function gc(e,t,n){let r=To(e,0,1,t),i=wo(e,0,1,t);return[xo(e.anchors[0].price,e.anchors[1].price,t),r?`${i} bars, ${r}`:`${i} bars`,`${n.toFixed(1)}°`]}var _c=class extends K{descriptor={type:`infoLine`,name:`Info Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);let o=gc(t,n,mc(i,a)),s=a.y<=i.y;Eo(e,o,a.x+(a.x>=i.x?8:-8),a.y+(s?-6:6),a.x>=i.x?`left`:`right`,s),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},vc=[0,.236,.382,.5,.618,.786,1,1.618];function yc(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=r*r+i*i;if(a===0)return{x:n.x-e.x,y:n.y-e.y};let o=((n.x-e.x)*r+(n.y-e.y)*i)/a;return{x:n.x-(e.x+o*r),y:n.y-(e.y+o*i)}}function bc(e,t,n,r){let i=yc(e,t,n);return[{x:e.x+i.x*r,y:e.y+i.y*r},{x:t.x+i.x*r,y:t.y+i.y*r}]}var xc=class extends K{descriptor={type:`fibChannel`,name:`Fibonacci Channel`,requiredAnchors:3,options:{levels:{kind:`levels`,label:`Levels`,default:us(vc,[2.618,3.618,4.236])}}};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(t.anchors.length<3){this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);return}let o=this.anchorToPixel(t.anchors[2],n);e.font=H(11),e.textAlign=`right`,e.textBaseline=`middle`;for(let{value:n,color:r}of this.visibleLevels(t)){let[s,c]=bc(i,a,o,n);this.applyLineStyle(e,{...t.style,color:r??t.style.color}),e.globalAlpha=n===0||n===1?1:.6,e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(c.x,c.y),e.stroke(),e.fillStyle=r??t.style.color;let l=s.x<=c.x?s:c;U(e,String(n),l.x-4,l.y)}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n);for(let{value:n}of this.visibleLevels(t)){let[t,s]=bc(i,a,o,n);if(this.distanceToLine(e,t,s)<=r)return!0}return!1}},Sc=[.25,.382,.5,.618,.75];function Cc(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.hypot(r,i);if(a===0)return null;let o=(n.chartRect.width+n.chartRect.height)*2;return{x:e.x+r/a*o,y:e.y+i/a*o}}function wc(e,t,n=Sc){let r=[{level:1,kind:`diagonal`,point:t}];for(let i of n)r.push({level:i,kind:`price`,point:{x:t.x,y:e.y+(t.y-e.y)*i}}),r.push({level:i,kind:`time`,point:{x:e.x+(t.x-e.x)*i,y:t.y}});return r}var Tc=class extends K{descriptor={type:`fibSpeedResistanceFan`,name:`Fib Speed Resistance Fan`,requiredAnchors:2,options:{levels:{kind:`levels`,label:`Levels`,default:us(Sc,[.236,.786])}}};targets(e,t,n){return wc(t,n,this.visibleLevels(e).map(e=>e.value))}render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.25,e.strokeRect(Math.min(i.x,a.x),Math.min(i.y,a.y),Math.abs(a.x-i.x),Math.abs(a.y-i.y)),e.globalAlpha=1,e.font=H(11),e.textBaseline=`middle`;for(let r of this.targets(t,i,a)){let o=Cc(i,r.point,n);o&&(this.applyLineStyle(e,t.style),e.globalAlpha=r.kind===`diagonal`?1:.65,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o.x,o.y),e.stroke(),r.kind===`price`&&(e.fillStyle=t.style.color,e.textAlign=a.x>=i.x?`left`:`right`,U(e,String(r.level),r.point.x+(a.x>=i.x?4:-4),r.point.y)))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);for(let o of this.targets(t,i,a)){let t=Cc(i,o.point,n);if(t&&this.distanceToLine(e,i,t)<=r)return!0}return!1}},Ec=class extends K{ratioLinks=[];triangles=[];render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));t.anchors.length>=this.descriptor.requiredAnchors&&this.renderTriangles(e,t,i),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i[0].x,i[0].y);for(let t=1;t<i.length;t++)e.lineTo(i[t].x,i[t].y);e.stroke(),this.resetLineStyle(e),this.renderRatioLinks(e,t,i),this.renderPointLabels(e,t,i),this.renderExtras(e,t,i,n),r&&this.renderAnchorHandles(e,t,n)}renderExtras(e,t,n,r){}renderTriangles(e,t,n){e.fillStyle=t.style.fillColor??t.style.color,e.globalAlpha=t.style.fillColor?1:.12;for(let[t,r,i]of this.triangles)e.beginPath(),e.moveTo(n[t].x,n[t].y),e.lineTo(n[r].x,n[r].y),e.lineTo(n[i].x,n[i].y),e.closePath(),e.fill();e.globalAlpha=1}renderRatioLinks(e,t,n){e.font=H(11),e.textAlign=`center`,e.textBaseline=`middle`;for(let r of this.ratioLinks){if(Math.max(r.from,r.to,...r.num,...r.den)>=n.length)continue;let i=n[r.from],a=n[r.to];e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.7,e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),e.setLineDash([]),e.globalAlpha=1,e.fillStyle=t.style.color,U(e,Do(t,r.num,r.den),(i.x+a.x)/2,(i.y+a.y)/2)}}renderPointLabels(e,t,n){e.font=H(12,`bold`),e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<n.length&&t<this.pointLabels.length;t++){let r=n[t-1]??n[t+1],i=n[t+1]??n[t-1],a=!r||!i?!0:n[t].y<=Math.min(r.y,i.y);e.textBaseline=a?`bottom`:`top`,U(e,this.pointLabels[t],n[t].x,n[t].y+(a?-6:6))}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<i.length-1;t++)if(this.distanceToLine(e,i[t],i[t+1])<=r)return!0;return!1}},Dc=class extends Ec{descriptor={type:`xabcdPattern`,name:`XABCD Pattern`,requiredAnchors:5,fill:!0};pointLabels=[`X`,`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]},{from:2,to:4,num:[3,4],den:[2,3]},{from:0,to:4,num:[1,4],den:[0,1]}];triangles=[[0,1,2],[2,3,4]]},Oc=class extends Ec{descriptor={type:`abcdPattern`,name:`ABCD Pattern`,requiredAnchors:4,fill:!0};pointLabels=[`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]}]},kc=class extends Ec{descriptor={type:`headAndShoulders`,name:`Head and Shoulders`,requiredAnchors:7,fill:!0};pointLabels=[``,`Left Shoulder`,``,`Head`,``,`Right Shoulder`,``];triangles=[[0,1,2],[2,3,4],[4,5,6]];renderExtras(e,t,n){if(n.length<5)return;let r=n[2],i=n[4],a=n[0],o=n[n.length-1],s=i.x===r.x?0:(i.y-r.y)/(i.x-r.x),c=e=>r.y+s*(e-r.x);e.strokeStyle=t.style.color,e.lineWidth=Math.max(1,t.style.lineWidth),e.setLineDash([6,4]),e.beginPath(),e.moveTo(a.x,c(a.x)),e.lineTo(o.x,c(o.x)),e.stroke(),e.setLineDash([])}},Ac=class extends Ec{descriptor={type:`threeDrives`,name:`Three Drives Pattern`,requiredAnchors:6};pointLabels=[``,`1`,`A`,`2`,`B`,`3`];ratioLinks=[{from:1,to:3,num:[2,3],den:[1,2]},{from:3,to:5,num:[4,5],den:[3,4]}]},jc=class extends Ec{descriptor={type:`cypherPattern`,name:`Cypher Pattern`,requiredAnchors:5,fill:!0};pointLabels=[`X`,`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:0,to:3,num:[2,3],den:[0,1]},{from:0,to:4,num:[3,4],den:[0,3]}];triangles=[[0,1,2],[2,3,4]]},Mc=class extends K{descriptor={type:`circle`,name:`Circle`,requiredAnchors:2,fill:!0};geometry(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return{c:n,r:Math.hypot(r.x-n.x,r.y-n.y)}}render(e,t,n,r){if(t.anchors.length<2)return;let{c:i,r:a}=this.geometry(t,n);e.beginPath(),e.arc(i.x,i.y,a,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{c:i,r:a}=this.geometry(t,n),o=Math.hypot(e.x-i.x,e.y-i.y);return t.style.fillColor?o<=a+r:Math.abs(o-a)<=r}},Nc=`rgba(76, 141, 255, 0.12)`,Pc=`rgba(232, 80, 91, 0.12)`;function Fc(t,n){let r=n.data;if(!r||r.length===0)return null;let i=Math.round(e.E(t.anchors[0].time,n)),a=Math.round(e.E(t.anchors[1].time,n)),o=Math.max(0,Math.min(i,a)),s=Math.min(r.length-1,Math.max(i,a)),c=0;for(let e=o;e<=s;e++)c+=r[e].volume??0;return c}function Ic(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(2)}K`:e.toFixed(0)}function Lc(e,t){let n=To(e,0,1,t),r=wo(e,0,1,t),i=[xo(e.anchors[0].price,e.anchors[1].price,t),n?`${r} bars, ${n}`:`${r} bars`],a=Fc(e,t);return a!==null&&i.push(`Vol ${Ic(a)}`),i}var Rc=class extends K{descriptor={type:`dateAndPriceRange`,name:`Date and Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y),u=t.anchors[1].price>=t.anchors[0].price;e.fillStyle=u?Nc:Pc,e.fillRect(o,s,c,l),this.applyLineStyle(e,t.style);let d=o+c/2,f=s+l/2;e.beginPath(),e.moveTo(d,i.y),e.lineTo(d,a.y),e.moveTo(i.x,f),e.lineTo(a.x,f),e.stroke(),this.resetLineStyle(e),Eo(e,Lc(t,n),d,u?s-6:s+l+6,`center`,u),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return e.x>=Math.min(i.x,a.x)-r&&e.x<=Math.max(i.x,a.x)+r&&e.y>=Math.min(i.y,a.y)-r&&e.y<=Math.max(i.y,a.y)+r}},zc=400,Bc=2;function Vc(e,t,n){let r=Math.abs(t.x-e.x);if(r<Bc)return[e.x];let i=n.chartRect.x+n.chartRect.width,a=[],o=Math.min(e.x,t.x);for(let e=o;e<=i&&a.length<zc;e+=r)a.push(e);return a}var Hc=class extends K{descriptor={type:`cyclicLines`,name:`Cyclic Lines`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n;this.applyLineStyle(e,t.style),e.beginPath();for(let t of Vc(i,a,n))t<o.x||(e.moveTo(t,o.y),e.lineTo(t,o.y+o.height));e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:Vc(this.anchorToPixel(t.anchors[0],n),this.anchorToPixel(t.anchors[1],n),n).some(t=>Math.abs(e.x-t)<=r)}},Uc=14,Wc=18,Gc=6,Kc=20,qc=class extends K{descriptor={type:`priceLabel`,name:`Price Label`,requiredAnchors:1,text:!0};text(e,t){return e.style.text||W(e.anchors[0].price,e.anchors[0].price,t)}box(e,t,n,r){let i=t.style.fontSize??12,a=this.text(t,r),o=e?e.measureText(a).width:a.length*i*.6;return{x:n.x+Uc,y:n.y-Wc-Kc/2,w:o+Gc*2,h:Kc}}render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n);e.font=`${t.style.fontSize??12}px ${co()}`;let a=this.box(e,t,i,n);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y+a.h),e.stroke(),e.fillStyle=t.style.color,e.fillRect(a.x,a.y,a.w,a.h),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(this.text(t,n),a.x+Gc,a.y+a.h/2),e.beginPath(),e.arc(i.x,i.y,3,0,Math.PI*2),e.fillStyle=t.style.color,e.fill(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);if(Math.hypot(e.x-i.x,e.y-i.y)<=r)return!0;let a=this.box(null,t,i,n);return e.x>=a.x-r&&e.x<=a.x+a.w+r&&e.y>=a.y-r&&e.y<=a.y+a.h+r}},Jc=8,Yc=6,Xc=1.3,Zc=12;function Qc(e){return`${e}px ${co()}`}function $c(e,t,n){let r=[];for(let i of t.split(`
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./gpuContexts-DYrOp3uo.cjs`);let t=require(`@tradecanvas/commons`);var n=class{canvas;ctx;dpr=1;constructor(e,t){this.canvas=document.createElement(`canvas`),this.canvas.style.position=`absolute`,this.canvas.style.top=`0`,this.canvas.style.left=`0`,this.canvas.style.zIndex=String(t),this.canvas.style.pointerEvents=`none`,this.ctx=this.canvas.getContext(`2d`),e.appendChild(this.canvas)}resize(e,t){this.dpr=t;let n=Math.round(e.width*t),r=Math.round(e.height*t);(this.canvas.width!==n||this.canvas.height!==r)&&(this.canvas.width=n,this.canvas.height=r),this.canvas.style.width=`${e.width}px`,this.canvas.style.height=`${e.height}px`,this.ctx.setTransform(t,0,0,t,0,0)}clear(){this.ctx.setTransform(1,0,0,1,0,0),this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height),this.ctx.setTransform(this.dpr,0,0,this.dpr,0,0)}getSize(){return{width:this.canvas.width/this.dpr,height:this.canvas.height/this.dpr}}destroy(){this.canvas.remove()}},r=class{scene=null;top=null;back=null;gpuCanvas=null;size=null;dpr=1;constructor(e){this.container=e}createLayers(){this.destroy(),this.scene=new n(this.container,0),this.top=new n(this.container,1)}getLayer(e){return(e===t.LayerType.Hover?this.top:this.scene)??void 0}backLayer(){return this.gpuCanvas?(this.back||(this.back=new n(this.container,0),this.container.insertBefore(this.back.canvas,this.gpuCanvas),this.size&&this.back.resize(this.size,this.dpr)),this.back):null}getDpr(){return this.dpr}dropBackLayer(){this.back?.destroy(),this.back=null}attachGpu(e){this.detachGpu(),e.style.position=`absolute`,e.style.top=`0`,e.style.left=`0`,e.style.zIndex=`0`,e.style.pointerEvents=`none`,this.container.insertBefore(e,this.scene?.canvas??null),this.gpuCanvas=e,this.size&&this.sizeGpu(this.size,this.dpr)}detachGpu(){this.dropBackLayer(),this.gpuCanvas?.remove(),this.gpuCanvas=null}resize(e,t){this.size=e,this.dpr=t,this.scene?.resize(e,t),this.top?.resize(e,t),this.back?.resize(e,t),this.sizeGpu(e,t)}destroy(){this.detachGpu(),this.scene?.destroy(),this.top?.destroy(),this.scene=null,this.top=null}sizeGpu(e,t){let n=this.gpuCanvas;if(!n)return;let r=Math.round(e.width*t),i=Math.round(e.height*t);(n.width!==r||n.height!==i)&&(n.width=r,n.height=i),n.style.width=`${e.width}px`,n.style.height=`${e.height}px`}},i=class{animFrameId=0;running=!1;dirtyLayers=new Set;swapLayers=new Set;callback=null;setCallback(e){this.callback=e}markDirty(e){this.dirtyLayers.add(e),this.running&&!this.animFrameId&&this.scheduleFrame()}markAllDirty(){this.dirtyLayers.add(t.LayerType.Background),this.dirtyLayers.add(t.LayerType.Main),this.dirtyLayers.add(t.LayerType.Overlay),this.dirtyLayers.add(t.LayerType.UI),this.dirtyLayers.add(t.LayerType.Hover),this.running&&!this.animFrameId&&this.scheduleFrame()}start(){this.running=!0,this.markAllDirty()}stop(){this.running=!1,this.animFrameId&&=(cancelAnimationFrame(this.animFrameId),0)}scheduleFrame(){this.animFrameId=requestAnimationFrame(()=>{if(this.animFrameId=0,!(!this.running||!this.callback)&&this.dirtyLayers.size>0){let e=this.dirtyLayers;this.dirtyLayers=this.swapLayers,this.callback(e),e.clear(),this.swapLayers=e}})}},a=class{observer=null;callback=null;currentDpr=1;resizeScheduled=!1;cachedSize;constructor(e){this.container=e,this.currentDpr=window.devicePixelRatio||1,this.cachedSize={width:e.clientWidth,height:e.clientHeight}}getDpr(){return this.currentDpr}getContainerSize(){return this.cachedSize}readContainerSize(){let e=this.container.clientWidth,t=this.container.clientHeight;return(e!==this.cachedSize.width||t!==this.cachedSize.height)&&(this.cachedSize={width:e,height:t}),this.cachedSize}onResize(e){this.callback=e,this.observer=new ResizeObserver(()=>{this.resizeScheduled||(this.resizeScheduled=!0,requestAnimationFrame(()=>{this.resizeScheduled=!1,this.currentDpr=window.devicePixelRatio||1;let e=this.container.clientWidth,t=this.container.clientHeight;e===this.cachedSize.width&&t===this.cachedSize.height||(this.cachedSize={width:e,height:t},this.callback?.(this.cachedSize,this.currentDpr))}))}),this.observer.observe(this.container)}destroy(){this.observer?.disconnect(),this.observer=null,this.callback=null}};function o(e,n,r,i){let a=n.scaleMode??(n.logScale?`logarithmic`:`regular`);return(a===`percentage`||a===`indexedTo100`)&&n.scaleBaseline?(0,t.formatPriceScaleLabel)(e,a,n.scaleBaseline,r,i):n.formatPrice?n.formatPrice(e):(0,t.formatPriceScaleLabel)(e,`regular`,void 0,r,i)}function s(e,t,n){return n!==null&&n>0?Math.max(1,Math.ceil(e/n-1e-9))*n:t===null?e:Math.max(e,10**-t)}function c(e,t,n){return Math.floor(t/n+1e-9)-Math.ceil(e/n-1e-9)+1}function l(e,t){if(!t||!(t>0)||e>=1)return e;let n=t;for(;n<e;)n*=2;return n}var u=12,d=14,f=class{locale=`en-US`;reservedPrice=null;precision=null;tick=null;setPricePrecision(e){this.precision=e!==null&&Number.isInteger(e)&&e>=0?e:null}setPriceTick(e){this.tick=e!==null&&Number.isFinite(e)&&e>0?e:null}scale(e){let{min:n,max:r}=e.priceRange,i=(0,t.computeTickStep)(n,r,8),a=(0,t.autoPricePrecision)(n,r);if(e.priceUnit)return{step:l(i,e.priceUnit),precision:this.precision??a};let o=s(i,this.precision,this.tick);return c(n,r,o)<2?{step:i,precision:Math.max(this.precision??0,a)}:{step:o,precision:this.precision??a}}labelText(e,t){return o(e,t,this.scale(t).precision,this.locale)}setReservedPriceProvider(e){this.reservedPrice=e}setLocale(e){this.locale=e}render(t,n,r,i=`right`,a=[]){let{chartRect:s,priceRange:c}=n,l=i===`left`,f=l?s.x:s.x+s.width;if(c.max-c.min<=0)return;let p=e.T(n);t.strokeStyle=r.style?.axis.price.line??r.axisLine,t.lineWidth=1,t.globalAlpha=.65,t.beginPath(),t.moveTo(f+.5,s.y),t.lineTo(f+.5,s.y+s.height),t.stroke(),t.globalAlpha=1;let{step:m,precision:h}=this.scale(n),g=Math.ceil(c.min/m-1e-9)*m,_=`500 ${r.font.sizeSmall}px ${r.font.family}`,v=[],y=l?null:this.reservedPrice?.()??null,b=y===null?null:e.w(y,n);for(let e=0;g+e*m<=c.max+m*1e-9;e++){let t=g+e*m,r=p(t);b!==null&&Math.abs(r-b)<u||a.some(e=>Math.abs(r-e)<d)||v.push({y:r,text:o(t,n,h,this.locale)})}t.font=_,t.textBaseline=`middle`,t.textAlign=l?`right`:`left`,t.strokeStyle=r.style?.axis.price.line??r.axisLine,t.globalAlpha=.45,t.beginPath();let x=l?-1:1;for(let{y:e}of v)t.moveTo(f+x,e+.5),t.lineTo(f+4*x,e+.5);t.stroke(),t.globalAlpha=1,t.fillStyle=r.style?.axis.price.text??r.axisLabel;for(let{y:e,text:n}of v)t.fillText(n,f+8*x,e)}};function p(e,t,n,r,i,a){let o=a.shape?.tagRadius,s=typeof o==`number`&&Number.isFinite(o)?Math.max(0,Math.min(o,i/2,r/2)):0;if(!(s>0)){e.fillRect(t,n,r,i);return}e.beginPath(),e.moveTo(t+s,n),e.lineTo(t+r-s,n),e.arcTo(t+r,n,t+r,n+s,s),e.lineTo(t+r,n+i-s),e.arcTo(t+r,n+i,t+r-s,n+i,s),e.lineTo(t+s,n+i),e.arcTo(t,n+i,t,n+i-s,s),e.lineTo(t,n+s),e.arcTo(t,n,t+s,n,s),e.closePath(),e.fill()}function m(e){let t=Math.abs(e);return t>=1e3?1:t>=1?2:t>=.01?4:6}var h=16;function g(e,t,n,r=16){let i=r/2,a=e.map(e=>Math.min(Math.max(e,t+i),n-i));for(let e=1;e<a.length;e++)a[e]=Math.max(a[e],a[e-1]+r);a.length>0&&(a[a.length-1]=Math.min(a[a.length-1],n-i));for(let e=a.length-2;e>=0;e--)a[e]=Math.min(a[e],a[e+1]-r);if(a.length>0&&a[0]<t+i){a[0]=t+i;for(let e=1;e<a.length;e++)a[e]=Math.max(a[e],a[e-1]+r)}return a}function _(e){let t=v(e);if(!t)return`#ffffff`;let[n,r,i]=t;return(.299*n+.587*r+.114*i)/255>.62?`#10131a`:`#ffffff`}function v(e){let t=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(t){let e=t[1].length===3?t[1].replace(/./g,e=>e+e):t[1];return[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16)]}let n=/^rgba?\(\s*([\d.]+)[\s,]+([\d.]+)[\s,]+([\d.]+)/i.exec(e.trim());return n?[Number(n[1]),Number(n[2]),Number(n[3])]:null}function y(e,t,n=[],r=16){let i=r/2,a=n.filter(e=>e.y+e.half>t.top&&e.y-e.half<t.bottom).sort((e,t)=>e.y-t.y),o=e.filter(e=>e.y>=t.top&&e.y<=t.bottom).sort((e,t)=>e.y-t.y),s=[],c=0,l=t.top;for(let e=0;e<=a.length;e++){e>0&&(l=Math.max(l,a[e-1].y+a[e-1].half));let n=l,u=e===a.length?t.bottom:a[e].y-a[e].half,d=e===a.length?1/0:a[e].y,f=c;for(;c<o.length&&o[c].y<d;)c++;let p=o.slice(f,c);if(p.length===0||u-n<r)continue;let m=g(p.map(e=>e.y),n,u,r);p.forEach((e,t)=>{m[t]-i>=n-.5&&m[t]+i<=u+.5&&s.push({...e,y:m[t]})})}return s}function b(e,t,n,r,i){if(t.length!==0){e.save(),e.font=`bold ${i.font.sizeSmall}px ${i.font.family}`,e.textBaseline=`middle`,e.textAlign=`left`;for(let a of t){let t=Math.min(e.measureText(a.text).width+10,r-2);e.fillStyle=a.color,p(e,n+1,Math.round(a.y-8),t,16,i),e.fillStyle=_(a.color),e.fillText(a.text,n+5,Math.round(a.y))}e.restore()}}function x(e,t,n,r,i,a){b(e,y(t,i),n,r,a)}function S(e){return{plot:e,plotText:null,panes:new Map}}function C(e,t,n,r){let i=e.region(t),a=0;for(;a<n.length&&i.step(n[a]);)a++;let o=new Map;for(let t of r){let n=e.region(t.rect).step(t.background),r=e.region(t.inner),i=0;if(n)for(;i<t.steps.length&&r.step(t.steps[i]);)i++;o.set(t.id,{background:n,text:r,rest:t.steps.slice(i)})}return{plot:n.slice(a),plotText:i,panes:o}}var w=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s+r.barSpacing,l=-r.offset+r.chartRect.x+s/2,{min:u,max:d}=r.priceRange;if(d-u===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let f=e.T(r);e.v(t,r=>{let{body:u,wick:d}=e.h(s,r.ratio),p=(u-d)/2,m=new Path2D,h=new Path2D,g=new Path2D,_=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],i=t.close>=t.open,a=r.left(e*c+l,d),o=r.y(f(t.high)),s=r.y(f(t.low));(i?m:h).rect(a,Math.min(o,s),d,Math.max(Math.abs(s-o),1));let v=r.y(f(t.open)),y=r.y(f(t.close));(i?g:_).rect(a-p,Math.min(v,y),u,Math.max(Math.abs(y-v),d))}t.fillStyle=i.candleUpWick,t.fill(m),t.fillStyle=i.candleDownWick,t.fill(h),t.fillStyle=i.candleUp,t.fill(g),t.fillStyle=i.candleDown,t.fill(_)})}};function T(e){if(e.style)return e.style.crosshair;let t=()=>({visible:!0,color:e.crosshair,style:`dashed`,width:1});return{horizontal:t(),vertical:t(),labelBackground:e.text,labelText:e.background}}var E=20,D=8;function O(e,t,n){if(!e)return null;let r=e.region(t,{text:!1});return n.every(e=>r.step(e))?e:null}function k(e){return e<1?Math.ceil(-Math.log10(e))+1:+(e<10)}var ee=class{layerManager;renderLoop;dprManager;renderCtx=null;sceneLayer;topLayer;gpu=null;lostGpu=null;onGpuLost=null;onGpuRestored=null;onContainerResize=null;constructor(e){this.layerManager=new r(e),this.renderLoop=new i,this.dprManager=new a(e),this.layerManager.createLayers(),this.cacheLayerRefs(),this.renderLoop.setCallback(e=>this.render(e)),this.dprManager.onResize((e,t)=>{this.layerManager.resize(e,t),this.renderLoop.markAllDirty(),this.onContainerResize?.(e)});let t=this.dprManager.getContainerSize(),n=this.dprManager.getDpr();this.layerManager.resize(t,n)}cacheLayerRefs(){this.sceneLayer=this.layerManager.getLayer(t.LayerType.Main),this.topLayer=this.layerManager.getLayer(t.LayerType.Hover)}setRenderContext(e){this.renderCtx=e}attachGpu(e){this.detachGpu(),this.placeGpu(e),e.onLost(()=>{this.gpu===e&&(this.gpu=null,this.lostGpu=e,this.layerManager.detachGpu(),this.renderLoop.markAllDirty(),this.onGpuLost?.())}),e.onRestored?.(()=>{this.lostGpu===e&&(this.lostGpu=null,this.placeGpu(e),this.onGpuRestored?.())})}placeGpu(e){this.gpu=e,this.layerManager.attachGpu(e.canvas),this.renderLoop.markAllDirty()}detachGpu(){let e=this.gpu??this.lostGpu;e&&(this.gpu=null,this.lostGpu=null,this.layerManager.detachGpu(),e.destroy(),this.renderLoop.markAllDirty())}renderNow(){this.render(new Set([t.LayerType.Main,t.LayerType.Hover]))}getGpu(){return this.gpu}start(){this.renderLoop.start()}stop(){this.renderLoop.stop()}requestRender(e){e===void 0?this.renderLoop.markAllDirty():this.renderLoop.markDirty(e)}render(e){let n=this.renderCtx;if(!n)return;let{chartRect:r}=n.viewport;if(r.width<=0||r.height<=0)return;let i=!1;for(let n of e)if(n!==t.LayerType.Hover){i=!0;break}i&&this.sceneLayer&&this.renderScene(this.sceneLayer,n),this.topLayer&&this.renderTop(this.topLayer,n)}renderScene(e,n){let{viewport:r,theme:i,data:a}=n;e.clear();let o=e.ctx,s=this.gpu,c=!!s&&n.chartRenderer instanceof w,l=n.chartRenderer?[e=>n.chartRenderer.render(e,a,r,i)]:[],u=[...c?[]:l,...n.compareRenderer?[e=>n.compareRenderer.render(e,a,r,i)]:[],...n.indicatorEngine?.overlayDraws(r,n.leftViewport??void 0)??[]],d=this.paneSteps(n),f={series:!1,volume:!1,background:!1},p=S(u);s?({drawn:f,plan:p}=this.renderGpu(s,n,o,u,d),c&&!f.series&&(p={...p,plot:[...l,...p.plot]})):this.renderBackground(o,n),o.save(),o.beginPath(),o.rect(r.chartRect.x,r.chartRect.y,r.chartRect.width,r.chartRect.height),o.clip(),s||n.depthHeatmap?.render(o,r,i),f.volume||n.volumeRenderer?.render(o,a,r,i),s||(n.volumeProfile?.render(o,a,r,i),n.marketProfile?.render(o,a,r,i)),p.plotText?.drawText(o);for(let e of p.plot)e(o);n.sessionBreaks?.renderLabels(o,r,i,a),n.periodLevels?.render(o,a,r,i),n.pivotMarkers?.render(o,a,r,i),n.renderOverlayPlugins?.(o,`main`),o.restore(),this.renderPanels(o,n,d,p),n.priceLimits&&this.renderPriceLimits(o,r,i,n.priceLimits),n.tradeZoneManager?.render(o,r,i),n.drawingRenderer?.render(o,r,i),n.tradingRenderer?.render(o,r,i),n.signalMarkerManager?.render(o,r,i),n.alertManager?.render(o,r,i),n.priceLines?.render(o,r,i,a);let m=this.fixedAxisTags(n),h=n.indicatorValueLabels===!1?[]:this.overlayValueTags(n,m);n.priceAxis?.render(o,r,i,`right`,[...m.map(e=>e.y),...h.map(e=>e.y)]),b(o,h,r.chartRect.x+r.chartRect.width,r.priceAxisWidth??t.PRICE_AXIS_WIDTH,i),n.leftViewport&&(n.leftPriceAxis?.render(o,n.leftViewport,i,`left`),n.indicatorValueLabels!==!1&&this.renderLeftValueLabels(o,n,n.leftViewport)),n.tradingRenderer?.renderAxisBadges(o,r,i),n.priceLines?.renderAxisTags(o,r,i,a),n.currentPriceLine?.render(o,r,i),n.timeAxis?.render(o,r,i,a,n.timeAxisY),this.renderPanelAxes(o,n)}renderGpu(t,n,r,i,a){let{viewport:o,theme:s,data:c}=n,l=this.layerManager.getDpr(),u=this.underSteps(n),d=!!(n.marketProfile?.isVisible()&&n.marketProfile.drawsText()),f=u.length>0&&!d?O(t.recorder?.(l,r)??null,o.chartRect,u):null,p=u.length>0&&!f,m=t.recorder?.(l,r)??null,h=m?C(m,o.chartRect,i,a):S(i),g=!!(n.volumeProfile?.isVisible()||n.marketProfile?.isVisible()),_=!!n.gridRenderer?.isVisible()&&!e.s(s),v=n.watermark?.isVisible()||p||_?null:{grid:n.gridRenderer?.isVisible()??!1,rects:[...n.sessionShading?.rects(c,o,s)??[],...n.sessionBreaks?.lineRects(o,s,c)??[]]},y=n.volumeRenderer?.isVisible()&&!g?{heightRatio:n.volumeRenderer.getHeightRatio()}:null,b=t.render({data:c,viewport:o,theme:s,dpr:l,candles:n.chartRenderer instanceof w,volume:y,background:v,under:f,recorded:m}),x=b.recorded?h:S(i),T={drawn:{...b,volume:b.volume||g},plan:x},E=v!==null&&!!b.background,D=f!==null&&b.under?[]:u;return E&&D.length===0?(this.layerManager.dropBackLayer(),T):(this.renderBackCanvas(n,D,!E),T)}underSteps(e){let{viewport:t,theme:n,data:r}=e,i=[];return e.depthHeatmap?.isVisible()&&i.push(r=>e.depthHeatmap.render(r,t,n)),(e.volumeProfile?.isVisible()||e.marketProfile?.isVisible())&&(e.volumeRenderer?.isVisible()&&i.push(i=>e.volumeRenderer.render(i,r,t,n)),e.volumeProfile?.isVisible()&&i.push(i=>e.volumeProfile.render(i,r,t,n)),e.marketProfile?.isVisible()&&i.push(i=>e.marketProfile.render(i,r,t,n))),i}renderBackCanvas(e,t,n){let r=this.layerManager.backLayer();r&&(r.clear(),n&&this.renderBackground(r.ctx,e),t.length>0&&this.inPlot(r.ctx,e.viewport,()=>t.forEach(e=>e(r.ctx))))}renderBackground(e,t){let{viewport:n,theme:r,data:i}=t;t.gridRenderer?.render(e,n,r),t.sessionShading?.render(e,i,n,r),t.sessionBreaks?.renderLines(e,n,r,i),t.watermark?.render(e,n,r)}inPlot(e,t,n){e.save(),e.beginPath(),e.rect(t.chartRect.x,t.chartRect.y,t.chartRect.width,t.chartRect.height),e.clip(),n(),e.restore()}renderTop(e,t){let{viewport:n,theme:r,data:i}=t;e.clear();let a=e.ctx;t.measureOverlay?.render(a,n,r),t.selectionBoxOverlay?.render(a,n,r),t.crosshairHandler?.render(a,n,r),t.renderOverlayPlugins?.(a,`overlay`),this.renderPanelCrosshair(a,t),t.crosshairHandler?.renderAxisLabels(a,n,r,i,t.timeAxisY),t.priceAxisAddButton?.render(a,n,r,t.crosshairHandler?.getPosition()??null),t.chartLegend?.render(a,n,r,i),t.barCountdown?.render(a,n,r,i),t.renderOverlayPlugins?.(a,`ui`),this.renderPanelHoverValues(a,t)}paneSteps(e){let{theme:t,panels:n}=e,r=e.indicatorEngine;if(!r||n.length===0)return[];let i=[];for(let e of n){let{rect:n,viewport:a}=e;if(n.width<=0||n.height<=0)continue;let o=e.members?.length?[e.instanceId,...e.members]:[e.instanceId],s=[];for(let e of o){let n=r.isVisible(e)?r.getLevels(e):[];n.length>0&&s.push(e=>this.renderLevels(e,n,a,t))}for(let e of o)s.push(t=>r.renderPanel(t,e,a));i.push({id:e.instanceId,rect:n,inner:{x:n.x,y:n.y+E,width:n.width,height:n.height-E},background:r=>{r.fillStyle=e.style?.background??t.style?.panes.background??t.background,r.fillRect(n.x,n.y,n.width,n.height)},steps:s})}return i}renderPanels(e,t,n,r){let{theme:i}=t,a=t.indicatorEngine;if(!a||n.length===0)return;let o=`10px ${i.font.family}`,s=this.panelDescriptors(a),c=new Map(t.panels.map(e=>[e.instanceId,e.style]));for(let a of n){let{rect:n,inner:l}=a,u=r.panes.get(a.id),d=c.get(a.id);e.save(),e.beginPath(),e.rect(n.x,n.y,n.width,n.height),e.clip(),u?.background||a.background(e),e.fillStyle=d?.separator??i.style?.panes.separator??i.axisLine,e.fillRect(n.x,n.y,n.width,3),e.fillStyle=i.style?.panes.title??i.textSecondary,e.font=o,e.textBaseline=`top`,e.textAlign=`left`;let f=s.get(a.id);f&&t.paneTitles!==!1&&e.fillText(f.descriptor.name,n.x+6,n.y+6),e.save(),e.beginPath(),e.rect(l.x,l.y,l.width,l.height),e.clip(),u?.text?.drawText(e);for(let t of u?u.rest:a.steps)t(e);e.restore(),e.restore()}}fixedAxisTags(t){let{viewport:n,data:r}=t,{chartRect:i}=n,a=[],o=t.currentPriceLine?.isVisible()&&t.theme.style?.lastPrice.visible!==!1?t.currentPriceLine.getPrice():null;o!=null&&a.push({y:e.w(o,n),half:10});for(let i of t.priceLines?.levels(r,n)??[])a.push({y:e.w(i.price,n),half:8});for(let e of t.tradingRenderer?.axisTagYs(n)??[])a.push({y:e,half:9});return a.filter(e=>e.y>=i.y&&e.y<=i.y+i.height)}overlayValueTags(n,r){let i=n.indicatorEngine?.getLatestOverlayValues();if(!i?.length)return[];let{viewport:a}=n,{chartRect:o}=a,s=n.formatPrice??(e=>(0,t.formatPrice)(e,2,n.numberLocale??`en-US`));return y(i.map(t=>({y:e.w(t.value,a),text:s(t.value),color:t.color})),{top:o.y,bottom:o.y+o.height},r)}renderLeftValueLabels(n,r,i){let a=r.indicatorEngine?.getLatestOverlayValues(`left`);if(!a?.length)return;let{chartRect:o}=i,s=r.leftAxisWidth??t.PRICE_AXIS_WIDTH,c=(0,t.autoPricePrecision)(i.priceRange.min,i.priceRange.max),l=r.numberLocale??`en-US`;x(n,a.map(n=>({y:e.w(n.value,i),text:(0,t.formatPrice)(n.value,c,l),color:n.color})),o.x-s,s,{top:o.y,bottom:o.y+o.height},r.theme)}renderLevels(t,n,r,i){if(n.length===0)return;let{chartRect:a}=r;t.save(),t.strokeStyle=i.axisLabel,t.globalAlpha=.45,t.lineWidth=1,t.setLineDash([4,4]),t.beginPath();for(let i of n){let n=Math.round(e.w(i,r))+.5;t.moveTo(a.x,n),t.lineTo(a.x+a.width,n)}t.stroke(),t.restore()}renderPanelAxes(n,r){let{theme:i}=r,a=r.numberLocale??`en-US`,s=`${i.font.sizeSmall}px ${i.font.family}`;for(let c of r.panels){let l=c.viewport,u=c.rect,{min:d,max:f}=l.priceRange;if(f-d<=0||u.height<=0||l.chartRect.height<D)continue;let p=u.x+u.width,h=l.chartRect,g=i.style?.axis.price.line??i.axisLine,_=i.style?.axis.price.text??i.axisLabel;n.strokeStyle=g,n.lineWidth=1,n.beginPath(),n.moveTo(p+.5,u.y),n.lineTo(p+.5,u.y+u.height),n.stroke();let v=(0,t.computeTickStep)(d,f,4),y=Math.ceil(d/v)*v,b=k(v);n.font=s,n.textBaseline=`middle`,n.textAlign=`left`;for(let t=y;t<=f;t+=v){let r=Math.abs(t)<v*1e-6?0:t,i=e.w(r,l);i<h.y||i>h.y+h.height||(n.strokeStyle=g,n.beginPath(),n.moveTo(p,Math.round(i)+.5),n.lineTo(p+4,Math.round(i)+.5),n.stroke(),n.fillStyle=_,n.fillText(o(r,l,b,a),p+6,i))}let S=r.indicatorValueLabels===!1?null:[c.instanceId,...c.members??[]].flatMap(e=>r.indicatorEngine?.getLatestValues(e)??[]);S?.length&&x(n,S.map(n=>({y:e.w(n.value,l),text:l.scaleMode===`percentage`&&l.scaleBaseline?o(n.value,l,2,a):(0,t.formatPrice)(n.value,m(n.value),a),color:n.color})),p,r.viewport.priceAxisWidth??t.PRICE_AXIS_WIDTH,{top:h.y,bottom:h.y+h.height},i)}}renderPanelCrosshair(n,r){let i=r.crosshairHandler?.getPosition();if(!i||r.panels.length===0)return;let{theme:a}=r;for(let o of r.panels){let s=o.rect;if(i.x<s.x||i.x>s.x+s.width||i.y<s.y||i.y>s.y+s.height)continue;let c=o.viewport;if(c.chartRect.height<D)continue;let l=e.k(i.x,c),u=e.b(Math.max(0,Math.min((r.data?.length??1)-1,Math.round(l))),c),d=T(a);if(n.save(),n.beginPath(),n.rect(s.x,s.y,s.width,s.height),n.clip(),d.vertical.visible){n.setLineDash((0,t.lineDash)(d.vertical.style,[4,4],d.vertical.width)),n.strokeStyle=d.vertical.color;let r=e.g(n,u,d.vertical.width);n.lineWidth=r.width,n.beginPath(),n.moveTo(r.x,s.y),n.lineTo(r.x,s.y+s.height),n.stroke()}if(d.horizontal.visible){n.setLineDash((0,t.lineDash)(d.horizontal.style,[4,4],d.horizontal.width)),n.strokeStyle=d.horizontal.color;let r=e._(n,i.y,d.horizontal.width);n.lineWidth=r.width,n.beginPath(),n.moveTo(s.x,r.y),n.lineTo(s.x+s.width,r.y),n.stroke()}n.setLineDash([]),n.restore();break}}renderPanelHoverValues(n,r){let i=r.crosshairHandler?.getPosition(),a=r.indicatorEngine;if(!i||r.panels.length===0)return;let{theme:s,viewport:c,data:l}=r,u=r.numberLocale??`en-US`,d=`${s.font.sizeSmall}px ${s.font.family}`,f=a?this.panelDescriptors(a):null;for(let m of r.panels){let h=m.viewport,g=m.rect,{min:_,max:v}=h.priceRange;if(v-_<=0||g.height<=0||h.chartRect.height<D)continue;let y=g.x+g.width,b=k((0,t.computeTickStep)(_,v,4));if(i.x>=g.x&&i.x<=g.x+g.width&&i.y>=g.y&&i.y<=g.y+g.height){let r=o(e.j(i.y,h),h,b,u);n.font=`bold ${s.font.sizeSmall}px ${s.font.family}`;let a=n.measureText(r).width,l=Math.min(a+10,(c.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2),d=T(s);n.fillStyle=d.labelBackground,p(n,y+1,i.y-9,l,18,s),n.fillStyle=d.labelText,n.textBaseline=`middle`,n.textAlign=`left`,n.fillText(r,y+5,i.y)}if(!a||r.paneTitles===!1)continue;let x=Math.max(0,Math.min((l?.length??1)-1,Math.round(e.k(i.x,h)))),S=a.getOutput(m.instanceId),C=S?.series&&x<S.series.length?S.series[x]:null;if(!C)continue;let w=f?.get(m.instanceId),E=w?.descriptor.plots,O=[];if(E)for(let e of E){let t=C[e.key];t!==void 0&&Number.isFinite(t)&&O.push(`${e.title} ${o(t,h,b,u)}`)}else for(let e in C){let t=C[e];t!==void 0&&O.push(`${e}: ${t.toFixed(b)}`)}if(O.length===0)continue;n.font=d;let ee=w?n.measureText(w.descriptor.name).width+14:10;n.fillStyle=s.textSecondary,n.textBaseline=`top`,n.textAlign=`left`,n.fillText(O.join(` `),g.x+ee,g.y+6)}}panelDescriptors(e){let t=new Map;for(let n of e.getPanelIndicators())t.set(n.instanceId,n);return t}renderPriceLimits(n,r,i,a){let{chartRect:o}=r,s=[{price:a.ceiling,color:a.colors?.ceiling??`#FF00FF`,label:`CE`},{price:a.floor,color:a.colors?.floor??`#00FFFF`,label:`FL`},{price:a.reference,color:a.colors?.reference??`#FFD700`,label:`REF`}],c=`bold 9px ${i.font.family}`,l=`10px ${i.font.family}`;for(let{price:a,color:u,label:d}of s){let s=e.w(a,r);if(s<o.y||s>o.y+o.height)continue;n.setLineDash([8,4]),n.strokeStyle=u,n.lineWidth=1,n.beginPath(),n.moveTo(o.x,Math.round(s)+.5),n.lineTo(o.x+o.width,Math.round(s)+.5),n.stroke(),n.setLineDash([]),n.font=c,n.fillStyle=u,n.textBaseline=`bottom`,n.textAlign=`left`,n.fillText(`${d} ${r.formatPrice?.(a)??a.toFixed(2)}`,o.x+4,s-2);let f=o.x+o.width+1;n.fillStyle=u,p(n,f,s-7,(r.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2,14,i),n.fillStyle=`#000`,n.font=l,n.textBaseline=`middle`,n.textAlign=`left`,n.fillText(r.formatPrice?.(a)??a.toFixed(2),f+4,s)}}destroy(){this.renderLoop.stop(),this.detachGpu(),this.dprManager.destroy(),this.layerManager.destroy()}};async function te(t){let n=e.n();if(!n)return{gpu:null,reason:`limit`};let r;try{r=await Promise.resolve().then(()=>require(`./WebGLSeriesRenderer-Bclv4lzZ.cjs`))}catch(e){return n(),console.warn(`TradeCanvas: the WebGL renderer failed to load, drawing with Canvas 2D.`,e),{gpu:null,reason:`unsupported`}}let i=r.WebGLSeriesRenderer.create({failIfMajorPerformanceCaveat:t===`auto`,release:n});return i?{gpu:i}:(n(),{gpu:null,reason:`unsupported`})}async function ne(e){return(await te(e)).gpu}var re=.25,ie=class{state;priceAxisWidth=t.PRICE_AXIS_WIDTH;stateCache=null;dataLength=0;minBarWidth;maxBarWidth;rightMarginBars;freePan=!0;minVisibleBars=3;constructor(e,n,r=2,i=30,a=5){this.minBarWidth=r,this.maxBarWidth=i,this.rightMarginBars=a;let o=this.computeChartRect(e,n);this.state={visibleRange:{from:0,to:0},priceRange:{min:0,max:1},barWidth:t.DEFAULT_BAR_WIDTH,barSpacing:t.DEFAULT_BAR_SPACING,offset:0,chartRect:o}}getState(){return this.stateCache||={visibleRange:{...this.state.visibleRange},priceRange:{...this.state.priceRange},barWidth:this.state.barWidth,barSpacing:this.state.barSpacing,offset:this.state.offset,chartRect:{...this.state.chartRect},logScale:this.state.logScale,scaleMode:this.state.scaleMode,scaleBaseline:this.state.scaleBaseline,invertScale:this.state.invertScale,priceAxisWidth:this.state.priceAxisWidth,formatPrice:this.state.formatPrice,priceUnit:this.state.priceUnit},this.stateCache}invalidate(){this.stateCache=null}setLogScale(e){this.setScaleMode(e?`logarithmic`:`regular`)}isLogScale(){return(this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`))===`logarithmic`}setScaleMode(e){this.state.scaleMode=e,this.state.logScale=e===`logarithmic`,this.invalidate()}getScaleMode(){return this.state.scaleMode??(this.state.logScale?`logarithmic`:`regular`)}setInvertScale(e){this.state.invertScale=e,this.invalidate()}isInvertScale(){return this.state.invertScale===!0}setPriceFormat(e,t=null){this.state.formatPrice=e??void 0,this.state.priceUnit=t??void 0,this.invalidate()}setScaleBaseline(e){this.state.scaleBaseline=e,this.invalidate()}setRightMargin(e){this.rightMarginBars=e}getRightMargin(){return this.rightMarginBars}setPanLimits(e){e.freePan!==void 0&&(this.freePan=e.freePan),e.minVisibleBars!==void 0&&(this.minVisibleBars=Math.max(1,Math.floor(e.minVisibleBars))),this.clampOffset(),this.updateVisibleRange()}endOffset(){let e=this.state.barWidth+this.state.barSpacing;return this.dataLength*e-this.state.chartRect.width+this.rightMarginBars*e}setPriceAxisWidth(e){this.priceAxisWidth!==e&&(this.priceAxisWidth=e,this.state.priceAxisWidth=e,this.invalidate())}computeChartRect(e,n){return{x:0,y:0,width:Math.max(0,e-this.priceAxisWidth),height:Math.max(0,n-t.TIME_AXIS_HEIGHT)}}resize(e,t){this.state.chartRect=this.computeChartRect(e,t),this.invalidate(),this.clampUnit(),this.clampOffset()}setChartRect(e){this.state.chartRect={x:e.x,y:e.y,width:Math.max(0,e.width),height:Math.max(0,e.height)},this.invalidate(),this.clampUnit(),this.clampOffset(),this.updateVisibleRange()}floorUnit(){return this.minBarWidth+t.DEFAULT_BAR_SPACING}minUnit(){let e=this.floorUnit(),t=this.state.chartRect.width,n=this.dataLength+this.rightMarginBars;return t<=0||n<=0?e:Math.max(re,Math.min(e,t/n))}maxUnit(){return this.maxBarWidth+t.DEFAULT_BAR_SPACING}applyUnit(e){let n=this.floorUnit();if(e>=n)this.state.barWidth=e-t.DEFAULT_BAR_SPACING,this.state.barSpacing=t.DEFAULT_BAR_SPACING;else{let t=this.minBarWidth/n;this.state.barWidth=e*t,this.state.barSpacing=e-this.state.barWidth}this.invalidate()}clampUnit(){let e=this.state.barWidth+this.state.barSpacing,n=(0,t.clamp)(e,this.minUnit(),this.maxUnit());n===e||e<=0||(this.state.offset=this.state.offset/e*n,this.applyUnit(n))}updateData(e,n){let r=this.dataLength===0;this.dataLength=e.length,this.dataLength!==0&&(this.clampUnit(),r&&(this.state.offset=this.endOffset()),this.clampOffset(),this.updateVisibleRange(),n&&(this.state.priceRange=(0,t.computePriceRange)(e,this.state.visibleRange.from,Math.min(this.state.visibleRange.to,this.dataLength-1),.08),this.invalidate()))}prependBars(e){e===0||!Number.isFinite(e)||(this.dataLength+=e,this.state.offset+=e*(this.state.barWidth+this.state.barSpacing),this.invalidate(),this.updateVisibleRange())}setPriceRange(e,t){this.state.priceRange={min:e,max:t},this.invalidate()}scalePriceRange(e){if(!Number.isFinite(e)||e<=0)return;let{min:t,max:n}=this.state.priceRange,r=(t+n)/2,i=(n-t)/2,a=Math.max(i*e,1e-9);this.state.priceRange={min:r-a,max:r+a},this.invalidate()}scrollBy(e){this.state.offset+=e,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}panPriceRange(e){let t=this.state.chartRect.height;if(t<=0||e===0)return;let{min:n,max:r}=this.state.priceRange,i=(this.state.invertScale?-e:e)/t;if(this.isLogScale()&&n>0&&r>0){let e=Math.log(n),t=Math.log(r),a=(t-e)*i;this.state.priceRange={min:Math.exp(e-a),max:Math.exp(t-a)},this.invalidate();return}let a=(r-n)*i;this.state.priceRange={min:n-a,max:r-a},this.invalidate()}isAtEnd(){let e=this.state.barWidth+this.state.barSpacing;return Math.abs(this.state.offset-this.endOffset())<=e*2}scrollToEnd(){this.state.offset=this.endOffset(),this.invalidate(),this.updateVisibleRange()}zoom(e,n){let r=this.state.barWidth+this.state.barSpacing,i=this.state.barWidth*(1+e),a=(0,t.clamp)(r>=this.floorUnit()&&i>=this.minBarWidth?i+t.DEFAULT_BAR_SPACING:r*(1+e),this.minUnit(),this.maxUnit());if(a===r)return;let o=this.isAtEnd(),s=(this.state.offset+n)/r;this.applyUnit(a),this.state.offset=o?this.endOffset():s*a-n,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}zoomToBarRange(e,n){let r=this.state.chartRect.width;if(r<=0||!Number.isFinite(e)||!Number.isFinite(n)||n<e)return;let i=(0,t.clamp)(r/(n-e+1),this.minUnit(),this.maxUnit());this.applyUnit(i),this.state.offset=(e+n+1)/2*i-r/2,this.invalidate(),this.clampOffset(),this.updateVisibleRange()}clampOffset(){if(this.state.chartRect.width<=0)return;let e=this.state.barWidth+this.state.barSpacing,n=this.state.chartRect.width,r=this.endOffset(),i,a;if(this.freePan&&this.dataLength>0){let t=Math.min(this.minVisibleBars,this.dataLength);i=t*e-n,a=(this.dataLength-t)*e,i=Math.min(i,r),a=Math.max(a,r)}else if(r>0)i=-(n*.5),a=r;else{let e=n*.5;i=r-e,a=r+e}this.state.offset=(0,t.clamp)(this.state.offset,i,a),this.invalidate()}updateVisibleRange(){let e=this.state.barWidth+this.state.barSpacing;if(e<=0||this.state.chartRect.width<=0)return;let t=Math.floor(this.state.offset/e),n=Math.ceil(this.state.chartRect.width/e)+1,r=Math.min(t+n,this.dataLength-1);this.state.visibleRange={from:Math.max(0,t),to:Math.max(0,r)},this.invalidate()}};function ae(e,n){return(0,t.sliceVisibleData)(e,n.visibleRange.from,n.visibleRange.to)}var oe=[`1D`,`5D`,`1M`,`3M`,`6M`,`YTD`,`1Y`,`5Y`,`All`],se=864e5,ce=6e4,le={"1M":1,"3M":3,"6M":6,"1Y":12,"5Y":60};function ue(e,t){let n=new Date(e),r=n.getUTCFullYear(),i=n.getUTCMonth()+t,a=new Date(Date.UTC(r,i+1,0)).getUTCDate();return Date.UTC(r,i,Math.min(n.getUTCDate(),a),n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds(),n.getUTCMilliseconds())}function de(e,n,r=0){if(e===`All`)return null;if(e===`1D`)return n-se;if(e===`5D`)return n-5*se;let i=n+(0,t.offsetAt)(r,n)*ce;return e===`YTD`?(0,t.wallToUtc)(Date.UTC(new Date(i).getUTCFullYear(),0,1),r):(0,t.wallToUtc)(ue(i,-(le[e]??0)),r)}function fe(e,t,n){if(t>=e){let t=Array(Math.max(0,e));for(let n=0;n<e;n++)t[n]=n;return t}if(t<=2)return e>=2?[0,e-1]:e===1?[0]:[];let r=[0],i=(e-2)/(t-2),a=0;for(let o=0;o<t-2;o++){let t=Math.floor((o+1)*i)+1,s=Math.floor((o+2)*i)+1;s>e&&(s=e);let c=0,l=0,u=0;for(let e=t;e<s;e++)c+=e,l+=n(e),u++;if(u>0)c/=u,l/=u;else{let r=Math.min(t,e-1);c=r,l=n(r)}let d=Math.floor(o*i)+1,f=Math.floor((o+1)*i)+1,p=n(a),m=-1,h=d;for(let e=d;e<f;e++){let t=Math.abs((a-c)*(n(e)-p)-(a-e)*(l-p));t>m&&(m=t,h=e)}r.push(h),a=h}return r.push(e-1),r}var pe=64;function me(e,t,n,r,i){let a=Math.max(0,e),o=Math.min(t,n-1);if(o<a)return[];let s=o-a+1,c=Math.max(pe,Math.ceil(r*2));if(s<=c){let e=Array(s);for(let t=0;t<s;t++)e[t]=a+t;return e}let l=fe(s,c,e=>i(a+e));for(let e=0;e<l.length;e++)l[e]+=a;return l}var he=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let s=r.barWidth+r.barSpacing,c=-r.offset+r.chartRect.x+r.barWidth/2,{min:l,max:u}=r.priceRange;if(u-l===0)return;let d=e.T(r);t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`;let f=me(a,o,n.length,r.chartRect.width,e=>n[e].close),p=!1;for(let e of f){let r=e*s+c,i=d(n[e].close);p?t.lineTo(r,i):(t.moveTo(r,i),p=!0)}t.stroke()}},ge=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let s=r.barWidth+r.barSpacing,c=-r.offset+r.chartRect.x+r.barWidth/2,{min:l,max:u}=r.priceRange;if(u-l===0)return;let d=e.T(r),f=d(l),p=me(a,o,n.length,r.chartRect.width,e=>n[e].close);if(p.length===0)return;let m=p[0],h=m*s+c,g=d(n[m].close),_=t.createLinearGradient(0,d(u),0,f);_.addColorStop(0,i.areaTopColor),_.addColorStop(1,i.areaBottomColor),t.beginPath(),t.moveTo(h,f),t.lineTo(h,g);let v=h;for(let e=1;e<p.length;e++){let r=p[e];v=r*s+c,t.lineTo(v,d(n[r].close))}t.lineTo(v,f),t.closePath(),t.fillStyle=_,t.fill(),t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`,t.moveTo(h,g);for(let e=1;e<p.length;e++){let r=p[e];t.lineTo(r*s+c,d(n[r].close))}t.stroke()}},_e=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s+r.barSpacing,l=-r.offset+r.chartRect.x+s/2,{min:u,max:d}=r.priceRange;if(d-u===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let f=e.T(r);e.v(t,r=>{let{body:u,wick:d}=e.h(s,r.ratio),p=Math.max((u-d)/2,d),m=new Path2D,h=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],i=t.close>=t.open?m:h,a=r.left(e*c+l,d),o=r.y(f(t.high)),s=r.y(f(t.low));i.rect(a,Math.min(o,s),d,Math.max(Math.abs(s-o),d)),i.rect(a-p,r.y(f(t.open))-Math.floor(d/2),p,d),i.rect(a+d,r.y(f(t.close))-Math.floor(d/2),p,d)}t.fillStyle=i.candleUp,t.fill(m),t.fillStyle=i.candleDown,t.fill(h)})}},ve=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s+r.barSpacing,l=-r.offset+r.chartRect.x+s/2,{min:u,max:d}=r.priceRange;if(d-u===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let f=e.T(r);e.v(t,r=>{let{body:u,wick:d}=e.h(s,r.ratio),p=(u-d)/2,m={up:new Path2D,down:new Path2D},h={up:new Path2D,down:new Path2D},g={up:new Path2D,down:new Path2D};for(let e=a;e<=o&&e<n.length;e++){let t=n[e],i=e===0||t.close>=n[e-1].close?`up`:`down`,a=r.left(e*c+l,d),o=a-p,s=r.y(f(t.high)),_=r.y(f(t.low)),v=r.y(f(t.open)),y=r.y(f(t.close)),b=Math.min(v,y),x=Math.max(Math.abs(y-v),d);t.close>=t.open?(b>s&&m[i].rect(a,s,d,b-s),_>b+x&&m[i].rect(a,b+x,d,_-b-x),g[i].rect(o+d/2,b+d/2,Math.max(u-d,0),Math.max(x-d,0))):(m[i].rect(a,Math.min(s,_),d,Math.max(Math.abs(_-s),1)),h[i].rect(o,b,u,x))}for(let e of[`up`,`down`]){let n=e===`up`?i.candleUp:i.candleDown;t.fillStyle=n,t.fill(m[e]),t.fill(h[e]),t.strokeStyle=n,t.lineWidth=d,t.stroke(g[e])}})}},ye=32/255,be=class{baselinePrice=null;setBaseline(e){this.baselinePrice=e}render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=e.T(r),h=m(this.baselinePrice??this.computeBaseline(n,a,o)),{chartRect:g}=r,_=[],v=[];for(let e=a;e<=o&&e<n.length;e++)_.push(p(e)),v.push(m(n[e].close));if(_.length<2)return;let y=_.length-1;t.save();let b=m(f),x=m(d),S=new Path2D;S.rect(g.x,Math.min(h,b),g.width,Math.abs(b-h)),t.clip(S);let C=new Path2D;C.moveTo(_[0],h);for(let e=0;e<=y;e++)C.lineTo(_[e],v[e]);C.lineTo(_[y],h),C.closePath(),t.globalAlpha*=ye,t.fillStyle=i.candleUp,t.fill(C),t.restore(),t.save();let w=new Path2D;w.rect(g.x,Math.min(h,x),g.width,Math.abs(x-h)),t.clip(w);let T=new Path2D;T.moveTo(_[0],h);for(let e=0;e<=y;e++)T.lineTo(_[e],v[e]);T.lineTo(_[y],h),T.closePath(),t.globalAlpha*=ye,t.fillStyle=i.candleDown,t.fill(T),t.restore();let E=new Path2D,D=new Path2D,O=null;for(let e=1;e<=y;e++){let t=r.invertScale?v[e]>=h:v[e]<=h,n=t?E:D;t!==O&&n.moveTo(_[e-1],v[e-1]),O=t,n.lineTo(_[e],v[e])}t.save(),t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`,t.strokeStyle=i.candleUp,t.stroke(E),t.strokeStyle=i.candleDown,t.stroke(D),t.restore(),t.setLineDash([6,4]),t.strokeStyle=i.textSecondary,t.lineWidth=1;let k=new Path2D;k.moveTo(g.x,h),k.lineTo(g.x+g.width,h),t.stroke(k),t.setLineDash([])}computeBaseline(e,t,n){let r=0,i=0;for(let a=t;a<=n&&a<e.length;a++)r+=e[a].close,i++;return i>0?r/i:0}},xe=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=e.T(r),h=new Path2D,g=new Path2D,_=new Path2D,v=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=p(e),i=t.close>=t.open,a=m(Math.max(t.open,t.close)),o=m(Math.min(t.open,t.close)),l=Math.min(a,o),u=Math.max(Math.abs(o-a),1),d=r-c;i?(h.rect(d,l,s,u),_.rect(d,l,s,u)):(g.rect(d,l,s,u),v.rect(d,l,s,u))}t.fillStyle=i.candleUp,t.fill(h),t.fillStyle=i.candleDown,t.fill(g),t.lineWidth=1,t.strokeStyle=i.candleUp,t.stroke(_),t.strokeStyle=i.candleDown,t.stroke(v)}},Se=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange;if(f-d===0)return;let p=e=>e*l+u,m=e.T(r),h=new Path2D,g=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=p(e),i=t.close>=t.open,a=m(t.high),s=m(t.low),c=i?s:a,l=i?h:g;l.moveTo(r,i?a:s),l.lineTo(r,c),e<o&&e+1<n.length&&l.lineTo(p(e+1),c)}t.save(),t.lineJoin=`round`,t.strokeStyle=i.candleUp,t.lineWidth=3,t.stroke(h),t.strokeStyle=i.candleDown,t.lineWidth=1,t.stroke(g),t.restore()}},Ce=class{boxSize=1;setBoxSize(e){this.boxSize=e}render(t,n,r,i){let{from:a,to:o}=r.visibleRange,s=r.barWidth,c=s/2,l=s+r.barSpacing,u=-r.offset+r.chartRect.x+c,{min:d,max:f}=r.priceRange,p=f-d;if(p===0||!(this.boxSize>0))return;let m=r.chartRect.height/p,h=e=>e*l+u,g=e.T(r),_=Math.abs(this.boxSize*m),v=Math.min(c*.8,_*.8)*.5,y=new Path2D,b=new Path2D,x=new Path2D;for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=h(e),i=t.close>=t.open,a=t.high,o=t.low,s=Math.max(1,Math.round((a-o)/this.boxSize)),c=Math.max(0,Math.floor((d-o)/this.boxSize)-1),l=Math.min(s-1,Math.ceil((f-o)/this.boxSize)),u=Math.max(1,Math.ceil(1/_));for(let e=c;e<=l;e+=u){let t=g(o+(e+.5)*this.boxSize);i?(y.moveTo(r-v,t-v),y.lineTo(r+v,t+v),b.moveTo(r+v,t-v),b.lineTo(r-v,t+v)):(x.moveTo(r+v,t),x.arc(r,t,v,0,Math.PI*2))}}t.lineWidth=1.5,t.strokeStyle=i.candleUp,t.stroke(y),t.stroke(b),t.strokeStyle=i.candleDown,t.stroke(x)}},we=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,{min:s,max:c}=r.priceRange;if(c-s===0||a>o||n.length===0)return;if(e.f(r)){e.p(t,n,r,i.candleUp,i.candleDown);return}let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=r.barWidth,f=0;for(let e=a;e<=o&&e<n.length;e++)n[e].volume>f&&(f=n[e].volume);f===0&&(f=1);let p=e=>e*l+u,m=e.T(r);e.v(t,r=>{let{wick:s}=e.h(d,r.ratio),c=new Path2D,l=new Path2D,u=new Path2D,h=new Path2D;for(let t=a;t<=o&&t<n.length;t++){let i=n[t],a=i.close>=i.open,o=r.left(p(t),s),g=r.y(m(i.high)),_=r.y(m(i.low));(a?c:l).rect(o,Math.min(g,_),s,Math.max(Math.abs(_-g),1));let{body:v}=e.h(d*Math.max(.2,i.volume/f),r.ratio),y=r.y(m(i.open)),b=r.y(m(i.close));(a?u:h).rect(o-(v-s)/2,Math.min(y,b),v,Math.max(Math.abs(b-y),s))}t.fillStyle=i.candleUpWick,t.fill(c),t.fillStyle=i.candleDownWick,t.fill(l),t.fillStyle=i.candleUp,t.fill(u),t.fillStyle=i.candleDown,t.fill(h)})}},Te=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange,{min:s,max:c}=r.priceRange;if(c-s===0||a>o||n.length===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=r.barWidth,f=0;for(let e=a;e<=o&&e<n.length;e++)n[e].volume>f&&(f=n[e].volume);f===0&&(f=1);let p=new Path2D,m=new Path2D,h=new Path2D,g=new Path2D,_=e=>e*l+u,v=e.T(r);for(let e=a;e<=o&&e<n.length;e++){let t=n[e],r=e>0?n[e-1]:t,i=_(e),a=v(t.high),o=v(t.low),s=t.close>=r.close,c=d*Math.max(.15,t.volume/f),l=c/2,u=Math.min(a,o),y=Math.max(Math.abs(o-a),1),b=s?p:m,x=s?h:g;b.rect(i-l,u,c,y),x.rect(i-l,u,c,y)}t.fillStyle=Ee(i.candleUp,.55),t.fill(p),t.fillStyle=Ee(i.candleDown,.55),t.fill(m),t.lineWidth=1,t.strokeStyle=i.candleUpWick,t.stroke(h),t.strokeStyle=i.candleDownWick,t.stroke(g)}};function Ee(e,t){if(e.startsWith(`#`)){let n=Math.round(Math.max(0,Math.min(1,t))*255).toString(16).padStart(2,`0`);if(e.length===7)return`${e}${n}`;if(e.length===9)return`${e.slice(0,7)}${n}`}return e}var De=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let{min:s,max:c}=r.priceRange;if(c-s===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=e=>e*l+u,f=e.T(r),p=[],m=[];for(let e=a;e<=o&&e<n.length;e++){let t=d(e);p.push({x:t,y:f(n[e].high)}),m.push({x:t,y:f(n[e].low)})}if(p.length===0)return;let h=t.createLinearGradient(0,f(c),0,f(s));h.addColorStop(0,i.areaTopColor),h.addColorStop(1,i.areaBottomColor),t.beginPath(),t.moveTo(p[0].x,p[0].y);for(let e=1;e<p.length;e++)t.lineTo(p[e].x,p[e].y);for(let e=m.length-1;e>=0;e--)t.lineTo(m[e].x,m[e].y);t.closePath(),t.fillStyle=h,t.fill(),t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`;for(let e=a;e<=o&&e<n.length;e++){let r=d(e),i=f(n[e].close);e===a?t.moveTo(r,i):t.lineTo(r,i)}t.stroke()}},Oe=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let{min:s,max:c}=r.priceRange;if(c-s===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=e=>e*l+u,f=e.T(r);t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`miter`;let p=0;for(let e=a;e<=o&&e<n.length;e++){let r=d(e),i=f(n[e].close);e===a?t.moveTo(r,i):(t.lineTo(r,p),t.lineTo(r,i)),p=i}t.stroke()}},ke=class{render(t,n,r,i){let{from:a,to:o}=r.visibleRange;if(a>o||n.length===0)return;let{min:s,max:c}=r.priceRange;if(c-s===0)return;let l=r.barWidth+r.barSpacing,u=-r.offset+r.chartRect.x+r.barWidth/2,d=e=>e*l+u,f=e.T(r);t.beginPath(),t.strokeStyle=i.lineColor,t.lineWidth=i.style?.series.lineWidth??2,t.lineJoin=`round`;let p=[];for(let e=a;e<=o&&e<n.length;e++){let r=d(e),i=f(n[e].close);p.push({x:r,y:i}),e===a?t.moveTo(r,i):t.lineTo(r,i)}t.stroke();let m=Math.max(2,Math.min(4,r.barWidth*.3)),h=new Path2D;for(let{x:e,y:t}of p)h.moveTo(e+m,t),h.arc(e,t,m,0,Math.PI*2);t.fillStyle=i.lineColor,t.fill(h),t.strokeStyle=i.background,t.lineWidth=1,t.stroke(h)}},Ae=28,je=3,Me=class{priceText=null;setPriceText(e){this.priceText=e}render(n,r,i,a){let{from:o,to:s}=i.visibleRange,{min:c,max:l}=i.priceRange;if(l===c)return;if(e.f(i)){e.p(n,r,i,a.candleUp,a.candleDown);return}let u=i.barWidth+i.barSpacing,d=-i.offset+i.chartRect.x+i.barWidth/2,f=e.T(i),p=Math.max(1,Math.round(i.barWidth*.6)),m=i.barWidth>=Ae,h=(0,t.autoPricePrecision)(c,l),g=e=>i.formatPrice?.(e)??this.priceText?.(e)??(0,t.formatPrice)(e,h);m&&(n.font=`${a.font.sizeSmall}px ${a.font.family}`,n.textAlign=`center`);for(let e=Math.max(0,o);e<=s&&e<r.length;e++){let t=r[e],i=e*u+d,o=Math.min(f(t.high),f(t.low)),s=Math.max(f(t.high),f(t.low));if(n.fillStyle=t.close>=t.open?a.candleUp:a.candleDown,n.fillRect(Math.round(i-p/2),o,p,Math.max(1,s-o)),!m)continue;let c=f(t.high)<=f(t.low);n.textBaseline=`bottom`,n.fillText(g(c?t.high:t.low),i,o-je),n.textBaseline=`top`,n.fillText(g(c?t.low:t.high),i,s+je)}}},Ne=class{visible=!0;heightRatio=.15;setVisible(e){this.visible=e}isVisible(){return this.visible}setHeightRatio(e){this.heightRatio=Math.max(.05,Math.min(.5,e))}getHeightRatio(){return this.heightRatio}render(n,r,i,a){if(!this.visible||r.length===0)return;let{from:o,to:s}=i.visibleRange,{chartRect:c}=i,l=i.barWidth,u=l+i.barSpacing,d=-i.offset+c.x+l/2,f=0;for(let e=o;e<=s&&e<r.length;e++)r[e].volume>f&&(f=r[e].volume);if(f===0)return;let p=c.y+c.height,m=c.height*this.heightRatio/f;e.v(n,c=>{let f=new Path2D,h=new Path2D,g=c.y(p),_=(e,t,n,r)=>{let i=c.y(p-r*m);g-i>=1&&e.rect(t,i,n,g-i)};if(e.f(i))e.d(r,o,s,e=>e*u+d,e=>{let t=c.x(e.x);_(e.close>=e.open?f:h,t,Math.max(1,c.x(e.x+1)-t),e.volume)});else{let{body:t,wick:n}=e.h(l,c.ratio),i=(t-n)/2;for(let e=o;e<=s&&e<r.length;e++){let a=r[e];_(a.close>=a.open?f:h,c.left(e*u+d,n)-i,t,a.volume)}}let v=(0,t.resolveVolumeColors)(a);n.fillStyle=v.up,n.fill(f),n.fillStyle=v.down,n.fill(h)})}},Pe=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;highlightPoC=!0;setVisible(e){this.visible=e}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setHighlightPoC(e){this.highlightPoC=e}render(t,n,r,i){if(!this.visible||n.length===0)return;let{from:a,to:o}=r.visibleRange,{chartRect:s,priceRange:c}=r,l=c.max-c.min;if(l<=0)return;let u=new Float64Array(this.buckets),d=new Float64Array(this.buckets),f=new Float64Array(this.buckets);for(let e=a;e<=o&&e<n.length;e++){let t=n[e];if(t.volume<=0)continue;let r=Math.max(t.low,c.min),i=Math.min(t.high,c.max);if(i<=r)continue;let a=(r-c.min)/l,o=(i-c.min)/l,s=Math.max(0,Math.floor(a*this.buckets)),p=Math.min(this.buckets-1,Math.floor(o*this.buckets)),m=Math.max(1,p-s+1),h=t.volume/m,g=t.close>=t.open;for(let e=s;e<=p;e++)u[e]+=h,g?d[e]+=h:f[e]+=h}let p=0,m=-1;for(let e=0;e<u.length;e++)u[e]>p&&(p=u[e],m=e);if(p===0)return;let h=s.width*this.widthRatio,g=s.x+s.width,_=e.T(r),v=1/p;t.save(),t.globalAlpha=this.opacity;for(let n=0;n<this.buckets;n++){let a=u[n];if(a===0)continue;let o=e.C(n,this.buckets,r,_),c=a*v*h,l=d[n]*v*h,p=f[n]*v*h;l>0&&(t.fillStyle=i.candleUp,t.fillRect(g-l,o.top+.5,l,o.height-1)),p>0&&(t.fillStyle=i.candleDown,t.fillRect(g-c,o.top+.5,p,o.height-1)),this.highlightPoC&&n===m&&(t.globalAlpha=1,t.strokeStyle=i.crosshair,t.lineWidth=1,t.setLineDash([3,2]),t.beginPath(),t.moveTo(s.x,o.mid+.5),t.lineTo(g-c-2,o.mid+.5),t.stroke(),t.setLineDash([]),t.globalAlpha=this.opacity)}t.restore()}};function Fe(e,t){return e<0?0:e>t?t:e}function Ie(e,t,n,r={}){let i=Math.max(4,Math.min(500,Math.floor(r.buckets??48))),a=n-t;if(a<=0||e.length===0)return null;let o=a/i,s=new Float64Array(i);for(let r of e){let e=Math.min(r.low,r.high),a=Math.max(r.low,r.high);if(a<t||e>n)continue;let c=Fe(Math.floor((e-t)/o),i-1),l=Fe(Math.floor((a-t)/o),i-1);for(let e=c;e<=l;e++)s[e]+=1}let c=0,l=0,u=0;for(let e=0;e<i;e++)u+=s[e],s[e]>l&&(l=s[e],c=e);if(u===0)return null;let d=u*(r.valueAreaPct??.7),f=c,p=c,m=s[c];for(;m<d&&(f>0||p<i-1);){let e=f>0?s[f-1]:-1;(p<i-1?s[p+1]:-1)>=e?(p+=1,m+=s[p]):(--f,m+=s[f])}let h=[];for(let e=0;e<i;e++){let n=t+e*o;h.push({low:n,high:n+o,mid:n+o/2,count:s[e]})}return{buckets:h,pocIndex:c,maxCount:l,totalCount:u,valueAreaLow:t+f*o,valueAreaHigh:t+(p+1)*o}}function Le(e){let t=(e%52+52)%52;return t<26?String.fromCharCode(65+t):String.fromCharCode(97+t-26)}function Re(e,t,n,r=48){let i=Math.max(4,Math.min(500,Math.floor(r))),a=n-t,o=Array.from({length:i},()=>[]);if(a<=0)return o;let s=a/i;return e.forEach((e,r)=>{let a=Math.min(e.low,e.high),c=Math.max(e.low,e.high);if(c<t||a>n)return;let l=Math.max(0,Math.min(i-1,Math.floor((a-t)/s))),u=Math.max(0,Math.min(i-1,Math.floor((c-t)/s)));for(let e=l;e<=u;e++)o[e].push(r)}),o}function ze(e,n,r,i={}){if(e.length===0||r-n<=0)return[];let a=[],o=0,s=(0,t.timeframeBucketStart)(e[0].time,`1d`),c=(t,o,s)=>{let c=Ie(e.slice(t,o+1),n,r,i);c&&a.push({startIndex:t,endIndex:o,startTime:s,profile:c})};for(let n=1;n<e.length;n++){let r=(0,t.timeframeBucketStart)(e[n].time,`1d`);r!==s&&(c(o,n-1,s),o=n,s=r)}return c(o,e.length-1,s),a}var Be=class{visible=!1;buckets=48;widthRatio=.18;opacity=.32;valueAreaPct=.7;highlightPoC=!0;showStats=!0;splitBySession=!1;letters=!1;lastStats=null;setVisible(e){this.visible=e,e||(this.lastStats=null)}isVisible(){return this.visible}setBuckets(e){this.buckets=Math.max(8,Math.min(200,Math.floor(e)))}setWidthRatio(e){this.widthRatio=Math.max(.05,Math.min(.5,e))}setOpacity(e){this.opacity=Math.max(.05,Math.min(1,e))}setValueAreaPct(e){this.valueAreaPct=Math.max(.3,Math.min(.95,e))}setHighlightPoC(e){this.highlightPoC=e}setShowStats(e){this.showStats=e}setSplitBySession(e){this.splitBySession=e}isSplitBySession(){return this.splitBySession}setLetters(e){this.letters=e}drawsText(){return this.splitBySession?this.letters:this.showStats}getStats(){return this.lastStats}render(t,n,r,i){if(!this.visible||n.length===0)return;let{from:a,to:o}=r.visibleRange,{chartRect:s,priceRange:c}=r,l=Math.max(0,a),u=Math.min(o,n.length-1);if(u<l)return;let d=n.slice(l,u+1);if(this.splitBySession){this.lastStats=null,this.renderSplit(t,d,l,r,i);return}let f=Ie(d,c.min,c.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(!f){this.lastStats=null;return}let p=f.buckets[f.pocIndex].mid;this.lastStats={poc:p,vah:f.valueAreaHigh,val:f.valueAreaLow,valueAreaPct:this.valueAreaPct};let m=f.buckets.length,h=s.width*this.widthRatio,g=s.x,_=e.T(r),v=1/f.maxCount;t.save();for(let n=0;n<m;n++){let a=f.buckets[n];if(a.count===0)continue;let o=e.C(n,m,r,_),s=a.count*v*h,c=a.mid>=f.valueAreaLow&&a.mid<=f.valueAreaHigh;t.globalAlpha=c?Math.min(1,this.opacity+.18):this.opacity,t.fillStyle=c?i.candleUp:i.textSecondary,t.fillRect(g,o.top+.5,s,o.height-1)}t.globalAlpha=.6,t.strokeStyle=i.candleUp,t.lineWidth=1,t.setLineDash([1,3]);for(let e of[f.valueAreaHigh,f.valueAreaLow]){let n=_(e);t.beginPath(),t.moveTo(g,Math.round(n)+.5),t.lineTo(s.x+s.width,Math.round(n)+.5),t.stroke()}if(t.setLineDash([]),this.highlightPoC){let e=_(p);t.globalAlpha=1,t.strokeStyle=i.crosshair,t.lineWidth=1,t.setLineDash([3,2]),t.beginPath(),t.moveTo(g,Math.round(e)+.5),t.lineTo(s.x+s.width,Math.round(e)+.5),t.stroke(),t.setLineDash([])}this.showStats&&this.drawStats(t,s.x+6,s.y+6,p,f.valueAreaHigh,f.valueAreaLow,i),t.restore()}renderSplit(t,n,r,i,a){let{chartRect:o,priceRange:s}=i,c=ze(n,s.min,s.max,{buckets:this.buckets,valueAreaPct:this.valueAreaPct});if(c.length===0)return;let l=e.T(i),u=i.barWidth/2;t.save();for(let d of c){let c=d.profile,f=c.buckets.length,p=o.height/f,m=e.b(r+d.startIndex,i)-u,h=e.b(r+d.endIndex,i)+u,g=Math.max(2,h-m),_=1/c.maxCount,v=this.letters&&p>=7,y=v?Re(n.slice(d.startIndex,d.endIndex+1),s.min,s.max,this.buckets):null;if(v&&y){t.font=`${Math.min(11,Math.floor(p))}px ui-monospace, monospace`,t.textBaseline=`middle`,t.textAlign=`left`;let n=Math.max(1,Math.floor(g/6));for(let r=0;r<f;r++){let o=y[r];if(o.length===0)continue;let s=e.C(r,f,i,l).mid,u=c.buckets[r].mid>=c.valueAreaLow&&c.buckets[r].mid<=c.valueAreaHigh;t.globalAlpha=u?.95:.6,t.fillStyle=u?a.candleUp:a.textSecondary;let d=Math.min(o.length,n);for(let e=0;e<d;e++)t.fillText(Le(o[e]),m+e*6,s)}}else for(let n=0;n<f;n++){let r=c.buckets[n];if(r.count===0)continue;let o=e.C(n,f,i,l),s=r.count*_*g,u=r.mid>=c.valueAreaLow&&r.mid<=c.valueAreaHigh;t.globalAlpha=u?Math.min(1,this.opacity+.18):this.opacity,t.fillStyle=u?a.candleUp:a.textSecondary,t.fillRect(m,o.top+.5,s,o.height-1)}if(this.highlightPoC){let e=l(c.buckets[c.pocIndex].mid);t.globalAlpha=1,t.strokeStyle=a.crosshair,t.lineWidth=1,t.setLineDash([3,2]),t.beginPath(),t.moveTo(m,Math.round(e)+.5),t.lineTo(Math.min(h,o.x+o.width),Math.round(e)+.5),t.stroke(),t.setLineDash([])}}t.restore()}drawStats(e,t,n,r,i,a,o){let s=Ve(r),c=[[`POC`,r.toFixed(s),o.crosshair],[`VAH`,i.toFixed(s),o.candleUp],[`VAL`,a.toFixed(s),o.candleUp]];e.globalAlpha=1,e.font=`600 10px ${o.font.family}`,e.textBaseline=`middle`;let l=0;for(let[,t]of c)l=Math.max(l,e.measureText(t).width);let u=38+l,d=6+c.length*14;e.fillStyle=o.background,e.globalAlpha=.82,He(e,t,n,u,d,4),e.fill(),e.globalAlpha=1,c.forEach(([r,i,a],s)=>{let c=n+6/2+14/2+s*14;e.fillStyle=a,e.textAlign=`left`,e.fillText(r,t+6,c),e.fillStyle=o.text,e.textAlign=`right`,e.fillText(i,t+u-6,c)}),e.textAlign=`left`}};function Ve(e){let t=Math.abs(e);return t>=1e3?2:t>=1?4:6}function He(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 Ue(e,n){let r=n===`day`?`1d`:`1w`,i=[];for(let n of e){let e=(0,t.timeframeBucketStart)(n.time,r),a=i[i.length-1];a&&a.key===e?(a.high=Math.max(a.high,n.high),a.low=Math.min(a.low,n.low),a.close=n.close):i.push({key:e,open:n.open,high:n.high,low:n.low,close:n.close})}return i}function We(e,t=`day`){let n=Ue(e,t);if(n.length<2)return[];let r=n[n.length-2],i=n[n.length-1],a=t===`day`?`D`:`W`;return[{id:`p${a}h`,label:`P${a}H`,price:r.high},{id:`p${a}c`,label:`P${a}C`,price:r.close},{id:`p${a}l`,label:`P${a}L`,price:r.low},{id:`open`,label:t===`day`?`Day Open`:`Week Open`,price:i.open}]}var Ge=class{visible=!1;period=`day`;setVisible(e){this.visible=e}isVisible(){return this.visible}setPeriod(e){this.period=e}getPeriod(){return this.period}render(t,n,r,i){if(!this.visible||n.length===0)return;let a=We(n,this.period);if(a.length===0)return;let{chartRect:o}=r,s=o.y,c=o.y+o.height;t.save(),t.font=`600 10px ${i.font.family}`,t.textBaseline=`middle`;for(let n of a){let a=e.w(n.price,r);if(a<s||a>c)continue;let l=Ke(n,i);t.strokeStyle=l,t.globalAlpha=.7,t.lineWidth=1,t.setLineDash([5,4]),t.beginPath(),t.moveTo(o.x,Math.round(a)+.5),t.lineTo(o.x+o.width,Math.round(a)+.5),t.stroke(),t.setLineDash([]),t.globalAlpha=1;let u=n.label,d=t.measureText(u).width,f=o.x+o.width-d-10;t.fillStyle=i.background,t.globalAlpha=.85,p(t,f-4,a-7,d+8,14,i),t.globalAlpha=1,t.fillStyle=l,t.textAlign=`left`,t.fillText(u,f,a+.5)}t.restore()}};function Ke(e,t){return e.id.endsWith(`h`)?t.candleUp:e.id.endsWith(`l`)?t.candleDown:t.textSecondary}function qe(e){let t,n;return e.map(e=>{let r;return e.type===`high`?(r=t===void 0||e.price>t?`HH`:`LH`,t=e.price):(r=n===void 0||e.price<n?`LL`:`HL`,n=e.price),{...e,label:r}})}function Je(e,t=5,n=5){let r=Math.max(1,Math.floor(t)),i=Math.max(1,Math.floor(n)),a=[];for(let t=r;t<e.length-i;t++){let n=e[t].high,o=e[t].low,s=!0,c=!0;for(let a=t-r;a<=t+i&&!(a!==t&&(e[a].high>=n&&(s=!1),e[a].low<=o&&(c=!1),!s&&!c));a++);s?a.push({index:t,price:n,type:`high`}):c&&a.push({index:t,price:o,type:`low`})}return a}var Ye=class{visible=!1;left=5;right=5;showLabels=!1;structureLabels=!1;setVisible(e){this.visible=e}isVisible(){return this.visible}setStrength(e,t){this.left=Math.max(1,Math.floor(e)),this.right=Math.max(1,Math.floor(t))}setShowLabels(e){this.showLabels=e}setStructureLabels(e){this.structureLabels=e}render(t,n,r,i){if(!this.visible||n.length===0)return;let a=Je(n,this.left,this.right);if(a.length===0)return;let o=this.structureLabels?qe(a):a,{from:s,to:c}=r.visibleRange;t.save(),t.font=`10px ${i.font.family}`,t.textAlign=`center`;for(let n of o){if(n.index<s-1||n.index>c+1)continue;let a=e.b(n.index,r),o=e.w(n.price,r),l=n.type===`high`,u=l?i.candleDown:i.candleUp,d=l!==(r.invertScale===!0),f=d?o-8:o+8;t.fillStyle=u,t.beginPath(),d?(t.moveTo(a-5,f-5),t.lineTo(a+5,f-5),t.lineTo(a,f)):(t.moveTo(a-5,f+5),t.lineTo(a+5,f+5),t.lineTo(a,f)),t.closePath(),t.fill();let p=this.structureLabels&&`label`in n?String(n.label):this.showLabels?r.formatPrice?.(n.price)??Xe(n.price):null;p&&(t.textBaseline=d?`bottom`:`top`,t.fillText(p,a,d?f-5-1:f+5+1))}t.restore()}};function Xe(e){let t=Math.abs(e);return t>=1e3||t>=1?e.toFixed(2):e.toPrecision(4)}var Ze=class{buffer=[];constructor(e=240){this.capacity=e,this.capacity=Math.max(1,Math.floor(e))}push(e,t){let n={time:e,bids:t.bids.map(e=>({...e})),asks:t.asks.map(e=>({...e}))},r=this.indexAfter(e);if(r>0&&this.buffer[r-1].time===e){this.buffer[r-1]=n;return}this.buffer.splice(r,0,n),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}indexAfter(e){let t=this.buffer;if(t.length===0||t[t.length-1].time<=e)return t.length;let n=0,r=t.length;for(;n<r;){let i=n+r>>1;t[i].time<=e?n=i+1:r=i}return n}snapshots(){return this.buffer}maxVolume(){let e=0;for(let t of this.buffer){for(let n of t.bids)n.volume>e&&(e=n.volume);for(let n of t.asks)n.volume>e&&(e=n.volume)}return e}setCapacity(e){this.capacity=Math.max(1,Math.floor(e)),this.buffer.length>this.capacity&&(this.buffer=this.buffer.slice(this.buffer.length-this.capacity))}clear(){this.buffer=[]}get size(){return this.buffer.length}},Qe=class{buffer=new Ze(240);visible=!1;opacity=.7;setVisible(e){this.visible=e}isVisible(){return this.visible}setOpacity(e){this.opacity=Math.max(.1,Math.min(1,e))}setCapacity(e){this.buffer.setCapacity(e)}push(e,t){this.buffer.push(e,t)}clear(){this.buffer.clear()}render(t,n,r){if(!this.visible)return;let i=this.buffer.snapshots();if(i.length===0)return;let a=this.buffer.maxVolume();if(a<=0)return;let o=1/a,{chartRect:s}=n,c=Math.max(2,n.barWidth+n.barSpacing),l=s.x,u=s.x+s.width,d=s.y,f=s.y+s.height;t.save();for(let a of i){let i=e.D(a.time,n);if(i<l-c||i>u+c)continue;let s=i-c/2;this.drawSide(t,a.bids,r.candleUp,s,c,n,o,d,f),this.drawSide(t,a.asks,r.candleDown,s,c,n,o,d,f)}t.restore()}drawSide(t,n,r,i,a,o,s,c,l){if(n.length===0)return;let u=$e(n,o);t.fillStyle=r;for(let r of n){let n=e.w(r.price,o);n<c-u||n>l+u||(t.globalAlpha=Math.min(1,Math.sqrt(r.volume*s))*this.opacity,t.fillRect(i,n-u/2,a,u))}t.globalAlpha=1}};function $e(t,n){if(t.length<2)return 3;let r=t.map(e=>e.price).sort((e,t)=>e-t),i=[];for(let e=1;e<r.length;e++){let t=r[e]-r[e-1];t>0&&i.push(t)}if(i.length===0)return 3;i.sort((e,t)=>e-t);let a=i[Math.floor(i.length/2)],o=Math.abs(e.w(r[0],n)-e.w(r[0]+a,n));return Math.max(2,Math.min(o,12))}var et=class{series=new Map;set(e,n){if(!n||n.length===0){this.series.delete(e);return}let r=[...n].sort((e,n)=>(0,t.normalizeBarTime)(e.time)-(0,t.normalizeBarTime)(n.time)),i=r.map(e=>(0,t.normalizeBarTime)(e.time)),a=i[i.length-1],o=i.length>1?a-i[i.length-2]:0;this.series.set(e,{bars:r,times:i,end:a+o})}has(e){return this.series.has(e)}get(e){return this.series.get(e)?.bars}symbols(){return[...this.series.keys()]}closeAt(e,n){let r=this.series.get(e);if(!r)return;let i=(0,t.normalizeBarTime)(n),{times:a,bars:o}=r;if(i<a[0])return;let s=a.length-1;if(i>a[s]&&(r.end<=a[s]||i>=r.end))return;let c=0,l=s;for(;c<l;){let e=c+l+1>>1;a[e]<=i?c=e:l=e-1}return o[c].close}},tt=class{symbols=new Map;mode=`percent`;store=new et;aligned=new Map;setMode(e){this.mode=e}getMode(){return this.mode}addSymbol(e){this.symbols.set(e.id,e),this.store.set(e.id,e.data),this.aligned.delete(e.id)}removeSymbol(e){this.symbols.delete(e),this.store.set(e,null),this.aligned.delete(e)}setSymbolData(e,t){let n=this.symbols.get(e);n&&(n.data=t,this.store.set(e,t),this.aligned.delete(e))}setSymbolVisible(e,t){let n=this.symbols.get(e);n&&(n.visible=t)}getSymbols(){return Array.from(this.symbols.values())}clear(){for(let e of this.symbols.keys())this.store.set(e,null);this.symbols.clear(),this.aligned.clear()}getPriceRange(e,t){let n=1/0,r=-1/0;for(let i of this.symbols.values()){if(!i.visible||i.data.length===0)continue;let a=this.line(i,e,t);if(a)for(let e=a.from;e<=a.to;e++){let t=a.priceAt(e);t!==null&&(t<n&&(n=t),t>r&&(r=t))}}return n<=r?{min:n,max:r}:null}render(e,t,n,r){if(this.symbols.size===0||t.length===0)return;let{chartRect:i}=n;e.save(),e.beginPath(),e.rect(i.x,i.y,i.width,i.height),e.clip();for(let r of this.symbols.values())!r.visible||r.data.length===0||this.renderSymbol(e,r,t,n);e.restore()}closesOn(e,t){let n=t.length>0?t[t.length-1].time:NaN,r=this.aligned.get(e.id);if(r&&r.main===t&&r.data===e.data&&r.length===t.length&&r.lastTime===n)return r.closes;let i=new Float64Array(t.length);for(let n=0;n<t.length;n++)i[n]=this.store.closeAt(e.id,t[n].time)??NaN;return this.aligned.set(e.id,{main:t,data:e.data,length:t.length,lastTime:n,closes:i}),i}line(e,t,n){let r=this.closesOn(e,t),i=Math.max(0,n.visibleRange.from),a=Math.min(t.length-1,n.visibleRange.to),o=-1;for(let e=i;e<=a;e++)if(Number.isFinite(r[e])&&r[e]!==0&&t[e].close!==0){o=e;break}if(o<0)return null;let s=t[o].close,c=r[o],l=this.mode===`percent`;return{from:o,to:a,priceAt:e=>{let t=r[e];return Number.isFinite(t)?l?t/c*s:t:null}}}renderSymbol(t,n,r,i){let a=this.line(n,r,i);if(!a)return;t.strokeStyle=n.color,t.lineWidth=n.lineWidth??1.5,t.lineJoin=`round`,t.beginPath();let o=0,s=null;for(let n=a.from;n<=a.to;n++){let r=a.priceAt(n);if(r===null)continue;let c=e.b(n,i),l=e.w(r,i);o===0?t.moveTo(c,l):t.lineTo(c,l),(o===2||o===0&&s===null)&&(s={x:c+4,y:l-4}),o++}t.stroke(),s&&(t.fillStyle=n.color,t.font=`bold 10px sans-serif`,t.textBaseline=`bottom`,t.textAlign=`left`,t.fillText(n.label,s.x,s.y))}};function nt(e){if(e.length===0)return[];let t=[],n=e[0].open,r=(e[0].open+e[0].high+e[0].low+e[0].close)/4;for(let i=0;i<e.length;i++){let a=e[i],o=(a.open+a.high+a.low+a.close)/4,s=i===0?a.open:(n+r)/2,c=Math.max(a.high,s,o),l=Math.min(a.low,s,o);t.push({time:a.time,open:s,high:c,low:l,close:o,volume:a.volume}),n=s,r=o}return t}function rt(e,t){if(e.length===0)return[];let n=t.brickSize;t.useATR&&e.length>2&&(n=it(e,t.atrPeriod??14)),n>0||(n=Math.abs(e[e.length-1].close)/100||1);let r=[],i=Math.round(e[0].close/n)*n,a=e[0].time;for(let t=1;t<e.length;t++){let o=e[t].close-i,s=Math.floor(Math.abs(o)/n);if(s>=1){let c=o>0?1:-1;for(let o=0;o<s;o++){let o=i;i+=c*n,r.push({time:a++,open:o,high:Math.max(o,i),low:Math.min(o,i),close:i,volume:e[t].volume/s})}}}return r}function it(e,t){let n=e.length-1,r=Math.max(1,n-t),i=0;for(let t=r;t<n;t++)i+=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));let a=n>r?i/(n-r):0;if(!(a>0))return 0;let o=10**(Math.floor(Math.log10(a))-1);return Math.round(a/o)*o}function at(e,t=3){if(e.length===0)return[];let n=[],r=0;n.push({time:r++,open:e[0].open,high:Math.max(e[0].open,e[0].close),low:Math.min(e[0].open,e[0].close),close:e[0].close,volume:e[0].volume});for(let i=1;i<e.length;i++){let a=e[i].close,o=n[n.length-1],s=o.close>=o.open,c=Math.min(t,n.length),l=-1/0,u=1/0;for(let e=n.length-c;e<n.length;e++)l=Math.max(l,n[e].high),u=Math.min(u,n[e].low);s&&a>o.close?n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume}):!s&&a<o.close||s&&a<u?n.push({time:r++,open:o.close,high:o.close,low:a,close:a,volume:e[i].volume}):!s&&a>l&&n.push({time:r++,open:o.close,high:a,low:o.close,close:a,volume:e[i].volume})}return n}function ot(e,t=4,n=`percent`){if(e.length<2)return e.slice();let r=[],i=e[1].close>=e[0].close?1:-1,a=e[0].close,o=e[0].close,s=e[0].close,c=0;for(let l=1;l<e.length;l++){let u=e[l].close,d=n===`price`?t:t/100*s;i===1?(u>a&&(a=u),a-u>=d&&(r.push({time:c++,open:s,high:a,low:s,close:a,volume:e[l].volume}),i=-1,s=a,o=u,a=u)):(u<o&&(o=u),u-o>=d&&(r.push({time:c++,open:s,high:s,low:o,close:o,volume:e[l].volume}),i=1,s=o,a=u,o=u))}return i===1?r.push({time:c,open:s,high:a,low:s,close:a,volume:0}):r.push({time:c,open:s,high:s,low:o,close:o,volume:0}),r}function st(e,t,n=3){if(e.length===0||t<=0)return[];let r=[],i=0,a=0,o=0,s=0,c=Math.round(e[0].close/t)*t;a=c,o=c,i=1;for(let c=1;c<e.length;c++){let l=e[c].close,u=Math.round(l/t)*t;i===1?u>a?a=u:a-u>=t*n&&(r.push({time:s++,open:o,high:a,low:o,close:a,volume:e[c].volume}),i=-1,o=u,a-=t):u<o?o=u:u-o>=t*n&&(r.push({time:s++,open:a,high:a,low:o,close:o,volume:e[c].volume}),i=1,a=u,o+=t)}return r.push({time:s,open:i===1?o:a,high:a,low:o,close:i===1?a:o,volume:0}),r}function ct(e,t){if(e.length===0||t.rangeSize<=0)return[];let n=[],r=e[0].time,i=e[0].open,a=i,o=i,s=0,c=(e,c)=>{for(e>a&&(a=e),e<o&&(o=e),s+=c;a-o>=t.rangeSize;){let c=e>=i,l=c?i+t.rangeSize:i-t.rangeSize;n.push({time:r++,open:i,high:c?l:i,low:c?i:l,close:l,volume:s}),i=l,a=l,o=l,s=0}};for(let t of e){let e=t.close>=t.open?[t.low,t.high,t.close]:[t.high,t.low,t.close],n=t.volume/e.length;for(let t of e)c(t,n)}return n}function A(e){return e.barWidth+e.barSpacing<1}function lt(e,t,n){return e>1.5*(Math.abs(n-t)+1)}var j=class{started=!1;lastX=NaN;lastY=NaN;col=NaN;lo=0;hi=0;width;constructor(e,t,n,r,i=[]){this.ctx=e,this.dense=r,this.dash=i,this.width=Number.isFinite(n)&&n>0?n:1,e.beginPath(),r?e.fillStyle=t:(e.strokeStyle=t,e.lineWidth=this.width,e.lineJoin=`round`)}add(e,t){!Number.isFinite(e)||!Number.isFinite(t)||(this.dense?this.addDense(e,t):this.started?this.ctx.lineTo(e,t):this.ctx.moveTo(e,t),this.started=!0,this.lastX=e,this.lastY=t)}gap(){this.flush(),this.started=!1,this.lastY=NaN}segment(e,t,n,r){(!this.started||e!==this.lastX||t!==this.lastY)&&(this.gap(),this.add(e,t)),this.add(n,r)}finish(){this.flush(),this.dense?this.ctx.fill():this.dash.length>0?(this.ctx.setLineDash([...this.dash]),this.ctx.stroke(),this.ctx.setLineDash([])):this.ctx.stroke()}addDense(e,t){let n=Math.floor(e);n!==this.col&&(this.flush(),this.col=n,this.lo=this.hi=Number.isNaN(this.lastY)?t:this.lastY),t<this.lo&&(this.lo=t),t>this.hi&&(this.hi=t)}flush(){if(Number.isNaN(this.col))return;let e=this.width/2,t=Math.max(1,this.width);this.ctx.rect(this.col+.5-t/2,this.lo-e,t,this.hi-this.lo+2*e),this.col=NaN}};function ut(e,t,n,r,i,a=t.length){e.beginPath(),e.fillStyle=i;let o=NaN,s=0,c=0,l=NaN,u=NaN,d=()=>{Number.isNaN(o)||e.rect(o,s,1,c-s)};for(let e=0;e<a;e++){let i=Math.floor(t[e]),a=Math.min(n[e],r[e]),f=Math.max(n[e],r[e]);i!==o&&(d(),o=i,s=Number.isNaN(l)?a:Math.min(a,l),c=Number.isNaN(u)?f:Math.max(f,u)),a<s&&(s=a),f>c&&(c=f),l=a,u=f}d(),e.fill()}var dt=.1;function ft(e){return e.plots?e.plots.map(e=>e.key):null}function pt(e,t){return e.tone?e.tone===`sign`?(t[e.key]??0)>=0:t[e.tone.field]===1:!0}function mt(e,t){return t.plots?.[e.key]?.visible!==!1}var ht=[6,4];function M(e,n,r){let i=e.plots?.[n];return{visible:i?.visible!==!1,dash:(0,t.lineDash)(i?.lineStyle??`solid`,ht,r)}}function gt(e,t,n){let r=t.colors[e.color]??t.colors[0];return!e.tone||e.downColor===void 0||!n||pt(e,n)?r:t.colors[e.downColor]??r}function _t(e,t,n,r){let{lo:i,hi:a}=yt(e,t,n,r.keys),o=r.scale,s=o?.min,c=o?.max;if(i===1/0){if(s===void 0&&c===void 0)return null;i=s??0,a=c??i+1}else{let e=a-i||Math.abs(a)||1;i-=e*dt,a+=e*dt}for(let e of r.levels??[])e<i&&(i=e),e>a&&(a=e);return(r.zero||o?.zero)&&(i>0&&(i=0),a<0&&(a=0)),s!==void 0&&(i=s),c!==void 0&&(a=c),a>i||(a=i+1),{min:i,max:a}}function vt(e,t,n,r){let{lo:i,hi:a}=yt(e,t,n,r.keys),o=e=>e!==void 0&&e>0,s=o(r.scale?.min)?r.scale?.min:void 0,c=o(r.scale?.max)?r.scale?.max:void 0;if(i===1/0){if(s===void 0||c===void 0)return null;i=s,a=c}else{if(!(i>0))return!1;let e=Math.exp((Math.log(a/i)||Math.LN2/4)*dt);i/=e,a*=e}for(let e of r.levels??[])e>0&&(e<i&&(i=e),e>a&&(a=e));return s!==void 0&&(i=s),c!==void 0&&(a=c),a>i?{min:i,max:a}:null}function yt(e,t,n,r){let i=1/0,a=-1/0,o=e=>{e===void 0||!Number.isFinite(e)||(e<i&&(i=e),e>a&&(a=e))},s=e=>{if(e){if(r){for(let t=0;t<r.length;t++)o(e[r[t]]);return}for(let t in e)o(e[t])}},c=e?.series;if(c){let e=Math.min(n,c.length-1);for(let n=Math.max(0,t);n<=e;n++)s(c[n])}else if(e){let r=0;for(let i of e.values.values()){if(r>n)break;r>=t&&s(i),r++}}return{lo:i,hi:a}}function bt(e){return!!e?.some(e=>e.kind===`histogram`)}function xt(n,r,i,a,o){let s=r.series;if(!s)return;let c=Math.max(0,i.visibleRange.from),l=Math.min(i.visibleRange.to,s.length-1);if(l<c)return;let u=e.T(i);for(let e=0;e<o.length;e++){let r=o[e];if(!mt(r,a))continue;let d=a.lineWidths[e]??a.lineWidths[0]??1.5,f=(0,t.lineDash)(a.plots?.[r.key]?.lineStyle??`solid`,ht,d),p=r.kind??`line`,m=r.tone&&r.downColor!==void 0?[!0,!1]:[null];for(let e of m){let t=a.colors[r.color]??a.colors[0],o=e===!1?a.colors[r.downColor]??t:t,m=t=>e===null||pt(r,t)===e;p===`histogram`?Tt(n,s,r.key,c,l,i,u,o,m):p===`dots`?wt(n,s,r.key,c,l,i,u,o,m):Ct(n,s,r.key,c,l,i,u,o,d,p===`step`,e===null?null:m,f)}}}function St(e,t){let n=e?.[t];return n!==void 0&&Number.isFinite(n)?n:void 0}function Ct(t,n,r,i,a,o,s,c,l,u,d,f=[]){let p=new j(t,c,l,A(o),f),m=0,h=0,g=!1;for(let t=i;t<=a;t++){let i=n[t],a=St(i,r);if(a===void 0){g=!1,p.gap();continue}let c=e.b(t,o),l=s(a);d?g&&d(i)&&(u?(p.segment(m,h,c,h),p.add(c,l)):p.segment(m,h,c,l)):(g&&u&&p.add(c,h),p.add(c,l)),m=c,h=l,g=!0}p.finish()}function wt(t,n,r,i,a,o,s,c,l){let u=Math.max(1.5,o.barWidth*.15),d=A(o),f=NaN;t.beginPath(),t.fillStyle=c;for(let c=i;c<=a;c++){let i=n[c],a=St(i,r);if(a===void 0||!l(i))continue;let p=e.b(c,o);if(d){let e=Math.floor(p);if(e===f)continue;f=e}let m=s(a);t.moveTo(p+u,m),t.arc(p,m,u,0,Math.PI*2)}t.fill()}function Tt(t,n,r,i,a,o,s,c,l){let u=s(0);if(t.beginPath(),t.fillStyle=c,A(o)){let c=NaN,d=0,f=()=>{if(Number.isNaN(c))return;let e=s(d);t.rect(c,Math.min(e,u),1,Math.max(1,Math.abs(e-u)))};for(let t=i;t<=a;t++){let i=n[t],a=St(i,r);if(a===void 0||!l(i))continue;let s=Math.floor(e.b(t,o));s===c?Math.abs(a)>Math.abs(d)&&(d=a):(f(),c=s,d=a)}f(),t.fill();return}let d=Math.max(1,o.barWidth);for(let c=i;c<=a;c++){let i=n[c],a=St(i,r);if(a===void 0||!l(i))continue;let f=e.b(c,o),p=s(a);t.rect(f-d/2,Math.min(p,u),d,Math.max(1,Math.abs(p-u)))}t.fill()}var N=class{canResume(e,t,n){let r=t.series;if(!r||n<=0||n>r.length||r.length>e.length)return!1;for(let i=n;i<r.length;i++)if(r[i]&&!t.values.has(e[i].time))return!1;return!0}writePoint(e,t,n,r){e.series[n]=r,r?e.values.set(t[n].time,r):e.values.delete(t[n].time)}render(e,t,n,r){this.descriptor.plots&&xt(e,t,n,r,this.descriptor.plots)}drawLine(e,t,n,r,i){if(t.length<2||i?.visible===!1)return;let a=new j(e,n,r,lt(t.length,t[0].x,t[t.length-1].x),i?.dash);for(let e of t)a.add(e.x,e.y);a.finish()}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){if(t.length===n.length&<(t.length,t[0].x,t[t.length-1].x)){ut(e,t.map(e=>e.x),t.map(e=>e.y),n.map(e=>e.y),r);return}e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(t,n,r,i){let a=[],{from:o,to:s}=i.visibleRange;for(let c=o;c<=s&&c<r.length;c++){let o=t.values.get(r[c].time);o&&o[n]!==void 0&&a.push({x:e.b(c,i),y:e.w(o[n],i)})}return a}};function Et(e){let t=e.inputs;if(!t)return null;for(let e in t)if(t[e]?.source)return e;return null}function Dt(e,n){let r=Et(e);if(!r)return{kind:`bars`};let i=n[r],a=(0,t.parseIndicatorSource)(i);return a?{kind:`line`,...a}:(0,t.isPriceSource)(i)&&i!==`close`?{kind:`price`,source:i}:{kind:`bars`}}function Ot(e,n,r=null,i=0){let a=r&&i>0&&i<=r.length?r:[],o=a===r?i:0;a.length=e.length;for(let r=o;r<e.length;r++){let i=e[r];a[r]={...i,close:(0,t.sourcePrice)(i,n)}}return a}function kt(e,t,n){if(!t)return null;let r=-1;for(let i=0;i<e.length&&i<t.length;i++){let e=t[i]?.[n];if(e!==void 0&&Number.isFinite(e)){r=i;break}}if(r<0)return null;let i=Array(e.length-r),a=t[r][n];for(let o=r;o<e.length;o++){let s=t[o]?.[n];s!==void 0&&Number.isFinite(s)&&(a=s);let c=e[o];i[o-r]={time:c.time,open:a,high:a,low:a,close:a,volume:c.volume}}return{bars:i,start:r}}function At(e,t,n){if(t===0||!e.series)return e;let r=Array(n).fill(null);for(let i=0;i<e.series.length&&t+i<n;i++)r[t+i]=e.series[i];return{...e,series:r}}function jt(e){return{values:new Map,series:Array(e).fill(null)}}var Mt=1,Nt=class{registry=new Map;instances=new Map;styleDefaults=new Map;order=null;register(e){this.registry.set(e.descriptor.id,e)}getAvailableIndicators(){return Array.from(this.registry.values()).map(e=>e.descriptor)}addIndicator(e,t={},n,r={}){let i=this.registry.get(e);if(!i)throw Error(`Unknown indicator: ${e}`);let a=this.claimInstanceId(e,r.instanceId),o={id:e,instanceId:a,params:{...i.descriptor.defaultConfig,...t},visible:!0};r.pane&&this.canHost(r.pane)&&(o.pane=r.pane),r.scale===`left`&&i.descriptor.placement===`overlay`&&!o.pane&&(o.scale=`left`);let s=this.styleDefaults.get(e),c={...s?.plots,...o.style?.plots},l={plugin:i,config:o,output:null,style:{colors:o.style?.colors??s?.colors?.slice()??Lt(this.freeColor(e,i.descriptor.placement,o.pane??null)),lineWidths:o.style?.lineWidths??s?.lineWidths?.slice()??[1.5],opacity:o.style?.opacity??s?.opacity??1,...Object.keys(c).length>0?{plots:Ft(c)}:{}},changedFrom:0};return this.instances.set(a,l),this.order=null,n&&this.compute(l,n),a}removeIndicator(e){this.instances.delete(e),this.order=null}updateIndicator(e,t,n){let r=this.instances.get(e);if(!r)return;let i=Et(r.plugin.descriptor);if(i&&i in t&&this.readsFromItself(e,{...r.config.params,...t})){let{[i]:e,...n}=t;t=n}if(Object.assign(r.config.params,t),delete r.sourceBars,delete r.lineInput,this.order=null,!n)return;let a=new Set([e,...this.getDependents(e)]);for(let e of this.ordered())a.has(e.config.instanceId)&&this.compute(e,n)}recalculateAll(e){for(let t of this.ordered())this.compute(t,e)}recalculateFrom(e,t){for(let n of this.ordered())this.compute(n,e,t)}compute(e,t,n){let{plugin:r,config:i}=e,a=Dt(r.descriptor,i.params);if(a.kind===`line`){this.computeFromLine(e,t,a.instanceId,a.key,n);return}delete e.lineInput;let o=t;a.kind===`price`?(e.sourceBars=Ot(t,a.source,e.sourceBars??null,n??0),o=e.sourceBars):delete e.sourceBars;let s=e.output,c=null;n!==void 0&&n>0&&s&&r.update&&(c=r.update(o,i,s,n)),e.changedFrom=c?Math.max(0,n-(r.revisesBefore?.(i)??0)):0,e.output=c??r.calculate(o,i)}computeFromLine(e,t,n,r,i){let{plugin:a,config:o}=e,s=this.instances.get(n),c=s?.output?.series,l=e.lineInput,u=i===void 0?void 0:Math.min(i,s?.changedFrom??0);if(u!==void 0&&c&&a.update&&l&&l.raw.series&&l.aligned.series&&l.sourceId===n&&l.key===r&&l.start<u&&u<=l.start+l.bars.length){let{start:n,bars:i}=l;i.length=t.length-n;let s=i[u-1-n].close;for(let e=u;e<t.length;e++){let a=c[e]?.[r];a!==void 0&&Number.isFinite(a)&&(s=a),i[e-n]={time:t[e].time,open:s,high:s,low:s,close:s,volume:t[e].volume}}let d=a.update(i,o,l.raw,u-n);if(d?.series){let r=Math.max(n,u-(a.revisesBefore?.(o)??0));if(l.raw=d,n===0)l.aligned=d;else{let e=l.aligned.series;e.length=t.length;for(let i=r;i<t.length;i++)e[i]=d.series[i-n]??null;l.aligned.values=d.values,l.aligned.meta=d.meta}e.output=l.aligned,e.changedFrom=r;return}}e.changedFrom=0;let d=kt(t,c,r);if(!d){delete e.lineInput,e.output=jt(t.length);return}let f=a.calculate(d.bars,o),p=At(f,d.start,t.length);e.lineInput={sourceId:n,key:r,start:d.start,bars:d.bars,raw:f,aligned:p},e.output=p}ordered(){if(this.order)return this.order;let e=[],t=new Map,n=r=>{let i=r.config.instanceId;if(t.get(i))return;t.set(i,`visiting`);let a=Dt(r.plugin.descriptor,r.config.params),o=a.kind===`line`?this.instances.get(a.instanceId):void 0;o&&n(o),t.set(i,`done`),e.push(r)};for(let e of this.instances.values())n(e);return this.order=e,e}readsFromItself(e,t){let n=this.instances.get(e);if(!n)return!1;let r=Dt(n.plugin.descriptor,t),i=new Set;for(;r.kind===`line`;){if(r.instanceId===e)return!0;if(i.has(r.instanceId))return!1;i.add(r.instanceId);let t=this.instances.get(r.instanceId);if(!t)return!1;r=Dt(t.plugin.descriptor,t.config.params)}return!1}canHost(e){let t=this.instances.get(e);return!!t&&t.plugin.descriptor.placement===`panel`&&!t.config.pane}getDependents(e){let t=[],n=new Set([e]),r=[e];for(;r.length;){let e=r.shift();for(let i of this.instances.values()){let a=Dt(i.plugin.descriptor,i.config.params),o=i.config.instanceId;a.kind===`line`&&a.instanceId===e&&!n.has(o)&&(n.add(o),t.push(o),r.push(o))}}return t}claimInstanceId(e,t){if(t&&!this.instances.has(t)){let e=Number(/_(\d+)$/.exec(t)?.[1]);return Number.isSafeInteger(e)&&e>=Mt&&(Mt=e+1),t}let n=`tc_${e}_${Mt++}`;for(;this.instances.has(n);)n=`tc_${e}_${Mt++}`;return n}getPaneMembers(e){let t=[];for(let n of this.instances.values())n.config.pane===e&&t.push(n.config.instanceId);return t}setPane(e,t){let n=this.instances.get(e);if(!n||t===e||t!==null&&!this.canHost(t))return!1;if(t===null?delete n.config.pane:(n.config.pane=t,delete n.config.scale),Rt(n.style.colors)){let t=n.plugin.descriptor.placement,r=n.config.pane??null;this.colorsInPane(t,r,e).has(n.style.colors[0])&&(n.style.colors=Lt(this.freeColor(n.config.id,t,r,e)))}return!0}colorsInPane(e,t,n){let r=new Set;for(let i of this.instances.values())i.config.instanceId!==n&&(t===null?e===`overlay`&&i.plugin.descriptor.placement===`overlay`&&!i.config.pane:i.config.instanceId===t||i.config.pane===t)&&r.add(i.style.colors[0]);return r}freeColor(e,n,r,i){let a=this.colorsInPane(n,r,i);for(let t of this.instances.values())t.config.id===e&&t.config.instanceId!==i&&a.add(t.style.colors[0]);let o=t.TC_SERIES_COLORS.findIndex(e=>!a.has(e));return o>=0?o:a.size%t.TC_SERIES_COLORS.length}getOutput(e){return this.instances.get(e)?.output??null}renderOverlays(e,t,n){for(let r of this.overlayDraws(t,n))r(e)}overlayDraws(e,t){let n=[];for(let r of this.instances.values()){let i=r.output;if(!i||!r.config.visible||r.plugin.descriptor.placement!==`overlay`||r.config.pane)continue;let a=r.config.scale===`left`?t??e:e;n.push(e=>r.plugin.render(e,i,a,r.style))}return n}hasLeftScaleOverlays(){for(let e of this.instances.values())if(e.config.scale===`left`&&e.config.visible)return!0;return!1}setScale(e,t){let n=this.instances.get(e);return!n||n.plugin.descriptor.placement!==`overlay`||n.config.pane?!1:(t===`left`?n.config.scale=`left`:delete n.config.scale,!0)}renderPanel(e,t,n){let r=this.instances.get(t);!r?.output||!r.config.visible||r.plugin.render(e,r.output,n,r.style)}getLatestValues(e){let t=this.instances.get(e);return t?It(t):[]}getLatestOverlayValues(e=`right`){let t=[];for(let n of this.instances.values())n.plugin.descriptor.placement!==`overlay`||n.config.pane||n.config.scale===`left`==(e===`left`)&&t.push(...It(n));return t}getIndicatorConfig(e){return this.instances.get(e)?.config??null}setVisible(e,t){let n=this.instances.get(e);return n?(n.config.visible=t,t):null}isVisible(e){return this.instances.get(e)?.config.visible??!1}getLevels(e){let t=this.instances.get(e);return t?[...t.config.levels??t.plugin.descriptor.levels??[]]:[]}setLevels(e,t){let n=this.instances.get(e);return n?(t===null?delete n.config.levels:n.config.levels=t.filter(e=>Number.isFinite(e)),!0):!1}getPaneValueRange(e,t,n,r=!1){let i=null;for(let a of[e,...this.getPaneMembers(e)]){let e=this.instances.get(a);if(!e||e.config.visible===!1)continue;let o=e.plugin.descriptor,s={keys:Pt(e),scale:o.scale,levels:e.config.levels??o.levels,zero:bt(o.plots)},c=r?vt(e.output,t,n,s):_t(e.output,t,n,s);if(c===!1)return null;c&&(i=i?{min:Math.min(i.min,c.min),max:Math.max(i.max,c.max)}:c)}return i}getIndicatorDescriptor(e){return this.instances.get(e)?.plugin.descriptor??null}getActiveIndicators(){let e=[];for(let[t,n]of this.instances)e.push({instanceId:t,id:n.config.id,params:{...n.config.params},descriptor:n.plugin.descriptor,visible:n.config.visible??!0,...n.config.pane?{pane:n.config.pane}:{}});return e}getIndicatorStyle(e){let t=this.instances.get(e)?.style;return t?{colors:[...t.colors],lineWidths:[...t.lineWidths],opacity:t.opacity,...t.plots?{plots:Ft(t.plots)}:{}}:null}updateIndicatorStyle(e,t){let n=this.instances.get(e);if(!n)return;let{plots:r,...i}=t;if(Object.assign(n.style,i),r){let e=Ft(n.style.plots??{});for(let[t,n]of Object.entries(r))e[t]={...e[t],...n};n.style.plots=e}}setPlotStyles(e,t){let n=this.instances.get(e);n&&(t&&Object.keys(t).length>0?n.style.plots=Ft(t):delete n.style.plots)}setStyleDefaults(e,t){t?this.styleDefaults.set(e,{...t,...t.plots?{plots:Ft(t.plots)}:{}}):this.styleDefaults.delete(e)}getOverlayPriceRange(e,t,n=`right`){let r=1/0,i=-1/0;for(let a of this.instances.values()){if(!a.output||!a.config.visible||a.plugin.descriptor.placement!==`overlay`||a.config.pane||a.config.scale===`left`!=(n===`left`))continue;let o=a.output.series;if(!o)continue;let s=Pt(a),c=Math.min(t,o.length-1);for(let t=Math.max(0,e);t<=c;t++){let e=o[t];if(e){if(s){for(let t=0;t<s.length;t++){let n=e[s[t]];n!==void 0&&isFinite(n)&&(n<r&&(r=n),n>i&&(i=n))}continue}for(let t in e){let n=e[t];n!==void 0&&isFinite(n)&&(n<r&&(r=n),n>i&&(i=n))}}}}return r===1/0?null:{min:r,max:i}}getPanelIndicators(){let e=[];for(let[t,n]of this.instances)n.plugin.descriptor.placement===`panel`&&e.push({instanceId:t,descriptor:n.plugin.descriptor});return e}};function Pt(e){let t=ft(e.plugin.descriptor),n=e.style.plots;return t&&n?t.filter(e=>n[e]?.visible!==!1):t}function Ft(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,{...t}]))}function It(e){let t=e.output?.series,n=e.plugin.descriptor.plots;if(!t||!n||e.config.visible===!1)return[];let r=t[t.length-1];if(!r)return[];let i=[];for(let t of n){if(!mt(t,e.style))continue;let n=r[t.key];n!==void 0&&Number.isFinite(n)&&i.push({value:n,color:gt(t,e.style,r)})}return i}function Lt(e){return[...t.TC_SERIES_COLORS.slice(e),...t.TC_SERIES_COLORS.slice(0,e)]}function Rt(e){let n=t.TC_SERIES_COLORS.length;if(e.length!==n)return!1;let r=t.TC_SERIES_COLORS.indexOf(e[0]);return r>=0&&e.every((e,i)=>e===t.TC_SERIES_COLORS[(r+i)%n])}var P=class extends Map{keyBuf=[];valBuf=[];folded=!1;constructor(){super()}set(e,t){if(this.folded)return super.set(e,t);let n=this.keyBuf,r=n.length;if(r===0||e>n[r-1])return n.push(e),this.valBuf.push(t),this;let i=this.indexOf(e);return i>=0?(this.valBuf[i]=t,this):(this.fold(),super.set(e,t))}get(e){if(this.folded)return super.get(e);let t=this.indexOf(e);return t>=0?this.valBuf[t]:void 0}has(e){return this.folded?super.has(e):this.indexOf(e)>=0}delete(e){if(this.folded)return super.delete(e);let t=this.indexOf(e);return t<0?!1:(this.keyBuf.splice(t,1),this.valBuf.splice(t,1),!0)}clear(){super.clear(),this.keyBuf=[],this.valBuf=[],this.folded=!1}get size(){return this.folded?super.size:this.keyBuf.length}forEach(e,t){this.fold(),super.forEach(e,t)}entries(){return this.fold(),super.entries()}keys(){return this.fold(),super.keys()}values(){return this.fold(),super.values()}[Symbol.iterator](){return this.fold(),super[Symbol.iterator]()}indexOf(e){let t=this.keyBuf,n=0,r=t.length-1;for(;n<=r;){let i=n+r>>1,a=t[i];if(a===e)return i;a<e?n=i+1:r=i-1}return-1}fold(){if(this.folded)return;this.folded=!0;let e=this.keyBuf,t=this.valBuf;for(let n=0;n<e.length;n++)super.set(e[n],t[n]);this.keyBuf=[],this.valBuf=[]}};function F(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function I(e,t,n,r=1){let i=F(e,t,n);return Math.max(r,Math.floor(i))}var zt=class extends N{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`SMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`SMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;this.writePoint(n,e,t,{value:r/i})}return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},Bt=class extends N{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`EMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`EMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=2/(n+1),i=new P,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}update(e,t,n,r){let i=I(t,`period`,20,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;let o=2/(i+1);for(let t=r;t<e.length;t++)a=(e[t].close-a)*o+a,this.writePoint(n,e,t,{value:a});return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},Vt=class extends N{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`BB`,inputs:{source:{source:!0}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=F(t,`stdDev`,2),i=new P,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1),a=F(t,`stdDev`,2);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=0;for(let n=t-i+1;n<=t;n++){let t=e[n].close;r+=t,o+=t*t}let s=r/i,c=Math.sqrt(Math.max(0,o/i-s*s));this.writePoint(n,e,t,{middle:s,upper:s+a*c,lower:s-a*c})}return n}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=0,u=c-s+1,d=new Float64Array(u),f=new Float64Array(u),p=new Float64Array(u),m=new Float64Array(u);for(let t=s;t<=c&&t<o.length;t++){let n=o[t];!n||n.upper===void 0||(d[l]=e.b(t,i),f[l]=e.w(n.upper,i),p[l]=e.w(n.middle,i),m[l]=e.w(n.lower,i),l++)}if(l<2)return;let h=A(i),g=d.subarray(0,l);if(h)ut(n,g,f,m,(0,t.withAlpha)(a.colors[0],.1),l);else{n.beginPath(),n.moveTo(d[0],f[0]);for(let e=1;e<l;e++)n.lineTo(d[e],f[e]);for(let e=l-1;e>=0;e--)n.lineTo(d[e],m[e]);n.closePath(),n.fillStyle=(0,t.withAlpha)(a.colors[0],.1),n.fill()}let _=(e,t,r)=>{let i=M(a,r,a.lineWidths[0]);if(!i.visible)return;let o=new j(n,t,a.lineWidths[0],h,i.dash);for(let t=0;t<l;t++)o.add(g[t],e[t]);o.finish()};_(f,a.colors[0],`upper`),_(p,a.colors[1]??a.colors[0],`middle`),_(m,a.colors[0],`lower`)}},Ht=class extends N{descriptor={id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{},shortName:`VWAP`,plots:[{key:`value`,title:`VWAP`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null),i=0,a=0;for(let t=0;t<e.length;t++){let o=(e[t].high+e[t].low+e[t].close)/3;if(i+=e[t].volume,a+=o*e[t].volume,i>0){let o={value:a/i};n.set(e[t].time,o),r[t]=o}}return{values:n,series:r}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},Ut=class extends N{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26},shortName:`Ichimoku`,plots:[{key:`tenkan`,title:`Conversion`,color:0},{key:`kijun`,title:`Base`,color:1},{key:`senkouA`,title:`Lead A`,color:2},{key:`senkouB`,title:`Lead B`,color:3}]};calculate(e,t){let n=I(t,`tenkan`,9,1),r=I(t,`kijun`,26,1),i=I(t,`senkou`,52,1),a=new P,o=Array(e.length).fill(null),s=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},c=s(n),l=s(r),u=s(i);for(let t=0;t<e.length;t++){let s={};t>=n-1&&(s.tenkan=(c.highs[t]+c.lows[t])/2),t>=r-1&&(s.kijun=(l.highs[t]+l.lows[t])/2),s.tenkan!==void 0&&s.kijun!==void 0&&(s.senkouA=(s.tenkan+s.kijun)/2),t>=i-1&&(s.senkouB=(u.highs[t]+u.lows[t])/2),t>=r-1&&(s.chikou=e[t].close),(s.tenkan!==void 0||s.kijun!==void 0||s.senkouA!==void 0||s.senkouB!==void 0)&&(a.set(e[t].time,s),o[t]=s)}return{values:a,series:o}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=c-s+1,u=new Float64Array(l),d=new Float64Array(l),f=0,p=new Float64Array(l),m=new Float64Array(l),h=0,g=new Float64Array(l),_=new Float64Array(l),v=0,y=new Float64Array(l),b=new Float64Array(l),x=0;for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.tenkan!==void 0&&(u[f]=r,d[f]=e.w(n.tenkan,i),f++),n.kijun!==void 0&&(p[h]=r,m[h]=e.w(n.kijun,i),h++),n.senkouA!==void 0&&(g[v]=r,_[v]=e.w(n.senkouA,i),v++),n.senkouB!==void 0&&(y[x]=r,b[x]=e.w(n.senkouB,i),x++)}if(v>1&&x>1){let e=Math.min(v,x);n.beginPath(),n.moveTo(g[0],_[0]);for(let t=1;t<e;t++)n.lineTo(g[t],_[t]);for(let t=e-1;t>=0;t--)n.lineTo(y[t],b[t]);n.closePath(),n.fillStyle=(0,t.withAlpha)(a.colors[2]??`#1fa874`,.15),n.fill()}let S=(e,t,r,i,o,s)=>{let c=M(a,e,s);if(!(i<2||!c.visible)){n.beginPath(),n.strokeStyle=o,n.lineWidth=s,n.lineJoin=`round`,n.setLineDash(c.dash),n.moveTo(t[0],r[0]);for(let e=1;e<i;e++)n.lineTo(t[e],r[e]);n.stroke(),n.setLineDash([])}};S(`tenkan`,u,d,f,a.colors[0],a.lineWidths[0]),S(`kijun`,p,m,h,a.colors[1]??`#f2a93b`,a.lineWidths[0]),S(`senkouA`,g,_,v,a.colors[2]??`#1fa874`,1),S(`senkouB`,y,b,x,a.colors[3]??`#e8505b`,1)}},Wt=class extends N{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2},shortName:`SAR`,plots:[{key:`value`,title:`SAR`,color:0,kind:`dots`,tone:{field:`trend`},downColor:1}]};calculate(e,t){let n=F(t,`step`,.02),r=F(t,`max`,.2),i=new P,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}render(t,n,r,i){let a=n.series;if(!a||i.plots?.value?.visible===!1)return;let{from:o,to:s}=r.visibleRange,c=Math.max(1.5,r.barWidth*.15);for(let n=o;n<=s&&n<a.length;n++){let o=a[n];if(!o||o.value===void 0)continue;let s=e.b(n,r),l=e.w(o.value,r);t.beginPath(),t.arc(s,l,c,0,Math.PI*2),t.fillStyle=o.trend===1?i.colors[0]:i.colors[1]??`#e8505b`,t.fill()}}},Gt=class extends N{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3},shortName:`Supertrend`,plots:[{key:`value`,title:`Supertrend`,color:0,tone:{field:`trend`},downColor:1}]};calculate(e,t){let n=I(t,`period`,10,1),r=F(t,`multiplier`,3),i=new P,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s;c=g<u||e[t-1].close>u?g:u,l=_>d||e[t-1].close<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let v={value:f,trend:m};i.set(e[t].time,v),a[t]=v,u=c,d=l,p=f}return{values:i,series:a}}render(t,n,r,i){let a=n.series;if(!a||i.plots?.value?.visible===!1)return;let{from:o,to:s}=r.visibleRange,c=i.colors[0],l=i.colors[1]??`#e8505b`,u=A(r),d=i.lineWidths[0]+.5;for(let[n,i]of[[c,1],[l,-1]]){let c=new j(t,n,d,u),l=0,f=0,p=!1;for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let o=e.b(t,r),s=e.w(n.value,r);p&&(n.trend??1)===i&&c.segment(l,f,o,s),l=o,f=s,p=!0}c.finish()}}},Kt=class extends N{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5},shortName:`KC`,plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`emaPeriod`,20,1),r=I(t,`atrPeriod`,10,1),i=F(t,`multiplier`,1.5),a=new P;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.upper!==void 0&&l.push({x:r,y:e.w(n.upper,i)}),n.middle!==void 0&&u.push({x:r,y:e.w(n.middle,i)}),n.lower!==void 0&&d.push({x:r,y:e.w(n.lower,i)})}this.drawBand(n,l,d,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??a.colors[0],a.lineWidths[0],M(a,`middle`,a.lineWidths[0])),this.drawLine(n,d,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0]))}},qt=class extends N{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20},shortName:`DC`,plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.upper!==void 0&&l.push({x:r,y:e.w(n.upper,i)}),n.middle!==void 0&&u.push({x:r,y:e.w(n.middle,i)}),n.lower!==void 0&&d.push({x:r,y:e.w(n.lower,i)})}this.drawBand(n,l,d,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??`#7d8696`,1,M(a,`middle`,1)),this.drawLine(n,d,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0]))}},Jt=[`s3`,`s2`,`s1`,`pp`,`r1`,`r2`,`r3`],Yt=[`traditional`,`fibonacci`,`woodie`,`classic`,`camarilla`,`dm`],Xt=class extends N{descriptor={id:`pivots`,name:`Pivot Points`,placement:`overlay`,defaultConfig:{lookback:24,type:`traditional`},shortName:`Pivots`,inputs:{lookback:{min:1},type:{options:Yt}},plots:[{key:`r3`,title:`R3`,color:1},{key:`r2`,title:`R2`,color:1},{key:`r1`,title:`R1`,color:1},{key:`pp`,title:`P`,color:0},{key:`s1`,title:`S1`,color:2},{key:`s2`,title:`S2`,color:2},{key:`s3`,title:`S3`,color:2}]};calculate(e,t){let n=I(t,`lookback`,24,1),r=Yt.includes(t.params.type)?t.params.type:`traditional`,i=new P,a=Array(e.length).fill(null);if(e.length<=n)return{values:i,series:a};for(let t=n;t<e.length;t++){let o=-1/0,s=1/0;for(let r=t-n;r<t;r++)e[r].high>o&&(o=e[r].high),e[r].low<s&&(s=e[r].low);let c=Zt(r,e[t-n].open,o,s,e[t-1].close);i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=a.colors[0],u=a.colors[1]??`#e8505b`,d=a.colors[2]??`#1fa874`,f=a.lineWidths[0],p=e=>e===`pp`?l:e.startsWith(`r`)?u:d;for(let r of Jt){let l=a.plots?.[r];if(l?.visible===!1)continue;n.beginPath(),n.strokeStyle=p(r),n.lineWidth=r===`pp`?f:Math.max(1,f-1),n.setLineDash((0,t.lineDash)(l?.lineStyle??(r===`pp`?`solid`:`dashed`),[4,3],n.lineWidth));let u=!1;for(let t=s;t<=c&&t<o.length;t++){let a=o[t]?.[r];if(a===void 0)continue;let s=e.b(t,i),c=e.w(a,i);u?n.lineTo(s,c):(n.moveTo(s,c),u=!0)}n.stroke(),n.setLineDash([])}}};function Zt(e,t,n,r,i){let a=n-r;if(e===`dm`){let e=i<t?n+2*r+i:i>t?2*n+r+i:n+r+2*i;return{pp:e/4,r1:e/2-r,s1:e/2-n}}if(e===`camarilla`){let e=a*1.1;return{pp:(n+r+i)/3,r1:i+e/12,s1:i-e/12,r2:i+e/6,s2:i-e/6,r3:i+e/4,s3:i-e/4}}let o=e===`woodie`?(n+r+2*i)/4:(n+r+i)/3;if(e===`fibonacci`)return{pp:o,r1:o+.382*a,s1:o-.382*a,r2:o+.618*a,s2:o-.618*a,r3:o+a,s3:o-a};let s=2*o-r,c=2*o-n;return e===`classic`?{pp:o,r1:s,s1:c,r2:o+a,s2:o-a,r3:o+2*a,s3:o-2*a}:{pp:o,r1:s,s1:c,r2:o+a,s2:o-a,r3:n+2*(o-r),s3:r-2*(n-o)}}var Qt=class extends N{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0},shortName:`AVWAP`,plots:[{key:`value`,title:`AVWAP`,color:0}]};calculate(e,t){let n=F(t,`anchorTime`,0),r=new P,i=Array(e.length).fill(null),a=0;if(n>0&&(a=e.findIndex(e=>e.time>=n),a<0))return{values:r,series:i};let o=0,s=0;for(let t=a;t<e.length;t++){let n=(e[t].high+e[t].low+e[t].close)/3;if(o+=e[t].volume,s+=n*e[t].volume,o>0){let n={value:s/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},$t=class extends N{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5},shortName:`ZigZag`,plots:[{key:`pivot`,title:`Pivot`,color:0}]};calculate(e,t){let n=Math.max(.01,F(t,`deviation`,5))/100,r=new P,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(t,n,r,i){if(i.plots?.pivot?.visible===!1)return;let a=n.meta?.pivots;if(!(!a||a.length<2)){t.beginPath(),t.strokeStyle=i.colors[0],t.lineWidth=i.lineWidths[0],t.lineJoin=`round`;for(let n=0;n<a.length;n++){let i=a[n],o=e.b(i.idx,r),s=e.w(i.price,r);n===0?t.moveTo(o,s):t.lineTo(o,s)}t.stroke()}}},en=class extends N{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2,source:`close`},shortName:`LRC`,inputs:{source:{source:!0}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,100,2),r=F(t,`stdDev`,2),i=new P,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i);n.middle!==void 0&&u.push({x:r,y:e.w(n.middle,i)}),n.upper!==void 0&&l.push({x:r,y:e.w(n.upper,i)}),n.lower!==void 0&&d.push({x:r,y:e.w(n.lower,i)})}this.drawBand(n,l,d,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??a.colors[0],a.lineWidths[0],M(a,`middle`,a.lineWidths[0])),this.drawLine(n,d,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0]))}},tn=class extends N{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21,source:`close`},shortName:`HMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`HMA`,color:0}]};calculate(e,t){let n=I(t,`period`,21,2),r=new P,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=nn(a,n),l=nn(a,o),u=rn(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}};function nn(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function rn(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var an=class extends N{descriptor={id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`,source:`close`},shortName:`MTF MA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`MA`,color:0}]};calculate(e,n){let r=I(n,`period`,50,1),i=String(n.params.timeframe??`1d`),a=new P,o=Array(e.length).fill(null);if(e.length===0)return{values:a,series:o};let s=[],c=(0,t.timeframeBucketStart)(e[0].time,i),l=e[0].close,u=null,d=()=>{if(s.length<r)return;let e=0;for(let t=s.length-r;t<s.length;t++)e+=s[t];u=e/r};for(let n=0;n<e.length;n++){let r=(0,t.timeframeBucketStart)(e[n].time,i);if(r!==c&&(s.push(l),d(),c=r),l=e[n].close,u!==null){let t={value:u};a.set(e[n].time,t),o[n]=t}}return{values:a,series:o}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},on=class extends N{descriptor={id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1},shortName:`SVWAP`,plots:[{key:`value`,title:`VWAP`,color:0},{key:`u1`,title:`+1σ`,color:1},{key:`l1`,title:`−1σ`,color:1},{key:`u2`,title:`+2σ`,color:1},{key:`l2`,title:`−2σ`,color:1},{key:`u3`,title:`+3σ`,color:1},{key:`l3`,title:`−3σ`,color:1}]};calculate(e,n){let r=Math.min(3,I(n,`bands`,1,0)),i=new P,a=Array(e.length).fill(null);if(e.length===0)return{values:i,series:a};let o=(0,t.timeframeBucketStart)(e[0].time,`1d`),s=0,c=0,l=0;for(let n=0;n<e.length;n++){let u=e[n],d=(0,t.timeframeBucketStart)(u.time,`1d`);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,t={value:e,session:o};if(r>0){let n=Math.max(0,c/l-e*e),i=Math.sqrt(n);for(let n=1;n<=r;n++)t[`u${n}`]=e+n*i,t[`l${n}`]=e-n*i}i.set(u.time,t),a[n]=t}}return{values:i,series:a}}render(e,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange;e.globalAlpha=.55,e.lineWidth=1,e.strokeStyle=i.colors[1]??i.colors[0];let c=n=>{let c=i.plots?.[n];c?.visible!==!1&&(e.setLineDash(c?.lineStyle?(0,t.lineDash)(c.lineStyle,[4,3],1):[4,3]),this.strokeBandSeries(e,a,r,o,s,e=>e[n]))};for(let e=1;e<=3;e++)c(`u${e}`),c(`l${e}`);e.setLineDash([]),e.globalAlpha=1;let l=i.plots?.value;l?.visible!==!1&&(e.strokeStyle=i.colors[0],e.lineWidth=i.lineWidths[0],e.lineJoin=`round`,e.setLineDash((0,t.lineDash)(l?.lineStyle??`solid`,[6,4],i.lineWidths[0])),this.strokeBandSeries(e,a,r,o,s,e=>e.value),e.setLineDash([]))}strokeBandSeries(t,n,r,i,a,o){let s=new j(t,String(t.strokeStyle),t.lineWidth,A(r)),c;for(let t=i;t<=a&&t<n.length;t++){let i=n[t],a=i?o(i):void 0;if(i===null||a===void 0){s.gap();continue}let l=e.b(t,r),u=e.w(a,r);i.session!==c&&s.gap(),s.add(l,u),c=i.session}s.finish()}},sn=class extends N{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3},shortName:`CE`,plots:[{key:`long`,title:`Long`,color:0},{key:`short`,title:`Short`,color:1}]};calculate(e,t){let n=I(t,`period`,22,1),r=F(t,`multiplier`,3),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=(r,l)=>{let u=a.plots?.[r];if(u?.visible===!1)return;n.beginPath(),n.strokeStyle=l,n.lineWidth=a.lineWidths[0],n.lineJoin=`round`,n.setLineDash(u?.lineStyle?(0,t.lineDash)(u.lineStyle,[5,3],a.lineWidths[0]):[5,3]);let d=!1;for(let t=s;t<=c&&t<o.length;t++){let a=o[t];if(!a||a[r]===void 0){d=!1;continue}let s=e.b(t,i),c=e.w(a[r],i);d?n.lineTo(s,c):(n.moveTo(s,c),d=!0)}n.stroke(),n.setLineDash([])};l(`long`,a.colors[0]??`#1fa874`),l(`short`,a.colors[1]??`#e8505b`)}},cn=class extends N{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3},shortName:`Alligator`,plots:[{key:`jaw`,title:`Jaw`,color:0},{key:`teeth`,title:`Teeth`,color:1},{key:`lips`,title:`Lips`,color:2}]};calculate(e,t){let n=I(t,`jaw`,13,1),r=I(t,`teeth`,8,1),i=I(t,`lips`,5,1),a=I(t,`jawShift`,8,0),o=I(t,`teethShift`,5,0),s=I(t,`lipsShift`,3,0),c=new P,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=ln(d,n),p=ln(d,r),m=ln(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=(n,c)=>{let l=M(i,n,i.lineWidths[0]);if(!l.visible)return;let u=new j(t,c,i.lineWidths[0],A(r),l.dash);for(let t=o;t<=s&&t<a.length;t++){let i=a[t];if(!i||i[n]===void 0){u.gap();continue}let o=e.b(t,r),s=e.w(i[n],r);u.add(o,s)}u.finish()};c(`jaw`,i.colors[0]??`#4c8dff`),c(`teeth`,i.colors[1]??`#e8505b`),c(`lips`,i.colors[2]??`#1fa874`)}};function ln(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var un=class extends N{descriptor={id:`vwma`,name:`Volume Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`VWMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`VWMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=0,o=0;for(let t=0;t<e.length;t++){let s=e[t].close*e[t].volume;if(a+=s,o+=e[t].volume,t>=n){let r=e[t-n];a-=r.close*r.volume,o-=r.volume}if(t>=n-1&&o>0){let n={value:a/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,a=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close*e[n].volume,a+=e[n].volume;this.writePoint(n,e,t,a>0?{value:r/a}:null)}return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},dn=class extends N{descriptor={id:`wma`,name:`Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`WMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`WMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=n*(n+1)/2,o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(s+=c*n-o,o+=c,t>=n&&(o-=e[t-n].close),t>=n-1){let n={value:s/a};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1),a=i*(i+1)/2;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=t-i+1;for(let t=0;t<i;t++)r+=e[o+t].close*(t+1);this.writePoint(n,e,t,{value:r/a})}return n}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},fn=class extends N{descriptor={id:`envelope`,name:`Moving Average Envelope`,placement:`overlay`,defaultConfig:{period:20,percent:2.5,source:`close`},shortName:`Env`,inputs:{source:{source:!0}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`basis`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=F(t,`percent`,2.5)/100,i=new P,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let s=o/n,c={basis:s,upper:s*(1+r),lower:s*(1-r)};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`period`,20,1),a=F(t,`percent`,2.5)/100;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;let o=r/i;this.writePoint(n,e,t,{basis:o,upper:o*(1+a),lower:o*(1-a)})}return n}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n||n.upper===void 0)continue;let r=e.b(t,i);l.push({x:r,y:e.w(n.upper,i)}),u.push({x:r,y:e.w(n.lower,i)}),d.push({x:r,y:e.w(n.basis,i)})}this.drawBand(n,l,u,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[0],a.lineWidths[0],M(a,`lower`,a.lineWidths[0])),this.drawLine(n,d,a.colors[1]??a.colors[0],a.lineWidths[0],M(a,`basis`,a.lineWidths[0]))}};function pn(e,t){let n=2/(t+1),r=Array(e.length).fill(null),i=0,a=0;for(let o=0;o<e.length;o++){if(o<t-1){a+=e[o];continue}i=o===t-1?(a+e[o])/t:(e[o]-i)*n+i,r[o]=i}return r}function mn(e,t,n){let r=Array(n).fill(null);for(let n=0;n<e.length;n++)e[n]!==null&&(r[t[n]]=e[n]);return r}function hn(e){let t=[],n=[];for(let r=0;r<e.length;r++)e[r]!==null&&(t.push(e[r]),n.push(r));return{values:t,indices:n}}var gn=class extends N{descriptor={id:`tema`,name:`Triple EMA`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`TEMA`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`TEMA`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null),a=pn(e.map(e=>e.close),n),o=hn(a),s=mn(pn(o.values,n),o.indices,e.length),c=hn(s),l=mn(pn(c.values,n),c.indices,e.length);for(let t=0;t<e.length;t++){let n=a[t],o=s[t],c=l[t];if(n===null||o===null||c===null)continue;let u={value:3*n-3*o+c};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=M(i,`value`,i.lineWidths[0]);if(!c.visible)return;let l=new j(t,i.colors[0],i.lineWidths[0],A(r),c.dash);for(let t=o;t<=s&&t<a.length;t++){let n=a[t];if(!n||n.value===void 0)continue;let i=e.b(t,r),o=e.w(n.value,r);l.add(i,o)}l.finish()}},_n=class extends N{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34},shortName:`AO`,plots:[{key:`value`,title:`AO`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e,t){let n=I(t,`fast`,5,1),r=I(t,`slow`,34,1),i=new P,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}},vn=class extends N{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10},shortName:`Chaikin Osc`,plots:[{key:`value`,title:`Chaikin`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=I(t,`fast`,3,1),r=I(t,`slow`,10,1),i=new P,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}},yn=class extends N{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`RSI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`RSI`,color:0}],scale:{min:0,max:100},levels:[30,70]};smoothing=new WeakMap;calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a={values:r,series:i};if(e.length<n+1)return a;let o=[],s=[],c=0,l=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?c+=n:l-=n}c/=n,l/=n,o[n]=c,s[n]=l;let u={value:l===0?100:100-100/(1+c/l)};r.set(e[n].time,u),i[n]=u;for(let t=n+1;t<e.length;t++){let a=e[t].close-e[t-1].close,u=a>0?a:0,d=a<0?-a:0;c=(c*(n-1)+u)/n,l=(l*(n-1)+d)/n,o[t]=c,s[t]=l;let f={value:l===0?100:100-100/(1+c/l)};r.set(e[t].time,f),i[t]=f}return this.smoothing.set(a,{gain:o,loss:s}),a}update(e,t,n,r){let i=I(t,`period`,14,1),a=this.smoothing.get(n);if(!a||r<=i||!this.canResume(e,n,r))return null;let o=a.gain[r-1],s=a.loss[r-1];if(o===void 0||s===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close-e[t-1].close,c=r>0?r:0,l=r<0?-r:0;o=(o*(i-1)+c)/i,s=(s*(i-1)+l)/i,a.gain[t]=o,a.loss[t]=s;let u=s===0?100:100-100/(1+o/s);this.writePoint(n,e,t,{value:u})}return n}},bn=class extends N{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9,source:`close`},shortName:`MACD`,inputs:{source:{source:!0}},plots:[{key:`histogram`,title:`Histogram`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`macd`,title:`MACD`,color:0},{key:`signal`,title:`Signal`,color:1}]};emas=new WeakMap;calculate(e,t){let n=I(t,`fast`,12,1),r=I(t,`slow`,26,1),i=I(t,`signal`,9,1),a=new P,o=Array(e.length).fill(null),s={values:a,series:o};if(e.length<r)return s;let c=2/(n+1),l=2/(r+1),u=2/(i+1),d=Array(e.length),f=Array(e.length),p=e[0].close,m=e[0].close,h=0,g=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(p=n,m=n):(p=(n-p)*c+p,m=(n-m)*l+m),d[t]=p,f[t]=m,t>=r-1){let n=p-m;g?h=(n-h)*u+h:(h=n,g=!0);let r=n-h,i={macd:n,signal:h,histogram:r};a.set(e[t].time,i),o[t]=i}}return this.emas.set(s,{fast:d,slow:f}),s}update(e,t,n,r){let i=I(t,`fast`,12,1),a=I(t,`slow`,26,1),o=I(t,`signal`,9,1),s=this.emas.get(n);if(!s||r<a||!this.canResume(e,n,r))return null;let c=s.fast[r-1],l=s.slow[r-1],u=n.series[r-1]?.signal;if(c===void 0||l===void 0||u===void 0)return null;let d=2/(i+1),f=2/(a+1),p=2/(o+1);for(let t=r;t<e.length;t++){let r=e[t].close;c=(r-c)*d+c,l=(r-l)*f+l,s.fast[t]=c,s.slow[t]=l;let i=c-l;u=(i-u)*p+u,this.writePoint(n,e,t,{macd:i,signal:u,histogram:i-u})}return n}},xn=class extends N{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3},shortName:`Stoch`,plots:[{key:`k`,title:`%K`,color:0},{key:`d`,title:`%D`,color:1}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=I(t,`kPeriod`,14,1),r=I(t,`dPeriod`,3,1),i=I(t,`smooth`,3,1),a=new P,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=I(t,`kPeriod`,14,1),a=I(t,`dPeriod`,3,1),o=I(t,`smooth`,3,1),s=i-1+o-1,c=t=>{let n=-1/0,r=1/0;for(let a=t-i+1;a<=t;a++)e[a].high>n&&(n=e[a].high),e[a].low<r&&(r=e[a].low);return n===r?50:(e[t].close-r)/(n-r)*100},l=e=>{let t=0;for(let n=e-o+1;n<=e;n++)t+=c(n);return t/o};for(let t=r;t<e.length;t++){if(t<s||e.length<i){this.writePoint(n,e,t,null);continue}let r={k:l(t)};if(t>=s+a-1){let e=0;for(let n=t-a+1;n<=t;n++)e+=l(n);r.d=e/a}this.writePoint(n,e,t,r)}return n}},Sn=class extends N{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14},shortName:`ATR`,plots:[{key:`value`,title:`ATR`,color:0}]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<Math.max(2,n))return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}update(e,t,n,r){let i=I(t,`period`,14,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;for(let t=r;t<e.length;t++){let r=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a=(a*(i-1)+r)/i,this.writePoint(n,e,t,{value:a})}return n}},Cn=class extends N{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14},shortName:`ADX`,plots:[{key:`adx`,title:`ADX`,color:0},{key:`plusDI`,title:`+DI`,color:1},{key:`minusDI`,title:`−DI`,color:2}],scale:{min:0}};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}},wn=class extends N{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{},shortName:`OBV`,plots:[{key:`value`,title:`OBV`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;for(let t=r;t<e.length;t++)e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume),this.writePoint(n,e,t,{value:i});return n}},Tn=class extends N{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14},shortName:`%R`,plots:[{key:`value`,title:`%R`,color:0}],scale:{min:-100,max:0},levels:[-80,-20]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},En=class extends N{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20},shortName:`CCI`,plots:[{key:`value`,title:`CCI`,color:0}],levels:[-100,0,100]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}},Dn=class extends N{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14},shortName:`MFI`,plots:[{key:`value`,title:`MFI`,color:0}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}},On=class extends N{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25},shortName:`Aroon`,plots:[{key:`up`,title:`Up`,color:0},{key:`down`,title:`Down`,color:1}],scale:{min:0,max:100}};calculate(e,t){let n=I(t,`period`,25,1),r=new P,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}},kn=class extends N{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12,source:`close`},shortName:`ROC`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`ROC`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,12,1),r=new P,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}},An=class extends N{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7,source:`close`},shortName:`TSI`,inputs:{source:{source:!0}},plots:[{key:`tsi`,title:`TSI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=I(t,`longPeriod`,25,1),r=I(t,`shortPeriod`,13,1),i=I(t,`signalPeriod`,7,1),a=new P,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}},jn=class extends N{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20},shortName:`CMF`,plots:[{key:`value`,title:`CMF`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},Mn=class extends N{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0},shortName:`Vol Δ`,plots:[{key:`value`,title:`Delta`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e,t){let n=F(t,`mode`,0)>=1,r=new P,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}},Nn=class extends N{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14},shortName:`VI`,plots:[{key:`viPlus`,title:`VI+`,color:0},{key:`viMinus`,title:`VI−`,color:1}],levels:[1]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}},Pn=class extends N{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14},shortName:`CHOP`,plots:[{key:`value`,title:`CHOP`,color:0}],scale:{min:0,max:100},levels:[38.2,61.8]};calculate(e,t){let n=I(t,`period`,14,2),r=new P,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}},Fn=class extends N{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28},shortName:`UO`,plots:[{key:`value`,title:`UO`,color:0}],scale:{min:0,max:100},levels:[30,70]};calculate(e,t){let n=I(t,`fast`,7,1),r=I(t,`mid`,14,1),i=I(t,`slow`,28,1),a=new P,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=In(l(s,t,n),l(c,t,n)),d=In(l(s,t,r),l(c,t,r)),f=In(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}};function In(e,t){return t===0?0:e/t}var Ln=class extends N{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13},shortName:`EFI`,plots:[{key:`value`,title:`EFI`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,13,1),r=new P,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}},Rn=class extends N{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100,source:`close`},shortName:`CRSI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`CRSI`,color:0}],scale:{min:0,max:100},levels:[10,90]};calculate(e,t){let n=I(t,`rsiPeriod`,3,1),r=I(t,`streakPeriod`,2,1),i=I(t,`rankPeriod`,100,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=zn(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=zn(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}};function zn(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var Bn=class extends N{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10,source:`close`},shortName:`Coppock`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`Coppock`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`longRoc`,14,1),r=I(t,`shortRoc`,11,1),i=I(t,`wma`,10,1),a=new P,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}},Vn=class extends N{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9,source:`close`},shortName:`KST`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`KST`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`roc1`,10,1),r=I(t,`roc2`,15,1),i=I(t,`roc3`,20,1),a=I(t,`roc4`,30,1),o=I(t,`sma1`,10,1),s=I(t,`sma2`,10,1),c=I(t,`sma3`,10,1),l=I(t,`sma4`,15,1),u=I(t,`signal`,9,1),d=new P,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=Un(Hn(m,n),o),g=Un(Hn(m,r),s),_=Un(Hn(m,i),c),v=Un(Hn(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=Un(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}};function Hn(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function Un(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var Wn=class extends N{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13},shortName:`Elder Ray`,plots:[{key:`bull`,title:`Bull`,color:0,kind:`histogram`},{key:`bear`,title:`Bear`,color:1,kind:`histogram`}]};calculate(e,t){let n=I(t,`period`,13,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(t,n,r,i){let a=n.series;if(!a)return;let o=Math.max(0,r.visibleRange.from),s=Math.min(r.visibleRange.to,a.length-1),c=e.T(r),l=c(0),u=Math.max(1,r.barWidth/2),d=[[`bull`,i.colors[0],-u],[`bear`,i.colors[1]??i.colors[0],0]];for(let[n,f,p]of d)if(i.plots?.[n]?.visible!==!1){t.beginPath(),t.fillStyle=f;for(let i=o;i<=s;i++){let o=a[i]?.[n];if(o===void 0||!Number.isFinite(o))continue;let s=c(o);t.rect(e.b(i,r)+p,Math.min(s,l),u,Math.max(1,Math.abs(s-l)))}t.fill()}}},Gn=class extends N{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10,source:`close`},shortName:`STC`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`STC`,color:0}],scale:{min:0,max:100},levels:[25,75]};calculate(e,t){let n=I(t,`fast`,23,1),r=I(t,`slow`,50,1),i=I(t,`cycle`,10,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=Kn(Kn(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}};function Kn(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var qn=class extends N{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13},shortName:`KVO`,plots:[{key:`value`,title:`KVO`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`fast`,34,1),r=I(t,`slow`,55,1),i=I(t,`signal`,13,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}},Jn=class extends N{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9},shortName:`Fisher`,plots:[{key:`value`,title:`Fisher`,color:0},{key:`trigger`,title:`Trigger`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`period`,9,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}},Yn=class extends N{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20,source:`close`},shortName:`DPO`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`DPO`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=I(t,`period`,20,2),r=Math.floor(n/2)+1,i=new P,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}},Xn=class extends N{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14},shortName:`BOP`,plots:[{key:`value`,title:`BOP`,color:0}],scale:{min:-1,max:1},levels:[0]};calculate(e,t){let n=I(t,`smooth`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},Zn=class extends N{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25},shortName:`Mass`,plots:[{key:`value`,title:`Mass`,color:0}],levels:[26.5,27]};calculate(e,t){let n=I(t,`ema`,9,1),r=I(t,`sum`,25,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}},Qn=class extends N{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9,source:`close`},shortName:`CMO`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`CMO`,color:0}],scale:{min:-100,max:100},levels:[-50,0,50]};calculate(e,t){let n=I(t,`period`,9,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},$n=class extends N{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9,source:`close`},shortName:`TRIX`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`TRIX`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`period`,15,1),r=I(t,`signal`,9,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=er(er(er(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=er(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}};function er(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var tr=class extends N{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14},shortName:`EOM`,plots:[{key:`value`,title:`EOM`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},nr=class extends N{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{},shortName:`PVT`,plots:[{key:`value`,title:`PVT`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}},rr=class extends N{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{},shortName:`WAD`,plots:[{key:`value`,title:`WAD`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}},ir=class extends N{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10},shortName:`CV`,plots:[{key:`value`,title:`CV`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`ema`,10,1),r=I(t,`roc`,10,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}},ar=class extends N{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10},shortName:`RVGI`,plots:[{key:`value`,title:`RVGI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`period`,10,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}},or=class extends N{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3,source:`close`},shortName:`Stoch RSI`,inputs:{source:{source:!0}},plots:[{key:`k`,title:`%K`,color:0},{key:`d`,title:`%D`,color:1}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=I(t,`rsiPeriod`,14,1),r=I(t,`stochPeriod`,14,1),i=I(t,`k`,3,1),a=I(t,`d`,3,1),o=new P,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=sr(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=cr(u,i),f=cr(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}};function sr(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function cr(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var lr=class extends N{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9,source:`close`},shortName:`PPO`,inputs:{source:{source:!0}},plots:[{key:`hist`,title:`Histogram`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`value`,title:`PPO`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=I(t,`fast`,12,1),r=I(t,`slow`,26,1),i=I(t,`signal`,9,1),a=new P,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=ur(c,n),u=ur(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=ur(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}};function ur(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var dr=class extends N{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{},shortName:`AC`,plots:[{key:`value`,title:`AC`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e){let t=new P,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=fr(i,e,5)-fr(i,e,34);let o;for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let s=a[i]-r/5,c=o===void 0?s>=0:s>=o;o=s;let l={value:s,up:+!!c};t.set(e[i].time,l),n[i]=l}return{values:t,series:n}}};function fr(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var pr=class extends N{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5,source:`close`},shortName:`RMI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`RMI`,color:0}],scale:{min:0,max:100},levels:[30,70]};calculate(e,t){let n=I(t,`period`,20,1),r=I(t,`momentum`,5,1),i=new P,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}},mr=class extends N{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`DI`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`DI`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},hr=class extends N{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8},shortName:`Qstick`,plots:[{key:`value`,title:`Qstick`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,8,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}},gr=class extends N{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14},shortName:`PGO`,plots:[{key:`value`,title:`PGO`,color:0}],levels:[-3,0,3]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}},_r=class extends N{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20,source:`close`},shortName:`StdDev`,inputs:{source:{source:!0}},plots:[{key:`value`,title:`StdDev`,color:0}]};calculate(e,t){let n=I(t,`period`,20,1),r=new P,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}},vr=class extends N{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`overlay`,defaultConfig:{rows:24},shortName:`VP`,plots:[]};calculate(e,t){let n=I(t,`rows`,24,1),r=new P,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(t,n,r,i){let{chartRect:a}=r,o=n.meta;if(!o||o.maxVolume===0)return;let{minPrice:s,rows:c,rowHeight:l,bins:u,maxVolume:d}=o,f=a.width*.3,p=e.T(r);for(let e=0;e<c;e++){let n=p(s+e*l),r=p(s+(e+1)*l),o=u[e]/d*f;t.fillStyle=u[e]>d*.7?i.colors[1]??`rgba(242, 169, 59, 0.5)`:i.colors[0]??`rgba(76, 141, 255, 0.3)`,t.fillRect(a.x,Math.min(n,r),o,Math.max(Math.abs(n-r)-1,1))}}},yr=class extends N{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{},shortName:`A/D`,plots:[{key:`value`,title:`A/D`,color:0}]};calculate(e,t){let n=new P,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}},br=class extends N{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14},shortName:`VROC`,plots:[{key:`value`,title:`VROC`,color:0}],levels:[0]};calculate(e,t){let n=I(t,`period`,14,1),r=new P,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}};function L(e,t){let n=new P;for(let r=0;r<t.length;r++){let i=t[r];i&&n.set(e[r].time,i)}return{values:n,series:t}}function R(e){return e.map(e=>e.close)}function xr(e,t){let n=Array(e.length).fill(void 0),r=0,i=0;for(let a=0;a<e.length;a++){let o=e[a];if(o===void 0){r=0,i=0;continue}r+=o,i++,i>t&&(r-=e[a-t]),i>=t&&(n[a]=r/t)}return n}function Sr(e,t,n){let r=Array(e.length).fill(void 0),i=0,a=0,o;for(let s=0;s<e.length;s++){let c=e[s];if(c!==void 0){if(o===void 0){i+=c,a++,a===t&&(r[s]=o=i/t);continue}o+=n*(c-o),r[s]=o}}return r}function z(e,t){return Sr(e,t,2/(t+1))}function Cr(e,t){let n=Array(e.length).fill(void 0),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-t+1+n];if(r===void 0){o=!1;break}a+=r*(n+1)}o&&(n[i]=a/r)}return n}function wr(e,t){return Sr(e,t,1/t)}function Tr(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=0,o=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){o=!1;break}i+=t,a+=t*t}if(!o)continue;let s=i/t;n[r]=Math.sqrt(Math.max(0,a/t-s*s))}return n}function Er(e){return e.map((t,n)=>{if(n===0)return t.high-t.low;let r=e[n-1].close;return Math.max(t.high-t.low,Math.abs(t.high-r),Math.abs(t.low-r))})}function Dr(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return;t>r&&(r=t)}return r}function Or(e,t,n){if(t<n-1)return;let r=1/0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return;t<r&&(r=t)}return r}function kr(e,t=`value`){return e.map(e=>e!==void 0&&Number.isFinite(e)?{[t]:e}:null)}function Ar(e,t,n){if(t<n-1||t>=e.length)return;let r=0,i=0;for(let a=t-n+1;a<=t;a++){let t=e[a].close;r+=t,i+=t*t}let a=r/n;return{mean:a,sd:Math.sqrt(Math.max(0,i/n-a*a))}}function jr(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++)e[i].high>r&&(r=e[i].high);return r}function Mr(e,t,n){if(t<n-1)return;let r=1/0;for(let i=t-n+1;i<=t;i++)e[i].low<r&&(r=e[i].low);return r}function Nr(e,t,n){if(t<n-1)return;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].close;return r/n}function Pr(e,t,n){if(n<2||t<n-1)return;let r=n,i=(r-1)/2,a=0;for(let n=0;n<r;n++)a+=e[t-r+1+n].close;a/=r;let o=0,s=0,c=0;for(let n=0;n<r;n++){let l=n-i,u=e[t-r+1+n].close-a;o+=l*u,s+=l*l,c+=u*u}let l=o/s,u=a-l*i,d=0;for(let n=0;n<r;n++){let i=e[t-r+1+n].close-(u+l*n);d+=i*i}return{slope:l,end:u+l*(r-1),stdErr:r>2?Math.sqrt(d/(r-2)):0,r:c===0?0:o/Math.sqrt(s*c)}}var Fr=class extends N{descriptor={id:`dema`,name:`Double Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`DEMA`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`DEMA`,color:0}]};emas=new WeakMap;calculate(e,t){let n=I(t,`period`,20,1),r=z(R(e),n),i=z(r,n),a=L(e,kr(r.map((e,t)=>e!==void 0&&i[t]!==void 0?2*e-i[t]:void 0)));return this.emas.set(a,{e1:r,e2:i}),a}update(e,t,n,r){let i=this.emas.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.e1[r-1],o=i.e2[r-1];if(a===void 0||o===void 0)return null;let s=2/(I(t,`period`,20,1)+1);for(let t=r;t<e.length;t++)a+=s*(e[t].close-a),o+=s*(a-o),i.e1[t]=a,i.e2[t]=o,this.writePoint(n,e,t,{value:2*a-o});return n}},Ir=class extends N{descriptor={id:`smma`,name:`Smoothed Moving Average`,placement:`overlay`,defaultConfig:{period:14,source:`close`},shortName:`SMMA`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`SMMA`,color:0}]};calculate(e,t){return L(e,kr(wr(R(e),I(t,`period`,14,1))))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;let a=I(t,`period`,14,1);for(let t=r;t<e.length;t++)i+=(e[t].close-i)/a,this.writePoint(n,e,t,{value:i});return n}},B=class extends N{times=new WeakMap;lookback(e){return 0}revisesBefore(e){return this.lookback(this.read(e))}calculate(e,t){let n=this.read(t),r=Array(e.length);for(let t=0;t<e.length;t++)r[t]=this.pointAt(e,t,n);let i=L(e,r);return this.times.set(i,e.map(e=>e.time)),i}update(e,t,n,r){let i=this.times.get(n);if(!i||!this.canResume(e,n,r))return null;for(let t=r;t<i.length&&t<e.length;t++)if(i[t]!==e[t].time)return null;let a=this.read(t);for(let t=Math.max(0,r-this.lookback(a));t<e.length;t++)this.writePoint(n,e,t,this.pointAt(e,t,a));i.length=e.length;for(let t=r;t<e.length;t++)i[t]=e[t].time;return n}},Lr=class extends B{descriptor={id:`alma`,name:`Arnaud Legoux Moving Average`,placement:`overlay`,defaultConfig:{period:9,offset:.85,sigma:6,source:`close`},shortName:`ALMA`,inputs:{period:{min:1,max:5e3},offset:{min:0,max:1,step:.05},sigma:{min:.5,step:.5},source:{source:!0}},plots:[{key:`value`,title:`ALMA`,color:0}]};read(e){let t=Math.min(5e3,I(e,`period`,9,1)),n=Math.min(1,Math.max(0,F(e,`offset`,.85))),r=Math.max(.5,F(e,`sigma`,6)),i=n*(t-1),a=t/r,o=Array.from({length:t},(e,t)=>Math.exp(-((t-i)**2)/(2*a*a)));return{period:t,weights:o,norm:o.reduce((e,t)=>e+t,0)}}pointAt(e,t,{period:n,weights:r,norm:i}){if(t<n-1)return null;let a=0;for(let i=0;i<n;i++)a+=r[i]*e[t-n+1+i].close;return{value:a/i}}},Rr=class extends N{descriptor={id:`kama`,name:`Kaufman Adaptive Moving Average`,placement:`overlay`,defaultConfig:{period:10,fast:2,slow:30,source:`close`},shortName:`KAMA`,inputs:{period:{min:1},fast:{min:1},slow:{min:1},source:{source:!0}},plots:[{key:`value`,title:`KAMA`,color:0}]};calculate(e,t){let n=L(e,Array(e.length).fill(null)),r=I(t,`period`,10,1);return e.length<=r||this.extend(e,t,n,r,e[r-1].close),n}update(e,t,n,r){if(r<=I(t,`period`,10,1)||!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;return i===void 0?null:(this.extend(e,t,n,r,i),n)}extend(e,t,n,r,i){let a=I(t,`period`,10,1),o=2/(I(t,`fast`,2,1)+1),s=2/(I(t,`slow`,30,1)+1);for(let t=r;t<e.length;t++){let r=0;for(let n=t-a+1;n<=t;n++)r+=Math.abs(e[n].close-e[n-1].close);let c=Math.abs(e[t].close-e[t-a].close),l=((r>0?c/r:0)*(o-s)+s)**2;i+=l*(e[t].close-i),this.writePoint(n,e,t,{value:i})}}},zr=class extends B{descriptor={id:`lsma`,name:`Least Squares Moving Average`,placement:`overlay`,defaultConfig:{period:25,offset:0,source:`close`},shortName:`LSMA`,inputs:{period:{min:2,max:5e3},offset:{step:1},source:{source:!0}},plots:[{key:`value`,title:`LSMA`,color:0}]};read(e){let t=Math.min(5e3,I(e,`period`,25,2)),n=Math.round(I(e,`offset`,0,-1e3)),r=t*(t-1)/2;return{period:t,offset:n,sx:r,denom:t*((t-1)*t*(2*t-1)/6)-r*r}}pointAt(e,t,{period:n,offset:r,sx:i,denom:a}){if(t<n-1)return null;let o=0,s=0;for(let r=0;r<n;r++){let i=e[t-n+1+r].close;o+=i,s+=r*i}let c=(n*s-i*o)/a;return{value:(o-c*i)/n+c*(n-1-r)}}},Br=class extends N{descriptor={id:`mcginley`,name:`McGinley Dynamic`,placement:`overlay`,defaultConfig:{period:14,source:`close`},shortName:`McGinley`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`McGinley`,color:0}]};calculate(e,t){let n=I(t,`period`,14,1),r=z(R(e),n),i=Array(e.length).fill(void 0),a;for(let t=0;t<e.length;t++)a=a===void 0?r[t]:Vr(a,e[t].close,n),i[t]=a;return L(e,kr(i))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;let a=I(t,`period`,14,1);for(let t=r;t<e.length;t++)i=Vr(i,e[t].close,a),this.writePoint(n,e,t,{value:i});return n}};function Vr(e,t,n){return e>0&&t>0?e+(t-e)/(n*(t/e)**4):t}function Hr(e){return e.params.type===`ema`?[`ema`,`ema`]:e.params.type===`sma-ema`?[`sma`,`ema`]:[`sma`,`sma`]}var Ur=class extends N{descriptor={id:`macross`,name:`MA Cross`,placement:`overlay`,defaultConfig:{fast:9,slow:21,type:`sma`,source:`close`},shortName:`MA Cross`,inputs:{fast:{min:1},slow:{min:1},type:{options:[`sma`,`ema`,`sma-ema`]},source:{source:!0}},plots:[{key:`fast`,title:`Fast`,color:0},{key:`slow`,title:`Slow`,color:1}]};calculate(e,t){let[n,r]=Hr(t),i=R(e),a=(t,n)=>t===`ema`?z(i,n):e.map((t,r)=>Nr(e,r,n)),o=a(n,I(t,`fast`,9,1)),s=a(r,I(t,`slow`,21,1));return L(e,o.map((e,t)=>Wr(e,s[t])))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let[i,a]=Hr(t),o=I(t,`fast`,9,1),s=I(t,`slow`,21,1),c=n.series[r-1]?.fast,l=n.series[r-1]?.slow;if(i===`ema`&&c===void 0||a===`ema`&&l===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close;c=i===`ema`?c+2/(o+1)*(r-c):Nr(e,t,o),l=a===`ema`?l+2/(s+1)*(r-l):Nr(e,t,s),this.writePoint(n,e,t,Wr(c,l))}return n}};function Wr(e,t){return e===void 0&&t===void 0?null:{...e===void 0?{}:{fast:e},...t===void 0?{}:{slow:t}}}var Gr=class extends B{descriptor={id:`fractals`,name:`Williams Fractals`,placement:`overlay`,defaultConfig:{period:2},shortName:`Fractals`,inputs:{period:{min:1,max:10}},plots:[{key:`up`,title:`Up`,color:0,kind:`dots`},{key:`down`,title:`Down`,color:1,kind:`dots`}]};read(e){return I(e,`period`,2,1)}lookback(e){return e}pointAt(e,t,n){if(t<n||t>e.length-n-1)return null;let r=!0,i=!0;for(let a=t-n;a<=t+n&&(r||i);a++)a!==t&&(e[a].high>=e[t].high&&(r=!1),e[a].low<=e[t].low&&(i=!1));return!r&&!i?null:{...r?{up:e[t].high}:{},...i?{down:e[t].low}:{}}}},Kr=class extends N{descriptor={id:`cks`,name:`Chande Kroll Stop`,placement:`overlay`,defaultConfig:{p:10,x:1,q:9},shortName:`CKS`,inputs:{p:{label:`ATR length`,min:1},x:{label:`ATR multiplier`,min:0,step:.1},q:{label:`Stop length`,min:1}},plots:[{key:`long`,title:`Stop Long`,color:0},{key:`short`,title:`Stop Short`,color:1}]};states=new WeakMap;calculate(e,t){let n=I(t,`p`,10,1),r=F(t,`x`,1),i=I(t,`q`,9,1),a={atr:wr(Er(e),n),firstHigh:[],firstLow:[]};for(let t=0;t<e.length;t++)qr(e,a,t,n,r);let o=L(e,e.map((e,t)=>Jr(a,t,i)));return this.states.set(o,a),o}update(e,t,n,r){let i=this.states.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.atr[r-1];if(a===void 0)return null;let o=I(t,`p`,10,1),s=F(t,`x`,1),c=I(t,`q`,9,1);for(let t=r;t<e.length;t++){let r=e[t-1].close,l=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-r),Math.abs(e[t].low-r));a+=(l-a)/o,i.atr[t]=a,qr(e,i,t,o,s),this.writePoint(n,e,t,Jr(i,t,c))}return n}};function qr(e,t,n,r,i){let a=t.atr[n],o=jr(e,n,r),s=Mr(e,n,r);t.firstHigh[n]=o!==void 0&&a!==void 0?o-i*a:void 0,t.firstLow[n]=s!==void 0&&a!==void 0?s+i*a:void 0}function Jr(e,t,n){let r=Dr(e.firstHigh,t,n),i=Or(e.firstLow,t,n);return r!==void 0&&i!==void 0?{long:i,short:r}:null}var Yr=class extends B{descriptor={id:`bbpb`,name:`Bollinger Bands %B`,placement:`panel`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`%B`,inputs:{period:{min:2},stdDev:{min:.1,step:.1},source:{source:!0}},plots:[{key:`value`,title:`%B`,color:0}],levels:[0,.5,1]};read(e){return{period:I(e,`period`,20,2),k:F(e,`stdDev`,2)}}pointAt(e,t,{period:n,k:r}){let i=Ar(e,t,n);return!i||i.sd===0?null:{value:(e[t].close-(i.mean-r*i.sd))/(2*r*i.sd)}}},Xr=class extends B{descriptor={id:`bbw`,name:`Bollinger BandWidth`,placement:`panel`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`BBW`,inputs:{period:{min:2},stdDev:{min:.1,step:.1},source:{source:!0}},plots:[{key:`value`,title:`BBW`,color:0}]};read(e){return{period:I(e,`period`,20,2),k:F(e,`stdDev`,2)}}pointAt(e,t,{period:n,k:r}){let i=Ar(e,t,n);return!i||i.mean===0?null:{value:2*r*i.sd/i.mean}}},Zr=class extends B{descriptor={id:`mom`,name:`Momentum`,placement:`panel`,defaultConfig:{period:10,source:`close`},shortName:`MOM`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`MOM`,color:0}],levels:[0]};read(e){return I(e,`period`,10,1)}pointAt(e,t,n){return t>=n?{value:e[t].close-e[t-n].close}:null}},Qr=class extends B{descriptor={id:`hv`,name:`Historical Volatility`,placement:`panel`,defaultConfig:{period:10,annual:365,source:`close`},shortName:`HV`,inputs:{period:{min:2},annual:{label:`Bars per year`,min:1},source:{source:!0}},plots:[{key:`value`,title:`HV`,color:0}],scale:{min:0}};read(e){return{period:I(e,`period`,10,2),annual:Math.max(1,F(e,`annual`,365))}}pointAt(e,t,{period:n,annual:r}){if(t<n)return null;let i=0,a=0;for(let r=t-n+1;r<=t;r++){let t=e[r-1].close,n=e[r].close;if(!(t>0&&n>0))return null;let o=Math.log(n/t);i+=o,a+=o*o}let o=i/n;return{value:100*Math.sqrt(Math.max(0,a/n-o*o))*Math.sqrt(r)}}},$r=class extends N{descriptor={id:`vo`,name:`Volume Oscillator`,placement:`panel`,defaultConfig:{short:5,long:10},shortName:`Vol Osc`,inputs:{short:{min:1},long:{min:1}},plots:[{key:`value`,title:`Vol Osc`,color:0}],levels:[0]};emas=new WeakMap;calculate(e,t){let n=e.map(e=>e.volume),r=z(n,I(t,`short`,5,1)),i=z(n,I(t,`long`,10,1)),a=L(e,kr(r.map((e,t)=>ei(e,i[t]))));return this.emas.set(a,{fast:r,slow:i}),a}update(e,t,n,r){let i=this.emas.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.fast[r-1],o=i.slow[r-1];if(a===void 0||o===void 0)return null;let s=2/(I(t,`short`,5,1)+1),c=2/(I(t,`long`,10,1)+1);for(let t=r;t<e.length;t++){a+=s*(e[t].volume-a),o+=c*(e[t].volume-o),i.fast[t]=a,i.slow[t]=o;let r=ei(a,o);this.writePoint(n,e,t,r===void 0?null:{value:r})}return n}};function ei(e,t){return e===void 0||t===void 0||t===0?void 0:100*(e-t)/t}var ti=class extends N{descriptor={id:`ulcer`,name:`Ulcer Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`Ulcer`,inputs:{period:{min:1},source:{source:!0}},plots:[{key:`value`,title:`Ulcer`,color:0}],scale:{min:0}};drawdowns=new WeakMap;calculate(e,t){let n=I(t,`period`,14,1),r=e.map((t,r)=>ni(e,r,n)),i=L(e,e.map((e,t)=>ri(r,t,n)));return this.drawdowns.set(i,r),i}update(e,t,n,r){let i=this.drawdowns.get(n);if(!i||!this.canResume(e,n,r))return null;let a=I(t,`period`,14,1);for(let t=r;t<e.length;t++)i[t]=ni(e,t,a);i.length=e.length;for(let t=r;t<e.length;t++)this.writePoint(n,e,t,ri(i,t,a));return n}};function ni(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++)e[i].close>r&&(r=e[i].close);return r===0?void 0:100*(e[t].close-r)/r}function ri(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return null;r+=t*t}return{value:Math.sqrt(r/n)}}var ii=class extends N{descriptor={id:`smi`,name:`Stochastic Momentum Index`,placement:`panel`,defaultConfig:{period:10,smooth:3,signal:3},shortName:`SMI`,inputs:{period:{min:1},smooth:{min:1},signal:{min:1}},plots:[{key:`smi`,title:`SMI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[40,-40]};calculate(e,t){let n=I(t,`period`,10,1),r=I(t,`smooth`,3,1),i=I(t,`signal`,3,1),a=Array(e.length).fill(void 0),o=Array(e.length).fill(void 0);for(let t=n-1;t<e.length;t++){let r=jr(e,t,n),i=Mr(e,t,n);r===void 0||i===void 0||(a[t]=e[t].close-(r+i)/2,o[t]=r-i)}let s=z(z(a,r),r),c=z(z(o,r),r),l=s.map((e,t)=>{let n=c[t]===void 0?void 0:c[t]/2;if(!(e===void 0||n===void 0))return n===0?0:Math.max(-100,Math.min(100,100*e/n))}),u=z(l,i);return L(e,l.map((e,t)=>{if(e===void 0)return null;let n={smi:e};return u[t]!==void 0&&(n.signal=u[t]),n}))}},ai=class extends N{descriptor={id:`rvix`,name:`Relative Volatility Index`,placement:`panel`,defaultConfig:{period:10,smooth:14},shortName:`RVI (vol)`,inputs:{period:{min:2},smooth:{min:1}},plots:[{key:`value`,title:`RVI`,color:0}],levels:[80,50,20],scale:{min:0,max:100}};calculate(e,t){let n=I(t,`period`,10,2),r=I(t,`smooth`,14,1),i=Tr(R(e),n),a=i.map((t,n)=>t===void 0||n===0?void 0:e[n].close>e[n-1].close?t:0),o=i.map((t,n)=>t===void 0||n===0?void 0:e[n].close<e[n-1].close?t:0),s=z(a,r),c=z(o,r);return L(e,kr(s.map((e,t)=>{let n=c[t];if(!(e===void 0||n===void 0))return e+n===0?50:100*e/(e+n)})))}},oi=class extends B{descriptor={id:`trendstrength`,name:`Trend Strength Index`,placement:`panel`,defaultConfig:{period:14},shortName:`TSI (trend)`,inputs:{period:{min:2}},plots:[{key:`value`,title:`Trend`,color:0}],levels:[0],scale:{min:-1,max:1}};read(e){return I(e,`period`,14,2)}pointAt(e,t,n){let r=Pr(e,t,n);return r?{value:r.r}:null}},si=class extends B{descriptor={id:`lrslope`,name:`Linear Regression Slope`,placement:`panel`,defaultConfig:{period:14},shortName:`LR Slope`,inputs:{period:{min:2}},plots:[{key:`value`,title:`Slope`,color:0}],levels:[0]};read(e){return I(e,`period`,14,2)}pointAt(e,t,n){let r=Pr(e,t,n);return r?{value:r.slope}:null}},ci=class extends B{descriptor={id:`stderror`,name:`Standard Error`,placement:`panel`,defaultConfig:{period:14},shortName:`StdErr`,inputs:{period:{min:3}},plots:[{key:`value`,title:`StdErr`,color:0}],scale:{min:0}};read(e){return I(e,`period`,14,3)}pointAt(e,t,n){let r=Pr(e,t,n);return r?{value:r.stdErr}:null}},li=class extends B{descriptor={id:`adr`,name:`Average Day Range`,placement:`panel`,defaultConfig:{period:14},shortName:`ADR`,inputs:{period:{min:1}},plots:[{key:`value`,title:`ADR`,color:0}],scale:{min:0}};read(e){return I(e,`period`,14,1)}pointAt(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].high-e[i].low;return{value:r/n}}},ui=class extends B{descriptor={id:`netvolume`,name:`Net Volume`,placement:`panel`,defaultConfig:{},shortName:`Net Vol`,plots:[{key:`value`,title:`Net`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}],levels:[0]};read(e){return null}pointAt(e,t){if(t===0)return null;let n=e[t].close-e[t-1].close,r=e[t].volume??0;return{value:n>0?r:n<0?-r:0,up:+(n>=0)}}lookback(){return 1}},di=class extends N{descriptor={id:`seb`,name:`Standard Error Bands`,placement:`overlay`,defaultConfig:{period:21,mult:2,smooth:3},shortName:`SEB`,inputs:{period:{min:3},mult:{min:0,step:.1},smooth:{min:1}},plots:[{key:`upper`,title:`Upper`,color:1},{key:`middle`,title:`Middle`,color:0},{key:`lower`,title:`Lower`,color:1}]};calculate(e,t){let n=I(t,`period`,21,3),r=F(t,`mult`,2),i=I(t,`smooth`,3,1),a=Array(e.length).fill(void 0),o=Array(e.length).fill(void 0),s=Array(e.length).fill(void 0);for(let t=0;t<e.length;t++){let i=Pr(e,t,n);i&&(a[t]=i.end,o[t]=i.end+r*i.stdErr,s[t]=i.end-r*i.stdErr)}let c=xr(a,i),l=xr(o,i),u=xr(s,i);return L(e,c.map((e,t)=>e===void 0||l[t]===void 0||u[t]===void 0?null:{middle:e,upper:l[t],lower:u[t]}))}},fi=[3,5,8,10,12,15],pi=[30,35,40,45,50,60],mi=class extends N{descriptor={id:`gmma`,name:`Guppy Multiple Moving Average`,placement:`overlay`,defaultConfig:{},shortName:`GMMA`,plots:[...fi.map(e=>({key:`s${e}`,title:`EMA ${e}`,color:0})),...pi.map(e=>({key:`l${e}`,title:`EMA ${e}`,color:1}))]};calculate(e,t){let n=R(e),r=[...fi.map(e=>[`s${e}`,z(n,e)]),...pi.map(e=>[`l${e}`,z(n,e)])];return L(e,e.map((e,t)=>{let n={},i=!1;for(let[e,a]of r)a[t]!==void 0&&(n[e]=a[t],i=!0);return i?n:null}))}},hi=class extends N{descriptor={id:`maribbon`,name:`Moving Average Ribbon`,placement:`overlay`,defaultConfig:{ma1:20,ma2:50,ma3:100,ma4:200,exponential:0},shortName:`MA Ribbon`,inputs:{ma1:{min:1},ma2:{min:1},ma3:{min:1},ma4:{min:1},exponential:{min:0,max:1}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1},{key:`ma3`,title:`MA 3`,color:2},{key:`ma4`,title:`MA 4`,color:3}]};calculate(e,t){let n=F(t,`exponential`,0)>=1?z:xr,r=R(e),i=[`ma1`,`ma2`,`ma3`,`ma4`],a=[20,50,100,200],o=i.map((e,i)=>[e,n(r,I(t,e,a[i],1))]);return L(e,e.map((e,t)=>{let n={},r=!1;for(let[e,i]of o)i[t]!==void 0&&(n[e]=i[t],r=!0);return r?n:null}))}},gi=class extends B{read(e){return null}pointAt(e,t){return{value:this.price(e[t])}}},_i=class extends gi{descriptor={id:`avgprice`,name:`Average Price`,placement:`overlay`,defaultConfig:{},shortName:`OHLC4`,plots:[{key:`value`,title:`Average`,color:0}]};price(e){return(e.open+e.high+e.low+e.close)/4}},vi=class extends gi{descriptor={id:`medprice`,name:`Median Price`,placement:`overlay`,defaultConfig:{},shortName:`HL2`,plots:[{key:`value`,title:`Median`,color:0}]};price(e){return(e.high+e.low)/2}},yi=class extends gi{descriptor={id:`typprice`,name:`Typical Price`,placement:`overlay`,defaultConfig:{},shortName:`HLC3`,plots:[{key:`value`,title:`Typical`,color:0}]};price(e){return(e.high+e.low+e.close)/3}},bi=500,xi=class extends N{descriptor={id:`machannel`,name:`Moving Average Channel`,placement:`overlay`,defaultConfig:{upperLength:20,lowerLength:20,upperOffset:0,lowerOffset:0},shortName:`MA Channel`,inputs:{upperLength:{min:1},lowerLength:{min:1},upperOffset:{min:-bi,max:bi},lowerOffset:{min:-bi,max:bi}},plots:[{key:`upper`,title:`Upper`,color:0},{key:`lower`,title:`Lower`,color:1}]};calculate(e,t){let n=Ci(xr(e.map(e=>e.high),I(t,`upperLength`,20,1)),Si(t,`upperOffset`)),r=Ci(xr(e.map(e=>e.low),I(t,`lowerLength`,20,1)),Si(t,`lowerOffset`));return L(e,n.map((e,t)=>{let n=r[t];return e===void 0&&n===void 0?null:{...e===void 0?{}:{upper:e},...n===void 0?{}:{lower:n}}}))}render(n,r,i,a){let o=r.series;if(!o)return;let{from:s,to:c}=i.visibleRange,l=[],u=[],d=[],f=[];for(let t=s;t<=c&&t<o.length;t++){let n=o[t];if(!n)continue;let r=e.b(t,i),a=n.upper===void 0?null:{x:r,y:e.w(n.upper,i)},s=n.lower===void 0?null:{x:r,y:e.w(n.lower,i)};a&&l.push(a),s&&u.push(s),a&&s&&(d.push(a),f.push(s))}this.drawBand(n,d,f,(0,t.withAlpha)(a.colors[0],.08)),this.drawLine(n,l,a.colors[0],a.lineWidths[0],M(a,`upper`,a.lineWidths[0])),this.drawLine(n,u,a.colors[1]??a.colors[0],a.lineWidths[1]??a.lineWidths[0],M(a,`lower`,a.lineWidths[1]??a.lineWidths[0]))}};function Si(e,t){let n=Number(e.params[t]??0);return Number.isFinite(n)?Math.max(-bi,Math.min(bi,Math.round(n))):0}function Ci(e,t){return e.map((n,r)=>e[r-t])}var wi=500,Ti=class extends B{descriptor={id:`hamming`,name:`Moving Average Hamming`,placement:`overlay`,defaultConfig:{period:10,source:`close`},shortName:`HMA (Hamming)`,inputs:{period:{min:2,max:wi},source:{source:!0}},plots:[{key:`value`,title:`MA`,color:0}]};read(e){let t=Math.min(wi,I(e,`period`,10,2)),n=Array.from({length:t},(e,n)=>.54-.46*Math.cos(2*Math.PI*n/(t-1)));return{weights:n,total:n.reduce((e,t)=>e+t,0)}}pointAt(e,t,{weights:n,total:r}){let i=t-n.length+1;if(i<0)return null;let a=0;for(let t=0;t<n.length;t++)a+=n[t]*e[i+t].close;return{value:a/r}}},Ei=[`sma`,`ema`,`wma`];function Di(e,t,n){return e===`ema`?z(t,n):e===`wma`?Cr(t,n):xr(t,n)}var Oi=class extends N{calculate(e,t){let n=Ei.includes(t.params.type)?t.params.type:`sma`,r=R(e),i=this.lengths.map(([e,i])=>Di(n,r,I(t,e,i,1)));return L(e,e.map((e,t)=>{let n={};return i.forEach((e,r)=>{let i=e[t];i!==void 0&&(n[`ma${r+1}`]=i)}),Object.keys(n).length>0?n:null}))}},ki=class extends Oi{lengths=[[`first`,20],[`second`,50]];descriptor={id:`madouble`,name:`Moving Average Double`,placement:`overlay`,defaultConfig:{first:20,second:50,type:`sma`,source:`close`},shortName:`MA x2`,inputs:{first:{min:1},second:{min:1},type:{options:Ei},source:{source:!0}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1}]}},Ai=class extends Oi{lengths=[[`first`,10],[`second`,20],[`third`,50]];descriptor={id:`matriple`,name:`Moving Average Triple`,placement:`overlay`,defaultConfig:{first:10,second:20,third:50,type:`sma`,source:`close`},shortName:`MA x3`,inputs:{first:{min:1},second:{min:1},third:{min:1},type:{options:Ei},source:{source:!0}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1},{key:`ma3`,title:`MA 3`,color:2}]}},ji=class extends N{descriptor={id:`volindex`,name:`Volatility Index`,placement:`overlay`,defaultConfig:{period:7,mult:3},shortName:`VI`,inputs:{period:{min:1},mult:{label:`ATR multiple`,min:.1,step:.1}},plots:[{key:`sar`,title:`Stop`,color:0,kind:`dots`,tone:{field:`long`},downColor:1}]};calculate(e,t){let n=I(t,`period`,7,1),r=Math.max(.1,F(t,`mult`,3)),i=wr(Er(e),n),a=Array(e.length).fill(null),o=null,s=0;for(let t=0;t<e.length;t++){let n=i[t];if(n===void 0)continue;let c=e[t].close,l=n*r;o===null?(o=c>=e[0].close,s=c):o?(s=Math.max(s,c),c<s-l&&(o=!1,s=c)):(s=Math.min(s,c),c>s+l&&(o=!0,s=c)),a[t]={sar:o?s-l:s+l,long:+!!o}}return L(e,a)}},Mi=class extends N{descriptor={id:`asi`,name:`Accumulative Swing Index`,placement:`panel`,defaultConfig:{limit:10},shortName:`ASI`,inputs:{limit:{label:`Limit move`,min:1e-4,step:.1}},plots:[{key:`value`,title:`ASI`,color:0}],scale:{zero:!0}};calculate(e,t){let n=Math.max(1e-9,F(t,`limit`,10)),r=Array(e.length).fill(null),i=0;for(let t=1;t<e.length;t++)i+=Ni(e[t-1],e[t],n),r[t]={value:i};return L(e,r)}};function Ni(e,t,n){let r=Math.abs(t.high-e.close),i=Math.abs(t.low-e.close),a=t.high-t.low,o=Math.abs(e.close-e.open),s;return s=r>=i&&r>=a?r-.5*i+.25*o:i>=r&&i>=a?i-.5*r+.25*o:a+.25*o,s===0?0:50*(t.close-e.close+.5*(t.close-t.open)+.25*(e.close-e.open))/s*(Math.max(r,i)/n)}var Pi=class extends B{descriptor={id:`advdecline`,name:`Advance/Decline`,placement:`panel`,defaultConfig:{length:10},shortName:`A/D Ratio`,inputs:{length:{min:1}},plots:[{key:`value`,title:`Ratio`,color:0}],scale:{min:0}};read(e){return{length:I(e,`length`,10,1)}}pointAt(e,t,{length:n}){if(t<n-1)return null;let r=0,i=0;for(let a=t-n+1;a<=t;a++)e[a].close>e[a].open?r++:e[a].close<e[a].open&&i++;return{value:i===0?r:r/i}}},Fi=class extends B{descriptor={id:`majority`,name:`Majority Rule`,placement:`panel`,defaultConfig:{period:14},shortName:`Majority`,inputs:{period:{min:1}},plots:[{key:`value`,title:`Majority`,color:0}],scale:{min:0,max:100},levels:[50]};read(e){return{period:I(e,`period`,14,1)}}pointAt(e,t,{period:n}){if(t<n)return null;let r=0;for(let i=t-n+1;i<=t;i++)e[i].close>e[i-1].close&&r++;return{value:100*r/n}}},Ii=34,Li=30,Ri=class extends N{descriptor={id:`chopzone`,name:`Chop Zone`,placement:`panel`,defaultConfig:{},shortName:`Chop Zone`,plots:[{key:`angle`,title:`Angle`,color:0,kind:`histogram`}],scale:{zero:!0}};calculate(e,t){let n=z(R(e),Ii),r=Array(e.length).fill(null);for(let t=1;t<e.length;t++){let i=n[t],a=n[t-1],o=jr(e,t,Li),s=Mr(e,t,Li);if(i===void 0||a===void 0||o===void 0||s===void 0||o===s)continue;let c=e[t],l=(c.high+c.low+c.close)/3;if(!(l>0&&s>0))continue;let u=(i-a)/l*(25/(o-s)*s);r[t]={angle:Math.atan(u)*180/Math.PI}}return L(e,r)}render(t,n,r,i){if(i.plots?.angle?.visible===!1)return;let a=n.series;if(!a)return;let{from:o,to:s}=r.visibleRange,c=e.w(0,r),l=[];for(let t=o;t<=s&&t<a.length;t++){let n=a[t]?.angle;n!==void 0&&l.push({x:e.b(t,r),y:e.w(n,r),baseY:c,color:zi(n)})}this.drawHistogram(t,l,Math.max(1,r.barWidth))}};function zi(e){return e>=5?`#26C6DA`:e>=3.57?`#43A047`:e>=2.14?`#A5D6A7`:e>=.71?`#009688`:e<=-5?`#D50000`:e<=-3.57?`#E91E63`:e<=-2.14?`#FF6D00`:e<=-.71?`#FFB74D`:`#FDD835`}var Bi=class extends N{descriptor={id:`smiergodic`,name:`SMI Ergodic`,placement:`panel`,defaultConfig:{short:5,long:20,signal:5,source:`close`},shortName:`SMIIO`,inputs:{short:{min:1},long:{min:1},signal:{min:1},source:{source:!0}},plots:[{key:`oscillator`,title:`Oscillator`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`indicator`,title:`Indicator`,color:0},{key:`signal`,title:`Signal`,color:1}],scale:{zero:!0}};calculate(e,t){let n=I(t,`short`,5,1),r=I(t,`long`,20,1),i=e.map((t,n)=>n===0?void 0:t.close-e[n-1].close),a=z(z(i,r),n),o=z(z(i.map(e=>e===void 0?void 0:Math.abs(e)),r),n),s=a.map((e,t)=>e===void 0||!o[t]?void 0:e/o[t]),c=z(s,I(t,`signal`,5,1));return L(e,s.map((e,t)=>{if(e===void 0)return null;let n=c[t];return n===void 0?{indicator:e}:{indicator:e,signal:n,oscillator:e-n}}))}},Vi=class extends N{descriptor={id:`po`,name:`Price Oscillator`,placement:`panel`,defaultConfig:{short:10,long:21,source:`close`},shortName:`PO`,inputs:{short:{min:1},long:{min:1},source:{source:!0}},plots:[{key:`value`,title:`PO`,color:0}],scale:{zero:!0}};calculate(e,t){let n=R(e),r=xr(n,I(t,`short`,10,1)),i=xr(n,I(t,`long`,21,1));return L(e,kr(r.map((e,t)=>e===void 0||i[t]===void 0?void 0:e-i[t])))}},Hi=e=>({period:I(e,`period`,10,1),annual:Math.max(1,F(e,`annual`,365))}),Ui={period:{min:1},annual:{label:`Bars per year`,min:1}},Wi=class extends B{descriptor={id:`volohlc`,name:`Volatility O-H-L-C`,placement:`panel`,defaultConfig:{period:10,annual:365},shortName:`Vol OHLC`,inputs:Ui,plots:[{key:`value`,title:`Volatility`,color:0}],scale:{min:0}};read(e){return Hi(e)}pointAt(e,t,{period:n,annual:r}){if(t<n-1)return null;let i=0;for(let r=t-n+1;r<=t;r++){let{open:t,high:n,low:a,close:o}=e[r];if(!(t>0&&n>0&&a>0&&o>0))return null;i+=.5*Math.log(n/a)**2-(2*Math.LN2-1)*Math.log(o/t)**2}return{value:100*Math.sqrt(Math.max(0,i/n*r))}}},Gi=class extends B{descriptor={id:`volzt`,name:`Volatility Zero Trend Close-to-Close`,placement:`panel`,defaultConfig:{period:10,annual:365},shortName:`Vol ZT`,inputs:Ui,plots:[{key:`value`,title:`Volatility`,color:0}],scale:{min:0}};read(e){return Hi(e)}pointAt(e,t,{period:n,annual:r}){if(t<n)return null;let i=0;for(let r=t-n+1;r<=t;r++){let t=e[r-1].close,n=e[r].close;if(!(t>0&&n>0))return null;i+=Math.log(n/t)**2}return{value:100*Math.sqrt(i/n*r)}}};function Ki(e){e.register(new zt),e.register(new Bt),e.register(new Vt),e.register(new Ht),e.register(new Ut),e.register(new Wt),e.register(new Gt),e.register(new Kt),e.register(new qt),e.register(new Xt),e.register(new Qt),e.register(new $t),e.register(new en),e.register(new tn),e.register(new an),e.register(new on),e.register(new sn),e.register(new cn),e.register(new un),e.register(new dn),e.register(new fn),e.register(new gn),e.register(new yn),e.register(new bn),e.register(new xn),e.register(new Sn),e.register(new Cn),e.register(new wn),e.register(new Tn),e.register(new En),e.register(new Dn),e.register(new On),e.register(new kn),e.register(new An),e.register(new jn),e.register(new _r),e.register(new vr),e.register(new yr),e.register(new br),e.register(new _n),e.register(new vn),e.register(new Mn),e.register(new Nn),e.register(new Pn),e.register(new Fn),e.register(new Ln),e.register(new Rn),e.register(new Bn),e.register(new Vn),e.register(new Wn),e.register(new Gn),e.register(new qn),e.register(new Jn),e.register(new Yn),e.register(new Xn),e.register(new Zn),e.register(new Qn),e.register(new $n),e.register(new tr),e.register(new nr),e.register(new rr),e.register(new ir),e.register(new ar),e.register(new or),e.register(new lr),e.register(new dr),e.register(new pr),e.register(new mr),e.register(new hr),e.register(new gr),e.register(new Fr),e.register(new Ir),e.register(new Lr),e.register(new Rr),e.register(new zr),e.register(new Br),e.register(new Ur),e.register(new Gr),e.register(new Kr),e.register(new Yr),e.register(new Xr),e.register(new Zr),e.register(new Qr),e.register(new $r),e.register(new ti),e.register(new ii),e.register(new ai),e.register(new oi),e.register(new si),e.register(new ci),e.register(new li),e.register(new ui),e.register(new di),e.register(new mi),e.register(new hi),e.register(new _i),e.register(new vi),e.register(new yi),e.register(new xi),e.register(new Ti),e.register(new ki),e.register(new Ai),e.register(new ji),e.register(new Mi),e.register(new Pi),e.register(new Fi),e.register(new Ri),e.register(new Bi),e.register(new Vi),e.register(new Wi),e.register(new Gi)}function qi(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.requestId==`number`?t.type===`result`||t.type===`pong`||t.type===`error`:!1}var Ji=class{worker;fallbackPlugins;timeoutMs;nextRequestId=1;pending=new Map;messageHandler;constructor(e,t={}){this.worker=e,this.fallbackPlugins=t.fallbackPlugins??new Map,this.timeoutMs=t.timeoutMs??3e4,this.messageHandler=e=>this.handleMessage(e),this.worker&&(this.worker.addEventListener(`message`,this.messageHandler),this.worker.addEventListener(`error`,this.messageHandler))}hasWorker(){return this.worker!==null}registerFallbackPlugin(e){this.fallbackPlugins.set(e.descriptor.id,e)}async calculate(e,t,n){if(!this.worker){let r=this.fallbackPlugins.get(e);if(!r)throw Error(`Unknown indicator: ${e}`);return r.calculate(n,t)}let r=this.nextRequestId++,i={type:`calculate`,requestId:r,indicatorId:e,config:t,data:n};return new Promise((t,n)=>{let a={resolve:t,reject:n,timer:null};this.timeoutMs>0&&(a.timer=setTimeout(()=>{this.pending.delete(r),n(Error(`Indicator worker timeout (${this.timeoutMs}ms): ${e}`))},this.timeoutMs)),this.pending.set(r,a),this.worker.postMessage(i)})}ping(){if(!this.worker)return Promise.resolve();let e=this.nextRequestId++;return new Promise((t,n)=>{let r={resolve:()=>t(),reject:n,timer:this.timeoutMs>0?setTimeout(()=>{this.pending.delete(e),n(Error(`Indicator worker ping timeout`))},this.timeoutMs):null};this.pending.set(e,r),this.worker.postMessage({type:`ping`,requestId:e})})}terminate(){this.worker&&=(this.worker.removeEventListener(`message`,this.messageHandler),this.worker.removeEventListener(`error`,this.messageHandler),this.worker.terminate(),null);for(let e of this.pending.values())e.timer&&clearTimeout(e.timer),e.reject(Error(`Indicator worker terminated`));this.pending.clear()}handleMessage(e){let t=e.data;if(t!==void 0){if(!qi(t))return;this.dispatchResponse(t);return}let n=e.message??`Indicator worker error`;for(let[e,t]of this.pending)t.timer&&clearTimeout(t.timer),t.reject(Error(n)),this.pending.delete(e)}dispatchResponse(e){let t=this.pending.get(e.requestId);if(t){if(this.pending.delete(e.requestId),t.timer&&clearTimeout(t.timer),e.type===`error`){t.reject(Error(e.message));return}if(e.type===`pong`){t.resolve(void 0);return}t.resolve(e.output)}}},Yi=e=>typeof e.params.symbol==`string`?e.params.symbol.trim():``,Xi=class extends B{descriptor={id:`compareSymbol`,name:`Compare Symbol`,placement:`overlay`,defaultConfig:{symbol:``},shortName:`Compare`,plots:[{key:`value`,title:`Close`,color:0}]};constructor(e){super(),this.store=e}read(e){return{symbol:Yi(e)}}pointAt(e,t,{symbol:n}){if(!n)return null;let r=this.store.closeAt(n,e[t].time);return r===void 0?null:{value:r}}},Zi=class extends B{descriptor={id:`spread`,name:`Spread / Ratio`,placement:`panel`,defaultConfig:{symbol:``,mode:`spread`},shortName:`Spread`,plots:[{key:`value`,title:`Spread`,color:0}],inputs:{mode:{options:[`spread`,`ratio`]}}};constructor(e){super(),this.store=e}read(e){return{symbol:Yi(e),ratio:e.params.mode===`ratio`}}pointAt(e,t,{symbol:n,ratio:r}){if(!n)return null;let i=this.store.closeAt(n,e[t].time);return i===void 0?null:r?i===0?null:{value:e[t].close/i}:{value:e[t].close-i}}},Qi=e=>{let t=Math.round(Number(e.params.length??20));return{symbol:Yi(e),length:Number.isFinite(t)?Math.max(2,t):20}};function $i(e,t){if(e.every(t=>t===e[0])||t.every(e=>e===t[0]))return null;let n=e.length,r=0,i=0;for(let a=0;a<n;a++)r+=e[a],i+=t[a];r/=n,i/=n;let a=0,o=0,s=0;for(let c=0;c<n;c++){let n=e[c]-r,l=t[c]-i;a+=n*l,o+=n*n,s+=l*l}return o>0&&s>0?Math.max(-1,Math.min(1,a/Math.sqrt(o*s))):null}var ea={placement:`panel`,defaultConfig:{symbol:``,length:20},inputs:{length:{min:2}},plots:[{key:`value`,title:`Correlation`,color:0}],scale:{min:-1,max:1},levels:[0]},ta=class extends B{descriptor={...ea,id:`correlation`,name:`Correlation Coefficient`,shortName:`Correlation`};constructor(e){super(),this.store=e}read(e){return Qi(e)}pointAt(e,t,{symbol:n,length:r}){if(!n||t<r-1)return null;let i=[],a=[];for(let o=t-r+1;o<=t;o++){let t=this.store.closeAt(n,e[o].time);if(t===void 0)return null;i.push(e[o].close),a.push(t)}let o=$i(i,a);return o===null?null:{value:o}}},na=class extends B{descriptor={...ea,id:`correlationlog`,name:`Correlation Log`,shortName:`Correlation Log`};constructor(e){super(),this.store=e}read(e){return Qi(e)}pointAt(e,t,{symbol:n,length:r}){if(!n||t<r)return null;let i=[],a=[],o=this.store.closeAt(n,e[t-r].time);for(let s=t-r+1;s<=t;s++){let t=this.store.closeAt(n,e[s].time),r=e[s-1].close,c=e[s].close;if(t===void 0||o===void 0||!(r>0&&c>0&&t>0&&o>0))return null;i.push(Math.log(c/r)),a.push(Math.log(t/o)),o=t}let s=$i(i,a);return s===null?null:{value:s}}},ra=e=>e<10?`0`+e:``+e,ia=class{tz=null;timeFormatter=null;timesPastData=!0;setTimezoneOffset(e){this.tz=e}setTimeFormatter(e){this.timeFormatter=e}setTimesPastData(e){this.timesPastData=e}getTimesPastData(){return this.timesPastData}render(n,r,i,a,o){let{chartRect:s}=r,c=o??s.y+s.height;n.strokeStyle=i.style?.axis.time.line??i.axisLine,n.lineWidth=1,n.globalAlpha=.65,n.beginPath(),n.moveTo(s.x,c+.5),n.lineTo(s.x+s.width,c+.5),n.stroke(),n.globalAlpha=1;let l=r.barWidth+r.barSpacing,u=Math.max(1,Math.ceil(80/l)),d=-r.offset+s.x+r.barWidth/2,f=Math.floor(r.offset/l),p=Math.ceil((r.offset+s.width)/l);this.timesPastData||(f=Math.max(f,0),p=Math.min(p,a.length-1));let m=a.length>0?e.y(Math.min(p,a.length-1),a):Date.now(),h=(0,t.tzLabel)(this.tz,m>0xe8d4a51000?m:m*1e3),g=`500 ${i.font.sizeSmall-1}px ${i.font.family}`,_=s.x+s.width-4;n.font=g;let v=_-n.measureText(h).width-8;n.font=`500 ${i.font.sizeSmall}px ${i.font.family}`,n.textBaseline=`top`,n.textAlign=`center`,n.fillStyle=i.style?.axis.time.text??i.axisLabel;let y=(0,t.barsAreDaily)(a),b=-1;for(let r=f;r<=p&&a.length>0;r++){if(r%u!==0)continue;let i=r*l+d,o=e.y(r,a),s=o>0xe8d4a51000?o:o*1e3,f=(0,t.timeParts)(s,this.tz),{year:p,day:m,month:h,hours:g,minutes:_}=f,x;y??(0,t.isDateOnly)(f)?x=`date`:m===b?x=`time`:(x=`day`,b=m);let S=this.timeFormatter?this.timeFormatter(s,{kind:x,timeZone:this.tz}):x===`date`?`${h}/${m}/${p}`:x===`day`?`${h}/${m}`:`${ra(g)}:${ra(_)}`;i+n.measureText(S).width/2>v||n.fillText(S,i,c+7)}n.font=g,n.textAlign=`right`,n.textBaseline=`top`,n.globalAlpha=.75,n.fillStyle=i.textSecondary,n.fillText(h,_,c+7),n.globalAlpha=1}},aa=new Set,oa=null;function sa(){let e=typeof document<`u`?document.activeElement:null;return e instanceof Element&&e.closest(`[aria-modal="true"], [role="dialog"], [role="menu"]`)!==null}var ca=class{panHandler=null;zoomHandler=null;crosshairHandler=null;axisDragHandler=null;alertDragHandler=null;axisViewportGetter=null;onAxisDoubleClick=null;onDrawingDoubleClick=null;onDrawingContextMenu=null;zoomArea=!1;onChartContextMenu=null;priceAxisAdd=null;axisStrips=null;savedTouchAction=``;measureHandlers=null;measuring=!1;boxSelectHandlers=null;boxSelecting=!1;onAltClick=null;onEscape=null;onConfirm=null;onClick=null;markerAt=null;onMarkerHover=null;markerClickable=()=>!0;markerPos={x:0,y:0};hoveredMarker=null;downPos=null;downMoved=!1;pressForClick=!1;drawingManager=null;tradingManager=null;paneResizeHandler=null;viewportGetter=null;onOverlayDirty=null;boundHandlers=[];lastTouchDist=0;lastTouchMid={x:0,y:0};touchActive=!1;touchStartPos={x:0,y:0};longPressTimer=null;longPressMs=500;longPressMaxMove=8;cachedRect=null;constructor(e){this.element=e}setOverlayDirtyCallback(e){this.onOverlayDirty=e}setPanHandler(e){this.panHandler=e}setZoomHandler(e){this.zoomHandler=e}setCrosshairHandler(e){this.crosshairHandler=e}setAltClickHandler(e){this.onAltClick=e}setEscapeHandler(e){this.onEscape=e}setConfirmHandler(e){this.onConfirm=e}setSignalMarkerHitTest(e,t,n=()=>!0){this.markerAt=e,this.onMarkerHover=t,this.markerClickable=n,e||(this.hoveredMarker=null)}leaveMarker(){this.hoveredMarker!==null&&(this.hoveredMarker=null,this.onMarkerHover?.(null,this.markerPos))}setClickHandler(e){this.onClick=e}setBoxSelectHandlers(e){this.boxSelectHandlers=e}setMeasureHandlers(e){this.measureHandlers=e}setAxisDragHandler(e,t,n){this.axisDragHandler=e,this.axisViewportGetter=t,this.onAxisDoubleClick=n??null}setDrawingManager(e,t){this.drawingManager=e,this.viewportGetter=t}setChartContextMenu(e){this.onChartContextMenu=e}setPriceAxisAddButton(e,t){this.priceAxisAdd={button:e,onClick:t}}setZoomAreaMode(e){this.zoomArea=e}setDrawingContextMenu(e){this.onDrawingContextMenu=e}setDrawingDoubleClick(e){this.onDrawingDoubleClick=e}setAlertDragHandler(e){this.alertDragHandler=e}setTradingManager(e,t){this.tradingManager=e,this.viewportGetter=t}setAxisStrips(e){this.axisStrips=e}setPaneResizeHandler(e){this.paneResizeHandler=e}attach(){let e=()=>this.viewportGetter?.()??null;aa.add(this.element),this.savedTouchAction=this.element.style.getPropertyValue(`touch-action`),this.element.style.setProperty(`touch-action`,`none`);let t=e=>{let t=this.axisStrips?.()??null,n=t?.plot??this.axisViewportGetter?.()?.chartRect;if(!n)return null;let r=this.axisDragHandler!==null;if(e.y>(t?.timeAxisTop??n.y+n.height))return r?`time`:null;let i=e.y>=n.y&&e.y<=n.y+n.height;if(e.x>n.x+n.width)return i?r?`price`:null:`inert`;let a=t?.left;return a&&a.width>0&&e.x<n.x&&e.x>=n.x-a.width?i&&a.scales&&r?`price`:`inert`:null},n=e=>{let t=this.axisStrips?.()??null,n=t?.plot??this.axisViewportGetter?.()?.chartRect;if(!n)return`plot`;if(e.y>(t?.timeAxisTop??n.y+n.height))return`timeAxis`;let r=e.y>=n.y&&e.y<=n.y+n.height,i=t?.left,a=!!i&&i.width>0&&e.x<n.x&&e.x>=n.x-i.width;return e.x>n.x+n.width||a?r?`priceAxis`:`pane`:r?`plot`:`pane`},r=e=>{let t=(this.viewportGetter?.()??this.axisViewportGetter?.())?.chartRect;return t?{x:Math.max(t.x,Math.min(t.x+t.width,e.x)),y:Math.max(t.y,Math.min(t.y+t.height,e.y))}:e},i=()=>this.zoomArea?`zoom-in`:this.crosshairHandler&&this.crosshairHandler.getMode()!==`hidden`?`crosshair`:``,a=e=>{this.element.style.cursor!==e&&(this.element.style.cursor=e)},o=n=>{let r=t(n);if(r===`price`)return`ns-resize`;if(r===`time`)return`ew-resize`;if(r===`inert`)return`default`;let a=this.paneResizeHandler?.cursorAt(n);if(a)return a;if(this.alertDragHandler?.isOverAlert(n))return`ns-resize`;let o=e();return this.tradingManager?.isOverButton(n)?`pointer`:o&&this.tradingManager?.isOverDraggableLine(n,o)?`ns-resize`:this.zoomArea?`zoom-in`:(o?this.drawingManager?.hoverCursorAt(n,o):null)||(o&&this.priceAxisAdd?.button.hit(n,o)?`pointer`:i())},s=!1,c=``,l=e=>{if(!(e.buttons&1)){g(e);return}h(e)},u=()=>{s||(s=!0,this.leaveMarker(),c=document.documentElement.style.userSelect,document.documentElement.style.userSelect=`none`,document.addEventListener(`mousemove`,l))},d=()=>{s&&(s=!1,document.documentElement.style.userSelect=c,document.removeEventListener(`mousemove`,l))},f=e=>e===this.element||e instanceof HTMLCanvasElement,p=n=>{if(oa=this.element,n.button!==0||!f(n.target))return;this.panHandler?.cancelMomentum(),u(),this.invalidateRect();let r=this.getMousePos(n),o=e();this.downPos=r,this.downMoved=!1,this.pressForClick=!1;let s=t(r);if(s===`inert`)return;if(s&&this.axisDragHandler){this.axisDragHandler.begin(s,r);return}if(this.paneResizeHandler?.tryBegin(r))return;let c=!!this.drawingManager?.getActiveTool()||!!this.tradingManager?.isBracketActive()||!!this.tradingManager?.isOrderDraftActive();if(this.boxSelectHandlers&&(this.zoomArea||(n.ctrlKey||n.metaKey)&&!c)){this.boxSelecting=!0,this.boxSelectHandlers.begin(r),a(i()),this.onOverlayDirty?.(!0);return}if(n.shiftKey&&this.measureHandlers){this.measuring=!0,this.measureHandlers.begin(r),this.onOverlayDirty?.(!0);return}if(n.altKey&&this.onAltClick){this.onAltClick(r);return}if(this.priceAxisAdd&&o&&!c&&this.priceAxisAdd.button.hit(r,o)&&!this.alertDragHandler?.isOverAlert(r)&&!this.tradingManager?.isOverButton(r)&&!this.tradingManager?.isOverDraggableLine(r,o)&&!this.drawingManager?.hoverCursorAt(r,o)){n.preventDefault(),this.priceAxisAdd.onClick(r);return}if(this.tradingManager&&o&&this.tradingManager.onPointerDown(r,o)){a(this.tradingManager.isOverButton(r)?`pointer`:`ns-resize`);return}if(this.drawingManager&&o&&this.drawingManager.onPointerDown(r,o)){this.drawingManager.isDragging()&&a(`grabbing`);return}if(this.alertDragHandler?.tryBegin(r)){this.onOverlayDirty?.();return}this.pressForClick=!0,this.panHandler&&(this.panHandler.onPointerDown(r),a(`grabbing`))},m=e=>{if(!s){if(!f(e.target)){this.leaveMarker();return}h(e)}},h=t=>{let n=this.getMousePos(t),i=e();if(this.downPos&&!this.downMoved){let e=n.x-this.downPos.x,t=n.y-this.downPos.y;e*e+t*t>16&&(this.downMoved=!0)}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n);return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n);return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.move(r(n)),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measureHandlers.move(n),this.onOverlayDirty?.(!0);return}if(this.boxSelecting&&this.boxSelectHandlers){this.boxSelectHandlers.move(n),this.onOverlayDirty?.(!0);return}if(!s){let e=this.markerAt?.(n)??null;e!==this.hoveredMarker&&(this.hoveredMarker=e,this.onMarkerHover?.(e,n)),e&&(this.markerPos=n),a(e&&this.markerClickable()?`pointer`:o(n))}if(this.tradingManager&&i&&this.tradingManager.onPointerMove(s?r(n):n,i)){this.crosshairHandler?.onPointerMove(n),this.onOverlayDirty?.();return}if(this.drawingManager&&i&&this.drawingManager.onPointerMove(n,i)){this.crosshairHandler?.onPointerMove(n),this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n),this.onOverlayDirty?.(!s)},g=e=>{if(!(e.button!==0&&e.type===`mouseup`)&&s){if(d(),a(o(this.getMousePos(e))),this.boxSelecting&&this.boxSelectHandlers){this.boxSelecting=!1,this.boxSelectHandlers.end(),this.onOverlayDirty?.(!0);return}if(this.axisDragHandler?.isActive()){this.axisDragHandler.end();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.end();return}if(this.alertDragHandler?.isActive()){this.alertDragHandler.end(),this.onOverlayDirty?.();return}if(this.measuring&&this.measureHandlers){this.measuring=!1,this.measureHandlers.end(),this.onOverlayDirty?.(!0);return}this.tradingManager?.onPointerUp(this.getMousePos(e))||this.drawingManager?.onPointerUp()||(this.panHandler?.onPointerUp(),this.pressForClick&&!this.downMoved&&this.downPos&&this.onClick&&this.onClick(this.downPos),this.pressForClick=!1,this.downPos=null)}},_=n=>{let r=this.getMousePos(n),i=t(r);if(i){i!==`inert`&&this.onAxisDoubleClick?.(i);return}let a=e();if(!a||this.drawingManager?.justFinished())return;let o=this.drawingManager?.drawingAt(r,a);o&&this.onDrawingDoubleClick?.(o)},v=()=>{if(this.leaveMarker(),s){this.crosshairHandler?.onPointerLeave(),this.onOverlayDirty?.(!0);return}a(``),this.panHandler?.onPointerUp(),this.drawingManager?.onPointerUp(),this.tradingManager?.onPointerUp(),this.alertDragHandler?.end(),this.paneResizeHandler?.end(),this.crosshairHandler?.onPointerLeave(),this.pressForClick=!1,this.downPos=null,this.onOverlayDirty?.()},y=e=>{e.preventDefault();let t=this.getMousePos(e);this.zoomHandler?.onWheel(e.deltaY,t)},b=e=>{if(!sa()){if(e.key===`Escape`&&this.boxSelecting&&this.boxSelectHandlers&&(this.boxSelecting=!1,this.boxSelectHandlers.cancel(),this.onOverlayDirty?.(!0)),e.key===`Escape`&&this.onEscape&&this.onEscape(),e.key===`Enter`&&this.onConfirm&&this.onConfirm()){e.preventDefault();return}e.key!==`Escape`&&!this.ownsShortcuts()||this.drawingManager?.onKeyDown(e.key,e.ctrlKey||e.metaKey,e.shiftKey)&&e.preventDefault()}},x=t=>{let r=e();if(!r)return;let i=this.getMousePos(t),a=r.chartRect,o=i.x>=a.x&&i.x<=a.x+a.width&&i.y>=a.y&&i.y<=a.y+a.height,s=this.onDrawingContextMenu&&o&&!this.drawingManager?.getActiveTool()?this.drawingManager?.drawingAt(i,r):null;if(s){t.preventDefault(),this.onDrawingContextMenu?.(s,i);return}if(this.tradingManager?.onContextMenu(i,r)){t.preventDefault();return}this.onChartContextMenu?.(n(i),i)&&t.preventDefault()},S=n=>{if(oa=this.element,!(!this.touchActive&&!f(n.target)))if(n.preventDefault(),this.invalidateRect(),n.touches.length===1){let r=this.getTouchPos(n.touches[0]);this.touchStartPos=r;let i=t(r);if(i===`inert`){this.touchActive=!0;return}if(i&&this.axisDragHandler){this.axisDragHandler.begin(i,r),this.touchActive=!0;return}if(this.paneResizeHandler?.tryBegin(r)){this.touchActive=!0;return}let a=e();if(this.tradingManager&&a&&this.tradingManager.onPointerDown(r,a)){this.touchActive=!0,this.onOverlayDirty?.();return}this.onAltClick&&(this.clearLongPress(),this.longPressTimer=setTimeout(()=>{this.longPressTimer=null,this.onAltClick?.(r),this.panHandler?.onPointerUp(),this.onOverlayDirty?.(!0)},this.longPressMs)),this.panHandler?.onPointerDown(r),this.crosshairHandler?.onPointerMove(r),this.touchActive=!0}else n.touches.length===2&&(this.clearLongPress(),this.panHandler?.onPointerUp(),this.lastTouchDist=this.getTouchDistance(n.touches[0],n.touches[1]),this.lastTouchMid=this.getTouchMidpoint(n.touches[0],n.touches[1]),this.touchActive=!0)},C=t=>{if(!(!this.touchActive&&!f(t.target))){if(t.preventDefault(),t.touches.length===1&&this.touchActive){let n=this.getTouchPos(t.touches[0]);if(this.longPressTimer){let e=n.x-this.touchStartPos.x,t=n.y-this.touchStartPos.y;Math.hypot(e,t)>this.longPressMaxMove&&this.clearLongPress()}if(this.axisDragHandler?.isActive()){this.axisDragHandler.move(n),this.onOverlayDirty?.();return}if(this.paneResizeHandler?.isActive()){this.paneResizeHandler.move(n),this.onOverlayDirty?.();return}let r=e();if(this.tradingManager&&r&&this.tradingManager.onPointerMove(n,r)){this.onOverlayDirty?.();return}this.panHandler?.onPointerMove(n),this.crosshairHandler?.onPointerMove(n)}else if(t.touches.length===2){let e=this.getTouchDistance(t.touches[0],t.touches[1]),n=this.getTouchMidpoint(t.touches[0],t.touches[1]);this.lastTouchDist>0&&e>0&&this.zoomHandler?.onPinch(e/this.lastTouchDist,n);let r=this.lastTouchMid.x-n.x;Math.abs(r)>1&&(this.panHandler?.onPointerDown(this.lastTouchMid),this.panHandler?.onPointerMove({x:n.x,y:this.lastTouchMid.y})),this.lastTouchDist=e,this.lastTouchMid=n}this.onOverlayDirty?.()}},w=e=>{if(this.clearLongPress(),e.touches.length===0){this.axisDragHandler?.isActive()&&this.axisDragHandler.end(),this.paneResizeHandler?.end();let t=e.changedTouches[0];this.tradingManager?.onPointerUp(t?this.getTouchPos(t):void 0),this.panHandler?.onPointerUp(),this.crosshairHandler?.onPointerLeave(),this.touchActive=!1,this.lastTouchDist=0}else if(e.touches.length===1){let t=this.getTouchPos(e.touches[0]);this.panHandler?.onPointerDown(t)}},T=()=>this.invalidateRect(),E=()=>this.invalidateRect(),D=()=>this.invalidateRect(),O=e=>{let t=e.target instanceof Node&&this.element.contains(e.target)&&f(e.target);(s||t)&&e.preventDefault()};this.element.addEventListener(`mousedown`,p),this.element.addEventListener(`mousemove`,m),document.addEventListener(`dragstart`,O,!0),document.addEventListener(`mouseup`,g),this.element.addEventListener(`mouseleave`,v),this.element.addEventListener(`dblclick`,_),this.element.addEventListener(`wheel`,y,{passive:!1}),this.element.addEventListener(`contextmenu`,x),this.element.addEventListener(`touchstart`,S,{passive:!1}),this.element.addEventListener(`touchmove`,C,{passive:!1}),this.element.addEventListener(`touchend`,w),document.addEventListener(`keydown`,b),window.addEventListener(`resize`,T),document.addEventListener(`scroll`,E,{capture:!0,passive:!0}),this.element.addEventListener(`mouseenter`,D),this.boundHandlers.push(d,()=>this.element.removeEventListener(`mousedown`,p),()=>document.removeEventListener(`dragstart`,O,!0),()=>this.element.removeEventListener(`mousemove`,m),()=>document.removeEventListener(`mouseup`,g),()=>this.element.removeEventListener(`mouseleave`,v),()=>this.element.removeEventListener(`dblclick`,_),()=>this.element.removeEventListener(`wheel`,y),()=>this.element.removeEventListener(`contextmenu`,x),()=>this.element.removeEventListener(`touchstart`,S),()=>this.element.removeEventListener(`touchmove`,C),()=>this.element.removeEventListener(`touchend`,w),()=>document.removeEventListener(`keydown`,b),()=>window.removeEventListener(`resize`,T),()=>document.removeEventListener(`scroll`,E,{capture:!0}),()=>this.element.removeEventListener(`mouseenter`,D))}detach(){aa.delete(this.element),this.savedTouchAction?this.element.style.setProperty(`touch-action`,this.savedTouchAction):this.element.style.removeProperty(`touch-action`),oa===this.element&&(oa=null);for(let e of this.boundHandlers)e();this.boundHandlers=[],this.cachedRect=null,this.clearLongPress()}clearLongPress(){this.longPressTimer&&=(clearTimeout(this.longPressTimer),null)}invalidateRect(){this.cachedRect=null}getRect(){return this.cachedRect||=this.element.getBoundingClientRect(),this.cachedRect}ownsShortcuts(){let e=document.activeElement;if(e&&(e.tagName===`INPUT`||e.tagName===`TEXTAREA`||e.tagName===`SELECT`||e.isContentEditable))return!1;for(let t of aa)if(e&&t.contains(e))return t===this.element;return oa===null||oa===this.element}getMousePos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchPos(e){let t=this.getRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}getTouchDistance(e,t){return Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY)}getTouchMidpoint(e,t){let n=this.getRect();return{x:(e.clientX+t.clientX)/2-n.left,y:(e.clientY+t.clientY)/2-n.top}}},la=16,ua=3,da=class{enabled=!1;setEnabled(e){this.enabled=e}isEnabled(){return this.enabled}hit(e,t){if(!this.enabled)return!1;let{x:n,y:r,width:i,height:a}=t.chartRect,o=n+i-la-ua;return e.x>=o&&e.x<=n+i&&e.y>=r&&e.y<=r+a}render(e,t,n,r){if(!this.enabled||!r)return;let{x:i,y:a,width:o,height:s}=t.chartRect;if(r.y<a||r.y>a+s||r.x<i||r.x>i+o)return;let c=i+o-ua-la/2,l=la/2;e.fillStyle=n.background,e.strokeStyle=n.axisLabelBackground,e.lineWidth=1,e.beginPath(),e.arc(c,r.y,l-.5,0,Math.PI*2),e.fill(),e.stroke(),e.strokeStyle=n.text,e.lineWidth=1.5,e.beginPath(),e.moveTo(c-l*.45,r.y),e.lineTo(c+l*.45,r.y),e.moveTo(c,r.y-l*.45),e.lineTo(c,r.y+l*.45),e.stroke()}},fa=100,pa=50,ma=.1,ha=60,ga=16,_a=class{dragging=!1;lastX=0;lastY=0;samples=[];momentumId=0;callback;onStart;friction=.92;constructor(e,t){this.callback=e,this.onStart=t}isDragging(){return this.dragging}onPointerDown(e){this.dragging=!0,this.lastX=e.x,this.lastY=e.y,this.samples=[{t:Date.now(),x:e.x,y:e.y}],this.stopMomentum(),this.onStart?.()}onPointerMove(e){if(!this.dragging)return;let t=this.lastX-e.x,n=this.lastY-e.y;this.lastX=e.x,this.lastY=e.y;let r=Date.now();for(this.samples.push({t:r,x:e.x,y:e.y});this.samples.length>2&&r-this.samples[1].t>fa;)this.samples.shift();(t||n)&&this.callback(t,n)}onPointerUp(){if(!this.dragging)return;this.dragging=!1;let e=this.releaseVelocity(Date.now());this.samples=[],e&&Math.hypot(e.x,e.y)>ma&&this.startMomentum(e.x,e.y)}cancelMomentum(){this.stopMomentum()}releaseVelocity(e){let t=this.samples[this.samples.length-1];if(!t||e-t.t>pa)return null;let n=this.samples.find(e=>t.t-e.t<=fa)??this.samples[0],r=t.t-n.t;return r<=0?null:{x:(n.x-t.x)/r,y:(n.y-t.y)/r}}startMomentum(e,t){this.stopMomentum();let n=e*ga,r=t*ga,i=Math.hypot(n,r);i>ha&&(n*=ha/i,r*=ha/i);let a=()=>{if(n*=this.friction,r*=this.friction,Math.hypot(n,r)<.5){this.momentumId=0;return}this.callback(n,r),this.momentumId=requestAnimationFrame(a)};this.momentumId=requestAnimationFrame(a)}stopMomentum(){this.momentumId&&=(cancelAnimationFrame(this.momentumId),0)}},va=class{callback;sensitivity;pendingDelta=0;pendingScale=1;pendingCenterX=0;rafId=0;constructor(e,t=.001){this.callback=e,this.sensitivity=t}onWheel(e,t){this.pendingDelta+=-e*this.sensitivity,this.pendingCenterX=t.x,this.schedule()}onPinch(e,t){!(e>0)||!Number.isFinite(e)||(this.pendingScale*=e,this.pendingCenterX=t.x,this.schedule())}schedule(){this.rafId||=requestAnimationFrame(()=>{this.rafId=0;let e=(1+this.pendingDelta)*this.pendingScale-1,t=this.pendingCenterX;this.pendingDelta=0,this.pendingScale=1,this.callback(e,t)})}dispose(){this.rafId&&=(cancelAnimationFrame(this.rafId),0)}},ya=class{dragging=!1;axis=null;startPos={x:0,y:0};lastPos={x:0,y:0};moved=!1;threshold=3;sensitivity=.005;constructor(e,t){this.onPriceScale=e,this.onTimeScale=t}begin(e,t){this.dragging=!0,this.axis=e,this.startPos=t,this.lastPos=t,this.moved=!1}move(e){if(!this.dragging||!this.axis)return!1;let t=e.x-this.startPos.x,n=e.y-this.startPos.y;if(!this.moved&&Math.hypot(t,n)<this.threshold)return!1;if(this.moved=!0,this.axis===`price`){let t=e.y-this.lastPos.y,n=Math.exp(t*this.sensitivity);this.onPriceScale(n)}else{let t=e.x-this.lastPos.x,n=Math.exp(t*this.sensitivity);this.onTimeScale(n)}return this.lastPos=e,!0}end(){let e=this.dragging&&this.moved;return this.dragging=!1,this.axis=null,this.moved=!1,e}isActive(){return this.dragging}},ba=class{draggingId=null;constructor(e,t){this.alerts=e,this.viewportGetter=t}isOverAlert(e){let t=this.viewportGetter();return t?this.alerts.getAlertAtPoint(e,t)!==null:!1}tryBegin(e){let t=this.viewportGetter();if(!t)return!1;let n=this.alerts.getAlertAtPoint(e,t);return n?(this.draggingId=n.id,!0):!1}move(t){if(this.draggingId===null)return;let n=this.viewportGetter();n&&this.alerts.updateAlertPrice(this.draggingId,e.j(t.y,n))}end(){this.draggingId=null}isActive(){return this.draggingId!==null}},xa=class{state=null;layoutGetter=null;onResize=null;constructor(e=4){this.tolerance=e}configure(e,t){this.layoutGetter=e,this.onResize=t}hitTest(e,t){for(let n of t.dividers)if(Sa(e,n.rect,this.tolerance)){let e=t.panels.find(e=>e.config.id===n.panelId);if(e)return{panelId:n.panelId,orientation:n.orientation,position:e.config.position,size:n.orientation===`horizontal`?e.rect.height:e.rect.width}}return null}cursorAt(e){let t=this.layoutGetter?.();if(!t)return null;let n=this.hitTest(e,t);return n?n.orientation===`horizontal`?`ns-resize`:`ew-resize`:null}tryBegin(e){let t=this.layoutGetter?.();if(!t)return!1;let n=this.hitTest(e,t);return n?(this.state={panelId:n.panelId,position:n.position,startSize:n.size,startPos:e},!0):!1}move(e){let t=this.computeSize(e);t&&this.onResize?.(t.panelId,t.size)}computeSize(e){let t=this.state;if(!t)return null;let n=0;switch(t.position){case`bottom`:n=t.startPos.y-e.y;break;case`top`:n=e.y-t.startPos.y;break;case`left`:n=e.x-t.startPos.x;break;case`right`:n=t.startPos.x-e.x;break}return{panelId:t.panelId,size:t.startSize+n}}end(){this.state=null}isActive(){return this.state!==null}};function Sa(e,t,n){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var Ca=class{position=null;callback=null;data=[];tz=null;timeFormatter=null;timesPastData=!0;setTimesPastData(e){this.timesPastData=e}getTimesPastData(){return this.timesPastData}setTimeFormatter(e){this.timeFormatter=e}setTimezoneOffset(e){this.tz=e}magnetMode=!0;mode=`magnet`;pricePrecision=null;locale=`en-US`;syncedSlot=null;pendingBarIndex=null;pendingPoint=null;callbackScheduled=!1;lastCallbackBarIndex=-1;reportTop=null;reportBottom=null;setCallback(e){this.callback=e}setData(e){this.data=e}setMagnetMode(e){this.magnetMode=e,this.mode=e?`magnet`:`normal`}setMode(e){this.mode=e,this.magnetMode=e===`magnet`}getMode(){return this.mode}setPricePrecision(e){this.pricePrecision=e}setLocale(e){this.locale=e}getPosition(){return this.position}setSyncedSlot(e){this.syncedSlot=e!==null&&Number.isFinite(e)?e:null}getSyncedSlot(){return this.syncedSlot}setReportBounds(e){this.reportTop=e?.top??null,this.reportBottom=e?.bottom??null}onPointerMove(e){this.position=e}onPointerLeave(){this.position=null,this.pendingBarIndex=null,this.pendingPoint=null,this.lastCallbackBarIndex=-1,this.flushCallback(null,null)}render(n,r,i){if(this.mode===`hidden`)return;if(!this.position){this.syncedSlot!==null&&this.renderSynced(n,r,i,this.syncedSlot);return}let{chartRect:a}=r,{x:o,y:s}=this.position;if(o<a.x||o>a.x+a.width)return;let c=a.y+a.height;if(s<Math.min(this.reportTop??a.y,a.y)||s>Math.max(this.reportBottom??c,c))return;let l=s>=a.y&&s<=c,u=e.k(o,r),d=Math.max(0,Math.min(this.data.length-1,u)),f=u>=0&&u<this.data.length;if(this.magnetMode&&(o=e.b(u,r)),d!==this.lastCallbackBarIndex&&(this.pendingBarIndex=d,this.pendingPoint={x:o,y:s},this.lastCallbackBarIndex=d,this.scheduleCallback()),!l)return;let p=T(i);this.magnetMode&&f&&Ta(n,o,r,p.vertical.color),Ea(n,o,a,p.vertical);let m=p.horizontal;if(m.visible){n.setLineDash((0,t.lineDash)(m.style,wa,m.width)),n.strokeStyle=m.color;let r=e._(n,s,m.width);n.lineWidth=r.width,n.beginPath(),n.moveTo(a.x,r.y),n.lineTo(a.x+a.width,r.y),n.stroke()}n.setLineDash([])}renderAxisLabels(n,r,i,a,s){if(this.mode===`hidden`)return;if(!this.position){this.syncedSlot!==null&&this.renderSyncedTimeLabel(n,r,i,a,this.syncedSlot,s);return}let{chartRect:c}=r,{x:l,y:u}=this.position;if(l<c.x||l>c.x+c.width||u<c.y||u>c.y+c.height)return;let d=e.k(l,r);this.magnetMode&&(l=e.b(d,r));let f=`600 ${i.font.sizeSmall}px ${i.font.family}`;Da(n,{text:o(e.j(u,r),r,this.pricePrecision??(0,t.autoPricePrecision)(r.priceRange.min,r.priceRange.max),this.locale),anchorX:c.x+c.width,anchorY:u,orientation:`right`,bg:T(i).labelBackground,fg:T(i).labelText,theme:i,font:f}),this.drawTimePill(n,r,i,a,d,l,s)}renderSynced(t,n,r,i){let a=e.b(i,n),{chartRect:o}=n;if(a<o.x||a>o.x+o.width)return;let s=T(r);this.magnetMode&&i>=0&&i<this.data.length&&Ta(t,a,n,s.vertical.color),Ea(t,a,o,s.vertical)}renderSyncedTimeLabel(t,n,r,i,a,o){let s=e.b(a,n),{chartRect:c}=n;s<c.x||s>c.x+c.width||this.drawTimePill(t,n,r,i,a,s,o)}drawTimePill(n,r,i,a,o,s,c){if(a.length===0||!this.timesPastData&&(o<0||o>=a.length))return;let l=e.y(o,a);Da(n,{text:this.timeFormatter?this.timeFormatter(l>0xe8d4a51000?l:l*1e3,{kind:`crosshair`,timeZone:this.tz}):Oa(l,this.tz,(0,t.barsAreDaily)(a)),anchorX:s,anchorY:c??r.chartRect.y+r.chartRect.height,orientation:`bottom`,bg:T(i).labelBackground,fg:T(i).labelText,theme:i,font:`600 ${i.font.sizeSmall}px ${i.font.family}`})}scheduleCallback(){this.callbackScheduled||(this.callbackScheduled=!0,queueMicrotask(()=>{this.callbackScheduled=!1,this.flushCallback(this.pendingBarIndex,this.pendingPoint)}))}flushCallback(e,t){this.callback?.(e,t)}},wa=[4,4];function Ta(e,t,n,r){let i=n.barWidth+n.barSpacing;e.fillStyle=r,e.globalAlpha=.08,e.fillRect(t-i/2,n.chartRect.y,i,n.chartRect.height),e.globalAlpha=1}function Ea(n,r,i,a){if(!a.visible)return;n.setLineDash((0,t.lineDash)(a.style,wa,a.width)),n.strokeStyle=a.color;let o=e.g(n,r,a.width);n.lineWidth=o.width,n.beginPath(),n.moveTo(o.x,i.y),n.lineTo(o.x,i.y+i.height),n.stroke(),n.setLineDash([])}function Da(e,t){e.save(),e.font=t.font;let n=Math.ceil(e.measureText(t.text).width)+16;if(e.fillStyle=t.bg,e.textBaseline=`middle`,t.orientation===`right`){let r=t.anchorX+5;p(e,r,t.anchorY-20/2,n,20,t.theme),e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(r+2,t.anchorY-5),e.lineTo(r+2,t.anchorY+5),e.closePath(),e.fill(),e.fillStyle=t.fg,e.textAlign=`left`,e.fillText(t.text,r+8,t.anchorY)}else{let r=t.anchorX-n/2,i=t.anchorY+5;p(e,r,i,n,20,t.theme),e.beginPath(),e.moveTo(t.anchorX,t.anchorY),e.lineTo(t.anchorX-5,i+1),e.lineTo(t.anchorX+5,i+1),e.closePath(),e.fill(),e.fillStyle=t.fg,e.textAlign=`center`,e.fillText(t.text,t.anchorX,i+20/2)}e.restore()}function Oa(e,n,r){let i=(0,t.timeParts)(e>0xe8d4a51000?e:e*1e3,n),{year:a,month:o,day:s,hours:c,minutes:l}=i;return r??(0,t.isDateOnly)(i)?`${o}/${s}/${a}`:`${o}/${s} ${c<10?`0`+c:c}:${l<10?`0`+l:l}`}var ka=class{callbacks;enabled=!0;constructor(e){this.callbacks=e}setEnabled(e){this.enabled=e}handleKey(e){if(!this.enabled)return!1;let t=e.shiftKey?10:1;switch(e.key){case`ArrowLeft`:return this.callbacks.scrollBars(-t),!0;case`ArrowRight`:return this.callbacks.scrollBars(t),!0;case`ArrowUp`:case`+`:case`=`:return this.callbacks.zoom(.1),!0;case`ArrowDown`:case`-`:return this.callbacks.zoom(-.1),!0;case`Home`:return this.callbacks.goToStart(),!0;case`End`:return this.callbacks.goToEnd(),!0;case` `:return this.callbacks.fitContent(),!0;default:return!1}}},Aa=16,ja=80,Ma=864e5,Na={month:`short`,day:`numeric`},Pa={month:`short`,day:`numeric`,year:`numeric`};function Fa(e,n,r,i){return(0,t.zonedDateFormatter)(r,i?Pa:Na,n)(e)}var Ia=e=>e<10?`0${e}`:`${e}`;function La(e,n,r,i=`en-US`){let a=(0,t.normalizeBarTime)(e),o=(0,t.timeParts)(a,n);if(r!==void 0&&r>0?r>=Ma:(0,t.isDateOnly)(o))return Fa(a,n,i,!0);let s=Fa(a,n,i,!1),c=`${Ia(o.hours)}:${Ia(o.minutes)}`;return r!==void 0&&r>0&&r<6e4?`${s} · ${c}:${Ia(new Date(a).getUTCSeconds())}`:`${s} · ${c}`}function Ra(e,n){return Number.isFinite(e)?e>=1e9?`${(0,t.formatPrice)(e/1e9,2,n)}B`:e>=1e6?`${(0,t.formatPrice)(e/1e6,2,n)}M`:e>=1e3?`${(0,t.formatPrice)(e/1e3,1,n)}K`:(0,t.formatPrice)(e,e%1==0?0:2,n):`—`}var za=class{el=null;visible=!1;appliedTheme=null;locale=`en-US`;pricePrecision=null;tz=null;priceFormatter=null;timeFormatter=null;dirEl;timeEl;changeEl;valueEls;labelEls=[];dividerEl;width=176;height=112;create(e){if(this.el)return;let t=document.createElement(`div`);t.setAttribute(`aria-hidden`,`true`),Object.assign(t.style,{position:`absolute`,left:`0`,top:`0`,display:`none`,minWidth:`168px`,padding:`8px 10px 9px`,borderRadius:`var(--tcw-tooltip-radius, 8px)`,fontSize:`11.5px`,lineHeight:`1.45`,fontVariantNumeric:`tabular-nums`,pointerEvents:`none`,zIndex:`100`,whiteSpace:`nowrap`,willChange:`transform`,contain:`layout paint`,backdropFilter:`blur(10px)`});let n=V({display:`flex`,alignItems:`center`,gap:`7px`,marginBottom:`6px`});this.dirEl=V({width:`3px`,height:`12px`,borderRadius:`2px`,flex:`none`}),this.timeEl=V({flex:`1`,fontSize:`11px`,letterSpacing:`0.01em`}),this.changeEl=V({padding:`1px 6px`,borderRadius:`999px`,fontSize:`10.5px`,fontWeight:`600`}),n.append(this.dirEl,this.timeEl,this.changeEl);let r=V({display:`grid`,gridTemplateColumns:`auto 1fr auto 1fr`,columnGap:`8px`,rowGap:`1px`,alignItems:`baseline`}),i=e=>{let t=V({fontSize:`10px`,letterSpacing:`0.04em`});t.textContent=e,this.labelEls.push(t);let n=V({textAlign:`right`,fontWeight:`500`});return r.append(t,n),n},a=i(`O`),o=i(`H`),s=i(`L`),c=i(`C`);this.dividerEl=V({height:`1px`,margin:`6px 0 5px`});let l=V({display:`flex`,justifyContent:`space-between`,gap:`12px`}),u=V({fontSize:`10px`,letterSpacing:`0.04em`});u.textContent=`VOL`,this.labelEls.push(u);let d=V({fontWeight:`500`});l.append(u,d),this.valueEls={open:a,high:o,low:s,close:c,volume:d},t.append(n,r,this.dividerEl,l),e.appendChild(t),this.el=t}setLocale(e){this.locale=e}setPricePrecision(e){this.pricePrecision=e}setTimezoneOffset(e){this.tz=e}setPriceFormatter(e){this.priceFormatter=e}setTimeFormatter(e){this.timeFormatter=e}show(e,n,r,i,a={}){let o=this.el;if(!o)return;this.appliedTheme!==r&&this.applyTheme(r);let s=this.pricePrecision??(a.priceRange?(0,t.autoPricePrecision)(a.priceRange.min,a.priceRange.max):(0,t.autoPricePrecision)(n.low,n.high)),c=e=>this.priceFormatter?.(e)??(0,t.formatPrice)(e,s,this.locale),l=a.prevClose??n.open,u=n.close-l,d=l===0?0:u/l*100,f=u>=0,p=f?r.candleUp:r.candleDown,m=f?`+`:`−`;this.timeEl.textContent=this.timeFormatter?this.timeFormatter((0,t.normalizeBarTime)(n.time),{kind:`crosshair`,timeZone:this.tz}):La(n.time,this.tz,a.barStepMs,this.locale),this.changeEl.textContent=`${m}${(0,t.formatPrice)(Math.abs(d),2,this.locale)}%`,this.changeEl.style.color=p,this.changeEl.style.background=Ha(p,.14),this.dirEl.style.background=n.close>=n.open?r.candleUp:r.candleDown,this.valueEls.open.textContent=c(n.open),this.valueEls.high.textContent=c(n.high),this.valueEls.low.textContent=c(n.low),this.valueEls.close.textContent=c(n.close),this.valueEls.close.style.color=n.close>=n.open?r.candleUp:r.candleDown,this.valueEls.volume.textContent=Ra(n.volume,this.locale),this.visible||=(o.style.display=`block`,!0),this.width=o.offsetWidth||this.width,this.height=o.offsetHeight||this.height;let h=a.plot??{x:0,y:0,width:i.width-ja,height:i.height},g=h.x+h.width,_=h.y+h.height,v=e.x+Aa,y=e.y-this.height/2;v+this.width>g-4&&(v=e.x-this.width-Aa),v<h.x+4&&(v=h.x+4),y+this.height>_-4&&(y=_-this.height-4),y<h.y+4&&(y=h.y+4),o.style.transform=`translate(${Math.round(v)}px, ${Math.round(y)}px)`}hide(){this.el&&this.visible&&(this.el.style.display=`none`,this.visible=!1)}isVisible(){return this.visible}destroy(){this.el?.remove(),this.el=null,this.visible=!1,this.appliedTheme=null,this.labelEls=[]}applyTheme(e){let t=this.el,n=Ba(e.background);t.style.background=Ha(e.background,n?.9:.94),t.style.border=`1px solid ${e.axisLine}`,t.style.boxShadow=n?`0 12px 32px -8px rgba(0, 0, 0, 0.6), 0 2px 6px rgba(0, 0, 0, 0.35)`:`0 12px 32px -10px rgba(15, 19, 26, 0.22), 0 2px 6px rgba(15, 19, 26, 0.08)`,t.style.color=e.text,t.style.fontFamily=e.font.family,this.timeEl.style.color=e.textSecondary;for(let t of this.labelEls)t.style.color=e.textSecondary;this.dividerEl.style.background=e.axisLine,this.appliedTheme=e}};function V(e){let t=document.createElement(`div`);return Object.assign(t.style,e),t}function Ba(e){let t=Va(e);return t?(.299*t[0]+.587*t[1]+.114*t[2])/255<.5:!0}function Va(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6);return[parseInt(n.slice(0,2),16),parseInt(n.slice(2,4),16),parseInt(n.slice(4,6),16)]}let t=e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}function Ha(e,t){let n=Va(e);return n?`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t})`:`color-mix(in srgb, ${e} ${Math.round(t*100)}%, transparent)`}var Ua=class{el=null;deltaEl=null;timeEl=null;ohlcEl=null;pinnedBar=null;pinnedIndex=-1;tz=null;priceFormatter=null;setTimezone(e){this.tz=e}setPriceFormatter(e){this.priceFormatter=e}fmt(e){return Wa(this.priceFormatter?this.priceFormatter(e):e.toFixed(2))}create(e){if(this.el)return;this.el=document.createElement(`div`),Object.assign(this.el.style,{position:`absolute`,display:`none`,padding:`6px 10px`,borderRadius:`var(--tcw-tooltip-radius, 4px)`,fontSize:`11px`,fontFamily:`-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif`,lineHeight:`1.5`,pointerEvents:`auto`,cursor:`pointer`,zIndex:`99`,whiteSpace:`nowrap`,willChange:`transform`}),this.timeEl=document.createElement(`div`),this.ohlcEl=document.createElement(`div`),this.deltaEl=document.createElement(`div`),this.deltaEl.style.marginTop=`4px`,this.deltaEl.style.paddingTop=`4px`,this.deltaEl.style.borderTop=`1px solid currentColor`,this.deltaEl.style.opacity=`0.85`,this.deltaEl.style.fontVariantNumeric=`tabular-nums`,this.el.appendChild(this.timeEl),this.el.appendChild(this.ohlcEl),this.el.appendChild(this.deltaEl);let t=document.createElement(`div`);t.textContent=`📌 pinned`,t.style.fontSize=`9px`,t.style.opacity=`0.6`,t.style.marginBottom=`2px`,t.style.letterSpacing=`0.04em`,t.style.textTransform=`uppercase`,this.el.insertBefore(t,this.timeEl),e.appendChild(this.el)}pin(e,n,r){if(!this.el||!this.timeEl||!this.ohlcEl)return;this.pinnedBar=e,this.pinnedIndex=n;let i=e.close>=e.open?r.candleUp:r.candleDown,a=(0,t.timeParts)(e.time>0xe8d4a51000?e.time:e.time*1e3,this.tz);this.timeEl.textContent=`${a.month}/${a.day} ${Ga(a.hours)}:${Ga(a.minutes)}`,this.timeEl.style.color=r.textSecondary;let o=[];for(let[t,n]of[[`O `,e.open],[` H `,e.high],[` L `,e.low],[` C `,e.close]]){let e=document.createElement(`span`);e.style.opacity=`.6`,e.textContent=t;let r=document.createElement(`span`);r.style.color=i,r.textContent=this.fmt(n),o.push(e,r)}this.ohlcEl.replaceChildren(...o);let s=Ka(r.background);this.el.style.background=qa(r.background,s?.96:.97),this.el.style.border=`1px solid ${i}`,this.el.style.boxShadow=s?`0 4px 12px rgba(0,0,0,0.55)`:`0 4px 12px rgba(0,0,0,0.18)`,this.el.style.color=r.text,this.el.style.backdropFilter=`blur(8px)`,this.el.style.display=`block`}unpin(){this.pinnedBar=null,this.pinnedIndex=-1,this.el&&(this.el.style.display=`none`)}isPinned(){return this.pinnedBar!==null}getPinnedIndex(){return this.pinnedIndex}reposition(t,n,r,i){if(!this.el||!this.pinnedBar)return;let a=e.b(this.pinnedIndex,t),o=e.w(this.pinnedBar.close,t),s=t.chartRect,c=a>=s.x-4&&a<=s.x+s.width+4;this.el.style.opacity=c?`1`:`0.35`;let l=Math.max(s.x,Math.min(s.x+s.width-180,a+8)),u=Math.max(s.y,Math.min(s.y+s.height-90,o-64));if(this.el.style.transform=`translate(${Math.round(l)}px, ${Math.round(u)}px)`,this.el.style.left=`0`,this.el.style.top=`0`,this.deltaEl)if(n&&r!==null&&r!==this.pinnedIndex){let e=n.close-this.pinnedBar.close,t=this.pinnedBar.close===0?0:e/this.pinnedBar.close*100,a=e>0?`+`:e<0?`−`:``,o=r-this.pinnedIndex,s=e>=0?i.candleUp:i.candleDown;this.deltaEl.style.color=s,this.deltaEl.innerHTML=`Δ ${a}${this.fmt(Math.abs(e))} <span style="opacity:.7">(${a}${Math.abs(t).toFixed(2)}%)</span> · ${o>0?`+`:``}${o} bars`,this.deltaEl.style.display=`block`}else this.deltaEl.style.display=`none`}destroy(){this.el?.remove(),this.el=null,this.deltaEl=null,this.timeEl=null,this.ohlcEl=null,this.pinnedBar=null,this.pinnedIndex=-1}};function Wa(e){return e.replace(/[&<>"']/g,e=>`&#${e.charCodeAt(0)};`)}function Ga(e){return e<10?`0`+e:``+e}function Ka(e){if(e.startsWith(`#`)){let t=e.slice(1),n=t.length===3?t.split(``).map(e=>e+e).join(``):t.slice(0,6),r=parseInt(n.slice(0,2),16),i=parseInt(n.slice(2,4),16),a=parseInt(n.slice(4,6),16);return(.299*r+.587*i+.114*a)/255<.5}return!0}function qa(e,t){if(e.startsWith(`#`)){let n=e.slice(1),r=n.length===3?n.split(``).map(e=>e+e).join(``):n.slice(0,6);return`rgba(${parseInt(r.slice(0,2),16)}, ${parseInt(r.slice(2,4),16)}, ${parseInt(r.slice(4,6),16)}, ${t})`}return e}var Ja=class{listeners=new Map;tauriBridge=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)}hasListeners(e){return(this.listeners.get(e)?.size??0)>0}emit(e,t){let n={type:e,timestamp:Date.now(),payload:t},r=this.listeners.get(e);if(r)for(let e of r)e(n);if(this.tauriBridge?.enabled&&window.__TAURI__){let t=this.tauriBridge.eventPrefix??`tc-chart`;window.__TAURI__.event.emit(`${t}:${e}`,n).catch(()=>{})}}enableTauriBridge(e){this.tauriBridge=e}disableTauriBridge(){this.tauriBridge=null}destroy(){this.listeners.clear(),this.tauriBridge=null}},Ya=`#FFFFFF`;function Xa(e){for(let t in e)if(e[t]!==null)return!0;return!1}function Za(e,t){let n={};for(let r of Object.keys(e)){let i=e[r];i!==null&&(n[t[r]]=i)}return n}function Qa(e,t){let n=t.style?.trading;return!n||!Xa(n)?e:{...e,orderColors:{...e.orderColors,...Za({buy:n.buy,sell:n.sell},{buy:`buy`,sell:`sell`})},positionColors:{...e.positionColors,...Za({profit:n.profit,loss:n.loss,entry:n.entry},{profit:`profit`,loss:`loss`,entry:`entry`})}}}function $a(e,t){let n=t.style?.markers;return!n||!Xa(n)?e:{...e,...Za(n,{long:`longColor`,short:`shortColor`,neutral:`neutralColor`})}}function eo(e,t){let n=t.style?.tradeZones;return!n||!Xa(n)?e:{...e,...Za(n,{profit:`profitColor`,loss:`lossColor`,active:`activeColor`})}}function to(e){return e?.style?.drawings.handle??Ya}var no=`rgba(12, 16, 22, 0.85)`,ro=no,io=t.DEFAULT_FONT_FAMILY,ao=to(null);function oo(e){ro=e?.background??no,io=e?.font?.family||t.DEFAULT_FONT_FAMILY,ao=to(e)}function so(){return ao}function co(){return io}function H(e,t){return`${t?`${t} `:``}${e}px ${io}`}function U(e,t,n,r){e.save(),e.lineJoin=`round`,e.lineWidth=3,e.strokeStyle=ro,e.globalAlpha*=.85,e.setLineDash([]),e.strokeText(t,n,r),e.restore(),e.fillText(t,n,r)}function lo(e,t){return Math.ceil(e.measureText(t).width)+12}function uo(e,t,n,r,i,a=`#ffffff`){let o=lo(e,t),s=Math.round(r-18/2);return e.fillStyle=i,e.beginPath(),typeof e.roundRect==`function`?e.roundRect(n,s,o,18,4):e.rect(n,s,o,18),e.fill(),e.fillStyle=a,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(t,n+6,s+18/2+.5),o}var fo=14,po=6,mo=4,ho=`rgba(19, 23, 34, 0.85)`,go=`#FFFFFF`,_o=6e4,vo=60*_o,yo=24*vo;function bo(e){let t=Math.abs(e);return t>=10||t===0?2:t>=1?4:Math.min(10,Math.ceil(-Math.log10(t))+3)}function W(e,t=e,n){return n?.formatPrice?n.formatPrice(e):e.toFixed(bo(t))}function xo(e,t,n){let r=t-e,i=e===0?0:r/e*100,a=r>=0?`+`:``;return`${a}${W(r,e,n)} (${a}${i.toFixed(2)}%)`}function So(e){let t=Math.abs(e);if(t<vo)return`${Math.round(t/_o)}m`;if(t<yo){let e=Math.floor(t/vo),n=Math.round((t-e*vo)/_o);return n>0?`${e}h ${n}m`:`${e}h`}let n=Math.floor(t/yo),r=Math.round((t-n*yo)/vo);if(n>=7){let e=Math.floor(n/7),t=n-e*7;return t>0?`${e}w ${t}d`:`${e}w`}return r>0?`${n}d ${r}h`:`${n}d`}function Co(e){return!!e.data&&e.data.length>0}function wo(t,n,r,i){let a=e.E(t.anchors[n].time,i),o=e.E(t.anchors[r].time,i);return Math.round(Math.abs(o-a))}function To(e,t,n,r){return Co(r)?So(e.anchors[n].time-e.anchors[t].time):null}function Eo(e,t,n,r,i=`center`,a=!0){e.font=H(11);let o=0;for(let n of t)o=Math.max(o,e.measureText(n).width);let s=o+po*2,c=t.length*fo+mo*2,l=i===`left`?n:i===`right`?n-s:n-s/2,u=a?r-c:r;e.fillStyle=ho,e.fillRect(l,u,s,c),e.fillStyle=go,e.textAlign=`left`,e.textBaseline=`top`;for(let n=0;n<t.length;n++)e.fillText(t[n],l+po,u+mo+n*fo);return{x:l,y:u,width:s,height:c}}function Do(e,t,n){let r=Math.abs(e.anchors[t[1]].price-e.anchors[t[0]].price),i=Math.abs(e.anchors[n[1]].price-e.anchors[n[0]].price);return i===0?`—`:(r/i).toFixed(3)}var Oo={at:e=>e,value:e=>e,price:e=>e};function ko(t){if(!t)return Oo;let{min:n,max:r}=t.priceRange,i=t.logScale===!0&&n>0&&r>0;return{at:n=>e.E(n,t),value:i?e=>Math.log(Math.max(e,2**-52)):e=>e,price:i?Math.exp:e=>e}}function G(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r*r+i*i;if(a===0)return Math.hypot(e.x-t.x,e.y-t.y);let o=Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/a));return Math.hypot(e.x-(t.x+o*r),e.y-(t.y+o*i))}function Ao(e,t,n,r=!1){for(let r=0;r<t.length-1;r++)if(G(e,t[r],t[r+1])<=n)return!0;return r&&t.length>2&&G(e,t[t.length-1],t[0])<=n}function jo(e,t){switch(e.kind){case`boolean`:return typeof t==`boolean`;case`number`:return typeof t==`number`&&Number.isFinite(t);case`levels`:return Array.isArray(t);default:return typeof t==`string`}}var K=class{hitTestAnchor(e,t,n,r){for(let i=0;i<t.anchors.length;i++){let a=this.anchorToPixel(t.anchors[i],n);if(Math.hypot(e.x-a.x,e.y-a.y)<=r)return i}return-1}option(e,t){let n=this.descriptor.options?.[t],r=e.options?.[t];return n?r!==void 0&&jo(n,r)?r:n.default:r}visibleLevels(e,t=`levels`){return this.option(e,t).filter(e=>e.visible&&Number.isFinite(e.value))}extendLine(e,t,n,r,i){let a=t.x-e.x,o=t.y-e.y,s=Math.hypot(a,o);if(s===0||!r&&!i)return[e,t];let c=Math.hypot(n.chartRect.width,n.chartRect.height)*2,l=a/s*c,u=o/s*c;return[r?{x:e.x-l,y:e.y-u}:e,i?{x:t.x+l,y:t.y+u}:t]}linePriceAt(e,t,n,r,i,a=Oo){let o=this.lineValueAt(e,t,n,r,i,a);return o===null?null:a.price(o)}lineValueAt(e,t,n,r,i,a){let o=a.at(e.time),s=a.at(t.time);if(o===s)return null;let c=(a.at(n)-o)/(s-o);if(!Number.isFinite(c)||c<0&&!r||c>1&&!i)return null;let l=a.value(e.price);return l+(a.value(t.price)-l)*c}anchorToPixel(t,n){return{x:e.D(t.time,n),y:e.w(t.price,n)}}pixelToAnchor(t,n){return{time:e.A(t.x,n),price:e.j(t.y,n)}}applyLineStyle(e,t){switch(e.strokeStyle=t.color,e.lineWidth=t.lineWidth,e.lineCap=`butt`,e.lineJoin=`round`,t.lineStyle){case`dashed`:e.setLineDash([6,4]);break;case`dotted`:e.setLineDash([2,2]);break;default:e.setLineDash([]);break}}strokeHorizontal(t,n,r,i){let a=e._(t,i,Number(t.lineWidth)||1);t.lineWidth=a.width,t.beginPath(),t.moveTo(n,a.y),t.lineTo(r,a.y),t.stroke()}strokeVertical(t,n,r,i){let a=e.g(t,n,Number(t.lineWidth)||1);t.lineWidth=a.width,t.beginPath(),t.moveTo(a.x,r),t.lineTo(a.x,i),t.stroke()}resetLineStyle(e){e.setLineDash([]),e.lineCap=`butt`,e.lineJoin=`miter`}renderAnchorHandles(e,t,n){e.fillStyle=so(),e.strokeStyle=t.style.color,e.lineWidth=1;for(let r of t.anchors){let t=this.anchorToPixel(r,n);e.fillRect(t.x-4,t.y-4,8,8),e.strokeRect(t.x-4,t.y-4,8,8)}}distanceToLine(e,t,n){return G(e,t,n)}distanceToInfiniteLine(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=Math.hypot(r,i);return a===0?Math.hypot(e.x-t.x,e.y-t.y):Math.abs(r*(t.y-e.y)-i*(t.x-e.x))/a}};function Mo(e){let t={};for(let[n,r]of Object.entries(e))t[n]=Array.isArray(r)?r.map(e=>({...e})):r;return t}function q(e){return{...e,anchors:e.anchors.map(e=>({...e})),style:{...e.style},options:e.options?Mo(e.options):void 0,group:e.group?{...e.group}:void 0,meta:e.meta?{...e.meta}:void 0}}function No(e,t){return JSON.stringify(e??{})===JSON.stringify(t??{})}function Po(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n].time!==t[n].time||e[n].price!==t[n].price)return!1;return!0}var Fo=1,Io=1,Lo=/^tc_drawing_(\d+)$/,Ro=/^tc_group_(\d+)$/;function zo(){return`tc_drawing_${Fo++}`}function Bo(){let e=Io++;return{id:`tc_group_${e}`,number:e}}function Vo(e){for(let t of e){let e=Lo.exec(t.id);e&&(Fo=Math.max(Fo,Number(e[1])+1));let n=t.group?Ro.exec(t.group.id):null;n&&(Io=Math.max(Io,Number(n[1])+1))}}function Ho(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t);return[...t.map(e=>n.get(e)).filter(e=>e!==void 0),...e.filter(e=>!r.has(e.id))]}function Uo(e,t,n){let r=t-1;switch(n){case`front`:return r;case`back`:return 0;case`forward`:return Math.min(r,e+1);case`backward`:return Math.max(0,e-1)}}function Wo(e,t){return e.map(e=>e.id===t.id?structuredClone(t):e)}function Go(e,t){switch(t.type){case`drawingBatch`:return[...t.actions??[]].reverse().reduce(Go,[...e]);case`drawingCreate`:return t.after?e.filter(e=>e.id!==t.after.id):[...e];case`drawingRemove`:{if(!t.before)return[...e];let n=[...e];return n.splice(Math.min(t.index??n.length,n.length),0,structuredClone(t.before)),n}case`drawingOrder`:return t.order?Ho(e,t.order.before):[...e];case`drawingModify`:return t.before?Wo(e,t.before):[...e];default:return[...e]}}function Ko(e,t){switch(t.type){case`drawingBatch`:return(t.actions??[]).reduce(Ko,[...e]);case`drawingCreate`:return t.after?[...e,structuredClone(t.after)]:[...e];case`drawingRemove`:return t.before?e.filter(e=>e.id!==t.before.id):[...e];case`drawingOrder`:return t.order?Ho(e,t.order.after):[...e];case`drawingModify`:return t.after?Wo(e,t.after):[...e];default:return[...e]}}var qo={"]":[`forward`,`front`],"}":[`front`,`front`],"[":[`backward`,`back`],"{":[`back`,`back`]};function Jo(e,t,n){if(e===`Escape`)return`escape`;if(e===`Enter`&&!t)return`finish`;if(e===`Delete`||e===`Backspace`)return`delete`;if(!t)return null;let r=n??(e.length===1&&e!==e.toLowerCase()),i=qo[e];if(i)return i[+!!r];switch(e.toLowerCase()){case`c`:return`copy`;case`v`:return`paste`;case`d`:return`duplicate`;case`g`:return r?`ungroup`:`group`;case`z`:return r?`redo`:`undo`;case`y`:return`redo`;default:return null}}var Yo=2,Xo=6;function Zo(e){return e.descriptor.creation??`clicks`}var Qo=class{drawing=null;plugin=null;preview=null;lastPos=null;dragging=!1;step=Yo;get current(){return this.drawing}reset(){this.drawing=null,this.plugin=null,this.preview=null,this.lastPos=null,this.dragging=!1,this.step=Yo}press(e,t,n,r,i){if(this.dragging)return`continue`;let a=Zo(e);if(!this.drawing)return this.plugin=e,this.drawing={...t(),anchors:[n]},this.preview=null,this.lastPos=r,a===`freehand`?(this.dragging=!0,`continue`):a===`clicks`&&e.descriptor.requiredAnchors<=1?`done`:`continue`;let o=this.drawing.anchors[this.drawing.anchors.length-1],s=i?i(o):this.lastPos;if(a===`path`&&s&&Math.hypot(r.x-s.x,r.y-s.y)<=Xo)return this.finish();this.commit(n,r);let c=a===`path`?e.descriptor.maxAnchors??100:e.descriptor.requiredAnchors;return this.drawing.anchors.length>=c?`done`:`continue`}move(e,t){if(!this.drawing||!this.plugin)return!1;if(this.dragging){let n=this.lastPos;return n&&Math.hypot(t.x-n.x,t.y-n.y)<this.step?!0:(this.drawing.anchors.length>=2e3&&(this.drawing.anchors=this.drawing.anchors.filter((e,t)=>t%2==0),this.step*=2),this.commit(e,t),!0)}return Zo(this.plugin)===`path`||this.drawing.anchors.length<this.plugin.descriptor.requiredAnchors?(this.preview=e,!0):!1}release(){return this.dragging?(this.dragging=!1,this.hasEnough()?`done`:`cancel`):null}undoPoint(){return!this.drawing||this.dragging||this.drawing.anchors.length<=1?(this.reset(),!1):(this.drawing.anchors.pop(),this.preview=null,this.lastPos=null,!0)}finish(){return!this.plugin||Zo(this.plugin)!==`path`||!this.hasEnough()?`continue`:(this.preview=null,`done`)}previewState(){return this.drawing?this.preview?{...this.drawing,anchors:[...this.drawing.anchors,this.preview]}:this.drawing:null}take(){let e=this.drawing;return this.reset(),e}hasEnough(){return!!this.drawing&&!!this.plugin&&this.drawing.anchors.length>=Math.max(2,this.plugin.descriptor.requiredAnchors)}commit(e,t){this.drawing.anchors.push(e),this.preview=null,this.lastPos=t}},$o=30;function es(t,n,r,i,a){if(r===`none`||i.length===0)return{time:t,price:n};let o=!!(a?.data&&a.data.length>0),s=Math.round(o?e.O(t,i):t);if(s<0||s>i.length-1)return{time:t,price:n};let c=i[s],l=o?c.time:s,u=c.open;for(let e of[c.high,c.low,c.close])Math.abs(n-e)<Math.abs(n-u)&&(u=e);return r===`magnet`&&a&&Math.abs(e.w(n,a)-e.w(u,a))>$o?{time:l,price:n}:{time:l,price:u}}var ts=class{primaryId=null;others=new Set;listener=null;setListener(e){this.listener=e}change(e){let t=this.ids().join(`\0`),n=e();return this.listener&&this.ids().join(`\0`)!==t&&this.listener(this.ids()),n}get primary(){return this.primaryId}has(e){return e===this.primaryId||this.others.has(e)}ids(){return this.primaryId?[this.primaryId,...this.others]:[]}clear(){this.change(()=>{this.primaryId=null,this.others.clear()})}add(e){this.change(()=>{this.primaryId?e!==this.primaryId&&this.others.add(e):this.primaryId=e})}only(e,t=[]){this.change(()=>{this.primaryId=e,this.others.clear();for(let n of t)n!==e&&this.others.add(n)})}focus(e){e===this.primaryId||!this.others.has(e)||this.change(()=>{this.primaryId&&this.others.add(this.primaryId),this.others.delete(e),this.primaryId=e})}remove(e){return this.change(()=>this.removeNow(e))}removeNow(e){let t=!1;for(let n of e)this.others.delete(n)&&(t=!0),n===this.primaryId&&(this.primaryId=null,t=!0);if(!this.primaryId){let e=this.others.values().next();e.done||(this.primaryId=e.value,this.others.delete(e.value))}return t}},ns=3,rs=class{start=null;handle=-1;grabbed=[];constructor(e){this.find=e}isActive(){return this.start!==null}beginMove(e,t){this.start=e,this.handle=-1,this.grabbed=t.map(e=>({id:e.id,anchors:e.anchors.map(e=>({...e})),before:q(e)}))}beginResize(e,t,n){this.start=e,this.handle=n,this.grabbed=[{id:t.id,anchors:t.anchors.map(e=>({...e})),before:q(t)}]}move(e,t,n){return!this.start||this.grabbed.length===0?!1:this.handle>=0?this.reshape(e,t,n):this.translate(e,t)}end(){let e=this.grabbed.flatMap(({id:e,before:t})=>{let n=this.find(e);return n?[{before:t,drawing:n}]:[]});return this.start=null,this.handle=-1,this.grabbed=[],e}translate(t,n){let r=this.start,i=t.x-r.x,a=t.y-r.y;if(Math.hypot(i,a)<ns&&this.unmoved())return!0;let o=n.barWidth+n.barSpacing,s=o>0?Math.round(i/o):0,c=n.data,l=t=>{let r=e.E(t,n)+s;return c&&c.length>0?e.y(r,c):r};for(let{id:t,anchors:r}of this.grabbed){let i=this.find(t);!i||i.locked||(i.anchors=r.map(t=>({time:s===0?t.time:l(t.time),price:a===0?t.price:e.j(e.w(t.price,n)+a,n)})))}return!0}unmoved(){return this.grabbed.every(({id:e,anchors:t})=>{let n=this.find(e)?.anchors;return!n||n.every((e,n)=>e.time===t[n]?.time&&e.price===t[n]?.price)})}reshape(n,r,i){let a=this.find(this.grabbed[0].id);if(!a)return!1;let o={time:e.A(n.x,r),price:e.j(n.y,r)};if(i?.moveHandle){let e=i.moveHandle(q(a),this.handle,o);a.anchors=e.anchors,a.options=e.options&&Object.keys(e.options).length>0?(0,t.sanitizeDrawingOptions)(i.descriptor.options,e.options):void 0}else this.handle<a.anchors.length&&(a.anchors[this.handle]=o);return!0}},is={drawings:[],pastes:0},as=class{registry=new Map;drawings=[];state=`idle`;activeTool=null;activeStyle={color:`#4c8dff`,lineWidth:1,lineStyle:`solid`,fillColor:`rgba(76, 141, 255, 0.1)`,fillOpacity:.1,fontSize:12};creator=new Qo;finishedAt=-1/0;creationPressAt=-1/0;eraser=!1;selection=new ts;drag=new rs(e=>this.drawings.find(t=>t.id===e));eventCallback=null;requestRender=null;undoRedo=null;magnetMode=`none`;dataGetter=null;displayDataGetter=null;stayInDrawingMode=!1;toolAllowed=()=>!0;toolDefaults=new Map;edits=new Map;batch=null;register(e){this.registry.set(e.descriptor.type,e),this.dataGetter&&e.setDataGetter?.(this.dataGetter)}setEventCallback(e){this.eventCallback=e}setRequestRender(e){this.requestRender=e}setUndoRedoManager(e){this.undoRedo=e}setMagnetMode(e){this.magnetMode=e}getMagnetMode(){return this.magnetMode}setDataGetter(e){this.dataGetter=e;for(let t of this.registry.values())t.setDataGetter?.(e)}setDisplayDataGetter(e){this.displayDataGetter=e}snapToOHLC(e,t,n){let r=this.magnetMode===`none`?[]:this.displayDataGetter?.()??this.dataGetter?.()??[];return es(e,t,this.magnetMode,r,n)}undo(){if(!this.undoRedo)return!1;let e=this.undoRedo.undo();return e?(this.applyUndoAction(e),!0):!1}redo(){if(!this.undoRedo)return!1;let e=this.undoRedo.redo();return e?(this.applyRedoAction(e),!0):!1}foreignHistory=null;setForeignHistory(e){this.foreignHistory=e}applyUndoAction(e){if(e.type===`indicators`||e.type===`custom`){this.foreignHistory?.(e,`undo`);return}this.applyHistory(Go(this.drawings,e))}applyRedoAction(e){if(e.type===`indicators`||e.type===`custom`){this.foreignHistory?.(e,`redo`);return}this.applyHistory(Ko(this.drawings,e))}applyHistory(e){let t=new Map(this.drawings.map((e,t)=>[e.id,{d:e,index:t}]));this.drawings=e,this.settleAfterHistory();let n=new Set(e.map(e=>e.id));for(let e of t.keys())n.has(e)||(this.edits.delete(e),this.eventCallback?.(`drawingRemove`,{id:e}));e.forEach((e,n)=>{let r=t.get(e.id);r?(r.d!==e||r.index!==n)&&this.eventCallback?.(`drawingUpdate`,{id:e.id}):this.eventCallback?.(`drawingCreate`,{id:e.id,type:e.type,drawing:e})})}settleAfterHistory(){this.selection.clear(),this.creator.reset(),this.state=this.activeTool?`creating`:`idle`,this.requestRender?.()}record(e){this.batch?this.batch.push(e):this.undoRedo?.push(e)}batchUndo(e){if(this.batch){e();return}let t=[];this.batch=t;try{e()}finally{this.batch=null}t.length===1?this.undoRedo?.push(t[0]):t.length>1&&this.undoRedo?.push({type:`drawingBatch`,before:null,after:null,actions:t})}deselect(e){this.selection.remove(e)&&!this.selection.primary&&this.state===`selected`&&(this.state=`idle`)}addToSelection(e){this.selection.add(e),this.state=`selected`}groupMates(e){let t=e.group?.id;return t?this.drawings.filter(n=>n.group?.id===t&&n.id!==e.id).map(e=>e.id):[]}select(e){if(this.state===`creating`)return!1;let t=this.drawings.find(t=>t.id===e);return!t||!t.visible?!1:(this.selection.has(e)||this.selection.only(e,this.groupMates(t)),this.state=`selected`,this.requestRender?.(),!0)}setSelectionListener(e){this.selection.setListener(e)}getSelectedDrawingIds(){return this.selection.ids()}selectInRect(t,n){if(this.state===`creating`)return 0;this.selection.clear(),this.state=`idle`;let r=Math.min(t.x0,t.x1),i=Math.max(t.x0,t.x1),a=Math.min(t.y0,t.y1),o=Math.max(t.y0,t.y1);for(let t of this.drawings)t.visible&&t.anchors.some(t=>{let s=e.D(t.time,n),c=e.w(t.price,n);return s>=r&&s<=i&&c>=a&&c<=o})&&this.addToSelection(t.id);return this.requestRender?.(),this.getSelectedDrawingIds().length}toggleSelectionAt(e,t){if(this.state===`creating`)return!1;for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(r.visible&&this.registry.get(r.type)?.hitTest(e,r,t,8))return this.selection.has(r.id)?this.deselect([r.id]):this.addToSelection(r.id),this.requestRender?.(),!0}return!1}beginMove(e,t){this.state=`moving`;let n=this.getSelectedDrawingIds().filter(e=>e!==t.id).map(e=>this.drawings.find(t=>t.id===e)).filter(e=>e!==void 0&&!e.locked);this.drag.beginMove(e,[t,...n])}setFlags(e,t){this.batchUndo(()=>{for(let n of e){if((t.visible===void 0||n.visible===t.visible)&&(t.locked===void 0||n.locked===t.locked))continue;let e=q(n);Object.assign(n,t),this.record({type:`drawingModify`,before:e,after:q(n)})}}),t.visible===!1&&this.deselect(e.map(e=>e.id)),this.requestRender?.()}lockAllDrawings(){this.setFlags(this.drawings,{locked:!0})}unlockAllDrawings(){this.setFlags(this.drawings,{locked:!1})}hideAllDrawings(){this.setFlags(this.drawings,{visible:!1})}showAllDrawings(){this.setFlags(this.drawings,{visible:!0})}setDrawingVisible(e,t){let n=this.drawings.find(t=>t.id===e);return n?(this.setFlags([n],{visible:t}),t):null}setDrawingsVisible(e,t){let n=new Set(e);this.setFlags(this.drawings.filter(e=>n.has(e.id)),{visible:t})}setDrawingsLocked(e,t){let n=new Set(e);this.setFlags(this.drawings.filter(e=>n.has(e.id)),{locked:t})}setDrawingLocked(e,t){let n=this.drawings.find(t=>t.id===e);return n?(this.setFlags([n],{locked:t}),t):null}setActiveTool(e){e&&this.setEraser(!1);let t=e!==this.activeTool;this.activeTool=e,this.state=e?`creating`:`idle`,this.creator.reset(),t&&this.eventCallback?.(`drawingToolChange`,{tool:e})}setStayInDrawingMode(e){this.stayInDrawingMode=e}isStayInDrawingMode(){return this.stayInDrawingMode}setToolFilter(e){this.toolAllowed=e}copySelection(){let e=this.getSelectedDrawingIds().map(e=>this.drawings.find(t=>t.id===e)).filter(e=>e!==void 0);return e.length===0?0:(is.drawings=e.map(e=>structuredClone(e)),is.pastes=0,e.length)}paste(){if(is.drawings.length===0||this.state===`creating`)return[];let e=is.drawings.every(e=>this.drawings.some(t=>t.id===e.id));is.pastes+=1;let t=e?this.computeBarOffsetTime(3*is.pastes):0,n=[];if(this.batchUndo(()=>{for(let e of is.drawings)!this.registry.has(e.type)||!this.toolAllowed(e.type)||n.push(this.addDrawing({type:e.type,anchors:e.anchors.map(e=>({...e,time:e.time+t})),style:{...e.style},options:e.options?Mo(e.options):void 0,meta:e.meta?structuredClone(e.meta):void 0}))}),n.length===0)return n;this.selection.clear();for(let e of n)this.addToSelection(e);return this.requestRender?.(),n}getActiveTool(){return this.activeTool}setStyle(e){Object.assign(this.activeStyle,e)}getActiveStyle(){return{...this.activeStyle}}setSelectedDrawingStyle(e,t){let n=t?[t]:this.getSelectedDrawingIds(),r=!1;return this.batchUndo(()=>{for(let t of n){let n=this.drawings.find(e=>e.id===t);if(!n||n.locked)continue;let i=q(n);n.style={...n.style,...e},this.record({type:`drawingModify`,before:i,after:q(n)}),r=!0}}),r&&this.requestRender?.(),r}onPointerDown(e,t){return this.eraser?this.erase(e,t):this.state===`creating`&&this.activeTool?this.handleCreationClick(e,t):this.state===`idle`||this.state===`selected`?this.handleSelectionClick(e,t):!1}onPointerMove(e,t){let n=this.state===`creating`?this.creator.current:null;if(n&&this.creator.move(this.creationAnchor(n.type,e,t),e))return this.requestRender?.(),!0;if((this.state===`moving`||this.state===`resizing`)&&this.drag.isActive()){let n=this.drawings.find(e=>e.id===this.selection.primary);return this.drag.move(e,t,n&&this.registry.get(n.type))?(this.requestRender?.(),!0):!1}return!1}onPointerUp(){let e=this.state===`creating`?this.creator.release():null;if(e)return this.afterCreationStep(e),!0;if(this.state===`moving`||this.state===`resizing`){let e=this.drag.end();return this.batchUndo(()=>{for(let{before:t,drawing:n}of e)Po(n.anchors,t.anchors)&&No(n.options,t.options)||this.record({type:`drawingModify`,before:t,after:q(n)})}),this.state=`selected`,!0}return!1}onKeyDown(e,t=!1,n){let r=Jo(e,t,n);if(!r)return!1;let i=this.state===`selected`?this.selection.primary:null;switch(r){case`copy`:return i!==null&&this.copySelection()>0;case`paste`:return this.paste().length>0;case`duplicate`:return i!==null&&this.duplicateDrawing(i)!==null;case`group`:return i!==null&&this.groupDrawings(this.getSelectedDrawingIds())!==null;case`ungroup`:return this.ungroupSelection();case`front`:case`forward`:case`backward`:case`back`:return i!==null&&this.moveDrawing(i,r);case`undo`:return this.state===`creating`&&this.creator.current?(this.creator.undoPoint(),this.requestRender?.(),!0):this.undo();case`redo`:return this.redo();case`escape`:return this.escape();case`delete`:return i!==null&&this.removeDrawings(this.getSelectedDrawingIds())>0;case`finish`:{if(this.state!==`creating`||!this.creator.current)return!1;let e=this.creator.finish();return e===`done`?(this.afterCreationStep(e),!0):!1}}}escape(){return this.eraser?(this.setEraser(!1),!0):this.state===`creating`?(this.setActiveTool(null),this.requestRender?.(),!0):this.state===`selected`?(this.selection.clear(),this.state=`idle`,this.requestRender?.(),!0):!1}ungroupSelection(){let e=new Set;for(let t of this.getSelectedDrawingIds()){let n=this.drawings.find(e=>e.id===t)?.group;n&&e.add(n.id)}for(let t of e)this.ungroup(t);return e.size>0}getDrawings(){return this.drawings}setDrawings(e){Vo(e),this.drawings=this.upgradeLegacyAnchors(e).map(e=>{if(!e.options)return e;let n=(0,t.sanitizeDrawingOptions)(this.optionDefs(e.type),e.options);return{...e,options:Object.keys(n).length>0?n:void 0}});let n=new Set(this.drawings.map(e=>e.id));this.deselect(this.getSelectedDrawingIds().filter(e=>!n.has(e)));for(let e of[...this.edits.keys()])n.has(e)||this.edits.delete(e);this.requestRender?.()}moveDrawing(e,t){let n=this.drawings.findIndex(t=>t.id===e);if(n<0)return!1;let r=Uo(n,this.drawings.length,t);if(r===n)return!1;let i=this.drawings.map(e=>e.id),a=[...this.drawings],[o]=a.splice(n,1);return a.splice(r,0,o),this.drawings=a,this.record({type:`drawingOrder`,before:null,after:null,order:{before:i,after:a.map(e=>e.id)}}),this.eventCallback?.(`drawingUpdate`,{id:e}),this.requestRender?.(),!0}getGroups(){let e=new Map;for(let t of this.drawings){if(!t.group)continue;let n=e.get(t.group.id)??{id:t.group.id,name:t.group.name,ids:[]};n.ids.push(t.id),e.set(t.group.id,n)}return[...e.values()]}updateGroup(e,t){let n=this.drawings.filter(t=>t.group?.id===e);return n.length===0?!1:(this.batchUndo(()=>{for(let e of n){let n=q(e);t(e),this.record({type:`drawingModify`,before:n,after:q(e)}),this.eventCallback?.(`drawingUpdate`,{id:e.id})}}),this.requestRender?.(),!0)}groupDrawings(e,t){let n=new Set(e),r=this.drawings.filter(e=>n.has(e.id));if(r.length<2)return null;let{id:i,number:a}=Bo(),o={id:i,name:os(t)||`Group ${a}`};return this.batchUndo(()=>{for(let e of r){let t=q(e);e.group={...o},this.record({type:`drawingModify`,before:t,after:q(e)}),this.eventCallback?.(`drawingUpdate`,{id:e.id})}}),this.requestRender?.(),o.id}ungroup(e){return this.updateGroup(e,e=>{delete e.group})}renameGroup(e,t){let n=os(t);return n.length>0&&this.updateGroup(e,t=>{t.group={id:e,name:n}})}setGroupVisible(e,t){let n=this.updateGroup(e,e=>{e.visible=t});return n&&!t&&this.deselect(this.drawings.filter(t=>t.group?.id===e).map(e=>e.id)),n}setGroupLocked(e,t){return this.updateGroup(e,e=>{e.locked=t})}priceAt(e,t,n){let r=this.drawings.find(t=>t.id===e);if(!r)return null;let i=this.registry.get(r.type)?.priceAt?.(r,t,n)??null;return i&&i.every(Number.isFinite)?i:null}hasPriceLevels(e){let t=this.drawings.find(t=>t.id===e);return!!t&&typeof this.registry.get(t.type)?.priceAt==`function`}getDescriptor(e){return this.registry.get(e)?.descriptor??null}getOptionDefs(e){return this.optionDefs(e)??{}}optionDefs(e){return this.registry.get(e)?.descriptor.options}initialOptions(e,n){let r=this.optionDefs(e),i={...Mo(this.toolDefaults.get(e)??{}),...(0,t.sanitizeDrawingOptions)(r,n)};return Object.keys(i).length>0?i:void 0}setToolDefaults(e,n){let r=n?(0,t.sanitizeDrawingOptions)(this.optionDefs(e),n):{};Object.keys(r).length>0?this.toolDefaults.set(e,r):this.toolDefaults.delete(e)}getToolDefaults(e){return Mo(this.toolDefaults.get(e)??{})}getDrawingOptions(e){let n=this.drawings.find(t=>t.id===e);return n?(0,t.resolveDrawingOptions)(this.optionDefs(n.type),n.options):{}}setDrawingOptions(e,t){return this.updateDrawing(e,{options:t})}updateDrawing(e,n){let r=this.drawings.find(t=>t.id===e);if(!r||n.anchors&&!(n.anchors.length===r.anchors.length&&n.anchors.every(e=>Number.isFinite(e.time)&&Number.isFinite(e.price))))return!1;let i=this.edits.has(e)?null:q(r);if(n.anchors&&(r.anchors=n.anchors.map(e=>({time:e.time,price:e.price}))),n.style&&(r.style={...r.style,...n.style}),n.options){let e={...r.options,...(0,t.sanitizeDrawingOptions)(this.optionDefs(r.type),n.options)};r.options=Object.keys(e).length>0?e:void 0}return i&&this.record({type:`drawingModify`,before:i,after:q(r)}),this.eventCallback?.(`drawingUpdate`,{id:e}),this.requestRender?.(),!0}beginEdit(e){let t=this.drawings.find(t=>t.id===e);return t?(this.edits.has(e)||this.edits.set(e,q(t)),!0):!1}endEdit(e,{cancel:t=!1}={}){let n=this.edits.get(e);if(!n)return;this.edits.delete(e);let r=this.drawings.findIndex(t=>t.id===e);r<0||(t?(this.drawings[r]=n,this.requestRender?.()):JSON.stringify(n)!==JSON.stringify(this.drawings[r])&&this.record({type:`drawingModify`,before:n,after:q(this.drawings[r])}),this.eventCallback?.(`drawingUpdate`,{id:e}))}addDrawing(e){e.id&&Vo([{id:e.id}]);let t=e.id??zo(),n={id:t,type:e.type,anchors:e.anchors.map(e=>({...e})),style:{...this.activeStyle,...e.style},visible:e.visible??!0,locked:e.locked??!1,options:this.initialOptions(e.type,e.options),meta:e.meta};return this.drawings=[...this.drawings,n],this.record({type:`drawingCreate`,before:null,after:q(n)}),this.eventCallback?.(`drawingCreate`,{id:t,type:n.type,drawing:n}),this.requestRender?.(),t}upgradeLegacyAnchors(e){let t=this.dataGetter?.();return!t||t.length===0?e:e.map(e=>({...e,anchors:e.anchors.map(e=>{if(e.time>=1e9)return e;let n=Math.max(0,Math.min(t.length-1,Math.round(e.time)));return{...e,time:t[n].time}})}))}removeDrawing(e){let t=this.drawings.findIndex(t=>t.id===e),n=this.drawings[t];this.drawings=this.drawings.filter(t=>t.id!==e),n&&this.record({type:`drawingRemove`,before:structuredClone(n),after:null,index:t}),this.deselect([e]),this.edits.delete(e),this.eventCallback?.(`drawingRemove`,{id:e}),this.requestRender?.()}removeDrawings(e){let t=[...new Set(e)].filter(e=>{let t=this.drawings.find(t=>t.id===e);return t!==void 0&&!t.locked});return t.length===0?0:(this.batchUndo(()=>{for(let e of t)this.removeDrawing(e)}),t.length)}duplicateDrawing(e){let t=this.drawings.find(t=>t.id===e);if(!t)return null;let n=structuredClone(t);n.id=zo();let r=this.computeBarOffsetTime(3);return n.anchors=n.anchors.map(e=>({...e,time:e.time+r})),n.locked=!1,this.drawings.push(n),this.record({type:`drawingCreate`,before:null,after:structuredClone(n)}),this.selection.only(n.id),this.state=`selected`,this.eventCallback?.(`drawingCreate`,{id:n.id,type:n.type,drawing:n}),this.requestRender?.(),n.id}clearDrawings(){this.drawings=[],this.selection.clear(),this.state=`idle`,this.requestRender?.()}getSelectedDrawingId(){return this.selection.primary}render(e,t){e.save(),e.beginPath(),e.rect(t.chartRect.x,t.chartRect.y,t.chartRect.width,t.chartRect.height),e.clip();for(let n of this.drawings){if(!n.visible)continue;let r=this.registry.get(n.type);if(!r)continue;let i=this.selection.has(n.id);r.render(e,n,t,i)}let n=this.creator.previewState();n&&this.registry.get(n.type)?.render(e,n,t,!1),e.restore()}computeBarOffsetTime(e){let t=this.dataGetter?.();if(!t||t.length<2)return e;let n=Math.max(0,t.length-20),r=[];for(let e=n+1;e<t.length;e++)r.push(t[e].time-t[e-1].time);return r.length===0?e:(r.sort((e,t)=>e-t),e*r[Math.floor(r.length/2)])}creationAnchor(t,n,r){let i=e.A(n.x,r),a=e.j(n.y,r);return this.registry.get(t)?.descriptor.creation===`freehand`?{time:i,price:a}:this.snapToOHLC(i,a,r)}handleCreationClick(t,n){let r=this.activeTool,i=r?this.registry.get(r):void 0;if(!r||!i)return!1;let a=()=>({id:zo(),type:r,anchors:[],style:{...this.activeStyle},visible:!0,locked:!1,options:this.initialOptions(r)});return this.creationPressAt=Date.now(),this.afterCreationStep(this.creator.press(i,a,this.creationAnchor(r,t,n),t,t=>({x:e.D(t.time,n),y:e.w(t.price,n)}))),!0}afterCreationStep(e){e===`done`?this.finalizeCreation():e===`cancel`&&this.creator.reset(),this.requestRender?.()}setEraser(e){e!==this.eraser&&(this.eraser=e,e&&(this.setActiveTool(null),this.selection.clear(),this.state=`idle`),this.eventCallback?.(`toolModeChange`,{eraser:e}),this.requestRender?.())}isEraser(){return this.eraser}erase(e,t){let n=this.erasableAt(e,t);return n?(this.removeDrawing(n),!0):!1}erasableAt(e,t){for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!(!r.visible||r.locked)&&this.registry.get(r.type)?.hitTest(e,r,t,8))return r.id}return null}justFinished(e=500){return Date.now()-this.creationPressAt<e&&this.finishedAt>=this.creationPressAt}finalizeCreation(){let e=this.creator.take();if(e){if(this.finishedAt=Date.now(),this.drawings.push(e),this.selection.only(e.id),this.record({type:`drawingCreate`,before:null,after:structuredClone(e)}),this.eventCallback?.(`drawingCreate`,{id:e.id,type:e.type,drawing:e}),this.stayInDrawingMode&&this.activeTool){this.selection.clear(),this.state=`creating`;return}this.activeTool=null,this.state=`selected`,this.eventCallback?.(`drawingToolChange`,{tool:null})}}isDragging(){return this.state===`moving`||this.state===`resizing`}drawingAt(e,t,n=8){for(let r=this.drawings.length-1;r>=0;r--){let i=this.drawings[r];if(i.visible&&this.registry.get(i.type)?.hitTest(e,i,t,n))return i.id}return null}hoverCursorAt(e,t){if(this.eraser)return this.erasableAt(e,t)?`pointer`:null;if(this.activeTool||this.state===`creating`)return null;if(this.selection.primary){let n=this.drawings.find(e=>e.id===this.selection.primary),r=n&&n.visible&&!n.locked?this.registry.get(n.type):void 0;if(n&&r&&r.hitTestAnchor(e,n,t,8)>=0)return`move`}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!(!r.visible||r.locked)&&this.registry.get(r.type)?.hitTest(e,r,t,8))return`pointer`}return null}handleSelectionClick(e,t){if(this.selection.primary){let n=this.drawings.find(e=>e.id===this.selection.primary);if(n&&n.visible&&!n.locked){let r=this.registry.get(n.type);if(r){let i=r.hitTestAnchor(e,n,t,8);if(i>=0)return this.state=`resizing`,this.drag.beginResize(e,n,i),!0;if(r.hitTest(e,n,t,8))return this.beginMove(e,n),!0}}}for(let n=this.drawings.length-1;n>=0;n--){let r=this.drawings[n];if(!r.visible)continue;let i=this.registry.get(r.type);if(i&&i.hitTest(e,r,t,8))return this.selection.has(r.id)?this.selection.focus(r.id):this.selection.only(r.id,this.groupMates(r)),this.requestRender?.(),r.locked?(this.state=`selected`,!1):(this.beginMove(e,r),!0)}return this.selection.primary&&(this.selection.clear(),this.state=`idle`,this.requestRender?.()),!1}};function os(e){return(e??``).trim().slice(0,80)}var ss=class{constructor(e){this.manager=e}render(e,t,n){oo(n??null),this.manager.render(e,t)}};function cs(e,t,n){let r=Math.max(0,t),i=Math.min(e.length-1,n);if(i<=r)return null;let a=r,o=r;for(let t=r;t<=i;t++)e[t].high>e[a].high&&(a=t),e[t].low<e[o].low&&(o=t);if(a===o)return null;let s={time:e[a].time,price:e[a].high},c={time:e[o].time,price:e[o].low};return a<o?[s,c]:[c,s]}var ls={0:`#7d8696`,.236:`#e8505b`,.25:`#e8505b`,.382:`#c98316`,.5:`#1fa874`,.618:`#1398a8`,.75:`#1398a8`,.786:`#4c8dff`,1:`#7d8696`,1.272:`#a57cff`,1.414:`#e25592`,1.618:`#4c8dff`,2:`#a57cff`,2.618:`#e8505b`,3.618:`#a57cff`,4.236:`#e25592`};function us(e,t=[]){return ds(e,t).map(e=>{let t=ls[e.value];return t?{...e,color:t}:e})}function ds(e,t=[]){return[...e.map(e=>({value:e,visible:!0})),...t.map(e=>({value:e,visible:!1}))].sort((e,t)=>e.value-t.value)}function fs(e=!1,t=!1){return{extendLeft:{kind:`boolean`,label:`Extend left`,default:e},extendRight:{kind:`boolean`,label:`Extend right`,default:t}}}var ps={showLevels:{kind:`boolean`,label:`Show levels`,default:!0},showPrices:{kind:`boolean`,label:`Show prices`,default:!0},labelPosition:{kind:`choice`,label:`Labels`,default:`left`,choices:[{value:`left`,label:`Left`},{value:`right`,label:`Right`}]}},ms=class extends K{descriptor={type:`trendLine`,name:`Trend Line`,requiredAnchors:2,options:fs()};segment(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return this.extendLine(n,r,t,this.option(e,`extendLeft`),this.option(e,`extendRight`))}render(e,t,n,r){if(t.anchors.length<2)return;let[i,a]=this.segment(t,n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<2)return null;let r=this.linePriceAt(e.anchors[0],e.anchors[1],t,this.option(e,`extendLeft`),this.option(e,`extendRight`),ko(n));return r===null?null:[r]}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let[i,a]=this.segment(t,n);return this.distanceToLine(e,i,a)<=r}},hs=class extends K{descriptor={type:`horizontalLine`,name:`Horizontal Line`,requiredAnchors:1};priceAt(e){return e.anchors.length<1?null:[e.anchors[0].price]}render(t,n,r,i){if(n.anchors.length<1)return;let a=e.w(n.anchors[0].price,r),{chartRect:o}=r;this.applyLineStyle(t,n.style),this.strokeHorizontal(t,o.x,o.x+o.width,a),this.resetLineStyle(t),t.fillStyle=n.style.color,t.font=H(11),t.textBaseline=`bottom`,U(t,W(n.anchors[0].price,n.anchors[0].price,r),o.x+4,a-3),i&&this.renderAnchorHandles(t,n,r)}hitTest(t,n,r,i){if(n.anchors.length<1)return!1;let a=e.w(n.anchors[0].price,r);return Math.abs(t.y-a)<=i&&t.x>=r.chartRect.x&&t.x<=r.chartRect.x+r.chartRect.width}},gs=class extends K{descriptor={type:`horizontalRay`,name:`Horizontal Ray`,requiredAnchors:1};priceAt(e,t){return e.anchors.length<1||t<e.anchors[0].time?null:[e.anchors[0].price]}render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=i.y,{chartRect:o}=n;this.applyLineStyle(e,t.style),this.strokeHorizontal(e,i.x,o.x+o.width,a),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=H(11),e.textBaseline=`bottom`,U(e,W(t.anchors[0].price,t.anchors[0].price,n),i.x+4,a-3),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r&&e.x>=i.x-r&&e.x<=n.chartRect.x+n.chartRect.width}},_s=class extends K{descriptor={type:`verticalLine`,name:`Vertical Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style),this.strokeVertical(e,i.x,a.y,a.y+a.height),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;return Math.abs(e.x-i.x)<=r&&e.y>=a.y&&e.y<=a.y+a.height}},vs=class extends K{descriptor={type:`ray`,name:`Ray`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x+s/l*u,f=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(d,f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<2)return null;let r=this.linePriceAt(e.anchors[0],e.anchors[1],t,!1,!0,ko(n));return r===null?null:[r]}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;return((e.x-i.x)*o+(e.y-i.y)*s)/(o*o+s*s)<0?!1:this.distanceToInfiniteLine(e,i,a)<=r}},ys=class extends K{descriptor={type:`extendedLine`,name:`Extended Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=a.x-i.x,c=a.y-i.y,l=Math.hypot(s,c);if(l===0)return;let u=Math.hypot(o.width,o.height)*2,d=i.x-s/l*u,f=i.y-c/l*u,p=i.x+s/l*u,m=i.y+c/l*u;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(d,f),e.lineTo(p,m),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<2)return null;let r=this.linePriceAt(e.anchors[0],e.anchors[1],t,!0,!0,ko(n));return r===null?null:[r]}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToInfiniteLine(e,i,a)<=r}},bs=class extends K{descriptor={type:`parallelChannel`,name:`Parallel Channel`,requiredAnchors:3,fill:!0,options:{...fs(),middleLine:{kind:`boolean`,label:`Middle line`,default:!1}}};lines(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t),i=this.option(e,`extendLeft`),a=this.option(e,`extendRight`),o=this.extendLine(n,r,t,i,a);if(e.anchors.length<3)return{base:o,parallel:null,middle:null,corners:null};let s=this.anchorToPixel(e.anchors[2],t),c=r.x-n.x,l=r.y-n.y,u=Math.hypot(c,l)||1,d=-l/u,f=c/u,p=(s.x-n.x)*d+(s.y-n.y)*f,m=(e,t)=>({x:e.x+d*p*t,y:e.y+f*p*t}),h=m(n,1),g=m(r,1);return{base:o,parallel:this.extendLine(h,g,t,i,a),middle:this.option(e,`middleLine`)?this.extendLine(m(n,.5),m(r,.5),t,i,a):null,corners:[n,r,g,h]}}render(e,t,n,r){if(t.anchors.length<2)return;let{base:i,parallel:a,middle:o,corners:s}=this.lines(t,n);this.applyLineStyle(e,t.style);for(let t of[i,a])t&&(e.beginPath(),e.moveTo(t[0].x,t[0].y),e.lineTo(t[1].x,t[1].y),e.stroke());if(o&&(e.setLineDash([4,4]),e.beginPath(),e.moveTo(o[0].x,o[0].y),e.lineTo(o[1].x,o[1].y),e.stroke()),s&&t.style.fillColor){e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(s[0].x,s[0].y);for(let t of s.slice(1))e.lineTo(t.x,t.y);e.closePath(),e.fill()}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}priceAt(e,t,n){if(e.anchors.length<3)return null;let[r,i,a]=e.anchors,o=ko(n),s=this.lineValueAt(r,i,t,this.option(e,`extendLeft`),this.option(e,`extendRight`),o),c=this.lineValueAt(r,i,a.time,!0,!0,o);if(s===null||c===null)return null;let l=o.value(a.price)-c,u=[s,s+l];return this.option(e,`middleLine`)&&u.push(s+l/2),u.map(o.price)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{base:i,parallel:a,middle:o}=this.lines(t,n);return[i,a,o].some(t=>t!==null&&this.distanceToLine(e,t[0],t[1])<=r)}},xs=class extends K{descriptor={type:`regressionChannel`,name:`Regression Channel`,requiredAnchors:2,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=a.x-i.x,s=a.y-i.y,c=Math.hypot(o,s);if(c===0){this.resetLineStyle(e);return}let l=Math.max(10,Math.min(c*.2,100)),u=-s/c*l,d=o/c*l;e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.stroke(),e.beginPath(),e.moveTo(i.x-u,i.y-d),e.lineTo(a.x-u,a.y-d),e.stroke(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.beginPath(),e.moveTo(i.x+u,i.y+d),e.lineTo(a.x+u,a.y+d),e.lineTo(a.x-u,a.y-d),e.lineTo(i.x-u,i.y-d),e.closePath(),e.fill()),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.hypot(a.x-i.x,a.y-i.y),s=Math.max(10,Math.min(o*.2,100));return this.distanceToLine(e,i,a)<=r+s}};function Ss(e,t,n,r,i=e=>e.toFixed(2)){let a=`${(e*100).toFixed(1)}%`,o=i(t);return n&&r?`${a} (${o})`:n?a:r?o:``}function Cs(t,n,r,i,a,o){let s=a.x1-a.x0;if(a.background&&i.length>1){let o=[...i].sort((e,t)=>e.level.value-t.level.value);for(let i=0;i<o.length-1;i++){let c=e.w(o[i].price,r),l=e.w(o[i+1].price,r),u=o[i+1].level.color,d=u??n.style.fillColor;d&&(t.fillStyle=d,t.globalAlpha=u?.07:.05+i*.02,t.fillRect(a.x0,Math.min(c,l),s,Math.abs(l-c)))}t.globalAlpha=1}t.font=H(11),t.textBaseline=`bottom`,t.textAlign=a.labelPosition===`right`?`right`:`left`;let c=a.labelPosition===`right`?a.x1-4:a.x0+4;for(let{level:s,price:l}of i){let i=e.w(l,r),u=s.color??n.style.color;o(u),t.globalAlpha=s.value===0||s.value===1?1:.8;let d=e._(t,i,Number(t.lineWidth)||1);t.lineWidth=d.width,t.beginPath(),t.moveTo(a.x0,d.y),t.lineTo(a.x1,d.y),t.stroke();let f=Ss(s.value,l,a.showLevels,a.showPrices,e=>W(e,e,r));f&&(t.globalAlpha=1,t.fillStyle=u,U(t,f,c,i-3))}t.globalAlpha=1}function ws(t,n,r,i,a,o){return t.x<i-o||t.x>a+o?!1:r.some(({price:r})=>Math.abs(t.y-e.w(r,n))<=o)}var Ts=us([0,.236,.382,.5,.618,.786,1],[1.272,1.414,1.618,2.618,3.618,4.236]),Es=class extends K{descriptor={type:`fibRetracement`,name:`Fibonacci Retracement`,requiredAnchors:2,fill:!0,options:{levels:{kind:`levels`,label:`Levels`,default:Ts},...fs(!0,!0),reverse:{kind:`boolean`,label:`Reverse`,default:!1},...ps,background:{kind:`boolean`,label:`Background`,default:!0}}};levels(e){let t=this.option(e,`reverse`),n=e.anchors[+!!t].price,r=e.anchors[+!t].price;return this.visibleLevels(e).map(e=>({level:e,price:n+(r-n)*e.value}))}span(e,t){let{chartRect:n}=t,r=this.anchorToPixel(e.anchors[0],t).x,i=this.anchorToPixel(e.anchors[1],t).x;return[this.option(e,`extendLeft`)?n.x:Math.min(r,i),this.option(e,`extendRight`)?n.x+n.width:Math.max(r,i)]}render(e,t,n,r){if(t.anchors.length<2)return;let[i,a]=this.span(t,n);Cs(e,t,n,this.levels(t),{x0:i,x1:a,showLevels:this.option(t,`showLevels`),showPrices:this.option(t,`showPrices`),labelPosition:this.option(t,`labelPosition`),background:this.option(t,`background`)},n=>this.applyLineStyle(e,{...t.style,color:n})),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let[i,a]=this.span(t,n);return ws(e,n,this.levels(t),i,a,r)}},Ds=us([0,.618,1,1.618,2,2.618,3.618,4.236],[.382,.5,.786,1.272,1.414]),Os=class extends K{descriptor={type:`fibExtension`,name:`Fibonacci Extension`,requiredAnchors:3,fill:!0,options:{levels:{kind:`levels`,label:`Levels`,default:Ds},...fs(!0,!0),...ps,background:{kind:`boolean`,label:`Background`,default:!1}}};levels(e){let t=e.anchors[1].price-e.anchors[0].price,n=e.anchors[2].price;return this.visibleLevels(e).map(e=>({level:e,price:n+t*e.value}))}span(e,t){let{chartRect:n}=t,r=e.anchors.map(e=>this.anchorToPixel(e,t).x);return[this.option(e,`extendLeft`)?n.x:Math.min(...r),this.option(e,`extendRight`)?n.x+n.width:Math.max(...r)]}render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let[i,a]=this.span(t,n);Cs(e,t,n,this.levels(t),{x0:i,x1:a,showLevels:this.option(t,`showLevels`),showPrices:this.option(t,`showPrices`),labelPosition:this.option(t,`labelPosition`),background:this.option(t,`background`)},n=>this.applyLineStyle(e,{...t.style,color:n})),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let[i,a]=this.span(t,n);return ws(e,n,this.levels(t),i,a,r)}},ks=class extends K{descriptor={type:`rectangle`,name:`Rectangle`,requiredAnchors:2,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y);t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fillRect(o,s,c,l)),this.applyLineStyle(e,t.style),e.strokeRect(o,s,c,l),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.min(i.y,a.y)-r,c=Math.max(i.x,a.x)+r,l=Math.max(i.y,a.y)+r;if(e.x<o||e.x>c||e.y<s||e.y>l)return!1;let u=Math.min(i.x,a.x)+r,d=Math.min(i.y,a.y)+r,f=Math.max(i.x,a.x)-r,p=Math.max(i.y,a.y)-r;return!(e.x>u&&e.x<f&&e.y>d&&e.y<p)||!!t.style.fillColor}},As=class extends K{descriptor={type:`ellipse`,name:`Ellipse`,requiredAnchors:2,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.abs(a.x-i.x)/2,l=Math.abs(a.y-i.y)/2;e.beginPath(),e.ellipse(o,s,Math.max(c,1),Math.max(l,1),0,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=(i.x+a.x)/2,s=(i.y+a.y)/2,c=Math.max(Math.abs(a.x-i.x)/2,1),l=Math.max(Math.abs(a.y-i.y)/2,1),u=(e.x-o)/c,d=(e.y-s)/l,f=Math.sqrt(u*u+d*d),p=r/Math.max(Math.min(c,l),4);return t.style.fillColor?f<=1+p:Math.abs(f-1)<=p}},js=class extends K{descriptor={type:`triangle`,name:`Triangle`,requiredAnchors:3,fill:!0};render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=t.anchors.map(e=>this.anchorToPixel(e,n));e.beginPath(),e.moveTo(i[0].x,i[0].y),e.lineTo(i[1].x,i[1].y),e.lineTo(i[2].x,i[2].y),e.closePath(),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<3;t++){let n=(t+1)%3;if(this.distanceToLine(e,i[t],i[n])<=r)return!0}return!1}},Ms=class extends K{descriptor={type:`pitchfork`,name:`Andrews' Pitchfork`,requiredAnchors:3};origin(e,t){return e}render(e,t,n,r){if(t.anchors.length<3){if(t.anchors.length===2){let r=this.anchorToPixel(t.anchors[0],n),i=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e)}return}let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n),s=this.origin(i,a),c={x:(a.x+o.x)/2,y:(a.y+o.y)/2};(s.x!==i.x||s.y!==i.y)&&(e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(s.x,s.y),e.stroke(),e.setLineDash([]));let l=c.x-s.x,u=c.y-s.y,d=Math.hypot(l,u)||1,f=Math.hypot(n.chartRect.width,n.chartRect.height),p=s.x+l/d*f,m=s.y+u/d*f;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(p,m),e.stroke(),e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x+l/d*f,a.y+u/d*f),e.stroke(),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(o.x+l/d*f,o.y+u/d*f),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[1],n),a=this.anchorToPixel(t.anchors[2],n),o=this.origin(this.anchorToPixel(t.anchors[0],n),i),s={x:(i.x+a.x)/2,y:(i.y+a.y)/2};if(this.distanceToInfiniteLine(e,o,s)<=r)return!0;let c=s.x-o.x,l=s.y-o.y,u={x:i.x+c,y:i.y+l},d={x:a.x+c,y:a.y+l};return this.distanceToInfiniteLine(e,i,u)<=r||this.distanceToInfiniteLine(e,a,d)<=r}},Ns=class extends Ms{descriptor={type:`schiffPitchfork`,name:`Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:e.x,y:(e.y+t.y)/2}}},Ps=class extends Ms{descriptor={type:`modifiedSchiffPitchfork`,name:`Modified Schiff Pitchfork`,requiredAnchors:3};origin(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}},Fs=[`0`,`i`,`ii`,`iii`,`iv`,`v`];function Is(e,t){let n=/^[0-9]$/.test(e);switch(t){case`primary`:return n?e===`0`?`⓪`:String.fromCodePoint(9312+Number(e)-1):/^[A-Z]$/.test(e)?String.fromCodePoint(9398+e.charCodeAt(0)-65):e;case`intermediate`:return`(${e})`;case`minute`:return n?Fs[Number(e)]??e:e.toLowerCase();default:return e}}var Ls={degree:{kind:`choice`,label:`Degree`,default:`minor`,choices:[{value:`primary`,label:`Primary`},{value:`intermediate`,label:`Intermediate`},{value:`minor`,label:`Minor`},{value:`minute`,label:`Minute`}]}},Rs=class extends K{render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));this.applyLineStyle(e,t.style),e.beginPath(),i.forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),e.stroke(),this.resetLineStyle(e);let a=this.option(t,`degree`);e.font=H(12,`bold`),e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<i.length&&t<this.labels.length;t++){let n=i[t-1]??i[t+1],r=i[t+1]??i[t-1],o=i[t].y<=Math.min(n.y,r.y);e.textBaseline=o?`bottom`:`top`,U(e,Is(this.labels[t],a),i[t].x,i[t].y+(o?-6:6))}r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:Ao(e,t.anchors.map(e=>this.anchorToPixel(e,n)),r)}},zs=class extends Rs{descriptor={type:`elliottWave`,name:`Elliott Wave`,requiredAnchors:8,options:Ls};labels=[`1`,`2`,`3`,`4`,`5`,`A`,`B`,`C`]},Bs=class extends Rs{descriptor={type:`elliottImpulse`,name:`Elliott Impulse Wave`,requiredAnchors:6,options:Ls};labels=[`0`,`1`,`2`,`3`,`4`,`5`]},Vs=class extends Rs{descriptor={type:`elliottCorrection`,name:`Elliott Correction Wave`,requiredAnchors:4,options:Ls};labels=[`0`,`A`,`B`,`C`]},Hs=class extends Rs{descriptor={type:`elliottTriangle`,name:`Elliott Triangle Wave`,requiredAnchors:6,options:Ls};labels=[`0`,`A`,`B`,`C`,`D`,`E`]},Us=class extends Rs{descriptor={type:`elliottDoubleCombo`,name:`Elliott Double Combo Wave`,requiredAnchors:4,options:Ls};labels=[`0`,`W`,`X`,`Y`]},Ws=class extends Rs{descriptor={type:`elliottTripleCombo`,name:`Elliott Triple Combo Wave`,requiredAnchors:6,options:Ls};labels=[`0`,`W`,`X`,`Y`,`X`,`Z`]},Gs=class extends K{descriptor={type:`priceRange`,name:`Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.abs(a.x-i.x),c=Math.min(i.y,a.y),l=Math.abs(a.y-i.y),u=t.anchors[1].price>t.anchors[0].price;e.fillStyle=u?`rgba(31, 168, 116, 0.15)`:`rgba(232, 80, 91, 0.15)`,e.fillRect(o,c,s,l),this.applyLineStyle(e,t.style),e.strokeRect(o,c,s,l),this.resetLineStyle(e);let d=xo(t.anchors[0].price,t.anchors[1].price,n);e.font=H(12),e.fillStyle=u?`#1fa874`:`#e8505b`,e.textAlign=`center`,e.textBaseline=`middle`,e.fillText(d,o+s/2,c+l/2),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return e.x>=o-r&&e.x<=s+r&&e.y>=c-r&&e.y<=l+r}},Ks=class extends K{descriptor={type:`dateRange`,name:`Date Range`,requiredAnchors:2};render(t,n,r,i){if(n.anchors.length<2)return;let a=this.anchorToPixel(n.anchors[0],r),o=this.anchorToPixel(n.anchors[1],r),{chartRect:s}=r,c=Math.min(a.x,o.x),l=Math.max(a.x,o.x);t.fillStyle=`rgba(76, 141, 255, 0.08)`,t.fillRect(c,s.y,l-c,s.height),this.applyLineStyle(t,n.style),t.beginPath(),t.moveTo(c,s.y),t.lineTo(c,s.y+s.height),t.stroke(),t.beginPath(),t.moveTo(l,s.y),t.lineTo(l,s.y+s.height),t.stroke(),this.resetLineStyle(t);let u=e.E(n.anchors[0].time,r),d=e.E(n.anchors[1].time,r),f=Math.max(0,Math.round(Math.abs(d-u)));t.font=H(12),t.fillStyle=n.style.color,t.textAlign=`center`,t.textBaseline=`top`,t.fillText(`${f} bars`,(c+l)/2,s.y+4),i&&this.renderAnchorHandles(t,n,r)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n,s=Math.min(i.x,a.x),c=Math.max(i.x,a.x);return e.x>=s-r&&e.x<=c+r&&e.y>=o.y&&e.y<=o.y+o.height}},qs=class extends K{descriptor={type:`measure`,name:`Measure`,requiredAnchors:2};render(t,n,r,i){if(n.anchors.length<2)return;let a=this.anchorToPixel(n.anchors[0],r),o=this.anchorToPixel(n.anchors[1],r);this.applyLineStyle(t,n.style),t.setLineDash([4,4]),t.beginPath(),t.moveTo(a.x,a.y),t.lineTo(o.x,o.y),t.stroke(),this.resetLineStyle(t);let s=e.E(n.anchors[0].time,r),c=e.E(n.anchors[1].time,r),l=Math.max(0,Math.round(Math.abs(c-s))),u=[`Price: ${xo(n.anchors[0].price,n.anchors[1].price,r)}`,`Bars: ${l}`],d=(a.x+o.x)/2,f=(a.y+o.y)/2;t.font=H(11),t.textAlign=`center`,t.textBaseline=`bottom`;let p=Math.max(...u.map(e=>t.measureText(e).width));t.fillStyle=`rgba(0, 0, 0, 0.7)`,t.fillRect(d-p/2-6,f-u.length*14-4,p+12,u.length*14+8),t.fillStyle=`#FFFFFF`;for(let e=0;e<u.length;e++)t.fillText(u[e],d,f-(u.length-1-e)*14);i&&this.renderAnchorHandles(t,n,r)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}};function Js(e,t=`Text`){if(typeof e.style.text==`string`&&e.style.text.length>0)return e.style.text;let n=e.meta?.text;return typeof n==`string`&&n.length>0?n:t}var Ys=class extends K{descriptor={type:`text`,name:`Text`,requiredAnchors:1,text:!0};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=Js(t),o=t.style.fontSize||14;if(e.font=`${o}px ${co()}`,e.fillStyle=t.style.color,e.textAlign=`left`,e.textBaseline=`top`,r){let n=e.measureText(a);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.strokeRect(i.x-2,i.y-2,n.width+4,o+4),e.setLineDash([])}e.fillText(a,i.x,i.y),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=t.style.fontSize||14;return e.x>=i.x-r&&e.x<=i.x+80+r&&e.y>=i.y-r&&e.y<=i.y+a+r}},Xs=class extends K{descriptor={type:`arrow`,name:`Arrow`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke();let o=Math.atan2(a.y-i.y,a.x-i.x);e.beginPath(),e.moveTo(a.x,a.y),e.lineTo(a.x-12*Math.cos(o-Math.PI/6),a.y-12*Math.sin(o-Math.PI/6)),e.lineTo(a.x-12*Math.cos(o+Math.PI/6),a.y-12*Math.sin(o+Math.PI/6)),e.closePath(),e.fillStyle=t.style.color,e.fill(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},Zs=[{label:`8x1`,ratio:8},{label:`4x1`,ratio:4},{label:`3x1`,ratio:3},{label:`2x1`,ratio:2},{label:`1x1`,ratio:1},{label:`1x2`,ratio:.5},{label:`1x3`,ratio:1/3},{label:`1x4`,ratio:.25},{label:`1x8`,ratio:.125}],Qs=class extends K{descriptor={type:`gannFan`,name:`Gann Fan`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;this.applyLineStyle(e,t.style);for(let{label:n,ratio:r}of Zs){let a=c*r,o=d,s=i.y+a*(o-i.x);e.globalAlpha=r===1?1:.5,e.lineWidth=r===1?t.style.lineWidth:Math.max(.5,t.style.lineWidth*.7),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o,s),e.stroke();let f=o-l*4,p=s;p>u.y&&p<u.y+u.height&&(e.globalAlpha=.7,e.fillStyle=t.style.color,e.font=H(9),e.textAlign=l>0?`right`:`left`,e.textBaseline=`bottom`,U(e,n,f,p-2))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=a.x-i.x,s=a.y-i.y;if(Math.abs(o)<1)return!1;let c=s/o,l=o>0?1:-1,{chartRect:u}=n,d=l>0?u.x+u.width:u.x;for(let{ratio:t}of Zs){let n=c*t,a=d,o=i.y+n*(a-i.x);if(this.distanceToLine(e,i,{x:a,y:o})<=r)return!0}return!1}},$s=[0,.25,.333,.5,.667,.75,1],ec=class extends K{descriptor={type:`gannBox`,name:`Gann Box`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y),u=s-o,d=l-c;if(!(u<2||d<2)){this.applyLineStyle(e,t.style),e.strokeRect(o,c,u,d),e.save(),e.globalAlpha=.35;for(let t of $s){if(t===0||t===1)continue;let n=c+d*t;e.beginPath(),e.moveTo(o,n),e.lineTo(s,n),e.stroke()}for(let t of $s){if(t===0||t===1)continue;let n=o+u*t;e.beginPath(),e.moveTo(n,c),e.lineTo(n,l),e.stroke()}e.globalAlpha=.5,e.setLineDash([4,3]),e.beginPath(),e.moveTo(o,c),e.lineTo(s,l),e.stroke(),e.beginPath(),e.moveTo(s,c),e.lineTo(o,l),e.stroke(),e.restore(),this.resetLineStyle(e),e.fillStyle=t.style.color,e.font=H(8),e.globalAlpha=.6,e.textBaseline=`bottom`,e.textAlign=`right`;for(let t of $s){if(t===0||t===1)continue;let n=c+d*t;e.fillText(`${(t*100).toFixed(0)}%`,o-3,n)}e.globalAlpha=1,r&&this.renderAnchorHandles(e,t,n)}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.max(i.x,a.x),c=Math.min(i.y,a.y),l=Math.max(i.y,a.y);return Math.abs(e.x-o)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.x-s)<=r&&e.y>=c-r&&e.y<=l+r||Math.abs(e.y-c)<=r&&e.x>=o-r&&e.x<=s+r||Math.abs(e.y-l)<=r&&e.x>=o-r&&e.x<=s+r||this.distanceToLine(e,{x:o,y:c},{x:s,y:l})<=r||this.distanceToLine(e,{x:s,y:c},{x:o,y:l})<=r}},tc=class extends K{descriptor={type:`anchoredVWAP`,name:`Anchored VWAP`,requiredAnchors:1};dataGetter=null;showBands=!0;setDataGetter(e){this.dataGetter=e}setShowBands(e){this.showBands=e}render(t,n,r,i){if(n.anchors.length<1||!this.dataGetter)return;let a=this.dataGetter(),o=Math.max(0,Math.round(e.E(n.anchors[0].time,r)));if(o>=a.length)return;let{vwap:s,upper1:c,lower1:l,upper2:u,lower2:d}=this.computeVWAP(a,o),{chartRect:f}=r,p=r.barWidth+r.barSpacing;if(this.applyLineStyle(t,n.style),t.lineWidth=n.style.lineWidth+.5,this.drawLine(t,s,o,r,f,p),this.showBands&&s.length>1&&(t.globalAlpha=.4,t.lineWidth=Math.max(.5,n.style.lineWidth*.6),t.setLineDash([4,3]),this.drawLine(t,c,o,r,f,p),this.drawLine(t,l,o,r,f,p),t.globalAlpha=.25,this.drawLine(t,u,o,r,f,p),this.drawLine(t,d,o,r,f,p),t.globalAlpha=1),this.resetLineStyle(t),s.length>0){let i=s[s.length-1],a=e.b(o+s.length-1,r),c=e.w(i,r);a>=f.x&&a<=f.x+f.width&&(t.fillStyle=n.style.color,t.font=H(9,`bold`),t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(`AVWAP ${W(i,i,r)}`,a+6,c))}i&&this.renderAnchorHandles(t,n,r)}drawLine(t,n,r,i,a,o){t.beginPath();let s=!1;for(let c=0;c<n.length;c++){let l=e.b(r+c,i);if(l<a.x-o)continue;if(l>a.x+a.width+o)break;let u=e.w(n[c],i);s?t.lineTo(l,u):(t.moveTo(l,u),s=!0)}t.stroke()}vwapCache=null;computeVWAP(e,t){let n=e[e.length-1],r=this.vwapCache;if(r&&r.data===e&&r.length===e.length&&r.startIdx===t&&r.lastClose===n?.close&&r.lastVolume===(n?.volume??0))return r.result;let i=this.computeVWAPUncached(e,t);return this.vwapCache={data:e,length:e.length,startIdx:t,lastClose:n?.close,lastVolume:n?.volume??0,result:i},i}computeVWAPUncached(e,t){let n=e.length-t,r=Array(n),i=Array(n),a=Array(n),o=Array(n),s=Array(n),c=0,l=0,u=0;for(let d=0;d<n;d++){let n=e[t+d],f=(n.high+n.low+n.close)/3,p=n.volume??1;c+=f*p,l+=p,u+=f*f*p;let m=l>0?c/l:f;r[d]=m;let h=l>0?u/l-m*m:0,g=Math.sqrt(Math.max(0,h));i[d]=m+g,a[d]=m-g,o[d]=m+2*g,s[d]=m-2*g}return{vwap:r,upper1:i,lower1:a,upper2:o,lower2:s}}hitTest(t,n,r,i){if(n.anchors.length<1||!this.dataGetter)return!1;let a=this.dataGetter(),o=Math.max(0,Math.round(e.E(n.anchors[0].time,r)));if(o>=a.length)return!1;let{vwap:s}=this.computeVWAP(a,o);for(let n=1;n<s.length;n++){let a=e.b(o+n-1,r),c=e.w(s[n-1],r),l=e.b(o+n,r),u=e.w(s[n],r);if(this.distanceToLine(t,{x:a,y:c},{x:l,y:u})<=i)return!0}return!1}},nc=class extends K{descriptor={type:`volumeProfileRange`,name:`Volume Profile (Range)`,requiredAnchors:2,fill:!0};dataGetter=null;numBins=40;setDataGetter(e){this.dataGetter=e}render(t,n,r,i){if(n.anchors.length<2||!this.dataGetter)return;let a=this.dataGetter(),o=Math.round(e.E(n.anchors[0].time,r)),s=Math.round(e.E(n.anchors[1].time,r)),c=Math.max(0,Math.min(o,s)),l=Math.min(a.length-1,Math.max(o,s));if(c>=a.length||l<0||c>l)return;let u=1/0,d=-1/0;for(let e=c;e<=l;e++)a[e].low<u&&(u=a[e].low),a[e].high>d&&(d=a[e].high);if(u>=d)return;let f=(d-u)/this.numBins,p=new Float64Array(this.numBins),m=0;for(let e=c;e<=l;e++){let t=a[e],n=t.volume??1,r=Math.max(0,Math.floor((t.low-u)/f)),i=Math.min(this.numBins-1,Math.floor((t.high-u)/f)),o=n/(i-r+1);for(let e=r;e<=i;e++)p[e]+=o,p[e]>m&&(m=p[e])}if(m===0)return;let h=0;for(let e=1;e<this.numBins;e++)p[e]>p[h]&&(h=e);let g=e.b(l,r)+r.barWidth,_=n.style.color,v=n.style.fillColor??`#f2a93b`;t.save();for(let n=0;n<this.numBins;n++){let i=p[n]/m*100,a=u+(n+1)*f,o=u+n*f,s=e.w(a,r),c=e.w(o,r),l=Math.abs(c-s);t.globalAlpha=.35,t.fillStyle=n===h?v:_,t.fillRect(g,Math.min(s,c),i,Math.max(1,l-.5))}let y=u+(h+.5)*f,b=e.w(y,r);t.globalAlpha=.7,t.strokeStyle=v,t.lineWidth=1,t.setLineDash([4,3]),t.beginPath();let x=e.b(c,r)-r.barWidth/2;t.moveTo(x,b),t.lineTo(g+100,b),t.stroke(),t.fillStyle=v,t.font=H(9),t.textAlign=`left`,t.textBaseline=`bottom`,t.globalAlpha=.8,t.fillText(`POC ${W(y,y,r)}`,g+100+4,b-2),t.restore(),i&&this.renderAnchorHandles(t,n,r)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x)-r,s=Math.max(i.x,a.x)+100+r,c=Math.min(i.y,a.y)-r,l=Math.max(i.y,a.y)+r;return e.x>=o&&e.x<=s&&e.y>=c&&e.y<=l}},rc=[1,2,3,5,8,13,21,34,55],ic=class extends K{descriptor={type:`fibTimeZones`,name:`Fibonacci Time Zones`,requiredAnchors:2,options:{levels:{kind:`levels`,label:`Levels`,default:ds(rc,[0,89,144])}}};render(t,n,r,i){if(n.anchors.length<2)return;let a=n.anchors[0],o=n.anchors[1].time-a.time;if(o===0)return;let{chartRect:s}=r;t.font=H(11),t.textBaseline=`top`,t.textAlign=`center`;for(let{value:i,color:c}of this.visibleLevels(n)){this.applyLineStyle(t,{...n.style,color:c??n.style.color});let l=e.D(a.time+o*i,r);l<s.x||l>s.x+s.width||(t.globalAlpha=i===1?1:.55,t.beginPath(),t.moveTo(l,s.y),t.lineTo(l,s.y+s.height),t.stroke(),t.fillStyle=c??n.style.color,U(t,String(i),l,s.y+2))}t.globalAlpha=1,this.resetLineStyle(t),i&&this.renderAnchorHandles(t,n,r)}hitTest(t,n,r,i){if(n.anchors.length<2)return!1;let a=n.anchors[0],o=n.anchors[1].time-a.time;if(o===0)return!1;let{chartRect:s}=r;if(t.y<s.y||t.y>s.y+s.height)return!1;for(let{value:s}of this.visibleLevels(n)){let n=e.D(a.time+o*s,r);if(Math.abs(t.x-n)<=i)return!0}return!1}},ac=40,oc=2,sc=.1,cc=100,lc=0x38d7ea4c68000,uc=class extends K{descriptor={type:`riskReward`,name:`Long/Short Position`,requiredAnchors:2,options:{rewardRatio:{kind:`number`,label:`Reward:risk`,default:2,min:sc,max:cc,step:.1},accountSize:{kind:`number`,label:`Account size`,default:1e3,min:0,max:lc},riskMode:{kind:`choice`,label:`Risk as`,default:`percent`,choices:[{value:`percent`,label:`Percent of account`},{value:`amount`,label:`Amount`}]},risk:{kind:`number`,label:`Risk`,default:1,min:0,max:lc},qtyDecimals:{kind:`number`,label:`Quantity decimals`,default:2,min:0,max:8,step:1},showLabels:{kind:`boolean`,label:`Show labels`,default:!0}}};geometry(e){let t=e.anchors[0].price,n=e.anchors[1].price,r=this.option(e,`rewardRatio`),i=Math.abs(t-n),a=n<t,o=a?t+i*r:t-i*r,s=this.option(e,`risk`),c=this.option(e,`riskMode`)===`amount`?s:this.option(e,`accountSize`)*s/100,l=i>0?c/i:0;return{entry:t,stop:n,target:o,ratio:r,isLong:a,qty:l,riskAmount:c,rewardAmount:l*i*r}}span(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return{x:Math.min(n.x,r.x),width:Math.max(Math.abs(r.x-n.x),ac),stopX:r.x}}handles(e,t){let{target:n}=this.geometry(e),r=this.anchorToPixel(e.anchors[0],t),i=this.anchorToPixel(e.anchors[1],t),a=this.anchorToPixel({time:e.anchors[1].time,price:n},t).y;return[r,i,{x:i.x,y:a}]}render(e,n,r,i){if(n.anchors.length<2)return;let a=this.geometry(n),{x:o,width:s}=this.span(n,r),[c,l,u]=this.handles(n,r);e.fillStyle=`rgba(232, 80, 91, 0.18)`,e.fillRect(o,Math.min(c.y,l.y),s,Math.abs(l.y-c.y)),e.fillStyle=`rgba(31, 168, 116, 0.18)`,e.fillRect(o,Math.min(c.y,u.y),s,Math.abs(u.y-c.y)),e.strokeStyle=n.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(o,c.y),e.lineTo(o+s,c.y),e.stroke();let{chartRect:d}=r,f=d.x,p=d.x+d.width;if(this.option(n,`showLabels`)&&o+s>=f&&o<=p){let i=(0,t.autoPricePrecision)(Math.min(a.stop,a.target),Math.max(a.stop,a.target)),s=this.option(n,`qtyDecimals`),m=e=>(a.entry===0?0:(e-a.entry)/a.entry*100).toFixed(2),h=Number(a.ratio.toFixed(2));e.font=H(11);let g=e=>r.formatPrice?.(e)??e.toFixed(i),_=e=>`${e>=a.entry?`+`:`−`}${Math.abs(Number(m(e))).toFixed(2)}%`,v=e=>{let t=e<c.y,n=e+(t?-1:1)*11,r=t?Math.min(n,c.y-20):Math.max(n,c.y+20);return Math.min(Math.max(r,d.y+9),d.y+d.height-9)},y=(t,n,r)=>{uo(e,t,Math.max(f+4,Math.min(o+4,p-4-lo(e,t))),n,r)};y(`${a.isLong?`Long`:`Short`} · Qty ${a.qty.toFixed(s)} · R:R ${h}`,c.y,n.style.color),Math.abs(l.y-c.y)>=1&&(y(`Target ${g(a.target)} (${_(a.target)}) · ${a.rewardAmount.toFixed(2)}`,v(u.y),`#1fa874`),y(`Stop ${g(a.stop)} (${_(a.stop)}) · ${a.riskAmount.toFixed(2)}`,v(l.y),`#e8505b`))}i&&this.renderHandles(e,n,r)}renderHandles(e,t,n){e.fillStyle=`#FFFFFF`,e.strokeStyle=t.style.color,e.lineWidth=1;for(let r of this.handles(t,n))e.fillRect(r.x-4,r.y-4,8,8),e.strokeRect(r.x-4,r.y-4,8,8)}hitTestAnchor(e,t,n,r){return t.anchors.length<2?super.hitTestAnchor(e,t,n,r):this.handles(t,n).findIndex(t=>Math.hypot(e.x-t.x,e.y-t.y)<=r)}moveHandle(e,t,n){if(t!==oc){let r=e.anchors.map((e,r)=>r===t?{...n}:{...e});return{...e,anchors:r}}let{entry:r,isLong:i}=this.geometry(e),a=Math.abs(r-e.anchors[1].price),o=i?n.price-r:r-n.price,s=a>0?Math.min(cc,Math.max(sc,o/a)):sc;return{...e,options:{...e.options,rewardRatio:Math.round(s*100)/100}}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{x:i,width:a}=this.span(t,n),o=this.handles(t,n).map(e=>e.y);return e.x>=i-r&&e.x<=i+a+r&&e.y>=Math.min(...o)-r&&e.y<=Math.max(...o)+r}},dc=class extends K{descriptor={type:`crossLine`,name:`Cross Line`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),{chartRect:a}=n;this.applyLineStyle(e,t.style);let o=e.lineWidth;this.strokeHorizontal(e,a.x,a.x+a.width,i.y),e.lineWidth=o,this.strokeVertical(e,i.x,a.y,a.y+a.height),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return Math.abs(e.y-i.y)<=r||Math.abs(e.x-i.x)<=r}},fc=28,pc=48;function mc(e,t){return Math.atan2(e.y-t.y,t.x-e.x)*180/Math.PI}var hc=class extends K{descriptor={type:`trendAngle`,name:`Trend Angle`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=mc(i,a),s=a.x>=i.x?1:-1;this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(i.x+s*pc,i.y),e.stroke(),e.setLineDash([]);let c=Math.atan2(a.y-i.y,a.x-i.x),l=s>0?0:Math.PI;s<0&&c<0&&(c+=2*Math.PI),e.beginPath(),e.arc(i.x,i.y,fc,Math.min(l,c),Math.max(l,c)),e.stroke(),e.font=H(11),e.fillStyle=t.style.color,e.textAlign=s>0?`left`:`right`,e.textBaseline=`middle`,U(e,`${o.toFixed(1)}°`,i.x+s*(fc+6),i.y+(o>=0?-8:8)),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}};function gc(e,t,n){let r=To(e,0,1,t),i=wo(e,0,1,t);return[xo(e.anchors[0].price,e.anchors[1].price,t),r?`${i} bars, ${r}`:`${i} bars`,`${n.toFixed(1)}°`]}var _c=class extends K{descriptor={type:`infoLine`,name:`Info Line`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);let o=gc(t,n,mc(i,a)),s=a.y<=i.y;Eo(e,o,a.x+(a.x>=i.x?8:-8),a.y+(s?-6:6),a.x>=i.x?`left`:`right`,s),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return this.distanceToLine(e,i,a)<=r}},vc=[0,.236,.382,.5,.618,.786,1,1.618];function yc(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=r*r+i*i;if(a===0)return{x:n.x-e.x,y:n.y-e.y};let o=((n.x-e.x)*r+(n.y-e.y)*i)/a;return{x:n.x-(e.x+o*r),y:n.y-(e.y+o*i)}}function bc(e,t,n,r){let i=yc(e,t,n);return[{x:e.x+i.x*r,y:e.y+i.y*r},{x:t.x+i.x*r,y:t.y+i.y*r}]}var xc=class extends K{descriptor={type:`fibChannel`,name:`Fibonacci Channel`,requiredAnchors:3,options:{levels:{kind:`levels`,label:`Levels`,default:us(vc,[2.618,3.618,4.236])}}};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);if(t.anchors.length<3){this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e);return}let o=this.anchorToPixel(t.anchors[2],n);e.font=H(11),e.textAlign=`right`,e.textBaseline=`middle`;for(let{value:n,color:r}of this.visibleLevels(t)){let[s,c]=bc(i,a,o,n);this.applyLineStyle(e,{...t.style,color:r??t.style.color}),e.globalAlpha=n===0||n===1?1:.6,e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(c.x,c.y),e.stroke(),e.fillStyle=r??t.style.color;let l=s.x<=c.x?s:c;U(e,String(n),l.x-4,l.y)}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<3)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.anchorToPixel(t.anchors[2],n);for(let{value:n}of this.visibleLevels(t)){let[t,s]=bc(i,a,o,n);if(this.distanceToLine(e,t,s)<=r)return!0}return!1}},Sc=[.25,.382,.5,.618,.75];function Cc(e,t,n){let r=t.x-e.x,i=t.y-e.y,a=Math.hypot(r,i);if(a===0)return null;let o=(n.chartRect.width+n.chartRect.height)*2;return{x:e.x+r/a*o,y:e.y+i/a*o}}function wc(e,t,n=Sc){let r=[{level:1,kind:`diagonal`,point:t}];for(let i of n)r.push({level:i,kind:`price`,point:{x:t.x,y:e.y+(t.y-e.y)*i}}),r.push({level:i,kind:`time`,point:{x:e.x+(t.x-e.x)*i,y:t.y}});return r}var Tc=class extends K{descriptor={type:`fibSpeedResistanceFan`,name:`Fib Speed Resistance Fan`,requiredAnchors:2,options:{levels:{kind:`levels`,label:`Levels`,default:us(Sc,[.236,.786])}}};targets(e,t,n){return wc(t,n,this.visibleLevels(e).map(e=>e.value))}render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.25,e.strokeRect(Math.min(i.x,a.x),Math.min(i.y,a.y),Math.abs(a.x-i.x),Math.abs(a.y-i.y)),e.globalAlpha=1,e.font=H(11),e.textBaseline=`middle`;for(let r of this.targets(t,i,a)){let o=Cc(i,r.point,n);o&&(this.applyLineStyle(e,t.style),e.globalAlpha=r.kind===`diagonal`?1:.65,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(o.x,o.y),e.stroke(),r.kind===`price`&&(e.fillStyle=t.style.color,e.textAlign=a.x>=i.x?`left`:`right`,U(e,String(r.level),r.point.x+(a.x>=i.x?4:-4),r.point.y)))}e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);for(let o of this.targets(t,i,a)){let t=Cc(i,o.point,n);if(t&&this.distanceToLine(e,i,t)<=r)return!0}return!1}},Ec=class extends K{ratioLinks=[];triangles=[];render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));t.anchors.length>=this.descriptor.requiredAnchors&&this.renderTriangles(e,t,i),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(i[0].x,i[0].y);for(let t=1;t<i.length;t++)e.lineTo(i[t].x,i[t].y);e.stroke(),this.resetLineStyle(e),this.renderRatioLinks(e,t,i),this.renderPointLabels(e,t,i),this.renderExtras(e,t,i,n),r&&this.renderAnchorHandles(e,t,n)}renderExtras(e,t,n,r){}renderTriangles(e,t,n){e.fillStyle=t.style.fillColor??t.style.color,e.globalAlpha=t.style.fillColor?1:.12;for(let[t,r,i]of this.triangles)e.beginPath(),e.moveTo(n[t].x,n[t].y),e.lineTo(n[r].x,n[r].y),e.lineTo(n[i].x,n[i].y),e.closePath(),e.fill();e.globalAlpha=1}renderRatioLinks(e,t,n){e.font=H(11),e.textAlign=`center`,e.textBaseline=`middle`;for(let r of this.ratioLinks){if(Math.max(r.from,r.to,...r.num,...r.den)>=n.length)continue;let i=n[r.from],a=n[r.to];e.strokeStyle=t.style.color,e.lineWidth=1,e.globalAlpha=.7,e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),e.setLineDash([]),e.globalAlpha=1,e.fillStyle=t.style.color,U(e,Do(t,r.num,r.den),(i.x+a.x)/2,(i.y+a.y)/2)}}renderPointLabels(e,t,n){e.font=H(12,`bold`),e.fillStyle=t.style.color,e.textAlign=`center`;for(let t=0;t<n.length&&t<this.pointLabels.length;t++){let r=n[t-1]??n[t+1],i=n[t+1]??n[t-1],a=!r||!i?!0:n[t].y<=Math.min(r.y,i.y);e.textBaseline=a?`bottom`:`top`,U(e,this.pointLabels[t],n[t].x,n[t].y+(a?-6:6))}}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));for(let t=0;t<i.length-1;t++)if(this.distanceToLine(e,i[t],i[t+1])<=r)return!0;return!1}},Dc=class extends Ec{descriptor={type:`xabcdPattern`,name:`XABCD Pattern`,requiredAnchors:5,fill:!0};pointLabels=[`X`,`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]},{from:2,to:4,num:[3,4],den:[2,3]},{from:0,to:4,num:[1,4],den:[0,1]}];triangles=[[0,1,2],[2,3,4]]},Oc=class extends Ec{descriptor={type:`abcdPattern`,name:`ABCD Pattern`,requiredAnchors:4,fill:!0};pointLabels=[`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:1,to:3,num:[2,3],den:[1,2]}]},kc=class extends Ec{descriptor={type:`headAndShoulders`,name:`Head and Shoulders`,requiredAnchors:7,fill:!0};pointLabels=[``,`Left Shoulder`,``,`Head`,``,`Right Shoulder`,``];triangles=[[0,1,2],[2,3,4],[4,5,6]];renderExtras(e,t,n){if(n.length<5)return;let r=n[2],i=n[4],a=n[0],o=n[n.length-1],s=i.x===r.x?0:(i.y-r.y)/(i.x-r.x),c=e=>r.y+s*(e-r.x);e.strokeStyle=t.style.color,e.lineWidth=Math.max(1,t.style.lineWidth),e.setLineDash([6,4]),e.beginPath(),e.moveTo(a.x,c(a.x)),e.lineTo(o.x,c(o.x)),e.stroke(),e.setLineDash([])}},Ac=class extends Ec{descriptor={type:`threeDrives`,name:`Three Drives Pattern`,requiredAnchors:6};pointLabels=[``,`1`,`A`,`2`,`B`,`3`];ratioLinks=[{from:1,to:3,num:[2,3],den:[1,2]},{from:3,to:5,num:[4,5],den:[3,4]}]},jc=class extends Ec{descriptor={type:`cypherPattern`,name:`Cypher Pattern`,requiredAnchors:5,fill:!0};pointLabels=[`X`,`A`,`B`,`C`,`D`];ratioLinks=[{from:0,to:2,num:[1,2],den:[0,1]},{from:0,to:3,num:[2,3],den:[0,1]},{from:0,to:4,num:[3,4],den:[0,3]}];triangles=[[0,1,2],[2,3,4]]},Mc=class extends K{descriptor={type:`circle`,name:`Circle`,requiredAnchors:2,fill:!0};geometry(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t);return{c:n,r:Math.hypot(r.x-n.x,r.y-n.y)}}render(e,t,n,r){if(t.anchors.length<2)return;let{c:i,r:a}=this.geometry(t,n);e.beginPath(),e.arc(i.x,i.y,a,0,Math.PI*2),t.style.fillColor&&(e.fillStyle=t.style.fillColor,e.fill()),this.applyLineStyle(e,t.style),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{c:i,r:a}=this.geometry(t,n),o=Math.hypot(e.x-i.x,e.y-i.y);return t.style.fillColor?o<=a+r:Math.abs(o-a)<=r}},Nc=`rgba(76, 141, 255, 0.12)`,Pc=`rgba(232, 80, 91, 0.12)`;function Fc(t,n){let r=n.data;if(!r||r.length===0)return null;let i=Math.round(e.E(t.anchors[0].time,n)),a=Math.round(e.E(t.anchors[1].time,n)),o=Math.max(0,Math.min(i,a)),s=Math.min(r.length-1,Math.max(i,a)),c=0;for(let e=o;e<=s;e++)c+=r[e].volume??0;return c}function Ic(e){return e>=1e9?`${(e/1e9).toFixed(2)}B`:e>=1e6?`${(e/1e6).toFixed(2)}M`:e>=1e3?`${(e/1e3).toFixed(2)}K`:e.toFixed(0)}function Lc(e,t){let n=To(e,0,1,t),r=wo(e,0,1,t),i=[xo(e.anchors[0].price,e.anchors[1].price,t),n?`${r} bars, ${n}`:`${r} bars`],a=Fc(e,t);return a!==null&&i.push(`Vol ${Ic(a)}`),i}var Rc=class extends K{descriptor={type:`dateAndPriceRange`,name:`Date and Price Range`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=Math.min(i.x,a.x),s=Math.min(i.y,a.y),c=Math.abs(a.x-i.x),l=Math.abs(a.y-i.y),u=t.anchors[1].price>=t.anchors[0].price;e.fillStyle=u?Nc:Pc,e.fillRect(o,s,c,l),this.applyLineStyle(e,t.style);let d=o+c/2,f=s+l/2;e.beginPath(),e.moveTo(d,i.y),e.lineTo(d,a.y),e.moveTo(i.x,f),e.lineTo(a.x,f),e.stroke(),this.resetLineStyle(e),Eo(e,Lc(t,n),d,u?s-6:s+l+6,`center`,u),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);return e.x>=Math.min(i.x,a.x)-r&&e.x<=Math.max(i.x,a.x)+r&&e.y>=Math.min(i.y,a.y)-r&&e.y<=Math.max(i.y,a.y)+r}},zc=400,Bc=2;function Vc(e,t,n){let r=Math.abs(t.x-e.x);if(r<Bc)return[e.x];let i=n.chartRect.x+n.chartRect.width,a=[],o=Math.min(e.x,t.x);for(let e=o;e<=i&&a.length<zc;e+=r)a.push(e);return a}var Hc=class extends K{descriptor={type:`cyclicLines`,name:`Cyclic Lines`,requiredAnchors:2};render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),{chartRect:o}=n;this.applyLineStyle(e,t.style),e.beginPath();for(let t of Vc(i,a,n))t<o.x||(e.moveTo(t,o.y),e.lineTo(t,o.y+o.height));e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:Vc(this.anchorToPixel(t.anchors[0],n),this.anchorToPixel(t.anchors[1],n),n).some(t=>Math.abs(e.x-t)<=r)}},Uc=14,Wc=18,Gc=6,Kc=20,qc=class extends K{descriptor={type:`priceLabel`,name:`Price Label`,requiredAnchors:1,text:!0};text(e,t){return e.style.text||W(e.anchors[0].price,e.anchors[0].price,t)}box(e,t,n,r){let i=t.style.fontSize??12,a=this.text(t,r),o=e?e.measureText(a).width:a.length*i*.6;return{x:n.x+Uc,y:n.y-Wc-Kc/2,w:o+Gc*2,h:Kc}}render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n);e.font=`${t.style.fontSize??12}px ${co()}`;let a=this.box(e,t,i,n);e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y+a.h),e.stroke(),e.fillStyle=t.style.color,e.fillRect(a.x,a.y,a.w,a.h),e.fillStyle=`#FFFFFF`,e.textAlign=`left`,e.textBaseline=`middle`,e.fillText(this.text(t,n),a.x+Gc,a.y+a.h/2),e.beginPath(),e.arc(i.x,i.y,3,0,Math.PI*2),e.fillStyle=t.style.color,e.fill(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);if(Math.hypot(e.x-i.x,e.y-i.y)<=r)return!0;let a=this.box(null,t,i,n);return e.x>=a.x-r&&e.x<=a.x+a.w+r&&e.y>=a.y-r&&e.y<=a.y+a.h+r}},Jc=8,Yc=6,Xc=1.3,Zc=12;function Qc(e){return`${e}px ${co()}`}function $c(e,t,n){let r=[];for(let i of t.split(`
|
|
2
2
|
`)){let t=``;for(let a of i.split(/\s+/).filter(Boolean)){let i=t?`${t} ${a}`:a;if(e(i)<=n){t=i;continue}t&&r.push(t),t=e(a)<=n?a:el(e,a,n)}if(r.push(t),r.length>=Zc)break}return r.length>Zc&&(r.length=Zc),r}function el(e,t,n){if(e(t)<=n)return t;let r=1,i=t.length-1;for(;r<i;){let a=Math.ceil((r+i)/2);e(`${t.slice(0,a)}…`)<=n?r=a:i=a-1}return`${t.slice(0,r)}…`}var tl=200,nl=new Map;function rl(e,t,n,r){let i=`${r}|${n}|${t}`,a=nl.get(i);if(a)return a;nl.size>=tl&&nl.clear();let o=$c(e,t,n);return nl.set(i,o),o}function il(e,t,n,r,i){return{x:n,y:r,width:Math.max(0,...t.map(e))+Jc*2,height:t.length*i*Xc+Yc*2}}function al(e,t,n,r,i){e.font=Qc(i.fontSize);let a=t=>e.measureText(t).width,o=rl(a,t,i.maxWidth,i.fontSize),s=il(a,o,n,r,i.fontSize);return i.fill&&(e.fillStyle=i.fill,e.fillRect(s.x,s.y,s.width,s.height)),i.stroke&&(e.strokeStyle=i.stroke,e.lineWidth=1,e.strokeRect(s.x+.5,s.y+.5,s.width-1,s.height-1)),e.fillStyle=i.color,e.textAlign=`left`,e.textBaseline=`top`,o.forEach((t,a)=>e.fillText(t,n+Jc,r+Yc+a*i.fontSize*Xc)),s}function ol(e,t,n=0){return e.x>=t.x-n&&e.x<=t.x+t.width+n&&e.y>=t.y-n&&e.y<=t.y+t.height+n}var sl=1e3,cl=class{boxes=new Map;set(e,t){this.boxes.size>=sl&&!this.boxes.has(e)&&this.boxes.clear(),this.boxes.set(e,t)}get(e){return this.boxes.get(e)}},ll=240,ul=13;function dl(e){return e.style.fontSize||ul}function fl(e){return{fontSize:dl(e),color:e.style.color,fill:e.style.fillColor??`rgba(76, 141, 255, 0.1)`,stroke:e.style.color,maxWidth:ll}}function pl(e,t,n,r){let i=dl(e),a=Math.max(...t.split(`
|
|
3
3
|
`).map(e=>e.length));return{x:n,y:r,width:Math.min(ll,a*i*.6)+16,height:i*1.3+12}}var J=7,ml=16,hl=class extends K{descriptor={type:`note`,name:`Note`,requiredAnchors:1,text:!0,fill:!0,options:{showText:{kind:`boolean`,label:`Show text`,default:!0}}};boxes=new cl;render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n);if(this.renderPin(e,t,i),this.option(t,`showText`)){let n=al(e,Js(t,`Note`),i.x+J+6,i.y-ml-J,fl(t));this.boxes.set(t.id,n)}r&&this.renderAnchorHandles(e,t,n)}renderPin(e,t,n){let r=n.y-ml;e.fillStyle=t.style.color,e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-J*.7,r+J*.5),e.arc(n.x,r,J,Math.PI*.8,Math.PI*.2),e.closePath(),e.fill(),e.fillStyle=`#ffffff`,e.beginPath(),e.arc(n.x,r,J*.4,0,Math.PI*2),e.fill()}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return ol(e,{x:i.x-J,y:i.y-ml-J,width:J*2,height:ml+J},r)?!0:this.option(t,`showText`)?ol(e,this.boxes.get(t.id)??pl(t,Js(t,`Note`),i.x+J+6,i.y-ml-J),r):!1}},gl=class extends K{descriptor={type:`callout`,name:`Callout`,requiredAnchors:2,text:!0,fill:!0};boxes=new cl;render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n);if(e.fillStyle=t.style.color,e.beginPath(),e.arc(i.x,i.y,3,0,Math.PI*2),e.fill(),t.anchors.length<2)return;let a=this.anchorToPixel(t.anchors[1],n),o=al(e,Js(t,`Callout`),a.x,a.y,fl(t));this.boxes.set(t.id,o);let s=_l(o,i);this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(s.x,s.y),e.lineTo(i.x,i.y),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n),o=this.boxes.get(t.id)??pl(t,Js(t,`Callout`),a.x,a.y);return ol(e,o,r)||this.distanceToLine(e,_l(o,i),i)<=r}};function _l(e,t){let n=e.x+e.width/2,r=e.y+e.height/2,i=t.x-n,a=t.y-r;return Math.abs(i)*e.height>Math.abs(a)*e.width?{x:i>0?e.x+e.width:e.x,y:r}:{x:n,y:a>0?e.y+e.height:e.y}}var vl=24,yl=18,bl=10,xl=class extends K{descriptor={type:`flag`,name:`Flag Mark`,requiredAnchors:1};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=i.y-vl;e.strokeStyle=t.style.color,e.lineWidth=1.5,e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(i.x,a),e.stroke(),e.fillStyle=t.style.color,e.beginPath(),e.moveTo(i.x,a),e.lineTo(i.x+yl,a),e.lineTo(i.x+yl-5,a+bl/2),e.lineTo(i.x+yl,a+bl),e.lineTo(i.x,a+bl),e.closePath(),e.fill(),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n);return ol(e,{x:i.x,y:i.y-vl,width:yl,height:vl},r)}},Sl={up:{x:0,y:-1},down:{x:0,y:1},left:{x:-1,y:0},right:{x:1,y:0}};function Cl(e,t,n){let r=n*.5,i=n*.4,a=n*.17,o=(n,r)=>({x:e.x-t.x*n-t.y*r,y:e.y-t.y*n+t.x*r});return[o(0,0),o(r,i),o(r,a),o(n,a),o(n,-a),o(r,-a),o(r,-i)]}var wl=class extends K{descriptor={type:`arrowMark`,name:`Arrow Mark`,requiredAnchors:1,text:!0,options:{direction:{kind:`choice`,label:`Direction`,default:`up`,choices:[{value:`up`,label:`Up`},{value:`down`,label:`Down`},{value:`left`,label:`Left`},{value:`right`,label:`Right`}]},size:{kind:`number`,label:`Size`,default:22,min:10,max:80,step:2}}};outline(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=Sl[this.option(e,`direction`)]??Sl.up,i=this.option(e,`size`);return{points:Cl(n,r,i),dir:r,tail:{x:n.x-r.x*i,y:n.y-r.y*i}}}render(e,t,n,r){if(t.anchors.length<1)return;let{points:i,dir:a,tail:o}=this.outline(t,n);e.fillStyle=t.style.color,e.beginPath(),i.forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),e.closePath(),e.fill();let s=t.style.text;s&&(e.font=`${t.style.fontSize||12}px ${co()}`,e.textAlign=a.x===0?`center`:a.x>0?`right`:`left`,e.textBaseline=a.y===0?`middle`:a.y<0?`top`:`bottom`,e.fillText(s,o.x-a.x*4,o.y-a.y*4)),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let{points:i}=this.outline(t,n),a=i.map(e=>e.x),o=i.map(e=>e.y);return ol(e,{x:Math.min(...a),y:Math.min(...o),width:Math.max(...a)-Math.min(...a),height:Math.max(...o)-Math.min(...o)},r)}},Tl=[`star`,`heart`,`check`,`cross`,`circle`,`triangleUp`,`triangleDown`,`bolt`];function El(e,t,n,r){let i=r/2;switch(e.beginPath(),t){case`star`:for(let t=0;t<10;t++){let r=-Math.PI/2+t*Math.PI/5,a=t%2==0?i:i*.42,o=n.x+Math.cos(r)*a,s=n.y+Math.sin(r)*a;t===0?e.moveTo(o,s):e.lineTo(o,s)}return e.closePath(),!1;case`heart`:return e.moveTo(n.x,n.y+i*.85),e.bezierCurveTo(n.x-i*1.3,n.y-i*.1,n.x-i*.6,n.y-i*1.1,n.x,n.y-i*.35),e.bezierCurveTo(n.x+i*.6,n.y-i*1.1,n.x+i*1.3,n.y-i*.1,n.x,n.y+i*.85),e.closePath(),!1;case`check`:return e.moveTo(n.x-i*.8,n.y),e.lineTo(n.x-i*.2,n.y+i*.6),e.lineTo(n.x+i*.85,n.y-i*.65),!0;case`cross`:return e.moveTo(n.x-i*.7,n.y-i*.7),e.lineTo(n.x+i*.7,n.y+i*.7),e.moveTo(n.x+i*.7,n.y-i*.7),e.lineTo(n.x-i*.7,n.y+i*.7),!0;case`circle`:return e.arc(n.x,n.y,i*.8,0,Math.PI*2),!1;case`triangleUp`:return e.moveTo(n.x,n.y-i*.85),e.lineTo(n.x+i*.9,n.y+i*.7),e.lineTo(n.x-i*.9,n.y+i*.7),e.closePath(),!1;case`triangleDown`:return e.moveTo(n.x,n.y+i*.85),e.lineTo(n.x+i*.9,n.y-i*.7),e.lineTo(n.x-i*.9,n.y-i*.7),e.closePath(),!1;case`bolt`:return e.moveTo(n.x+i*.15,n.y-i),e.lineTo(n.x-i*.6,n.y+i*.1),e.lineTo(n.x-i*.05,n.y+i*.1),e.lineTo(n.x-i*.15,n.y+i),e.lineTo(n.x+i*.6,n.y-i*.1),e.lineTo(n.x+i*.05,n.y-i*.1),e.closePath(),!1}}var Dl=class extends K{descriptor={type:`icon`,name:`Icon`,requiredAnchors:1,options:{glyph:{kind:`choice`,label:`Icon`,default:`star`,choices:[{value:`star`,label:`Star`},{value:`heart`,label:`Heart`},{value:`check`,label:`Check`},{value:`cross`,label:`Cross`},{value:`circle`,label:`Circle`},{value:`triangleUp`,label:`Triangle up`},{value:`triangleDown`,label:`Triangle down`},{value:`bolt`,label:`Bolt`}]},size:{kind:`number`,label:`Size`,default:22,min:10,max:80,step:2}}};render(e,t,n,r){if(t.anchors.length<1)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.option(t,`size`),o=this.option(t,`glyph`);El(e,Tl.includes(o)?o:`star`,i,a)?(e.strokeStyle=t.style.color,e.lineWidth=Math.max(2,a/8),e.lineCap=`round`,e.lineJoin=`round`,e.stroke(),e.lineCap=`butt`,e.lineJoin=`miter`):(e.fillStyle=t.style.color,e.fill()),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<1)return!1;let i=this.anchorToPixel(t.anchors[0],n),a=this.option(t,`size`)/2;return Math.abs(e.x-i.x)<=a+r&&Math.abs(e.y-i.y)<=a+r}},Ol=48,kl=10;function Al(e,t){if(e.beginPath(),e.moveTo(t[0].x,t[0].y),t.length===2)e.lineTo(t[1].x,t[1].y);else{for(let n=1;n<t.length-1;n++){let r=(t[n].x+t[n+1].x)/2,i=(t[n].y+t[n+1].y)/2;e.quadraticCurveTo(t[n].x,t[n].y,r,i)}let n=t[t.length-1];e.lineTo(n.x,n.y)}e.stroke()}function jl(e,t,n=!1){e.beginPath(),t.forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),n&&e.closePath()}function Ml(e,t,n,r=kl){let i=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x-r*Math.cos(i-Math.PI/6),n.y-r*Math.sin(i-Math.PI/6)),e.lineTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(i+Math.PI/6),n.y-r*Math.sin(i+Math.PI/6)),e.stroke()}function Nl(e,t){let n=!1;for(let r=0,i=t.length-1;r<t.length;i=r++){let a=t[r],o=t[i];a.y>e.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(n=!n)}return n}var Pl=new WeakMap;function Fl(e){let t=Pl.get(e);if(!t){t={t0:1/0,t1:-1/0,p0:1/0,p1:-1/0};for(let n of e)n.time<t.t0&&(t.t0=n.time),n.time>t.t1&&(t.t1=n.time),n.price<t.p0&&(t.p0=n.price),n.price>t.p1&&(t.p1=n.price);Pl.set(e,t)}return t}var Il=class extends K{descriptor={type:`brush`,name:`Brush`,requiredAnchors:2,creation:`freehand`};stroke(e){return{width:e.style.lineWidth,alpha:1}}render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n)),{width:a,alpha:o}=this.stroke(t);this.applyLineStyle(e,t.style),e.lineWidth=a,e.lineCap=`round`,e.lineJoin=`round`,e.globalAlpha=o,Al(e,i),e.globalAlpha=1,e.lineCap=`butt`,e.lineJoin=`miter`,this.resetLineStyle(e),r&&this.renderBounds(e,t,n)}renderBounds(e,t,n){let r=this.screenBox(t,n),i=this.stroke(t).width/2+3;e.strokeStyle=t.style.color,e.lineWidth=1,e.setLineDash([3,3]),e.strokeRect(r.x0-i,r.y0-i,r.x1-r.x0+i*2,r.y1-r.y0+i*2),e.setLineDash([])}screenBox(t,n){let{t0:r,t1:i,p0:a,p1:o}=Fl(t.anchors),s=e.w(a,n),c=e.w(o,n);return{x0:e.D(r,n),x1:e.D(i,n),y0:Math.min(s,c),y1:Math.max(s,c)}}hitTestAnchor(){return-1}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=r+this.stroke(t).width/2,a=this.screenBox(t,n);return e.x<a.x0-i||e.x>a.x1+i||e.y<a.y0-i||e.y>a.y1+i?!1:Ao(e,t.anchors.map(e=>this.anchorToPixel(e,n)),i)}},Ll=class extends Il{descriptor={type:`highlighter`,name:`Highlighter`,requiredAnchors:2,creation:`freehand`};stroke(e){return{width:Math.max(10,e.style.lineWidth*8),alpha:.3}}},Rl=class extends K{descriptor={type:`path`,name:`Path`,requiredAnchors:2,creation:`path`,options:{arrowEnd:{kind:`boolean`,label:`Arrow at the end`,default:!0}}};render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));this.applyLineStyle(e,t.style),e.lineJoin=`round`,jl(e,i),e.stroke(),this.resetLineStyle(e),this.option(t,`arrowEnd`)&&Ml(e,i[i.length-2],i[i.length-1]),e.lineJoin=`miter`,r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:Ao(e,t.anchors.map(e=>this.anchorToPixel(e,n)),r)}},zl=class extends K{descriptor={type:`polyline`,name:`Polyline`,requiredAnchors:3,creation:`path`,fill:!0};render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n)),a=i.length>=3;jl(e,i,a),a&&(e.fillStyle=t.style.fillColor??`rgba(76, 141, 255, 0.1)`,e.fill()),this.applyLineStyle(e,t.style),e.lineJoin=`round`,e.stroke(),e.lineJoin=`miter`,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));return Ao(e,i,r,!0)||i.length>=3&&Nl(e,i)}};function Bl(e,t,n,r=Ol){let i={x:2*t.x-(e.x+n.x)/2,y:2*t.y-(e.y+n.y)/2},a=[];for(let t=0;t<=r;t++){let o=t/r,s=1-o;a.push({x:s*s*e.x+2*s*o*i.x+o*o*n.x,y:s*s*e.y+2*s*o*i.y+o*o*n.y})}return a}function Vl(e,t,n,r=Ol){let i=2*(e.x*(t.y-n.y)+t.x*(n.y-e.y)+n.x*(e.y-t.y));if(Math.abs(i)<1e-9)return[e,n];let a=e.x*e.x+e.y*e.y,o=t.x*t.x+t.y*t.y,s=n.x*n.x+n.y*n.y,c=(a*(t.y-n.y)+o*(n.y-e.y)+s*(e.y-t.y))/i,l=(a*(n.x-t.x)+o*(e.x-n.x)+s*(t.x-e.x))/i,u=Math.hypot(e.x-c,e.y-l),d=Math.atan2(e.y-l,e.x-c),f=Math.atan2(t.y-l,t.x-c),p=Math.atan2(n.y-l,n.x-c),m=(e,t)=>((t-e)%(2*Math.PI)+2*Math.PI)%(2*Math.PI),h=m(d,p),g=m(d,f)<=h?h:h-2*Math.PI,_=[];for(let e=0;e<=r;e++){let t=d+g*e/r;_.push({x:c+u*Math.cos(t),y:l+u*Math.sin(t)})}return _}var Hl=class extends K{descriptor={type:`curve`,name:`Curve`,requiredAnchors:3};shape(e,t,n){return Bl(e,t,n)}points(e,t){let n=e.anchors.map(e=>this.anchorToPixel(e,t));return n.length<3?n:this.shape(n[0],n[2],n[1])}render(e,t,n,r){t.anchors.length<2||(this.applyLineStyle(e,t.style),jl(e,this.points(t,n)),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n))}hitTest(e,t,n,r){return t.anchors.length<2?!1:Ao(e,this.points(t,n),r)}},Ul=class extends Hl{descriptor={type:`arc`,name:`Arc`,requiredAnchors:3};shape(e,t,n){return Vl(e,t,n)}},Wl=(1+Math.sqrt(5))/2,Gl=64,Kl=34,ql=12;function Jl(e,t=[]){return{levels:{kind:`levels`,label:`Levels`,default:us(e,t)},showLevels:{kind:`boolean`,label:`Show levels`,default:!0}}}var Yl=[.236,.382,.5,.618,.786,1];function Xl(e){return String(Number(e.toFixed(3)))}function Zl(e,t,n,r,i,a=Gl){let o=[];for(let s=0;s<=a;s++){let c=r+i*s/a;o.push({x:e.x+t*Math.cos(c),y:e.y+n*Math.sin(c)})}return o}function Ql(e,t){e.beginPath(),t.forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),e.stroke()}var $l=class extends K{guides(e){return e.length>=2?[[e[0],e[1]]]:[]}pixels(e,t){return e.anchors.map(e=>this.anchorToPixel(e,t))}render(e,t,n,r){if(t.anchors.length<2)return;let i=this.pixels(t,n);this.applyLineStyle(e,t.style),e.globalAlpha=.6,e.setLineDash([4,4]);for(let[t,n]of this.guides(i))Ql(e,[t,n]);e.globalAlpha=1,this.applyLineStyle(e,t.style);let a=this.option(t,`showLevels`);e.font=H(11),e.textAlign=`left`,e.textBaseline=`bottom`;let o=this.shapes(i,this.visibleLevels(t),n,t);for(let n of o)e.strokeStyle=n.level.color??t.style.color,Ql(e,n.points);a&&this.renderLabels(e,t,o),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}renderLabels(e,t,n){let r=[];for(let{level:i,label:a}of[...n].reverse())r.some(e=>Math.abs(e.x-a.x)<Kl&&Math.abs(e.y-a.y)<ql)||(r.push(a),e.fillStyle=i.color??t.style.color,U(e,Xl(i.value),a.x+3,a.y-2))}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=this.pixels(t,n);return this.guides(i).some(([t,n])=>G(e,t,n)<=r)?!0:this.shapes(i,this.visibleLevels(t),n,t).some(t=>Ao(e,t.points,r))}},eu=class extends $l{descriptor={type:`fibCircles`,name:`Fib Circles`,requiredAnchors:2,options:Jl([...Yl,1.618,2.618],[3.618,4.236])};shapes(e,t){let[n,r]=e,i=Math.hypot(r.x-n.x,r.y-n.y);return t.map(e=>{let t=i*e.value;return{level:e,points:Zl(n,t,t,0,Math.PI*2),label:{x:n.x+t,y:n.y}}})}},tu=class extends $l{descriptor={type:`fibArcs`,name:`Fib Speed Resistance Arcs`,requiredAnchors:2,options:{...Jl(Yl),fullCircles:{kind:`boolean`,label:`Full circles`,default:!1}}};shapes(e,t,n,r){let[i,a]=e,o=Math.hypot(a.x-i.x,a.y-i.y),s=Math.atan2(a.y-i.y,a.x-i.x),c=this.option(r,`fullCircles`);return t.map(e=>{let t=o*e.value;return{level:e,points:c?Zl(i,t,t,0,Math.PI*2):Zl(i,t,t,s-Math.PI/2,Math.PI),label:{x:i.x+t*Math.cos(s),y:i.y+t*Math.sin(s)}}})}},nu=class extends $l{descriptor={type:`fibWedge`,name:`Fib Wedge`,requiredAnchors:3,options:Jl(Yl)};guides(e){return e.slice(1).map(t=>[e[0],t])}shapes(e,t){if(e.length<3)return[];let[n,r,i]=e,a=Math.hypot(r.x-n.x,r.y-n.y),o=Math.atan2(r.y-n.y,r.x-n.x),s=Math.atan2(i.y-n.y,i.x-n.x)-o;return s>Math.PI&&(s-=2*Math.PI),s<-Math.PI&&(s+=2*Math.PI),t.map(e=>{let t=a*e.value;return{level:e,points:Zl(n,t,t,o,s,32),label:{x:n.x+t*Math.cos(o),y:n.y+t*Math.sin(o)}}})}},ru=class extends $l{descriptor={type:`pitchfan`,name:`Pitchfan`,requiredAnchors:3,options:Jl([0,.25,.382,.5,.618,.75,1])};guides(e){return e.length>=3?[[e[1],e[2]]]:[[e[0],e[1]]]}shapes(e,t,n){if(e.length<3)return[];let[r,i,a]=e,o=Math.hypot(n.chartRect.width,n.chartRect.height)*2;return t.map(e=>{let t={x:i.x+(a.x-i.x)*e.value,y:i.y+(a.y-i.y)*e.value},n=Math.hypot(t.x-r.x,t.y-r.y)||1;return{level:e,points:[r,{x:r.x+(t.x-r.x)/n*o,y:r.y+(t.y-r.y)/n*o}],label:t}})}},iu=class extends K{descriptor={type:`fibSpiral`,name:`Fib Spiral`,requiredAnchors:2,options:{clockwise:{kind:`boolean`,label:`Clockwise`,default:!1}}};points(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t),i=Math.hypot(r.x-n.x,r.y-n.y);if(i===0)return[];let a=Math.atan2(r.y-n.y,r.x-n.x),o=this.option(e,`clockwise`)?1:-1,s=Math.hypot(t.chartRect.width,t.chartRect.height)*1.5,c=Math.PI/2,l=Math.log(s/i)/Math.log(Wl),u=Math.log(i/2)/Math.log(Wl),d=-Math.max(0,u)*c,f=Math.max(1,l)*c,p=[],m=Math.min(720,Math.ceil((f-d)/c*24));for(let e=0;e<=m;e++){let t=d+(f-d)*e/m,r=i*Wl**+(t/c);p.push({x:n.x+r*Math.cos(a+o*t),y:n.y+r*Math.sin(a+o*t)})}return p}render(e,t,n,r){t.anchors.length<2||(this.applyLineStyle(e,t.style),Ql(e,this.points(t,n)),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n))}hitTest(e,t,n,r){return t.anchors.length<2?!1:Ao(e,this.points(t,n),r)}},au=class extends K{descriptor={type:`gannSquare`,name:`Gann Square`,requiredAnchors:2,options:{...Jl([.25,.382,.5,.618,.75]),arcs:{kind:`boolean`,label:`Arcs`,default:!0}}};lines(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t),i=r.x-n.x,a=r.y-n.y,o=[[n,{x:r.x,y:n.y}],[{x:r.x,y:n.y},r],[r,{x:n.x,y:r.y}],[{x:n.x,y:r.y},n],[n,r],[{x:r.x,y:n.y},{x:n.x,y:r.y}]],s=this.visibleLevels(e);for(let{value:e}of s)o.push([{x:n.x+i*e,y:n.y},{x:n.x+i*e,y:r.y}]),o.push([{x:n.x,y:n.y+a*e},{x:r.x,y:n.y+a*e}]);return{grid:o,arcs:this.option(e,`arcs`)?[...s.map(e=>e.value),1].map(e=>{let t=Math.atan2(0,Math.sign(i)||1),r=(Math.sign(i)||1)*(Math.sign(a)||1)*(Math.PI/2);return Zl(n,Math.abs(i)*e,Math.abs(a)*e,t,r,24)}):[]}}render(e,t,n,r){if(t.anchors.length<2)return;let{grid:i,arcs:a}=this.lines(t,n);this.applyLineStyle(e,t.style),i.forEach(([t,n],r)=>{e.globalAlpha=r<6?1:.55,Ql(e,[t,n])}),e.globalAlpha=.8;for(let t of a)Ql(e,t);e.globalAlpha=1,this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{grid:i}=this.lines(t,n);return i.slice(0,6).some(([t,n])=>G(e,t,n)<=r)}},ou=400,su=32,cu=3,lu=class extends K{descriptor={type:`timeCycles`,name:`Time Cycles`,requiredAnchors:2,fill:!0};visibleCycles(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t).x-n.x,i=Math.abs(r)/2;if(i<1)return{y:n.y,r:i,centres:[]};let a=t.chartRect.x,o=a+t.chartRect.width,s=Math.max(0,Math.floor(((r>0?a:o)-n.x)/r)-1),c=[];for(let e=s;c.length<ou;e++){let t=n.x+r*(e+.5);if(t-i>o||t+i<a){if(c.length>0||(r>0?t-i>o:t+i<a))break;continue}c.push(t)}return{y:n.y,r:i,centres:c}}cycles(e,t){let{y:n,r,centres:i}=this.visibleCycles(e,t);return i.map(e=>{let t=[];for(let i=0;i<=su;i++){let a=Math.PI+Math.PI*i/su;t.push({x:e+r*Math.cos(a),y:n+r*Math.sin(a)})}return t})}render(e,t,n,r){if(t.anchors.length<2)return;let i=this.cycles(t,n);e.fillStyle=t.style.fillColor??`rgba(76, 141, 255, 0.1)`,this.applyLineStyle(e,t.style);for(let t of i)e.beginPath(),t.forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),e.fill(),e.stroke();this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let{y:i,r:a,centres:o}=this.visibleCycles(t,n);return e.y>i+r?!1:o.some(t=>Math.abs(Math.hypot(e.x-t,e.y-i)-a)<=r)}},uu=class extends K{descriptor={type:`sineLine`,name:`Sine Line`,requiredAnchors:2};points(e,t){let n=this.anchorToPixel(e.anchors[0],t),r=this.anchorToPixel(e.anchors[1],t),i=r.x-n.x;if(Math.abs(i)<1)return[n,r];let a=(n.y+r.y)/2,o=(n.y-r.y)/2,{x:s,width:c}=t.chartRect,l=[];for(let e=s;e<=s+c;e+=cu)l.push({x:e,y:a+o*Math.cos(Math.PI*(e-n.x)/i)});return l}render(e,t,n,r){t.anchors.length<2||(this.applyLineStyle(e,t.style),e.beginPath(),this.points(t,n).forEach((t,n)=>n===0?e.moveTo(t.x,t.y):e.lineTo(t.x,t.y)),e.stroke(),this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n))}hitTest(e,t,n,r){return t.anchors.length<2?!1:Ao(e,this.points(t,n),r)}},du=`#26a69a`,fu=`#ef5350`,pu=500;function mu(t,n,r){let i=r.price>=n.price,a=t.length>0?Math.max(0,Math.floor(e.O(n.time,t))+1):0;for(let e=a;e<t.length;e++){let a=t[e];if(!(a.time<=n.time)){if(a.time>r.time)return`missed`;if(i?a.high>=r.price:a.low<=r.price)return`reached`}}return`pending`}var hu=class extends K{descriptor={type:`forecast`,name:`Forecast`,requiredAnchors:2};bars=()=>[];setDataGetter(e){this.bars=e}render(e,t,n,r){if(t.anchors.length<2)return;let[i,a]=t.anchors,o=this.anchorToPixel(i,n),s=this.anchorToPixel(a,n),c=mu(this.bars(),i,a),l=c===`reached`?du:c===`missed`?fu:t.style.color;this.applyLineStyle(e,{...t.style,color:l}),e.beginPath(),e.moveTo(o.x,o.y),e.lineTo(s.x,s.y),e.stroke(),Ml(e,o,s),this.resetLineStyle(e),e.strokeStyle=l,e.beginPath(),e.arc(s.x,s.y,5,0,Math.PI*2),e.stroke();let u=To(t,0,1,n);Eo(e,[xo(i.price,a.price,n),`${W(a.price,i.price,n)} · ${wo(t,0,1,n)} bars${u?`, ${u}`:``}`,c===`reached`?`Target reached`:c===`missed`?`Target missed`:`Pending`],s.x,s.y+(s.y<o.y?-10:10),`center`,s.y<o.y),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){return t.anchors.length<2?!1:G(e,this.anchorToPixel(t.anchors[0],n),this.anchorToPixel(t.anchors[1],n))<=r}},gu=class extends K{descriptor={type:`projection`,name:`Projection`,requiredAnchors:3,fill:!0};target(t,n){let[r,i,a]=t.anchors,o=e.E(i.time,n)-e.E(r.time,n);return{x:e.b(e.E(a.time,n)+o,n),y:e.w(a.price+(i.price-r.price),n)}}render(e,t,n,r){if(t.anchors.length<2)return;let i=t.anchors.map(e=>this.anchorToPixel(e,n));if(this.applyLineStyle(e,t.style),e.setLineDash([5,4]),e.beginPath(),e.moveTo(i[0].x,i[0].y),e.lineTo(i[1].x,i[1].y),e.stroke(),t.anchors.length>=3){let r=i[2],a=this.target(t,n);e.fillStyle=t.style.fillColor??`rgba(76, 141, 255, 0.1)`,e.fillRect(Math.min(r.x,a.x),Math.min(r.y,a.y),Math.abs(a.x-r.x),Math.abs(a.y-r.y)),this.applyLineStyle(e,t.style),e.beginPath(),e.moveTo(r.x,r.y),e.lineTo(a.x,a.y),e.stroke(),Ml(e,r,a);let[o,s,c]=t.anchors,l=c.price+(s.price-o.price);Eo(e,[W(l,c.price,n),xo(c.price,l,n)],a.x,a.y+(a.y<r.y?-8:8),`center`,a.y<r.y)}this.resetLineStyle(e),r&&this.renderAnchorHandles(e,t,n)}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;let i=t.anchors.map(e=>this.anchorToPixel(e,n));return G(e,i[0],i[1])<=r?!0:i.length>=3&&G(e,i[2],this.target(t,n))<=r}},_u=class extends K{descriptor={type:`barsPattern`,name:`Bars Pattern`,requiredAnchors:3,options:{mode:{kind:`choice`,label:`Show as`,default:`bars`,choices:[{value:`bars`,label:`Bars`},{value:`line`,label:`Line`},{value:`highLow`,label:`High-low`}]},mirrored:{kind:`boolean`,label:`Mirrored`,default:!1},flipped:{kind:`boolean`,label:`Flipped`,default:!1}}};bars=()=>[];setDataGetter(e){this.bars=e}copied(t){let n=this.bars();if(n.length===0)return[];let[r,i,a]=t.anchors,o=Math.max(0,Math.round(e.O(Math.min(r.time,i.time),n))),s=Math.min(n.length-1,Math.round(e.O(Math.max(r.time,i.time),n)));if(s<o)return[];let c=n.slice(o,Math.min(s+1,o+pu));if(c.length===0)return[];let l=this.option(t,`flipped`),u=this.option(t,`mirrored`)?[...c].reverse():c,d=u[0].open,f=e=>a.price+(l?d-e:e-d);return u.map(e=>{let t=f(e.high),n=f(e.low);return{...e,open:f(e.open),close:f(e.close),high:Math.max(t,n),low:Math.min(t,n)}})}box(t,n,r){if(r.length===0)return null;let i=e.E(t.anchors[2].time,n),a=e.b(i,n)-n.barWidth/2,o=e.b(i+r.length-1,n)+n.barWidth/2,s=-1/0,c=1/0;for(let e of r)e.high>s&&(s=e.high),e.low<c&&(c=e.low);let l=e.w(s,n),u=e.w(c,n);return{x:a,y:Math.min(l,u),width:o-a,height:Math.abs(u-l)}}render(e,t,n,r){if(t.anchors.length<2)return;let i=this.anchorToPixel(t.anchors[0],n),a=this.anchorToPixel(t.anchors[1],n);this.applyLineStyle(e,t.style),e.setLineDash([4,4]),e.beginPath(),e.moveTo(i.x,i.y),e.lineTo(a.x,a.y),e.stroke(),this.resetLineStyle(e),t.anchors.length>=3&&this.renderCopy(e,t,n),r&&this.renderAnchorHandles(e,t,n)}renderCopy(t,n,r){let i=this.copied(n);if(i.length===0)return;let a=e.E(n.anchors[2].time,r),o=this.option(n,`mode`);if(t.strokeStyle=n.style.color,t.fillStyle=n.style.color,t.lineWidth=1,t.globalAlpha=.7,o===`line`)t.beginPath(),i.forEach((n,i)=>{let o=e.b(a+i,r),s=e.w(n.close,r);i===0?t.moveTo(o,s):t.lineTo(o,s)}),t.stroke();else{let n=Math.max(1,r.barWidth/2);i.forEach((i,s)=>{let c=e.b(a+s,r);if(t.beginPath(),t.moveTo(c,e.w(i.high,r)),t.lineTo(c,e.w(i.low,r)),t.stroke(),o===`highLow`)return;let l=e.w(Math.max(i.open,i.close),r),u=Math.max(1,e.w(Math.min(i.open,i.close),r)-l);i.close>=i.open?t.strokeRect(c-n,l,n*2,u):t.fillRect(c-n,l,n*2,u)})}t.globalAlpha=1}hitTest(e,t,n,r){if(t.anchors.length<2)return!1;if(G(e,this.anchorToPixel(t.anchors[0],n),this.anchorToPixel(t.anchors[1],n))<=r)return!0;let i=t.anchors.length>=3?this.box(t,n,this.copied(t)):null;return i!==null&&ol(e,i,r)}};function vu(e){e.register(new ms),e.register(new hs),e.register(new gs),e.register(new _s),e.register(new vs),e.register(new ys),e.register(new bs),e.register(new xs),e.register(new Es),e.register(new Os),e.register(new ks),e.register(new As),e.register(new js),e.register(new Ms),e.register(new zs),e.register(new Gs),e.register(new Ks),e.register(new qs),e.register(new Ys),e.register(new Xs),e.register(new Qs),e.register(new ec),e.register(new tc),e.register(new nc),e.register(new ic),e.register(new uc),e.register(new dc),e.register(new hc),e.register(new _c),e.register(new xc),e.register(new Tc),e.register(new Ns),e.register(new Ps),e.register(new Dc),e.register(new Oc),e.register(new kc),e.register(new Mc),e.register(new Rc),e.register(new Hc),e.register(new qc),e.register(new hl),e.register(new gl),e.register(new xl),e.register(new wl),e.register(new Dl),e.register(new Il),e.register(new Ll),e.register(new Rl),e.register(new zl),e.register(new Hl),e.register(new Ul),e.register(new eu),e.register(new iu),e.register(new tu),e.register(new nu),e.register(new ru),e.register(new au),e.register(new Bs),e.register(new Vs),e.register(new Hs),e.register(new Us),e.register(new Ws),e.register(new Ac),e.register(new jc),e.register(new lu),e.register(new uu),e.register(new hu),e.register(new gu),e.register(new _u)}function yu(e,t){let{chartRect:n}=t;return e>=n.y&&e<=n.y+n.height}var bu=2;function xu(e,t){return e.type===t.type?e.type===`cancelOrder`?e.orderId===t.orderId:e.type===`removeStop`?e.positionId===t.positionId&&e.which===t.which:e.positionId===t.positionId:!1}function Su(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n];if(t.x>=r.x-bu&&t.x<=r.x+r.size+bu&&t.y>=r.y-bu&&t.y<=r.y+r.size+bu)return r}return null}function Cu(e,t,n,r,i){e.fillStyle=i,e.fillRect(t,n,r,r);let a=r*.3;e.strokeStyle=`#FFFFFF`,e.lineWidth=1.5,e.beginPath(),e.moveTo(t+a,n+a),e.lineTo(t+r-a,n+r-a),e.moveTo(t+r-a,n+a),e.lineTo(t+a,n+r-a),e.stroke()}function wu(e,t,n,r,i){e.fillStyle=i,e.fillRect(t,n,r,r);let a=n+r*.25,o=n+r*.75,s=t+r*.35,c=t+r*.65,l=r*.14;e.strokeStyle=`#FFFFFF`,e.lineWidth=1.5,e.beginPath(),e.moveTo(s,o),e.lineTo(s,a),e.moveTo(s-l,a+l),e.lineTo(s,a),e.lineTo(s+l,a+l),e.moveTo(c,a),e.lineTo(c,o),e.moveTo(c-l,o-l),e.lineTo(c,o),e.lineTo(c+l,o-l),e.stroke()}var Tu=16,Eu=class{render(t,n,r,i,a,o,s=[]){let c=a.orderColors?.buy??`#1fa874`,l=a.orderColors?.sell??`#e8505b`,{chartRect:u}=r,d=a.lineButtons?.cancel!==!1;for(let a of n){let n=o?.orderId===a.id&&o.sourceType===`order`,f=e.w(n?o.currentPrice:a.price,r);if(f<u.y||f>u.y+u.height)continue;let m=a.side===`buy`?c:l;t.setLineDash([6,4]),t.strokeStyle=m,t.lineWidth=1,t.beginPath(),t.moveTo(u.x,Math.round(f)+.5),t.lineTo(u.x+u.width,Math.round(f)+.5),t.stroke(),t.setLineDash([]);let h=a.label??a.type.toUpperCase();t.font=`bold 10px ${i.font.family}`;let g=t.measureText(h).width+8;t.fillStyle=m,p(t,u.x+4,f-8,g,16,i),t.fillStyle=`#FFFFFF`,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(h,u.x+8,f);let _=u.x+4+g+6;if(t.fillStyle=m,t.beginPath(),a.side===`buy`?(t.moveTo(_,f+4),t.lineTo(_+5,f-2),t.lineTo(_+10,f+4)):(t.moveTo(_,f-4),t.lineTo(_+5,f+2),t.lineTo(_+10,f-4)),t.fill(),d&&!n){let e=_+16;Cu(t,e,f-Tu/2,Tu,m),s.push({x:e,y:f-Tu/2,size:Tu,action:{type:`cancelOrder`,orderId:a.id}})}if(n){let n=e.w(o.startPrice,r);t.setLineDash([2,4]),t.strokeStyle=m,t.globalAlpha=.3,t.beginPath(),t.moveTo(u.x,Math.round(n)+.5),t.lineTo(u.x+u.width,Math.round(n)+.5),t.stroke(),t.globalAlpha=1,t.setLineDash([])}}}renderAxisBadges(n,r,i,a,o,s){let c=o.orderColors?.buy??`#1fa874`,l=o.orderColors?.sell??`#e8505b`,u=o.pricePrecision??2,{chartRect:d}=i,f=d.x+d.width+1;for(let o of r){let r=s?.orderId===o.id&&s.sourceType===`order`?s.currentPrice:o.price,m=e.w(r,i);if(m<d.y||m>d.y+d.height)continue;let h=o.side===`buy`?c:l,g=`${i.formatPrice?.(r)??r.toFixed(u)} x ${o.quantity}`;n.font=`11px ${a.font.family}`;let _=n.measureText(g).width+10;n.fillStyle=h,p(n,f,m-9,Math.min(_,(i.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2),18,a),n.fillStyle=`#FFFFFF`,n.textAlign=`left`,n.textBaseline=`middle`,n.fillText(g,f+5,m)}}hitTest(t,n,r,i){for(let a of n){if(a.draggable===!1)continue;let n=e.w(a.price,r);if(Math.abs(t-n)<=i)return a}return null}};function Du(e,t,n,r){let i=Math.min(Math.max(e.closedQuantity??0,0),e.quantity),a=e.quantity-i,o=e.side===`buy`?1:-1,s=(t-e.entryPrice)*a*o,c=e.entryPrice===0?0:(t-e.entryPrice)/e.entryPrice*100*o;return{side:e.side,quantity:e.quantity,closedQuantity:i,openQuantity:a,entryPrice:e.entryPrice,currentPrice:t,pnl:s,pnlPct:c,precision:n,formatPrice:r}}var Ou=/\{(side|qty|closedQty|openQty|entry|price|pnl|pnlPct|pnlSign)\}/g;function ku(e,t){return e.replace(Ou,(e,n)=>{switch(n){case`side`:return t.side.toUpperCase();case`qty`:return String(t.quantity);case`closedQty`:return String(t.closedQuantity);case`openQty`:return String(t.openQuantity);case`entry`:return t.formatPrice?.(t.entryPrice)??t.entryPrice.toFixed(t.precision);case`price`:return t.formatPrice?.(t.currentPrice)??t.currentPrice.toFixed(t.precision);case`pnl`:return t.pnl.toFixed(t.precision);case`pnlPct`:return`${t.pnlPct.toFixed(2)}%`;case`pnlSign`:return t.pnl>=0?`+`:``;default:return``}})}function Au(e,t){return typeof e==`function`?e(t):ku(e??`{side} {qty} | P&L: {pnlSign}{pnl}`,t)}function ju(e,t,n){if(!t||t.length===0)return n;let r=[...t].sort((e,t)=>e.pnl-t.pnl),i;for(let t of r)if(e>=t.pnl)i=t.color;else break;return i??n}var Mu=20,Nu=16;function Pu(e,t,n){let{chartRect:r}=n;return e-t/2>=r.y&&e+t/2<=r.y+r.height}var Fu=class{render(t,n,r,i,a,o,s=[]){let{chartRect:c}=i,l=o.positionColors?.profit??`#1fa874`,u=o.positionColors?.loss??`#e8505b`,d=o.positionColors?.entry??`#4c8dff`,f=o.pricePrecision??2,m=o.lineButtons??{};for(let h of n){let n=e.w(h.entryPrice,i);if(t.strokeStyle=d,t.lineWidth=1.5,t.setLineDash([]),t.beginPath(),t.moveTo(c.x,Math.round(n)+.5),t.lineTo(c.x+c.width,Math.round(n)+.5),t.stroke(),r!==null){let g=e.w(r,i),_=Du(h,r,f,i.formatPrice),v=_.pnl,y=v>=0?l:u,b=ju(v,o.pnlThresholds,y);t.fillStyle=b,t.globalAlpha=.08;let x=Math.min(n,g),S=Math.abs(g-n);if(t.fillRect(c.x,x,c.width,S),t.globalAlpha=1,_.closedQuantity>0&&h.quantity>0){let e=_.closedQuantity/h.quantity;t.fillStyle=d,t.globalAlpha=.25,t.fillRect(c.x,x,Math.max(2,c.width*e*.04)+2,S),t.globalAlpha=1}let C=Au(o.positionLabel,_);t.font=`bold 11px ${a.font.family}`;let w=t.measureText(C).width+12,T=c.x+8;t.fillStyle=b,t.globalAlpha=.9,p(t,T,n-10,w,20,a),t.globalAlpha=1,t.fillStyle=`#FFFFFF`,t.textBaseline=`middle`,t.textAlign=`left`,t.fillText(C,T+6,n),Pu(n,Mu,i)&&this.renderButtons(t,h.id,T+w+2,n,b,m,s)}else Pu(n,Mu,i)&&this.renderButtons(t,h.id,c.x+8,n,d,m,s);let g=h.stopLoss===void 0?NaN:e.w(h.stopLoss,i);yu(g,i)&&(t.setLineDash([4,4]),t.strokeStyle=u,t.lineWidth=1,t.beginPath(),t.moveTo(c.x,Math.round(g)+.5),t.lineTo(c.x+c.width,Math.round(g)+.5),t.stroke(),t.font=`bold 10px ${a.font.family}`,t.fillStyle=u,p(t,c.x+4,g-8,24,16,a),t.fillStyle=`#FFFFFF`,t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(`SL`,c.x+8,g),m.removeStops!==!1&&Pu(g,Nu,i)&&this.renderStopButton(t,h.id,`stopLoss`,c.x+30,g,u,s));let _=h.takeProfit===void 0?NaN:e.w(h.takeProfit,i);yu(_,i)&&(t.setLineDash([4,4]),t.strokeStyle=l,t.lineWidth=1,t.beginPath(),t.moveTo(c.x,Math.round(_)+.5),t.lineTo(c.x+c.width,Math.round(_)+.5),t.stroke(),t.font=`bold 10px ${a.font.family}`,t.fillStyle=l,p(t,c.x+4,_-8,24,16,a),t.fillStyle=`#FFFFFF`,t.textAlign=`left`,t.textBaseline=`middle`,t.fillText(`TP`,c.x+8,_),m.removeStops!==!1&&Pu(_,Nu,i)&&this.renderStopButton(t,h.id,`takeProfit`,c.x+30,_,l,s)),t.setLineDash([])}}renderButtons(e,t,n,r,i,a,o){let s=r-Mu/2,c=n;e.globalAlpha=.9,a.reverse!==!1&&(wu(e,c,s,Mu,i),o.push({x:c,y:s,size:Mu,action:{type:`reversePosition`,positionId:t}}),c+=Mu+2),a.close!==!1&&(Cu(e,c,s,Mu,i),o.push({x:c,y:s,size:Mu,action:{type:`closePosition`,positionId:t}})),e.globalAlpha=1}renderStopButton(e,t,n,r,i,a,o){let s=i-Nu/2;Cu(e,r,s,Nu,a),o.push({x:r,y:s,size:Nu,action:{type:`removeStop`,positionId:t,which:n}})}renderAxisBadges(n,r,i,a,o){let{chartRect:s}=i,c=o.positionColors?.entry??`#4c8dff`,l=o.pricePrecision??2,u=s.x+s.width+1;for(let o of r){let r=e.w(o.entryPrice,i);yu(r,i)&&(n.fillStyle=c,p(n,u,r-9,(i.priceAxisWidth??t.PRICE_AXIS_WIDTH)-2,18,a),n.fillStyle=`#FFFFFF`,n.font=`11px ${a.font.family}`,n.textAlign=`left`,n.textBaseline=`middle`,n.fillText(i.formatPrice?.(o.entryPrice)??o.entryPrice.toFixed(l),u+5,r))}}},Iu=class{render(t,n,r,i){if(!i.depthOverlay?.enabled)return;let{chartRect:a}=r,o=i.depthOverlay.bidColor??`rgba(31, 168, 116,0.15)`,s=i.depthOverlay.askColor??`rgba(232, 80, 91,0.15)`,c=i.depthOverlay.maxWidth??100,l=0,u=[],d=0;for(let e of n.bids)d+=e.volume,u.push({price:e.price,cumVol:d}),d>l&&(l=d);let f=[];d=0;for(let e of n.asks)d+=e.volume,f.push({price:e.price,cumVol:d}),d>l&&(l=d);if(l===0)return;let p=Math.max(1,n.bids.length>1?Math.abs(e.w(n.bids[0].price,r)-e.w(n.bids[1].price,r)):4),m=a.x+a.width;t.fillStyle=o;for(let{price:n,cumVol:i}of u){let o=e.w(n,r);if(o<a.y||o>a.y+a.height)continue;let s=i/l*c;t.fillRect(m-s,o-p/2,s,p)}t.fillStyle=s;for(let{price:n,cumVol:i}of f){let o=e.w(n,r);if(o<a.y||o>a.y+a.height)continue;let s=i/l*c;t.fillRect(m-s,o-p/2,s,p)}}},Lu=class{dragState=null;startY=0;dragging=!1;constructor(e=3){this.dragThreshold=e}onPointerDown(t,n,r,i,a){for(let r of n){if(r.draggable===!1)continue;let n=e.w(r.price,i);if(yu(n,i)&&Math.abs(t.y-n)<=a)return this.dragState={orderId:r.id,sourceType:`order`,startPrice:r.price,currentPrice:r.price},this.startY=t.y,this.dragging=!1,!0}for(let n of r){if(n.stopLoss!==void 0){let r=e.w(n.stopLoss,i);if(yu(r,i)&&Math.abs(t.y-r)<=a)return this.dragState={orderId:n.id,sourceType:`stopLoss`,startPrice:n.stopLoss,currentPrice:n.stopLoss},this.startY=t.y,this.dragging=!1,!0}if(n.takeProfit!==void 0){let r=e.w(n.takeProfit,i);if(yu(r,i)&&Math.abs(t.y-r)<=a)return this.dragState={orderId:n.id,sourceType:`takeProfit`,startPrice:n.takeProfit,currentPrice:n.takeProfit},this.startY=t.y,this.dragging=!1,!0}}return!1}onPointerMove(t,n){if(!this.dragState)return!1;if(!this.dragging){if(Math.abs(t.y-this.startY)<this.dragThreshold)return!0;this.dragging=!0}return this.dragState.currentPrice=e.j(t.y,n),!0}onPointerUp(){if(!this.dragState)return null;let e=this.dragState;return this.dragState=null,this.dragging?(this.dragging=!1,{sourceType:e.sourceType,id:e.orderId,newPrice:e.currentPrice,previousPrice:e.startPrice}):null}getDragState(){return this.dragState}isActive(){return this.dragState!==null}},Ru=class{menuElement=null;removeHandler=null;onItemSelect=null;show(e,t,n,r,i){if(this.hide(),!r.contextMenu?.enabled)return;let a=r.pricePrecision??2,o=i?.(t)??t.toFixed(a),s=document.createElement(`div`);s.style.cssText=`
|
|
4
4
|
position: absolute;
|