2 lines
121 KiB
JavaScript
2 lines
121 KiB
JavaScript
(self.webpackChunk=self.webpackChunk||[]).push([[82],{78227:(e,t,n)=>{"use strict";n.r(t),n.d(t,{Types:()=>r,default:()=>Xt,getActiveViewportEnabledElement:()=>E,measurementMappingUtils:()=>o,toolNames:()=>A});var o={};n.r(o),n.d(o,{getDisplayUnit:()=>L,getFirstAnnotationSelected:()=>P,getHandlesFromPoints:()=>_,getSOPInstanceAttributes:()=>M.Z,isAnnotationSelected:()=>V,setAnnotationSelected:()=>R});var r={};n.r(r);var i=n(43001),a=n(3743),s=n(14957),l=n(71771),c=n(7087),d=n(61539),m=n.n(d),u=n(56660),g=n.n(u);const{registerVolumeLoader:p}=a.volumeLoader;let h=!1;function I(e,t,n){m().external.cornerstone=a,m().external.dicomParser=g(),p("cornerstoneStreamingImageVolume",c.IU),m().configure({decodeConfig:{convertFloatPixelDataToInt:!1,use16BitDataType:Boolean(t.use16BitDataType)},beforeSend:function(t){const o=n.getActiveDataSource()?.[0].getConfig()??{},r=e.getAuthorizationHeader(),i={Accept:l.utils.generateAcceptHeader(o.acceptHeader,o.requestTransferSyntaxUID,o.omitQuotationForMultipartRequest)};return r&&Object.assign(i,r),i},errorInterceptor:e=>{l.Po.getHTTPErrorHandler(e)}}),function(e){const t={maxWebWorkers:Math.min(Math.max(navigator.hardwareConcurrency-1,1),e.maxNumberOfWebWorkers),startWebWorkersOnDemand:!0,taskConfiguration:{decodeTask:{initializeCodecsOnStartup:!1,usePDFJS:!1,strict:!1}}};h||(m().webWorkerManager.initialize(t),h=!0)}(t)}var S=n(71783);const f=function(e,t,n){let o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{};const r="dialog-enter-annotation",a=t?!(arguments.length>3&&void 0!==arguments[3])||arguments[3]?t.text:t.label:"",{dialogTitle:s="Annotation",inputLabel:l="Enter your annotation",validateFunc:c=(e=>!0)}=o,d=t=>{let{action:o,value:i}=t;switch(o.id){case"save":if("function"==typeof c&&!c(i.label))return;n(i.label,o.id);break;case"cancel":n("",o.id)}e.dismiss({id:r})};e&&e.create({id:r,centralize:!0,isDraggable:!1,showOverlay:!0,content:S.Vq,contentProps:{title:s,value:{label:a},noCloseButton:!0,onClose:()=>e.dismiss({id:r}),actions:[{id:"cancel",text:"Cancel",type:S.LZ.dt.secondary},{id:"save",text:"Save",type:S.LZ.dt.primary}],onSubmit:d,body:e=>{let{value:t,setValue:n}=e;return i.createElement(S.II,{autoFocus:!0,className:"border-primary-main bg-black",type:"text",id:"annotation",label:l,labelClassName:"text-white text-[14px] leading-[1.2]",value:t.label,onChange:e=>{e.persist(),n((t=>({...t,label:e.target.value})))},onKeyPress:e=>{"Enter"===e.key&&d({value:t,action:{id:"save"}})}})}}})};var v=n(73704);function E(e){const{activeViewportId:t}=e.getState(),{element:n}=(0,v.K8)(t)||{};return(0,a.getEnabledElement)(n)}const{calibrateImageSpacing:w}=s.utilities;class y extends s.LengthTool{constructor(){super(...arguments),this._renderingViewport=void 0,this._lengthToolRenderAnnotation=this.renderAnnotation,this.renderAnnotation=(e,t)=>{const{viewport:n}=e;return this._renderingViewport=n,this._lengthToolRenderAnnotation(e,t)}}_getTextLines(e,t){const[n,o]=e.handles.points.map((e=>this._renderingViewport.worldToCanvas(e)));return[`${Math.round(100*function(e,t){const n=e[0]-t[0],o=e[1]-t[1];return Math.sqrt(n*n+o*o)}(n,o))/100}px`]}}y.toolName="CalibrationLine";const T=y;function D(e,t){const{uiDialogService:n,viewportGridService:o}=e.services,r=t.detail,{annotation:{metadata:i,data:s}}=r,{referencedImageId:l}=i,c=E(o),{viewport:d}=c,m=Math.round(100*function(e,t){const n=e[0]-t[0],o=e[1]-t[1],r=e[2]-t[2];return Math.sqrt(n*n+o*o+r*r)}(s.handles.points[0],s.handles.points[1]))/100;a.metaData.get("calibratedPixelSpacing",l),a.metaData.get("imagePlaneModule",l),calibratedPixelSpacing?.[0]||imagePlaneModule?.rowPixelSpacing,calibratedPixelSpacing?.[1]||imagePlaneModule?.columnPixelSpacing;return new Promise(((e,t)=>{n?f(n,{text:"",label:`${m}`},((n,o)=>{"save"===o?((e=>{const t=e/m;w(l,d.getRenderingEngine(),{type:"User",scale:1/t})})(Number.parseFloat(n)),e(!0)):t("cancel")}),!1,{dialogTitle:"Calibration",inputLabel:"Actual Physical distance (mm)",validateFunc:e=>{try{const t=Number.parseFloat(e);return!isNaN(t)&&0!==t}catch{return!1}}}):t("UIDialogService is not initiated")}))}var b=n(77250);class O extends s.AnnotationDisplayTool{constructor(){super(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{supportedInteractionTypes:[],configuration:{fillColor:[255,127,127,255]}}),this._cachedOverlayMetadata=new Map,this._cachedStats={},this.onSetToolDisabled=()=>{this._cachedStats={},this._cachedOverlayMetadata=new Map},this.renderAnnotation=(e,t)=>{const{viewport:n}=e,o=this.getReferencedImageId(n);if(!o)return;const r=this._cachedOverlayMetadata.get(o)??a.metaData.get("overlayPlaneModule",o)?.overlays;return r?.length?(this._cachedOverlayMetadata.set(o,r),this._getCachedStat(o,r,this.configuration.fillColor).then((n=>{n.overlays.forEach((n=>{this._renderOverlay(e,t,n)}))})),!0):void 0}}getReferencedImageId(e){if(e instanceof a.VolumeViewport)return;return this.getTargetId(e).split("imageId:")[1]}_renderOverlay(e,t,n){const{viewport:o}=e,r=this.getReferencedImageId(o);if(!r)return;const{_id:i,columns:l,rows:c,x:d,y:m}=n,u=a.utilities.imageToWorldCoords(r,[d-1,m-1]),g=o.worldToCanvas(u),p=a.utilities.imageToWorldCoords(r,[l,c]),h=o.worldToCanvas(p),I=`image-overlay-${i}`,S=t.getSvgNode(I),f={"data-id":I,width:h[0]-g[0],height:h[1]-g[1],x:g[0],y:g[1],href:n.dataUrl};if(isNaN(f.x)||isNaN(f.y)||isNaN(f.width)||isNaN(f.height))return console.warn("Invalid rendering attribute for image overlay",f["data-id"]),!1;if(S)s.drawing.setAttributesIfNecessary(f,S),t.setNodeTouched(I);else{const e=document.createElementNS("http://www.w3.org/2000/svg","image");s.drawing.setNewAttributesIfValid(f,e),t.appendNode(e,I)}return!0}async _getCachedStat(e,t,n){if(this._cachedStats[e]&&this._isSameColor(this._cachedStats[e].color,n))return this._cachedStats[e];const o=await Promise.all(t.filter((e=>e.pixelData)).map((async(e,t)=>{let o=null;if(e.pixelData.Value?o=e.pixelData.Value:e.pixelData instanceof Array?o=e.pixelData[0]:e.pixelData.retrieveBulkData&&(o=await e.pixelData.retrieveBulkData()),!o)return;const r=this._renderOverlayToDataUrl({width:e.columns,height:e.rows},n,o);return{...e,_id:(0,b.M8)(),dataUrl:r,color:n}})));return this._cachedStats[e]={color:n,overlays:o.filter((e=>e))},this._cachedStats[e]}_isSameColor(e,t){return e&&t&&e[0]===t[0]&&e[1]===t[1]&&e[2]===t[2]&&e[3]===t[3]}_renderOverlayToDataUrl(e,t,n){let{width:o,height:r}=e;const i=new DataView(n),a=o*r,s=document.createElement("canvas");s.width=o,s.height=r;const l=s.getContext("2d");l.clearRect(0,0,o,r),l.globalCompositeOperation="copy";const c=l.getImageData(0,0,o,r),d=c.data;for(let e=0,n=0,o=0;e<a;e++)i.getUint8(o)&1<<n&&(d[4*e]=t[0],d[4*e+1]=t[1],d[4*e+2]=t[2],d[4*e+3]=t[3]),n>=7?(n=0,o++):n++;return l.putImageData(c,0,0),s.toDataURL()}}O.toolName="ImageOverlayViewer";const N=O;const A={Pan:s.PanTool.toolName,ArrowAnnotate:s.ArrowAnnotateTool.toolName,WindowLevel:s.WindowLevelTool.toolName,StackScroll:s.StackScrollTool.toolName,StackScrollMouseWheel:s.StackScrollMouseWheelTool.toolName,Zoom:s.ZoomTool.toolName,VolumeRotateMouseWheel:s.VolumeRotateMouseWheelTool.toolName,MipJumpToClick:s.MIPJumpToClickTool.toolName,Length:s.LengthTool.toolName,DragProbe:s.DragProbeTool.toolName,Probe:s.ProbeTool.toolName,RectangleROI:s.RectangleROITool.toolName,EllipticalROI:s.EllipticalROITool.toolName,CircleROI:s.CircleROITool.toolName,Bidirectional:s.BidirectionalTool.toolName,Angle:s.AngleTool.toolName,CobbAngle:s.CobbAngleTool.toolName,PlanarFreehandROI:s.PlanarFreehandROITool.toolName,Magnify:s.MagnifyTool.toolName,Crosshairs:s.CrosshairsTool.toolName,SegmentationDisplay:s.SegmentationDisplayTool.toolName,ReferenceLines:s.ReferenceLinesTool.toolName,CalibrationLine:T.toolName,TrackballRotateTool:s.TrackballRotateTool.toolName,CircleScissors:s.CircleScissorsTool.toolName,RectangleScissors:s.RectangleScissorsTool.toolName,SphereScissors:s.SphereScissorsTool.toolName,ImageOverlayViewer:N.toolName},C=["Length","EllipticalROI","CircleROI","Bidirectional","ArrowAnnotate","Angle","CobbAngle","Probe","RectangleROI","PlanarFreehandROI"];var M=n(87172);const U={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{length:m,unit:u="mm"}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:u,length:m})})),a}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{length:o,SeriesNumber:r,SOPInstanceUID:i,frameNumber:a,unit:s}=e[0],c=t.images.find((e=>e.SOPInstanceUID===i));let d;c&&(d=c.InstanceNumber);const m=d?` I: ${d}`:"",u=t.isMultiFrame?` F: ${a}`:"";if(null==o)return n;const g=l.utils.roundNumber(o,2);return n.push(`${g} ${s} (S: ${r}${m}${u})`),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:Length"),e.forEach((e=>{const{length:t,unit:n}=e;o.push("Length"),r.push(t),o.push("Unit"),r.push(n)})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}};function _(e){if(e.longAxis&&e.shortAxis){const t={};return t.start=e.longAxis[0],t.end=e.longAxis[1],t.perpendicularStart=e.longAxis[0],t.perpendicularEnd=e.longAxis[1],t}return e.map(((e,t)=>t%10==0?{start:e}:{end:e})).reduce(((e,t)=>Object.assign(e,{...t})),{})}function V(e){return s.annotation.selection.isAnnotationSelected(e)}function R(e,t){V(e)!==t&&s.annotation.selection.setAnnotationSelected(e,t)}function P(e){const[t]=s.annotation.selection.getAnnotationsSelected()||[];if(t)return s.annotation.state.getAnnotation(t)}const L=e=>null==e?"":e;const F={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i,referencedSeriesInstanceUID:a}=n;if(!Object.keys(r).length)return[];const s=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:a,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,a,l),{SeriesNumber:d}=c,{length:m,width:u,unit:g}=n;s.push({SeriesInstanceUID:a,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:g,length:m,width:u})})),s}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{length:o,width:r,unit:i,SeriesNumber:a,SOPInstanceUID:s,frameNumber:c}=e[0],d=l.utils.roundNumber(o,2),m=l.utils.roundNumber(r,2),u=t.images.find((e=>e.SOPInstanceUID===s));let g;u&&(g=u.InstanceNumber);const p=g?` I: ${g}`:"",h=t.isMultiFrame?` F: ${c}`:"";return n.push(`L: ${d} ${L(i)} (S: ${a}${p}${h})`),n.push(`W: ${m} ${L(i)}`),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:Bidirectional"),e.forEach((e=>{const{length:t,width:n,unit:i}=e;o.push("Length","Width","Unit"),r.push(t,n,i)})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}};const x={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{mean:m,stdDev:u,max:g,area:p,Modality:h,areaUnit:I,modalityUnit:S}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,Modality:h,unit:S,areaUnit:I,mean:m,stdDev:u,max:g,area:p})})),a}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{area:o,SOPInstanceUID:r,frameNumber:i,areaUnit:a}=e[0],s=t.images.find((e=>e.SOPInstanceUID===r));let c;s&&(c=s.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${i}`:"",u=l.utils.roundNumber(o,2);return n.push(`${u} ${L(a)}`),e.forEach((e=>{const{unit:t,max:o,SeriesNumber:r}=e;let i="";if(o){i=`Max: ${l.utils.roundNumber(o,2)} <small>${L(t)}</small> `}const a=`${i}(S:${r}${d}${m})`;n.includes(a)||n.push(a)})),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:EllipticalROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:i,area:a,unit:s,areaUnit:l}=e;t&&s&&i&&a&&(o.push(`max (${s})`,`mean (${s})`,`std (${s})`,"Area","Unit"),r.push(i,t,n,a,l))})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}},G={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{mean:m,stdDev:u,max:g,area:p,Modality:h,areaUnit:I,modalityUnit:S}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,Modality:h,unit:S,mean:m,stdDev:u,max:g,area:p,areaUnit:I})})),a}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{area:o,SOPInstanceUID:r,frameNumber:i,areaUnit:a}=e[0],s=t.images.find((e=>e.SOPInstanceUID===r));let c;s&&(c=s.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${i}`:"",u=l.utils.roundNumber(o||0,2);return n.push(`${u} ${L(a)}`),e.forEach((e=>{const{unit:t,max:o,SeriesNumber:r}=e;let i="";if(o){i=`Max: ${l.utils.roundNumber(o,2)} <small>${L(t)}</small> `}const a=`${i}(S:${r}${d}${m})`;n.includes(a)||n.push(a)})),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:CircleROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:i,area:a,unit:s,areaUnit:l}=e;t&&s&&i&&a&&(o.push(`max (${s})`,`mean (${s})`,`std (${s})`,"Area","Unit"),r.push(i,t,n,a,l))})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}};const k=G;const $={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:l}=r;if(!a||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:d,FrameOfReferenceUID:m}=a;if(!C.includes(c))throw new Error("Tool not supported");const{SOPInstanceUID:u,SeriesInstanceUID:g,StudyInstanceUID:p}=(0,M.Z)(d,n,i);let h;h=u?t.getDisplaySetForSOPInstanceUID(u,g):t.getDisplaySetsForSeries(g);const{points:I}=s.handles,S=function(e,t){const{metadata:n,data:o}=e,{text:r}=o,{referencedImageId:i}=n,a=[],{SOPInstanceUID:s,SeriesInstanceUID:l,frameNumber:c}=(0,M.Z)(i),d=t.getDisplaySetForSOPInstanceUID(s,l,c),{SeriesNumber:m}=d;return a.push({SeriesInstanceUID:l,SOPInstanceUID:s,SeriesNumber:m,frameNumber:c,text:r}),a}(r,t),f=function(e,t){if(!e)return"";const n=[],{SeriesNumber:o,SOPInstanceUID:r,frameNumber:i}=e[0],a=t.images.find((e=>e.SOPInstanceUID===r));let s;a&&(s=a.InstanceNumber);const l=s?` I: ${s}`:"",c=t.isMultiFrame?` F: ${i}`:"";return n.push(`(S: ${o}${l}${c})`),n}(S,h);return{uid:l,SOPInstanceUID:u,FrameOfReferenceUID:m,points:I,metadata:a,referenceSeriesUID:g,referenceStudyUID:p,frameNumber:S[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:h.displaySetInstanceUID,label:s.text,text:s.text,displayText:f,data:s.cachedStats,type:o(c),getReport:()=>{throw new Error("Not implemented")}}}},B={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Cobb Angle tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return;const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{angle:m}=n,u="°";a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:u,angle:m})})),a}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{angle:o,unit:r,SeriesNumber:i,SOPInstanceUID:a,frameNumber:s}=e[0],c=t.images.find((e=>e.SOPInstanceUID===a));let d;c&&(d=c.InstanceNumber);const m=d?` I: ${d}`:"",u=t.isMultiFrame?` F: ${s}`:"";if(void 0===o)return n;const g=l.utils.roundNumber(o,2);return n.push(`${g} ${L(r)} (S: ${i}${m}${u})`),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f?.[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:CobbAngle"),e.forEach((e=>{const{angle:t,unit:n}=e;o.push(`Angle (${n})`),r.push(t)})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}};const z=B,j={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return;const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{angle:m}=n,u="°";a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,unit:u,angle:m})})),a}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{angle:o,unit:r,SeriesNumber:i,SOPInstanceUID:a,frameNumber:s}=e[0],c=t.images.find((e=>e.SOPInstanceUID===a));let d;c&&(d=c.InstanceNumber);const m=d?` I: ${d}`:"",u=t.isMultiFrame?` F: ${s}`:"";if(void 0===o)return n;const g=l.utils.roundNumber(o,2);return n.push(`${g} ${L(r)} (S: ${i}${m}${u})`),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f?.[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:Angle"),e.forEach((e=>{const{angle:t,unit:n}=e;o.push(`Angle (${n})`),r.push(t)})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}};const W=j,q={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:l}=r;if(!a||!s)return console.warn("PlanarFreehandROI tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:d,FrameOfReferenceUID:m}=a;if(!C.includes(c))throw new Error("Tool not supported");const{SOPInstanceUID:u,SeriesInstanceUID:g,StudyInstanceUID:p}=(0,M.Z)(d,n,i);let h;h=u?t.getDisplaySetForSOPInstanceUID(u,g):t.getDisplaySetsForSeries(g);const{points:I}=s.handles;!function(e,t){const{metadata:n,data:o}=e,{label:r}=o,{referencedImageId:i}=n,a=[],{SOPInstanceUID:s,SeriesInstanceUID:l}=(0,M.Z)(i)||{};if(!s||!l)return a;const c=t.getDisplaySetForSOPInstanceUID(s,l),{SeriesNumber:d,SeriesInstanceUID:m}=c;a.push({SeriesInstanceUID:m,SeriesNumber:d,label:r,data:o})}(r,t);return{uid:l,SOPInstanceUID:u,FrameOfReferenceUID:m,points:I,metadata:a,referenceSeriesUID:g,referenceStudyUID:p,toolName:a.toolName,displaySetInstanceUID:h.displaySetInstanceUID,label:s.label,displayText:"",data:{...s,...s.cachedStats},type:o(c),getReport:()=>({columns:[],values:[]})}}};const H=q,Z={toAnnotation:e=>{},toMeasurement:(e,t,n,o)=>{const{annotation:r,viewportId:i}=e,{metadata:a,data:s,annotationUID:c}=r;if(!a||!s)return console.warn("Rectangle ROI tool: Missing metadata or data"),null;const{toolName:d,referencedImageId:m,FrameOfReferenceUID:u}=a;if(!C.includes(d))throw new Error("Tool not supported");const{SOPInstanceUID:g,SeriesInstanceUID:p,StudyInstanceUID:h}=(0,M.Z)(m,n,i);let I;I=g?t.getDisplaySetForSOPInstanceUID(g,p):t.getDisplaySetsForSeries(p);const{points:S}=s.handles,f=function(e,t){const{metadata:n,data:o}=e,{cachedStats:r}=o,{referencedImageId:i}=n;if(!Object.keys(r).length)return[];const a=[];return Object.keys(r).forEach((e=>{const n=r[e];if(!i)throw new Error("Non-acquisition plane measurement mapping not supported");const{SOPInstanceUID:o,SeriesInstanceUID:s,frameNumber:l}=(0,M.Z)(i),c=t.getDisplaySetForSOPInstanceUID(o,s,l),{SeriesNumber:d}=c,{mean:m,stdDev:u,max:g,area:p,Modality:h,modalityUnit:I,areaUnit:S}=n;a.push({SeriesInstanceUID:s,SOPInstanceUID:o,SeriesNumber:d,frameNumber:l,Modality:h,unit:I,mean:m,stdDev:u,max:g,area:p,areaUnit:S})})),a}(r,t),v=function(e,t){if(!e||!e.length)return"";const n=[],{area:o,SOPInstanceUID:r,frameNumber:i,areaUnit:a}=e[0],s=t.images.find((e=>e.SOPInstanceUID===r));let c;s&&(c=s.InstanceNumber);const d=c?` I: ${c}`:"",m=t.isMultiFrame?` F: ${i}`:"",u=l.utils.roundNumber(o||0,2);return n.push(`${u} ${L(a)}`),e.forEach((e=>{const{unit:t,max:o,SeriesNumber:r}=e;let i="";if(o){i=`Max: ${l.utils.roundNumber(o,2)} <small>${L(t)}</small> `}const a=`${i}(S:${r}${d}${m})`;n.includes(a)||n.push(a)})),n}(f,I);return{uid:c,SOPInstanceUID:g,FrameOfReferenceUID:u,points:S,metadata:a,referenceSeriesUID:p,referenceStudyUID:h,frameNumber:f[0]?.frameNumber||1,toolName:a.toolName,displaySetInstanceUID:I.displaySetInstanceUID,label:s.label,displayText:v,data:s.cachedStats,type:o(d),getReport:()=>function(e,t,n){const o=[],r=[];o.push("AnnotationType"),r.push("Cornerstone:RectangleROI"),e.forEach((e=>{const{mean:t,stdDev:n,max:i,area:a,unit:s,areaUnit:l}=e;t&&s&&i&&a&&(o.push("Maximum","Mean","Std Dev","Pixel Unit","Area","Unit"),r.push(i,t,n,s,a,l))})),n&&(o.push("FrameOfReferenceUID"),r.push(n));t&&(o.push("points"),r.push(t.map((e=>e.join(" "))).join(";")));return{columns:o,values:r}}(f,S,u)}}};const Y=Z,K=(e,t,n)=>{const o=e=>{const{POLYLINE:t,ELLIPSE:n,CIRCLE:o,RECTANGLE:r,BIDIRECTIONAL:i,POINT:a,ANGLE:s}=l.MeasurementService.VALUE_TYPES;return{Length:t,EllipticalROI:n,CircleROI:o,RectangleROI:r,PlanarFreehandROI:t,Bidirectional:i,ArrowAnnotate:a,CobbAngle:s,Angle:s}[e]};return{Length:{toAnnotation:U.toAnnotation,toMeasurement:e=>U.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.POLYLINE,points:2}]},Bidirectional:{toAnnotation:F.toAnnotation,toMeasurement:e=>F.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.POLYLINE,points:2},{valueType:l.MeasurementService.VALUE_TYPES.POLYLINE,points:2}]},EllipticalROI:{toAnnotation:x.toAnnotation,toMeasurement:e=>x.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.ELLIPSE}]},CircleROI:{toAnnotation:k.toAnnotation,toMeasurement:e=>k.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.CIRCLE}]},RectangleROI:{toAnnotation:Y.toAnnotation,toMeasurement:e=>Y.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.POLYLINE}]},PlanarFreehandROI:{toAnnotation:H.toAnnotation,toMeasurement:e=>H.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.POLYLINE}]},ArrowAnnotate:{toAnnotation:$.toAnnotation,toMeasurement:e=>$.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.POINT,points:1}]},CobbAngle:{toAnnotation:z.toAnnotation,toMeasurement:e=>z.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.ANGLE}]},Angle:{toAnnotation:W.toAnnotation,toMeasurement:e=>W.toMeasurement(e,t,n,o),matchingCriteria:[{valueType:l.MeasurementService.VALUE_TYPES.ANGLE}]}}},{removeAnnotation:J}=s.annotation.state,Q=s.Enums.Events,X="Cornerstone3DTools",ee=e=>{const{measurementService:t,displaySetService:n,cornerstoneViewportService:o}=e.services,r=((e,t,n)=>{const{Length:o,Bidirectional:r,EllipticalROI:i,CircleROI:a,ArrowAnnotate:s,Angle:l,CobbAngle:c,RectangleROI:d,PlanarFreehandROI:m}=K(e,t,n),u=e.createSource(X,"0.1");return e.addMapping(u,"Length",o.matchingCriteria,o.toAnnotation,o.toMeasurement),e.addMapping(u,"Bidirectional",r.matchingCriteria,r.toAnnotation,r.toMeasurement),e.addMapping(u,"EllipticalROI",i.matchingCriteria,i.toAnnotation,i.toMeasurement),e.addMapping(u,"CircleROI",a.matchingCriteria,a.toAnnotation,a.toMeasurement),e.addMapping(u,"ArrowAnnotate",s.matchingCriteria,s.toAnnotation,s.toMeasurement),e.addMapping(u,"CobbAngle",c.matchingCriteria,c.toAnnotation,c.toMeasurement),e.addMapping(u,"Angle",l.matchingCriteria,l.toAnnotation,l.toMeasurement),e.addMapping(u,"RectangleROI",d.matchingCriteria,d.toAnnotation,d.toMeasurement),e.addMapping(u,"PlanarFreehandROI",m.matchingCriteria,m.toAnnotation,m.toMeasurement),e.addMapping(u,"CalibrationLine",o.matchingCriteria,o.toAnnotation,o.toMeasurement),u})(t,n,o);te(t,o,r);const{annotationToMeasurement:i,remove:s}=r;function l(t){try{const n=t.detail,{annotation:{metadata:r,annotationUID:a}}=n,{toolName:s}=r;t.type===m&&s===A.CalibrationLine?D(e,t).then((()=>{console.log("calibration applied")}),(()=>!0)).finally((()=>{J(a),c(t),o.resize()})):(n.uid=a,i(s,n))}catch(e){console.warn("Failed to update measurement:",e)}}function c(e){try{try{const n=e.detail,{annotation:{annotationUID:o}}=n;t.getMeasurement(o)&&(console.log("~~ removeEvt",e),s(o,n))}catch(e){console.warn("Failed to update measurement:",e)}}catch(e){console.warn("Failed to remove measurement:",e)}}const d=Q.ANNOTATION_ADDED,m=Q.ANNOTATION_COMPLETED,u=Q.ANNOTATION_MODIFIED,g=Q.ANNOTATION_REMOVED,p=Q.ANNOTATION_SELECTION_CHANGE;return a.eventTarget.addEventListener(d,l),a.eventTarget.addEventListener(m,l),a.eventTarget.addEventListener(u,(function(e){try{const n=e.detail,{annotation:{metadata:o,annotationUID:r}}=n;if(!t.getMeasurement(r))return;const{toolName:a}=o;n.uid=r,i(a,n,!0)}catch(e){console.warn("Failed to update measurement:",e)}})),a.eventTarget.addEventListener(g,c),a.eventTarget.addEventListener(p,(function(e){try{const n=e.detail,{added:o,removed:r}=n;r&&r.forEach((e=>t.setMeasurementSelected(e,!1))),o&&o.forEach((e=>t.setMeasurementSelected(e,!0)))}catch(e){console.warn("Failed to select and unselect measurements:",e)}})),r},te=(e,t,n)=>{const{MEASUREMENT_REMOVED:o,MEASUREMENTS_CLEARED:r,MEASUREMENT_UPDATED:i,RAW_MEASUREMENT_ADDED:a}=e.EVENTS;e.getSource(X,"0.1");e.subscribe(r,(e=>{let{measurements:t}=e;if(Object.keys(t).length)for(const e of Object.values(t)){const{uid:t,source:n}=e;n.name===X&&J(t)}})),e.subscribe(i,(e=>{let{source:t,measurement:n,notYetUpdatedAtSource:o}=e;if(t.name!==X)return;if(!1===o)return;const{uid:r,label:i}=n,a=s.annotation.state.getAnnotation(r),{data:l,metadata:c}=a;l&&(l.label!==i&&(l.label=i),"ArrowAnnotate"===c.toolName&&(l.text=i))})),e.subscribe(a,(e=>{let{source:t,measurement:n,data:o,dataSource:r}=e;if(t.name!==X)return;const{referenceSeriesUID:i,referenceStudyUID:a,SOPInstanceUID:c}=n,d=l.DicomMetadataStore.getInstance(a,i,c);let m,u=1;n?.metadata?.referencedImageId?(m=n.metadata.referencedImageId,u=(0,M.Z)(n.metadata.referencedImageId).frameNumber):m=r.getImageIdsForInstance({instance:d});s.annotation.state.getAnnotationManager().addAnnotation({annotationUID:n.uid,highlighted:!1,isLocked:!1,invalidated:!1,metadata:{toolName:n.toolName,FrameOfReferenceUID:n.FrameOfReferenceUID,referencedImageId:m},data:{text:o.annotation.data.text,handles:{...o.annotation.data.handles},cachedStats:{...o.annotation.data.cachedStats},label:o.annotation.data.label,frameNumber:u}})})),e.subscribe(o,(e=>{let{source:n,measurement:o}=e;if(n?.name&&n.name!==X)return;J(o);t.getRenderingEngine().render()}))};const ne=function(e){e.setServiceImplementation({playClip:(e,t)=>s.utilities.cine.playClip(e,t),stopClip:e=>s.utilities.cine.stopClip(e)})};var oe=n(44379);const re=new Map,ie=new Map;function ae(e){let{data:{viewportId:t,volumeInputArray:n},displaySetsMatchDetails:o,viewportMatchDetails:r}=e;ie.set(t,n);for(const e of n){const{volumeId:t}=e,n=a.cache.getVolume(t);if(!n)return;if(!re.has(t)){const{metadata:e}=n;re.set(t,e.SeriesInstanceUID)}}if(r.size!==ie.size)return;for(const[e,t]of o.entries()){const{SeriesInstanceUID:e}=t;if(!Array.from(re.values()).includes(e))return}const i=Array.from(re.keys()).slice().map((e=>a.cache.getVolume(e))),s=[];i.forEach((e=>{const t=e.getImageLoadRequests();if(!t.length||!t[0]||!t[0].imageId)return;const n=function(e){const t=e.length-1,n=Math.floor(e.length/2);let o=n,r=n;const i=[{imageId:e[n],imageIdIndex:n}],a={currentPositionDownToMinimum:!1,currentPositionUpToMaximum:!1};for(0===n?a.currentPositionDownToMinimum=!0:n===t&&(a.currentPositionUpToMaximum=!0);!a.currentPositionDownToMinimum||!a.currentPositionUpToMaximum;)a.currentPositionDownToMinimum||(o--,i.push({imageId:e[o],imageIdIndex:o}),0===o&&(a.currentPositionDownToMinimum=!0)),a.currentPositionUpToMaximum||(r++,i.push({imageId:e[r],imageIdIndex:r}),r===t&&(a.currentPositionUpToMaximum=!0));return i}(t.map((e=>e.imageId))).map((e=>{let{imageId:n}=e;return t.find((e=>e.imageId===n))}));s.push(n)}));const l=(0,oe.compact)((0,oe.flatten)((0,oe.zip)(...s))),c=[];l.forEach((e=>{const{imageId:t}=e;s.forEach((e=>{const n=e.find((e=>e.imageId===t));n&&c.push(n)}))}));const d=a.Enums.RequestType.Prefetch;c.forEach((e=>{let{callLoadImage:t,additionalDetails:n,imageId:o,imageIdIndex:r,options:i}=e;const s=t.bind(null,o,r,i);a.imageLoadPoolManager.addRequest(s,d,n,0)})),re.clear();const m=new Map(ie);return ie.clear(),m}const se=new Map,le=new Map;function ce(e){let{data:{viewportId:t,volumeInputArray:n},displaySetsMatchDetails:o}=e;le.set(t,n);for(const e of n){const{volumeId:t}=e,n=a.cache.getVolume(t);if(!n)return void console.log("interleaveNthLoader::No volume, can't load it");if(!se.has(t)){const{metadata:e}=n;se.set(t,e.SeriesInstanceUID)}}const r=function(e){if(!e||!e.length)return[];if(1===e.length)return e[0];console.time("interleave");const t=[...e],n=[];for(let e=0;t.length>0;e++)for(const o of t)e>=o.length?t.splice(t.indexOf(o),1):n.push(o[e]);return console.timeEnd("interleave"),n}(Array.from(se.keys()).slice().map((e=>a.cache.getVolume(e))).map((e=>e.getImageLoadRequests())).filter((e=>e?.[0]?.imageId)).map((e=>function(e){const t=[[],[],[],[],[]],n=e.length/2-3,o=n+6;for(let r=0;r<e.length;r++)r<2||r>e.length-4||r>n&&r<o?t[0].push(e[r]):r%7==2?t[1].push(e[r]):r%7==5?t[2].push(e[r]):t[r%2+3].push(e[r]);return[...t[0],...t[1],...t[2],...t[3],...t[4]]}(e)))),i=a.Enums.RequestType.Prefetch;r.forEach((e=>{let{callLoadImage:t,additionalDetails:n,imageId:o,imageIdIndex:r,options:s}=e;const l=t.bind(null,o,r,s);a.imageLoadPoolManager.addRequest(l,i,n,0)})),se.clear();const s=new Map(le);return le.clear(),s}const de=new Map,me=new Map;function ue(e){let{data:{viewportId:t,volumeInputArray:n},displaySetsMatchDetails:o,viewportMatchDetails:r}=e;me.set(t,n);for(const e of n){const{volumeId:t}=e,n=a.cache.getVolume(t);if(!n)return;if(!de.has(t)){const{metadata:e}=n;de.set(t,e.SeriesInstanceUID)}}if(r.size!==me.size)return;for(const[e,t]of o.entries()){const{SeriesInstanceUID:e}=t;if(!Array.from(de.values()).includes(e))return}const i=Array.from(de.keys()).slice().map((e=>a.cache.getVolume(e))),s=[];i.forEach((e=>{const t=e.getImageLoadRequests();t.length&&t[0]&&t[0].imageId&&s.push(t.reverse())}));const l=(0,oe.compact)((0,oe.flatten)((0,oe.zip)(...s))),c=[];l.forEach((e=>{const{imageId:t}=e;s.forEach((e=>{const n=e.find((e=>e.imageId===t));n&&c.push(n)}))}));const d=a.Enums.RequestType.Prefetch;c.forEach((e=>{let{callLoadImage:t,additionalDetails:n,imageId:o,imageIdIndex:r,options:i}=e;const s=t.bind(null,o,r,i);a.imageLoadPoolManager.addRequest(s,d,n,0)})),de.clear();const m=new Map(me);return me.clear(),m}const ge=(e,t)=>{if(!t?.detail)return;const{element:n,currentPoints:o}=t.detail;return e.runCommand("getNearbyAnnotation",{element:n,canvasCoordinates:o?.canvas},"CORNERSTONE")},pe=s.Enums.Events,he={button1:{commands:[{commandName:"closeContextMenu"}]},button3:{commands:[{commandName:"showCornerstoneContextMenu",commandOptions:{requireNearbyToolData:!0,menuId:"measurementsContextMenu"}}]}};const Ie=function(e){let{cornerstoneViewportService:t,customizationService:n,commandsManager:o}=e;const r=e=>{const t=function(e){const t=e.detail.event.which,n=[];return e.detail.event.altKey&&n.push("alt"),e.detail.event.ctrlKey&&n.push("ctrl"),e.detail.event.shiftKey&&n.push("shift"),n.push("button"),n.push(t),n.join("")}(e);((e,t)=>{const r=(n.get("cornerstoneViewportClickCommands")||he)[e];if(!r)return;let i=null;r.commands.some((e=>e.commandOptions?.requireNearbyToolData))&&(i=ge(o,t));const a={nearbyToolData:i,event:t};o.run(r,a)})(t,e)};a.eventTarget.addEventListener(a.EVENTS.ELEMENT_ENABLED,function(e){const{viewportId:n,element:o}=e.detail;t.getViewportInfo(n)&&((0,v.Yc)(n,o),o.addEventListener(pe.MOUSE_CLICK,r))}.bind(null)),a.eventTarget.addEventListener(a.EVENTS.ELEMENT_DISABLED,function(e){const{element:t}=e.detail;t.removeEventListener(pe.MOUSE_CLICK,r)}.bind(null))},Se=s.Enums.Events,fe={doubleClick:{commandName:"toggleOneUp",commandOptions:{}}};const ve=function(e){let{customizationService:t,commandsManager:n}=e;const o=e=>{if(ge(n,e))return;const o=function(e){const t=[];return e.detail.event.altKey&&t.push("alt"),e.detail.event.ctrlKey&&t.push("ctrl"),e.detail.event.shiftKey&&t.push("shift"),t.push("doubleClick"),t.join("")}(e),r=(t.get("cornerstoneViewportClickCommands")||fe)[o];r&&n.run(r)};a.eventTarget.addEventListener(a.EVENTS.ELEMENT_ENABLED,function(e){const{element:t}=e.detail;t.addEventListener(Se.MOUSE_DOUBLE_CLICK,o)}.bind(null)),a.eventTarget.addEventListener(a.EVENTS.ELEMENT_DISABLED,function(e){const{element:t}=e.detail;t.removeEventListener(Se.MOUSE_DOUBLE_CLICK,o)}.bind(null))},{TimingEnum:Ee}=l.Types,we=[Ee.DISPLAY_SETS_TO_ALL_IMAGES,Ee.DISPLAY_SETS_TO_FIRST_IMAGE,Ee.STUDY_TO_FIRST_IMAGE],ye={viewportsWaiting:0};function Te(e){"preRender"!==e.detail.viewportStatus&&(l.cM.timeEnd(Ee.DISPLAY_SETS_TO_FIRST_IMAGE),l.cM.timeEnd(Ee.STUDY_TO_FIRST_IMAGE),l.cM.timeEnd(Ee.SCRIPT_TO_VIEW),ye.viewportsWaiting-=1,e.detail.element.removeEventListener(a.EVENTS.IMAGE_RENDERED,Te),ye.viewportsWaiting||l.cM.timeEnd(Ee.DISPLAY_SETS_TO_ALL_IMAGES))}async function De(e){let{servicesManager:t,commandsManager:n,extensionManager:o,configuration:r,appConfig:i}=e;const d=i.useSharedArrayBuffer;let m=!1;"AUTO"===d?a.setUseSharedArrayBuffer(a.Enums.SharedArrayBufferModes.AUTO):"FALSE"===d||!1===d?(a.setUseSharedArrayBuffer(a.Enums.SharedArrayBufferModes.FALSE),m=!0):a.setUseSharedArrayBuffer(a.Enums.SharedArrayBufferModes.TRUE),await(0,a.init)({rendering:{preferSizeOverAccuracy:Boolean(i.use16BitDataType),useNorm16Texture:Boolean(i.use16BitDataType)}}),a.setUseCPURendering(Boolean(i.useCPURendering)),a.setConfiguration({...a.getConfiguration(),rendering:{...a.getConfiguration().rendering,strictZSpacingForVolumeViewport:i.strictZSpacingForVolumeViewport}});const{maxCacheSize:u}=i;u&&a.cache.setMaxCacheSize(u),function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s.CrosshairsTool.isAnnotation=!1,s.ReferenceLinesTool.isAnnotation=!1,(0,s.init)(e),(0,s.addTool)(s.PanTool),(0,s.addTool)(s.WindowLevelTool),(0,s.addTool)(s.StackScrollMouseWheelTool),(0,s.addTool)(s.StackScrollTool),(0,s.addTool)(s.ZoomTool),(0,s.addTool)(s.ProbeTool),(0,s.addTool)(s.VolumeRotateMouseWheelTool),(0,s.addTool)(s.MIPJumpToClickTool),(0,s.addTool)(s.LengthTool),(0,s.addTool)(s.RectangleROITool),(0,s.addTool)(s.EllipticalROITool),(0,s.addTool)(s.CircleROITool),(0,s.addTool)(s.BidirectionalTool),(0,s.addTool)(s.ArrowAnnotateTool),(0,s.addTool)(s.DragProbeTool),(0,s.addTool)(s.AngleTool),(0,s.addTool)(s.CobbAngleTool),(0,s.addTool)(s.PlanarFreehandROITool),(0,s.addTool)(s.MagnifyTool),(0,s.addTool)(s.CrosshairsTool),(0,s.addTool)(s.SegmentationDisplayTool),(0,s.addTool)(s.ReferenceLinesTool),(0,s.addTool)(T),(0,s.addTool)(s.TrackballRotateTool),(0,s.addTool)(s.CircleScissorsTool),(0,s.addTool)(s.RectangleScissorsTool),(0,s.addTool)(s.SphereScissorsTool),(0,s.addTool)(N);const t=s.annotation.config.style.getDefaultToolStyles();s.annotation.config.style.setDefaultToolStyles({global:{...t.global,textBoxFontSize:"15px",lineWidth:"1.5"}})}(),a.Settings.getRuntimeSettings().set("useCursors",Boolean(i.useCursors));const{userAuthenticationService:g,customizationService:p,uiModalService:h,uiNotificationService:S,cineService:f,cornerstoneViewportService:v,hangingProtocolService:E,toolGroupService:w,toolbarService:y,viewportGridService:D,stateSyncService:b}=t.services;window.services=t.services,window.extensionManager=o,window.commandsManager=n,!i.showWarningMessageForCrossOrigin||window.crossOriginIsolated||m||S.show({title:"Cross Origin Isolation",message:"Cross Origin Isolation is not enabled, read more about it here: https://docs.ohif.org/faq/",type:"warning"}),i.showCPUFallbackMessage&&a.getShouldUseCPURendering()&&function(e,t){const n=t=>{if(100===t)return e.show({content:be,title:"OHIF Fell Back to CPU Rendering"}),!0},{unsubscribe:o}=t.subscribe(t.EVENTS.PROTOCOL_CHANGED,(()=>{n(100)&&o()}))}(h,E),b.register("lutPresentationStore",{clearOnModeExit:!0}),b.register("positionPresentationStore",{clearOnModeExit:!0}),b.register("toggleOneUpViewportGridStore",{clearOnModeExit:!0});const O=s.Enums.SegmentationRepresentations.Labelmap;s.segmentation.config.setGlobalRepresentationConfig(O,{fillAlpha:.3,fillAlphaInactive:.2,outlineOpacity:1,outlineOpacityInactive:.65});const A=l.default.classes.MetadataProvider;a.volumeLoader.registerVolumeLoader("cornerstoneStreamingImageVolume",c.IU),E.registerImageLoadStrategy("interleaveCenter",ae),E.registerImageLoadStrategy("interleaveTopToBottom",ue),E.registerImageLoadStrategy("nth",ce),a.metaData.addProvider(a.utilities.calibratedPixelSpacingMetadataProvider.get.bind(a.utilities.calibratedPixelSpacingMetadataProvider)),a.metaData.addProvider(A.get.bind(A),9999),a.imageLoadPoolManager.maxNumRequests={interaction:i?.maxNumRequests?.interaction||100,thumbnail:i?.maxNumRequests?.thumbnail||75,prefetch:i?.maxNumRequests?.prefetch||10},I(g,i,o),this.measurementServiceSource=ee(t),ne(f),E.subscribe(E.EVENTS.CUSTOM_IMAGE_LOAD_PERFORMED,(e=>{for(const t of e.entries()){const[e,n]=t,o=v.getCornerstoneViewport(e),r=v.getViewportInfo(e),{lutPresentationStore:i,positionPresentationStore:a}=b.getState(),{presentationIds:s}=r.getViewportOptions(),l={positionPresentation:a[s?.positionPresentationId],lutPresentation:i[s?.lutPresentationId]};v.setVolumesForViewport(o,n,l)}})),Ie({cornerstoneViewportService:v,customizationService:p,commandsManager:n}),ve({customizationService:p,commandsManager:n});const C=e=>{const{element:t}=e.detail;y.getActiveTools().forEach((o=>{const r=y.getNestedButton(o),i=r?.listeners?.[e.type];n.run(i,{element:t,evt:e})}))},M=e=>{const{element:t}=e.detail,{viewportId:n,renderingEngineId:o}=a.getEnabledElement(t),r=s.ToolGroupManager.getToolGroupForViewport(n,o);if(!r||!r._toolInstances?.Crosshairs)return;const i=r._toolInstances.Crosshairs.mode;i===s.Enums.ToolModes.Active?r.setToolActive("Crosshairs"):i===s.Enums.ToolModes.Passive?r.setToolPassive("Crosshairs"):i===s.Enums.ToolModes.Enabled&&r.setToolEnabled("Crosshairs")};a.eventTarget.addEventListener(a.EVENTS.STACK_VIEWPORT_NEW_STACK,(e=>{const{element:t}=e.detail;s.utilities.stackContextPrefetch.enable(t)})),a.eventTarget.addEventListener(a.EVENTS.ELEMENT_ENABLED,function(e){const{element:t}=e.detail;t.addEventListener(a.EVENTS.CAMERA_RESET,M),a.eventTarget.addEventListener(a.EVENTS.STACK_VIEWPORT_NEW_STACK,C),function(e){let{element:t}=e;we.find((e=>l.cM.timingKeys[e]))&&(ye.viewportsWaiting+=1,t.addEventListener(a.EVENTS.IMAGE_RENDERED,Te))}({element:t,eventTarget:a.eventTarget})}.bind(null)),a.eventTarget.addEventListener(a.EVENTS.ELEMENT_DISABLED,function(e){const{element:t}=e.detail;t.removeEventListener(a.EVENTS.CAMERA_RESET,M)}.bind(null)),D.subscribe(D.EVENTS.ACTIVE_VIEWPORT_ID_CHANGED,(e=>{const{viewportId:t}=e,o=w.getToolGroupForViewport(t);y.getActiveTools().forEach((r=>{if(!o?._toolInstances?.[r])return;if(!(o._toolInstances[r].mode===s.Enums.ToolModes.Enabled))return;const i=y.getNestedButton(r),a=i?.listeners?.[e.type];n.run(a,{viewportId:t,evt:e})}))}))}function be(){return i.createElement("div",null,i.createElement("p",null,"Your computer does not have enough GPU power to support the default GPU rendering mode. OHIF has switched to CPU rendering mode. Please note that CPU rendering does not support all features such as Volume Rendering, Multiplanar Reconstruction, and Segmentation Overlays."))}window.cornerstone=a,window.cornerstoneTools=s;var Oe=n(74834),Ne=n(3827),Ae=n.n(Ne),Ce=n(44921),Me=n.n(Ce);const Ue={PROGRESS:"event:DicomFileUploader:progress"};let _e=function(e){return e[e.NotStarted=0]="NotStarted",e[e.InProgress=1]="InProgress",e[e.Success=2]="Success",e[e.Failed=3]="Failed",e[e.Cancelled=4]="Cancelled",e}({});class Ve{constructor(e,t){this.message=void 0,this.status=void 0,this.message=t,this.status=e}}class Re extends l.hC{constructor(e,t){super(Ue),this._file=void 0,this._fileId=void 0,this._dataSource=void 0,this._loadPromise=void 0,this._abortController=new AbortController,this._status=_e.NotStarted,this._percentComplete=0,this._file=e,this._fileId=m().wadouri.fileManager.add(e),this._dataSource=t}getFileId(){return this._fileId}getFileName(){return this._file.name}getFileSize(){return this._file.size}cancel(){this._abortController.abort()}getStatus(){return this._status}getPercentComplete(){return this._percentComplete}async load(){return this._loadPromise||(this._loadPromise=new Promise(((e,t)=>{const n={progress:e=>{e.lengthComputable&&(this._status=_e.InProgress,this._percentComplete=Math.round(100*e.loaded/e.total),this._broadcastEvent(Ue.PROGRESS,{fileId:this._fileId,percentComplete:this._percentComplete}))},timeout:()=>{this._reject(t,new Ve(_e.Failed,"The request timed out."))},abort:()=>{this._reject(t,new Ve(_e.Cancelled,"Cancelled"))},error:()=>{this._reject(t,new Ve(_e.Failed,"The request failed."))}};m().wadouri.loadFileRequest(this._fileId).then((o=>{if(this._abortController.signal.aborted)return void this._reject(t,new Ve(_e.Cancelled,"Cancelled"));if(!this._checkDicomFile(o))return void this._reject(t,new Ve(_e.Failed,"Not a valid DICOM file."));const r=new XMLHttpRequest;return this._addRequestCallbacks(r,n),this._dataSource.store.dicom(o,r).then((()=>{this._status=_e.Success,e()})).catch((e=>{this._reject(t,e)}))})).catch((e=>{this._reject(t,e)}))}))),this._loadPromise}_isRejected(){return this._status===_e.Failed||this._status===_e.Cancelled}_reject(e,t){if(!this._isRejected()){if(t instanceof Ve)return this._status=t.status,void e(t);this._status=_e.Failed,t.message?e(new Ve(_e.Failed,t.message)):e(new Ve(_e.Failed,t))}}_addRequestCallbacks(e,t){const n=()=>e.abort();this._abortController.signal.addEventListener("abort",n);for(const[n,o]of Object.entries(t))e.upload.addEventListener(n,o);const o=()=>{this._abortController.signal.removeEventListener("abort",n);for(const[n,o]of Object.entries(t))e.upload.removeEventListener(n,o);e.removeEventListener("loadend",o)};e.addEventListener("loadend",o)}_checkDicomFile(e){if(e.length<=132)return!1;const t=new Uint8Array(e.slice(128,132));return Array.from("DICM").every(((e,n)=>e.charCodeAt(0)===t[n]))}}const Pe=(0,i.memo)((e=>{let{dicomFileUploader:t}=e;const[n,o]=(0,i.useState)(t.getPercentComplete()),[r,a]=(0,i.useState)(""),[s,l]=(0,i.useState)(t.getStatus()),c=(0,i.useCallback)((()=>s===_e.Failed||s===_e.Cancelled||s===_e.Success),[s]);(0,i.useEffect)((()=>{const e=t.subscribe(Ue.PROGRESS,(e=>{o(e.percentComplete)}));return t.load().catch((e=>{l(e.status),a(e.message??"")})).finally((()=>l(t.getStatus()))),()=>e.unsubscribe()}),[]);const d=(0,i.useCallback)((()=>{t.cancel()}),[]);return i.createElement("div",{className:"min-h-14 border-secondary-light flex w-full items-center overflow-hidden border-b p-2.5 text-lg"},i.createElement("div",{className:"self-top flex w-0 shrink grow flex-col gap-1"},i.createElement("div",{className:"flex gap-4"},i.createElement("div",{className:"flex w-6 shrink-0 items-center justify-center"},(()=>{switch(t.getStatus()){case _e.Success:return i.createElement(S.JO,{name:"status-tracked",className:"text-primary-light"});case _e.InProgress:return i.createElement(S.JO,{name:"icon-transferring"});case _e.Failed:return i.createElement(S.JO,{name:"icon-alert-small"});case _e.Cancelled:return i.createElement(S.JO,{name:"icon-alert-outline"});default:return i.createElement(i.Fragment,null)}})()),i.createElement("div",{className:"overflow-hidden text-ellipsis whitespace-nowrap"},t.getFileName())),r&&i.createElement("div",{className:"pl-10"},r)),i.createElement("div",{className:"flex w-24 items-center"},!c()&&i.createElement(i.Fragment,null,t.getStatus()===_e.InProgress&&i.createElement("div",{className:"w-10 text-right"},n,"%"),i.createElement("div",{className:"ml-auto flex cursor-pointer"},i.createElement(S.JO,{className:"text-primary-active self-center",name:"close",onClick:d})))))}));Pe.propTypes={dicomFileUploader:Ae().instanceOf(Re).isRequired};const Le=Pe,Fe=1e3,xe=6e4,Ge=36e5,ke=15e3,$e="text-ellipsis whitespace-nowrap overflow-hidden";function Be(e){let{dicomFileUploaderArr:t,onComplete:n}=e;const[o]=(0,i.useState)(t.reduce(((e,t)=>e+t.getFileSize()),0)),r=(0,i.useRef)(0),a=(0,i.useRef)(0),[s,l]=(0,i.useState)(null),[c,d]=(0,i.useState)(0),[m,u]=(0,i.useState)(0),[g,p]=(0,i.useState)(0),[h,I]=(0,i.useState)(!1),f=(0,i.useRef)();(0,i.useEffect)((()=>{let e,t=0,n=Date.now();const i=()=>{const s=r.current-t,l=Date.now(),c=l-n;a.current=s/c,t=r.current,n=l,o-r.current>0&&(e=a.current>=75?setTimeout(i,ke):setTimeout(i,3e4))};return e=setTimeout(i,ke),()=>{clearTimeout(e)}}),[]),(0,i.useEffect)((()=>{let e=null;const n=t.map((t=>{let n=0;const i=i=>{const s=n;if(n=Math.round(i/100*t.getFileSize()),r.current=Math.min(o,r.current-s+n),d(r.current/o*100),0!==a.current){const t=o-r.current,n=Math.round(t/a.current);if(null===e)return e=n,void l(e);if(n<xe){const t=Math.ceil(e/Fe),o=Math.ceil(n/Fe)-t;return void((o<0||o>2)&&(e=n,l(e)))}if(n<Ge){const t=Math.ceil(e/xe),o=Math.ceil(n/xe)-t;return void((o<0||o>2)&&(e=n,l(e)))}e=n,l(e)}};return t.load().catch((e=>{e.status===_e.Failed&&p((e=>e+1))})).finally((()=>{i(100),u((e=>e+1))})),t.subscribe(Ue.PROGRESS,(e=>{i(e.percentComplete)}))}));return()=>{n.forEach((e=>e.unsubscribe()))}}),[]);const v=(0,i.useCallback)((async()=>{for(const e of t){new Promise(((t,n)=>{setTimeout((()=>{e.cancel(),t()}),0)}))}}),[]),E=(0,i.useCallback)((()=>{if(null==s)return"";if(s<xe){const e=Math.ceil(s/Fe);return`${e} ${1===e?"second":"seconds"}`}if(s<Ge){const e=Math.ceil(s/xe);return`${e} ${1===e?"minute":"minutes"}`}const e=Math.ceil(s/Ge);return`${e} ${1===e?"hour":"hours"}`}),[s]),w=(0,i.useCallback)((()=>Math.min(100,Math.round(c))),[c]),y=(0,i.useCallback)((()=>w()<1&&(f?.current?.offsetWidth??0)*(c/100)<1),[w,c]),T=(0,i.useCallback)((()=>({width:`${2*t.length.toString().length+4}ch`})),[]),D=()=>i.createElement("div",{className:"ml-auto flex w-6 justify-center"},g>0&&i.createElement("div",{onClick:()=>I((e=>!e))},i.createElement(S.JO,{className:"cursor-pointer",name:"icon-status-alert"})));return i.createElement("div",{className:"flex grow flex-col"},i.createElement("div",{className:"bg-primary-dark flex h-14 items-center px-1 pb-4 text-lg"},m===t.length?i.createElement(i.Fragment,null,i.createElement("span",{className:$e},`${t.length} ${t.length>1?"files":"file"} completed.`),i.createElement(S.zx,{disabled:!1,className:"ml-auto",onClick:n},"Close")):i.createElement(i.Fragment,null,i.createElement("span",{style:T(),className:Me()($e,"text-end")},`${m} of ${t.length}`," "),i.createElement("span",{className:$e}," files completed."," "),i.createElement("span",{className:$e},s?`Less than ${E()} remaining. `:""),i.createElement("span",{className:Me()($e,"text-primary-active hover:text-primary-light active:text-aqua-pale ml-auto cursor-pointer"),onClick:v},"Cancel All Uploads"))),i.createElement("div",{className:"flex grow flex-col overflow-hidden bg-black text-lg"},i.createElement("div",{className:"ohif-scrollbar border-secondary-light overflow-y-scroll border-b px-2"},i.createElement("div",{className:"min-h-14 flex w-full items-center p-2.5"},m===t.length?i.createElement(i.Fragment,null,i.createElement("div",{className:"text-primary-light text-xl"},g>0?`Completed with ${g} ${g>1?"errors":"error"}!`:"Completed!"),D()):i.createElement(i.Fragment,null,i.createElement("div",{ref:f,className:"flex-grow"},i.createElement(S.YE,{progress:y()?void 0:Math.min(100,c)})),i.createElement("div",{className:"ml-1 flex w-24 items-center"},i.createElement("div",{className:"w-10 text-right"},`${w()}%`),D())))),i.createElement("div",{className:"ohif-scrollbar h-1 grow overflow-y-scroll px-2"},t.filter((e=>!h||e.getStatus()===_e.Failed)).map((e=>i.createElement(Le,{key:e.getFileId(),dicomFileUploader:e}))))))}Be.propTypes={dicomFileUploaderArr:Ae().arrayOf(Ae().instanceOf(Re)).isRequired,onComplete:Ae().func.isRequired};const ze=Be;function je(){return je=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},je.apply(this,arguments)}function We(e){let{dataSource:t,onComplete:n,onStarted:o}=e;const r="min-h-[480px] flex flex-col bg-black select-none",[a,s]=(0,i.useState)([]),l=(0,i.useCallback)((async e=>{o(),s(e.map((e=>new Re(e,t))))}),[]);return i.createElement(i.Fragment,null,a.length?i.createElement("div",{className:Me()("h-[calc(100vh-300px)]",r)},i.createElement(ze,{dicomFileUploaderArr:Array.from(a),onComplete:n})):i.createElement("div",{className:Me()("h-[480px]",r)},i.createElement(Oe.Z,{onDrop:e=>{l(e)},noClick:!0},(e=>{let{getRootProps:t}=e;return i.createElement("div",je({},t(),{className:"dicom-upload-drop-area-border-dash m-5 flex h-full flex-col items-center justify-center"}),i.createElement("div",{className:"flex gap-3"},i.createElement(Oe.Z,{onDrop:l,noDrag:!0},(e=>{let{getRootProps:t,getInputProps:n}=e;return i.createElement("div",t(),i.createElement(S.zx,{disabled:!1,onClick:()=>{}},"Add files",i.createElement("input",n())))})),i.createElement(Oe.Z,{onDrop:l,noDrag:!0},(e=>{let{getRootProps:t,getInputProps:n}=e;return i.createElement("div",t(),i.createElement(S.zx,{type:S.LZ.dt.secondary,disabled:!1,onClick:()=>{}},"Add folder",i.createElement("input",je({},n(),{webkitdirectory:"true",mozdirectory:"true"}))))}))),i.createElement("div",{className:"pt-5"},"or drag images or folders here"),i.createElement("div",{className:"text-aqua-pale pt-3 text-lg"},"(DICOM files supported)"))}))))}We.propTypes={dataSource:Ae().object.isRequired,onComplete:Ae().func.isRequired,onStarted:Ae().func.isRequired};const qe=We,He={active:[{toolName:A.WindowLevel,bindings:[{mouseButton:s.Enums.MouseBindings.Primary}]},{toolName:A.Pan,bindings:[{mouseButton:s.Enums.MouseBindings.Auxiliary}]},{toolName:A.Zoom,bindings:[{mouseButton:s.Enums.MouseBindings.Secondary}]},{toolName:A.StackScrollMouseWheel,bindings:[]}],enabled:[{toolName:A.SegmentationDisplay}]};const Ze=function(){return[{name:"cornerstoneDicomUploadComponent",value:{id:"dicomUploadComponent",component:qe}},{name:"default",value:[{id:"cornerstone.overlayViewportTools",tools:He}]}]};var Ye=n(76010);const Ke=512,Je=1e4,Qe="cornerstone-viewport-download-form",Xe=e=>{let{onClose:t,activeViewportId:n,cornerstoneViewportService:o}=e;const r=(0,v.K8)(n),l=r?.element,c=(0,a.getEnabledElement)(l),{viewportId:d,renderingEngineId:m}=c,u=s.ToolGroupManager.getToolGroupForViewport(d,m),g=Object.keys(u.toolOptions).reduce(((e,t)=>{const n=u.toolOptions[t],{mode:o,bindings:r}=n;return{...e,[t]:{mode:o,bindings:r}}}),{});(0,i.useEffect)((()=>()=>{Object.keys(g).forEach((e=>{const{mode:t,bindings:n}=g[e];u.setToolMode(e,t,{bindings:n})}))}),[]);return i.createElement(S.mQ,{onClose:t,minimumSize:100,maximumSize:Je,defaultSize:Ke,canvasClass:"cornerstone-canvas",activeViewportElement:l,enableViewport:e=>{if(e){const{renderingEngine:t,viewport:n}=(0,a.getEnabledElement)(l),o={viewportId:Qe,element:e,type:n.type,defaultOptions:{background:n.defaultOptions.background,orientation:n.defaultOptions.orientation}};t.enableElement(o)}},disableViewport:e=>{if(e){const{renderingEngine:t}=(0,a.getEnabledElement)(e);return new Promise((e=>{t.disableElement(Qe)}))}},updateViewportPreview:(e,t,n)=>new Promise((t=>{const o=(0,a.getEnabledElement)(e),{viewport:r,renderingEngine:i}=o;i.resize(),r.render(),e.addEventListener(a.Enums.Events.IMAGE_RENDERED,(function o(r){const i=(0,a.getEnabledElement)(r.target),{viewport:s}=i,{element:l}=s,c=(0,a.getOrCreateCanvas)(l),d="image/"+n,m=c.toDataURL(d,1);let u=l.offsetHeight,g=l.offsetWidth;if(u>Ke||g>Ke){const e=Ke/Math.max(u,g);g*=e,u*=e}t({dataUrl:m,width:u,height:g}),e.removeEventListener(a.Enums.Events.IMAGE_RENDERED,o)}))})),loadImage:(e,t,n,r)=>new Promise((i=>{if(e&&t){const t=(0,a.getEnabledElement)(e);if(!t)return;const{viewport:s}=t,l=o.getRenderingEngine().getViewport(Qe);if(l instanceof a.StackViewport){const e=s.getCurrentImageId(),t=s.getProperties();l.setStack([e]).then((()=>{try{l.setProperties(t);const e=Math.min(n||image.width,Je),o=Math.min(r||image.height,Je);i({width:e,height:o})}catch(e){console.warn("Unable to set properties",e)}}))}else if(l instanceof a.VolumeViewport){s.getActors().forEach((e=>{l.addActor(e)})),l.setCamera(s.getCamera()),l.render();const e=Math.min(n||image.width,Je),t=Math.min(r||image.height,Je);i({width:e,height:t})}}})),toggleAnnotations:(e,t,n)=>{const o=(0,a.getEnabledElement)(n),r=(0,a.getEnabledElement)(t),{viewportId:i,renderingEngineId:l}=o,{viewportId:c}=r;if(!o||!r)return;const d=s.ToolGroupManager.getToolGroupForViewport(i,l);d.addViewport(c,l),Object.keys(d._toolInstances).forEach((t=>{if(e&&"Crosshairs"!==t)try{d.setToolEnabled(t)}catch(e){console.log(e)}else d.setToolDisabled(t)}))},downloadBlob:(e,t)=>{const n=`${e}.${t}`,o=document.querySelector(`div[data-viewport-uid="${Qe}"]`);(0,Ye.Z)(o).then((e=>{const o=document.createElement("a");o.download=n,o.href=e.toDataURL(t,1),o.click()}))}})};Xe.propTypes={onClose:Ae().func,activeViewportId:Ae().string.isRequired};const et=Xe,tt="stackImageSync";function nt(e){let{toggledState:t,servicesManager:n,viewports:o}=e;if(!t)return function(e,t){const{syncGroupService:n,viewportGridService:o,displaySetService:r,cornerstoneViewportService:i}=t.services,a=ot(o,r);a.forEach((t=>{const{viewportId:o}=t.viewportOptions,r=i.getCornerstoneViewport(o);r&&n.removeViewportFromSyncGroup(r.id,r.getRenderingEngine().id,e)}))}(tt,n);const{syncGroupService:r,viewportGridService:i,displaySetService:a,cornerstoneViewportService:s}=n.services;(o||ot(i,a)).forEach((e=>{const{viewportId:t}=e.viewportOptions,n=s.getCornerstoneViewport(t);n&&r.addViewportToSyncGroup(t,n.getRenderingEngine().id,{type:"stackimage",id:tt,source:!0,target:!0})}))}function ot(e,t){let{viewports:n}=e.getState();return n=[...n.values()],n=n.filter((e=>e.displaySetInstanceUIDs&&e.displaySetInstanceUIDs.length)),n=n.filter((e=>{const{displaySetInstanceUIDs:n}=e;for(const e of n){const n=t.getDisplaySetByUID(e);return!(!n||!n.isReconstructable)}})),n}const rt=function(e){let{servicesManager:t,commandsManager:n}=e;const{viewportGridService:o,toolGroupService:r,cineService:i,toolbarService:l,uiDialogService:c,cornerstoneViewportService:d,uiNotificationService:m,measurementService:u}=t.services,{measurementServiceSource:g}=this;function p(){return E(o)}const h={showCornerstoneContextMenu:e=>{const t=p()?.viewport?.element,o={...e,element:t},{useSelectedAnnotation:r,nearbyToolData:i,event:a}=o;if(r&&!i){const e=P();if(!(!o.allowedSelectedTools||o.allowedSelectedTools.includes(e?.metadata?.toolName)))return;o.nearbyToolData=e}o.defaultPointsPosition=[],o.selectorProps={toolName:o.nearbyToolData?.metadata?.toolName,value:o.nearbyToolData,uid:o.nearbyToolData?.annotationUID,nearbyToolData:o.nearbyToolData,event:a,...o.selectorProps},n.run(e,o)},getNearbyToolData(e){let{nearbyToolData:t,element:n,canvasCoordinates:o}=e;return t??s.utilities.getAnnotationNearPoint(n,o)},getNearbyAnnotation(e){let{element:t,canvasCoordinates:n}=e;const o=h.getNearbyToolData({nearbyToolData:null,element:t,canvasCoordinates:n});return o?.metadata?.toolName&&(e=>{const n=(0,a.getEnabledElement)(t);if(!n)return;const{renderingEngineId:o,viewportId:r}=n,i=s.ToolGroupManager.getToolGroupForViewport(r,o).getToolInstance(e);return i?.constructor?.isAnnotation??!0})(o.metadata.toolName)?o:null},deleteMeasurement:e=>{let{uid:t}=e;t&&g.remove(t)},setMeasurementLabel:e=>{let{uid:t}=e;const n=u.getMeasurement(t);f(c,n,((e,t)=>{if("cancel"===t)return;const o=Object.assign({},n,{label:e});u.update(o.uid,o,!0)}),!1)},updateMeasurement:e=>{const{code:t,uid:n,textLabel:o,label:r}=e,i={...u.getMeasurement(n)};if(void 0!==o&&(i.label=o),void 0!==t){const e=t.type||"finding";if(t.ref&&!t.CodeValue){const e=t.ref.indexOf(":");t.CodeValue=t.ref.substring(e+1),t.CodeMeaning=t.text||r,t.CodingSchemeDesignator=t.ref.substring(0,e)}i[e]=t,"finding"!==e&&(i.findingSites?(i.findingSites=i.findingSites.filter((t=>t.type!==e)),i.findingSites.push(t)):i.findingSites=[t])}u.update(i.uid,i,!0)},getActiveViewportEnabledElement:p,setViewportActive:e=>{let{viewportId:t}=e;d.getViewportInfo(t)?o.setActiveViewportId(t):console.warn("No viewport found for viewportId:",t)},arrowTextCallback:e=>{let{callback:t,data:n}=e;f(c,n,t)},cleanUpCrosshairs:()=>{const e=r.getToolGroup(null);e._toolInstances?.Crosshairs?.mode===s.Enums.ToolModes.Active&&h.toolbarServiceRecordInteraction({interactionType:"tool",commands:[{commandOptions:{toolName:"WindowLevel"},context:"CORNERSTONE"}]})},toggleCine:()=>{const{viewports:e}=o.getState(),{isCineEnabled:t}=i.getState();i.setIsCineEnabled(!t),l.setButton("Cine",{props:{isActive:!t}}),e.forEach(((e,t)=>i.setCine({id:t,isPlaying:!1})))},setWindowLevel(e){let{window:t,level:n,toolGroupId:o}=e;const i=Number(t),s=Number(n),{viewportId:l}=p(),c=r.getToolGroupForViewport(l);if(o&&o!==c)return;const m=d.getRenderingEngine().getViewport(l),{lower:u,upper:g}=a.utilities.windowLevel.toLowHighRange(i,s);m.setProperties({voiRange:{upper:g,lower:u}}),m.render()},toolbarServiceRecordInteraction:e=>{l.recordInteraction(e)},setToolbarToggled:e=>{l.setToggled(e.toolId,e.isActive??!0)},setToolActive:e=>{let{toolName:t,toolGroupId:n=null,toggledState:i}=e;if("Crosshairs"===t){if(!r.getToolGroup(null)._toolInstances.Crosshairs)throw m.show({title:"Crosshairs",message:"You need to be in a MPR view to use Crosshairs. Click on MPR button in the toolbar to activate it.",type:"info",duration:3e3}),new Error("Crosshairs tool is not available in this viewport")}const{viewports:a}=o.getState();if(!a.size)return;const l=r.getToolGroup(n);if(!l)return;if(!l.getToolInstance(t))throw m.show({title:`${t} tool`,message:`The ${t} tool is not available in this viewport.`,type:"info",duration:3e3}),new Error(`ToolGroup ${l.id} does not have this tool.`);const c=l.getActivePrimaryMouseButtonTool();c&&("Crosshairs"===c?l.setToolDisabled(c):l.setToolPassive(c)),null==i?l.setToolActive(t,{bindings:[{mouseButton:s.Enums.MouseBindings.Primary}]}):i?l.setToolEnabled(t):l.setToolDisabled(t)},showDownloadViewportModal:()=>{const{activeViewportId:e}=o.getState();if(!d.getCornerstoneViewport(e))return void m.show({title:"Download Image",message:"Image cannot be downloaded",type:"error"});const{uiModalService:n}=t.services;n&&n.show({content:et,title:"Download High Quality Image",contentProps:{activeViewportId:e,onClose:n.hide,cornerstoneViewportService:d}})},rotateViewport:e=>{let{rotation:t}=e;const n=p();if(!n)return;const{viewport:o}=n;if(o instanceof a.StackViewport){const{rotation:e}=o.getProperties(),n=(e+t)%360;o.setProperties({rotation:n}),o.render()}},flipViewportHorizontal:()=>{const e=p();if(!e)return;const{viewport:t}=e;if(t instanceof a.StackViewport){const{flipHorizontal:e}=t.getCamera();t.setCamera({flipHorizontal:!e}),t.render()}},flipViewportVertical:()=>{const e=p();if(!e)return;const{viewport:t}=e;if(t instanceof a.StackViewport){const{flipVertical:e}=t.getCamera();t.setCamera({flipVertical:!e}),t.render()}},invertViewport:e=>{let t,{element:n}=e;if(t=void 0===n?p():n,!t)return;const{viewport:o}=t,{invert:r}=o.getProperties();o.setProperties({invert:!r}),o.render()},resetViewport:()=>{const e=p();if(!e)return;const{viewport:t}=e;a.StackViewport,t.resetProperties(),t.resetCamera(),t.render()},scaleViewport:e=>{let{direction:t}=e;const n=p(),o=t>0?.9:1.1;if(!n)return;const{viewport:r}=n;if(r instanceof a.StackViewport)if(t){const{parallelScale:e}=r.getCamera();r.setCamera({parallelScale:e*o}),r.render()}else r.resetCamera(),r.render()},jumpToImage:e=>{let t,{imageIndex:n,viewport:o}=e;if(o)t=d.getCornerstoneViewport(o.id);else{const e=p();if(!e)return;t=e.viewport}let r=0;if(t instanceof a.StackViewport)r=t.getImageIds().length;else{if(!(t instanceof a.VolumeViewport))throw new Error("Unsupported viewport type");r=a.utilities.getImageSliceDataForVolumeViewport(t).numberOfSlices}const i=n<0?r+n:n;if(i>=r||i<0)throw new Error(`Can't jump to ${n}`);const l={imageIndex:i};s.utilities.jumpToSlice(t.element,l)},scroll:e=>{let{direction:t}=e;const n=p();if(!n)return;const{viewport:o}=n,r={delta:t};s.utilities.scroll(o,r)},setViewportColormap:e=>{let{viewportId:t,displaySetInstanceUID:n,colormap:o,immediate:r=!1}=e;const i=d.getCornerstoneViewport(t),a=i.getActors().find((e=>e.uid.includes(n))),{actor:s,uid:l}=a;i.setProperties({colormap:o,volumeActor:s},l),r&&i.render()},changeActiveViewport:e=>{let{direction:t=1}=e;const{activeViewportId:n,viewports:r}=o.getState(),i=Array.from(r.keys()),a=(i.indexOf(n)+t+i.length)%i.length;o.setActiveViewportId(i[a])},toggleStackImageSync:e=>{let{toggledState:n}=e;nt({servicesManager:t,toggledState:n})},setSourceViewportForReferenceLinesTool:e=>{let{toggledState:t,viewportId:n}=e;if(!n){const{activeViewportId:e}=o.getState();n=e}r.getToolGroupForViewport(n).setToolConfiguration(s.ReferenceLinesTool.toolName,{sourceViewportId:n},!0)},storePresentation:e=>{let{viewportId:t}=e;d.storePresentation({viewportId:t})}},I={showCornerstoneContextMenu:{commandFn:h.showCornerstoneContextMenu,storeContexts:[],options:{menuCustomizationId:"measurementsContextMenu",commands:[{commandName:"showContextMenu"}]}},getNearbyToolData:{commandFn:h.getNearbyToolData},getNearbyAnnotation:{commandFn:h.getNearbyAnnotation,storeContexts:[],options:{}},deleteMeasurement:{commandFn:h.deleteMeasurement},setMeasurementLabel:{commandFn:h.setMeasurementLabel},updateMeasurement:{commandFn:h.updateMeasurement},setWindowLevel:{commandFn:h.setWindowLevel},toolbarServiceRecordInteraction:{commandFn:h.toolbarServiceRecordInteraction},setToolActive:{commandFn:h.setToolActive},rotateViewportCW:{commandFn:h.rotateViewport,options:{rotation:90}},rotateViewportCCW:{commandFn:h.rotateViewport,options:{rotation:-90}},incrementActiveViewport:{commandFn:h.changeActiveViewport},decrementActiveViewport:{commandFn:h.changeActiveViewport,options:{direction:-1}},flipViewportHorizontal:{commandFn:h.flipViewportHorizontal},flipViewportVertical:{commandFn:h.flipViewportVertical},invertViewport:{commandFn:h.invertViewport},resetViewport:{commandFn:h.resetViewport},scaleUpViewport:{commandFn:h.scaleViewport,options:{direction:1}},scaleDownViewport:{commandFn:h.scaleViewport,options:{direction:-1}},fitViewportToWindow:{commandFn:h.scaleViewport,options:{direction:0}},nextImage:{commandFn:h.scroll,options:{direction:1}},previousImage:{commandFn:h.scroll,options:{direction:-1}},firstImage:{commandFn:h.jumpToImage,options:{imageIndex:0}},lastImage:{commandFn:h.jumpToImage,options:{imageIndex:-1}},jumpToImage:{commandFn:h.jumpToImage},showDownloadViewportModal:{commandFn:h.showDownloadViewportModal},toggleCine:{commandFn:h.toggleCine},arrowTextCallback:{commandFn:h.arrowTextCallback},setViewportActive:{commandFn:h.setViewportActive},setViewportColormap:{commandFn:h.setViewportColormap},toggleStackImageSync:{commandFn:h.toggleStackImageSync},setSourceViewportForReferenceLinesTool:{commandFn:h.setSourceViewportForReferenceLinesTool},storePresentation:{commandFn:h.storePresentation},setToolbarToggled:{commandFn:h.setToolbarToggled},cleanUpCrosshairs:{commandFn:h.cleanUpCrosshairs}};return{actions:h,definitions:I,defaultContext:"CORNERSTONE"}},it={id:"mpr",name:"Multi-Planar Reconstruction",locked:!0,createdDate:"2021-02-23",modifiedDate:"2023-08-15",availableTo:{},editableBy:{},numberOfPriorsReferenced:0,protocolMatchingRules:[],imageLoadStrategy:"nth",callbacks:{onLayoutChange:[{commandName:"toggleHangingProtocol",commandOptions:{protocolId:"mpr"},context:"DEFAULT"}],onProtocolExit:[{commandName:"cleanUpCrosshairs"}]},displaySetSelectors:{activeDisplaySet:{seriesMatchingRules:[{weight:1,attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0}]}},stages:[{name:"MPR 1x3",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3,layoutOptions:[{x:0,y:0,width:1/3,height:1},{x:1/3,y:0,width:1/3,height:1},{x:2/3,y:0,width:1/3,height:1}]}},viewports:[{viewportOptions:{viewportId:"mpr-axial",toolGroupId:"mpr",viewportType:"volume",orientation:"axial",initialImageOptions:{preset:"middle"},syncGroups:[{type:"voi",id:"mpr",source:!0,target:!0}]},displaySets:[{id:"activeDisplaySet"}]},{viewportOptions:{viewportId:"mpr-sagittal",toolGroupId:"mpr",viewportType:"volume",orientation:"sagittal",initialImageOptions:{preset:"middle"},syncGroups:[{type:"voi",id:"mpr",source:!0,target:!0}]},displaySets:[{id:"activeDisplaySet"}]},{viewportOptions:{viewportId:"mpr-coronal",toolGroupId:"mpr",viewportType:"volume",orientation:"coronal",initialImageOptions:{preset:"middle"},syncGroups:[{type:"voi",id:"mpr",source:!0,target:!0}]},displaySets:[{id:"activeDisplaySet"}]}]}]},at={id:"mprAnd3DVolumeViewport",locked:!0,name:"mpr",createdDate:"2023-03-15T10:29:44.894Z",modifiedDate:"2023-03-15T10:29:44.894Z",availableTo:{},editableBy:{},protocolMatchingRules:[],imageLoadStrategy:"interleaveCenter",displaySetSelectors:{mprDisplaySet:{seriesMatchingRules:[{weight:1,attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"Modality",constraint:{equals:{value:"CT"}},required:!0}]}},stages:[{id:"mpr3Stage",name:"mpr",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[{viewportOptions:{toolGroupId:"mpr",viewportType:"volume",orientation:"axial",initialImageOptions:{preset:"middle"},syncGroups:[{type:"voi",id:"mpr",source:!0,target:!0}]},displaySets:[{id:"mprDisplaySet"}]},{viewportOptions:{toolGroupId:"volume3d",viewportType:"volume3d",orientation:"coronal",customViewportProps:{hideOverlays:!0}},displaySets:[{id:"mprDisplaySet",options:{displayPreset:"CT-Bone"}}]},{viewportOptions:{toolGroupId:"mpr",viewportType:"volume",orientation:"coronal",initialImageOptions:{preset:"middle"},syncGroups:[{type:"voi",id:"mpr",source:!0,target:!0}]},displaySets:[{id:"mprDisplaySet"}]},{viewportOptions:{toolGroupId:"mpr",viewportType:"volume",orientation:"sagittal",initialImageOptions:{preset:"middle"},syncGroups:[{type:"voi",id:"mpr",source:!0,target:!0}]},displaySets:[{id:"mprDisplaySet"}]}]}]};const st=function(){return[{name:it.id,protocol:it},{name:at.id,protocol:at}]},lt={VIEWPORT_ADDED:"event::cornerstone::toolgroupservice:viewportadded",TOOLGROUP_CREATED:"event::cornerstone::toolgroupservice:toolgroupcreated"};class ct{constructor(e){this.serviceManager=void 0,this.toolGroupIds=new Set,this.listeners=void 0,this.EVENTS=void 0;const{cornerstoneViewportService:t,viewportGridService:n}=e.services;this.cornerstoneViewportService=t,this.viewportGridService=n,this.listeners={},this.EVENTS=lt,Object.assign(this,l.KZ)}onModeExit(){this.destroy()}getToolGroup(e){let t=e;if(!t){const e=E(this.viewportGridService);if(!e)return;const{renderingEngineId:n,viewportId:o}=e,r=s.ToolGroupManager.getToolGroupForViewport(o,n);if(!r)return void console.warn("No tool group found for viewportId:",o,"and renderingEngineId:",n);t=r.id}return s.ToolGroupManager.getToolGroup(t)}getToolGroupIds(){return Array.from(this.toolGroupIds)}getToolGroupForViewport(e){const t=this.cornerstoneViewportService.getRenderingEngine();return s.ToolGroupManager.getToolGroupForViewport(e,t.id)}getActiveToolForViewport(e){const t=this.getToolGroupForViewport(e);if(t)return t.getActivePrimaryMouseButtonTool()}destroy(){s.ToolGroupManager.destroy(),this.toolGroupIds=new Set}destroyToolGroup(e){s.ToolGroupManager.destroyToolGroup(e),this.toolGroupIds.delete(e)}removeViewportFromToolGroup(e,t,n){const o=s.ToolGroupManager.getToolGroupForViewport(e,t);if(!o)return;o.removeViewports(t,e);0===o.getViewportIds().length&&n&&s.ToolGroupManager.destroyToolGroup(o.id)}addViewportToToolGroup(e,t,n){if(n){let o=s.ToolGroupManager.getToolGroup(n);o||(o=this.createToolGroup(n)),o.addViewport(e,t)}else{s.ToolGroupManager.getAllToolGroups().forEach((n=>{n.addViewport(e,t)}))}this._broadcastEvent(lt.VIEWPORT_ADDED,{viewportId:e,toolGroupId:n})}createToolGroup(e){if(this.getToolGroup(e))throw new Error(`ToolGroup ${e} already exists`);const t=s.ToolGroupManager.createToolGroup(e);return this.toolGroupIds.add(e),this._broadcastEvent(lt.TOOLGROUP_CREATED,{toolGroupId:e}),t}addToolsToToolGroup(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const o=s.ToolGroupManager.getToolGroup(e);this._addTools(o,t,n),this._setToolsMode(o,t)}createToolGroupAndAddTools(e,t){const n=this.createToolGroup(e);return this.addToolsToToolGroup(e,t),n}getToolConfiguration(e,t){const n=s.ToolGroupManager.getToolGroup(e);if(!n)return null;const o=n.getToolInstance(t);return o?o.configuration:null}setToolConfiguration(e,t,n){s.ToolGroupManager.getToolGroup(e).getToolInstance(t).configuration=n}_setToolsMode(e,t){const{active:n,passive:o,enabled:r,disabled:i}=t;n&&n.forEach((t=>{let{toolName:n,bindings:o}=t;e.setToolActive(n,{bindings:o})})),o&&o.forEach((t=>{let{toolName:n}=t;e.setToolPassive(n)})),r&&r.forEach((t=>{let{toolName:n}=t;e.setToolEnabled(n)})),i&&i.forEach((t=>{let{toolName:n}=t;e.setToolDisabled(n)}))}_addTools(e,t){const n=t=>{t.forEach((t=>{let{toolName:n,parentTool:o,configuration:r}=t;o?e.addToolInstance(n,o,{...r}):e.addTool(n,{...r})}))};t.active&&n(t.active),t.passive&&n(t.passive),t.enabled&&n(t.enabled),t.disabled&&n(t.disabled)}}ct.REGISTRATION={name:"toolGroupService",altName:"ToolGroupService",create:e=>{let{servicesManager:t}=e;return new ct(t)}};const dt=ct,mt={TOOL_GROUP_CREATED:"event::cornerstone::syncgroupservice:toolgroupcreated"};class ut{constructor(e){this.servicesManager=void 0,this.listeners={},this.EVENTS=void 0,this.synchronizerCreators={cameraposition:s.synchronizers.createCameraPositionSynchronizer,voi:s.synchronizers.createVOISynchronizer,zoompan:s.synchronizers.createZoomPanSynchronizer,stackimage:s.synchronizers.createStackImageSynchronizer},this.servicesManager=e,this.listeners={},this.EVENTS=mt,Object.assign(this,l.KZ)}_createSynchronizer(e,t,n){const o=this.synchronizerCreators[e.toLowerCase()];if(o)return o(t,n);console.warn("Unknown synchronizer type",e,t)}addSynchronizerType(e,t){this.synchronizerCreators[e.toLowerCase()]=t}_getOrCreateSynchronizer(e,t,n){let o=s.SynchronizerManager.getSynchronizer(t);return o||(o=this._createSynchronizer(e,t,n)),o}addViewportToSyncGroup(e,t,n){if(!n)return;(Array.isArray(n)?n:[n]).forEach((n=>{const o=(e=>"string"==typeof e?{type:e}:e)(n),{type:r,target:i=!0,source:a=!0,options:s={},id:l=r}=o,c=this._getOrCreateSynchronizer(r,l,s);c.setOptions(e,s);const d={viewportId:e,renderingEngineId:t};i&&a?c.add(d):a?c.addSource(d):i&&c.addTarget(d)}))}destroy(){s.SynchronizerManager.destroy()}removeViewportFromSyncGroup(e,t,n){const o=s.SynchronizerManager.getAllSynchronizers();(n?o.filter((e=>e.id===n)):o).forEach((n=>{if(!n)return;n.remove({viewportId:e,renderingEngineId:t});const o=n.getSourceViewports(),r=n.getTargetViewports();o.length||r.length||s.SynchronizerManager.destroySynchronizer(n.id)}))}}ut.REGISTRATION={name:"syncGroupService",altName:"SyncGroupService",create:e=>{let{servicesManager:t}=e;return new ut(t)}};const gt=ut;var pt=n(11677),ht=n.n(pt),It=n(10311),St=n.n(It);function ft(e,t){const n=1-t;return e<1/4?4*Math.pow(2*e,3)*n+t:e<.5?(1-Math.pow(-4*e+2,3)/2)*n+t:e<3/4?(1-Math.pow(4*e-2,3)/2)*n+t:-4*Math.pow(2*e-2,3)*n+t}const{COLOR_LUT:vt}=s.CONSTANTS,Et=s.Enums.SegmentationRepresentations.Labelmap,wt=s.Enums.SegmentationRepresentations.Contour,yt={SEGMENTATION_UPDATED:"event::segmentation_updated",SEGMENTATION_DATA_MODIFIED:"event::segmentation_data_modified",SEGMENTATION_ADDED:"event::segmentation_added",SEGMENTATION_REMOVED:"event::segmentation_removed",SEGMENTATION_CONFIGURATION_CHANGED:"event::segmentation_configuration_changed",SEGMENT_LOADING_COMPLETE:"event::segment_loading_complete",SEGMENTATION_LOADING_COMPLETE:"event::segmentation_loading_complete"},Tt={opacity:255,isVisible:!0,isLocked:!1};class Dt extends l.hC{constructor(e){var t;let{servicesManager:n}=e;super(yt),t=this,this.segmentations=void 0,this.servicesManager=void 0,this.highlightIntervalId=null,this.EVENTS=yt,this.destroy=()=>{a.eventTarget.removeEventListener(s.Enums.Events.SEGMENTATION_MODIFIED,this._onSegmentationModifiedFromSource),a.eventTarget.removeEventListener(s.Enums.Events.SEGMENTATION_DATA_MODIFIED,this._onSegmentationDataModified),Object.keys(this.segmentations).forEach((e=>{this._removeSegmentationFromCornerstone(e)})),this.segmentations={},this.listeners={}},this.setSegmentRGBA=(e,t,n,o)=>{const r=this.getSegmentation(e);if(void 0===r)throw new Error(`no segmentation for segmentationId: ${e}`);this._setSegmentOpacity(e,t,n[3],o,true),this._setSegmentColor(e,t,[n[0],n[1],n[2]],o,true),this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})},this.calculateCentroids=(e,t)=>{const n=this.getSegmentation(e),o=this.getLabelmapVolume(e),{dimensions:r,imageData:i}=o,a=o.getScalarData(),[s,l,c]=r,d=s*l,m=t?[t]:n.segments.filter((e=>e?.segmentIndex)).map((e=>e.segmentIndex)),u=new Set(m),g=new Map;for(const e of u)g.set(e,{x:0,y:0,z:0,count:0});let p=0;for(let e=0;e<c;e++)for(let t=0;t<d;t++){const n=a[p++];if(u.has(n)){const o=g.get(n);o.x+=t%s,o.y+=t/s|0,o.z+=e,o.count++}}const h=new Map;for(const[e,t]of g){const n=t.count,o={x:t.x/n,y:t.y/n,z:t.z/n};o.world=i.indexToWorld([o.x,o.y,o.z]),h.set(e,o)}return this.setCentroids(e,h),h},this.setCentroids=(e,t)=>{const n=this.getSegmentation(e),o=this.getLabelmapVolume(e).imageData;n.cachedStats?n.cachedStats.segmentCenter||(n.cachedStats.segmentCenter={}):n.cachedStats={segmentCenter:{}};for(const[e,r]of t){let t=r.world;t&&0!==t.length||(t=o.indexToWorld(r.image)),n.cachedStats.segmentCenter[e]={center:{image:r.image,world:t}}}this.addOrUpdateSegmentation(n,!0,!0)},this.createSegmentationForDisplaySet=async(e,t)=>{const{displaySetService:n}=this.servicesManager.services,o=n.getDisplaySetByUID(e),r=Et,i=this._getVolumeIdForDisplaySet(o),s=t?.segmentationId??`${a.utilities.uuidv4()}`;await a.volumeLoader.createAndCacheDerivedVolume(i,{volumeId:s,targetBuffer:{type:"Uint8Array",sharedArrayBuffer:window.SharedArrayBuffer}});const l={...this._getDefaultSegmentationScheme(),id:s,displaySetInstanceUID:e,label:t?.label,isActive:!0,type:r,FrameOfReferenceUID:t?.FrameOfReferenceUID||o.instances?.[0]?.FrameOfReferenceUID,representationData:{LABELMAP:{volumeId:s,referencedVolumeId:i}}};return this.addOrUpdateSegmentation(l),s},this.toggleSegmentationVisibility=e=>{this._toggleSegmentationVisibility(e,!1)},this.addSegmentationRepresentationToToolGroup=async function(e,n){let o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:s.Enums.SegmentationRepresentations.Labelmap,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];const a=t.getSegmentation(n);if(!a)throw new Error(`Segmentation with segmentationId ${n} not found.`);o&&(a.hydrated=!0);const{colorLUTIndex:l}=a,c=await s.segmentation.addSegmentationRepresentations(e,[{segmentationId:n,type:r}]);t._setActiveSegmentationForToolGroup(n,e,c[0]),s.segmentation.config.color.setColorLUT(e,c[0],l);for(const o of a.segments){if(null==o)continue;const{segmentIndex:r,color:i,isLocked:a,isVisible:s,opacity:l}=o,c=!0;void 0!==i&&t._setSegmentColor(n,r,i,e,c),void 0!==l&&t._setSegmentOpacity(n,r,l,e,c),void 0!==s&&t._setSegmentVisibility(n,r,s,e,c),a&&t._setSegmentLocked(n,r,a,c)}i||t._broadcastEvent(t.EVENTS.SEGMENTATION_UPDATED,{segmentation:a})},this.setSegmentRGBAColor=(e,t,n,o)=>{const r=this.getSegmentation(e);if(void 0===r)throw new Error(`no segmentation for segmentationId: ${e}`);this._setSegmentOpacity(e,t,n[3],o,!0),this._setSegmentColor(e,t,[n[0],n[1],n[2]],o,!0),this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})},this.getToolGroupIdsWithSegmentation=e=>s.segmentation.state.getToolGroupIdsWithSegmentation(e),this.hydrateSegmentation=function(e){let n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const o=t.getSegmentation(e);if(!o)throw new Error(`Segmentation with segmentationId ${e} not found.`);o.hydrated=!0,t._setDisplaySetIsHydrated(e,!0),n||t._broadcastEvent(t.EVENTS.SEGMENTATION_UPDATED,{segmentation:o})},this.getConfiguration=e=>{e=e??this._getApplicableToolGroupId();const t=this.getSegmentationRepresentationsForToolGroup(e),n=t?.[0]?.type||Et,o=s.segmentation.config.getGlobalConfig(),{renderInactiveSegmentations:r}=o,i=o.representations[n],{renderOutline:a,outlineWidthActive:l,renderFill:c,fillAlpha:d,fillAlphaInactive:m,outlineOpacity:u,outlineOpacityInactive:g}=i;return{brushSize:1,brushThresholdGate:1,fillAlpha:d,fillAlphaInactive:m,outlineWidthActive:l,renderFill:c,renderInactiveSegmentations:r,renderOutline:a,outlineOpacity:u,outlineOpacityInactive:g}},this.setConfiguration=e=>{const{brushSize:n,brushThresholdGate:o,fillAlpha:r,fillAlphaInactive:i,outlineWidthActive:a,outlineOpacity:l,renderFill:c,renderInactiveSegmentations:d,renderOutline:m}=e,u=function(e,n){let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(void 0!==n){const r=o?o(n):n;t._setSegmentationConfig(e,r)}};if(u("renderOutline",m),u("outlineWidthActive",a),u("outlineOpacity",l,(e=>e/100)),u("fillAlpha",r,(e=>e/100)),u("renderFill",c),u("fillAlphaInactive",i,(e=>e/100)),u("outlineOpacityInactive",i,(e=>Math.max(.75,e/100))),void 0!==d){const e=s.segmentation.config.getGlobalConfig();e.renderInactiveSegmentations=d,s.segmentation.config.setGlobalConfig(e)}this._broadcastEvent(this.EVENTS.SEGMENTATION_CONFIGURATION_CHANGED,this.getConfiguration())},this.getLabelmapVolume=e=>a.cache.getVolume(e),this.getSegmentationRepresentationsForToolGroup=e=>s.segmentation.state.getSegmentationRepresentations(e),this._toggleSegmentationVisibility=function(e){let n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const o=t.segmentations[e];if(!o)throw new Error(`Segmentation with segmentationId ${e} not found.`);o.isVisible=!o.isVisible,t._updateCornerstoneSegmentationVisibility(e),!1===n&&t._broadcastEvent(t.EVENTS.SEGMENTATION_UPDATED,{segmentation:o})},this._setSegmentColor=function(e,n,o,r){let i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];const a=t.getSegmentation(e);if(void 0===a)throw new Error(`no segmentation for segmentationId: ${e}`);const l=t._getSegmentInfo(a,n);if(void 0===l)throw new Error(`Segment ${n} not yet added to segmentation: ${e}`);r=r??t._getApplicableToolGroupId();const c=t._getSegmentationRepresentation(e,r);if(!c)throw new Error("Must add representation to toolgroup before setting segments");const{segmentationRepresentationUID:d}=c,m=s.segmentation.config.color.getColorForSegmentIndex(r,d,n);s.segmentation.config.color.setColorForSegmentIndex(r,d,n,[...o,m[3]]),l.color=o,!1===i&&t._broadcastEvent(t.EVENTS.SEGMENTATION_UPDATED,{segmentation:a})},this._setSegmentOpacity=function(e,n,o,r){let i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];const a=t.getSegmentation(e);if(void 0===a)throw new Error(`no segmentation for segmentationId: ${e}`);const l=t._getSegmentInfo(a,n);if(void 0===l)throw new Error(`Segment ${n} not yet added to segmentation: ${e}`);r=r??t._getApplicableToolGroupId();const c=t._getSegmentationRepresentation(e,r);if(!c)throw new Error("Must add representation to toolgroup before setting segments");const{segmentationRepresentationUID:d}=c,m=s.segmentation.config.color.getColorForSegmentIndex(r,d,n);s.segmentation.config.color.setColorForSegmentIndex(r,d,n,[m[0],m[1],m[2],o]),l.opacity=o,!1===i&&t._broadcastEvent(t.EVENTS.SEGMENTATION_UPDATED,{segmentation:a})},this._setSegmentationConfig=(e,t)=>{const n=this.getSegmentations()[0].type,{cornerstoneViewportService:o}=this.servicesManager.services,r=s.segmentation.config.getGlobalConfig();r.representations[n][e]=t,s.segmentation.config.setGlobalConfig(r);const i=o.getRenderingEngine(),a=o.getViewportIds();i.renderViewports(a)},this._onSegmentationDataModified=e=>{const{segmentationId:t}=e.detail,n=this.getSegmentation(t);void 0!==n&&this._broadcastEvent(this.EVENTS.SEGMENTATION_DATA_MODIFIED,{segmentation:n})},this._onSegmentationModifiedFromSource=e=>{const{segmentationId:t}=e.detail,n=this.segmentations[t];if(void 0===n)return;const o=s.segmentation.state.getSegmentation(t);if(!o)return;const{activeSegmentIndex:r,cachedStats:i,segmentsLocked:a,label:l,type:c}=o;if(![Et,wt].includes(c))throw new Error(`Unsupported segmentation type: ${c}. Only ${Et} and ${wt} are supported.`);const d=o.representationData[c],m={...n,activeSegmentIndex:r,cachedStats:i,displayText:[],id:t,label:l,segmentsLocked:a,type:c,representationData:{[c]:{...d}}};try{this.addOrUpdateSegmentation(m)}catch(e){console.warn(`Failed to add/update segmentation ${t}`,e)}},this._updateCornerstoneSegmentationVisibility=e=>{s.segmentation.state.getToolGroupIdsWithSegmentation(e).forEach((t=>{const n=s.segmentation.state.getSegmentationRepresentations(t);if(0===n.length)return;const o=n.find((t=>t.segmentationId===e)),{segmentsHidden:r}=o,i=!(0===r.size);s.segmentation.config.visibility.setSegmentationVisibility(t,o.segmentationRepresentationUID,i);const{segmentation:a}=this._getSegmentationInfo(e,t);a.segments.filter(Boolean).forEach((e=>{e.isVisible=i}))}))},this._getApplicableToolGroupId=()=>{const{toolGroupService:e,viewportGridService:t,cornerstoneViewportService:n}=this.servicesManager.services,o=n.getViewportInfo(t.getActiveViewportId());if(!o){return e.getToolGroupIds()[0]}return o.getToolGroupId()},this.getNextColorLUTIndex=()=>{let e=0;for(;;){if(void 0===s.segmentation.state.getColorLUT(e))return e;e++}},this.arrayOfObjects=e=>Object.entries(e).map((e=>({[e[0]]:e[1]}))),this.segmentations={},this.servicesManager=n,this._initSegmentationService()}addSegment(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(0===t?.segmentIndex)throw new Error('Segment index 0 is reserved for "no label"');const n=t.toolGroupId??this._getApplicableToolGroupId(),{segmentationRepresentationUID:o,segmentation:r}=this._getSegmentationInfo(e,n);let i=t.segmentIndex;if(i||(i=0===r.segments.length?1:r.segments.length),this._getSegmentInfo(r,i))throw new Error(`Segment ${i} already exists`);const a=s.segmentation.config.color.getColorForSegmentIndex(n,o,i);r.segments[i]={label:t.properties?.label??`Segment ${i}`,segmentIndex:i,color:[a[0],a[1],a[2]],opacity:a[3],isVisible:!0,isLocked:!1},r.segmentCount++,this._setActiveSegment(e,i);const l=!0;if(void 0!==t.properties){const{color:o,opacity:r,isLocked:a,visibility:s,active:c}=t.properties;void 0!==o&&this._setSegmentColor(e,i,o,n,l),void 0!==r&&this._setSegmentOpacity(e,i,r,n,l),void 0!==s&&this._setSegmentVisibility(e,i,s,n,l),!0===c&&this._setActiveSegment(e,i,l),void 0!==a&&this._setSegmentLocked(e,i,a,l)}null===r.activeSegmentIndex&&this._setActiveSegment(e,i,l),this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})}removeSegment(e,t){const n=this.getSegmentation(e);if(void 0===n)throw new Error(`no segmentation for segmentationId: ${e}`);if(0===t)throw new Error('Segment index 0 is reserved for "no label"');if(!this._getSegmentInfo(n,t))return;n.segmentCount--,n.segments[t]=null;const o=this.getLabelmapVolume(e),{dimensions:r}=o,i=o.getScalarData(),a=r[0]*r[1],l=r[2];let c=0;const d=new Set;for(let e=0;e<l;e++)for(let n=0;n<a;n++)i[c]===t&&(i[c]=0,d.add(e)),c++;const m=Array.from(d);if(s.segmentation.triggerSegmentationEvents.triggerSegmentationDataModified(e,m),n.activeSegmentIndex===t){const t=Object.keys(n.segments),o=t.length?Number(t[0]):1;this._setActiveSegment(e,o,!0)}this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:n})}setSegmentVisibility(e,t,n,o){let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this._setSegmentVisibility(e,t,n,o,r)}setSegmentLocked(e,t,n){this._setSegmentLocked(e,t,n,!1)}toggleSegmentLocked(e,t){const n=this.getSegmentation(e),o=!this._getSegmentInfo(n,t).isLocked;this._setSegmentLocked(e,t,o)}setSegmentColor(e,t,n,o){this._setSegmentColor(e,t,n,o)}setSegmentOpacity(e,t,n,o){this._setSegmentOpacity(e,t,n,o)}setActiveSegmentationForToolGroup(e,t){t=t??this._getApplicableToolGroupId();this._setActiveSegmentationForToolGroup(e,t,!1)}setActiveSegment(e,t){this._setActiveSegment(e,t,!1)}getSegmentations(){let e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];const t=this._getSegmentations();return t&&t.filter((t=>!e||t.hydrated))}_getSegmentations(){const e=this.arrayOfObjects(this.segmentations);return e&&e.map((e=>this.segmentations[Object.keys(e)[0]]))}getActiveSegmentation(){return this.getSegmentations().find((e=>e.isActive))}getActiveSegment(){const e=this.getActiveSegmentation(),{activeSegmentIndex:t,segments:n}=e;if(null!==t)return n[t]}getSegmentation(e){return this.segmentations[e]}addOrUpdateSegmentation(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const{id:o}=e;let r=this.segmentations[o];if(r)return Object.assign(r,e),this._updateCornerstoneSegmentations({segmentationId:o,notYetUpdatedAtSource:n}),t||this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r}),o;const i=e.type,a=e.representationData[i];s.segmentation.addSegmentations([{segmentationId:o,representation:{type:i,data:{...a}}}]);if(0!==Object.keys(this.segmentations).length){const e=this.generateNewColorLUT(),t=this.getNextColorLUTIndex();s.segmentation.config.color.addColorLUT(e,t)}return this.segmentations[o]={...e,label:e.label||"",segments:e.segments||[null],activeSegmentIndex:e.activeSegmentIndex??null,segmentCount:e.segmentCount??0,isActive:!1,isVisible:!0,colorLUTIndex:0},r=this.segmentations[o],this._updateCornerstoneSegmentations({segmentationId:o,notYetUpdatedAtSource:!0}),t||this._broadcastEvent(this.EVENTS.SEGMENTATION_ADDED,{segmentation:r}),r.id}async createSegmentationForSEGDisplaySet(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const o=Et;t=t??e.displaySetInstanceUID;const r={...this._getDefaultSegmentationScheme(),id:t,displaySetInstanceUID:e.displaySetInstanceUID,type:o,label:e.SeriesDescription,representationData:{[Et]:{volumeId:t,referencedVolumeId:e.referencedVolumeId}}},i=this.getLabelmapVolume(t),s=this.getSegmentation(t);if(i&&s)return this.addOrUpdateSegmentation(Object.assign(r,s),n);const{labelmapBufferArray:l,referencedVolumeId:c}=e;if(!l||!c)throw new Error("No labelmapBufferArray or referencedVolumeId found for the SEG displaySet");if(!a.cache.getVolume(c))throw new Error(`No volume found for referencedVolumeId: ${c}`);const d=await a.volumeLoader.createAndCacheDerivedVolume(c,{volumeId:t,targetBuffer:{type:"Uint8Array",sharedArrayBuffer:window.SharedArrayBuffer}}),m=d.getScalarData(),u=e.segMetadata.data;return m.set(new Uint8Array(l[0])),r.segments=u.map(((t,n)=>{if(0===n)return;const{SegmentedPropertyCategoryCodeSequence:o,SegmentNumber:i,SegmentLabel:a,SegmentAlgorithmType:s,SegmentAlgorithmName:l,SegmentedPropertyTypeCodeSequence:c,rgba:m}=t,{x:u,y:g,z:p}=e.centroids.get(n),h=d.imageData.indexToWorld([u,g,p]);return r.cachedStats={...r.cachedStats,segmentCenter:{...r.cachedStats.segmentCenter,[n]:{center:{image:[u,g,p],world:h},modifiedTime:e.SeriesDate}}},{label:a||`Segment ${i}`,segmentIndex:Number(i),category:o?o.CodeMeaning:"",type:c?c.CodeMeaning:"",algorithmType:s,algorithmName:l,color:m,opacity:255,isVisible:!0,isLocked:!1}})),r.segmentCount=u.length-1,e.isLoaded=!0,this._broadcastEvent(yt.SEGMENTATION_LOADING_COMPLETE,{segmentationId:t,segDisplaySet:e}),this.addOrUpdateSegmentation(r,n)}async createSegmentationForRTDisplaySet(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const o=wt;t=t??e.displaySetInstanceUID;const{structureSet:r}=e;if(!r)throw new Error("To create the contours from RT displaySet, the displaySet should be loaded first, you can perform rtDisplaySet.load() before calling this method.");const i=this._getDefaultSegmentationScheme(),s=e.displaySetInstanceUID,l=function(e,t){return e.ROIContours.map((e=>{let{contourPoints:n,ROINumber:o,ROIName:r,colorArray:i}=e;const a=r||o;return{data:n.map((e=>{let{points:t,...n}=e;return{...n,points:t.map((e=>{let{x:t,y:n,z:o}=e;return[t,n,o]}))}})),id:a,segmentIndex:o,color:i,geometryId:`${t}:${a}:segmentIndex-${o}`}}))}(r,s);l.sort(((e,t)=>e.segmentIndex-t.segmentIndex));const c=l.map((e=>{let{geometryId:t}=e;return t})),d={...i,id:t,displaySetInstanceUID:s,type:o,label:e.SeriesDescription,representationData:{[wt]:{geometryIds:c}}},m=this.getSegmentation(t);if(m)return this.addOrUpdateSegmentation(Object.assign(d,m),n);if(!r.ROIContours?.length)throw new Error("The structureSet does not contain any ROIContours. Please ensure the structureSet is loaded first.");const u={},g=async t=>{const{data:n,id:o,color:i,segmentIndex:s,geometryId:c}=t;try{const t=await a.geometryLoader.createAndCacheGeometry(c,{geometryData:{data:n,id:o,color:i,frameOfReferenceUID:r.frameOfReferenceUID,segmentIndex:s},type:a.Enums.GeometryType.CONTOUR}),m=t.data.getCentroid();u[s]={center:{world:m},modifiedTime:e.SeriesDate},d.segments[s]={label:o,segmentIndex:s,color:i,...Tt};const g=Object.keys(u).length,p=Math.round(g/l.length*100);this._broadcastEvent(yt.SEGMENT_LOADING_COMPLETE,{percentComplete:p,numSegments:l.length})}catch(e){console.warn(e)}},p=[];for(let e=0;e<l.length;e++){const t=new Promise(((t,n)=>{setTimeout((()=>{g(l[e]).then((()=>{t()}))}),0)}));p.push(t)}return await Promise.all(p),d.segmentCount=l.length,e.isLoaded=!0,d.cachedStats={...d.cachedStats,segmentCenter:{...d.cachedStats.segmentCenter,...u}},this._broadcastEvent(yt.SEGMENTATION_LOADING_COMPLETE,{segmentationId:t,rtDisplaySet:e}),this.addOrUpdateSegmentation(d,n)}jumpToSegmentCenter(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.9,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:750,l=arguments.length>6&&void 0!==arguments[6]&&arguments[6],c=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"ease-in-out";const{toolGroupService:d}=this.servicesManager.services,m=this._getSegmentCenter(e,t);if(!m?.world)return;const{world:u}=m;n=n||this._getToolGroupIdsWithSegmentation(e);const g=[];Array.isArray(n)?n.forEach((e=>{g.push(d.getToolGroup(e))})):g.push(d.getToolGroup(n)),g.forEach((n=>{const d=n.getViewportsInfo();for(const{viewportId:e,renderingEngineId:t}of d){const{viewport:n}=(0,a.getEnabledElementByIds)(e,t);s.utilities.viewport.jumpToWorld(n,u)}r&&this.highlightSegment(e,t,n.id,o,i,l,c)}))}highlightSegment(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:.9,r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:750,i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.highlightIntervalId&&clearInterval(this.highlightIntervalId);const a=this.getSegmentation(e);n=n??this._getApplicableToolGroupId();const s=this._getSegmentationRepresentation(e,n),{type:l}=s,{segments:c}=a;(l===Et?this._highlightLabelmap.bind(this):this._highlightContour.bind(this))(t,l===Et?o:1-o,i,c,n,r,s)}_setDisplaySetIsHydrated(e,t){const{displaySetService:n}=this.servicesManager.services,o=n.getDisplaySetByUID(e);o&&(o.isHydrated=t,n.setDisplaySetMetadataInvalidated(e,!1))}_highlightLabelmap(e,t,n,o,r,i,a){const l={[e]:{LABELMAP:{fillAlpha:t}}};if(n)for(let t=0;t<o.length;t++)t!==e&&(l[t]={LABELMAP:{fillAlpha:0}});const{fillAlpha:c}=this.getConfiguration(r);let d=null;const m=t=>{null===d&&(d=t);const n=t-d,o=Math.min(n/i,1);s.segmentation.config.setSegmentSpecificConfig(r,a.segmentationRepresentationUID,{[e]:{LABELMAP:{fillAlpha:ft(o,c)}}}),o<1?requestAnimationFrame(m):s.segmentation.config.setSegmentSpecificConfig(r,a.segmentationRepresentationUID,{})};requestAnimationFrame(m)}_highlightContour(e,t,n,o,r,i,a){const l=performance.now(),c=t=>{const n=(t-l)/i;if(n>=1)return void s.segmentation.config.setSegmentSpecificConfig(r,a.segmentationRepresentationUID,{});const o=1-ft(n,d=.1)+d;var d;s.segmentation.config.setSegmentSpecificConfig(r,a.segmentationRepresentationUID,{[e]:{CONTOUR:{fillAlpha:o}}}),requestAnimationFrame(c)};requestAnimationFrame(c)}removeSegmentationRepresentationFromToolGroup(e,t){const n=t||[];if(!n.length){const t=s.segmentation.state.getSegmentationRepresentations(e);if(!t||!t.length)return;n.push(...t.map((e=>e.segmentationRepresentationUID)))}s.segmentation.removeSegmentationsFromToolGroup(e,n)}remove(e){const t=this.segmentations[e],n=t.isActive;if(!e||!t)return void console.warn("No segmentationId provided, or unable to find segmentation by id.");const{colorLUTIndex:o}=t;if(this._removeSegmentationFromCornerstone(e),s.segmentation.state.removeColorLUT(o),delete this.segmentations[e],n){const e=this._getSegmentations().filter((e=>e.hydrated));if(e.length){const{id:t}=e[0];this._setActiveSegmentationForToolGroup(t,this._getApplicableToolGroupId(),!1)}}this._setDisplaySetIsHydrated(e,!1),this._broadcastEvent(this.EVENTS.SEGMENTATION_REMOVED,{segmentationId:e})}setSegmentLabel(e,t,n){this._setSegmentLabel(e,t,n)}_setSegmentLabel(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];const r=this.getSegmentation(e);if(void 0===r)throw new Error(`no segmentation for segmentationId: ${e}`);const i=r.segments[t];if(void 0===i)throw new Error(`Segment ${t} not yet added to segmentation: ${e}`);i.label=n,!1===o&&this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})}shouldRenderSegmentation(e,t){if(!e?.length)return!1;const{displaySetService:n}=this.servicesManager.services;let o=!1;for(const r of e){const e=n.getDisplaySetByUID(r);if(e.isReconstructable&&e?.images?.[0]?.FrameOfReferenceUID===t){o=!0;break}}return o}_getDefaultSegmentationScheme(){return{activeSegmentIndex:1,cachedStats:{},label:"",segmentsLocked:[],displayText:[],hydrated:!1,segmentCount:0,segments:[],isVisible:!0,isActive:!1,colorLUTIndex:0}}_setActiveSegmentationForToolGroup(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const o=this._getSegmentations(),r=this.getSegmentation(e);if(void 0===r)throw new Error(`no segmentation for segmentationId: ${e}`);o.forEach((t=>{t.isActive=t.id===e}));const i=this._getSegmentationRepresentation(e,t);s.segmentation.activeSegmentation.setActiveSegmentationRepresentation(t,i.segmentationRepresentationUID),!1===n&&this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})}_setActiveSegment(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const o=this.getSegmentation(e);if(void 0===o)throw new Error(`no segmentation for segmentationId: ${e}`);s.segmentation.segmentIndex.setActiveSegmentIndex(e,t),o.activeSegmentIndex=t,!1===n&&this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:o})}_getSegmentInfo(e,t){const n=e.segments;if(n)return n&&n.length>0?n[t]:void 0}_getVolumeIdForDisplaySet(e){return`${e.volumeLoaderSchema??"cornerstoneStreamingImageVolume"}:${e.displaySetInstanceUID}`}_getSegmentCenter(e,t){const n=this.getSegmentation(e);if(!n)return;const{cachedStats:o}=n;if(!o)return;const{segmentCenter:r}=o;if(!r)return;const{center:i}=r[t];return i}_setSegmentLocked(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];const r=this.getSegmentation(e);if(void 0===r)throw new Error(`no segmentation for segmentationId: ${e}`);const i=this._getSegmentInfo(r,t);if(void 0===i)throw new Error(`Segment ${t} not yet added to segmentation: ${e}`);i.isLocked=n,s.segmentation.segmentLocking.setSegmentIndexLocked(e,t,n),!1===o&&this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})}_setSegmentVisibility(e,t,n,o){let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];o=o??this._getApplicableToolGroupId();const{segmentationRepresentationUID:i,segmentation:a}=this._getSegmentationInfo(e,o);if(void 0===a)throw new Error(`no segmentation for segmentationId: ${e}`);const l=this._getSegmentInfo(a,t);if(void 0===l)throw new Error(`Segment ${t} not yet added to segmentation: ${e}`);l.isVisible=n,s.segmentation.config.visibility.setSegmentVisibility(o,i,t,n),a.isVisible=a.segments.filter(Boolean).every((e=>e.isVisible)),!1===r&&this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:a})}_setSegmentLabel(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];const r=this.getSegmentation(e);if(void 0===r)throw new Error(`no segmentation for segmentationId: ${e}`);const i=this._getSegmentInfo(r,t);if(void 0===i)throw new Error(`Segment ${t} not yet added to segmentation: ${e}`);i.label=n,!1===o&&this._broadcastEvent(this.EVENTS.SEGMENTATION_UPDATED,{segmentation:r})}_getSegmentationRepresentation(e,t){const n=this.getSegmentationRepresentationsForToolGroup(t);if(!n?.length)return;return n.find((t=>t.segmentationId===e))}_initSegmentationService(){a.eventTarget.addEventListener(s.Enums.Events.SEGMENTATION_MODIFIED,this._onSegmentationModifiedFromSource),a.eventTarget.addEventListener(s.Enums.Events.SEGMENTATION_DATA_MODIFIED,this._onSegmentationDataModified)}_getSegmentationInfo(e,t){const n=this.getSegmentation(e);if(void 0===n)throw new Error(`no segmentation for segmentationId: ${e}`);const o=this._getSegmentationRepresentation(e,t);if(!o)throw new Error("Must add representation to toolgroup before setting segments");const{segmentationRepresentationUID:r}=o;return{segmentationRepresentationUID:r,segmentation:n}}_removeSegmentationFromCornerstone(e){const t=s.segmentation.state;if(!t.getSegmentation(e))return;t.getToolGroupIdsWithSegmentation(e).forEach((n=>{const o=t.getSegmentationRepresentations(n),r=[];o.forEach((t=>{t.segmentationId===e&&r.push(t.segmentationRepresentationUID)})),s.segmentation.removeSegmentationsFromToolGroup(n,r,!0)})),t.removeSegmentation(e),a.cache.getVolumeLoadObject(e)&&a.cache.removeVolumeLoadObject(e)}_updateCornerstoneSegmentations(e){let{segmentationId:t,notYetUpdatedAtSource:n}=e;if(!1===n)return;const o=s.segmentation.state.getSegmentation(t),r=this.segmentations[t],{label:i,cachedStats:a}=r;o.label!==i&&(o.label=i),St()(o.cachedStats,a)||(o.cachedStats=a)}_getToolGroupIdsWithSegmentation(e){return s.segmentation.state.getToolGroupIdsWithSegmentation(e)}_getFrameOfReferenceUIDForSeg(e){const t=e.instance?.FrameOfReferenceUID;if(t)return t;const n=e.instance?.ReferencedFrameOfReferenceSequence;return n?n.FrameOfReferenceUID:void 0}generateNewColorLUT(){return ht()(vt)}}Dt.REGISTRATION={name:"segmentationService",altName:"SegmentationService",create:e=>{let{servicesManager:t}=e;return new Dt({servicesManager:t})}};const bt=Dt;function Ot(e){const t=e.toLowerCase();if("stack"===t)return a.Enums.ViewportType.STACK;if("volume"===t||"orthographic"===t)return a.Enums.ViewportType.ORTHOGRAPHIC;if("volume3d"===t)return a.Enums.ViewportType.VOLUME_3D;throw new Error(`Invalid viewport type: ${e}. Valid types are: stack, volume`)}const Nt="cornerstoneStreamingImageVolume";class At{constructor(e){this.stackImageIds=new Map,this.volumeImageIds=new Map,this.servicesManager=void 0,this.servicesManager=e}getCacheSize(){return a.cache.getCacheSize()}getCacheFreeSpace(){return a.cache.getBytesAvailable()}async createViewportData(e,t,n,o){let r=t.viewportType;this._shouldRenderSegmentation(e)&&(r="volume",t.viewportType=r);const i=Ot(r);let s;return i===a.Enums.ViewportType.STACK&&(s=await this._getStackViewportData(n,e,o,i)),i!==a.Enums.ViewportType.ORTHOGRAPHIC&&i!==a.Enums.ViewportType.VOLUME_3D||(s=await this._getVolumeViewportData(n,e,i)),s.viewportType=i,s}async invalidateViewportData(e,t,n,o){if(e.viewportType===a.Enums.ViewportType.STACK)return this._getCornerstoneStackImageIds(o.getDisplaySetByUID(t),n);const r=`${Nt}:${t}`;a.cache.getVolume(r)&&(a.cache.removeVolumeLoadObject(r),this.volumeImageIds.delete(r));const i=e.data.map((e=>{let{displaySetInstanceUID:t}=e;return o.getDisplaySetByUID(t)}));return await this._getVolumeViewportData(n,i,e.viewportType)}_getStackViewportData(e,t,n,o){const r=t[0];let i=this.stackImageIds.get(r.displaySetInstanceUID);i||(i=this._getCornerstoneStackImageIds(r,e),this.stackImageIds.set(r.displaySetInstanceUID,i));const{displaySetInstanceUID:a,StudyInstanceUID:s,isCompositeStack:l}=r,c={viewportType:o,data:{StudyInstanceUID:s,displaySetInstanceUID:a,isCompositeStack:l,imageIds:i}};return"number"==typeof n&&(c.data.initialImageIndex=n),c}async _getVolumeViewportData(e,t,n){const o=[];for(const n of t){if(n.load&&n.load instanceof Function){const{userAuthenticationService:e}=this.servicesManager.services,t=e.getAuthorizationHeader();await n.load({headers:t}),o.push({studyInstanceUID:n.StudyInstanceUID,displaySetInstanceUID:n.displaySetInstanceUID});continue}const t=`${n.volumeLoaderSchema??Nt}:${n.displaySetInstanceUID}`;let r=this.volumeImageIds.get(n.displaySetInstanceUID),i=a.cache.getVolume(t);r&&i||(r=this._getCornerstoneVolumeImageIds(n,e),i=await a.volumeLoader.createAndCacheVolume(t,{imageIds:r}),this.volumeImageIds.set(n.displaySetInstanceUID,r)),o.push({StudyInstanceUID:n.StudyInstanceUID,displaySetInstanceUID:n.displaySetInstanceUID,volume:i,volumeId:t,imageIds:r})}return{viewportType:n,data:o}}_shouldRenderSegmentation(e){const{segmentationService:t,displaySetService:n}=this.servicesManager.services,o=e.map((e=>{let{displaySetInstanceUID:t}=e;return t})),r=t.getSegmentations();for(const e of r){const r=e.displaySetInstanceUID,i=n.getDisplaySetByUID(r),a=i.instances?.[0]||i.instance;if(t.shouldRenderSegmentation(o,a.FrameOfReferenceUID))return!0}}_getCornerstoneStackImageIds(e,t){return t.getImageIdsForDisplaySet(e)}_getCornerstoneVolumeImageIds(e,t){return this._getCornerstoneStackImageIds(e,t)}}At.REGISTRATION={name:"cornerstoneCacheService",altName:"CornerstoneCacheService",create:e=>{let{servicesManager:t}=e;return new At(t)}};const Ct=At,Mt="OHIFCornerstoneRenderingEngine";const Ut="stack",_t="default",Vt=(e,t,n)=>e.displaySetInstanceUID===t||!!(n&&e.isCompositeStack&&e.imageIds)&&!!e.imageIds.find((e=>e===n));const Rt=class{constructor(e){this.viewportId="",this.element=void 0,this.viewportOptions=void 0,this.displaySetOptions=void 0,this.viewportData=void 0,this.renderingEngineId=void 0,this.destroy=()=>{this.element=null,this.viewportData=null,this.viewportOptions=null,this.displaySetOptions=null},this.viewportId=e,this.setPublicViewportOptions({}),this.setPublicDisplaySetOptions([{}])}contains(e,t){return!!this.viewportData?.data&&(this.viewportData.data.length?!!this.viewportData.data.find((n=>Vt(n,e,t))):Vt(this.viewportData.data,e,t))}setRenderingEngineId(e){this.renderingEngineId=e}getRenderingEngineId(){return this.renderingEngineId}setViewportId(e){this.viewportId=e}setElement(e){this.element=e}setViewportData(e){this.viewportData=e}getViewportData(){return this.viewportData}getElement(){return this.element}getViewportId(){return this.viewportId}setPublicDisplaySetOptions(e){const t=this.mapDisplaySetOptions(e);return this.setDisplaySetOptions(t),this.displaySetOptions}hasDisplaySet(e){let t=this.getViewportData();return t.viewportType===a.Enums.ViewportType.ORTHOGRAPHIC||t.viewportType===a.Enums.ViewportType.VOLUME_3D?t.data.some((t=>{let{displaySetInstanceUID:n}=t;return n===e})):t.data.displaySetInstanceUID===e}setPublicViewportOptions(e){let t=e.viewportType;const{toolGroupId:n=_t,presentationIds:o}=e;let r;return t=Ot(t?e.viewportType:Ut),e.viewportType?.toLowerCase()!==Ut&&(r=function(e){if(e)switch(e.toLowerCase()){case"axial":return a.Enums.OrientationAxis.AXIAL;case"sagittal":return a.Enums.OrientationAxis.SAGITTAL;case"coronal":return a.Enums.OrientationAxis.CORONAL;default:return a.Enums.OrientationAxis.ACQUISITION}return a.Enums.OrientationAxis.ACQUISITION}(e.orientation)),n||(n=_t),this.setViewportOptions({...e,viewportId:this.viewportId,viewportType:t,orientation:r,toolGroupId:n,presentationIds:o}),this.viewportOptions}setViewportOptions(e){this.viewportOptions=e}getViewportOptions(){return this.viewportOptions}setDisplaySetOptions(e){this.displaySetOptions=e}getSyncGroups(){return this.viewportOptions.syncGroups||=[],this.viewportOptions.syncGroups}getDisplaySetOptions(){return this.displaySetOptions}getViewportType(){return this.viewportOptions.viewportType||a.Enums.ViewportType.STACK}getToolGroupId(){return this.viewportOptions.toolGroupId}getBackground(){return this.viewportOptions.background||[0,0,0]}getOrientation(){return this.viewportOptions.orientation}getDisplayArea(){return this.viewportOptions.displayArea}getInitialImageOptions(){return this.viewportOptions.initialImageOptions}mapDisplaySetOptions(){const e=[];return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[{}]).forEach((t=>{let n=t?.options||t;n||(n={blendMode:void 0,slabThickness:void 0,colormap:void 0,voi:{},voiInverted:!1});const o=function(e){if(!e)return a.Enums.BlendModes.COMPOSITE;if("mip"===e.toLowerCase())return a.Enums.BlendModes.MAXIMUM_INTENSITY_BLEND;throw new Error}(n.blendMode);e.push({voi:n.voi,voiInverted:n.voiInverted,colormap:n.colormap,slabThickness:n.slabThickness,blendMode:o,displayPreset:n.displayPreset})})),e}};var Pt=function(e){return e.First="first",e.Last="last",e.Middle="middle",e}(Pt||{});const Lt=Pt,Ft={VIEWPORT_DATA_CHANGED:"event::cornerstoneViewportService:viewportDataChanged"};class xt extends l.hC{constructor(e){super(Ft),this.renderingEngine=void 0,this.viewportsById=new Map,this.viewportGridResizeObserver=void 0,this.viewportsDisplaySets=new Map,this.enableResizeDetector=void 0,this.resizeRefreshRateMs=void 0,this.resizeRefreshMode=void 0,this.servicesManager=null,this.renderingEngine=null,this.viewportGridResizeObserver=null,this.servicesManager=e}enableViewport(e,t){const n=new Rt(e);n.setElement(t),this.viewportsById.set(e,n)}getViewportIds(){return Array.from(this.viewportsById.keys())}getRenderingEngine(){const e=(0,a.getRenderingEngine)(Mt);return e?(this.renderingEngine=e,this.renderingEngine):(e&&!e.hasBeenDestroyed||(this.renderingEngine=new a.RenderingEngine(Mt)),this.renderingEngine)}resize(){this.renderingEngine.resize(!0,!0),this.renderingEngine.render()}destroy(){this._removeResizeObserver(),this.viewportGridResizeObserver=null;try{this.renderingEngine?.destroy?.()}catch(e){console.warn("Rendering engine not destroyed",e)}this.viewportsDisplaySets.clear(),this.renderingEngine=null,a.cache.purgeCache()}disableElement(e){this.renderingEngine?.disableElement(e),this.viewportsById.delete(e),this.viewportsDisplaySets.delete(e)}setPresentations(e,t){const n=t?.lutPresentation?.properties;n&&e.setProperties(n);const o=t?.positionPresentation?.camera;o&&e.setCamera(o)}getPresentation(e){const t=this.viewportsById.get(e);if(!t)return;const{viewportType:n,presentationIds:o}=t.getViewportOptions(),r=this.getCornerstoneViewport(e);if(!r)return;const i=r.getProperties();i.isComputedVOI&&(delete i.voiRange,delete i.VOILUTFunction);return{presentationIds:o,viewportType:n&&"stack"!==n?"volume":"stack",properties:i,initialImageIndex:r.getCurrentImageIdIndex(),camera:r.getCamera()}}storePresentation(e){let{viewportId:t}=e;const n=this.servicesManager.services.stateSyncService;let o;try{o=this.getPresentation(t)}catch(e){console.warn(e)}if(!o||!o.presentationIds)return;const{lutPresentationStore:r,positionPresentationStore:i}=n.getState(),{presentationIds:a}=o,{lutPresentationId:s,positionPresentationId:l}=a||{},c={};s&&(c.lutPresentationStore={...r,[s]:o}),l&&(c.positionPresentationStore={...i,[l]:o}),n.store(c)}setViewportData(e,t,n,o,r){const i=this.getRenderingEngine(),a=this.viewportsById.get(e);if(this.storePresentation({viewportId:a.getViewportId()}),!a)throw new Error("element is not enabled for the given viewportId");const s=a.setPublicDisplaySetOptions(o),l=a.setPublicViewportOptions(n),c={viewportId:e,element:a.getElement(),type:a.getViewportType(),defaultOptions:{background:a.getBackground(),orientation:a.getOrientation(),displayArea:a.getDisplayArea()}};a.setRenderingEngineId(i.id),i.enableElement(c),a.setViewportOptions(l),a.setDisplaySetOptions(s),a.setViewportData(t),a.setViewportId(e),this.viewportsById.set(e,a);const d=i.getViewport(e);this._setDisplaySets(d,t,a,r),this._broadcastEvent(this.EVENTS.VIEWPORT_DATA_CHANGED,{viewportData:t,viewportId:e})}getCornerstoneViewport(e){if(!this.getViewportInfo(e)||!this.renderingEngine||this.renderingEngine.hasBeenDestroyed)return null;return this.renderingEngine.getViewport(e)}getViewportInfo(e){return this.viewportsById.get(e)}_setStackViewport(e,t,n,o){const r=n.getDisplaySetOptions(),{imageIds:i,initialImageIndex:s,displaySetInstanceUID:l}=t.data;this.viewportsDisplaySets.set(e.id,[l]);let c=o?.positionPresentation?.initialImageIndex??s;null==c&&(c=this._getInitialImageIndexForViewport(n,i)||0);const d={...o.lutPresentation?.properties};if(!o.lutPresentation?.properties){const{voi:e,voiInverted:t}=r[0];if(e&&(e.windowWidth||e.windowCenter)){const{lower:t,upper:n}=a.utilities.windowLevel.toLowHighRange(e.windowWidth,e.windowCenter);d.voiRange={lower:t,upper:n}}void 0!==t&&(d.invert=t)}e.setStack(i,c).then((()=>{e.setProperties({...d});const t=o.positionPresentation?.camera;t&&e.setCamera(t)}))}_getInitialImageIndexForViewport(e,t){const n=e.getInitialImageOptions();if(!n)return;const{index:o,preset:r}=n,i=e.getViewportType();let s;if(i===a.Enums.ViewportType.STACK)s=t.length;else{if(i!==a.Enums.ViewportType.ORTHOGRAPHIC)return;{const t=this.getCornerstoneViewport(e.getViewportId()),n=a.utilities.getImageSliceDataForVolumeViewport(t);if(!n)return;({numberOfSlices:s}=n)}}return this._getInitialImageIndex(s,o,r)}_getInitialImageIndex(e,t,n){const o=e-1;return void 0!==t?s.utilities.clip(t,0,o):n===Lt.First?0:n===Lt.Last?o:n===Lt.Middle?o%2==0?o/2:(o+1)/2:0}async _setVolumeViewport(e,t,n,o){const r=[],i=n.getDisplaySetOptions(),{hangingProtocolService:a}=this.servicesManager.services,s=[],l=[];for(const[e,n]of t.data.entries()){const{volume:t,imageIds:o,displaySetInstanceUID:a}=n;if(l.push(a),!t){console.log("Volume display set not found");continue}s.push(t);const c=i[e],{volumeId:d}=t;r.push({imageIds:o,volumeId:d,blendMode:c.blendMode,slabThickness:this._getSlabThickness(c,d)})}return this.viewportsDisplaySets.set(e.id,l),a.getShouldPerformCustomImageLoad()?a.runImageLoadStrategy({viewportId:e.id,volumeInputArray:r}):(s.forEach((e=>{e.loadStatus.loaded||e.loadStatus.loading||e.load()})),this.setVolumesForViewport(e,r,o))}async setVolumesForViewport(e,t,n){const{displaySetService:o,toolGroupService:r}=this.servicesManager.services,i=this.getViewportInfo(e.id),l=i.getDisplaySetOptions(),c=t.map(((e,t)=>{const{volumeId:n}=e,o=l[t],{voi:r,voiInverted:i,colormap:s,displayPreset:c}=o,d={};if(r&&(r.windowWidth||r.windowCenter)){const{lower:e,upper:t}=a.utilities.windowLevel.toLowHighRange(r.windowWidth,r.windowCenter);d.voiRange={lower:e,upper:t}}return void 0!==i&&(d.invert=i),void 0!==s&&(d.colormap=s),void 0!==c&&(d.preset=c),{properties:d,volumeId:n}}));await e.setVolumes(t),c.forEach((t=>{let{properties:n,volumeId:o}=t;e.setProperties(n,o)})),this.setPresentations(e,n);const d=this.viewportsDisplaySets.get(e.id),m=d.map(o.getDisplaySetByUID).find((e=>e?.isOverlayDisplaySet));m?this.addOverlayRepresentationForDisplaySet(m,e):this._addSegmentationRepresentationToToolGroupIfNecessary(d,e);const u=r.getToolGroupForViewport(e.id);s.utilities.segmentation.triggerSegmentationRender(u.id);const g=this._getInitialImageIndexForViewport(i);void 0!==g&&s.utilities.jumpToSlice(e.element,{imageIndex:g}),e.render()}_addSegmentationRepresentationToToolGroupIfNecessary(e,t){const{segmentationService:n,toolGroupService:o}=this.servicesManager.services,r=o.getToolGroupForViewport(t.id),i=n.getSegmentations();for(const t of i){if((n.getSegmentationRepresentationsForToolGroup(r.id)||[]).find((e=>e.segmentationId===t.id)))continue;const{id:o}=t;let i=this._getFrameOfReferenceUID(o);if(!i){const{FrameOfReferenceUID:e}=t;e&&(i=e)}if(!i)return;let a=!1;for(const t of e){if(i===this._getFrameOfReferenceUID(t)){a=!0;break}}if(!a)return;n.addSegmentationRepresentationToToolGroup(r.id,t.id,!1,t.type)}}addOverlayRepresentationForDisplaySet(e,t){const{segmentationService:n,toolGroupService:o}=this.servicesManager.services,{referencedVolumeId:r}=e,i=e.displaySetInstanceUID,l=o.getToolGroupForViewport(t.id),c=r&&void 0!==a.cache.getVolume(r)?s.Enums.SegmentationRepresentations.Labelmap:s.Enums.SegmentationRepresentations.Contour;n.addSegmentationRepresentationToToolGroup(l.id,i,!1,c)}updateViewport(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const o=this.getViewportInfo(e),r=this.getCornerstoneViewport(e),i=r.getCamera();r instanceof a.VolumeViewport||r instanceof a.VolumeViewport3D?this._setVolumeViewport(r,t,o).then((()=>{n&&(r.setCamera(i),r.render())})):r instanceof a.StackViewport&&this._setStackViewport(r,t,o)}_setDisplaySets(e,t,n){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(e instanceof a.StackViewport)this._setStackViewport(e,t,n,o);else{if(!(e instanceof a.VolumeViewport||e instanceof a.VolumeViewport3D))throw new Error("Unknown viewport type");this._setVolumeViewport(e,t,n,o)}}_removeResizeObserver(){this.viewportGridResizeObserver&&this.viewportGridResizeObserver.disconnect()}_getSlabThickness(e,t){const{blendMode:n}=e;if(void 0!==n&&void 0!==e.slabThickness){if("number"==typeof e.slabThickness)return e.slabThickness;if("fullvolume"===e.slabThickness.toLowerCase()){const e=a.cache.getVolume(t),{dimensions:n}=e;return Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2])}}}_getFrameOfReferenceUID(e){const{displaySetService:t}=this.servicesManager.services,n=t.getDisplaySetByUID(e);if(!n)return;if(n.frameOfReferenceUID)return n.frameOfReferenceUID;if("SEG"===n.Modality){const{instance:e}=n;return e.FrameOfReferenceUID}if("RTSTRUCT"===n.Modality){const{instance:e}=n;return e.ReferencedFrameOfReferenceSequence.FrameOfReferenceUID}const{images:o}=n;return o&&o.length?o[0].FrameOfReferenceUID:void 0}getViewportIdToJump(e,t,n){const o=this.getViewportInfo(e),{referencedImageId:r}=n;return o?.contains(t,r)?e:[...this.viewportsById.values()].find((e=>e.contains(t,r)))?.viewportId??null}}xt.REGISTRATION={name:"cornerstoneViewportService",altName:"CornerstoneViewportService",create:e=>{let{servicesManager:t}=e;return new xt(t)}};const Gt=xt;var kt=n(97604);const $t=e=>{if(e)return"function"==typeof e.getImageId?e.getImageId():e.url},Bt=e=>(Array.isArray(e)?e:[e]).some((e=>!e)),zt=e=>e&&e.images&&e.images[0],jt=e=>$t(e),Wt=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.DICOMWeb.getAuthorizationHeader();return fetch(e,t).then((e=>e.arrayBuffer()))},qt=e=>a.imageLoader.loadAndCacheImage(e).then((e=>e&&e.data&&e.data.byteArray.buffer)),Ht=function(e,t,n,o){const r={url:e,headers:arguments.length>4&&void 0!==arguments[4]?arguments[4]:l.DICOMWeb.getAuthorizationHeader(),errorInterceptor:arguments.length>5&&void 0!==arguments[5]?arguments[5]:l.Po.getHTTPErrorHandler()};return new kt.api.DICOMwebClient(r).retrieveInstance({studyInstanceUID:t,seriesInstanceUID:n,sopInstanceUID:o})};const Zt=new class{getLocalData(e,t){const n=zt(e),o=(e=>e&&e.instance)(e);if(!n&&!o||!o.imageId?.startsWith("dicomfile"))return;let r=jt(n||o);return Bt(r)&&(r=((e,t)=>{const n=e.find((e=>e.displaySets.some((e=>e.displaySetInstanceUID===t)))),{series:o=[]}=n,{instances:r=[]}=o[0]||{},i=r[0];return $t(i)})(t,e.displaySetInstanceUID)),Bt(r)?void 0:m().wadouri.loadFileRequest(r)}getDataByImageType(e){const t=zt(e);if(t){const e=jt(t);let n=Wt;const o=(e=>{const t=/^\w+\:/,n=t.exec(e);return 0===t.lastIndex&&n&&n[0]&&n[0].replace(":","")||""})(e);switch(o){case"dicomfile":n=qt.bind(this,e);break;case"wadors":const r=t.getData().wadoRoot,i=t.getStudyInstanceUID(),a=t.getSeriesInstanceUID(),s=t.getSOPInstanceUID();if(Bt([r,i,a,s]))return;n=Ht.bind(this,r,i,a,s);break;case"wadouri":if(e=e.substring(e.indexOf(":")+1),Bt(e))return;n=Wt.bind(this,e);break;default:throw new Error(`Unsupported image type: ${o} for imageId: ${e}`)}return n()}}getDataByDatasetType(e){const{StudyInstanceUID:t,SeriesInstanceUID:n,SOPInstanceUID:o,authorizationHeaders:r,wadoRoot:i,wadoUri:a}=e;return Bt(i)?Bt(a)?void 0:Wt(a,{headers:r}):Ht(i,t,n,o,r)}*getLoaderIterator(e,t,n){yield this.getLocalData(e,t),yield this.getDataByImageType(e),yield this.getDataByDatasetType(e)}findDicomDataPromise(e,t,n){e.authorizationHeaders=n;const o=this.getLoaderIterator(e,t);for(const e of o)if(e)return e;throw new Error("Invalid dicom data loader")}},Yt=JSON.parse('{"u2":"@ohif/extension-cornerstone"}').u2;function Kt(){return Kt=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},Kt.apply(this,arguments)}const Jt=i.lazy((()=>Promise.all([n.e(23),n.e(181)]).then(n.bind(n,86181)))),Qt=e=>i.createElement(i.Suspense,{fallback:i.createElement("div",null,"Loading...")},i.createElement(Jt,e)),Xt={id:Yt,onModeExit:()=>{Object.values(a.Enums.RequestType).forEach((e=>{a.imageLoadPoolManager.clearRequestStack(e),a.imageRetrievalPoolManager.clearRequestStack(e)})),(0,v.mc)()},preRegistration:function(e){const{servicesManager:t}=e;return t.registerService(Gt.REGISTRATION),t.registerService(dt.REGISTRATION),t.registerService(gt.REGISTRATION),t.registerService(bt.REGISTRATION),t.registerService(Ct.REGISTRATION),De.call(this,e)},getHangingProtocolModule:st,getViewportModule(e){let{servicesManager:t,commandsManager:n}=e;return[{name:"cornerstone",component:e=>{const{toolbarService:o}=t.services;return i.createElement(Qt,Kt({},e,{toolbarService:o,servicesManager:t,commandsManager:n}))}}]},getCommandsModule:rt,getCustomizationModule:Ze,getUtilityModule(e){let{servicesManager:t}=e;return[{name:"common",exports:{getCornerstoneLibraries:()=>({cornerstone:a,cornerstoneTools:s}),getEnabledElement:v.K8,dicomLoaderService:Zt}},{name:"core",exports:{Enums:a.Enums}},{name:"tools",exports:{toolNames:A,Enums:s.Enums}}]}}},73704:(e,t,n)=>{"use strict";n.d(t,{K8:()=>i,Yc:()=>r,mc:()=>a});const o={DEFAULT_CONTEXT:"CORNERSTONE",enabledElements:{}},r=(e,t,n)=>{const r=n||o.DEFAULT_CONTEXT;o.enabledElements[e]={element:t,context:r}},i=e=>o.enabledElements[e],a=()=>{o.enabledElements={}}},87172:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});var o=n(3743);function r(e){if(e)return function(e){const t=o.metaData.get("instance",e);return{SOPInstanceUID:t.SOPInstanceUID,SeriesInstanceUID:t.SeriesInstanceUID,StudyInstanceUID:t.StudyInstanceUID,frameNumber:t.frameNumber||1}}(e)}},78753:()=>{}}]);
|
||
//# sourceMappingURL=82.bundle.7ecb6591d92092b20e6e.js.map
|