@ohif/extension-cornerstone-dicom-sr 3.0.0 → 3.5.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,2 @@
1
1
  /*! For license information please see ohif-extension-cornerstone-dicom-sr.umd.js.LICENSE.txt */
2
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):"function"==typeof define&&define.amd?define(["@ohif/core","gl-matrix","@cornerstonejs/tools","@cornerstonejs/core","@cornerstonejs/adapters","dcmjs","@ohif/ui"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["gl-matrix"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["@cornerstonejs/adapters"],e.dcmjs,e["@ohif/ui"])}(globalThis,((e,t,n,r,o,a,i)=>(()=>{var s,c,l={365:(e,t,n)=>{"use strict";n.d(t,{l2:()=>a,yR:()=>i});var r=n(464);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;const a=(0,r.getEnabledElement)(e),{viewport:i}=a;o.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},414:(e,t,n)=>{"use strict";n.d(t,{Z:()=>g});var r=n(464),o=n(762),a=n.n(o);var i=n(32);const{guid:s}=a().utils,{MeasurementReport:c,CORNERSTONE_3D_TAG:l}=i.adaptersSR.Cornerstone3D,u="Cornerstone3DTools",d="0.1",f=["cornerstoneTools@^4.0.0"],p=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},m=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=p(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function g(e,t){let{servicesManager:n,extensionManager:a}=e;const i=a.getActiveDataSource()[0],{measurementService:g,displaySetService:y,customizationService:I}=n.services,v=I.getCustomization("codingValues",{}),b=y.getDisplaySetByUID(t),C=g.getSourceMappings(u,d);if(!C||!C.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const O=o.DicomMetadataStore.getInstance(b.StudyInstanceUID,b.SeriesInstanceUID,b.SOPInstanceUID),R={},E={};b.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;R[t]||(R[t]=n,E[t]=[]),E[t][r]||(E[t][r]=n)}));const T=function(e){const t="Imaging Measurements",n="Measurement Group",r="Tracking Identifier",o=S(e.ContentSequence).find(h(t)),a=S(o.ContentSequence).filter(h(n)),i={},s=c.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,u=[];return Object.keys(s).forEach((e=>{u.push(s[e]),i[e]=[]})),a.forEach(((e,t)=>{const n=S(e.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeMeaning===r)),o=n.TextValue;let[a,i]=o.split(":");f.includes(a)&&(a=l);const s=`${a}:${i}`;n.TextValue=s})),e}(O),D=c.generateToolState(T,R,r.utilities.imageToWorldCoords,r.metaData),w=C.map((e=>e.annotationType)),N={};Object.keys(D).forEach((e=>{w.includes(e)&&(N[e]=D[e])}));const P=[];let U;Object.keys(N).forEach((e=>{N[e].forEach((e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=E[e.sopInstanceUid][t]||R[e.sopInstanceUid];P.includes(n)||P.push(n)}))}));const x=[];for(let e=0;e<P.length;e++){const t=P[e],{SeriesInstanceUID:n,StudyInstanceUID:o}=r.metaData.get("instance",t);x.includes(n)||x.push(n),U?U!==o&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):U=o}return Object.keys(N).forEach((e=>{N[e].forEach((t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=E[t.sopInstanceUid][n]||R[t.sopInstanceUid];t.uid=s();const a=r.metaData.get("instance",o),{FrameOfReferenceUID:c}=a,l={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:c}},f=g.getSource(u,d);l.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find((e=>"CORNERSTONEFREETEXT"===e.CodeValue));return r?r.CodeMeaning:n&&"CORNERSTONEFREETEXT"===n.CodeValue?n.CodeMeaning:void 0}(t),l.data.finding=p(v,t.finding?.[0]),l.data.findingSites=m(v,t.findingSites),l.data.site=l.data.findingSites?.[0];const S=C.find((t=>t.annotationType===e));g.addRawMeasurement(f,e,{annotation:l},S.toMeasurementSchema,i),P.includes(o)||P.push(o)}))})),b.isHydrated=!0,{StudyInstanceUID:U,SeriesInstanceUIDs:x}}const S=function(e){return Array.isArray(e)?e:[e]},h=e=>t=>t.ConceptNameCodeSequence.CodeMeaning===e},43:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>j});var r=n(216),o=n.n(r),a=n(735);n(432);Object.create(null);function i(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var s={};function c(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&s[t[0]]||("string"==typeof t[0]&&(s[t[0]]=new Date),i.apply(void 0,t))}function l(e,t,n){e.loadNamespaces(t,(function(){if(e.isInitialized)n();else{e.on("initialized",(function t(){setTimeout((function(){e.off("initialized",t)}),0),n()}))}}))}function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function d(e){var t=function(e,t){if("object"!==u(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==u(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===u(t)?t:String(t)}function f(e,t,n){return(t=d(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var p=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,m={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"',"&nbsp;":" ","&#160;":" ","&copy;":"©","&#169;":"©","&reg;":"®","&#174;":"®","&hellip;":"…","&#8230;":"…","&#x2F;":"/","&#47;":"/"},g=function(e){return m[e]};var S={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(p,g)}};var h;function y(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,d(r.key),r)}}var I=(0,a.createContext)(),v=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}var t,n,r;return t=e,(n=[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach((function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)}))}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}])&&y(t.prototype,n),r&&y(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function C(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return b(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function R(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?O(Object(n),!0).forEach((function(t){f(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):O(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var E=function(e,t){var n=(0,a.useRef)();return(0,a.useEffect)((function(){n.current=t?n.current:e}),[e,t]),n.current};function T(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,r=(0,a.useContext)(I)||{},o=r.i18n,i=r.defaultNS,s=n||o||h;if(s&&!s.reportNamespaces&&(s.reportNamespaces=new v),!s){c("You will need to pass in an i18next instance by using initReactI18next");var d=function(e,t){return"string"==typeof t?t:t&&"object"===u(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},f=[d,{},!1];return f.t=d,f.i18n={},f.ready=!1,f}s.options.react&&void 0!==s.options.react.wait&&c("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var p=R(R(R({},S),s.options.react),t),m=p.useSuspense,g=p.keyPrefix,y=e||i||s.options&&s.options.defaultNS;y="string"==typeof y?[y]:y||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(y);var b=(s.isInitialized||s.initializedStoreOnce)&&y.every((function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{precheck:function(t,r){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=t.languages[0],o=!!t.options&&t.options.fallbackLng,a=t.languages[t.languages.length-1];if("cimode"===r.toLowerCase())return!0;var i=function(e,n){var r=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===r||2===r};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(r,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(r,e)||o&&!i(a,e)))}(e,t,n):(c("i18n.languages were undefined or empty",t.languages),!0)}(e,s,p)}));function O(){return s.getFixedT(null,"fallback"===p.nsMode?y:y[0],g)}var T=C((0,a.useState)(O),2),D=T[0],w=T[1],N=y.join(),P=E(N),U=(0,a.useRef)(!0);(0,a.useEffect)((function(){var e=p.bindI18n,t=p.bindI18nStore;function n(){U.current&&w(O)}return U.current=!0,b||m||l(s,y,(function(){U.current&&w(O)})),b&&P&&P!==N&&U.current&&w(O),e&&s&&s.on(e,n),t&&s&&s.store.on(t,n),function(){U.current=!1,e&&s&&e.split(" ").forEach((function(e){return s.off(e,n)})),t&&s&&t.split(" ").forEach((function(e){return s.store.off(e,n)}))}}),[s,N]);var x=(0,a.useRef)(!0);(0,a.useEffect)((function(){U.current&&!x.current&&w(O),x.current=!1}),[s,g]);var M=[D,s,b];if(M.t=D,M.i18n=s,M.ready=b,b)return M;if(!b&&!m)return M;throw new Promise((function(e){l(s,y,(function(){e()}))}))}var D=n(762),w=n.n(D),N=n(365),P=n(369),U=n(414);function x(){return x=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},x.apply(this,arguments)}const{formatDate:M}=D.utils;function k(e){const{children:t,dataSource:n,displaySets:r,viewportIndex:o,viewportLabel:i,viewportOptions:s,servicesManager:c,extensionManager:l}=e,{displaySetService:u,cornerstoneViewportService:d,measurementService:f}=c.services;if(r.length>1)throw new Error("SR viewport should only have a single display set");const p=r[0],[m,g]=(0,P.useViewportGrid)(),[S,h]=(0,a.useState)(0),[y,I]=(0,a.useState)(1),[v,b]=(0,a.useState)(null),[C,O]=(0,a.useState)(null),[R,E]=(0,a.useState)(null),{viewports:D,activeViewportIndex:k}=m;let j,q;if(l.registeredExtensionIds.includes("@ohif/extension-measurement-tracking")){const e=l.getModuleEntry("@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext"),t=(0,a.useContext)(e.context);j=t?.[0],q=t?.[1]}q||(j=null,q=(e,t)=>{let{displaySetInstanceUID:n}=t;f.clearMeasurements();const{SeriesInstanceUIDs:r}=(0,U.Z)({servicesManager:c,extensionManager:l},n),o=u.getDisplaySetsForSeries(r[0]);o.length&&g.setDisplaySetsForViewports([{viewportIndex:k,displaySetInstanceUIDs:[o[0].displaySetInstanceUID]}])});const A=(0,a.useCallback)((e=>{const{measurements:t}=p;(0,N.l2)(R,t.map((e=>e.TrackingUniqueIdentifier)),e)}),[R,S,p]),L=e=>{E(e.detail.element)},_=(0,a.useCallback)((e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=p;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o,i=n.getDisplaySetByUID(a),s=i.images[0],c={PatientID:s.PatientID,PatientName:s.PatientName,PatientSex:s.PatientSex,PatientAge:s.PatientAge,SliceThickness:s.SliceThickness,StudyDate:s.StudyDate,SeriesDescription:s.SeriesDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesNumber:s.SeriesNumber,ManufacturerModelName:s.ManufacturerModelName,SpacingBetweenSlices:s.SpacingBetweenSlices};return{referencedDisplaySetMetadata:c,referencedDisplaySet:i}}(p,e,u).then((t=>{let{referencedDisplaySet:n,referencedDisplaySetMetadata:r}=t;if(h(e),b(n),O(r),n.displaySetInstanceUID===v?.displaySetInstanceUID){const{measurements:t}=p,n=d.getViewportInfoByIndex(o),r=d.getCornerstoneViewport(n.getViewportId()),a=r.getImageIds().indexOf(t[e].imageId);-1!==a&&r.setImageIdIndex(a)}})))}),[n,p,v,o]),F=(0,a.useCallback)((()=>{if(!v)return null;const{component:t}=l.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{measurements:n}=p,r=n[S];if(!r)return null;const o=v.images.findIndex((e=>e.imageId===r.imageId));return a.createElement(t,x({},e,{displaySets:[v],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:L,initialImageIndex:o}))}),[v,o,S]),V=(0,a.useCallback)((e=>{let t=S;"right"===e?(t++,t>=y&&(t=0)):(t--,t<0&&(t=y-1)),A(t),_(t)}),[S,y,_,A]);(0,a.useEffect)((()=>{const e=u.subscribe(u.EVENTS.DISPLAY_SETS_REMOVED,(e=>{let{displaySetInstanceUIDs:t}=e;const n=D[k];t.includes(n.displaySetInstanceUID)&&g.setDisplaySetsForViewport({viewportIndex:k,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{p.isLoaded||p.load();const e=p.measurements.length;I(e)}),[p]),(0,a.useEffect)((()=>{R&&p.isLoaded&&A(S)}),[S,R,A,p]);let $=j?.context?.trackedSeries?.length>0;(0,a.useEffect)((()=>{$=j?.context?.trackedSeries?.length>0}),[j]),(0,a.useEffect)((()=>{_(S)}),[n,p]);let B=null;if(!v||!C)return null;t&&t.length&&(B=t.map(((e,t)=>e&&a.cloneElement(e,{viewportIndex:o,key:t}))));const{PatientID:G,PatientName:W,PatientSex:H,PatientAge:Y,SliceThickness:z,ManufacturerModelName:X,StudyDate:J,SeriesDescription:K,SpacingBetweenSlices:Z,SeriesNumber:Q}=C;return a.createElement(a.Fragment,null,a.createElement(P.ViewportActionBar,{onDoubleClick:e=>{e.stopPropagation(),e.preventDefault()},onArrowsClick:V,getStatusComponent:()=>function(e){let{srDisplaySet:t,viewportIndex:n,isRehydratable:r,isLocked:o,sendTrackedMeasurementsEvent:i}=e;const s=()=>{i("HYDRATE_SR",{displaySetInstanceUID:t.displaySetInstanceUID,viewportIndex:n})},{t:c}=T("Common"),l=c("LOAD"),u=r&&!o?3:r&&o?2:1;let d=null,f=null;switch(u){case 1:f=()=>a.createElement(P.Icon,{name:"status-alert"}),d=()=>a.createElement("div",null,"This structured report is not compatible",a.createElement("br",null),"with this application.");break;case 2:f=()=>a.createElement(P.Icon,{name:"status-locked"}),d=()=>a.createElement("div",null,"This structured report is currently read-only",a.createElement("br",null),"because you are tracking measurements in",a.createElement("br",null),"another viewport.");break;case 3:f=()=>a.createElement(P.Icon,{name:"status-untracked"}),d=()=>a.createElement("div",null,`Click ${l} to restore measurements.`)}const p=()=>a.createElement("div",{className:"flex h-6 leading-6 cursor-default text-sm text-white"},a.createElement("div",{className:"min-w-[45px] flex items-center p-1 rounded-l-xl rounded-r bg-customgray-100"},a.createElement(f,null),a.createElement("span",{className:"ml-1"},"SR")),3===u&&a.createElement("div",{className:"ml-1 px-1.5 rounded cursor-pointer hover:text-black bg-primary-main hover:bg-primary-light",onMouseUp:s},l));return a.createElement(a.Fragment,null,d&&a.createElement(P.Tooltip,{content:a.createElement(d,null),position:"bottom-left"},a.createElement(p,null)),!d&&a.createElement(p,null))}({srDisplaySet:p,viewportIndex:o,isTracked:!1,isRehydratable:p.isRehydratable,isLocked:$,sendTrackedMeasurementsEvent:q}),studyData:{label:i,useAltStyling:!0,studyDate:M(J),currentSeries:Q,seriesDescription:K||"",patientInformation:{patientName:W?w().utils.formatPN(W.Alphabetic):"",patientSex:H||"",patientAge:Y||"",MRN:G||"",thickness:z?`${z.toFixed(2)}mm`:"",spacing:void 0!==Z?`${Z.toFixed(2)}mm`:"",scanner:X||""}}}),a.createElement("div",{className:"relative flex flex-row w-full h-full overflow-hidden"},F(),B))}k.propTypes={displaySets:o().arrayOf(o().object),viewportIndex:o().number.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,customProps:o().object,viewportOptions:o().object,viewportLabel:o().string,servicesManager:o().instanceOf(D.ServicesManager).isRequired,extensionManager:o().instanceOf(D.ExtensionManager).isRequired},k.defaultProps={customProps:{}};const j=k},516:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,o){for(var a,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c<arguments.length;c++){for(var l in a=Object(arguments[c]))n.call(a,l)&&(s[l]=a[l]);if(t){i=t(a);for(var u=0;u<i.length;u++)r.call(a,i[u])&&(s[i[u]]=a[i[u]])}}return s}},459:(e,t,n)=>{"use strict";var r=n(704);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},216:(e,t,n)=>{e.exports=n(459)()},704:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},447:(e,t,n)=>{"use strict";var r=n(516),o=60103,a=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,s=60110,c=60112;t.Suspense=60113;var l=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;o=d("react.element"),a=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),s=d("react.context"),c=d("react.forward_ref"),t.Suspense=d("react.suspense"),l=d("react.memo"),u=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function S(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function h(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}S.prototype.isReactComponent={},S.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},S.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},h.prototype=S.prototype;var I=y.prototype=new h;I.constructor=y,r(I,S.prototype),I.isPureReactComponent=!0;var v={current:null},b=Object.prototype.hasOwnProperty,C={key:!0,ref:!0,__self:!0,__source:!0};function O(e,t,n){var r,a={},i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)b.call(t,r)&&!C.hasOwnProperty(r)&&(a[r]=t[r]);var c=arguments.length-2;if(1===c)a.children=n;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===a[r]&&(a[r]=c[r]);return{$$typeof:o,type:e,key:i,ref:s,props:a,_owner:v.current}}function R(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var E=/\/+/g;function T(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function D(e,t,n,r,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case o:case a:c=!0}}if(c)return i=i(c=e),e=""===r?"."+T(c,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(E,"$&/")+"/"),D(i,t,n,"",(function(e){return e}))):null!=i&&(R(i)&&(i=function(e,t){return{$$typeof:o,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(E,"$&/")+"/")+e)),t.push(i)),1;if(c=0,r=""===r?".":r+":",Array.isArray(e))for(var l=0;l<e.length;l++){var u=r+T(s=e[l],l);c+=D(s,t,n,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=D(s=s.value,t,n,u=r+T(s,l++),i);else if("object"===s)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return c}function w(e,t,n){if(null==e)return e;var r=[],o=0;return D(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function N(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var P={current:null};function U(){var e=P.current;if(null===e)throw Error(p(321));return e}var x={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:v,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:w,forEach:function(e,t,n){w(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return w(e,(function(){t++})),t},toArray:function(e){return w(e,(function(e){return e}))||[]},only:function(e){if(!R(e))throw Error(p(143));return e}},t.Component=S,t.PureComponent=y,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=x,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var a=r({},e.props),i=e.key,s=e.ref,c=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,c=v.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(u in t)b.call(t,u)&&!C.hasOwnProperty(u)&&(a[u]=void 0===t[u]&&void 0!==l?l[u]:t[u])}var u=arguments.length-2;if(1===u)a.children=n;else if(1<u){l=Array(u);for(var d=0;d<u;d++)l[d]=arguments[d+2];a.children=l}return{$$typeof:o,type:e.type,key:i,ref:s,props:a,_owner:c}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:s,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=O,t.createFactory=function(e){var t=O.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:l,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return U().useCallback(e,t)},t.useContext=function(e,t){return U().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return U().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return U().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return U().useLayoutEffect(e,t)},t.useMemo=function(e,t){return U().useMemo(e,t)},t.useReducer=function(e,t,n){return U().useReducer(e,t,n)},t.useRef=function(e){return U().useRef(e)},t.useState=function(e){return U().useState(e)},t.version="17.0.2"},735:(e,t,n)=>{"use strict";e.exports=n(447)},432:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},32:e=>{"use strict";e.exports=o},464:e=>{"use strict";e.exports=r},867:e=>{"use strict";e.exports=n},762:t=>{"use strict";t.exports=e},369:e=>{"use strict";e.exports=i},836:e=>{"use strict";e.exports=a},845:e=>{"use strict";e.exports=t}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e](n,n.exports,d),n.exports}d.m=l,s=[],d.O=(e,t,n,r)=>{if(!t){var o=1/0;for(l=0;l<s.length;l++){for(var[t,n,r]=s[l],a=!0,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(d.O).every((e=>d.O[e](t[i])))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){s.splice(l--,1);var c=n();void 0!==c&&(e=c)}}return e}r=r||0;for(var l=s.length;l>0&&s[l-1][2]>r;l--)s[l]=s[l-1];s[l]=[t,n,r]},d.F={},d.E=e=>{Object.keys(d.F).map((t=>{d.F[t](e)}))},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c={143:0},d.F.j=e=>{if(!d.o(c,e)||void 0===c[e]){c[e]=null;var t=document.createElement("link");d.nc&&t.setAttribute("nonce",d.nc),t.rel="prefetch",t.as="script",t.href=d.p+d.u(e),document.head.appendChild(t)}},d.O.j=e=>0===c[e],d.O(0,[143],(()=>{d.E(143)}),5);var f={};return(()=>{"use strict";d.r(f),d.d(f,{createReferencedImageDisplaySet:()=>te,default:()=>ae,hydrateStructuredReport:()=>K.Z,srProtocol:()=>$});var e=d(735);const t=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-sr"}').u2,n="dicom-sr",r=`${t}.sopClassHandlerModule.${n}`;var o=d(762),a=d.n(o),i=d(845),s=d(867),c=d(464),l=d(365);const u={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"};class p extends s.AnnotationTool{constructor(){super(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{configuration:{}}),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=s.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,l.yR)(r),{activeIndex:i,trackingUniqueIdentifiers:c}=a,d=c[i],f=o.filter((e=>c.includes(e.data?.cachedStats?.TrackingUniqueIdentifier)));if(!n._actors?.size)return;const p={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<f.length;e++){const r=f[e],o=r.annotationUID,{renderableData:a}=r.data.cachedStats,{cachedStats:i}=r.data,{referencedImageId:c}=r.metadata;p.annotationUID=o;const l=this.getStyle("lineWidth",p,r),m=this.getStyle("lineDash",p,r),g={color:i.TrackingUniqueIdentifier===d?"rgb(0, 255, 0)":this.getStyle("color",p,r),lineDash:m,lineWidth:l};Object.keys(a).forEach((e=>{const i=a[e];let l,d;switch(e){case u.POINT:l=this.renderPoint;break;case u.MULTIPOINT:l=this.renderMultipoint;break;case u.POLYLINE:l=this.renderPolyLine;break;case u.CIRCLE:l=this.renderEllipse;break;case u.ELLIPSE:l=this.renderEllipse,d=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const f=l(t,n,i,o,c,g);this.renderTextBox(t,n,f,d,r,p,g)}))}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,3),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${g(t.label)}${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const i={color:a.color,width:a.lineWidth};let c=[];return n.map(((n,o)=>{const a=n.map((e=>t.worldToCanvas(e))),l=`${o}`;2===a.length?s.drawing.drawLine(e,r,l,a[0],a[1],i):s.drawing.drawPolyline(e,r,l,a,i),c=c.concat(a)})),c}renderMultipoint(e,t,n,r,o,a){let i;n.map(((n,o)=>{i=n.map((e=>t.worldToCanvas(e)));s.drawing.drawHandles(e,r,"0",i,{color:a.color})}))}renderPoint(e,t,n,r,o,a){const i=[];return n.map(((n,l)=>{const u=n[0];i.push(t.worldToCanvas(u));const d=c.metaData.get("imagePixelModule",o);let f=10,p=10;if(d){const{columns:e,rows:t}=d;f=e/10,p=t/10}const m=c.utilities.worldToImageCoords(o,u),g=c.utilities.imageToWorldCoords(o,[m[0]+f,m[1]+p]);i.push(t.worldToCanvas(g));const S=`${l}`;s.drawing.drawArrow(e,r,S,i[1],i[0],{color:a.color,width:a.lineWidth})})),i}renderEllipse(e,t,n,r,o,a){let i;return n.map(((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;i=c.map((e=>t.worldToCanvas(e))),u=90==l||270==l?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);const d=`${o}`;s.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth})})),i}renderTextBox(e,t,n,r,o,a){let i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{};if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{label:u}=l,{color:d}=i;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=s.utilities.drawing.getTextBoxCoordsCanvas(f);o.data.handles.textBox.worldPosition=t.canvasToWorld(m);const g=t.worldToCanvas(o.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(a,o),h=s.drawing.drawLinkedTextBox(e,c,"1",p,g,n,{},{...S,color:d}),{x:y,y:I,width:v,height:b}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([y,I]),topRight:t.canvasToWorld([y+v,I]),bottomLeft:t.canvasToWorld([y,I+b]),bottomRight:t.canvasToWorld([y+v,I+b])}}}p.toolName="DICOMSRDisplay";const m={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function g(e){const t=m[e];return void 0!==t?t:e}const S={DICOMSRDisplay:p.toolName,SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},h=1e-4;function y(e,t,n){const r=S.DICOMSRDisplay,o={TrackingUniqueIdentifier:e.TrackingUniqueIdentifier,renderableData:{},labels:e.labels,imageId:t};e.coords.forEach((n=>{const{GraphicType:r,GraphicData:a}=n;void 0===o.renderableData[r]&&(o.renderableData[r]=[]),o.renderableData[r].push(function(e,t,n,r){const[o,a]=r.split(":");let s;switch(e){case u.POINT:case u.MULTIPOINT:case u.POLYLINE:s=[];for(let e=0;e<t.length;e+=2){const r=c.utilities.imageToWorldCoords(n,[t[e],t[e+1]]);s.push(r)}break;case u.CIRCLE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const r=e[0],o=e[1],a=i.vec3.distance(r,o),l=c.metaData.get("imagePlaneModule",n);if(!l)throw new Error("No imagePlaneModule found");const{columnCosines:u,rowCosines:d}=l,f=i.vec3.create();i.vec3.scaleAndAdd(f,r,u,a);const p=i.vec3.create();i.vec3.scaleAndAdd(p,r,u,-a);const m=i.vec3.create();i.vec3.scaleAndAdd(m,r,d,a);const g=i.vec3.create();i.vec3.scaleAndAdd(g,r,d,-a),s=[f,p,m,g];break}case u.ELLIPSE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const r=i.vec3.fromValues(...e[0]),o=i.vec3.fromValues(...e[1]),a=i.vec3.fromValues(...e[2]),l=i.vec3.fromValues(...e[3]),u=i.vec3.create();i.vec3.sub(u,o,r),i.vec3.normalize(u,u);const d=i.vec3.create();i.vec3.sub(d,l,a),i.vec3.normalize(d,d);const f=c.metaData.get("imagePlaneModule",n);if(!f)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:p}=f,m=i.vec3.fromValues(...p),g=Math.abs(i.vec3.dot(m,u)),S=Math.abs(i.vec3.dot(m,d)),y=Math.abs(g),I=Math.abs(S);s=[],Math.abs(y-1)<h?s=[e[0],e[1],e[2],e[3]]:Math.abs(I-1)<h?s=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return s}(r,a,t,e.TrackingIdentifier))}));const a=c.metaData.get("imagePlaneModule",t),l=s.annotation.state.getAnnotationManager(),d=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber||1,f={annotationUID:e.TrackingUniqueIdentifier,metadata:{FrameOfReferenceUID:a.frameOfReferenceUID,toolName:r,referencedImageId:t},data:{label:e.labels,handles:{textBox:{}},cachedStats:{TrackingUniqueIdentifier:o.TrackingUniqueIdentifier,renderableData:o.renderableData},frameNumber:d}};l.addAnnotation(f),e.loaded=!0,e.imageId=t,e.displaySetInstanceUID=n,e.ReferencedSOPInstanceUID=e.coords[0].ReferencedSOPSequence.ReferencedSOPInstanceUID,e.frameNumber=d,delete e.coords}var I=d(32);const v=I.adaptersSR.Cornerstone3D.MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,b=["cornerstoneTools@^4.0.0"],C=v.CORNERSTONE_3D_TAG;const{CodeScheme:O}=I.adaptersSR.Cornerstone3D,{ImageSet:R,MetadataProvider:E}=o.classes,T=["1.2.840.10008.5.1.4.1.1.88.11","1.2.840.10008.5.1.4.1.1.88.22","1.2.840.10008.5.1.4.1.1.88.33","1.2.840.10008.5.1.4.1.1.88.34"],D="Cornerstone3DTools",w="0.1",N=(e,t)=>{t.forEach((t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)}))},P={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",CornerstoneFreeText:O.codeValues.CORNERSTONEFREETEXT},U={SRT:"SRT",CornerstoneCodeSchemes:[O.CodingSchemeDesignator,"CST4"]},x={INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},M="CORNERSTONEFREETEXT";function k(e,t){return this.instances.push(...e),o.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function j(e,t,n){if(!e||!e.length)throw new Error("No instances were provided");o.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:i,SeriesInstanceUID:s,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:u,SeriesDate:d,ConceptNameCodeSequence:f,SOPClassUID:p}=a;if(N(a.StudyInstanceUID,e),!f||f.CodeValue!==P.ImagingMeasurementReport)return t.services.uiNotificationService.show({title:"DICOM SR",message:"OHIF only supports TID1500 Imaging Measurement Report Structured Reports. The SR you’re trying to view is not supported.",type:"warning",duration:6e3}),[];const m={Modality:"SR",displaySetInstanceUID:o.utils.guid(),SeriesDescription:l,SeriesNumber:u,SeriesDate:d,SOPInstanceUID:c,SeriesInstanceUID:s,StudyInstanceUID:i,SOPClassHandlerId:r,SOPClassUID:p,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:T,instance:a,addInstances:k};return m.load=()=>function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),i=a[0],{ContentSequence:s}=e.instance;e.referencedImages=function(e){const t=F(e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.ImageLibrary)).ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===P.ImageLibraryGroup)),n=[];return F(t.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of F(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:r}=e;n.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:r})}})),n}(s),e.measurements=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.ImagingMeasurements)),n=function(e){const t={};return e.forEach((e=>{const n=F(e.ContentSequence),r=n.find((e=>e.ConceptNameCodeSequence.CodeValue===P.TrackingUniqueIdentifier));r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==P.TrackingUniqueIdentifier&&t[o].push(e)}))})),t}(F(t.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===P.MeasurementGroup))),r=[];return Object.keys(n).forEach((e=>{const t=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const t=e.find((e=>"SCOORD"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.TrackingIdentifier));if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter((e=>"NUM"===e.ValueType)),a={loaded:!1,labels:[],coords:[L(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};return o.forEach((e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(_(t,n))})),a}(e);return function(e){const t=e.filter((e=>"NUM"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.TrackingIdentifier)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.Finding)),a=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===U.SRT&&e.ConceptNameCodeSequence.CodeValue===P.FindingSite)),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&U.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===P.CornerstoneFreeText&&i.labels.push({label:M,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find((e=>U.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===P.CornerstoneFreeText));e&&i.labels.push({label:M,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach((e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=L(n);a&&i.coords.push(a),r&&i.labels.push(_(t,r))})),i}(e)}(n[e]);t&&r.push(t)})),r}(s);const c=o.getSourceMappings(D,w);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=t.map((e=>e.annotationType)),{measurements:r}=e,o=Object.keys(v).filter((e=>"function"==typeof v[e].isValidCornerstoneTrackingIdentifier)),a=[];o.forEach((e=>{n.includes(e)&&a.push(v[e])}));for(let e=0;e<r.length;e++){const{TrackingIdentifier:t}=r[e]||{};if(a.some((e=>{let[n,r]=t.split(":");b.includes(n)&&(n=C);const o=`${n}:${r}`;return e.isValidCornerstoneTrackingIdentifier(o)})))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,c),e.isLoaded=!0,r.activeDisplaySets.forEach((t=>{q(e,t,i)})),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,(t=>{const{displaySetsAdded:n}=t;n.forEach((t=>{q(e,t,i)}))}))}(m,t,n),[m]}function q(e,t,n){let r=e.measurements.filter((e=>!1===e.loaded));if(0===r.length)return;if(!t instanceof R)return;const{sopClassUids:o,images:a}=t;if(r=r.filter((e=>e.coords.some((e=>o.includes(e.ReferencedSOPSequence.ReferencedSOPClassUID))))),0===r.length)return;const i=[];r.forEach((e=>{const{coords:t}=e;t.forEach((e=>{const t=e.ReferencedSOPSequence.ReferencedSOPInstanceUID;i.includes(t)||i.push(t)}))}));const s=n.getImageIdsForDisplaySet(t);for(const e of s){if(!r.length)return;const{SOPInstanceUID:n,frameNumber:o}=E.getUIDsFromImageID(e);if(i.includes(n))for(let a=r.length-1;a>=0;a--){const i=r[a];A(i,n,o)&&(y(i,e,t.displaySetInstanceUID),r.splice(a,1))}}}function A(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}}function L(e){const{ValueType:t,RelationshipType:n,GraphicType:r,GraphicData:o}=e;if(n!=x.INFERRED_FROM&&n!=x.CONTAINS)return void console.warn(`Relationshiptype === ${n}. Cannot deal with NON TID-1400 SCOORD group with RelationshipType !== "INFERRED FROM" or "CONTAINS"`);const a={ValueType:t,GraphicType:r,GraphicData:o};if("SCOORD"===t){const{ReferencedSOPSequence:t}=e.ContentSequence;a.ReferencedSOPSequence=t}else if("SCOORD3D"===t){const{ReferencedFrameOfReferenceSequence:t}=e.ContentSequence;a.ReferencedFrameOfReferenceSequence=t}return a}function _(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function F(e){return e?Array.isArray(e)?e:[e]:[]}const V=function(e){let{servicesManager:t,extensionManager:r}=e;return[{name:n,sopClassUids:T,getDisplaySetsFromSeries:e=>j(e,t,r)}]},$={id:"@ohif/sr",hasUpdatedPriorsInformation:!1,name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var B=d(836),G=d.n(B);const{log:W}=a();const H=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void W.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const s=e.find((e=>e.uid===r.annotationUID)),c=i[o].data;let{finding:l}=s;const u=[];s.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label})),s.findingSites&&u.push(...s.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map((e=>e.uid)).slice(),a=s.annotation.state.getAnnotationManager(),i=a.getFramesOfReference();for(let e=0;e<i.length;e++){const t=i[e],s=a.getAnnotations(t),c=Object.keys(s);for(let e=0;e<c.length;e++){const t=c[e],a=s[t];if(a)for(let e=0;e<a.length;e++){const i=a[e],s=o.findIndex((e=>e===i.annotationUID));if(-1!==s&&(r(i,t),o.splice(s,1),!o.length))return n}}}return n},{MeasurementReport:Y}=I.adaptersSR.Cornerstone3D,{log:z}=a(),X=e=>{let{}=e;const t={downloadReport:e=>{let{measurementData:n,additionalFindingTypes:r,options:o={}}=e;const a=t.generateReport(n,r,o),i=G().data.datasetToBlob(a);var s=URL.createObjectURL(i);window.location.assign(s)},storeMeasurements:async e=>{let{measurementData:t,dataSource:n,additionalFindingTypes:r,options:a={}}=e;if(z.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return z.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const e=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=H(e,t),o=Y.generateReport(r,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a}(t,r,a),{StudyInstanceUID:i,ContentSequence:s}=e;if(!s?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",e),new Error("Invalid report, no content");return await n.store.dicom(e),i&&n.deleteStudyMetadataPromise(i),o.DicomMetadataStore.addInstances([e],!0),e}catch(e){throw console.warn(e),z.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}}},n={downloadReport:{commandFn:t.downloadReport,storeContexts:[],options:{}},storeMeasurements:{commandFn:t.storeMeasurements,storeContexts:[],options:{}}};return{actions:t,definitions:n,defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};function J(e,t,n){class r extends t{}r.toolName=e,(0,s.addTool)(r)}var K=d(414);const Z=o.classes.ImageSet,Q=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find((e=>e.SOPInstanceUID===r))},ee=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const a=Q(o,e);a?(r[t]=a,n.push(a)):console.log("Measurement",o,"had no instances found")}return n},te=(e,t)=>{const n=ee(e,t),r=new Z(n),o=n[0];return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:o.SeriesDate,SeriesTime:o.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:o.StudyInstanceUID,SeriesNumber:o.SeriesNumber||0,SOPClassUID:o.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...ee(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r};function ne(){return ne=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ne.apply(this,arguments)}const re=e.lazy((()=>Promise.resolve().then(d.bind(d,43)))),oe=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(re,t)),ae={id:t,onModeEnter:function(e){let{servicesManager:t}=e;const{displaySetService:n}=t.services;[...n.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===r)).forEach((e=>{e.isHydrated=!1}))},preRegistration:function(e){let{configuration:t={}}=e;(0,s.addTool)(p),J(S.SRLength,s.LengthTool),J(S.SRBidirectional,s.BidirectionalTool),J(S.SREllipticalROI,s.EllipticalROITool),J(S.SRCircleROI,s.CircleROITool),J(S.SRArrowAnnotate,s.ArrowAnnotateTool),J(S.SRAngle,s.AngleTool),J(S.SRCobbAngle,s.CobbAngleTool),J(S.SRPlanarFreehandROI,s.PlanarFreehandROITool);const n={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{SRLength:n,SRBidirectional:n,SREllipticalROI:n,SRCircleROI:n,SRArrowAnnotate:n,SRCobbAngle:n,SRAngle:n,SRPlanarFreehandROI:n,global:{}})},getViewportModule(t){let{servicesManager:n,extensionManager:r}=t;return[{name:"dicom-sr",component:t=>e.createElement(oe,ne({servicesManager:n,extensionManager:r},t))}]},getCommandsModule:X,getSopClassHandlerModule:V,getUtilityModule(e){let{servicesManager:t}=e;return[{name:"tools",exports:{toolNames:S}}]}}})(),f=d.O(f)})()));
3
- //# sourceMappingURL=ohif-extension-cornerstone-dicom-sr.umd.js.map
2
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):"function"==typeof define&&define.amd?define(["@ohif/core","gl-matrix","@cornerstonejs/tools","@cornerstonejs/core","@cornerstonejs/adapters","dcmjs","@ohif/ui"],t):"object"==typeof exports?exports["ohif-extension-cornerstone-dicom-sr"]=t(require("@ohif/core"),require("gl-matrix"),require("@cornerstonejs/tools"),require("@cornerstonejs/core"),require("@cornerstonejs/adapters"),require("dcmjs"),require("@ohif/ui")):e["ohif-extension-cornerstone-dicom-sr"]=t(e["@ohif/core"],e["gl-matrix"],e["@cornerstonejs/tools"],e["@cornerstonejs/core"],e["@cornerstonejs/adapters"],e.dcmjs,e["@ohif/ui"])}(globalThis,((e,t,n,r,o,a,i)=>(()=>{var s,c,l={365:(e,t,n)=>{"use strict";n.d(t,{l2:()=>a,yR:()=>i});var r=n(464);const o={TrackingUniqueIdentifier:null,trackingIdentifiersByViewportId:{}};function a(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;const a=(0,r.getEnabledElement)(e),{viewport:i}=a;o.trackingIdentifiersByViewportId[i.id]={trackingUniqueIdentifiers:t,activeIndex:n}}function i(e){const t=(0,r.getEnabledElement)(e),{viewport:n}=t;return o.trackingIdentifiersByViewportId[n.id]?o.trackingIdentifiersByViewportId[n.id]:{trackingUniqueIdentifiers:[]}}},414:(e,t,n)=>{"use strict";n.d(t,{Z:()=>g});var r=n(464),o=n(762),a=n.n(o);var i=n(32);const{guid:s}=a().utils,{MeasurementReport:c,CORNERSTONE_3D_TAG:l}=i.adaptersSR.Cornerstone3D,u="Cornerstone3DTools",d="0.1",f=["cornerstoneTools@^4.0.0"],p=(e,t)=>{if(!t||"CORNERSTONEJS"===t.CodingSchemeDesignator)return;const n=`${t.CodingSchemeDesignator}:${t.CodeValue}`;return{...e[n],ref:n,...t,text:t.CodeMeaning}},m=(e,t)=>{if(!t||!t.length)return;const n=[];for(let r=0;r<t.length;r++){const o=p(e,t[r][0]||t[r]);o&&n.push(o)}return n.length&&n||void 0};function g(e,t){let{servicesManager:n,extensionManager:a}=e;const i=a.getActiveDataSource()[0],{measurementService:g,displaySetService:y,customizationService:I}=n.services,v=I.getCustomization("codingValues",{}),b=y.getDisplaySetByUID(t),C=g.getSourceMappings(u,d);if(!C||!C.length)throw new Error("Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.");const O=o.DicomMetadataStore.getInstance(b.StudyInstanceUID,b.SeriesInstanceUID,b.SOPInstanceUID),R={},E={};b.measurements.forEach((e=>{const{ReferencedSOPInstanceUID:t,imageId:n,frameNumber:r}=e;R[t]||(R[t]=n,E[t]=[]),E[t][r]||(E[t][r]=n)}));const T=function(e){const t="Imaging Measurements",n="Measurement Group",r="Tracking Identifier",o=S(e.ContentSequence).find(h(t)),a=S(o.ContentSequence).filter(h(n)),i={},s=c.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,u=[];return Object.keys(s).forEach((e=>{u.push(s[e]),i[e]=[]})),a.forEach(((e,t)=>{const n=S(e.ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeMeaning===r)),o=n.TextValue;let[a,i]=o.split(":");f.includes(a)&&(a=l);const s=`${a}:${i}`;n.TextValue=s})),e}(O),D=c.generateToolState(T,R,r.utilities.imageToWorldCoords,r.metaData),w=C.map((e=>e.annotationType)),N={};Object.keys(D).forEach((e=>{w.includes(e)&&(N[e]=D[e])}));const P=[];let U;Object.keys(N).forEach((e=>{N[e].forEach((e=>{const t=e.annotation.data&&e.annotation.data.frameNumber||1,n=E[e.sopInstanceUid][t]||R[e.sopInstanceUid];P.includes(n)||P.push(n)}))}));const x=[];for(let e=0;e<P.length;e++){const t=P[e],{SeriesInstanceUID:n,StudyInstanceUID:o}=r.metaData.get("instance",t);x.includes(n)||x.push(n),U?U!==o&&console.warn("NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES."):U=o}return Object.keys(N).forEach((e=>{N[e].forEach((t=>{const n=t.annotation.data&&t.annotation.data.frameNumber||1,o=E[t.sopInstanceUid][n]||R[t.sopInstanceUid];t.uid=s();const a=r.metaData.get("instance",o),{FrameOfReferenceUID:c}=a,l={annotationUID:t.annotation.annotationUID,data:t.annotation.data,metadata:{toolName:e,referencedImageId:o,FrameOfReferenceUID:c}},f=g.getSource(u,d);l.data.label=function(e){const{findingSites:t=[],finding:n}=e;let r=t.find((e=>"CORNERSTONEFREETEXT"===e.CodeValue));return r?r.CodeMeaning:n&&"CORNERSTONEFREETEXT"===n.CodeValue?n.CodeMeaning:void 0}(t),l.data.finding=p(v,t.finding?.[0]),l.data.findingSites=m(v,t.findingSites),l.data.site=l.data.findingSites?.[0];const S=C.find((t=>t.annotationType===e));g.addRawMeasurement(f,e,{annotation:l},S.toMeasurementSchema,i),P.includes(o)||P.push(o)}))})),b.isHydrated=!0,{StudyInstanceUID:U,SeriesInstanceUIDs:x}}const S=function(e){return Array.isArray(e)?e:[e]},h=e=>t=>t.ConceptNameCodeSequence.CodeMeaning===e},43:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>j});var r=n(216),o=n.n(r),a=n(735);n(432);Object.create(null);function i(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var s={};function c(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&s[t[0]]||("string"==typeof t[0]&&(s[t[0]]=new Date),i.apply(void 0,t))}function l(e,t,n){e.loadNamespaces(t,(function(){if(e.isInitialized)n();else{e.on("initialized",(function t(){setTimeout((function(){e.off("initialized",t)}),0),n()}))}}))}function u(e){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},u(e)}function d(e){var t=function(e,t){if("object"!==u(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==u(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===u(t)?t:String(t)}function f(e,t,n){return(t=d(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var p=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,m={"&amp;":"&","&#38;":"&","&lt;":"<","&#60;":"<","&gt;":">","&#62;":">","&apos;":"'","&#39;":"'","&quot;":'"',"&#34;":'"',"&nbsp;":" ","&#160;":" ","&copy;":"©","&#169;":"©","&reg;":"®","&#174;":"®","&hellip;":"…","&#8230;":"…","&#x2F;":"/","&#47;":"/"},g=function(e){return m[e]};var S={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(p,g)}};var h;function y(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,d(r.key),r)}}var I=(0,a.createContext)(),v=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}var t,n,r;return t=e,(n=[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach((function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)}))}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}])&&y(t.prototype,n),r&&y(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function b(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function C(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return b(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?b(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function O(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function R(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?O(Object(n),!0).forEach((function(t){f(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):O(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var E=function(e,t){var n=(0,a.useRef)();return(0,a.useEffect)((function(){n.current=t?n.current:e}),[e,t]),n.current};function T(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,r=(0,a.useContext)(I)||{},o=r.i18n,i=r.defaultNS,s=n||o||h;if(s&&!s.reportNamespaces&&(s.reportNamespaces=new v),!s){c("You will need to pass in an i18next instance by using initReactI18next");var d=function(e,t){return"string"==typeof t?t:t&&"object"===u(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},f=[d,{},!1];return f.t=d,f.i18n={},f.ready=!1,f}s.options.react&&void 0!==s.options.react.wait&&c("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var p=R(R(R({},S),s.options.react),t),m=p.useSuspense,g=p.keyPrefix,y=e||i||s.options&&s.options.defaultNS;y="string"==typeof y?[y]:y||["translation"],s.reportNamespaces.addUsedNamespaces&&s.reportNamespaces.addUsedNamespaces(y);var b=(s.isInitialized||s.initializedStoreOnce)&&y.every((function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{precheck:function(t,r){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=t.languages[0],o=!!t.options&&t.options.fallbackLng,a=t.languages[t.languages.length-1];if("cimode"===r.toLowerCase())return!0;var i=function(e,n){var r=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===r||2===r};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(r,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(r,e)||o&&!i(a,e)))}(e,t,n):(c("i18n.languages were undefined or empty",t.languages),!0)}(e,s,p)}));function O(){return s.getFixedT(null,"fallback"===p.nsMode?y:y[0],g)}var T=C((0,a.useState)(O),2),D=T[0],w=T[1],N=y.join(),P=E(N),U=(0,a.useRef)(!0);(0,a.useEffect)((function(){var e=p.bindI18n,t=p.bindI18nStore;function n(){U.current&&w(O)}return U.current=!0,b||m||l(s,y,(function(){U.current&&w(O)})),b&&P&&P!==N&&U.current&&w(O),e&&s&&s.on(e,n),t&&s&&s.store.on(t,n),function(){U.current=!1,e&&s&&e.split(" ").forEach((function(e){return s.off(e,n)})),t&&s&&t.split(" ").forEach((function(e){return s.store.off(e,n)}))}}),[s,N]);var x=(0,a.useRef)(!0);(0,a.useEffect)((function(){U.current&&!x.current&&w(O),x.current=!1}),[s,g]);var M=[D,s,b];if(M.t=D,M.i18n=s,M.ready=b,b)return M;if(!b&&!m)return M;throw new Promise((function(e){l(s,y,(function(){e()}))}))}var D=n(762),w=n.n(D),N=n(365),P=n(369),U=n(414);function x(){return x=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},x.apply(this,arguments)}const{formatDate:M}=D.utils;function k(e){const{children:t,dataSource:n,displaySets:r,viewportIndex:o,viewportLabel:i,viewportOptions:s,servicesManager:c,extensionManager:l}=e,{displaySetService:u,cornerstoneViewportService:d,measurementService:f}=c.services;if(r.length>1)throw new Error("SR viewport should only have a single display set");const p=r[0],[m,g]=(0,P.useViewportGrid)(),[S,h]=(0,a.useState)(0),[y,I]=(0,a.useState)(1),[v,b]=(0,a.useState)(null),[C,O]=(0,a.useState)(null),[R,E]=(0,a.useState)(null),{viewports:D,activeViewportIndex:k}=m;let j,q;if(l.registeredExtensionIds.includes("@ohif/extension-measurement-tracking")){const e=l.getModuleEntry("@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext"),t=(0,a.useContext)(e.context);j=t?.[0],q=t?.[1]}q||(j=null,q=(e,t)=>{let{displaySetInstanceUID:n}=t;f.clearMeasurements();const{SeriesInstanceUIDs:r}=(0,U.Z)({servicesManager:c,extensionManager:l},n),o=u.getDisplaySetsForSeries(r[0]);o.length&&g.setDisplaySetsForViewports([{viewportIndex:k,displaySetInstanceUIDs:[o[0].displaySetInstanceUID]}])});const A=(0,a.useCallback)((e=>{const{measurements:t}=p;(0,N.l2)(R,t.map((e=>e.TrackingUniqueIdentifier)),e)}),[R,S,p]),L=e=>{E(e.detail.element)},_=(0,a.useCallback)((e=>{const{StudyInstanceUID:t,displaySetInstanceUID:n,sopClassUids:r}=p;t&&n&&(r&&r.length>1&&console.warn("More than one SOPClassUID in the same series is not yet supported."),async function(e,t,n){const{measurements:r}=e,o=r[t],{displaySetInstanceUID:a}=o,i=n.getDisplaySetByUID(a),s=i.images[0],c={PatientID:s.PatientID,PatientName:s.PatientName,PatientSex:s.PatientSex,PatientAge:s.PatientAge,SliceThickness:s.SliceThickness,StudyDate:s.StudyDate,SeriesDescription:s.SeriesDescription,SeriesInstanceUID:s.SeriesInstanceUID,SeriesNumber:s.SeriesNumber,ManufacturerModelName:s.ManufacturerModelName,SpacingBetweenSlices:s.SpacingBetweenSlices};return{referencedDisplaySetMetadata:c,referencedDisplaySet:i}}(p,e,u).then((t=>{let{referencedDisplaySet:n,referencedDisplaySetMetadata:r}=t;if(h(e),b(n),O(r),n.displaySetInstanceUID===v?.displaySetInstanceUID){const{measurements:t}=p,n=d.getViewportInfoByIndex(o),r=d.getCornerstoneViewport(n.getViewportId()),a=r.getImageIds().indexOf(t[e].imageId);-1!==a&&r.setImageIdIndex(a)}})))}),[n,p,v,o]),F=(0,a.useCallback)((()=>{if(!v)return null;const{component:t}=l.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone"),{measurements:n}=p,r=n[S];if(!r)return null;const o=v.images.findIndex((e=>e.imageId===r.imageId));return a.createElement(t,x({},e,{displaySets:[v],viewportOptions:{...s,toolGroupId:"SRToolGroup",viewportType:"stack",positionIds:null},onElementEnabled:L,initialImageIndex:o}))}),[v,o,S]),V=(0,a.useCallback)((e=>{let t=S;"right"===e?(t++,t>=y&&(t=0)):(t--,t<0&&(t=y-1)),A(t),_(t)}),[S,y,_,A]);(0,a.useEffect)((()=>{const e=u.subscribe(u.EVENTS.DISPLAY_SETS_REMOVED,(e=>{let{displaySetInstanceUIDs:t}=e;const n=D[k];t.includes(n.displaySetInstanceUID)&&g.setDisplaySetsForViewport({viewportIndex:k,displaySetInstanceUIDs:[]})}));return()=>{e.unsubscribe()}}),[]),(0,a.useEffect)((()=>{p.isLoaded||p.load();const e=p.measurements.length;I(e)}),[p]),(0,a.useEffect)((()=>{R&&p.isLoaded&&A(S)}),[S,R,A,p]);let $=j?.context?.trackedSeries?.length>0;(0,a.useEffect)((()=>{$=j?.context?.trackedSeries?.length>0}),[j]),(0,a.useEffect)((()=>{_(S)}),[n,p]);let B=null;if(!v||!C)return null;t&&t.length&&(B=t.map(((e,t)=>e&&a.cloneElement(e,{viewportIndex:o,key:t}))));const{PatientID:G,PatientName:W,PatientSex:H,PatientAge:Y,SliceThickness:z,ManufacturerModelName:X,StudyDate:J,SeriesDescription:K,SpacingBetweenSlices:Z,SeriesNumber:Q}=C;return a.createElement(a.Fragment,null,a.createElement(P.ViewportActionBar,{onDoubleClick:e=>{e.stopPropagation(),e.preventDefault()},onArrowsClick:V,getStatusComponent:()=>function(e){let{srDisplaySet:t,viewportIndex:n,isRehydratable:r,isLocked:o,sendTrackedMeasurementsEvent:i}=e;const s=()=>{i("HYDRATE_SR",{displaySetInstanceUID:t.displaySetInstanceUID,viewportIndex:n})},{t:c}=T("Common"),l=c("LOAD"),u=r&&!o?3:r&&o?2:1;let d=null,f=null;switch(u){case 1:f=()=>a.createElement(P.Icon,{name:"status-alert"}),d=()=>a.createElement("div",null,"This structured report is not compatible",a.createElement("br",null),"with this application.");break;case 2:f=()=>a.createElement(P.Icon,{name:"status-locked"}),d=()=>a.createElement("div",null,"This structured report is currently read-only",a.createElement("br",null),"because you are tracking measurements in",a.createElement("br",null),"another viewport.");break;case 3:f=()=>a.createElement(P.Icon,{name:"status-untracked"}),d=()=>a.createElement("div",null,`Click ${l} to restore measurements.`)}const p=()=>a.createElement("div",{className:"flex h-6 leading-6 cursor-default text-sm text-white"},a.createElement("div",{className:"min-w-[45px] flex items-center p-1 rounded-l-xl rounded-r bg-customgray-100"},a.createElement(f,null),a.createElement("span",{className:"ml-1"},"SR")),3===u&&a.createElement("div",{className:"ml-1 px-1.5 rounded cursor-pointer hover:text-black bg-primary-main hover:bg-primary-light",onMouseUp:s},l));return a.createElement(a.Fragment,null,d&&a.createElement(P.Tooltip,{content:a.createElement(d,null),position:"bottom-left"},a.createElement(p,null)),!d&&a.createElement(p,null))}({srDisplaySet:p,viewportIndex:o,isTracked:!1,isRehydratable:p.isRehydratable,isLocked:$,sendTrackedMeasurementsEvent:q}),studyData:{label:i,useAltStyling:!0,studyDate:M(J),currentSeries:Q,seriesDescription:K||"",patientInformation:{patientName:W?w().utils.formatPN(W.Alphabetic):"",patientSex:H||"",patientAge:Y||"",MRN:G||"",thickness:z?`${z.toFixed(2)}mm`:"",spacing:void 0!==Z?`${Z.toFixed(2)}mm`:"",scanner:X||""}}}),a.createElement("div",{className:"relative flex flex-row w-full h-full overflow-hidden"},F(),B))}k.propTypes={displaySets:o().arrayOf(o().object),viewportIndex:o().number.isRequired,dataSource:o().object,children:o().node,viewportLabel:o().string,customProps:o().object,viewportOptions:o().object,viewportLabel:o().string,servicesManager:o().instanceOf(D.ServicesManager).isRequired,extensionManager:o().instanceOf(D.ExtensionManager).isRequired},k.defaultProps={customProps:{}};const j=k},516:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,o){for(var a,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c<arguments.length;c++){for(var l in a=Object(arguments[c]))n.call(a,l)&&(s[l]=a[l]);if(t){i=t(a);for(var u=0;u<i.length;u++)r.call(a,i[u])&&(s[i[u]]=a[i[u]])}}return s}},459:(e,t,n)=>{"use strict";var r=n(704);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},216:(e,t,n)=>{e.exports=n(459)()},704:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},447:(e,t,n)=>{"use strict";var r=n(516),o=60103,a=60106;t.Fragment=60107,t.StrictMode=60108,t.Profiler=60114;var i=60109,s=60110,c=60112;t.Suspense=60113;var l=60115,u=60116;if("function"==typeof Symbol&&Symbol.for){var d=Symbol.for;o=d("react.element"),a=d("react.portal"),t.Fragment=d("react.fragment"),t.StrictMode=d("react.strict_mode"),t.Profiler=d("react.profiler"),i=d("react.provider"),s=d("react.context"),c=d("react.forward_ref"),t.Suspense=d("react.suspense"),l=d("react.memo"),u=d("react.lazy")}var f="function"==typeof Symbol&&Symbol.iterator;function p(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g={};function S(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function h(){}function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}S.prototype.isReactComponent={},S.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(p(85));this.updater.enqueueSetState(this,e,t,"setState")},S.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},h.prototype=S.prototype;var I=y.prototype=new h;I.constructor=y,r(I,S.prototype),I.isPureReactComponent=!0;var v={current:null},b=Object.prototype.hasOwnProperty,C={key:!0,ref:!0,__self:!0,__source:!0};function O(e,t,n){var r,a={},i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)b.call(t,r)&&!C.hasOwnProperty(r)&&(a[r]=t[r]);var c=arguments.length-2;if(1===c)a.children=n;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];a.children=l}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===a[r]&&(a[r]=c[r]);return{$$typeof:o,type:e,key:i,ref:s,props:a,_owner:v.current}}function R(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}var E=/\/+/g;function T(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function D(e,t,n,r,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case o:case a:c=!0}}if(c)return i=i(c=e),e=""===r?"."+T(c,0):r,Array.isArray(i)?(n="",null!=e&&(n=e.replace(E,"$&/")+"/"),D(i,t,n,"",(function(e){return e}))):null!=i&&(R(i)&&(i=function(e,t){return{$$typeof:o,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,n+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(E,"$&/")+"/")+e)),t.push(i)),1;if(c=0,r=""===r?".":r+":",Array.isArray(e))for(var l=0;l<e.length;l++){var u=r+T(s=e[l],l);c+=D(s,t,n,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=f&&e[f]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=D(s=s.value,t,n,u=r+T(s,l++),i);else if("object"===s)throw t=""+e,Error(p(31,"[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t));return c}function w(e,t,n){if(null==e)return e;var r=[],o=0;return D(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function N(e){if(-1===e._status){var t=e._result;t=t(),e._status=0,e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}if(1===e._status)return e._result;throw e._result}var P={current:null};function U(){var e=P.current;if(null===e)throw Error(p(321));return e}var x={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:v,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:w,forEach:function(e,t,n){w(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return w(e,(function(){t++})),t},toArray:function(e){return w(e,(function(e){return e}))||[]},only:function(e){if(!R(e))throw Error(p(143));return e}},t.Component=S,t.PureComponent=y,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=x,t.cloneElement=function(e,t,n){if(null==e)throw Error(p(267,e));var a=r({},e.props),i=e.key,s=e.ref,c=e._owner;if(null!=t){if(void 0!==t.ref&&(s=t.ref,c=v.current),void 0!==t.key&&(i=""+t.key),e.type&&e.type.defaultProps)var l=e.type.defaultProps;for(u in t)b.call(t,u)&&!C.hasOwnProperty(u)&&(a[u]=void 0===t[u]&&void 0!==l?l[u]:t[u])}var u=arguments.length-2;if(1===u)a.children=n;else if(1<u){l=Array(u);for(var d=0;d<u;d++)l[d]=arguments[d+2];a.children=l}return{$$typeof:o,type:e.type,key:i,ref:s,props:a,_owner:c}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:s,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:i,_context:e},e.Consumer=e},t.createElement=O,t.createFactory=function(e){var t=O.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:u,_payload:{_status:-1,_result:e},_init:N}},t.memo=function(e,t){return{$$typeof:l,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return U().useCallback(e,t)},t.useContext=function(e,t){return U().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return U().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return U().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return U().useLayoutEffect(e,t)},t.useMemo=function(e,t){return U().useMemo(e,t)},t.useReducer=function(e,t,n){return U().useReducer(e,t,n)},t.useRef=function(e){return U().useRef(e)},t.useState=function(e){return U().useState(e)},t.version="17.0.2"},735:(e,t,n)=>{"use strict";e.exports=n(447)},432:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},32:e=>{"use strict";e.exports=o},464:e=>{"use strict";e.exports=r},867:e=>{"use strict";e.exports=n},762:t=>{"use strict";t.exports=e},369:e=>{"use strict";e.exports=i},836:e=>{"use strict";e.exports=a},845:e=>{"use strict";e.exports=t}},u={};function d(e){var t=u[e];if(void 0!==t)return t.exports;var n=u[e]={exports:{}};return l[e](n,n.exports,d),n.exports}d.m=l,s=[],d.O=(e,t,n,r)=>{if(!t){var o=1/0;for(l=0;l<s.length;l++){for(var[t,n,r]=s[l],a=!0,i=0;i<t.length;i++)(!1&r||o>=r)&&Object.keys(d.O).every((e=>d.O[e](t[i])))?t.splice(i--,1):(a=!1,r<o&&(o=r));if(a){s.splice(l--,1);var c=n();void 0!==c&&(e=c)}}return e}r=r||0;for(var l=s.length;l>0&&s[l-1][2]>r;l--)s[l]=s[l-1];s[l]=[t,n,r]},d.F={},d.E=e=>{Object.keys(d.F).map((t=>{d.F[t](e)}))},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},c={143:0},d.F.j=e=>{if(!d.o(c,e)||void 0===c[e]){c[e]=null;var t=document.createElement("link");d.nc&&t.setAttribute("nonce",d.nc),t.rel="prefetch",t.as="script",t.href=d.p+d.u(e),document.head.appendChild(t)}},d.O.j=e=>0===c[e],d.O(0,[143],(()=>{d.E(143)}),5);var f={};return(()=>{"use strict";d.r(f),d.d(f,{createReferencedImageDisplaySet:()=>te,default:()=>ae,hydrateStructuredReport:()=>K.Z,srProtocol:()=>$});var e=d(735);const t=JSON.parse('{"u2":"@ohif/extension-cornerstone-dicom-sr"}').u2,n="dicom-sr",r=`${t}.sopClassHandlerModule.${n}`;var o=d(762),a=d.n(o),i=d(845),s=d(867),c=d(464),l=d(365);const u={POINT:"POINT",MULTIPOINT:"MULTIPOINT",POLYLINE:"POLYLINE",CIRCLE:"CIRCLE",ELLIPSE:"ELLIPSE"};class p extends s.AnnotationTool{constructor(){super(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},arguments.length>1&&void 0!==arguments[1]?arguments[1]:{configuration:{}}),this.isPointNearTool=()=>null,this.getHandleNearImagePoint=()=>null,this.renderAnnotation=(e,t)=>{const{viewport:n}=e,{element:r}=n;let o=s.annotation.state.getAnnotations(this.getToolName(),r);if(!o?.length)return;if(o=this.filterInteractableAnnotationsForElement(r,o),!o?.length)return;const a=(0,l.yR)(r),{activeIndex:i,trackingUniqueIdentifiers:c}=a,d=c[i],f=o.filter((e=>c.includes(e.data?.cachedStats?.TrackingUniqueIdentifier)));if(!n._actors?.size)return;const p={toolGroupId:this.toolGroupId,toolName:this.getToolName(),viewportId:e.viewport.id};for(let e=0;e<f.length;e++){const r=f[e],o=r.annotationUID,{renderableData:a}=r.data.cachedStats,{cachedStats:i}=r.data,{referencedImageId:c}=r.metadata;p.annotationUID=o;const l=this.getStyle("lineWidth",p,r),m=this.getStyle("lineDash",p,r),g={color:i.TrackingUniqueIdentifier===d?"rgb(0, 255, 0)":this.getStyle("color",p,r),lineDash:m,lineWidth:l};Object.keys(a).forEach((e=>{const i=a[e];let l,d;switch(e){case u.POINT:l=this.renderPoint;break;case u.MULTIPOINT:l=this.renderMultipoint;break;case u.POLYLINE:l=this.renderPolyLine;break;case u.CIRCLE:l=this.renderEllipse;break;case u.ELLIPSE:l=this.renderEllipse,d=s.utilities.math.ellipse.getCanvasEllipseCorners;break;default:throw new Error(`Unsupported GraphicType: ${e}`)}const f=l(t,n,i,o,c,g);this.renderTextBox(t,n,f,d,r,p,g)}))}}}_getTextBoxLinesFromLabels(e){const t=Math.min(e.length,3),n=[];for(let r=0;r<t;r++){const t=e[r];n.push(`${g(t.label)}${t.value}`)}return n}renderPolyLine(e,t,n,r,o,a){const i={color:a.color,width:a.lineWidth};let c=[];return n.map(((n,o)=>{const a=n.map((e=>t.worldToCanvas(e))),l=`${o}`;2===a.length?s.drawing.drawLine(e,r,l,a[0],a[1],i):s.drawing.drawPolyline(e,r,l,a,i),c=c.concat(a)})),c}renderMultipoint(e,t,n,r,o,a){let i;n.map(((n,o)=>{i=n.map((e=>t.worldToCanvas(e)));s.drawing.drawHandles(e,r,"0",i,{color:a.color})}))}renderPoint(e,t,n,r,o,a){const i=[];return n.map(((n,l)=>{const u=n[0];i.push(t.worldToCanvas(u));const d=c.metaData.get("imagePixelModule",o);let f=10,p=10;if(d){const{columns:e,rows:t}=d;f=e/10,p=t/10}const m=c.utilities.worldToImageCoords(o,u),g=c.utilities.imageToWorldCoords(o,[m[0]+f,m[1]+p]);i.push(t.worldToCanvas(g));const S=`${l}`;s.drawing.drawArrow(e,r,S,i[1],i[0],{color:a.color,width:a.lineWidth})})),i}renderEllipse(e,t,n,r,o,a){let i;return n.map(((n,o)=>{if(0===n.length)return;const c=n,l=t.getRotation();let u;i=c.map((e=>t.worldToCanvas(e))),u=90==l||270==l?s.utilities.math.ellipse.getCanvasEllipseCorners([i[2],i[3],i[0],i[1]]):s.utilities.math.ellipse.getCanvasEllipseCorners(i);const d=`${o}`;s.drawing.drawEllipse(e,r,d,u[0],u[1],{color:a.color,width:a.lineWidth})})),i}renderTextBox(e,t,n,r,o,a){let i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{};if(!n||!o)return;const{annotationUID:c,data:l={}}=o,{label:u}=l,{color:d}=i;let f=n;"function"==typeof r&&(f=r(n));const p=this._getTextBoxLinesFromLabels(u),m=s.utilities.drawing.getTextBoxCoordsCanvas(f);o.data.handles.textBox.worldPosition=t.canvasToWorld(m);const g=t.worldToCanvas(o.data.handles.textBox.worldPosition),S=this.getLinkedTextBoxStyle(a,o),h=s.drawing.drawLinkedTextBox(e,c,"1",p,g,n,{},{...S,color:d}),{x:y,y:I,width:v,height:b}=h;o.data.handles.textBox.worldBoundingBox={topLeft:t.canvasToWorld([y,I]),topRight:t.canvasToWorld([y+v,I]),bottomLeft:t.canvasToWorld([y,I+b]),bottomRight:t.canvasToWorld([y+v,I+b])}}}p.toolName="DICOMSRDisplay";const m={"Short Axis":"W: ","Long Axis":"L: ",AREA:"Area: ",Length:"",CORNERSTONEFREETEXT:""};function g(e){const t=m[e];return void 0!==t?t:e}const S={DICOMSRDisplay:p.toolName,SRLength:"SRLength",SRBidirectional:"SRBidirectional",SREllipticalROI:"SREllipticalROI",SRCircleROI:"SRCircleROI",SRArrowAnnotate:"SRArrowAnnotate",SRAngle:"SRAngle",SRCobbAngle:"SRCobbAngle",SRRectangleROI:"SRRectangleROI",SRPlanarFreehandROI:"SRPlanarFreehandROI"},h=1e-4;function y(e,t,n){const r=S.DICOMSRDisplay,o={TrackingUniqueIdentifier:e.TrackingUniqueIdentifier,renderableData:{},labels:e.labels,imageId:t};e.coords.forEach((n=>{const{GraphicType:r,GraphicData:a}=n;void 0===o.renderableData[r]&&(o.renderableData[r]=[]),o.renderableData[r].push(function(e,t,n,r){const[o,a]=r.split(":");let s;switch(e){case u.POINT:case u.MULTIPOINT:case u.POLYLINE:s=[];for(let e=0;e<t.length;e+=2){const r=c.utilities.imageToWorldCoords(n,[t[e],t[e+1]]);s.push(r)}break;case u.CIRCLE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const r=e[0],o=e[1],a=i.vec3.distance(r,o),l=c.metaData.get("imagePlaneModule",n);if(!l)throw new Error("No imagePlaneModule found");const{columnCosines:u,rowCosines:d}=l,f=i.vec3.create();i.vec3.scaleAndAdd(f,r,u,a);const p=i.vec3.create();i.vec3.scaleAndAdd(p,r,u,-a);const m=i.vec3.create();i.vec3.scaleAndAdd(m,r,d,a);const g=i.vec3.create();i.vec3.scaleAndAdd(g,r,d,-a),s=[f,p,m,g];break}case u.ELLIPSE:{const e=[];for(let r=0;r<t.length;r+=2){const o=c.utilities.imageToWorldCoords(n,[t[r],t[r+1]]);e.push(o)}const r=i.vec3.fromValues(...e[0]),o=i.vec3.fromValues(...e[1]),a=i.vec3.fromValues(...e[2]),l=i.vec3.fromValues(...e[3]),u=i.vec3.create();i.vec3.sub(u,o,r),i.vec3.normalize(u,u);const d=i.vec3.create();i.vec3.sub(d,l,a),i.vec3.normalize(d,d);const f=c.metaData.get("imagePlaneModule",n);if(!f)throw new Error("imageId does not have imagePlaneModule metadata");const{columnCosines:p}=f,m=i.vec3.fromValues(...p),g=Math.abs(i.vec3.dot(m,u)),S=Math.abs(i.vec3.dot(m,d)),y=Math.abs(g),I=Math.abs(S);s=[],Math.abs(y-1)<h?s=[e[0],e[1],e[2],e[3]]:Math.abs(I-1)<h?s=[e[2],e[3],e[0],e[1]]:console.warn("OBLIQUE ELLIPSE NOT YET SUPPORTED");break}default:console.warn("Unsupported GraphicType:",e)}return s}(r,a,t,e.TrackingIdentifier))}));const a=c.metaData.get("imagePlaneModule",t),l=s.annotation.state.getAnnotationManager(),d=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber||1,f={annotationUID:e.TrackingUniqueIdentifier,metadata:{FrameOfReferenceUID:a.frameOfReferenceUID,toolName:r,referencedImageId:t},data:{label:e.labels,handles:{textBox:{}},cachedStats:{TrackingUniqueIdentifier:o.TrackingUniqueIdentifier,renderableData:o.renderableData},frameNumber:d}};l.addAnnotation(f),e.loaded=!0,e.imageId=t,e.displaySetInstanceUID=n,e.ReferencedSOPInstanceUID=e.coords[0].ReferencedSOPSequence.ReferencedSOPInstanceUID,e.frameNumber=d,delete e.coords}var I=d(32);const v=I.adaptersSR.Cornerstone3D.MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE,b=["cornerstoneTools@^4.0.0"],C=v.CORNERSTONE_3D_TAG;const{CodeScheme:O}=I.adaptersSR.Cornerstone3D,{ImageSet:R,MetadataProvider:E}=o.classes,T=["1.2.840.10008.5.1.4.1.1.88.11","1.2.840.10008.5.1.4.1.1.88.22","1.2.840.10008.5.1.4.1.1.88.33","1.2.840.10008.5.1.4.1.1.88.34"],D="Cornerstone3DTools",w="0.1",N=(e,t)=>{t.forEach((t=>{if(t.StudyInstanceUID!==e)throw console.warn("Not all instances have the same UID",e,t),new Error(`Instances ${t.SOPInstanceUID} does not belong to ${e}`)}))},P={ImagingMeasurementReport:"126000",ImageLibrary:"111028",ImagingMeasurements:"126010",MeasurementGroup:"125007",ImageLibraryGroup:"126200",TrackingUniqueIdentifier:"112040",TrackingIdentifier:"112039",Finding:"121071",FindingSite:"G-C0E3",CornerstoneFreeText:O.codeValues.CORNERSTONEFREETEXT},U={SRT:"SRT",CornerstoneCodeSchemes:[O.CodingSchemeDesignator,"CST4"]},x={INFERRED_FROM:"INFERRED FROM",CONTAINS:"CONTAINS"},M="CORNERSTONEFREETEXT";function k(e,t){return this.instances.push(...e),o.utils.sortStudyInstances(this.instances),this.instance=this.instances[this.instances.length-1],this.isLoaded=!1,this}function j(e,t,n){if(!e||!e.length)throw new Error("No instances were provided");o.utils.sortStudyInstances(e);const a=e[e.length-1],{StudyInstanceUID:i,SeriesInstanceUID:s,SOPInstanceUID:c,SeriesDescription:l,SeriesNumber:u,SeriesDate:d,ConceptNameCodeSequence:f,SOPClassUID:p}=a;if(N(a.StudyInstanceUID,e),!f||f.CodeValue!==P.ImagingMeasurementReport)return t.services.uiNotificationService.show({title:"DICOM SR",message:"OHIF only supports TID1500 Imaging Measurement Report Structured Reports. The SR you’re trying to view is not supported.",type:"warning",duration:6e3}),[];const m={Modality:"SR",displaySetInstanceUID:o.utils.guid(),SeriesDescription:l,SeriesNumber:u,SeriesDate:d,SOPInstanceUID:c,SeriesInstanceUID:s,StudyInstanceUID:i,SOPClassHandlerId:r,SOPClassUID:p,instances:e,referencedImages:null,measurements:null,isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:T,instance:a,addInstances:k};return m.load=()=>function(e,t,n){const{displaySetService:r,measurementService:o}=t.services,a=n.getDataSources(),i=a[0],{ContentSequence:s}=e.instance;e.referencedImages=function(e){const t=F(e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.ImageLibrary)).ContentSequence).find((e=>e.ConceptNameCodeSequence.CodeValue===P.ImageLibraryGroup)),n=[];return F(t.ContentSequence).forEach((e=>{const{ReferencedSOPSequence:t}=e;if(t)for(const e of F(t))if(e.ReferencedSOPClassUID){const{ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:r}=e;n.push({ReferencedSOPClassUID:t,ReferencedSOPInstanceUID:r})}})),n}(s),e.measurements=function(e){const t=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.ImagingMeasurements)),n=function(e){const t={};return e.forEach((e=>{const n=F(e.ContentSequence),r=n.find((e=>e.ConceptNameCodeSequence.CodeValue===P.TrackingUniqueIdentifier));r||console.warn("No Tracking Unique Identifier, skipping ambiguous measurement.");const o=r.UID;void 0===t[o]?t[o]=[...n]:n.forEach((e=>{e.ConceptNameCodeSequence.CodeValue!==P.TrackingUniqueIdentifier&&t[o].push(e)}))})),t}(F(t.ContentSequence).filter((e=>e.ConceptNameCodeSequence.CodeValue===P.MeasurementGroup))),r=[];return Object.keys(n).forEach((e=>{const t=function(e){if(e.some((e=>"SCOORD"===e.ValueType||"SCOORD3D"===e.ValueType)))return function(e){const t=e.find((e=>"SCOORD"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.TrackingIdentifier));if(!t)return void console.warn(`graphic ValueType ${t.ValueType} not currently supported, skipping annotation.`);const o=e.filter((e=>"NUM"===e.ValueType)),a={loaded:!1,labels:[],coords:[L(t)],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};return o.forEach((e=>{const{ConceptNameCodeSequence:t,MeasuredValueSequence:n}=e;n&&a.labels.push(_(t,n))})),a}(e);return function(e){const t=e.filter((e=>"NUM"===e.ValueType)),n=e.find((e=>"UIDREF"===e.ValueType)),r=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.TrackingIdentifier)),o=e.find((e=>e.ConceptNameCodeSequence.CodeValue===P.Finding)),a=e.filter((e=>e.ConceptNameCodeSequence.CodingSchemeDesignator===U.SRT&&e.ConceptNameCodeSequence.CodeValue===P.FindingSite)),i={loaded:!1,labels:[],coords:[],TrackingUniqueIdentifier:n.UID,TrackingIdentifier:r.TextValue};o&&U.CornerstoneCodeSchemes.includes(o.ConceptCodeSequence.CodingSchemeDesignator)&&o.ConceptCodeSequence.CodeValue===P.CornerstoneFreeText&&i.labels.push({label:M,value:o.ConceptCodeSequence.CodeMeaning});if(a.length){const e=a.find((e=>U.CornerstoneCodeSchemes.includes(e.ConceptCodeSequence.CodingSchemeDesignator)&&e.ConceptCodeSequence.CodeValue===P.CornerstoneFreeText));e&&i.labels.push({label:M,value:e.ConceptCodeSequence.CodeMeaning})}return t.forEach((e=>{const{ConceptNameCodeSequence:t,ContentSequence:n,MeasuredValueSequence:r}=e,{ValueType:o}=n;if("SCOORD"===!o)return void console.warn(`Graphic ${o} not currently supported, skipping annotation.`);const a=L(n);a&&i.coords.push(a),r&&i.labels.push(_(t,r))})),i}(e)}(n[e]);t&&r.push(t)})),r}(s);const c=o.getSourceMappings(D,w);e.isHydrated=!1,e.isRehydratable=function(e,t){if(!t||!t.length)return!1;const n=t.map((e=>e.annotationType)),{measurements:r}=e,o=Object.keys(v).filter((e=>"function"==typeof v[e].isValidCornerstoneTrackingIdentifier)),a=[];o.forEach((e=>{n.includes(e)&&a.push(v[e])}));for(let e=0;e<r.length;e++){const{TrackingIdentifier:t}=r[e]||{};if(a.some((e=>{let[n,r]=t.split(":");b.includes(n)&&(n=C);const o=`${n}:${r}`;return e.isValidCornerstoneTrackingIdentifier(o)})))return!0;console.log("Measurement is not rehydratable",t,r[e])}return console.log("No measurements found which were rehydratable"),!1}(e,c),e.isLoaded=!0,r.activeDisplaySets.forEach((t=>{q(e,t,i)})),r.subscribe(r.EVENTS.DISPLAY_SETS_ADDED,(t=>{const{displaySetsAdded:n}=t;n.forEach((t=>{q(e,t,i)}))}))}(m,t,n),[m]}function q(e,t,n){let r=e.measurements.filter((e=>!1===e.loaded));if(0===r.length)return;if(!t instanceof R)return;const{sopClassUids:o,images:a}=t;if(r=r.filter((e=>e.coords.some((e=>o.includes(e.ReferencedSOPSequence.ReferencedSOPClassUID))))),0===r.length)return;const i=[];r.forEach((e=>{const{coords:t}=e;t.forEach((e=>{const t=e.ReferencedSOPSequence.ReferencedSOPInstanceUID;i.includes(t)||i.push(t)}))}));const s=n.getImageIdsForDisplaySet(t);for(const e of s){if(!r.length)return;const{SOPInstanceUID:n,frameNumber:o}=E.getUIDsFromImageID(e);if(i.includes(n))for(let a=r.length-1;a>=0;a--){const i=r[a];A(i,n,o)&&(y(i,e,t.displaySetInstanceUID),r.splice(a,1))}}}function A(e,t,n){const{coords:r}=e,o=e.coords[0].ReferencedSOPSequence&&e.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber||1;if(n&&Number(n)!==Number(o))return!1;for(let e=0;e<r.length;e++){const n=r[e],{ReferencedSOPInstanceUID:o}=n.ReferencedSOPSequence;if(o===t)return!0}}function L(e){const{ValueType:t,RelationshipType:n,GraphicType:r,GraphicData:o}=e;if(n!=x.INFERRED_FROM&&n!=x.CONTAINS)return void console.warn(`Relationshiptype === ${n}. Cannot deal with NON TID-1400 SCOORD group with RelationshipType !== "INFERRED FROM" or "CONTAINS"`);const a={ValueType:t,GraphicType:r,GraphicData:o};if("SCOORD"===t){const{ReferencedSOPSequence:t}=e.ContentSequence;a.ReferencedSOPSequence=t}else if("SCOORD3D"===t){const{ReferencedFrameOfReferenceSequence:t}=e.ContentSequence;a.ReferencedFrameOfReferenceSequence=t}return a}function _(e,t){const{CodeMeaning:n}=e,{NumericValue:r,MeasurementUnitsCodeSequence:o}=t,{CodeValue:a}=o;return{label:n,value:`${r?Number(r).toFixed(2):""} ${a}`}}function F(e){return e?Array.isArray(e)?e:[e]:[]}const V=function(e){let{servicesManager:t,extensionManager:r}=e;return[{name:n,sopClassUids:T,getDisplaySetsFromSeries:e=>j(e,t,r)}]},$={id:"@ohif/sr",hasUpdatedPriorsInformation:!1,name:"SR Key Images",protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{srDisplaySetId:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"SR"}}]}},stages:[{name:"SR Key Images",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{allowUnmatchedView:!0},displaySets:[{id:"srDisplaySetId"}]}]}]};var B=d(836),G=d.n(B);const{log:W}=a();const H=function(e,t){const n={};function r(r,o){if(!r.metadata?.referencedImageId)return void W.warn(`[DICOMSR] No referencedImageId found for ${o} ${r.id}`);const a=r.metadata.referencedImageId;n[a]||(n[a]={});const i=n[a];i[o]||(i[o]={data:[]});const s=e.find((e=>e.uid===r.annotationUID)),c=i[o].data;let{finding:l}=s;const u=[];s.label&&(t.includes(o)?l={CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label}:u.push({CodeValue:"CORNERSTONEFREETEXT",CodingSchemeDesignator:"CORNERSTONEJS",CodeMeaning:s.label})),s.findingSites&&u.push(...s.findingSites);const d=Object.assign({},r,{finding:l,findingSites:u});c.push(d)}const o=e.map((e=>e.uid)).slice(),a=s.annotation.state.getAnnotationManager(),i=a.getFramesOfReference();for(let e=0;e<i.length;e++){const t=i[e],s=a.getAnnotations(t),c=Object.keys(s);for(let e=0;e<c.length;e++){const t=c[e],a=s[t];if(a)for(let e=0;e<a.length;e++){const i=a[e],s=o.findIndex((e=>e===i.annotationUID));if(-1!==s&&(r(i,t),o.splice(s,1),!o.length))return n}}}return n},{MeasurementReport:Y}=I.adaptersSR.Cornerstone3D,{log:z}=a(),X=e=>{let{}=e;const t={downloadReport:e=>{let{measurementData:n,additionalFindingTypes:r,options:o={}}=e;const a=t.generateReport(n,r,o),i=G().data.datasetToBlob(a);var s=URL.createObjectURL(i);window.location.assign(s)},storeMeasurements:async e=>{let{measurementData:t,dataSource:n,additionalFindingTypes:r,options:a={}}=e;if(z.info("[DICOMSR] storeMeasurements"),!n||!n.store||!n.store.dicom)return z.error("[DICOMSR] datasource has no dataSource.store.dicom endpoint!"),Promise.reject({});try{const e=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=H(e,t),o=Y.generateReport(r,c.metaData,c.utilities.worldToImageCoords,n),{dataset:a}=o;return void 0===a.SpecificCharacterSet&&(a.SpecificCharacterSet="ISO_IR 192"),a}(t,r,a),{StudyInstanceUID:i,ContentSequence:s}=e;if(!s?.[4].ContentSequence?.length)throw console.log("naturalizedReport missing imaging content",e),new Error("Invalid report, no content");return await n.store.dicom(e),i&&n.deleteStudyMetadataPromise(i),o.DicomMetadataStore.addInstances([e],!0),e}catch(e){throw console.warn(e),z.error(`[DICOMSR] Error while saving the measurements: ${e.message}`),new Error(e.message||"Error while saving the measurements.")}}},n={downloadReport:{commandFn:t.downloadReport,storeContexts:[],options:{}},storeMeasurements:{commandFn:t.storeMeasurements,storeContexts:[],options:{}}};return{actions:t,definitions:n,defaultContext:"CORNERSTONE_STRUCTURED_REPORT"}};function J(e,t,n){class r extends t{}r.toolName=e,(0,s.addTool)(r)}var K=d(414);const Z=o.classes.ImageSet,Q=(e,t)=>{const{displaySetInstanceUID:n,ReferencedSOPInstanceUID:r}=e,o=t.getDisplaySetByUID(n);if(o.images)return o.images.find((e=>e.SOPInstanceUID===r))},ee=(e,t)=>{const n=[],r={};for(const o of t.measurements){const{imageId:t}=o;if(!t)continue;if(r[t])continue;const a=Q(o,e);a?(r[t]=a,n.push(a)):console.log("Measurement",o,"had no instances found")}return n},te=(e,t)=>{const n=ee(e,t),r=new Z(n),o=n[0];return r.setAttributes({displaySetInstanceUID:r.uid,SeriesDate:o.SeriesDate,SeriesTime:o.SeriesTime,SeriesInstanceUID:r.uid,StudyInstanceUID:o.StudyInstanceUID,SeriesNumber:o.SeriesNumber||0,SOPClassUID:o.SOPClassUID,SeriesDescription:`${t.SeriesDescription} KO ${t.instance.SeriesNumber}`,Modality:"KO",isMultiFrame:!1,numImageFrames:n.length,SOPClassHandlerId:"@ohif/extension-default.sopClassHandlerModule.stack",isReconstructable:!1,isCompositeStack:!0,madeInClient:!0,excludeFromThumbnailBrowser:!0,updateInstances:function(){this.images.splice(0,this.images.length,...ee(e,t)),this.numImageFrames=this.images.length}}),e.addDisplaySets(r),r};function ne(){return ne=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},ne.apply(this,arguments)}const re=e.lazy((()=>Promise.resolve().then(d.bind(d,43)))),oe=t=>e.createElement(e.Suspense,{fallback:e.createElement("div",null,"Loading...")},e.createElement(re,t)),ae={id:t,onModeEnter:function(e){let{servicesManager:t}=e;const{displaySetService:n}=t.services;[...n.getDisplaySetCache().values()].filter((e=>e.SOPClassHandlerId===r)).forEach((e=>{e.isHydrated=!1}))},preRegistration:function(e){let{configuration:t={}}=e;(0,s.addTool)(p),J(S.SRLength,s.LengthTool),J(S.SRBidirectional,s.BidirectionalTool),J(S.SREllipticalROI,s.EllipticalROITool),J(S.SRCircleROI,s.CircleROITool),J(S.SRArrowAnnotate,s.ArrowAnnotateTool),J(S.SRAngle,s.AngleTool),J(S.SRCobbAngle,s.CobbAngleTool),J(S.SRPlanarFreehandROI,s.PlanarFreehandROITool);const n={lineDash:"4,4"};s.annotation.config.style.setToolGroupToolStyles("SRToolGroup",{SRLength:n,SRBidirectional:n,SREllipticalROI:n,SRCircleROI:n,SRArrowAnnotate:n,SRCobbAngle:n,SRAngle:n,SRPlanarFreehandROI:n,global:{}})},getViewportModule(t){let{servicesManager:n,extensionManager:r}=t;return[{name:"dicom-sr",component:t=>e.createElement(oe,ne({servicesManager:n,extensionManager:r},t))}]},getCommandsModule:X,getSopClassHandlerModule:V,getUtilityModule(e){let{servicesManager:t}=e;return[{name:"tools",exports:{toolNames:S}}]}}})(),f=d.O(f)})()));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/extension-cornerstone-dicom-sr",
3
- "version": "3.0.0",
3
+ "version": "3.5.0-beta.1",
4
4
  "description": "OHIF extension for an SR Cornerstone Viewport",
5
5
  "author": "OHIF",
6
6
  "license": "MIT",
@@ -26,16 +26,16 @@
26
26
  "dev": "cross-env NODE_ENV=development webpack --config .webpack/webpack.dev.js --watch --output-pathinfo",
27
27
  "dev:cornerstone": "yarn run dev",
28
28
  "build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js",
29
- "build:package": "yarn run build",
29
+ "build:package-1": "yarn run build",
30
30
  "start": "yarn run dev",
31
31
  "test:unit": "jest --watchAll",
32
32
  "test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
33
33
  },
34
34
  "peerDependencies": {
35
- "@ohif/core": ">=3.0.0",
36
- "@ohif/extension-cornerstone": ">=3.0.0",
37
- "@ohif/extension-measurement-tracking": "^3.0.0",
38
- "@ohif/ui": "^2.0.0",
35
+ "@ohif/core": "3.5.0-beta.1",
36
+ "@ohif/extension-cornerstone": "3.5.0-beta.1",
37
+ "@ohif/extension-measurement-tracking": "3.5.0-beta.1",
38
+ "@ohif/ui": "3.5.0-beta.1",
39
39
  "dcmjs": "^0.29.5",
40
40
  "dicom-parser": "^1.8.9",
41
41
  "hammerjs": "^2.0.8",
@@ -44,9 +44,10 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@babel/runtime": "^7.20.13",
47
- "classnames": "^2.3.2",
48
47
  "@cornerstonejs/adapters": "^1.1.0",
49
48
  "@cornerstonejs/core": "^1.1.0",
50
- "@cornerstonejs/tools": "^1.1.0"
51
- }
49
+ "@cornerstonejs/tools": "^1.1.0",
50
+ "classnames": "^2.3.2"
51
+ },
52
+ "gitHead": "6d7561946b02ce49fbaa9a0f47df5818eb3d7983"
52
53
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"dist/ohif-extension-cornerstone-dicom-sr.umd.js","mappings":";CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,EAAQG,QAAQ,cAAeA,QAAQ,aAAcA,QAAQ,wBAAyBA,QAAQ,uBAAwBA,QAAQ,2BAA4BA,QAAQ,SAAUA,QAAQ,aAC5K,mBAAXC,QAAyBA,OAAOC,IAC9CD,OAAO,CAAC,aAAc,YAAa,uBAAwB,sBAAuB,0BAA2B,QAAS,YAAaJ,GACzG,iBAAZC,QACdA,QAAQ,uCAAyCD,EAAQG,QAAQ,cAAeA,QAAQ,aAAcA,QAAQ,wBAAyBA,QAAQ,uBAAwBA,QAAQ,2BAA4BA,QAAQ,SAAUA,QAAQ,aAErOJ,EAAK,uCAAyCC,EAAQD,EAAK,cAAeA,EAAK,aAAcA,EAAK,wBAAyBA,EAAK,uBAAwBA,EAAK,2BAA4BA,EAAY,MAAGA,EAAK,YAC9M,CATD,CASGO,YAAY,CAACC,EAAkCC,EAAkCC,EAAkCC,EAAkCC,EAAiCC,EAAkCC,cCTvNC,ECKAC,wECHJ,MAAMC,EAAQ,CACZC,yBAA0B,KAC1BC,gCAAiC,CAAC,GAWpC,SAASC,EACPC,EACAC,GAEA,IADAC,EAAWC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAEd,MAAMG,GAAiBC,EAAAA,EAAAA,mBAAkBP,IACnC,SAAEQ,GAAaF,EAErBV,EAAME,gCAAgCU,EAASC,IAAM,CACnDR,4BACAC,cAEJ,CAqBA,SAASQ,EAAuCV,GAC9C,MAAMM,GAAiBC,EAAAA,EAAAA,mBAAkBP,IACnC,SAAEQ,GAAaF,EAErB,OAAIV,EAAME,gCAAgCU,EAASC,IAC1Cb,EAAME,gCAAgCU,EAASC,IAGjD,CAAER,0BAA2B,GACtC,0FCpDA,MAAM,KAAEU,GAASC,IAAAA,OACX,kBAAEC,EAAiB,mBAAEC,GAAuBC,EAAAA,WAAAA,cAE5CC,EAAmC,qBACnCC,EAAsC,MAEtCC,EAAiC,CAAC,2BAElCC,EAAcA,CAACC,EAAcC,KACjC,IAAKA,GAAwC,kBAAhCA,EAAKC,uBAA4C,OAC9D,MAAMC,EAAO,GAAEF,EAAKC,0BAA0BD,EAAKG,YAEnD,MADY,IAAKJ,EAAaG,GAAMA,SAAQF,EAAMI,KAAMJ,EAAKK,YACnD,EAGNC,EAAeA,CAACP,EAAcQ,KAClC,IAAKA,IAAUA,EAAMxB,OAAQ,OAC7B,MAAMyB,EAAM,GAEZ,IAAK,IAAIC,EAAI,EAAGA,EAAIF,EAAMxB,OAAQ0B,IAAK,CAErC,MAAMC,EAAOZ,EAAYC,EAAcQ,EAAME,GAAG,IAAMF,EAAME,IACxDC,GAAMF,EAAIG,KAAKD,EACrB,CACA,OAAQF,EAAIzB,QAAUyB,QAAQxB,CAAS,EAO1B,SAAS4B,EAAuBC,EAE7CC,GACA,IAFA,gBAAEC,EAAe,iBAAEC,GAAkBH,EAGrC,MAAMI,EAAaD,EAAiBE,sBAAsB,IACpD,mBACJC,EAAkB,kBAClBC,EAAiB,qBACjBC,GACEN,EAAgBO,SAEdvB,EAAesB,EAAqBE,iBACxC,eACA,CAAC,GAEGC,EAAaJ,EAAkBK,mBACnCX,GAIIY,EAAWP,EAAmBQ,kBAClChC,EACAC,GAGF,IAAK8B,IAAaA,EAAS3C,OACzB,MAAM,IAAI6C,MACP,mGAIL,MAAMC,EAAWC,EAAAA,mBAAAA,YACfN,EAAWO,iBACXP,EAAWQ,kBACXR,EAAWS,gBAGPC,EAA0B,CAAC,EAC3BC,EAAuB,CAAC,EAE9BX,EAAWY,aAAaC,SAAQC,IAC9B,MAAM,yBAAEC,EAAwB,QAAEC,EAAO,YAAEC,GAAgBH,EAEtDJ,EAAwBK,KAC3BL,EAAwBK,GAA4BC,EACpDL,EAAqBI,GAA4B,IAE9CJ,EAAqBI,GAA0BE,KAClDN,EAAqBI,GAA0BE,GAAeD,EAChE,IAGF,MAAME,EAoJR,SAA2BC,GACzB,MAAMC,EAAS,uBACTC,EAAQ,oBACRC,EAAsB,sBAGtBC,EAA4BC,EAAQL,EAAQM,iBAAiBC,KACjEC,EAAkBP,IAIdQ,EAAoBJ,EACxBD,EAA0BE,iBAC1BI,OAAOF,EAAkBN,IAGrBS,EAAkB,CAAC,EAEnBC,EACJ/D,EAAkBgE,yCAEdC,EAAwB,GA6B9B,OA3BAC,OAAOC,KAAKJ,GAAwBlB,SAAQuB,IAC1CH,EAAsB9C,KAAK4C,EAAuBK,IAClDN,EAAgBM,GAAO,EAAE,IAG3BR,EAAkBf,SAAQ,CAACwB,EAAkBC,KAC3C,MAIMC,EAJkCf,EACtCa,EAAiBZ,iBAG6CC,MAC9Dc,GACEA,EAAYC,wBAAwB5D,cAAgByC,IAGlDoB,EAAqBH,EAAwBI,UAEnD,IAAKC,EAAgBC,GAAYH,EAAmBI,MAAM,KACtDzE,EAA+B0E,SAASH,KAC1CA,EAAiB3E,GAGnB,MAAM+E,EAA4B,GAAEJ,KAAkBC,IAEtDN,EAAwBI,UAAYK,CAAwB,IAGvD7B,CACT,CAvMuB8B,CAAkB5C,GAGjC6C,EAAoClF,EAAkBmF,kBAC1DjC,EAKAR,EACA0C,EAAAA,UAAAA,mBACAC,EAAAA,UAIIC,EAAqBpD,EAASqD,KAAIC,GAAKA,EAAEC,iBACzCC,EAA6B,CAAC,EAEpCxB,OAAOC,KAAKe,GAAmCrC,SAAQuB,IACjDkB,EAAmBP,SAASX,KAC9BsB,EAA2BtB,GAAOc,EAAkCd,GACtE,IAIF,MAAMuB,EAAW,GAwBjB,IAAIC,EArBJ1B,OAAOC,KAAKuB,GAA4B7C,SAAQ4C,IAE5CC,EAA2BD,GAEH5C,SAAQgD,IAKhC,MAAM5C,EACH4C,EAASC,WAAWC,MAAQF,EAASC,WAAWC,KAAK9C,aAAgB,EAClED,EACJL,EAAqBkD,EAASG,gBAAgB/C,IAC9CP,EAAwBmD,EAASG,gBAE9BL,EAASZ,SAAS/B,IACrB2C,EAASxE,KAAK6B,EAChB,GACA,IAIJ,MAAMiD,EAAqB,GAE3B,IAAK,IAAIhF,EAAI,EAAGA,EAAI0E,EAASpG,OAAQ0B,IAAK,CACxC,MAAM+B,EAAU2C,EAAS1E,IACnB,kBAAEuB,EAAiB,iBAAED,GAAqB8C,EAAAA,SAAAA,IAC9C,WACArC,GAGGiD,EAAmBlB,SAASvC,IAC/ByD,EAAmB9E,KAAKqB,GAGrBoD,EAEMA,IAA2BrD,GACpC2D,QAAQC,KACN,oEAHFP,EAAyBrD,CAM7B,CAwEA,OAtEA2B,OAAOC,KAAKuB,GAA4B7C,SAAQ4C,IAE5CC,EAA2BD,GAEH5C,SAAQgD,IAKhC,MAAM5C,EACH4C,EAASC,WAAWC,MAAQF,EAASC,WAAWC,KAAK9C,aAAgB,EAClED,EACJL,EAAqBkD,EAASG,gBAAgB/C,IAC9CP,EAAwBmD,EAASG,gBAEnCH,EAASO,IAAMtG,IAEf,MAAMuC,EAAWgD,EAAAA,SAAAA,IAAa,WAAYrC,IACpC,oBACJqD,GAIEhE,EAEEyD,EAAa,CACjBQ,cAAeT,EAASC,WAAWQ,cACnCP,KAAMF,EAASC,WAAWC,KAC1BQ,SAAU,CACR1B,SAAUY,EACVe,kBAAmBxD,EACnBqD,wBAIEI,EAAS9E,EAAmB+E,UAChCvG,EACAC,GAEF0F,EAAWC,KAAKY,MC/LP,SAA2Cd,GACxD,MAAM,aAAEe,EAAe,GAAE,QAAEC,GAAYhB,EAEvC,IAAIiB,EAAgBF,EAAalD,MAC/BqD,GAAuB,wBAAjBA,EAAGpG,YAGX,OAAImG,EACKA,EAAcjG,YAGnBgG,GAAiC,wBAAtBA,EAAQlG,UACdkG,EAAQhG,iBADjB,CAGF,CDiL8BmG,CAAkCnB,GAC1DC,EAAWC,KAAKc,QAAUvG,EACxBC,EACAsF,EAASgB,UAAU,IAErBf,EAAWC,KAAKa,aAAe9F,EAC7BP,EACAsF,EAASe,cAEXd,EAAWC,KAAK7E,KAAO4E,EAAWC,KAAKa,eAAe,GAEtD,MAAMK,EAAkB/E,EAASwB,MAC/B8B,GAAKA,EAAEC,iBAAmBA,IAG5B9D,EAAmBuF,kBACjBT,EACAhB,EACA,CAAEK,cACFmB,EAAgBE,oBAChB1F,GAGGkE,EAASZ,SAAS/B,IACrB2C,EAASxE,KAAK6B,EAChB,GACA,IAGJhB,EAAWoF,YAAa,EAEjB,CACL7E,iBAAkBqD,EAClBK,qBAEJ,CAuDA,MAAMzC,EAAU,SAAU6D,GACxB,OAAOC,MAAMC,QAAQF,GAAKA,EAAI,CAACA,EACjC,EAEM1D,EAAoB6D,GACjBhD,GACEA,EAAYC,wBAAwB5D,cAAgB2G,iGEvS2nBtD,OAAOuD,OAAO,MCAjsB,SAAS,IACd,GAAIvB,SAAWA,QAAQC,KAAM,CAG3B,IAFA,IAAIuB,EAEKC,EAAOrI,UAAUC,OAAQqI,EAAO,IAAIN,MAAMK,GAAOE,EAAO,EAAGA,EAAOF,EAAME,IAC/ED,EAAKC,GAAQvI,UAAUuI,GAGF,iBAAZD,EAAK,KAAiBA,EAAK,GAAK,mBAAmBE,OAAOF,EAAK,MAEzEF,EAAWxB,SAASC,KAAK4B,MAAML,EAAUE,EAC5C,CACF,CACA,IAAII,EAAgB,CAAC,EACd,SAAS,IACd,IAAK,IAAIC,EAAQ3I,UAAUC,OAAQqI,EAAO,IAAIN,MAAMW,GAAQC,EAAQ,EAAGA,EAAQD,EAAOC,IACpFN,EAAKM,GAAS5I,UAAU4I,GAGH,iBAAZN,EAAK,IAAmBI,EAAcJ,EAAK,MAC/B,iBAAZA,EAAK,KAAiBI,EAAcJ,EAAK,IAAM,IAAIO,MAC9D,EAAKJ,WAAM,EAAQH,GACrB,CACO,SAASQ,EAAeC,EAAMC,EAAIC,GACvCF,EAAKD,eAAeE,GAAI,WACtB,GAAID,EAAKG,cACPD,QACK,CAQLF,EAAKI,GAAG,eAPU,SAASC,IACzBC,YAAW,WACTN,EAAKO,IAAI,cAAeF,EAC1B,GAAG,GACHH,GACF,GAGF,CACF,GACF,CCtCe,SAAS,EAAQM,GAG9B,OAAO,EAAU,mBAAqBC,QAAU,iBAAmBA,OAAOC,SAAW,SAAUF,GAC7F,cAAcA,CAChB,EAAI,SAAUA,GACZ,OAAOA,GAAO,mBAAqBC,QAAUD,EAAIG,cAAgBF,QAAUD,IAAQC,OAAOG,UAAY,gBAAkBJ,CAC1H,EAAG,EAAQA,EACb,CCNe,SAASK,EAAeC,GACrC,IAAI/E,ECFS,SAAsBgF,EAAOC,GAC1C,GAAuB,WAAnB,EAAQD,IAAiC,OAAVA,EAAgB,OAAOA,EAC1D,IAAIE,EAAOF,EAAMN,OAAOS,aACxB,QAAa/J,IAAT8J,EAAoB,CACtB,IAAIE,EAAMF,EAAKG,KAAKL,EAAOC,GAAQ,WACnC,GAAqB,WAAjB,EAAQG,GAAmB,OAAOA,EACtC,MAAM,IAAIE,UAAU,+CACtB,CACA,OAAiB,WAATL,EAAoBM,OAASC,QAAQR,EAC/C,CDPY,CAAYD,EAAK,UAC3B,MAAwB,WAAjB,EAAQ/E,GAAoBA,EAAMuF,OAAOvF,EAClD,CEJe,SAAS,EAAgByE,EAAKzE,EAAKyF,GAYhD,OAXAzF,EAAM,EAAcA,MACTyE,EACT3E,OAAO4F,eAAejB,EAAKzE,EAAK,CAC9ByF,MAAOA,EACPE,YAAY,EACZC,cAAc,EACdC,UAAU,IAGZpB,EAAIzE,GAAOyF,EAENhB,CACT,CCdA,IAAIqB,EAAkB,oGAClBC,EAAe,CACjB,QAAS,IACT,QAAS,IACT,OAAQ,IACR,QAAS,IACT,OAAQ,IACR,QAAS,IACT,SAAU,IACV,QAAS,IACT,SAAU,IACV,QAAS,IACT,SAAU,IACV,SAAU,IACV,SAAU,IACV,SAAU,IACV,QAAS,IACT,SAAU,IACV,WAAY,IACZ,UAAW,IACX,SAAU,IACV,QAAS,KAGPC,EAAqB,SAA4B5E,GACnD,OAAO2E,EAAa3E,EACtB,ECnBA,IAAI6E,EAAiB,CACnBC,SAAU,kBACVC,cAAe,GACfC,oBAAqB,GACrBC,4BAA4B,EAC5BC,mBAAoB,GACpBC,2BAA4B,CAAC,KAAM,SAAU,IAAK,KAClDC,aAAa,EACbC,SDaoB,SAAkBjK,GACtC,OAAOA,EAAKkK,QAAQZ,EAAiBE,EACvC,GE3BA,ICHIW,ECCJ,SAASC,EAAkBC,EAAQC,GACjC,IAAK,IAAIjK,EAAI,EAAGA,EAAIiK,EAAM3L,OAAQ0B,IAAK,CACrC,IAAIkK,EAAaD,EAAMjK,GACvBkK,EAAWpB,WAAaoB,EAAWpB,aAAc,EACjDoB,EAAWnB,cAAe,EACtB,UAAWmB,IAAYA,EAAWlB,UAAW,GACjD/F,OAAO4F,eAAemB,EAAQ,EAAcE,EAAW/G,KAAM+G,EAC/D,CACF,CCIO,IAAI,GAAc,IAAAC,iBACdC,EAAmB,WAC5B,SAASA,KCfI,SAAyBhJ,EAAUiJ,GAChD,KAAMjJ,aAAoBiJ,GACxB,MAAM,IAAI5B,UAAU,oCAExB,CDYI6B,CAAgBC,KAAMH,GAEtBG,KAAKC,eAAiB,CAAC,CACzB,CDTa,IAAsBH,EAAaI,EAAYC,EC2B5D,OD3BmCL,ECWtBD,GDXmCK,ECWjB,CAAC,CAC9BtH,IAAK,oBACLyF,MAAO,SAA2B+B,GAChC,IAAIC,EAAQL,KAEZI,EAAW/I,SAAQ,SAAUyF,GACtBuD,EAAMJ,eAAenD,KAAKuD,EAAMJ,eAAenD,IAAM,EAC5D,GACF,GACC,CACDlE,IAAK,oBACLyF,MAAO,WACL,OAAO3F,OAAOC,KAAKqH,KAAKC,eAC1B,MDvBcT,EAAkBM,EAAYrC,UAAWyC,GACrDC,GAAaX,EAAkBM,EAAaK,GAChDzH,OAAO4F,eAAewB,EAAa,YAAa,CAC9CrB,UAAU,ICuBLoB,CACT,CAxB8B,GEdf,SAASS,EAAkBC,EAAKC,IAClC,MAAPA,GAAeA,EAAMD,EAAIxM,UAAQyM,EAAMD,EAAIxM,QAC/C,IAAK,IAAI0B,EAAI,EAAGgL,EAAO,IAAI3E,MAAM0E,GAAM/K,EAAI+K,EAAK/K,IAAKgL,EAAKhL,GAAK8K,EAAI9K,GACnE,OAAOgL,CACT,CCAe,SAAS,EAAeF,EAAK9K,GAC1C,OCLa,SAAyB8K,GACtC,GAAIzE,MAAMC,QAAQwE,GAAM,OAAOA,CACjC,CDGS,CAAeA,IELT,SAA+BA,EAAK9K,GACjD,IAAIiL,EAAK,MAAQH,EAAM,KAAO,oBAAsBjD,QAAUiD,EAAIjD,OAAOC,WAAagD,EAAI,cAC1F,GAAI,MAAQG,EAAI,CACd,IAAIC,EACFC,EACAC,EACAC,EACAC,EAAO,GACPC,GAAK,EACLC,GAAK,EACP,IACE,GAAIJ,GAAMH,EAAKA,EAAGzC,KAAKsC,IAAMW,KAAM,IAAMzL,EAAG,CAC1C,GAAIiD,OAAOgI,KAAQA,EAAI,OACvBM,GAAK,CACP,MAAO,OAASA,GAAML,EAAKE,EAAG5C,KAAKyC,IAAKS,QAAUJ,EAAKpL,KAAKgL,EAAGtC,OAAQ0C,EAAKhN,SAAW0B,GAAIuL,GAAK,GAClG,CAAE,MAAOI,GACPH,GAAK,EAAIL,EAAKQ,CAChB,CAAE,QACA,IACE,IAAKJ,GAAM,MAAQN,EAAW,SAAMI,EAAKJ,EAAW,SAAKhI,OAAOoI,KAAQA,GAAK,MAC/E,CAAE,QACA,GAAIG,EAAI,MAAML,CAChB,CACF,CACA,OAAOG,CACT,CACF,CFrBgC,CAAqBR,EAAK9K,IGJ3C,SAAqC4L,EAAGC,GACrD,GAAKD,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAO,EAAiBA,EAAGC,GACtD,IAAIC,EAAI7I,OAAO+E,UAAU+D,SAASvD,KAAKoD,GAAGI,MAAM,GAAI,GAEpD,MADU,WAANF,GAAkBF,EAAE7D,cAAa+D,EAAIF,EAAE7D,YAAYkE,MAC7C,QAANH,GAAqB,QAANA,EAAoBzF,MAAM6F,KAAKN,GACxC,cAANE,GAAqB,2CAA2CK,KAAKL,GAAW,EAAiBF,EAAGC,QAAxG,CALc,CAMhB,CHHgE,CAA2Bf,EAAK9K,IILjF,WACb,MAAM,IAAIyI,UAAU,4IACtB,CJGsG,EACtG,CKFA,SAAS,EAAQ2D,EAAQC,GAAkB,IAAInJ,EAAOD,OAAOC,KAAKkJ,GAAS,GAAInJ,OAAOqJ,sBAAuB,CAAE,IAAIC,EAAUtJ,OAAOqJ,sBAAsBF,GAAaC,IAAkBE,EAAUA,EAAQ3J,QAAO,SAAU4J,GAAO,OAAOvJ,OAAOwJ,yBAAyBL,EAAQI,GAAK1D,UAAY,KAAM5F,EAAKhD,KAAK4G,MAAM5D,EAAMqJ,EAAU,CAAE,OAAOrJ,CAAM,CAExV,SAAS,EAAc8G,GAAU,IAAK,IAAIhK,EAAI,EAAGA,EAAI3B,UAAUC,OAAQ0B,IAAK,CAAE,IAAIwF,EAAyB,MAAhBnH,UAAU2B,GAAa3B,UAAU2B,GAAK,CAAC,EAAOA,EAAI,EAAK,EAAQiD,OAAOuC,IAAS,GAAM5D,SAAQ,SAAUuB,GAAO,EAAgB6G,EAAQ7G,EAAKqC,EAAOrC,GAAO,IAAeF,OAAOyJ,0BAA6BzJ,OAAO0J,iBAAiB3C,EAAQ/G,OAAOyJ,0BAA0BlH,IAAmB,EAAQvC,OAAOuC,IAAS5D,SAAQ,SAAUuB,GAAOF,OAAO4F,eAAemB,EAAQ7G,EAAKF,OAAOwJ,yBAAyBjH,EAAQrC,GAAO,GAAM,CAAE,OAAO6G,CAAQ,CAMrhB,IAAI4C,EAAc,SAAqBhE,EAAOiE,GAC5C,IAAIpN,GAAM,IAAAqN,UAIV,OAHA,IAAAC,YAAU,WACRtN,EAAIuN,QAAUH,EAASpN,EAAIuN,QAAUpE,CACvC,GAAG,CAACA,EAAOiE,IACJpN,EAAIuN,OACb,EAEO,SAAS,EAAe3F,GAC7B,IAAI4C,EAAQ5L,UAAUC,OAAS,QAAsBC,IAAjBF,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC7E4O,EAAgBhD,EAAM7C,KAEtBhH,GAAO,IAAA8M,YAAW,IAAgB,CAAC,EACnCC,EAAkB/M,EAAKgH,KACvBgG,EAAuBhN,EAAKiN,UAE5BjG,EAAO6F,GAAiBE,GVvBrBrD,EU0BP,GAFI1C,IAASA,EAAKkG,mBAAkBlG,EAAKkG,iBAAmB,IAAIlD,IAE3DhD,EAAM,CACT,EAAS,0EAET,IAAImG,EAAY,SAAmBC,EAAGC,GACpC,MAAkC,iBAAvBA,EAAwCA,EAC/CA,GAAsD,WAAhC,EAAQA,IAA+E,iBAApCA,EAAmBC,aAAkCD,EAAmBC,aAC9IrH,MAAMC,QAAQkH,GAAKA,EAAEA,EAAElP,OAAS,GAAKkP,CAC9C,EAEIG,EAAc,CAACJ,EAAW,CAAC,GAAG,GAIlC,OAHAI,EAAYC,EAAIL,EAChBI,EAAYvG,KAAO,CAAC,EACpBuG,EAAYE,OAAQ,EACbF,CACT,CAEIvG,EAAK0G,QAAQC,YAAqCxP,IAA5B6I,EAAK0G,QAAQC,MAAMC,MAAoB,EAAS,uGAE1E,IAAIC,EAAc,EAAc,EAAc,EAAc,CAAC,EZ3BtD7E,GY2ByEhC,EAAK0G,QAAQC,OAAQ9D,GAEjGN,EAAcsE,EAAYtE,YAC1BuE,EAAYD,EAAYC,UACxBvD,EAAatD,GAAM+F,GAAwBhG,EAAK0G,SAAW1G,EAAK0G,QAAQT,UAC5E1C,EAAmC,iBAAfA,EAA0B,CAACA,GAAcA,GAAc,CAAC,eACxEvD,EAAKkG,iBAAiBa,mBAAmB/G,EAAKkG,iBAAiBa,kBAAkBxD,GACrF,IAAIkD,GAASzG,EAAKG,eAAiBH,EAAKgH,uBAAyBzD,EAAW0D,OAAM,SAAUvC,GAC1F,OlBEG,SAA4BzE,EAAID,GACrC,IAAI0G,EAAUzP,UAAUC,OAAS,QAAsBC,IAAjBF,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAEnF,OAAK+I,EAAKkH,WAAclH,EAAKkH,UAAUhQ,YAKmBC,IAArC6I,EAAK0G,QAAQS,oBAM3BnH,EAAKoH,mBAAmBnH,EAAI,CACjCoH,SAAU,SAAkB3E,EAAc4E,GACxC,GAAIZ,EAAQzE,UAAYyE,EAAQzE,SAASsF,QAAQ,qBAAuB,GAAK7E,EAAajJ,SAAS+N,iBAAiBC,SAAW/E,EAAagF,uBAAyBJ,EAAe5E,EAAagF,qBAAsBzH,GAAK,OAAO,CACrO,IApCJ,SAAsCA,EAAID,GACxC,IAAI0G,EAAUzP,UAAUC,OAAS,QAAsBC,IAAjBF,UAAU,GAAmBA,UAAU,GAAK,CAAC,EAC/E0Q,EAAM3H,EAAKkH,UAAU,GACrBU,IAAc5H,EAAK0G,SAAU1G,EAAK0G,QAAQkB,YAC1CC,EAAU7H,EAAKkH,UAAUlH,EAAKkH,UAAUhQ,OAAS,GACrD,GAA0B,WAAtByQ,EAAIG,cAA4B,OAAO,EAE3C,IAAIR,EAAiB,SAAwBS,EAAGrD,GAC9C,IAAIsD,EAAYhI,EAAKvG,SAAS+N,iBAAiB9Q,MAAM,GAAG+I,OAAOsI,EAAG,KAAKtI,OAAOiF,IAC9E,OAAsB,IAAfsD,GAAkC,IAAdA,CAC7B,EAEA,QAAItB,EAAQzE,UAAYyE,EAAQzE,SAASsF,QAAQ,qBAAuB,GAAKvH,EAAKvG,SAAS+N,iBAAiBC,SAAWzH,EAAK0H,uBAAyBJ,EAAetH,EAAK0H,qBAAsBzH,KAC3LD,EAAKiI,kBAAkBN,EAAK1H,IAC3BD,EAAKvG,SAAS+N,iBAAiBC,WAAWzH,EAAK0G,QAAQwB,WAAclI,EAAK0G,QAAQyB,4BACnFb,EAAeK,EAAK1H,IAAS2H,IAAeN,EAAeO,EAAS5H,IAE1E,CAaWmI,CAA6BnI,EAAID,EAAM0G,IAP9C,EAAS,yCAA0C1G,EAAKkH,YACjD,EAcX,CkBrBWE,CAAmB1C,EAAG1E,EAAM6G,EACrC,IAEA,SAASwB,IACP,OAAOrI,EAAKsI,UAAU,KAA6B,aAAvBzB,EAAY0B,OAAwBhF,EAAaA,EAAW,GAAIuD,EAC9F,CAEA,IACI0B,EAAa,GADD,IAAAC,UAASJ,GACkB,GACvC7B,EAAIgC,EAAW,GACfE,EAAOF,EAAW,GAElBG,EAAWpF,EAAWqF,OACtBC,EAAmBrD,EAAYmD,GAC/BG,GAAY,IAAApD,SAAO,IACvB,IAAAC,YAAU,WACR,IAAI1D,EAAW4E,EAAY5E,SACvBC,EAAgB2E,EAAY3E,cAahC,SAAS6G,IACHD,EAAUlD,SAAS8C,EAAKL,EAC9B,CAIA,OAlBAS,EAAUlD,SAAU,EAEfa,GAAUlE,GACbxC,EAAeC,EAAMuD,GAAY,WAC3BuF,EAAUlD,SAAS8C,EAAKL,EAC9B,IAGE5B,GAASoC,GAAoBA,IAAqBF,GAAYG,EAAUlD,SAC1E8C,EAAKL,GAOHpG,GAAYjC,GAAMA,EAAKI,GAAG6B,EAAU8G,GACpC7G,GAAiBlC,GAAMA,EAAKgJ,MAAM5I,GAAG8B,EAAe6G,GACjD,WACLD,EAAUlD,SAAU,EAChB3D,GAAYjC,GAAMiC,EAASxF,MAAM,KAAKjC,SAAQ,SAAUyO,GAC1D,OAAOjJ,EAAKO,IAAI0I,EAAGF,EACrB,IACI7G,GAAiBlC,GAAMkC,EAAczF,MAAM,KAAKjC,SAAQ,SAAUyO,GACpE,OAAOjJ,EAAKgJ,MAAMzI,IAAI0I,EAAGF,EAC3B,GACF,CACF,GAAG,CAAC/I,EAAM2I,IACV,IAAIO,GAAY,IAAAxD,SAAO,IACvB,IAAAC,YAAU,WACJmD,EAAUlD,UAAYsD,EAAUtD,SAClC8C,EAAKL,GAGPa,EAAUtD,SAAU,CACtB,GAAG,CAAC5F,EAAM8G,IACV,IAAInO,EAAM,CAAC6N,EAAGxG,EAAMyG,GAIpB,GAHA9N,EAAI6N,EAAIA,EACR7N,EAAIqH,KAAOA,EACXrH,EAAI8N,MAAQA,EACRA,EAAO,OAAO9N,EAClB,IAAK8N,IAAUlE,EAAa,OAAO5J,EACnC,MAAM,IAAIwQ,SAAQ,SAAUC,GAC1BrJ,EAAeC,EAAMuD,GAAY,WAC/B6F,GACF,GACF,GACF,CC9GO,qRCFP,MAAM,WAAEC,GAAeC,EAAAA,MAOvB,SAASC,EAA0B1G,GACjC,MAAM,SACJ2G,EAAQ,WACRpQ,EAAU,YACVqQ,EAAW,cACXC,EAAa,cACbC,EAAa,gBACbC,EAAe,gBACf1Q,EAAe,iBACfC,GACE0J,GAEE,kBACJtJ,EAAiB,2BACjBsQ,EAA0B,mBAC1BvQ,GACEJ,EAAgBO,SAGpB,GAAIgQ,EAAYvS,OAAS,EACvB,MAAM,IAAI6C,MAAM,qDAGlB,MAAM+P,EAAeL,EAAY,IAE1BM,EAAcC,IAAuBC,EAAAA,EAAAA,oBACrCC,EAAqBC,IAA0B1B,EAAAA,EAAAA,UAAS,IACxD2B,EAAkBC,IAAuB5B,EAAAA,EAAAA,UAAS,IAClD6B,EAA2BC,IAAgC9B,EAAAA,EAAAA,UAChE,OAGA+B,EACAC,IACEhC,EAAAA,EAAAA,UAAS,OACN3R,EAAS4T,IAAcjC,EAAAA,EAAAA,UAAS,OACjC,UAAEkC,EAAS,oBAAEC,GAAwBb,EAG3C,IAAIc,EACAC,EAMJ,GAJwC3R,EAAiB4R,uBAAuBrO,SA9ChF,wCAkDqC,CACnC,MAAMsO,EAAgB7R,EAAiB8R,eACrC,iFAGIC,GAAUpF,EAAAA,EAAAA,YAAWkF,EAAcG,SACzCN,EAAsBK,IAAU,GAChCJ,EAA+BI,IAAU,EAC3C,CACKJ,IAEHD,EAAsB,KACtBC,EAA+BA,CAACM,EAASpS,KAAgC,IAA9B,sBAAEC,GAAuBD,EAClEM,EAAmB+R,oBACnB,MAAM,mBAAEzN,IAAuB7E,EAAAA,EAAAA,GAC7B,CAAEG,kBAAiBC,oBACnBF,GAEIwQ,EAAclQ,EAAkB+R,wBACpC1N,EAAmB,IAEjB6L,EAAYvS,QACd8S,EAAoBuB,2BAA2B,CAC7C,CACE7B,cAAekB,EACfY,uBAAwB,CAAC/B,EAAY,GAAGxQ,yBAG9C,GASJ,MAAMwS,GAAyBC,EAAAA,EAAAA,cAC7BxB,IACE,MAAM,aAAE3P,GAAiBuP,GAEzBjT,EAAAA,EAAAA,IACEC,EACAyD,EAAa2C,KAAIzC,GAAeA,EAAY9D,2BAC5CuT,EACD,GAEH,CAACpT,EAASoT,EAAqBJ,IAS3B6B,EAAmBC,IACvBlB,EAAWkB,EAAIC,OAAO/U,QAAQ,EAG1BgV,GAAiBJ,EAAAA,EAAAA,cACrBK,IACE,MAAM,iBACJ7R,EAAgB,sBAChBjB,EAAqB,aACrB+S,GACElC,EAEC5P,GAAqBjB,IAItB+S,GAAgBA,EAAa9U,OAAS,GAGxC2G,QAAQC,KACN,sEA+RVmO,eACEtS,EACAuQ,EACA3Q,GAEA,MAAM,aAAEgB,GAAiBZ,EACnBc,EAAcF,EAAa2P,IAE3B,sBAAEjR,GAA0BwB,EAE5ByR,EAAuB3S,EAAkBK,mBAC7CX,GAGIkT,EAASD,EAAqBE,OAAO,GACrC5B,EAA+B,CACnC6B,UAAWF,EAAOE,UAClBC,YAAaH,EAAOG,YACpBC,WAAYJ,EAAOI,WACnBC,WAAYL,EAAOK,WACnBC,eAAgBN,EAAOM,eACvBC,UAAWP,EAAOO,UAClBC,kBAAmBR,EAAOQ,kBAC1BxS,kBAAmBgS,EAAOhS,kBAC1ByS,aAAcT,EAAOS,aACrBC,sBAAuBV,EAAOU,sBAC9BC,qBAAsBX,EAAOW,sBAG/B,MAAO,CAAEtC,+BAA8B0B,uBACzC,CAzTMa,CACEjD,EACAiC,EACAxS,GACAyT,MAAKC,IAA4D,IAA3D,qBAAEf,EAAoB,6BAAE1B,GAA8ByC,EAK5D,GAJA9C,EAAuB4B,GACvBxB,EAA6B2B,GAC7BzB,EAAgCD,GAG9B0B,EAAqBjT,wBACrBqR,GAA2BrR,sBAC3B,CACA,MAAM,aAAEsB,GAAiBuP,EAMnBoD,EAAerD,EAA2BsD,uBAC9CzD,GAGI0D,EAAavD,EAA2BwD,uBAC5CH,EAAaI,iBAKTC,EAFWH,EAAWI,cAEEjG,QAC5BhN,EAAawR,GAAwBpR,UAGjB,IAAlB4S,GACFH,EAAWK,gBAAgBF,EAE/B,KACA,GAEJ,CAACnU,EAAY0Q,EAAcQ,EAA2BZ,IAGlD2D,GAAyB3B,EAAAA,EAAAA,cAAY,KACzC,IAAKpB,EACH,OAAO,KAGT,MAAQoD,UAAWC,GAAcxU,EAAiB8R,eAChD,2DAGI,aAAE1Q,GAAiBuP,EACnBrP,EAAcF,EAAa2P,GAEjC,IAAKzP,EACH,OAAO,KAGT,MAAMmT,EAAoBtD,EAA0B8B,OAAOyB,WACzDC,GAASA,EAAMnT,UAAYF,EAAYE,UAGzC,OACEoT,EAAAA,cAACJ,EAASK,EAAA,GACJnL,EAAK,CAGT4G,YAAa,CAACa,GAKdV,gBAAiB,IACZA,EACHqE,YAAc,cAIdC,aAAc,QAEdC,YAAa,MAEfxC,iBAAkBA,EAClBiC,kBAAmBA,IACR,GAEd,CAACtD,EAA2BZ,EAAeQ,IAExCkE,GAAsB1C,EAAAA,EAAAA,cAC1B2C,IACE,IAAItC,EAAyB7B,EAEX,UAAdmE,GACFtC,IAEIA,GAA0B3B,IAC5B2B,EAAyB,KAG3BA,IAEIA,EAAyB,IAC3BA,EAAyB3B,EAAmB,IAIhDqB,EAAuBM,GACvBD,EAAeC,EAAuB,GAExC,CACE7B,EACAE,EACA0B,EACAL,KAOJ9F,EAAAA,EAAAA,YAAU,KACR,MAAM2I,EAAmC/U,EAAkBgV,UACzDhV,EAAkBiV,OAAOC,sBACzBC,IAAgC,IAA/B,uBAAElD,GAAwBkD,EACzB,MAAMC,EAAiBhE,EAAUC,GAE/BY,EAAuB9O,SAASiS,EAAe1V,wBAE/C+Q,EAAoB4E,0BAA0B,CAC5ClF,cAAekB,EACfY,uBAAwB,IAE5B,IAIJ,MAAO,KACL8C,EAAiCO,aAAa,CAC/C,GACA,KASHlJ,EAAAA,EAAAA,YAAU,KACHmE,EAAagF,UAChBhF,EAAaiF,OAEf,MAAMC,EAAkBlF,EAAavP,aAAarD,OAClDmT,EAAoB2E,EAAgB,GACnC,CAAClF,KAMJnE,EAAAA,EAAAA,YAAU,KACH7O,GAAYgT,EAAagF,UAG9BrD,EAAuBvB,EAAoB,GAC1C,CAACA,EAAqBpT,EAAS2U,EAAwB3B,IAM1D,IAAImF,EAAWpE,GAAqBM,SAAS+D,eAAehY,OAAS,GACrEyO,EAAAA,EAAAA,YAAU,KACRsJ,EAAWpE,GAAqBM,SAAS+D,eAAehY,OAAS,CAAC,GACjE,CAAC2T,KAMJlF,EAAAA,EAAAA,YAAU,KACRmG,EAAe5B,EAAoB,GAClC,CAAC9Q,EAAY0Q,IAGhB,IAAIqF,EAAoB,KAExB,IAAK7E,IAA8BE,EACjC,OAAO,KAGLhB,GAAYA,EAAStS,SACvBiY,EAAoB3F,EAAStM,KAAI,CAACkS,EAAOnT,IAErCmT,GACArB,EAAAA,aAAmBqB,EAAO,CACxB1F,gBACA3N,IAAKE,OAMb,MAAM,UACJoQ,EAAS,YACTC,EAAW,WACXC,EAAU,WACVC,EAAU,eACVC,EAAc,sBACdI,EAAqB,UACrBH,EAAS,kBACTC,EAAiB,qBACjBG,EAAoB,aACpBF,GACEpC,EAGJ,OACEuD,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAACsB,EAAAA,kBAAiB,CAChBC,cAAe1D,IACbA,EAAI2D,kBACJ3D,EAAI4D,gBAAgB,EAEtBC,cAAerB,EACfsB,mBAAoBA,IA0F5B,SAA4BC,GAMzB,IAN0B,aAC3B7F,EAAY,cACZJ,EAAa,eACbkG,EAAc,SACdX,EAAQ,6BACRnE,GACD6E,EACC,MAAME,EAAgBA,KACpB/E,EAA6B,aAAc,CACzC7R,sBAAuB6Q,EAAa7Q,sBACpCyQ,iBACA,GAGE,EAAElD,GAAMsJ,EAAe,UACvBC,EAAUvJ,EAAE,QAKZ9P,EACJkZ,IAAmBX,EAAW,EAAIW,GAAkBX,EAAW,EAAI,EACrE,IAAIe,EAAiB,KACjBC,EAAa,KAEjB,OAAQvZ,GACN,KAAK,EACHuZ,EAAaA,IAAMlC,EAAAA,cAACmC,EAAAA,KAAI,CAACrL,KAAK,iBAE9BmL,EAAiBA,IACfjC,EAAAA,cAAA,WAAK,2CAEHA,EAAAA,cAAA,WAAM,0BAIV,MACF,KAAK,EACHkC,EAAaA,IAAMlC,EAAAA,cAACmC,EAAAA,KAAI,CAACrL,KAAK,kBAE9BmL,EAAiBA,IACfjC,EAAAA,cAAA,WAAK,gDAEHA,EAAAA,cAAA,WAAM,2CAENA,EAAAA,cAAA,WAAM,qBAIV,MACF,KAAK,EACHkC,EAAaA,IAAMlC,EAAAA,cAACmC,EAAAA,KAAI,CAACrL,KAAK,qBAE9BmL,EAAiBA,IACfjC,EAAAA,cAAA,WAAO,SAAQgC,8BAIrB,MAAMI,EAAaA,IACjBpC,EAAAA,cAAA,OAAKqC,UAAU,wDACbrC,EAAAA,cAAA,OAAKqC,UAAU,+EACbrC,EAAAA,cAACkC,EAAU,MACXlC,EAAAA,cAAA,QAAMqC,UAAU,QAAO,OAEd,IAAV1Z,GACCqX,EAAAA,cAAA,OACEqC,UAAU,6FAEVC,UAAWR,GAEVE,IAMT,OACEhC,EAAAA,cAAAA,EAAAA,SAAA,KACGiC,GACCjC,EAAAA,cAACuC,EAAAA,QAAO,CAACC,QAASxC,EAAAA,cAACiC,EAAc,MAAKQ,SAAS,eAC7CzC,EAAAA,cAACoC,EAAU,QAGbH,GAAkBjC,EAAAA,cAACoC,EAAU,MAGrC,CA/KUM,CAAoB,CAClB3G,eACAJ,gBACAgH,WAAW,EACXd,eAAgB9F,EAAa8F,eAC7BX,WACAnE,iCAGJ6F,UAAW,CACTrS,MAAOqL,EACPiH,eAAe,EACfC,UAAWxH,EAAWqD,GACtBoE,cAAelE,EACfmE,kBAAmBpE,GAAqB,GACxCqE,mBAAoB,CAClBC,YAAa3E,EACT5U,IAAAA,MAAAA,SAAoB4U,EAAY4E,YAChC,GACJC,WAAY5E,GAAc,GAC1B6E,WAAY5E,GAAc,GAC1B6E,IAAKhF,GAAa,GAClBiF,UAAW7E,EAAkB,GAAEA,EAAe8E,QAAQ,OAAS,GAC/DC,aAC2Bra,IAAzB2V,EACK,GAAEA,EAAqByE,QAAQ,OAChC,GACNE,QAAS5E,GAAyB,OAKxCkB,EAAAA,cAAA,OAAKqC,UAAU,wDACZ/C,IACA8B,GAIT,CAEA5F,EAA0BmI,UAAY,CACpCjI,YAAakI,IAAAA,QAAkBA,IAAAA,QAC/BjI,cAAeiI,IAAAA,OAAAA,WACfvY,WAAYuY,IAAAA,OACZnI,SAAUmI,IAAAA,KACVhI,cAAegI,IAAAA,OACfC,YAAaD,IAAAA,OACb/H,gBAAiB+H,IAAAA,OACjBhI,cAAegI,IAAAA,OACfzY,gBAAiByY,IAAAA,WAAqBE,EAAAA,iBAAiBC,WACvD3Y,iBAAkBwY,IAAAA,WAAqBI,EAAAA,kBAAkBD,YAG3DvI,EAA0ByI,aAAe,CACvCJ,YAAa,CAAC,GA2HhB,gCC1hBA,IAAI1M,EAAwBrJ,OAAOqJ,sBAC/B+M,EAAiBpW,OAAO+E,UAAUqR,eAClCC,EAAmBrW,OAAO+E,UAAUuR,qBAsDxCvc,EAAOD,QA5CP,WACC,IACC,IAAKkG,OAAOuW,OACX,OAAO,EAMR,IAAIC,EAAQ,IAAI/Q,OAAO,OAEvB,GADA+Q,EAAM,GAAK,KACkC,MAAzCxW,OAAOyW,oBAAoBD,GAAO,GACrC,OAAO,EAKR,IADA,IAAIE,EAAQ,CAAC,EACJ3Z,EAAI,EAAGA,EAAI,GAAIA,IACvB2Z,EAAM,IAAMjR,OAAOkR,aAAa5Z,IAAMA,EAKvC,GAAwB,eAHXiD,OAAOyW,oBAAoBC,GAAOrV,KAAI,SAAUwH,GAC5D,OAAO6N,EAAM7N,EACd,IACWkE,KAAK,IACf,OAAO,EAIR,IAAI6J,EAAQ,CAAC,EAIb,MAHA,uBAAuBhW,MAAM,IAAIjC,SAAQ,SAAUkY,GAClDD,EAAMC,GAAUA,CACjB,IAEE,yBADE7W,OAAOC,KAAKD,OAAOuW,OAAO,CAAC,EAAGK,IAAQ7J,KAAK,GAMhD,CAAE,MAAOrE,GAER,OAAO,CACR,CACD,CAEiBoO,GAAoB9W,OAAOuW,OAAS,SAAUxP,EAAQxE,GAKtE,IAJA,IAAI0G,EAEAK,EADAyN,EAtDL,SAAkBC,GACjB,GAAIA,QACH,MAAM,IAAIxR,UAAU,yDAGrB,OAAOxF,OAAOgX,EACf,CAgDUC,CAASlQ,GAGTmQ,EAAI,EAAGA,EAAI9b,UAAUC,OAAQ6b,IAAK,CAG1C,IAAK,IAAIhX,KAFT+I,EAAOjJ,OAAO5E,UAAU8b,IAGnBd,EAAe7Q,KAAK0D,EAAM/I,KAC7B6W,EAAG7W,GAAO+I,EAAK/I,IAIjB,GAAImJ,EAAuB,CAC1BC,EAAUD,EAAsBJ,GAChC,IAAK,IAAIlM,EAAI,EAAGA,EAAIuM,EAAQjO,OAAQ0B,IAC/BsZ,EAAiB9Q,KAAK0D,EAAMK,EAAQvM,MACvCga,EAAGzN,EAAQvM,IAAMkM,EAAKK,EAAQvM,IAGjC,CACD,CAEA,OAAOga,CACR,8BChFA,IAAII,EAAuB,EAAQ,KAEnC,SAASC,IAAiB,CAC1B,SAASC,IAA0B,CACnCA,EAAuBC,kBAAoBF,EAE3Crd,EAAOD,QAAU,WACf,SAASyd,EAAKvQ,EAAOwQ,EAAUC,EAAeC,EAAUC,EAAcC,GACpE,GAAIA,IAAWT,EAAf,CAIA,IAAIzO,EAAM,IAAIxK,MACZ,mLAKF,MADAwK,EAAIM,KAAO,sBACLN,CAPN,CAQF,CAEA,SAASmP,IACP,OAAON,CACT,CAHAA,EAAKtB,WAAasB,EAMlB,IAAIO,EAAiB,CACnBC,MAAOR,EACPS,OAAQT,EACRU,KAAMV,EACNW,KAAMX,EACNY,OAAQZ,EACRpO,OAAQoO,EACRa,OAAQb,EACRc,OAAQd,EAERe,IAAKf,EACLgB,QAASV,EACT5c,QAASsc,EACTiB,YAAajB,EACbkB,WAAYZ,EACZa,KAAMnB,EACNoB,SAAUd,EACVe,MAAOf,EACPgB,UAAWhB,EACXiB,MAAOjB,EACPkB,MAAOlB,EAEPmB,eAAgB3B,EAChBC,kBAAmBF,GAKrB,OAFAU,EAAehC,UAAYgC,EAEpBA,CACT,iBC/CE/d,EAAOD,QAAU,EAAQ,IAAR,yBCNnBC,EAAOD,QAFoB,2ECDd,IAAIoS,EAAE,EAAQ,KAAiBrD,EAAE,MAAMoQ,EAAE,MAAMnf,EAAQof,SAAS,MAAMpf,EAAQqf,WAAW,MAAMrf,EAAQsf,SAAS,MAAM,IAAIC,EAAE,MAAMC,EAAE,MAAM3O,EAAE,MAAM7Q,EAAQyf,SAAS,MAAM,IAAIC,EAAE,MAAMC,EAAE,MACpM,GAAG,mBAAoB7U,QAAQA,OAAO8U,IAAI,CAAC,IAAIC,EAAE/U,OAAO8U,IAAI7Q,EAAE8Q,EAAE,iBAAiBV,EAAEU,EAAE,gBAAgB7f,EAAQof,SAASS,EAAE,kBAAkB7f,EAAQqf,WAAWQ,EAAE,qBAAqB7f,EAAQsf,SAASO,EAAE,kBAAkBN,EAAEM,EAAE,kBAAkBL,EAAEK,EAAE,iBAAiBhP,EAAEgP,EAAE,qBAAqB7f,EAAQyf,SAASI,EAAE,kBAAkBH,EAAEG,EAAE,cAAcF,EAAEE,EAAE,aAAa,CAAC,IAAIxW,EAAE,mBAAoByB,QAAQA,OAAOC,SACtR,SAAS+U,EAAEC,GAAG,IAAI,IAAIC,EAAE,yDAAyDD,EAAEE,EAAE,EAAEA,EAAE3e,UAAUC,OAAO0e,IAAID,GAAG,WAAWE,mBAAmB5e,UAAU2e,IAAI,MAAM,yBAAyBF,EAAE,WAAWC,EAAE,gHAAgH,CACpb,IAAIG,EAAE,CAAChN,UAAU,WAAW,OAAM,CAAE,EAAEiN,mBAAmB,WAAW,EAAEC,oBAAoB,WAAW,EAAEC,gBAAgB,WAAW,GAAGC,EAAE,CAAC,EAAE,SAASC,EAAET,EAAEC,EAAEC,GAAGzS,KAAKN,MAAM6S,EAAEvS,KAAKgI,QAAQwK,EAAExS,KAAKiT,KAAKF,EAAE/S,KAAKkT,QAAQT,GAAGE,CAAC,CACrN,SAASQ,IAAI,CAAyB,SAASC,EAAEb,EAAEC,EAAEC,GAAGzS,KAAKN,MAAM6S,EAAEvS,KAAKgI,QAAQwK,EAAExS,KAAKiT,KAAKF,EAAE/S,KAAKkT,QAAQT,GAAGE,CAAC,CADqGK,EAAEvV,UAAU4V,iBAAiB,CAAC,EAAEL,EAAEvV,UAAU6V,SAAS,SAASf,EAAEC,GAAG,GAAG,iBAAkBD,GAAG,mBAAoBA,GAAG,MAAMA,EAAE,MAAM3b,MAAM0b,EAAE,KAAKtS,KAAKkT,QAAQJ,gBAAgB9S,KAAKuS,EAAEC,EAAE,WAAW,EAAEQ,EAAEvV,UAAU8V,YAAY,SAAShB,GAAGvS,KAAKkT,QAAQN,mBAAmB5S,KAAKuS,EAAE,cAAc,EACjeY,EAAE1V,UAAUuV,EAAEvV,UAAsF,IAAI+V,EAAEJ,EAAE3V,UAAU,IAAI0V,EAAEK,EAAEhW,YAAY4V,EAAExO,EAAE4O,EAAER,EAAEvV,WAAW+V,EAAEC,sBAAqB,EAAG,IAAIC,EAAE,CAACjR,QAAQ,MAAMkR,EAAEjb,OAAO+E,UAAUqR,eAAe8E,EAAE,CAAChb,KAAI,EAAG1D,KAAI,EAAG2e,QAAO,EAAGC,UAAS,GAChS,SAASC,EAAExB,EAAEC,EAAEC,GAAG,IAAI3M,EAAEkO,EAAE,CAAC,EAAE/Q,EAAE,KAAKgR,EAAE,KAAK,GAAG,MAAMzB,EAAE,IAAI1M,UAAK,IAAS0M,EAAEtd,MAAM+e,EAAEzB,EAAEtd,UAAK,IAASsd,EAAE5Z,MAAMqK,EAAE,GAAGuP,EAAE5Z,KAAK4Z,EAAEmB,EAAE1V,KAAKuU,EAAE1M,KAAK8N,EAAE9E,eAAehJ,KAAKkO,EAAElO,GAAG0M,EAAE1M,IAAI,IAAIoO,EAAEpgB,UAAUC,OAAO,EAAE,GAAG,IAAImgB,EAAEF,EAAE3N,SAASoM,OAAO,GAAG,EAAEyB,EAAE,CAAC,IAAI,IAAIC,EAAErY,MAAMoY,GAAGla,EAAE,EAAEA,EAAEka,EAAEla,IAAIma,EAAEna,GAAGlG,UAAUkG,EAAE,GAAGga,EAAE3N,SAAS8N,CAAC,CAAC,GAAG5B,GAAGA,EAAE1D,aAAa,IAAI/I,KAAKoO,EAAE3B,EAAE1D,kBAAe,IAASmF,EAAElO,KAAKkO,EAAElO,GAAGoO,EAAEpO,IAAI,MAAM,CAACsO,SAAS7S,EAAE8S,KAAK9B,EAAE3Z,IAAIqK,EAAE/N,IAAI+e,EAAEvU,MAAMsU,EAAEM,OAAOZ,EAAEjR,QAAQ,CAChV,SAAS8R,EAAEhC,GAAG,MAAM,iBAAkBA,GAAG,OAAOA,GAAGA,EAAE6B,WAAW7S,CAAC,CAAoG,IAAIiT,EAAE,OAAO,SAASC,EAAElC,EAAEC,GAAG,MAAM,iBAAkBD,GAAG,OAAOA,GAAG,MAAMA,EAAE3Z,IAA7K,SAAgB2Z,GAAG,IAAIC,EAAE,CAAC,IAAI,KAAK,IAAI,MAAM,MAAM,IAAID,EAAEjT,QAAQ,SAAQ,SAASiT,GAAG,OAAOC,EAAED,EAAE,GAAE,CAA+EmC,CAAO,GAAGnC,EAAE3Z,KAAK4Z,EAAEhR,SAAS,GAAG,CAC/W,SAASmT,EAAEpC,EAAEC,EAAEC,EAAE3M,EAAEkO,GAAG,IAAI/Q,SAASsP,EAAK,cAActP,GAAG,YAAYA,IAAEsP,EAAE,MAAK,IAAI0B,GAAE,EAAG,GAAG,OAAO1B,EAAE0B,GAAE,OAAQ,OAAOhR,GAAG,IAAK,SAAS,IAAK,SAASgR,GAAE,EAAG,MAAM,IAAK,SAAS,OAAO1B,EAAE6B,UAAU,KAAK7S,EAAE,KAAKoQ,EAAEsC,GAAE,GAAI,GAAGA,EAAE,OAAWD,EAAEA,EAANC,EAAE1B,GAASA,EAAE,KAAKzM,EAAE,IAAI2O,EAAER,EAAE,GAAGnO,EAAEhK,MAAMC,QAAQiY,IAAIvB,EAAE,GAAG,MAAMF,IAAIE,EAAEF,EAAEjT,QAAQkV,EAAE,OAAO,KAAKG,EAAEX,EAAExB,EAAEC,EAAE,IAAG,SAASF,GAAG,OAAOA,CAAC,KAAI,MAAMyB,IAAIO,EAAEP,KAAKA,EAD/W,SAAWzB,EAAEC,GAAG,MAAM,CAAC4B,SAAS7S,EAAE8S,KAAK9B,EAAE8B,KAAKzb,IAAI4Z,EAAEtd,IAAIqd,EAAErd,IAAIwK,MAAM6S,EAAE7S,MAAM4U,OAAO/B,EAAE+B,OAAO,CACqRM,CAAEZ,EAAEvB,IAAIuB,EAAEpb,KAAKqb,GAAGA,EAAErb,MAAMob,EAAEpb,IAAI,IAAI,GAAGob,EAAEpb,KAAK0G,QAAQkV,EAAE,OAAO,KAAKjC,IAAIC,EAAE7c,KAAKqe,IAAI,EAAyB,GAAvBC,EAAE,EAAEnO,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAOhK,MAAMC,QAAQwW,GAAG,IAAI,IAAI2B,EACzf,EAAEA,EAAE3B,EAAExe,OAAOmgB,IAAI,CAAQ,IAAIC,EAAErO,EAAE2O,EAAfxR,EAAEsP,EAAE2B,GAAeA,GAAGD,GAAGU,EAAE1R,EAAEuP,EAAEC,EAAE0B,EAAEH,EAAE,MAAM,GAAGG,EANhE,SAAW5B,GAAG,OAAG,OAAOA,GAAG,iBAAkBA,EAAS,KAAsC,mBAAjCA,EAAE1W,GAAG0W,EAAE1W,IAAI0W,EAAE,eAA0CA,EAAE,IAAI,CAMtDsC,CAAEtC,GAAG,mBAAoB4B,EAAE,IAAI5B,EAAE4B,EAAElW,KAAKsU,GAAG2B,EAAE,IAAIjR,EAAEsP,EAAErR,QAAQC,MAA6B8S,GAAGU,EAA1B1R,EAAEA,EAAE5E,MAA0BmU,EAAEC,EAAtB0B,EAAErO,EAAE2O,EAAExR,EAAEiR,KAAkBF,QAAQ,GAAG,WAAW/Q,EAAE,MAAMuP,EAAE,GAAGD,EAAE3b,MAAM0b,EAAE,GAAG,oBAAoBE,EAAE,qBAAqB9Z,OAAOC,KAAK4Z,GAAG9M,KAAK,MAAM,IAAI+M,IAAI,OAAOyB,CAAC,CAAC,SAASa,EAAEvC,EAAEC,EAAEC,GAAG,GAAG,MAAMF,EAAE,OAAOA,EAAE,IAAIzM,EAAE,GAAGkO,EAAE,EAAmD,OAAjDW,EAAEpC,EAAEzM,EAAE,GAAG,IAAG,SAASyM,GAAG,OAAOC,EAAEvU,KAAKwU,EAAEF,EAAEyB,IAAI,IAAUlO,CAAC,CAC3Z,SAASiP,EAAExC,GAAG,IAAI,IAAIA,EAAEyC,QAAQ,CAAC,IAAIxC,EAAED,EAAE0C,QAAQzC,EAAEA,IAAID,EAAEyC,QAAQ,EAAEzC,EAAE0C,QAAQzC,EAAEA,EAAE3I,MAAK,SAAS2I,GAAG,IAAID,EAAEyC,UAAUxC,EAAEA,EAAE0C,QAAQ3C,EAAEyC,QAAQ,EAAEzC,EAAE0C,QAAQzC,EAAE,IAAE,SAASA,GAAG,IAAID,EAAEyC,UAAUzC,EAAEyC,QAAQ,EAAEzC,EAAE0C,QAAQzC,EAAE,GAAE,CAAC,GAAG,IAAID,EAAEyC,QAAQ,OAAOzC,EAAE0C,QAAQ,MAAM1C,EAAE0C,OAAQ,CAAC,IAAIE,EAAE,CAAC1S,QAAQ,MAAM,SAAS2S,IAAI,IAAI7C,EAAE4C,EAAE1S,QAAQ,GAAG,OAAO8P,EAAE,MAAM3b,MAAM0b,EAAE,MAAM,OAAOC,CAAC,CAAC,IAAI8C,EAAE,CAACC,uBAAuBH,EAAEI,wBAAwB,CAACC,WAAW,GAAGC,kBAAkB/B,EAAEgC,qBAAqB,CAACjT,SAAQ,GAAIwM,OAAOrK,GACjepS,EAAQmjB,SAAS,CAAC5b,IAAI+a,EAAEzd,QAAQ,SAASkb,EAAEC,EAAEC,GAAGqC,EAAEvC,GAAE,WAAWC,EAAEjW,MAAMyD,KAAKlM,UAAU,GAAE2e,EAAE,EAAEmD,MAAM,SAASrD,GAAG,IAAIC,EAAE,EAAuB,OAArBsC,EAAEvC,GAAE,WAAWC,GAAG,IAAUA,CAAC,EAAExa,QAAQ,SAASua,GAAG,OAAOuC,EAAEvC,GAAE,SAASA,GAAG,OAAOA,CAAC,KAAI,EAAE,EAAEsD,KAAK,SAAStD,GAAG,IAAIgC,EAAEhC,GAAG,MAAM3b,MAAM0b,EAAE,MAAM,OAAOC,CAAC,GAAG/f,EAAQgY,UAAUwI,EAAExgB,EAAQsjB,cAAc1C,EAAE5gB,EAAQujB,mDAAmDV,EAChX7iB,EAAQwjB,aAAa,SAASzD,EAAEC,EAAEC,GAAG,GAAG,MAAOF,EAAc,MAAM3b,MAAM0b,EAAE,IAAIC,IAAI,IAAIzM,EAAElB,EAAE,CAAC,EAAE2N,EAAE7S,OAAOsU,EAAEzB,EAAE3Z,IAAIqK,EAAEsP,EAAErd,IAAI+e,EAAE1B,EAAE+B,OAAO,GAAG,MAAM9B,EAAE,CAAoE,QAAnE,IAASA,EAAEtd,MAAM+N,EAAEuP,EAAEtd,IAAI+e,EAAEP,EAAEjR,cAAS,IAAS+P,EAAE5Z,MAAMob,EAAE,GAAGxB,EAAE5Z,KAAQ2Z,EAAE8B,MAAM9B,EAAE8B,KAAKxF,aAAa,IAAIqF,EAAE3B,EAAE8B,KAAKxF,aAAa,IAAIsF,KAAK3B,EAAEmB,EAAE1V,KAAKuU,EAAE2B,KAAKP,EAAE9E,eAAeqF,KAAKrO,EAAEqO,QAAG,IAAS3B,EAAE2B,SAAI,IAASD,EAAEA,EAAEC,GAAG3B,EAAE2B,GAAG,CAAC,IAAIA,EAAErgB,UAAUC,OAAO,EAAE,GAAG,IAAIogB,EAAErO,EAAEO,SAASoM,OAAO,GAAG,EAAE0B,EAAE,CAACD,EAAEpY,MAAMqY,GAAG,IAAI,IAAIna,EAAE,EAAEA,EAAEma,EAAEna,IAAIka,EAAEla,GAAGlG,UAAUkG,EAAE,GAAG8L,EAAEO,SAAS6N,CAAC,CAAC,MAAM,CAACE,SAAS7S,EAAE8S,KAAK9B,EAAE8B,KACxfzb,IAAIob,EAAE9e,IAAI+N,EAAEvD,MAAMoG,EAAEwO,OAAOL,EAAE,EAAEzhB,EAAQoN,cAAc,SAAS2S,EAAEC,GAA8K,YAA3K,IAASA,IAAIA,EAAE,OAAMD,EAAE,CAAC6B,SAASpC,EAAEiE,sBAAsBzD,EAAE0D,cAAc3D,EAAE4D,eAAe5D,EAAE6D,aAAa,EAAEC,SAAS,KAAKC,SAAS,OAAQD,SAAS,CAACjC,SAASrC,EAAEwE,SAAShE,GAAUA,EAAE+D,SAAS/D,CAAC,EAAE/f,EAAQgkB,cAAczC,EAAEvhB,EAAQikB,cAAc,SAASlE,GAAG,IAAIC,EAAEuB,EAAE2C,KAAK,KAAKnE,GAAY,OAATC,EAAE6B,KAAK9B,EAASC,CAAC,EAAEhgB,EAAQmkB,UAAU,WAAW,MAAM,CAAClU,QAAQ,KAAK,EAAEjQ,EAAQokB,WAAW,SAASrE,GAAG,MAAM,CAAC6B,SAAS/Q,EAAEwT,OAAOtE,EAAE,EAAE/f,EAAQskB,eAAevC,EAC3e/hB,EAAQukB,KAAK,SAASxE,GAAG,MAAM,CAAC6B,SAASjC,EAAE6E,SAAS,CAAChC,SAAS,EAAEC,QAAQ1C,GAAG0E,MAAMlC,EAAE,EAAEviB,EAAQ0kB,KAAK,SAAS3E,EAAEC,GAAG,MAAM,CAAC4B,SAASlC,EAAEmC,KAAK9B,EAAE4E,aAAQ,IAAS3E,EAAE,KAAKA,EAAE,EAAEhgB,EAAQ+V,YAAY,SAASgK,EAAEC,GAAG,OAAO4C,IAAI7M,YAAYgK,EAAEC,EAAE,EAAEhgB,EAAQmQ,WAAW,SAAS4P,EAAEC,GAAG,OAAO4C,IAAIzS,WAAW4P,EAAEC,EAAE,EAAEhgB,EAAQ4kB,cAAc,WAAW,EAAE5kB,EAAQgQ,UAAU,SAAS+P,EAAEC,GAAG,OAAO4C,IAAI5S,UAAU+P,EAAEC,EAAE,EAAEhgB,EAAQ6kB,oBAAoB,SAAS9E,EAAEC,EAAEC,GAAG,OAAO2C,IAAIiC,oBAAoB9E,EAAEC,EAAEC,EAAE,EAChdjgB,EAAQ8kB,gBAAgB,SAAS/E,EAAEC,GAAG,OAAO4C,IAAIkC,gBAAgB/E,EAAEC,EAAE,EAAEhgB,EAAQ+kB,QAAQ,SAAShF,EAAEC,GAAG,OAAO4C,IAAImC,QAAQhF,EAAEC,EAAE,EAAEhgB,EAAQglB,WAAW,SAASjF,EAAEC,EAAEC,GAAG,OAAO2C,IAAIoC,WAAWjF,EAAEC,EAAEC,EAAE,EAAEjgB,EAAQ+P,OAAO,SAASgQ,GAAG,OAAO6C,IAAI7S,OAAOgQ,EAAE,EAAE/f,EAAQ8S,SAAS,SAASiN,GAAG,OAAO6C,IAAI9P,SAASiN,EAAE,EAAE/f,EAAQilB,QAAQ,qCCnBnThlB,EAAOD,QAAU,EAAjB,cCEFC,EAAOD,QAAU,CACf,MAAQ,EACR,MAAQ,EACR,IAAM,EACN,KAAO,EACP,OAAS,EACT,IAAM,EACN,KAAO,EACP,OAAS,EACT,MAAQ,EACR,MAAQ,EACR,OAAS,EACT,QAAU,EACV,OAAS,EACT,KAAO,wBCnBTC,EAAOD,QAAUU,wBCAjBT,EAAOD,QAAUS,wBCAjBR,EAAOD,QAAUQ,wBCAjBP,EAAOD,QAAUM,wBCAjBL,EAAOD,QAAUY,wBCAjBX,EAAOD,QAAUW,wBCAjBV,EAAOD,QAAUO,ICCb2kB,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB5jB,IAAjB6jB,EACH,OAAOA,EAAarlB,QAGrB,IAAIC,EAASilB,EAAyBE,GAAY,CAGjDplB,QAAS,CAAC,GAOX,OAHAslB,EAAoBF,GAAUnlB,EAAQA,EAAOD,QAASmlB,GAG/CllB,EAAOD,OACf,CAGAmlB,EAAoB3d,EAAI8d,EzCzBpBzkB,EAAW,GACfskB,EAAoBhD,EAAI,CAACoD,EAAQC,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAAS3iB,EAAI,EAAGA,EAAIpC,EAASU,OAAQ0B,IAAK,CAGzC,IAFA,IAAKuiB,EAAUC,EAAIC,GAAY7kB,EAASoC,GACpC4iB,GAAY,EACPC,EAAI,EAAGA,EAAIN,EAASjkB,OAAQukB,MACpB,EAAXJ,GAAsBC,GAAgBD,IAAaxf,OAAOC,KAAKgf,EAAoBhD,GAAG7Q,OAAOlL,GAAS+e,EAAoBhD,EAAE/b,GAAKof,EAASM,MAC9IN,EAASO,OAAOD,IAAK,IAErBD,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACbhlB,EAASklB,OAAO9iB,IAAK,GACrB,IAAIuc,EAAIiG,SACEjkB,IAANge,IAAiB+F,EAAS/F,EAC/B,CACD,CACA,OAAO+F,CAnBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAIziB,EAAIpC,EAASU,OAAQ0B,EAAI,GAAKpC,EAASoC,EAAI,GAAG,GAAKyiB,EAAUziB,IAAKpC,EAASoC,GAAKpC,EAASoC,EAAI,GACrGpC,EAASoC,GAAK,CAACuiB,EAAUC,EAAIC,EAqBjB,E0C1BdP,EAAoBnE,EAAI,CAAC,EACzBmE,EAAoBvE,EAAKoF,IACxB9f,OAAOC,KAAKgf,EAAoBnE,GAAGzZ,KAAKnB,IACvC+e,EAAoBnE,EAAE5a,GAAK4f,EAAQ,GAClC,ECHHb,EAAoBpW,EAAK9O,IACxB,IAAIgmB,EAAShmB,GAAUA,EAAOimB,WAC7B,IAAOjmB,EAAiB,QACxB,IAAM,EAEP,OADAklB,EAAoB3D,EAAEyE,EAAQ,CAAElG,EAAGkG,IAC5BA,CAAM,ECLdd,EAAoB3D,EAAI,CAACxhB,EAASmmB,KACjC,IAAI,IAAI/f,KAAO+f,EACXhB,EAAoBtW,EAAEsX,EAAY/f,KAAS+e,EAAoBtW,EAAE7O,EAASoG,IAC5EF,OAAO4F,eAAe9L,EAASoG,EAAK,CAAE2F,YAAY,EAAMqa,IAAKD,EAAW/f,IAE1E,ECND+e,EAAoBtW,EAAI,CAAChE,EAAKwb,IAAUngB,OAAO+E,UAAUqR,eAAe7Q,KAAKZ,EAAKwb,GCClFlB,EAAoB3F,EAAKxf,IACH,oBAAX8K,QAA0BA,OAAOwb,aAC1CpgB,OAAO4F,eAAe9L,EAAS8K,OAAOwb,YAAa,CAAEza,MAAO,WAE7D3F,OAAO4F,eAAe9L,EAAS,aAAc,CAAE6L,OAAO,GAAO,E7CA1D/K,EAAkB,CACrB,IAAK,GAKNqkB,EAAoBnE,EAAE8E,EAAKE,IAC1B,IAAKb,EAAoBtW,EAAE/N,EAAiBklB,SAAyCxkB,IAA7BV,EAAgBklB,GAAiC,CACxGllB,EAAgBklB,GAAW,KAC3B,IAAIO,EAAOC,SAASxC,cAAc,QAE9BmB,EAAoBsB,IACvBF,EAAKG,aAAa,QAASvB,EAAoBsB,IAEhDF,EAAKI,IAAM,WACXJ,EAAKK,GAAK,SACVL,EAAKM,KAAO1B,EAAoBhG,EAAIgG,EAAoBzF,EAAEsG,GAC1DQ,SAASM,KAAKC,YAAYR,EAC3B,GASDpB,EAAoBhD,EAAE2D,EAAKE,GAA0C,IAA7BllB,EAAgBklB,G8ChCxDb,EAAoBhD,EAAE,EAAG,CAAC,MAAM,KAC/BgD,EAAoBvE,EAAE,IAAI,GACxB,+KCAGhf,8DAAKolB,GAELC,EAAsB,WACtBC,EAAqB,GAAEtlB,2BAA4BqlB,8DCLzD,SACEE,MAAO,QACPC,WAAY,aACZC,SAAU,WACVC,OAAQ,SACRC,QAAS,WCMI,MAAMC,UAA2BC,EAAAA,eAG9Czc,cAME0c,MALSpmB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACGA,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CACjBqmB,cAAe,CAAC,IAqBpB,KACAC,gBAAkB,IAAM,KAAI,KAC5BC,wBAA0B,IAAM,KAAI,KAEpCC,iBAAmB,CACjBrmB,EACAsmB,KAEA,MAAM,SAAEpmB,GAAaF,GACf,QAAEN,GAAYQ,EAEpB,IAAIqmB,EAAclgB,EAAAA,WAAAA,MAAAA,eAChB0F,KAAKya,cACL9mB,GAIF,IAAK6mB,GAAazmB,OAChB,OAQF,GALAymB,EAAcxa,KAAK0a,wCACjB/mB,EACA6mB,IAGGA,GAAazmB,OAChB,OAGF,MAAM4mB,GAAsCtmB,EAAAA,EAAAA,IAC1CV,IAGI,YACJE,EAAW,0BACXD,GACE+mB,EAEEC,EACJhnB,EAA0BC,GAGtBgnB,EAAsBL,EAAYniB,QAAOiC,GAC7C1G,EAA0B2F,SACxBe,EAAWC,MAAMugB,aAAatnB,4BAIlC,IAAKW,EAAS4mB,SAASC,KACrB,OAGF,MAAMC,EAAgE,CACpEnQ,YAAa9K,KAAK8K,YAClBzR,SAAU2G,KAAKya,cACfS,WAAYjnB,EAAeE,SAASC,IAGtC,IAAK,IAAIqB,EAAI,EAAGA,EAAIolB,EAAoB9mB,OAAQ0B,IAAK,CACnD,MAAM6E,EAAaugB,EAAoBplB,GACjCqF,EAAgBR,EAAWQ,eAC3B,eAAEqgB,GAAmB7gB,EAAWC,KAAKugB,aACrC,YAAEA,GAAgBxgB,EAAWC,MAC7B,kBAAES,GAAsBV,EAAWS,SAEzCkgB,EAAengB,cAAgBA,EAE/B,MAAMsgB,EAAYpb,KAAKqb,SAAS,YAAaJ,EAAgB3gB,GACvDghB,EAAWtb,KAAKqb,SAAS,WAAYJ,EAAgB3gB,GAMrDiJ,EAAU,CACdgY,MALAT,EAAYtnB,2BAA6BonB,EACrC,iBACA5a,KAAKqb,SAAS,QAASJ,EAAgB3gB,GAI3CghB,WACAF,aAGF1iB,OAAOC,KAAKwiB,GAAgB9jB,SAAQmkB,IAClC,MAAMC,EAA+BN,EAAeK,GAEpD,IAAIE,EACAC,EAEJ,OAAQH,GACN,KAAKI,EAAAA,MACHF,EAAe1b,KAAK6b,YACpB,MACF,KAAKD,EAAAA,WACHF,EAAe1b,KAAK8b,iBACpB,MACF,KAAKF,EAAAA,SACHF,EAAe1b,KAAK+b,eACpB,MACF,KAAKH,EAAAA,OACHF,EAAe1b,KAAKgc,cACpB,MACF,KAAKJ,EAAAA,QACHF,EAAe1b,KAAKgc,cACpBL,EACE/hB,EAAAA,UAAAA,KAAAA,QAAAA,wBACF,MACF,QACE,MAAM,IAAIhD,MAAO,4BAA2B4kB,KAGhD,MAAMS,EAAoBP,EACxBnB,EACApmB,EACAsnB,EACA3gB,EACAE,EACAuI,GAGFvD,KAAKkc,cACH3B,EACApmB,EACA8nB,EACAN,EACArhB,EACA2gB,EACA1X,EACD,GAEL,EAjJF,CAEA4Y,2BAA2BC,GAGzB,MAAMC,EAAcC,KAAKC,IAAIH,EAAOroB,OAAQ,GACtCyoB,EAAQ,GAEd,IAAK,IAAI/mB,EAAI,EAAGA,EAAI4mB,EAAa5mB,IAAK,CACpC,MAAMgnB,EAAaL,EAAO3mB,GAC1B+mB,EAAM7mB,KAAM,GAAE+mB,EAAkBD,EAAWthB,SAASshB,EAAWpe,QACjE,CAEA,OAAOme,CACT,CAsIAT,eACExB,EACApmB,EACAgnB,EACArgB,EACAE,EACAuI,GAEA,MAAMoZ,EAAiB,CACrBpB,MAAOhY,EAAQgY,MACfqB,MAAOrZ,EAAQ6X,WAEjB,IAAIyB,EAAuB,GA2B3B,OA1BA1B,EAAephB,KAAI,CAACQ,EAAMzB,KACxB,MAAMmjB,EAAoB1hB,EAAKR,KAAI4X,GAAKxd,EAAS2oB,cAAcnL,KACzDoL,EAAW,GAAEjkB,IAEc,IAA7BmjB,EAAkBloB,OACpBipB,EAAAA,QAAAA,SACEzC,EACAzf,EACAiiB,EACAd,EAAkB,GAClBA,EAAkB,GAClBU,GAGFK,EAAAA,QAAAA,aACEzC,EACAzf,EACAiiB,EACAd,EACAU,GAIJE,EAAuBA,EAAqBvgB,OAAO2f,EAAkB,IAGhEY,CACT,CAEAf,iBACEvB,EACApmB,EACAgnB,EACArgB,EACAE,EACAuI,GAEA,IAAI0Y,EACJd,EAAephB,KAAI,CAACQ,EAAMzB,KACxBmjB,EAAoB1hB,EAAKR,KAAI4X,GAAKxd,EAAS2oB,cAAcnL,KAEzDqL,EAAAA,QAAAA,YACEzC,EACAzf,EAHqB,IAKrBmhB,EACA,CACEV,MAAOhY,EAAQgY,OAElB,GAEL,CAEAM,YACEtB,EACApmB,EACAgnB,EACArgB,EACAE,EACAuI,GAEA,MAAM0Y,EAAoB,GA6C1B,OA5CAd,EAAephB,KAAI,CAACQ,EAAMzB,KACxB,MAAMmkB,EAAQ1iB,EAAK,GAEnB0hB,EAAkBtmB,KAAKxB,EAAS2oB,cAAcG,IAG9C,MAAMC,EAAmBrjB,EAAAA,SAAAA,IACvB,mBACAmB,GAGF,IAAImiB,EAAU,GACVC,EAAU,GAEd,GAAIF,EAAkB,CACpB,MAAM,QAAEG,EAAO,KAAEC,GAASJ,EAC1BC,EAAUE,EAAU,GACpBD,EAAUE,EAAO,EACnB,CAEA,MAAMC,EAAaC,EAAAA,UAAAA,mBAA2BxiB,EAAmBiiB,GAC3DQ,EAAWD,EAAAA,UAAAA,mBAA2BxiB,EAAmB,CAC7DuiB,EAAW,GAAKJ,EAChBI,EAAW,GAAKH,IAGlBnB,EAAkBtmB,KAAKxB,EAAS2oB,cAAcW,IAE9C,MAAMC,EAAY,GAAE5kB,IAGpBkkB,EAAAA,QAAAA,UACEzC,EACAzf,EACA4iB,EACAzB,EAAkB,GAClBA,EAAkB,GAClB,CACEV,MAAOhY,EAAQgY,MACfqB,MAAOrZ,EAAQ6X,WAElB,IAGIa,CACT,CAEAD,cACEzB,EACApmB,EACAgnB,EACArgB,EACAE,EACAuI,GAEA,IAAI0Y,EA6CJ,OA5CAd,EAAephB,KAAI,CAACQ,EAAMzB,KACxB,GAAoB,IAAhByB,EAAKxG,OAGP,OAGF,MAAM4pB,EAAqBpjB,EAErBqjB,EAAWzpB,EAAS0pB,cAK1B,IAAIC,EAHJ7B,EAAoB0B,EAAmB5jB,KAAI4X,GACzCxd,EAAS2oB,cAAcnL,KAIvBmM,EADc,IAAZF,GAA8B,KAAZA,EAElBhkB,EAAAA,UAAAA,KAAAA,QAAAA,wBAA+C,CAC7CqiB,EAAkB,GAClBA,EAAkB,GAClBA,EAAkB,GAClBA,EAAkB,KAKpBriB,EAAAA,UAAAA,KAAAA,QAAAA,wBAA+CqiB,GAInD,MAAMc,EAAW,GAAEjkB,IACnBkkB,EAAAA,QAAAA,YACEzC,EACAzf,EACAiiB,EACAe,EAAc,GACdA,EAAc,GACd,CACEvC,MAAOhY,EAAQgY,MACfqB,MAAOrZ,EAAQ6X,WAElB,IAGIa,CACT,CAEAC,cACE3B,EACApmB,EACA8nB,EACAN,EACArhB,EACA2gB,GAEA,IADA1X,EAAOzP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEX,IAAKmoB,IAAsB3hB,EACzB,OAGF,MAAM,cAAEQ,EAAa,KAAEP,EAAO,CAAC,GAAMD,GAC/B,MAAEa,GAAUZ,GACZ,MAAEghB,GAAUhY,EAElB,IAAIwa,EAA2B9B,EAES,mBAA7BN,IACToC,EAA2BpC,EAAyBM,IAEtD,MAAM+B,EAAYhe,KAAKmc,2BAA2BhhB,GAC5C8iB,EAAsBrkB,EAAAA,UAAAA,QAAAA,uBAC1BmkB,GAGFzjB,EAAWC,KAAK2jB,QAAQC,QAAQC,cAAgBjqB,EAASkqB,cACvDJ,GAGF,MAAMK,EAAkBnqB,EAAS2oB,cAC/BxiB,EAAWC,KAAK2jB,QAAQC,QAAQC,eAI5BG,EAAiBve,KAAKwe,sBAC1BvD,EACA3gB,GAGImkB,EAAczB,EAAAA,QAAAA,kBAClBzC,EACAzf,EARiB,IAUjBkjB,EACAM,EACArC,EACA,CAAC,EACD,IACKsC,EACHhD,WAII1f,EAAG6iB,EAAM7J,EAAG8J,EAAG,MAAE/B,EAAK,OAAEgC,GAAWH,EAE3CnkB,EAAWC,KAAK2jB,QAAQC,QAAQU,iBAAmB,CACjDC,QAAS3qB,EAASkqB,cAAc,CAACK,EAAMC,IACvCI,SAAU5qB,EAASkqB,cAAc,CAACK,EAAO9B,EAAO+B,IAChDK,WAAY7qB,EAASkqB,cAAc,CAACK,EAAMC,EAAMC,IAChDK,YAAa9qB,EAASkqB,cAAc,CAACK,EAAO9B,EAAO+B,EAAMC,IAE7D,EA/YmB5E,EACZ3gB,SAAW,iBAiZpB,MAAM6lB,EAAiB,CACrB,aAAc,MACd,YAAa,MACbC,KAAM,SACNC,OAAQ,GACRC,oBAAqB,IAGvB,SAAS3C,EAAkBvhB,GACzB,MAAMmkB,EAAYJ,EAAe/jB,GAEjC,YAAkBnH,IAAdsrB,EACKA,EAGFnkB,CACT,CC3aA,MAaA,EAbkB,CAChBokB,eAAgBvF,EAAmB3gB,SACnCmmB,SAAU,WACVC,gBAAiB,kBACjBC,gBAAiB,kBACjBC,YAAa,cACbC,gBAAiB,kBACjBC,QAAS,UACTC,YAAa,cACbC,eAAgB,iBAChBC,oBAAqB,uBCNjBC,EAAU,KAID,SAASC,EACtB5oB,EACAE,EACA1B,GAGA,MAAMuD,EAAW8mB,EAAAA,eAEX7nB,EAAkB,CACtB9E,yBAA0B8D,EAAY9D,yBACtC2nB,eAAgB,CAAC,EACjBiB,OAAQ9kB,EAAY8kB,OACpB5kB,WAGFF,EAAY8oB,OAAO/oB,SAAQgpB,IACzB,MAAM,YAAE7E,EAAW,YAAE8E,GAAgBD,OAEersB,IAAhDsE,EAAgB6iB,eAAeK,KACjCljB,EAAgB6iB,eAAeK,GAAe,IAGhDljB,EAAgB6iB,eAAeK,GAAa7lB,KAwDhD,SACE6lB,EACA8E,EACA9oB,EACA0B,GAEA,MAAOE,EAAgBC,GAAYH,EAAmBI,MAAM,KAE5D,IAAI6hB,EAEJ,OAAQK,GACN,KAAKI,EAAAA,MACL,KAAKA,EAAAA,WACL,KAAKA,EAAAA,SACHT,EAAiB,GAEjB,IAAK,IAAI1lB,EAAI,EAAGA,EAAI6qB,EAAYvsB,OAAQ0B,GAAK,EAAG,CAC9C,MAAM8qB,EAAW3mB,EAAAA,UAAAA,mBAA6BpC,EAAS,CACrD8oB,EAAY7qB,GACZ6qB,EAAY7qB,EAAI,KAGlB0lB,EAAexlB,KAAK4qB,EACtB,CAEA,MACF,KAAK3E,EAAAA,OAAqB,CACxB,MAAM4E,EAAc,GACpB,IAAK,IAAI/qB,EAAI,EAAGA,EAAI6qB,EAAYvsB,OAAQ0B,GAAK,EAAG,CAC9C,MAAM8qB,EAAW3mB,EAAAA,UAAAA,mBAA6BpC,EAAS,CACrD8oB,EAAY7qB,GACZ6qB,EAAY7qB,EAAI,KAGlB+qB,EAAY7qB,KAAK4qB,EACnB,CAKA,MAAME,EAASD,EAAY,GACrBE,EAAcF,EAAY,GAE1BG,EAASC,EAAAA,KAAAA,SAAcH,EAAQC,GAE/BG,EAAmBhnB,EAAAA,SAAAA,IAAa,mBAAoBrC,GAE1D,IAAKqpB,EACH,MAAM,IAAIjqB,MAAM,6BAGlB,MAAM,cACJkqB,EAAa,WACbC,GAIEF,EAKEG,EAAiBJ,EAAAA,KAAAA,SACvBA,EAAAA,KAAAA,YAAiBI,EAAgBP,EAAQK,EAAeH,GAExD,MAAMM,EAAeL,EAAAA,KAAAA,SACrBA,EAAAA,KAAAA,YAAiBK,EAAcR,EAAQK,GAAgBH,GAGvD,MAAMO,EAAkBN,EAAAA,KAAAA,SACxBA,EAAAA,KAAAA,YAAiBM,EAAiBT,EAAQM,EAAYJ,GAEtD,MAAMQ,EAAgBP,EAAAA,KAAAA,SACtBA,EAAAA,KAAAA,YAAiBO,EAAeV,EAAQM,GAAaJ,GAErDxF,EAAiB,CACf6F,EACAC,EACAC,EACAC,GAGF,KACF,CACA,KAAKvF,EAAAA,QAAsB,CAMzB,MAAM4E,EAAgC,GACtC,IAAK,IAAI/qB,EAAI,EAAGA,EAAI6qB,EAAYvsB,OAAQ0B,GAAK,EAAG,CAC9C,MAAM8qB,EAAW3mB,EAAAA,UAAAA,mBAA6BpC,EAAS,CACrD8oB,EAAY7qB,GACZ6qB,EAAY7qB,EAAI,KAGlB+qB,EAAY7qB,KAAK4qB,EACnB,CAEA,MAAMa,EAAiBR,EAAAA,KAAAA,cAAmBJ,EAAY,IAChDa,EAAeT,EAAAA,KAAAA,cAAmBJ,EAAY,IAC9Cc,EAAiBV,EAAAA,KAAAA,cAAmBJ,EAAY,IAChDe,EAAeX,EAAAA,KAAAA,cAAmBJ,EAAY,IAE9CgB,EAAeZ,EAAAA,KAAAA,SACrBA,EAAAA,KAAAA,IAASY,EAAcH,EAAcD,GAGrCR,EAAAA,KAAAA,UAAeY,EAAcA,GAE7B,MAAMC,EAAeb,EAAAA,KAAAA,SACrBA,EAAAA,KAAAA,IAASa,EAAcF,EAAcD,GACrCV,EAAAA,KAAAA,UAAea,EAAcA,GAE7B,MAAMZ,EAAmBhnB,EAAAA,SAAAA,IAAa,mBAAoBrC,GAE1D,IAAKqpB,EACH,MAAM,IAAIjqB,MAAM,mDAGlB,MAAM,cACJkqB,GACqCD,EAGjCa,EAAmBd,EAAAA,KAAAA,cAAmBE,GAEtCa,EAA6BrF,KAAKsF,IACtChB,EAAAA,KAAAA,IAASc,EAAkBF,IAEvBK,EAA6BvF,KAAKsF,IACtChB,EAAAA,KAAAA,IAASc,EAAkBD,IAGvBK,EAA4BxF,KAAKsF,IAAID,GACrCI,EAA4BzF,KAAKsF,IAAIC,GAE3C1G,EAAiB,GACbmB,KAAKsF,IAAIE,EAA4B,GAAK7B,EAC5C9E,EAAiB,CACfqF,EAAY,GACZA,EAAY,GACZA,EAAY,GACZA,EAAY,IAELlE,KAAKsF,IAAIG,EAA4B,GAAK9B,EACnD9E,EAAiB,CACfqF,EAAY,GACZA,EAAY,GACZA,EAAY,GACZA,EAAY,IAGd9lB,QAAQC,KAAK,qCAEf,KACF,CACA,QACED,QAAQC,KAAK,2BAA4B6gB,GAG7C,OAAOL,CACT,CA1NM6G,CACExG,EACA8E,EACA9oB,EACAF,EAAY4B,oBAEf,IAIH,MAAM2nB,EAAmBhnB,EAAAA,SAAAA,IAAa,mBAAoBrC,GAEpDyqB,EAAoB3nB,EAAAA,WAAAA,MAAAA,uBAGpB7C,EACHH,EAAY8oB,OAAO,GAAG8B,uBACrB5qB,EAAY8oB,OAAO,GAAG8B,sBAAsB,IAAIC,uBAClD,EAEIC,EAAiC,CACrCtnB,cAAexD,EAAY9D,yBAC3BuH,SAAU,CACRF,oBAAqBgmB,EAAiBwB,oBACtChpB,SAAUA,EACV2B,kBAAmBxD,GAErB+C,KAAM,CACJY,MAAO7D,EAAY8kB,OACnB8B,QAAS,CACPC,QAAS,CAAC,GAEZrD,YAAa,CACXtnB,yBAA0B8E,EAAgB9E,yBAC1C2nB,eAAgB7iB,EAAgB6iB,gBAElC1jB,YAAaA,IAIjBwqB,EAAkBK,cAAcF,GAEhC9qB,EAAYirB,QAAS,EACrBjrB,EAAYE,QAAUA,EACtBF,EAAYxB,sBAAwBA,EAKpCwB,EAAYC,yBACVD,EAAY8oB,OAAO,GAAG8B,sBAAsB3qB,yBAC9CD,EAAYG,YAAcA,SACnBH,EAAY8oB,MACrB,aCpFA,MAAMoC,EACJ9tB,EAAAA,WAAAA,cAAAA,kBAAAA,yCAGIG,EAAiC,CAAC,2BAClCJ,EAAqB+tB,EAAoB/tB,mBCC/C,MAAQguB,WAAYC,GAA4BhuB,EAAAA,WAAAA,eAE1C,SAAEiuB,EAAUC,iBAAkBC,GAAqBC,EAAAA,QAOnDja,EAAe,CACnB,gCACA,gCACA,gCACA,iCAGIlU,EAAmC,qBACnCC,EAAsC,MAEtCmuB,EAAuBA,CAACnoB,EAAaooB,KACzCA,EAAU3rB,SAAQ4rB,IAChB,GAAIA,EAAGlsB,mBAAqB6D,EAE1B,MADAF,QAAQC,KAAK,sCAAuCC,EAAKqoB,GACnD,IAAIrsB,MACP,aAAYqsB,EAAGhsB,qCAAqC2D,IAEzD,GACA,EAGEsoB,EAA6B,CACjCC,yBAA0B,SAC1BC,aAAc,SACdC,oBAAqB,SACrBC,iBAAkB,SAClBC,kBAAmB,SACnB/vB,yBAA0B,SAC1B0F,mBAAoB,SACpBsqB,QAAS,SACTC,YAAa,SACbC,oBAAqBhB,EAAwBiB,WAAWtE,qBAGpDuE,EAA0B,CAC9BC,IAAK,MACLC,uBAAwB,CACtBpB,EAAwBztB,uBACxB,SAIE8uB,EAAoB,CACxBC,cAAe,gBACfC,SAAU,YAGNC,EAAkC,sBASxC,SAASC,EACPnB,EACA5sB,GASA,OAPA4J,KAAKgjB,UAAUrtB,QAAQqtB,GACvB7c,EAAAA,MAAAA,mBAAyBnG,KAAKgjB,WAI9BhjB,KAAKnJ,SAAWmJ,KAAKgjB,UAAUhjB,KAAKgjB,UAAUjvB,OAAS,GACvDiM,KAAK2L,UAAW,EACT3L,IACT,CAUA,SAASokB,EACPpB,EACAjtB,EACAC,GAGA,IAAKgtB,IAAcA,EAAUjvB,OAC3B,MAAM,IAAI6C,MAAM,8BAGlBuP,EAAAA,MAAAA,mBAAyB6c,GAIzB,MAAMnsB,EAAWmsB,EAAUA,EAAUjvB,OAAS,IAExC,iBACJgD,EAAgB,kBAChBC,EAAiB,eACjBC,EAAc,kBACduS,EAAiB,aACjBC,EAAY,WACZ4a,EAAU,wBACVprB,EAAuB,YACvBqrB,GACEztB,EAGJ,GAFAksB,EAAqBlsB,EAASE,iBAAkBisB,IAG7C/pB,GACDA,EAAwB9D,YACtB+tB,EAA2BC,yBAS7B,OAPAptB,EAAgBO,SAASiuB,sBAAsBC,KAAK,CAClDC,MAAO,WACPC,QACE,2HACFrQ,KAAM,UACNsQ,SAAU,MAEL,GAGT,MAAMnuB,EAAa,CAEjBouB,SAAU,KACV9uB,sBAAuBqQ,EAAAA,MAAAA,OACvBqD,oBACAC,eACA4a,aACAptB,iBACAD,oBACAD,mBACA2iB,kBAAiB,EACjB4K,cACAtB,YACA6B,iBAAkB,KAClBztB,aAAc,KACd0tB,qBAAqB,EACrBnZ,UAAU,EACV9C,eACAhS,WACAstB,gBAKF,OAFA3tB,EAAWoV,KAAO,IAKpB,SAAepV,EAAYT,EAAiBC,GAC1C,MAAM,kBAAEI,EAAiB,mBAAED,GAAuBJ,EAAgBO,SAC5DyuB,EAAc/uB,EAAiBgvB,iBAC/B/uB,EAAa8uB,EAAY,IAEzB,gBAAE9sB,GAAoBzB,EAAWK,SAEvCL,EAAWquB,iBAieb,SAAkCI,GAChC,MAMM1B,EAAoB2B,EANLD,EAAwC/sB,MAC3DitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BE,eAIhBnrB,iBACbC,MACAitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BK,oBAGzBsB,EAAmB,GAiBzB,OAfAK,EAAoB3B,EAAkBtrB,iBAAiBZ,SAAQ8tB,IAC7D,MAAM,sBAAEjD,GAA0BiD,EAClC,GAAKjD,EACL,IAAK,MAAMhtB,KAAOgwB,EAAoBhD,GACpC,GAAIhtB,EAAIkwB,sBAAuB,CAC7B,MAAM,sBAAEA,EAAqB,yBAAE7tB,GAA6BrC,EAE5D2vB,EAAiBlvB,KAAK,CACpByvB,wBACA7tB,4BAEJ,CACF,IAGKstB,CACT,CAlgBgCQ,CAAyBptB,GACvDzB,EAAWY,aAwKb,SAA0B6tB,GACxB,MAAM5B,EAAsB4B,EAAwC/sB,MAClEitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BG,sBAWzBiC,EAwBR,SACEC,GAEA,MAAMD,EAAoD,CAAC,EA8C3D,OA5CAC,EAAkBluB,SAAQisB,IACxB,MAAMrrB,EAAkBitB,EACtB5B,EAAiBrrB,iBAGbutB,EAA+BvtB,EAAgBC,MACnDitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2B1vB,2BAG1BgyB,GACH9qB,QAAQC,KACN,kEAIJ,MAAM8qB,EAA2BD,EAA6BE,SAKtD1xB,IAFNsxB,EACEG,GAIFH,EACEG,GACE,IAAIxtB,GAIRA,EAAgBZ,SAAQ8tB,IAEpBA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2B1vB,0BAE3B8xB,EACEG,GACA9vB,KAAKwvB,EACT,GAEJ,IAGKG,CACT,CA1E4DK,CARhCT,EACxB7B,EAAoBprB,iBACpBI,QACA8sB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BI,oBAOzBlsB,EAAe,GAiBrB,OAfAsB,OAAOC,KAAK2sB,GAAmDjuB,SAC7DouB,IACE,MAKMnuB,EA+DZ,SAA6BsuB,GAC3B,GACEA,EAAsBC,MACpBC,GAA6B,WAApBA,EAAMC,WAA8C,aAApBD,EAAMC,YAGjD,OAMJ,SAAoCH,GAIlC,MAAMI,EAAcJ,EAAsB1tB,MACxC4tB,GAA6B,WAApBA,EAAMC,YAGXE,EAAoBL,EAAsB1tB,MAC9C4tB,GAA6B,WAApBA,EAAMC,YAGXG,EAAgCN,EAAsB1tB,MAC1DitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BhqB,qBAG/B,IAAK8sB,EAIH,YAHAtrB,QAAQC,KACL,qBAAoBqrB,EAAYD,2DAKrC,MAAMI,EAAkBP,EAAsBvtB,QAC5CytB,GAA6B,QAApBA,EAAMC,YAGXzuB,EAAc,CAClBirB,QAAQ,EACRnG,OAAQ,GACRgE,OAAQ,CAACgG,EAA+BJ,IACxCxyB,yBAA0ByyB,EAAkBP,IAC5CxsB,mBAAoBgtB,EAA8B/sB,WAgBpD,OAbAgtB,EAAgB9uB,SAAQ8tB,IACtB,MAAM,wBAAElsB,EAAuB,sBAAEotB,GAA0BlB,EAEvDkB,GACF/uB,EAAY8kB,OAAOzmB,KACjB2wB,EACErtB,EACAotB,GAGN,IAGK/uB,CACT,CAzDWivB,CAA2BX,GAGpC,OAwDF,SAAoDA,GAClD,MAAMO,EAAkBP,EAAsBvtB,QAC5CytB,GAA6B,QAApBA,EAAMC,YAGXE,EAAoBL,EAAsB1tB,MAC9C4tB,GAA6B,WAApBA,EAAMC,YAGXG,EAAgCN,EAAsB1tB,MAC1DitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BhqB,qBAGzBmC,EAAUuqB,EAAsB1tB,MACpCitB,GACEA,EAAKlsB,wBAAwB9D,YAC7B+tB,EAA2BM,UAGzBpoB,EAAewqB,EAAsBvtB,QACzC8sB,GACEA,EAAKlsB,wBAAwBhE,yBAC3B2uB,EAAwBC,KAC1BsB,EAAKlsB,wBAAwB9D,YAC3B+tB,EAA2BO,cAG3BnsB,EAAc,CAClBirB,QAAQ,EACRnG,OAAQ,GACRgE,OAAQ,GACR5sB,yBAA0ByyB,EAAkBP,IAC5CxsB,mBAAoBgtB,EAA8B/sB,WAIlDkC,GACAuoB,EAAwBE,uBAAuBvqB,SAC7C8B,EAAQmrB,oBAAoBvxB,yBAE9BoG,EAAQmrB,oBAAoBrxB,YAC1B+tB,EAA2BQ,qBAE7BpsB,EAAY8kB,OAAOzmB,KAAK,CACtBwF,MAAO+oB,EACP7lB,MAAOhD,EAAQmrB,oBAAoBnxB,cAKvC,GAAI+F,EAAarH,OAAQ,CACvB,MAAM0yB,EAAiCrrB,EAAalD,MAClDurB,GACEG,EAAwBE,uBAAuBvqB,SAC7CkqB,EAAY+C,oBAAoBvxB,yBAElCwuB,EAAY+C,oBAAoBrxB,YAC9B+tB,EAA2BQ,sBAG7B+C,GACFnvB,EAAY8kB,OAAOzmB,KAAK,CACtBwF,MAAO+oB,EACP7lB,MAAOooB,EAA+BD,oBAAoBnxB,aAGhE,CAmCA,OAjCA8wB,EAAgB9uB,SAAQ8tB,IACtB,MAAM,wBACJlsB,EAAuB,gBACvBhB,EAAe,sBACfouB,GACElB,GAEE,UAAEY,GAAc9tB,EAEtB,GAAmB,YAAd8tB,EAKH,YAJArrB,QAAQC,KACL,WAAUorB,mDAMf,MAAM3F,EAASgG,EAA+BnuB,GAE1CmoB,GACF9oB,EAAY8oB,OAAOzqB,KAAKyqB,GAGtBiG,GACF/uB,EAAY8kB,OAAOzmB,KACjB2wB,EACErtB,EACAotB,GAGN,IAGK/uB,CACT,CAhKSovB,CAA2Cd,EACpD,CAzE0Be,CAJlBrB,EACEG,IAKAnuB,GACFF,EAAazB,KAAK2B,EACpB,IAIGF,CACT,CA7M4BwvB,CAAiB3uB,GAE3C,MAAMvB,EAAWP,EAAmBQ,kBAClChC,EACAC,GAGF4B,EAAWoF,YAAa,EACxBpF,EAAWiW,eDrKE,SAAwBjW,EAAYE,GACjD,IAAKA,IAAaA,EAAS3C,OACzB,OAAO,EAGT,MAAM+F,EAAqBpD,EAASqD,KAAIC,GAAKA,EAAEC,kBACzC,aAAE7C,GAAiBZ,EAEnBqwB,EAAcnuB,OAAOC,KAAK6pB,GAAqBnqB,QACnDyuB,GAE8C,mBADrCtE,EAAoBsE,GACxBC,uCAGDC,EAAW,GAEjBH,EAAYxvB,SAAQuB,IACdkB,EAAmBP,SAASX,IAG9BouB,EAASrxB,KAAK6sB,EAAoB5pB,GACpC,IAGF,IAAK,IAAInD,EAAI,EAAGA,EAAI2B,EAAarD,OAAQ0B,IAAK,CAC5C,MAAM,mBAAEyD,GAAuB9B,EAAa3B,IAAM,CAAC,EAcnD,GAbmBuxB,EAASnB,MAAKoB,IAC/B,IAAK7tB,EAAgBC,GAAYH,EAAmBI,MAAM,KACtDzE,EAA+B0E,SAASH,KAC1CA,EAAiB3E,GAGnB,MAAM+E,EAA4B,GAAEJ,KAAkBC,IAEtD,OAAO4tB,EAAQF,qCACbvtB,EACD,IAID,OAAO,EAETkB,QAAQwsB,IACN,kCACAhuB,EACA9B,EAAa3B,GAEjB,CAGA,OADAiF,QAAQwsB,IAAI,kDACL,CACT,CCkH8Bza,CAAejW,EAAYE,GACvDF,EAAWmV,UAAW,EAGtBvV,EAAkB+wB,kBAAkB9vB,SAAQ+vB,IAC1CC,EACE7wB,EACA4wB,EACAnxB,EACD,IAIHG,EAAkBgV,UAChBhV,EAAkBiV,OAAOic,oBACzB/sB,IACE,MAAM,iBAAEgtB,GAAqBhtB,EAG7BgtB,EAAiBlwB,SAAQmwB,IACvBH,EACE7wB,EACAgxB,EACAvxB,EACD,GACD,GAGR,CAjD0BwxB,CAAMjxB,EAAYT,EAAiBC,GAEpD,CAACQ,EACV,CAgDA,SAAS6wB,EACP1gB,EACA6gB,EACAvxB,GAEA,IAAIyxB,EAAuB/gB,EAAavP,aAAaiB,QACnDf,IAAsC,IAAvBA,EAAYirB,SAG7B,GAAoC,IAAhCmF,EAAqB3zB,OAEvB,OAGF,IAAKyzB,aAAyB7E,EAE5B,OAGF,MAAM,aAAE9Z,EAAY,OAAEI,GAAWue,EASjC,GANAE,EAAuBA,EAAqBrvB,QAAOf,GACjDA,EAAY8oB,OAAOyF,MAAKxF,GACtBxX,EAAatP,SAAS8mB,EAAM6B,sBAAsBkD,2BAIlB,IAAhCsC,EAAqB3zB,OAEvB,OAGF,MAAM4zB,EAAkB,GAExBD,EAAqBrwB,SAAQC,IAC3B,MAAM,OAAE8oB,GAAW9oB,EAEnB8oB,EAAO/oB,SAAQgpB,IACb,MAAMppB,EACJopB,EAAM6B,sBAAsB3qB,yBAEzBowB,EAAgBpuB,SAAStC,IAC5B0wB,EAAgBhyB,KAAKsB,EACvB,GACA,IAGJ,MAAM2wB,EAAwB3xB,EAAW4xB,yBACvCL,GAGF,IAAK,MAAMhwB,KAAWowB,EAAuB,CAC3C,IAAKF,EAAqB3zB,OAExB,OAGF,MAAM,eAAEkD,EAAc,YAAEQ,GAAgBorB,EAAiBiF,mBACvDtwB,GAGF,GAAImwB,EAAgBpuB,SAAStC,GAC3B,IAAK,IAAIqhB,EAAIoP,EAAqB3zB,OAAS,EAAGukB,GAAK,EAAGA,IAAK,CACzD,MAAMhhB,EAAcowB,EAAqBpP,GAEvCyP,EACEzwB,EACAL,EACAQ,KAGFyoB,EACE5oB,EACAE,EACAgwB,EAAc1xB,uBAGhB4xB,EAAqBnP,OAAOD,EAAG,GAEnC,CAEJ,CACF,CAEA,SAASyP,EACPzwB,EACAL,EACAQ,GAEA,MAAM,OAAE2oB,GAAW9oB,EAIb6qB,EACH7qB,EAAY8oB,OAAO,GAAG8B,uBACrB5qB,EAAY8oB,OAAO,GAAG8B,sBAAsB,IAAIC,uBAClD,EAEF,GAAI1qB,GAAe2G,OAAO3G,KAAiB2G,OAAO+jB,GAChD,OAAO,EAET,IAAK,IAAI7J,EAAI,EAAGA,EAAI8H,EAAOrsB,OAAQukB,IAAK,CACtC,MAAM+H,EAAQD,EAAO9H,IACf,yBAAE/gB,GAA6B8oB,EAAM6B,sBAE3C,GAAI3qB,IAA6BN,EAC/B,OAAO,CAEX,CACF,CA0RA,SAASmvB,EAA+BjB,GACtC,MAAM,UAAEY,EAAS,iBAAEiC,EAAgB,YAAExM,EAAW,YAAE8E,GAAgB6E,EAElE,GAEI6C,GAAoBjE,EAAkBC,eACtCgE,GAAoBjE,EAAkBE,SAOxC,YAJAvpB,QAAQC,KACL,wBAAuBqtB,yGAM5B,MAAM5H,EAAS,CAAE2F,YAAWvK,cAAa8E,eAGzC,GAAkB,WAAdyF,EAAwB,CAC1B,MAAM,sBAAE7D,GAA0BiD,EAAKltB,gBAEvCmoB,EAAO8B,sBAAwBA,CACjC,MAAO,GAAkB,aAAd6D,EAA0B,CACnC,MAAM,mCAAEkC,GAAuC9C,EAAKltB,gBAEpDmoB,EAAO6H,mCAAqCA,CAC9C,CAEA,OAAO7H,CACT,CAEA,SAASkG,EACPrtB,EACAotB,GAEA,MAAM,YAAEhxB,GAAgB4D,GAClB,aAAEivB,EAAY,6BAAEC,GAAiC9B,GACjD,UAAElxB,GAAcgzB,EAMtB,MAAO,CACLhtB,MAAO9F,EACPgJ,MAAQ,GANmB6pB,EACzB9pB,OAAO8pB,GAAc9Z,QAAQ,GAC7B,MAIgCjZ,IAEtC,CAqCA,SAAS+vB,EAAoBkD,GAC3B,OAAKA,EACEtsB,MAAMC,QAAQqsB,GAAYA,EAAW,CAACA,GADvB,EAExB,CAEA,QAlXA,SAAiCvyB,GAAwC,IAAvC,gBAAEE,EAAe,iBAAEC,GAAkBH,EASrE,MAAO,CACL,CACE6L,KAAM+X,EACN5Q,eACAwf,yBAZ6BrF,GACxBoB,EACLpB,EACAjtB,EACAC,IAWN,ECjVMsyB,EAA6C,CACjDl0B,GAAI,WAIJm0B,6BAA6B,EAC7B7mB,KAAM,gBAEN8mB,sBAAuB,GACvBC,aAAc,CAAC,WAIfC,yBAA0B,EAG1BC,gBAAiB,CACfliB,gBAAiB,CACfsE,aAAc,QACdD,YAAa,UACb8d,oBAAoB,GAEtBtiB,YAAa,CACX,CACElS,GAAI,iBACJy0B,yBAA0B,KAIhCC,oBAAqB,CACnBC,eAAgB,CACdC,oBAAqB,CACnB,CACEC,UAAW,WACXC,WAAY,CACVC,OAAQ,UAMlBC,OAAQ,CACN,CACE1nB,KAAM,gBACN2nB,kBAAmB,CACjBC,WAAY,OACZC,WAAY,CACVjM,KAAM,EACND,QAAS,IAGb7V,UAAW,CACT,CACEf,gBAAiB,CAAEmiB,oBAAoB,GACvCtiB,YAAa,CACX,CACElS,GAAI,8CCxDlB,MAAM,IAAE8yB,GAAQ3yB,IA+GhB,QA7GA,SACE+D,EACAkxB,GAEA,MAAMC,EAAoB,CAAC,EAE3B,SAASC,EAAuBpvB,EAAYqvB,GAC1C,IAAKrvB,EAAWS,UAAUC,kBAIxB,YAHAksB,EAAIvsB,KACD,4CAA2CgvB,KAAYrvB,EAAWlG,MAKvE,MAAMoD,EAAU8C,EAAWS,SAASC,kBAE/ByuB,EAAkBjyB,KACrBiyB,EAAkBjyB,GAAW,CAAC,GAGhC,MAAMoyB,EAA2BH,EAAkBjyB,GAE9CoyB,EAAyBD,KAC5BC,EAAyBD,GAAY,CACnCpvB,KAAM,KAIV,MAAMsvB,EAAmBvxB,EAAgBJ,MACvC4xB,GAAMA,EAAGlvB,MAAQN,EAAWQ,gBAExBT,EAAWuvB,EAAyBD,GAAUpvB,KAEpD,IAAI,QAAEc,GAAYwuB,EAClB,MAAMzuB,EAAe,GAIjByuB,EAAiB1uB,QACfquB,EAAuBjwB,SAASowB,GAClCtuB,EAAU,CACRlG,UAAW,sBACXF,uBAAwB,gBACxBI,YAAaw0B,EAAiB1uB,OAGhCC,EAAazF,KAAK,CAChBR,UAAW,sBACXF,uBAAwB,gBACxBI,YAAaw0B,EAAiB1uB,SAKhC0uB,EAAiBzuB,cACnBA,EAAazF,QAAQk0B,EAAiBzuB,cAGxC,MAAM9D,EAAcoB,OAAOuW,OAAO,CAAC,EAAG3U,EAAY,CAChDe,UACAD,iBAGFf,EAAS1E,KAAK2B,EAChB,CAEA,MACMyyB,EADYzxB,EAAgByB,KAAI+vB,GAAMA,EAAGlvB,MACxB6G,QAEjBwgB,EAAoB3nB,EAAAA,WAAAA,MAAAA,uBACpB0vB,EAAoB/H,EAAkBgI,uBAE5C,IAAK,IAAIx0B,EAAI,EAAGA,EAAIu0B,EAAkBj2B,OAAQ0B,IAAK,CACjD,MAAMy0B,EAAmBF,EAAkBv0B,GAErC00B,EAA8BlI,EAAkBmI,eACpDF,GAGIG,EAAY3xB,OAAOC,KAAKwxB,GAE9B,IAAK,IAAI7R,EAAI,EAAGA,EAAI+R,EAAUt2B,OAAQukB,IAAK,CACzC,MAAMqR,EAAWU,EAAU/R,GAErBkC,EAAc2P,EAA4BR,GAEhD,GAAInP,EACF,IAAK,IAAIvX,EAAI,EAAGA,EAAIuX,EAAYzmB,OAAQkP,IAAK,CAC3C,MAAM3I,EAAakgB,EAAYvX,GACzBqnB,EAAWP,EAAKrf,WACpB9P,GAAOA,IAAQN,EAAWQ,gBAG5B,IAAkB,IAAdwvB,IACFZ,EAAuBpvB,EAAYqvB,GACnCI,EAAKxR,OAAO+R,EAAU,IAEjBP,EAAKh2B,QACR,OAAO01B,CAGb,CAEJ,CACF,CAEA,OAAOA,CACT,GCvGM,kBAAEj1B,GAAsBE,EAAAA,WAAAA,eACtBwyB,IAAGA,GAAK3yB,IAyJhB,EApHuBsB,IAAQ,MAALA,EACxB,MAAM00B,EAAU,CASdC,eAAgB1gB,IAIV,IAJW,gBACfxR,EAAe,uBACfkxB,EAAsB,QACtBjmB,EAAU,CAAC,GACZuG,EACC,MAAM2gB,EAAYF,EAAQG,eACxBpyB,EACAkxB,EACAjmB,GAEIonB,EAAaC,IAAAA,KAAAA,cAAyBH,GAG5C,IAAII,EAAYC,IAAIC,gBAAgBJ,GACpCK,OAAO5a,SAASnB,OAAO4b,EAAU,EAYnCI,kBAAmBniB,UAKb,IALoB,gBACxBxQ,EAAe,WACfrC,EAAU,uBACVuzB,EAAsB,QACtBjmB,EAAU,CAAC,GACZgI,EAKC,GAFA2b,EAAIgE,KAAK,gCAEJj1B,IAAeA,EAAW4P,QAAU5P,EAAW4P,MAAMslB,MAIxD,OAHAjE,EAAIkE,MACF,gEAEKplB,QAAQqlB,OAAO,CAAC,GAGzB,IACE,MAAMC,EAjFU,SACtBhzB,EACAkxB,GAEG,IADHjmB,EAAOzP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEX,MAAM21B,EAAoB8B,EACxBjzB,EACAkxB,GAGIgC,EAASh3B,EAAkBk2B,eAC/BjB,EACA5vB,EAAAA,SACAD,EAAAA,UAAAA,mBACA2J,IAGI,QAAE5L,GAAY6zB,EAOpB,YAH4C,IAAjC7zB,EAAQ8zB,uBACjB9zB,EAAQ8zB,qBAAuB,cAE1B9zB,CACT,CAwDkC+zB,CACxBpzB,EACAkxB,EACAjmB,IAGI,iBAAExM,EAAgB,gBAAEkB,GAAoBqzB,EAI9C,IAAKrzB,IAAkB,GAAGA,iBAAiBlE,OAKzC,MAJA2G,QAAQwsB,IACN,4CACAoE,GAEI,IAAI10B,MAAM,8BAclB,aAXMX,EAAW4P,MAAMslB,MAAMG,GAEzBv0B,GACFd,EAAW01B,2BAA2B50B,GAMxCD,EAAAA,mBAAAA,aAAgC,CAACw0B,IAAoB,GAE9CA,CACT,CAAE,MAAOF,GAKP,MAJA1wB,QAAQC,KAAKywB,GACblE,EAAIkE,MACD,kDAAiDA,EAAM1G,WAEpD,IAAI9tB,MACRw0B,EAAM1G,SAAW,uCAErB,IAIEkH,EAAc,CAClBpB,eAAgB,CACdqB,UAAWtB,EAAQC,eACnBsB,cAAe,GACfvoB,QAAS,CAAC,GAEZ0nB,kBAAmB,CACjBY,UAAWtB,EAAQU,kBACnBa,cAAe,GACfvoB,QAAS,CAAC,IAId,MAAO,CACLgnB,UACAqB,cACAG,eAAgB,gCACjB,EC7JY,SAASC,EACtBtqB,EACAuqB,EACA9R,GAEA,MAAM+R,UAAsBD,GAAtBC,EACG7yB,SAAWqI,GAEpByqB,EAAAA,EAAAA,SAAQD,EACV,cCTA,MAAMvJ,EAAWG,EAAAA,QAAAA,SAEXsJ,EAAeA,CAAC90B,EAAalB,KACjC,MAAM,sBAAEN,EAAuByB,yBAA0B80B,GACvD/0B,EACIyR,EAAuB3S,EAAkBK,mBAC7CX,GAEF,GAAKiT,EAAqBE,OAC1B,OAAOF,EAAqBE,OAAO/Q,MAAK+qB,GAAMA,EAAGhsB,iBAAmBo1B,GAAO,EAOvEC,GAA0BA,CAC9Bl2B,EACAI,KAEA,MAAMwsB,EAAY,GACZuJ,EAAe,CAAC,EACtB,IAAK,MAAMj1B,KAAed,EAAWY,aAAc,CACjD,MAAM,QAAEI,GAAYF,EACpB,IAAKE,EAAS,SACd,GAAI+0B,EAAa/0B,GAAU,SAE3B,MAAMX,EAAWu1B,EAAa90B,EAAalB,GACtCS,GAKL01B,EAAa/0B,GAAWX,EACxBmsB,EAAUrtB,KAAKkB,IALb6D,QAAQwsB,IAAI,cAAe5vB,EAAa,yBAM5C,CACA,OAAO0rB,CAAS,EAmDlB,GAxCwCwJ,CAACp2B,EAAmBI,KAC1D,MAAMwsB,EAAYsJ,GAAwBl2B,EAAmBI,GAWvDi2B,EAAW,IAAI9J,EAASK,GACxBnsB,EAAWmsB,EAAU,GAwB3B,OAvBAyJ,EAASC,cAAc,CACrB52B,sBAAuB22B,EAAS7xB,IAChCypB,WAAYxtB,EAASwtB,WACrBsI,WAAY91B,EAAS81B,WACrB31B,kBAAmBy1B,EAAS7xB,IAC5B7D,iBAAkBF,EAASE,iBAC3B0S,aAAc5S,EAAS4S,cAAgB,EACvC6a,YAAaztB,EAASytB,YACtB9a,kBAAoB,GAAEhT,EAAWgT,wBAAwBhT,EAAWK,SAAS4S,eAC7Emb,SAAU,KACVgI,cAAc,EACdC,eAAgB7J,EAAUjvB,OAC1B2lB,kBAAoB,sDACpBoT,mBAAmB,EAEnBC,kBAAkB,EAClBC,cAAc,EACdC,6BAA6B,EAC7BC,gBA7BsB,WACtBltB,KAAKiJ,OAAOsP,OACV,EACAvY,KAAKiJ,OAAOlV,UACTu4B,GAAwBl2B,EAAmBI,IAEhDwJ,KAAK6sB,eAAiB7sB,KAAKiJ,OAAOlV,MACpC,IAyBAqC,EAAkB+2B,eAAeV,GAE1BA,CAAQ,yOCzEjB,MAAMjiB,GAAYI,EAAAA,MAAW,IACpB,uCAKHxE,GAA4B1G,GAE9BkL,EAAAA,cAACA,EAAAA,SAAc,CAACwiB,SAAUxiB,EAAAA,cAAA,WAAK,eAC7BA,EAAAA,cAACJ,GAAc9K,IAmDrB,GA3CyB,CAIvBtL,GAAE,EACFi5B,YCjCa,SAAoBx3B,GAAsB,IAArB,gBAAEE,GAAiBF,EACrD,MAAM,kBAAEO,GAAsBL,EAAgBO,SAGxB,IAFEF,EAAkBk3B,qBAEAC,UAAUl1B,QAClDm1B,GAAMA,EAAG9T,oBAAsBA,IAGnBriB,SAAQm2B,IAEpBA,EAAG5xB,YAAa,CAAK,GAEzB,EDuBE6xB,gBEjBa,SAAa53B,GAEe,IAFd,cAC3BskB,EAAgB,CAAC,GACgBtkB,GACjCs2B,EAAAA,EAAAA,SAAQnS,GACRgS,EAAgB7L,EAAAA,SAAoBuN,EAAAA,YACpC1B,EAAgB7L,EAAAA,gBAA2BwN,EAAAA,mBAC3C3B,EAAgB7L,EAAAA,gBAA2ByN,EAAAA,mBAC3C5B,EAAgB7L,EAAAA,YAAuB0N,EAAAA,eACvC7B,EAAgB7L,EAAAA,gBAA2B2N,EAAAA,mBAC3C9B,EAAgB7L,EAAAA,QAAmB4N,EAAAA,WAEnC/B,EAAgB7L,EAAAA,YAAuB6N,EAAAA,eAGvChC,EAAgB7L,EAAAA,oBAA+B8N,EAAAA,uBAG/C,MAAMC,EAAa,CACjB5S,SAAU,OAEZhhB,EAAAA,WAAAA,OAAAA,MAAAA,uBAA+C,cAAe,CAC5DklB,SAAU0O,EACVzO,gBAAiByO,EACjBxO,gBAAiBwO,EACjBvO,YAAauO,EACbtO,gBAAiBsO,EACjBpO,YAAaoO,EACbrO,QAASqO,EACTlO,oBAAqBkO,EACrBC,OAAQ,CAAC,GAEb,EFNEC,kBAAiBv4B,GAAwC,IAAvC,gBAAEE,EAAe,iBAAEC,GAAkBH,EAWrD,MAAO,CAAC,CAAE6L,KAAM,WAAY6I,UAVc7K,GAEtCkL,EAAAA,cAACxE,GAAyByE,GAAA,CACxB9U,gBAAiBA,EACjBC,iBAAkBA,GACd0J,KAMZ,EACA2uB,kBAAiB,EACjBC,yBAAwB,EAExBC,iBAAgBzkB,GAAsB,IAArB,gBAAE/T,GAAiB+T,EAClC,MAAO,CACL,CACEpI,KAAM,QACNlP,QAAS,CACP2tB,UAASA,IAIjB","sources":["webpack://ohif-extension-cornerstone-dicom-sr/webpack/universalModuleDefinition","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/chunk loaded","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/jsonp chunk loading","webpack://ohif-extension-cornerstone-dicom-sr/./tools/modules/dicomSRModule.js","webpack://ohif-extension-cornerstone-dicom-sr/./utils/hydrateStructuredReport.js","webpack://ohif-extension-cornerstone-dicom-sr/./utils/getLabelFromDCMJSImportedToolData.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/html-parse-stringify/dist/html-parse-stringify.module.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/utils.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/unescape.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/defaults.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/TransWithoutContext.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/i18nInstance.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/context.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/useTranslation.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react-i18next/dist/es/index.js","webpack://ohif-extension-cornerstone-dicom-sr/./viewports/OHIFCornerstoneSRViewport.tsx","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/object-assign/index.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/prop-types/factoryWithThrowingShims.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/prop-types/index.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react/cjs/react.production.min.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/react/index.js","webpack://ohif-extension-cornerstone-dicom-sr/../../../node_modules/void-elements/index.js","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"@cornerstonejs/adapters\"","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"@cornerstonejs/core\"","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"@cornerstonejs/tools\"","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"@ohif/core\"","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"@ohif/ui\"","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"dcmjs\"","webpack://ohif-extension-cornerstone-dicom-sr/external umd \"gl-matrix\"","webpack://ohif-extension-cornerstone-dicom-sr/webpack/bootstrap","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/chunk prefetch function","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/compat get default export","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/define property getters","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/hasOwnProperty shorthand","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/make namespace object","webpack://ohif-extension-cornerstone-dicom-sr/webpack/runtime/startup prefetch","webpack://ohif-extension-cornerstone-dicom-sr/./id.js","webpack://ohif-extension-cornerstone-dicom-sr/./constants/scoordTypes.js","webpack://ohif-extension-cornerstone-dicom-sr/./tools/DICOMSRDisplayTool.ts","webpack://ohif-extension-cornerstone-dicom-sr/./tools/toolNames.ts","webpack://ohif-extension-cornerstone-dicom-sr/./utils/addMeasurement.ts","webpack://ohif-extension-cornerstone-dicom-sr/./utils/isRehydratable.js","webpack://ohif-extension-cornerstone-dicom-sr/./getSopClassHandlerModule.ts","webpack://ohif-extension-cornerstone-dicom-sr/./getHangingProtocolModule.ts","webpack://ohif-extension-cornerstone-dicom-sr/./utils/getFilteredCornerstoneToolState.ts","webpack://ohif-extension-cornerstone-dicom-sr/./commandsModule.js","webpack://ohif-extension-cornerstone-dicom-sr/./utils/addToolInstance.ts","webpack://ohif-extension-cornerstone-dicom-sr/./utils/createReferencedImageDisplaySet.ts","webpack://ohif-extension-cornerstone-dicom-sr/./index.tsx","webpack://ohif-extension-cornerstone-dicom-sr/./onModeEnter.js","webpack://ohif-extension-cornerstone-dicom-sr/./init.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@ohif/core\"), require(\"gl-matrix\"), require(\"@cornerstonejs/tools\"), require(\"@cornerstonejs/core\"), require(\"@cornerstonejs/adapters\"), require(\"dcmjs\"), require(\"@ohif/ui\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@ohif/core\", \"gl-matrix\", \"@cornerstonejs/tools\", \"@cornerstonejs/core\", \"@cornerstonejs/adapters\", \"dcmjs\", \"@ohif/ui\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ohif-extension-cornerstone-dicom-sr\"] = factory(require(\"@ohif/core\"), require(\"gl-matrix\"), require(\"@cornerstonejs/tools\"), require(\"@cornerstonejs/core\"), require(\"@cornerstonejs/adapters\"), require(\"dcmjs\"), require(\"@ohif/ui\"));\n\telse\n\t\troot[\"ohif-extension-cornerstone-dicom-sr\"] = factory(root[\"@ohif/core\"], root[\"gl-matrix\"], root[\"@cornerstonejs/tools\"], root[\"@cornerstonejs/core\"], root[\"@cornerstonejs/adapters\"], root[\"dcmjs\"], root[\"@ohif/ui\"]);\n})(globalThis, (__WEBPACK_EXTERNAL_MODULE__762__, __WEBPACK_EXTERNAL_MODULE__845__, __WEBPACK_EXTERNAL_MODULE__867__, __WEBPACK_EXTERNAL_MODULE__464__, __WEBPACK_EXTERNAL_MODULE__32__, __WEBPACK_EXTERNAL_MODULE__836__, __WEBPACK_EXTERNAL_MODULE__369__) => {\nreturn ","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n__webpack_require__.F.j = (chunkId) => {\n\tif((!__webpack_require__.o(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && true) {\n\t\tinstalledChunks[chunkId] = null;\n\t\tvar link = document.createElement('link');\n\n\t\tif (__webpack_require__.nc) {\n\t\t\tlink.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tlink.rel = \"prefetch\";\n\t\tlink.as = \"script\";\n\t\tlink.href = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\tdocument.head.appendChild(link);\n\t}\n};\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// no jsonp function","import { getEnabledElement } from '@cornerstonejs/core';\n\nconst state = {\n TrackingUniqueIdentifier: null,\n trackingIdentifiersByViewportId: {},\n};\n\n/**\n * This file is being used to store the per-viewport state of the SR tools,\n * Since, all the toolStates are added to the cornerstoneTools, when displaying the SRTools,\n * if there are two viewports rendering the same imageId, we don't want to show\n * the same SR annotation twice on irrelevant viewport, hence, we are storing the state\n * of the SR tools in state here, so that we can filter them later.\n */\n\nfunction setTrackingUniqueIdentifiersForElement(\n element,\n trackingUniqueIdentifiers,\n activeIndex = 0\n) {\n const enabledElement = getEnabledElement(element);\n const { viewport } = enabledElement;\n\n state.trackingIdentifiersByViewportId[viewport.id] = {\n trackingUniqueIdentifiers,\n activeIndex,\n };\n}\n\nfunction setActiveTrackingUniqueIdentifierForElement(\n element,\n TrackingUniqueIdentifier\n) {\n const enabledElement = getEnabledElement(element);\n const { viewport } = enabledElement;\n\n const trackingIdentifiersForElement =\n state.trackingIdentifiersByViewportId[viewport.id];\n\n if (trackingIdentifiersForElement) {\n const activeIndex = trackingIdentifiersForElement.trackingUniqueIdentifiers.findIndex(\n tuid => tuid === TrackingUniqueIdentifier\n );\n\n trackingIdentifiersForElement.activeIndex = activeIndex;\n }\n}\n\nfunction getTrackingUniqueIdentifiersForElement(element) {\n const enabledElement = getEnabledElement(element);\n const { viewport } = enabledElement;\n\n if (state.trackingIdentifiersByViewportId[viewport.id]) {\n return state.trackingIdentifiersByViewportId[viewport.id];\n }\n\n return { trackingUniqueIdentifiers: [] };\n}\n\nexport {\n setTrackingUniqueIdentifiersForElement,\n setActiveTrackingUniqueIdentifierForElement,\n getTrackingUniqueIdentifiersForElement,\n};\n","import { utilities, metaData } from '@cornerstonejs/core';\nimport OHIF, { DicomMetadataStore } from '@ohif/core';\nimport getLabelFromDCMJSImportedToolData from './getLabelFromDCMJSImportedToolData';\nimport { adaptersSR } from '@cornerstonejs/adapters';\n\nconst { guid } = OHIF.utils;\nconst { MeasurementReport, CORNERSTONE_3D_TAG } = adaptersSR.Cornerstone3D;\n\nconst CORNERSTONE_3D_TOOLS_SOURCE_NAME = 'Cornerstone3DTools';\nconst CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';\n\nconst supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];\n\nconst convertCode = (codingValues, code) => {\n if (!code || code.CodingSchemeDesignator === 'CORNERSTONEJS') return;\n const ref = `${code.CodingSchemeDesignator}:${code.CodeValue}`;\n const ret = { ...codingValues[ref], ref, ...code, text: code.CodeMeaning };\n return ret;\n};\n\nconst convertSites = (codingValues, sites) => {\n if (!sites || !sites.length) return;\n const ret = [];\n // Do as a loop to convert away from Proxy instances\n for (let i = 0; i < sites.length; i++) {\n // Deal with irregular conversion from dcmjs\n const site = convertCode(codingValues, sites[i][0] || sites[i]);\n if (site) ret.push(site);\n }\n return (ret.length && ret) || undefined;\n};\n\n/**\n * Hydrates a structured report, for default viewports.\n *\n */\nexport default function hydrateStructuredReport(\n { servicesManager, extensionManager },\n displaySetInstanceUID\n) {\n const dataSource = extensionManager.getActiveDataSource()[0];\n const {\n measurementService,\n displaySetService,\n customizationService,\n } = servicesManager.services;\n\n const codingValues = customizationService.getCustomization(\n 'codingValues',\n {}\n );\n const displaySet = displaySetService.getDisplaySetByUID(\n displaySetInstanceUID\n );\n\n // TODO -> We should define a strict versioning somewhere.\n const mappings = measurementService.getSourceMappings(\n CORNERSTONE_3D_TOOLS_SOURCE_NAME,\n CORNERSTONE_3D_TOOLS_SOURCE_VERSION\n );\n\n if (!mappings || !mappings.length) {\n throw new Error(\n `Attempting to hydrate measurements service when no mappings present. This shouldn't be reached.`\n );\n }\n\n const instance = DicomMetadataStore.getInstance(\n displaySet.StudyInstanceUID,\n displaySet.SeriesInstanceUID,\n displaySet.SOPInstanceUID\n );\n\n const sopInstanceUIDToImageId = {};\n const imageIdsForToolState = {};\n\n displaySet.measurements.forEach(measurement => {\n const { ReferencedSOPInstanceUID, imageId, frameNumber } = measurement;\n\n if (!sopInstanceUIDToImageId[ReferencedSOPInstanceUID]) {\n sopInstanceUIDToImageId[ReferencedSOPInstanceUID] = imageId;\n imageIdsForToolState[ReferencedSOPInstanceUID] = [];\n }\n if (!imageIdsForToolState[ReferencedSOPInstanceUID][frameNumber]) {\n imageIdsForToolState[ReferencedSOPInstanceUID][frameNumber] = imageId;\n }\n });\n\n const datasetToUse = _mapLegacyDataSet(instance);\n\n // Use dcmjs to generate toolState.\n const storedMeasurementByAnnotationType = MeasurementReport.generateToolState(\n datasetToUse,\n // NOTE: we need to pass in the imageIds to dcmjs since the we use them\n // for the imageToWorld transformation. The following assumes that the order\n // that measurements were added to the display set are the same order as\n // the measurementGroups in the instance.\n sopInstanceUIDToImageId,\n utilities.imageToWorldCoords,\n metaData\n );\n\n // Filter what is found by DICOM SR to measurements we support.\n const mappingDefinitions = mappings.map(m => m.annotationType);\n const hydratableMeasurementsInSR = {};\n\n Object.keys(storedMeasurementByAnnotationType).forEach(key => {\n if (mappingDefinitions.includes(key)) {\n hydratableMeasurementsInSR[key] = storedMeasurementByAnnotationType[key];\n }\n });\n\n // Set the series touched as tracked.\n const imageIds = [];\n\n // TODO: notification if no hydratable?\n Object.keys(hydratableMeasurementsInSR).forEach(annotationType => {\n const toolDataForAnnotationType =\n hydratableMeasurementsInSR[annotationType];\n\n toolDataForAnnotationType.forEach(toolData => {\n // Add the measurement to toolState\n // dcmjs and Cornerstone3D has structural defect in supporting multi-frame\n // files, and looking up the imageId from sopInstanceUIDToImageId results\n // in the wrong value.\n const frameNumber =\n (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1;\n const imageId =\n imageIdsForToolState[toolData.sopInstanceUid][frameNumber] ||\n sopInstanceUIDToImageId[toolData.sopInstanceUid];\n\n if (!imageIds.includes(imageId)) {\n imageIds.push(imageId);\n }\n });\n });\n\n let targetStudyInstanceUID;\n const SeriesInstanceUIDs = [];\n\n for (let i = 0; i < imageIds.length; i++) {\n const imageId = imageIds[i];\n const { SeriesInstanceUID, StudyInstanceUID } = metaData.get(\n 'instance',\n imageId\n );\n\n if (!SeriesInstanceUIDs.includes(SeriesInstanceUID)) {\n SeriesInstanceUIDs.push(SeriesInstanceUID);\n }\n\n if (!targetStudyInstanceUID) {\n targetStudyInstanceUID = StudyInstanceUID;\n } else if (targetStudyInstanceUID !== StudyInstanceUID) {\n console.warn(\n 'NO SUPPORT FOR SRs THAT HAVE MEASUREMENTS FROM MULTIPLE STUDIES.'\n );\n }\n }\n\n Object.keys(hydratableMeasurementsInSR).forEach(annotationType => {\n const toolDataForAnnotationType =\n hydratableMeasurementsInSR[annotationType];\n\n toolDataForAnnotationType.forEach(toolData => {\n // Add the measurement to toolState\n // dcmjs and Cornerstone3D has structural defect in supporting multi-frame\n // files, and looking up the imageId from sopInstanceUIDToImageId results\n // in the wrong value.\n const frameNumber =\n (toolData.annotation.data && toolData.annotation.data.frameNumber) || 1;\n const imageId =\n imageIdsForToolState[toolData.sopInstanceUid][frameNumber] ||\n sopInstanceUIDToImageId[toolData.sopInstanceUid];\n\n toolData.uid = guid();\n\n const instance = metaData.get('instance', imageId);\n const {\n FrameOfReferenceUID,\n // SOPInstanceUID,\n // SeriesInstanceUID,\n // StudyInstanceUID,\n } = instance;\n\n const annotation = {\n annotationUID: toolData.annotation.annotationUID,\n data: toolData.annotation.data,\n metadata: {\n toolName: annotationType,\n referencedImageId: imageId,\n FrameOfReferenceUID,\n },\n };\n\n const source = measurementService.getSource(\n CORNERSTONE_3D_TOOLS_SOURCE_NAME,\n CORNERSTONE_3D_TOOLS_SOURCE_VERSION\n );\n annotation.data.label = getLabelFromDCMJSImportedToolData(toolData);\n annotation.data.finding = convertCode(\n codingValues,\n toolData.finding?.[0]\n );\n annotation.data.findingSites = convertSites(\n codingValues,\n toolData.findingSites\n );\n annotation.data.site = annotation.data.findingSites?.[0];\n\n const matchingMapping = mappings.find(\n m => m.annotationType === annotationType\n );\n\n measurementService.addRawMeasurement(\n source,\n annotationType,\n { annotation },\n matchingMapping.toMeasurementSchema,\n dataSource\n );\n\n if (!imageIds.includes(imageId)) {\n imageIds.push(imageId);\n }\n });\n });\n\n displaySet.isHydrated = true;\n\n return {\n StudyInstanceUID: targetStudyInstanceUID,\n SeriesInstanceUIDs,\n };\n}\n\nfunction _mapLegacyDataSet(dataset) {\n const REPORT = 'Imaging Measurements';\n const GROUP = 'Measurement Group';\n const TRACKING_IDENTIFIER = 'Tracking Identifier';\n\n // Identify the Imaging Measurements\n const imagingMeasurementContent = toArray(dataset.ContentSequence).find(\n codeMeaningEquals(REPORT)\n );\n\n // Retrieve the Measurements themselves\n const measurementGroups = toArray(\n imagingMeasurementContent.ContentSequence\n ).filter(codeMeaningEquals(GROUP));\n\n // For each of the supported measurement types, compute the measurement data\n const measurementData = {};\n\n const cornerstoneToolClasses =\n MeasurementReport.CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\n\n const registeredToolClasses = [];\n\n Object.keys(cornerstoneToolClasses).forEach(key => {\n registeredToolClasses.push(cornerstoneToolClasses[key]);\n measurementData[key] = [];\n });\n\n measurementGroups.forEach((measurementGroup, index) => {\n const measurementGroupContentSequence = toArray(\n measurementGroup.ContentSequence\n );\n\n const TrackingIdentifierGroup = measurementGroupContentSequence.find(\n contentItem =>\n contentItem.ConceptNameCodeSequence.CodeMeaning === TRACKING_IDENTIFIER\n );\n\n const TrackingIdentifier = TrackingIdentifierGroup.TextValue;\n\n let [cornerstoneTag, toolName] = TrackingIdentifier.split(':');\n if (supportedLegacyCornerstoneTags.includes(cornerstoneTag)) {\n cornerstoneTag = CORNERSTONE_3D_TAG;\n }\n\n const mappedTrackingIdentifier = `${cornerstoneTag}:${toolName}`;\n\n TrackingIdentifierGroup.TextValue = mappedTrackingIdentifier;\n });\n\n return dataset;\n}\n\nconst toArray = function (x) {\n return Array.isArray(x) ? x : [x];\n};\n\nconst codeMeaningEquals = codeMeaningName => {\n return contentItem => {\n return contentItem.ConceptNameCodeSequence.CodeMeaning === codeMeaningName;\n };\n};\n","/**\n * Extracts the label from the toolData imported from dcmjs. We need to do this\n * as dcmjs does not depeend on OHIF/the measurementService, it just produces data for cornestoneTools.\n * This optional data is available for the consumer to process if they wish to.\n * @param {object} toolData The tooldata relating to the\n *\n * @returns {string} The extracted label.\n */\nexport default function getLabelFromDCMJSImportedToolData(toolData) {\n const { findingSites = [], finding } = toolData;\n\n let freeTextLabel = findingSites.find(\n fs => fs.CodeValue === 'CORNERSTONEFREETEXT'\n );\n\n if (freeTextLabel) {\n return freeTextLabel.CodeMeaning;\n }\n\n if (finding && finding.CodeValue === 'CORNERSTONEFREETEXT') {\n return finding.CodeMeaning;\n }\n}\n","import e from\"void-elements\";var t=/\\s([^'\"/\\s><]+?)[\\s/>]|([^\\s=]+)=\\s?(\".*?\"|'.*?')/g;function n(n){var r={type:\"tag\",name:\"\",voidElement:!1,attrs:{},children:[]},i=n.match(/<\\/?([^\\s]+?)[/\\s>]/);if(i&&(r.name=i[1],(e[i[1]]||\"/\"===n.charAt(n.length-2))&&(r.voidElement=!0),r.name.startsWith(\"!--\"))){var s=n.indexOf(\"--\\x3e\");return{type:\"comment\",comment:-1!==s?n.slice(4,s):\"\"}}for(var a=new RegExp(t),c=null;null!==(c=a.exec(n));)if(c[0].trim())if(c[1]){var o=c[1].trim(),l=[o,\"\"];o.indexOf(\"=\")>-1&&(l=o.split(\"=\")),r.attrs[l[0]]=l[1],a.lastIndex--}else c[2]&&(r.attrs[c[2]]=c[3].trim().substring(1,c[3].length-1));return r}var r=/<[a-zA-Z0-9\\-\\!\\/](?:\"[^\"]*\"|'[^']*'|[^'\">])*>/g,i=/^\\s*$/,s=Object.create(null);function a(e,t){switch(t.type){case\"text\":return e+t.content;case\"tag\":return e+=\"<\"+t.name+(t.attrs?function(e){var t=[];for(var n in e)t.push(n+'=\"'+e[n]+'\"');return t.length?\" \"+t.join(\" \"):\"\"}(t.attrs):\"\")+(t.voidElement?\"/>\":\">\"),t.voidElement?e:e+t.children.reduce(a,\"\")+\"</\"+t.name+\">\";case\"comment\":return e+\"\\x3c!--\"+t.comment+\"--\\x3e\"}}var c={parse:function(e,t){t||(t={}),t.components||(t.components=s);var a,c=[],o=[],l=-1,m=!1;if(0!==e.indexOf(\"<\")){var u=e.indexOf(\"<\");c.push({type:\"text\",content:-1===u?e:e.substring(0,u)})}return e.replace(r,function(r,s){if(m){if(r!==\"</\"+a.name+\">\")return;m=!1}var u,f=\"/\"!==r.charAt(1),h=r.startsWith(\"\\x3c!--\"),p=s+r.length,d=e.charAt(p);if(h){var v=n(r);return l<0?(c.push(v),c):((u=o[l]).children.push(v),c)}if(f&&(l++,\"tag\"===(a=n(r)).type&&t.components[a.name]&&(a.type=\"component\",m=!0),a.voidElement||m||!d||\"<\"===d||a.children.push({type:\"text\",content:e.slice(p,e.indexOf(\"<\",p))}),0===l&&c.push(a),(u=o[l-1])&&u.children.push(a),o[l]=a),(!f||a.voidElement)&&(l>-1&&(a.voidElement||a.name===r.slice(2,-1))&&(l--,a=-1===l?c:o[l]),!m&&\"<\"!==d&&d)){u=-1===l?c:o[l].children;var x=e.indexOf(\"<\",p),g=e.slice(p,-1===x?void 0:x);i.test(g)&&(g=\" \"),(x>-1&&l+u.length>=0||\" \"!==g)&&u.push({type:\"text\",content:g})}}),c},stringify:function(e){return e.reduce(function(e,t){return e+a(\"\",t)},\"\")}};export default c;\n//# sourceMappingURL=html-parse-stringify.module.js.map\n","export function warn() {\n if (console && console.warn) {\n var _console;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (typeof args[0] === 'string') args[0] = \"react-i18next:: \".concat(args[0]);\n\n (_console = console).warn.apply(_console, args);\n }\n}\nvar alreadyWarned = {};\nexport function warnOnce() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n if (typeof args[0] === 'string' && alreadyWarned[args[0]]) return;\n if (typeof args[0] === 'string') alreadyWarned[args[0]] = new Date();\n warn.apply(void 0, args);\n}\nexport function loadNamespaces(i18n, ns, cb) {\n i18n.loadNamespaces(ns, function () {\n if (i18n.isInitialized) {\n cb();\n } else {\n var initialized = function initialized() {\n setTimeout(function () {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n\n i18n.on('initialized', initialized);\n }\n });\n}\n\nfunction oldI18nextHasLoadedNamespace(ns, i18n) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var lng = i18n.languages[0];\n var fallbackLng = i18n.options ? i18n.options.fallbackLng : false;\n var lastLng = i18n.languages[i18n.languages.length - 1];\n if (lng.toLowerCase() === 'cimode') return true;\n\n var loadNotPending = function loadNotPending(l, n) {\n var loadState = i18n.services.backendConnector.state[\"\".concat(l, \"|\").concat(n)];\n return loadState === -1 || loadState === 2;\n };\n\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18n.services.backendConnector.backend && i18n.isLanguageChangingTo && !loadNotPending(i18n.isLanguageChangingTo, ns)) return false;\n if (i18n.hasResourceBundle(lng, ns)) return true;\n if (!i18n.services.backendConnector.backend || i18n.options.resources && !i18n.options.partialBundledLanguages) return true;\n if (loadNotPending(lng, ns) && (!fallbackLng || loadNotPending(lastLng, ns))) return true;\n return false;\n}\n\nexport function hasLoadedNamespace(ns, i18n) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce('i18n.languages were undefined or empty', i18n.languages);\n return true;\n }\n\n var isNewerI18next = i18n.options.ignoreJSONStructure !== undefined;\n\n if (!isNewerI18next) {\n return oldI18nextHasLoadedNamespace(ns, i18n, options);\n }\n\n return i18n.hasLoadedNamespace(ns, {\n precheck: function precheck(i18nInstance, loadNotPending) {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n}\nexport function getDisplayName(Component) {\n return Component.displayName || Component.name || (typeof Component === 'string' && Component.length > 0 ? Component : 'Unknown');\n}","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, _typeof(obj);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n var key = toPrimitive(arg, \"string\");\n return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n if (_typeof(input) !== \"object\" || input === null) return input;\n var prim = input[Symbol.toPrimitive];\n if (prim !== undefined) {\n var res = prim.call(input, hint || \"default\");\n if (_typeof(res) !== \"object\") return res;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (hint === \"string\" ? String : Number)(input);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","var matchHtmlEntity = /&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g;\nvar htmlEntities = {\n '&amp;': '&',\n '&#38;': '&',\n '&lt;': '<',\n '&#60;': '<',\n '&gt;': '>',\n '&#62;': '>',\n '&apos;': \"'\",\n '&#39;': \"'\",\n '&quot;': '\"',\n '&#34;': '\"',\n '&nbsp;': ' ',\n '&#160;': ' ',\n '&copy;': '©',\n '&#169;': '©',\n '&reg;': '®',\n '&#174;': '®',\n '&hellip;': '…',\n '&#8230;': '…',\n '&#x2F;': '/',\n '&#47;': '/'\n};\n\nvar unescapeHtmlEntity = function unescapeHtmlEntity(m) {\n return htmlEntities[m];\n};\n\nexport var unescape = function unescape(text) {\n return text.replace(matchHtmlEntity, unescapeHtmlEntity);\n};","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nimport { unescape } from './unescape.js';\nvar defaultOptions = {\n bindI18n: 'languageChanged',\n bindI18nStore: '',\n transEmptyNodeValue: '',\n transSupportBasicHtmlNodes: true,\n transWrapTextNodes: '',\n transKeepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'],\n useSuspense: true,\n unescape: unescape\n};\nexport function setDefaults() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n defaultOptions = _objectSpread(_objectSpread({}, defaultOptions), options);\n}\nexport function getDefaults() {\n return defaultOptions;\n}","import _objectWithoutProperties from \"@babel/runtime/helpers/objectWithoutProperties\";\nimport _typeof from \"@babel/runtime/helpers/typeof\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nvar _excluded = [\"format\"],\n _excluded2 = [\"children\", \"count\", \"parent\", \"i18nKey\", \"context\", \"tOptions\", \"values\", \"defaults\", \"components\", \"ns\", \"i18n\", \"t\", \"shouldUnescape\"];\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nimport { isValidElement, cloneElement, createElement } from 'react';\nimport HTML from 'html-parse-stringify';\nimport { warn, warnOnce } from './utils.js';\nimport { getDefaults } from './defaults.js';\nimport { getI18n } from './i18nInstance.js';\n\nfunction hasChildren(node, checkLength) {\n if (!node) return false;\n var base = node.props ? node.props.children : node.children;\n if (checkLength) return base.length > 0;\n return !!base;\n}\n\nfunction getChildren(node) {\n if (!node) return [];\n return node.props ? node.props.children : node.children;\n}\n\nfunction hasValidReactChildren(children) {\n if (Object.prototype.toString.call(children) !== '[object Array]') return false;\n return children.every(function (child) {\n return isValidElement(child);\n });\n}\n\nfunction getAsArray(data) {\n return Array.isArray(data) ? data : [data];\n}\n\nfunction mergeProps(source, target) {\n var newTarget = _objectSpread({}, target);\n\n newTarget.props = Object.assign(source.props, target.props);\n return newTarget;\n}\n\nexport function nodesToString(children, i18nOptions) {\n if (!children) return '';\n var stringNode = '';\n var childrenArray = getAsArray(children);\n var keepArray = i18nOptions.transSupportBasicHtmlNodes && i18nOptions.transKeepBasicHtmlNodesFor ? i18nOptions.transKeepBasicHtmlNodesFor : [];\n childrenArray.forEach(function (child, childIndex) {\n if (typeof child === 'string') {\n stringNode += \"\".concat(child);\n } else if (isValidElement(child)) {\n var childPropsCount = Object.keys(child.props).length;\n var shouldKeepChild = keepArray.indexOf(child.type) > -1;\n var childChildren = child.props.children;\n\n if (!childChildren && shouldKeepChild && childPropsCount === 0) {\n stringNode += \"<\".concat(child.type, \"/>\");\n } else if (!childChildren && (!shouldKeepChild || childPropsCount !== 0)) {\n stringNode += \"<\".concat(childIndex, \"></\").concat(childIndex, \">\");\n } else if (child.props.i18nIsDynamicList) {\n stringNode += \"<\".concat(childIndex, \"></\").concat(childIndex, \">\");\n } else if (shouldKeepChild && childPropsCount === 1 && typeof childChildren === 'string') {\n stringNode += \"<\".concat(child.type, \">\").concat(childChildren, \"</\").concat(child.type, \">\");\n } else {\n var content = nodesToString(childChildren, i18nOptions);\n stringNode += \"<\".concat(childIndex, \">\").concat(content, \"</\").concat(childIndex, \">\");\n }\n } else if (child === null) {\n warn(\"Trans: the passed in value is invalid - seems you passed in a null child.\");\n } else if (_typeof(child) === 'object') {\n var format = child.format,\n clone = _objectWithoutProperties(child, _excluded);\n\n var keys = Object.keys(clone);\n\n if (keys.length === 1) {\n var value = format ? \"\".concat(keys[0], \", \").concat(format) : keys[0];\n stringNode += \"{{\".concat(value, \"}}\");\n } else {\n warn(\"react-i18next: the passed in object contained more than one variable - the object should look like {{ value, format }} where format is optional.\", child);\n }\n } else {\n warn(\"Trans: the passed in value is invalid - seems you passed in a variable like {number} - please pass in variables for interpolation as full objects like {{number}}.\", child);\n }\n });\n return stringNode;\n}\n\nfunction renderNodes(children, targetString, i18n, i18nOptions, combinedTOpts, shouldUnescape) {\n if (targetString === '') return [];\n var keepArray = i18nOptions.transKeepBasicHtmlNodesFor || [];\n var emptyChildrenButNeedsHandling = targetString && new RegExp(keepArray.join('|')).test(targetString);\n if (!children && !emptyChildrenButNeedsHandling) return [targetString];\n var data = {};\n\n function getData(childs) {\n var childrenArray = getAsArray(childs);\n childrenArray.forEach(function (child) {\n if (typeof child === 'string') return;\n if (hasChildren(child)) getData(getChildren(child));else if (_typeof(child) === 'object' && !isValidElement(child)) Object.assign(data, child);\n });\n }\n\n getData(children);\n var ast = HTML.parse(\"<0>\".concat(targetString, \"</0>\"));\n\n var opts = _objectSpread(_objectSpread({}, data), combinedTOpts);\n\n function renderInner(child, node, rootReactNode) {\n var childs = getChildren(child);\n var mappedChildren = mapAST(childs, node.children, rootReactNode);\n return hasValidReactChildren(childs) && mappedChildren.length === 0 ? childs : mappedChildren;\n }\n\n function pushTranslatedJSX(child, inner, mem, i, isVoid) {\n if (child.dummy) child.children = inner;\n mem.push(cloneElement(child, _objectSpread(_objectSpread({}, child.props), {}, {\n key: i\n }), isVoid ? undefined : inner));\n }\n\n function mapAST(reactNode, astNode, rootReactNode) {\n var reactNodes = getAsArray(reactNode);\n var astNodes = getAsArray(astNode);\n return astNodes.reduce(function (mem, node, i) {\n var translationContent = node.children && node.children[0] && node.children[0].content && i18n.services.interpolator.interpolate(node.children[0].content, opts, i18n.language);\n\n if (node.type === 'tag') {\n var tmp = reactNodes[parseInt(node.name, 10)];\n if (!tmp && rootReactNode.length === 1 && rootReactNode[0][node.name]) tmp = rootReactNode[0][node.name];\n if (!tmp) tmp = {};\n var child = Object.keys(node.attrs).length !== 0 ? mergeProps({\n props: node.attrs\n }, tmp) : tmp;\n var isElement = isValidElement(child);\n var isValidTranslationWithChildren = isElement && hasChildren(node, true) && !node.voidElement;\n var isEmptyTransWithHTML = emptyChildrenButNeedsHandling && _typeof(child) === 'object' && child.dummy && !isElement;\n var isKnownComponent = _typeof(children) === 'object' && children !== null && Object.hasOwnProperty.call(children, node.name);\n\n if (typeof child === 'string') {\n var value = i18n.services.interpolator.interpolate(child, opts, i18n.language);\n mem.push(value);\n } else if (hasChildren(child) || isValidTranslationWithChildren) {\n var inner = renderInner(child, node, rootReactNode);\n pushTranslatedJSX(child, inner, mem, i);\n } else if (isEmptyTransWithHTML) {\n var _inner = mapAST(reactNodes, node.children, rootReactNode);\n\n mem.push(cloneElement(child, _objectSpread(_objectSpread({}, child.props), {}, {\n key: i\n }), _inner));\n } else if (Number.isNaN(parseFloat(node.name))) {\n if (isKnownComponent) {\n var _inner2 = renderInner(child, node, rootReactNode);\n\n pushTranslatedJSX(child, _inner2, mem, i, node.voidElement);\n } else if (i18nOptions.transSupportBasicHtmlNodes && keepArray.indexOf(node.name) > -1) {\n if (node.voidElement) {\n mem.push(createElement(node.name, {\n key: \"\".concat(node.name, \"-\").concat(i)\n }));\n } else {\n var _inner3 = mapAST(reactNodes, node.children, rootReactNode);\n\n mem.push(createElement(node.name, {\n key: \"\".concat(node.name, \"-\").concat(i)\n }, _inner3));\n }\n } else if (node.voidElement) {\n mem.push(\"<\".concat(node.name, \" />\"));\n } else {\n var _inner4 = mapAST(reactNodes, node.children, rootReactNode);\n\n mem.push(\"<\".concat(node.name, \">\").concat(_inner4, \"</\").concat(node.name, \">\"));\n }\n } else if (_typeof(child) === 'object' && !isElement) {\n var content = node.children[0] ? translationContent : null;\n if (content) mem.push(content);\n } else if (node.children.length === 1 && translationContent) {\n mem.push(cloneElement(child, _objectSpread(_objectSpread({}, child.props), {}, {\n key: i\n }), translationContent));\n } else {\n mem.push(cloneElement(child, _objectSpread(_objectSpread({}, child.props), {}, {\n key: i\n })));\n }\n } else if (node.type === 'text') {\n var wrapTextNodes = i18nOptions.transWrapTextNodes;\n\n var _content = shouldUnescape ? i18nOptions.unescape(i18n.services.interpolator.interpolate(node.content, opts, i18n.language)) : i18n.services.interpolator.interpolate(node.content, opts, i18n.language);\n\n if (wrapTextNodes) {\n mem.push(createElement(wrapTextNodes, {\n key: \"\".concat(node.name, \"-\").concat(i)\n }, _content));\n } else {\n mem.push(_content);\n }\n }\n\n return mem;\n }, []);\n }\n\n var result = mapAST([{\n dummy: true,\n children: children || []\n }], ast, getAsArray(children || []));\n return getChildren(result[0]);\n}\n\nexport function Trans(_ref) {\n var children = _ref.children,\n count = _ref.count,\n parent = _ref.parent,\n i18nKey = _ref.i18nKey,\n context = _ref.context,\n _ref$tOptions = _ref.tOptions,\n tOptions = _ref$tOptions === void 0 ? {} : _ref$tOptions,\n values = _ref.values,\n defaults = _ref.defaults,\n components = _ref.components,\n ns = _ref.ns,\n i18nFromProps = _ref.i18n,\n tFromProps = _ref.t,\n shouldUnescape = _ref.shouldUnescape,\n additionalProps = _objectWithoutProperties(_ref, _excluded2);\n\n var i18n = i18nFromProps || getI18n();\n\n if (!i18n) {\n warnOnce('You will need to pass in an i18next instance by using i18nextReactModule');\n return children;\n }\n\n var t = tFromProps || i18n.t.bind(i18n) || function (k) {\n return k;\n };\n\n if (context) tOptions.context = context;\n\n var reactI18nextOptions = _objectSpread(_objectSpread({}, getDefaults()), i18n.options && i18n.options.react);\n\n var namespaces = ns || t.ns || i18n.options && i18n.options.defaultNS;\n namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation'];\n var defaultValue = defaults || nodesToString(children, reactI18nextOptions) || reactI18nextOptions.transEmptyNodeValue || i18nKey;\n var hashTransKey = reactI18nextOptions.hashTransKey;\n var key = i18nKey || (hashTransKey ? hashTransKey(defaultValue) : defaultValue);\n var interpolationOverride = values ? tOptions.interpolation : {\n interpolation: _objectSpread(_objectSpread({}, tOptions.interpolation), {}, {\n prefix: '#$?',\n suffix: '?$#'\n })\n };\n\n var combinedTOpts = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, tOptions), {}, {\n count: count\n }, values), interpolationOverride), {}, {\n defaultValue: defaultValue,\n ns: namespaces\n });\n\n var translation = key ? t(key, combinedTOpts) : defaultValue;\n var content = renderNodes(components || children, translation, i18n, reactI18nextOptions, combinedTOpts, shouldUnescape);\n var useAsParent = parent !== undefined ? parent : reactI18nextOptions.defaultTransParent;\n return useAsParent ? createElement(useAsParent, additionalProps, content) : content;\n}","var i18nInstance;\nexport function setI18n(instance) {\n i18nInstance = instance;\n}\nexport function getI18n() {\n return i18nInstance;\n}","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n Object.defineProperty(Constructor, \"prototype\", {\n writable: false\n });\n return Constructor;\n}","import _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nimport { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport var I18nContext = createContext();\nexport var ReportNamespaces = function () {\n function ReportNamespaces() {\n _classCallCheck(this, ReportNamespaces);\n\n this.usedNamespaces = {};\n }\n\n _createClass(ReportNamespaces, [{\n key: \"addUsedNamespaces\",\n value: function addUsedNamespaces(namespaces) {\n var _this = this;\n\n namespaces.forEach(function (ns) {\n if (!_this.usedNamespaces[ns]) _this.usedNamespaces[ns] = true;\n });\n }\n }, {\n key: \"getUsedNamespaces\",\n value: function getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n }]);\n\n return ReportNamespaces;\n}();\nexport function composeInitialProps(ForComponent) {\n return function (ctx) {\n return new Promise(function (resolve) {\n var i18nInitialProps = getInitialProps();\n\n if (ForComponent.getInitialProps) {\n ForComponent.getInitialProps(ctx).then(function (componentsInitialProps) {\n resolve(_objectSpread(_objectSpread({}, componentsInitialProps), i18nInitialProps));\n });\n } else {\n resolve(i18nInitialProps);\n }\n });\n };\n}\nexport function getInitialProps() {\n var i18n = getI18n();\n var namespaces = i18n.reportNamespaces ? i18n.reportNamespaces.getUsedNamespaces() : [];\n var ret = {};\n var initialI18nStore = {};\n i18n.languages.forEach(function (l) {\n initialI18nStore[l] = {};\n namespaces.forEach(function (ns) {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _typeof from \"@babel/runtime/helpers/typeof\";\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nimport { useState, useEffect, useContext, useRef } from 'react';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, hasLoadedNamespace } from './utils.js';\n\nvar usePrevious = function usePrevious(value, ignore) {\n var ref = useRef();\n useEffect(function () {\n ref.current = ignore ? ref.current : value;\n }, [value, ignore]);\n return ref.current;\n};\n\nexport function useTranslation(ns) {\n var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var i18nFromProps = props.i18n;\n\n var _ref = useContext(I18nContext) || {},\n i18nFromContext = _ref.i18n,\n defaultNSFromContext = _ref.defaultNS;\n\n var i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n\n if (!i18n) {\n warnOnce('You will need to pass in an i18next instance by using initReactI18next');\n\n var notReadyT = function notReadyT(k, optsOrDefaultValue) {\n if (typeof optsOrDefaultValue === 'string') return optsOrDefaultValue;\n if (optsOrDefaultValue && _typeof(optsOrDefaultValue) === 'object' && typeof optsOrDefaultValue.defaultValue === 'string') return optsOrDefaultValue.defaultValue;\n return Array.isArray(k) ? k[k.length - 1] : k;\n };\n\n var retNotReady = [notReadyT, {}, false];\n retNotReady.t = notReadyT;\n retNotReady.i18n = {};\n retNotReady.ready = false;\n return retNotReady;\n }\n\n if (i18n.options.react && i18n.options.react.wait !== undefined) warnOnce('It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.');\n\n var i18nOptions = _objectSpread(_objectSpread(_objectSpread({}, getDefaults()), i18n.options.react), props);\n\n var useSuspense = i18nOptions.useSuspense,\n keyPrefix = i18nOptions.keyPrefix;\n var namespaces = ns || defaultNSFromContext || i18n.options && i18n.options.defaultNS;\n namespaces = typeof namespaces === 'string' ? [namespaces] : namespaces || ['translation'];\n if (i18n.reportNamespaces.addUsedNamespaces) i18n.reportNamespaces.addUsedNamespaces(namespaces);\n var ready = (i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(function (n) {\n return hasLoadedNamespace(n, i18n, i18nOptions);\n });\n\n function getT() {\n return i18n.getFixedT(null, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n }\n\n var _useState = useState(getT),\n _useState2 = _slicedToArray(_useState, 2),\n t = _useState2[0],\n setT = _useState2[1];\n\n var joinedNS = namespaces.join();\n var previousJoinedNS = usePrevious(joinedNS);\n var isMounted = useRef(true);\n useEffect(function () {\n var bindI18n = i18nOptions.bindI18n,\n bindI18nStore = i18nOptions.bindI18nStore;\n isMounted.current = true;\n\n if (!ready && !useSuspense) {\n loadNamespaces(i18n, namespaces, function () {\n if (isMounted.current) setT(getT);\n });\n }\n\n if (ready && previousJoinedNS && previousJoinedNS !== joinedNS && isMounted.current) {\n setT(getT);\n }\n\n function boundReset() {\n if (isMounted.current) setT(getT);\n }\n\n if (bindI18n && i18n) i18n.on(bindI18n, boundReset);\n if (bindI18nStore && i18n) i18n.store.on(bindI18nStore, boundReset);\n return function () {\n isMounted.current = false;\n if (bindI18n && i18n) bindI18n.split(' ').forEach(function (e) {\n return i18n.off(e, boundReset);\n });\n if (bindI18nStore && i18n) bindI18nStore.split(' ').forEach(function (e) {\n return i18n.store.off(e, boundReset);\n });\n };\n }, [i18n, joinedNS]);\n var isInitial = useRef(true);\n useEffect(function () {\n if (isMounted.current && !isInitial.current) {\n setT(getT);\n }\n\n isInitial.current = false;\n }, [i18n, keyPrefix]);\n var ret = [t, i18n, ready];\n ret.t = t;\n ret.i18n = i18n;\n ret.ready = ready;\n if (ready) return ret;\n if (!ready && !useSuspense) return ret;\n throw new Promise(function (resolve) {\n loadNamespaces(i18n, namespaces, function () {\n resolve();\n });\n });\n}","export { Trans } from './Trans.js';\nexport { Trans as TransWithoutContext } from './TransWithoutContext.js';\nexport { useTranslation } from './useTranslation.js';\nexport { withTranslation } from './withTranslation.js';\nexport { Translation } from './Translation.js';\nexport { I18nextProvider } from './I18nextProvider.js';\nexport { withSSR } from './withSSR.js';\nexport { useSSR } from './useSSR.js';\nexport { initReactI18next } from './initReactI18next.js';\nexport { setDefaults, getDefaults } from './defaults.js';\nexport { setI18n, getI18n } from './i18nInstance.js';\nexport { I18nContext, composeInitialProps, getInitialProps } from './context.js';\nexport var date = function date() {\n return '';\n};\nexport var time = function time() {\n return '';\n};\nexport var number = function number() {\n return '';\n};\nexport var select = function select() {\n return '';\n};\nexport var plural = function plural() {\n return '';\n};\nexport var selectOrdinal = function selectOrdinal() {\n return '';\n};","import PropTypes from 'prop-types';\nimport React, { useCallback, useContext, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport OHIF, { utils, ServicesManager, ExtensionManager } from '@ohif/core';\n\nimport { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule';\n\nimport { Icon, Tooltip, useViewportGrid, ViewportActionBar } from '@ohif/ui';\nimport hydrateStructuredReport from '../utils/hydrateStructuredReport';\n\nconst { formatDate } = utils;\n\nconst MEASUREMENT_TRACKING_EXTENSION_ID =\n '@ohif/extension-measurement-tracking';\n\nconst SR_TOOLGROUP_BASE_NAME = 'SRToolGroup';\n\nfunction OHIFCornerstoneSRViewport(props) {\n const {\n children,\n dataSource,\n displaySets,\n viewportIndex,\n viewportLabel,\n viewportOptions,\n servicesManager,\n extensionManager,\n } = props;\n\n const {\n displaySetService,\n cornerstoneViewportService,\n measurementService,\n } = servicesManager.services;\n\n // SR viewport will always have a single display set\n if (displaySets.length > 1) {\n throw new Error('SR viewport should only have a single display set');\n }\n\n const srDisplaySet = displaySets[0];\n\n const [viewportGrid, viewportGridService] = useViewportGrid();\n const [measurementSelected, setMeasurementSelected] = useState(0);\n const [measurementCount, setMeasurementCount] = useState(1);\n const [activeImageDisplaySetData, setActiveImageDisplaySetData] = useState(\n null\n );\n const [\n referencedDisplaySetMetadata,\n setReferencedDisplaySetMetadata,\n ] = useState(null);\n const [element, setElement] = useState(null);\n const { viewports, activeViewportIndex } = viewportGrid;\n\n // Optional hook into tracking extension, if present.\n let trackedMeasurements;\n let sendTrackedMeasurementsEvent;\n\n const hasMeasurementTrackingExtension = extensionManager.registeredExtensionIds.includes(\n MEASUREMENT_TRACKING_EXTENSION_ID\n );\n\n if (hasMeasurementTrackingExtension) {\n const contextModule = extensionManager.getModuleEntry(\n '@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext'\n );\n\n const tracked = useContext(contextModule.context);\n trackedMeasurements = tracked?.[0];\n sendTrackedMeasurementsEvent = tracked?.[1];\n }\n if (!sendTrackedMeasurementsEvent) {\n // if no panels from measurement-tracking extension is used, this code will run\n trackedMeasurements = null;\n sendTrackedMeasurementsEvent = (eventName, { displaySetInstanceUID }) => {\n measurementService.clearMeasurements();\n const { SeriesInstanceUIDs } = hydrateStructuredReport(\n { servicesManager, extensionManager },\n displaySetInstanceUID\n );\n const displaySets = displaySetService.getDisplaySetsForSeries(\n SeriesInstanceUIDs[0]\n );\n if (displaySets.length) {\n viewportGridService.setDisplaySetsForViewports([\n {\n viewportIndex: activeViewportIndex,\n displaySetInstanceUIDs: [displaySets[0].displaySetInstanceUID],\n },\n ]);\n }\n };\n }\n\n /**\n * Store the tracking identifiers per viewport in order to be able to\n * show the SR measurements on the referenced image on the correct viewport,\n * when multiple viewports are used.\n */\n const setTrackingIdentifiers = useCallback(\n measurementSelected => {\n const { measurements } = srDisplaySet;\n\n setTrackingUniqueIdentifiersForElement(\n element,\n measurements.map(measurement => measurement.TrackingUniqueIdentifier),\n measurementSelected\n );\n },\n [element, measurementSelected, srDisplaySet]\n );\n\n /**\n * OnElementEnabled callback which is called after the cornerstoneExtension\n * has enabled the element. Note: we delegate all the image rendering to\n * cornerstoneExtension, so we don't need to do anything here regarding\n * the image rendering, element enabling etc.\n */\n const onElementEnabled = evt => {\n setElement(evt.detail.element);\n };\n\n const updateViewport = useCallback(\n newMeasurementSelected => {\n const {\n StudyInstanceUID,\n displaySetInstanceUID,\n sopClassUids,\n } = srDisplaySet;\n\n if (!StudyInstanceUID || !displaySetInstanceUID) {\n return;\n }\n\n if (sopClassUids && sopClassUids.length > 1) {\n // Todo: what happens if there are multiple SOP Classes? Why we are\n // not throwing an error?\n console.warn(\n 'More than one SOPClassUID in the same series is not yet supported.'\n );\n }\n\n _getViewportReferencedDisplaySetData(\n srDisplaySet,\n newMeasurementSelected,\n displaySetService\n ).then(({ referencedDisplaySet, referencedDisplaySetMetadata }) => {\n setMeasurementSelected(newMeasurementSelected);\n setActiveImageDisplaySetData(referencedDisplaySet);\n setReferencedDisplaySetMetadata(referencedDisplaySetMetadata);\n\n if (\n referencedDisplaySet.displaySetInstanceUID ===\n activeImageDisplaySetData?.displaySetInstanceUID\n ) {\n const { measurements } = srDisplaySet;\n\n // it means that we have a new referenced display set, and the\n // imageIdIndex will handle it by updating the viewport, but if they\n // are the same we just need to use measurementService to jump to the\n // new measurement\n const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(\n viewportIndex\n );\n\n const csViewport = cornerstoneViewportService.getCornerstoneViewport(\n viewportInfo.getViewportId()\n );\n\n const imageIds = csViewport.getImageIds();\n\n const imageIdIndex = imageIds.indexOf(\n measurements[newMeasurementSelected].imageId\n );\n\n if (imageIdIndex !== -1) {\n csViewport.setImageIdIndex(imageIdIndex);\n }\n }\n });\n },\n [dataSource, srDisplaySet, activeImageDisplaySetData, viewportIndex]\n );\n\n const getCornerstoneViewport = useCallback(() => {\n if (!activeImageDisplaySetData) {\n return null;\n }\n\n const { component: Component } = extensionManager.getModuleEntry(\n '@ohif/extension-cornerstone.viewportModule.cornerstone'\n );\n\n const { measurements } = srDisplaySet;\n const measurement = measurements[measurementSelected];\n\n if (!measurement) {\n return null;\n }\n\n const initialImageIndex = activeImageDisplaySetData.images.findIndex(\n image => image.imageId === measurement.imageId\n );\n\n return (\n <Component\n {...props}\n // should be passed second since we don't want SR displaySet to\n // override the activeImageDisplaySetData\n displaySets={[activeImageDisplaySetData]}\n // It is possible that there is a hanging protocol applying viewportOptions\n // for the SR, so inherit the viewport options\n // TODO: Ensure the viewport options are set correctly with respect to\n // stack etc, in the incoming viewport options.\n viewportOptions={{\n ...viewportOptions,\n toolGroupId: `${SR_TOOLGROUP_BASE_NAME}`,\n // viewportType should not be required, as the stack type should be\n // required already in order to view SR, but sometimes segmentation\n // views set the viewport type without fixing the allowed display\n viewportType: 'stack',\n // The positionIds for the viewport aren't meaningful for the child display sets\n positionIds: null,\n }}\n onElementEnabled={onElementEnabled}\n initialImageIndex={initialImageIndex}\n ></Component>\n );\n }, [activeImageDisplaySetData, viewportIndex, measurementSelected]);\n\n const onMeasurementChange = useCallback(\n direction => {\n let newMeasurementSelected = measurementSelected;\n\n if (direction === 'right') {\n newMeasurementSelected++;\n\n if (newMeasurementSelected >= measurementCount) {\n newMeasurementSelected = 0;\n }\n } else {\n newMeasurementSelected--;\n\n if (newMeasurementSelected < 0) {\n newMeasurementSelected = measurementCount - 1;\n }\n }\n\n setTrackingIdentifiers(newMeasurementSelected);\n updateViewport(newMeasurementSelected);\n },\n [\n measurementSelected,\n measurementCount,\n updateViewport,\n setTrackingIdentifiers,\n ]\n );\n\n /**\n Cleanup the SR viewport when the viewport is destroyed\n */\n useEffect(() => {\n const onDisplaySetsRemovedSubscription = displaySetService.subscribe(\n displaySetService.EVENTS.DISPLAY_SETS_REMOVED,\n ({ displaySetInstanceUIDs }) => {\n const activeViewport = viewports[activeViewportIndex];\n if (\n displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)\n ) {\n viewportGridService.setDisplaySetsForViewport({\n viewportIndex: activeViewportIndex,\n displaySetInstanceUIDs: [],\n });\n }\n }\n );\n\n return () => {\n onDisplaySetsRemovedSubscription.unsubscribe();\n };\n }, []);\n\n /**\n * Loading the measurements from the SR viewport, which goes through the\n * isHydratable check, the outcome for the isHydrated state here is always FALSE\n * since we don't do the hydration here. Todo: can't we just set it as false? why\n * we are changing the state here? isHydrated is always false at this stage, and\n * if it is hydrated we don't even use the SR viewport.\n */\n useEffect(() => {\n if (!srDisplaySet.isLoaded) {\n srDisplaySet.load();\n }\n const numMeasurements = srDisplaySet.measurements.length;\n setMeasurementCount(numMeasurements);\n }, [srDisplaySet]);\n\n /**\n * Hook to update the tracking identifiers when the selected measurement changes or\n * the element changes\n */\n useEffect(() => {\n if (!element || !srDisplaySet.isLoaded) {\n return;\n }\n setTrackingIdentifiers(measurementSelected);\n }, [measurementSelected, element, setTrackingIdentifiers, srDisplaySet]);\n\n /**\n * Todo: what is this, not sure what it does regarding the react aspect,\n * it is updating a local variable? which is not state.\n */\n let isLocked = trackedMeasurements?.context?.trackedSeries?.length > 0;\n useEffect(() => {\n isLocked = trackedMeasurements?.context?.trackedSeries?.length > 0;\n }, [trackedMeasurements]);\n\n /**\n * Data fetching for the SR displaySet, which updates the measurements and\n * also gets the referenced image displaySet that SR is based on.\n */\n useEffect(() => {\n updateViewport(measurementSelected);\n }, [dataSource, srDisplaySet]);\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n let childrenWithProps = null;\n\n if (!activeImageDisplaySetData || !referencedDisplaySetMetadata) {\n return null;\n }\n\n if (children && children.length) {\n childrenWithProps = children.map((child, index) => {\n return (\n child &&\n React.cloneElement(child, {\n viewportIndex,\n key: index,\n })\n );\n });\n }\n\n const {\n PatientID,\n PatientName,\n PatientSex,\n PatientAge,\n SliceThickness,\n ManufacturerModelName,\n StudyDate,\n SeriesDescription,\n SpacingBetweenSlices,\n SeriesNumber,\n } = referencedDisplaySetMetadata;\n\n // TODO -> disabled double click for now: onDoubleClick={_onDoubleClick}\n return (\n <>\n <ViewportActionBar\n onDoubleClick={evt => {\n evt.stopPropagation();\n evt.preventDefault();\n }}\n onArrowsClick={onMeasurementChange}\n getStatusComponent={() =>\n _getStatusComponent({\n srDisplaySet,\n viewportIndex,\n isTracked: false,\n isRehydratable: srDisplaySet.isRehydratable,\n isLocked,\n sendTrackedMeasurementsEvent,\n })\n }\n studyData={{\n label: viewportLabel,\n useAltStyling: true,\n studyDate: formatDate(StudyDate),\n currentSeries: SeriesNumber,\n seriesDescription: SeriesDescription || '',\n patientInformation: {\n patientName: PatientName\n ? OHIF.utils.formatPN(PatientName.Alphabetic)\n : '',\n patientSex: PatientSex || '',\n patientAge: PatientAge || '',\n MRN: PatientID || '',\n thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',\n spacing:\n SpacingBetweenSlices !== undefined\n ? `${SpacingBetweenSlices.toFixed(2)}mm`\n : '',\n scanner: ManufacturerModelName || '',\n },\n }}\n />\n\n <div className=\"relative flex flex-row w-full h-full overflow-hidden\">\n {getCornerstoneViewport()}\n {childrenWithProps}\n </div>\n </>\n );\n}\n\nOHIFCornerstoneSRViewport.propTypes = {\n displaySets: PropTypes.arrayOf(PropTypes.object),\n viewportIndex: PropTypes.number.isRequired,\n dataSource: PropTypes.object,\n children: PropTypes.node,\n viewportLabel: PropTypes.string,\n customProps: PropTypes.object,\n viewportOptions: PropTypes.object,\n viewportLabel: PropTypes.string,\n servicesManager: PropTypes.instanceOf(ServicesManager).isRequired,\n extensionManager: PropTypes.instanceOf(ExtensionManager).isRequired,\n};\n\nOHIFCornerstoneSRViewport.defaultProps = {\n customProps: {},\n};\n\nasync function _getViewportReferencedDisplaySetData(\n displaySet,\n measurementSelected,\n displaySetService\n) {\n const { measurements } = displaySet;\n const measurement = measurements[measurementSelected];\n\n const { displaySetInstanceUID } = measurement;\n\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(\n displaySetInstanceUID\n );\n\n const image0 = referencedDisplaySet.images[0];\n const referencedDisplaySetMetadata = {\n PatientID: image0.PatientID,\n PatientName: image0.PatientName,\n PatientSex: image0.PatientSex,\n PatientAge: image0.PatientAge,\n SliceThickness: image0.SliceThickness,\n StudyDate: image0.StudyDate,\n SeriesDescription: image0.SeriesDescription,\n SeriesInstanceUID: image0.SeriesInstanceUID,\n SeriesNumber: image0.SeriesNumber,\n ManufacturerModelName: image0.ManufacturerModelName,\n SpacingBetweenSlices: image0.SpacingBetweenSlices,\n };\n\n return { referencedDisplaySetMetadata, referencedDisplaySet };\n}\n\nfunction _getStatusComponent({\n srDisplaySet,\n viewportIndex,\n isRehydratable,\n isLocked,\n sendTrackedMeasurementsEvent,\n}) {\n const handleMouseUp = () => {\n sendTrackedMeasurementsEvent('HYDRATE_SR', {\n displaySetInstanceUID: srDisplaySet.displaySetInstanceUID,\n viewportIndex,\n });\n };\n\n const { t } = useTranslation('Common');\n const loadStr = t('LOAD');\n\n // 1 - Incompatible\n // 2 - Locked\n // 3 - Rehydratable / Open\n const state =\n isRehydratable && !isLocked ? 3 : isRehydratable && isLocked ? 2 : 1;\n let ToolTipMessage = null;\n let StatusIcon = null;\n\n switch (state) {\n case 1:\n StatusIcon = () => <Icon name=\"status-alert\" />;\n\n ToolTipMessage = () => (\n <div>\n This structured report is not compatible\n <br />\n with this application.\n </div>\n );\n break;\n case 2:\n StatusIcon = () => <Icon name=\"status-locked\" />;\n\n ToolTipMessage = () => (\n <div>\n This structured report is currently read-only\n <br />\n because you are tracking measurements in\n <br />\n another viewport.\n </div>\n );\n break;\n case 3:\n StatusIcon = () => <Icon name=\"status-untracked\" />;\n\n ToolTipMessage = () => (\n <div>{`Click ${loadStr} to restore measurements.`}</div>\n );\n }\n\n const StatusArea = () => (\n <div className=\"flex h-6 leading-6 cursor-default text-sm text-white\">\n <div className=\"min-w-[45px] flex items-center p-1 rounded-l-xl rounded-r bg-customgray-100\">\n <StatusIcon />\n <span className=\"ml-1\">SR</span>\n </div>\n {state === 3 && (\n <div\n className=\"ml-1 px-1.5 rounded cursor-pointer hover:text-black bg-primary-main hover:bg-primary-light\"\n // Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none\n onMouseUp={handleMouseUp}\n >\n {loadStr}\n </div>\n )}\n </div>\n );\n\n return (\n <>\n {ToolTipMessage && (\n <Tooltip content={<ToolTipMessage />} position=\"bottom-left\">\n <StatusArea />\n </Tooltip>\n )}\n {!ToolTipMessage && <StatusArea />}\n </>\n );\n}\n\nexport default OHIFCornerstoneSRViewport;\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/** @license React v17.0.2\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=require(\"object-assign\"),n=60103,p=60106;exports.Fragment=60107;exports.StrictMode=60108;exports.Profiler=60114;var q=60109,r=60110,t=60112;exports.Suspense=60113;var u=60115,v=60116;\nif(\"function\"===typeof Symbol&&Symbol.for){var w=Symbol.for;n=w(\"react.element\");p=w(\"react.portal\");exports.Fragment=w(\"react.fragment\");exports.StrictMode=w(\"react.strict_mode\");exports.Profiler=w(\"react.profiler\");q=w(\"react.provider\");r=w(\"react.context\");t=w(\"react.forward_ref\");exports.Suspense=w(\"react.suspense\");u=w(\"react.memo\");v=w(\"react.lazy\")}var x=\"function\"===typeof Symbol&&Symbol.iterator;\nfunction y(a){if(null===a||\"object\"!==typeof a)return null;a=x&&a[x]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}function z(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar A={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B={};function C(a,b,c){this.props=a;this.context=b;this.refs=B;this.updater=c||A}C.prototype.isReactComponent={};C.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(z(85));this.updater.enqueueSetState(this,a,b,\"setState\")};C.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\nfunction D(){}D.prototype=C.prototype;function E(a,b,c){this.props=a;this.context=b;this.refs=B;this.updater=c||A}var F=E.prototype=new D;F.constructor=E;l(F,C.prototype);F.isPureReactComponent=!0;var G={current:null},H=Object.prototype.hasOwnProperty,I={key:!0,ref:!0,__self:!0,__source:!0};\nfunction J(a,b,c){var e,d={},k=null,h=null;if(null!=b)for(e in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)H.call(b,e)&&!I.hasOwnProperty(e)&&(d[e]=b[e]);var g=arguments.length-2;if(1===g)d.children=c;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];d.children=f}if(a&&a.defaultProps)for(e in g=a.defaultProps,g)void 0===d[e]&&(d[e]=g[e]);return{$$typeof:n,type:a,key:k,ref:h,props:d,_owner:G.current}}\nfunction K(a,b){return{$$typeof:n,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function L(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===n}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var M=/\\/+/g;function N(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction O(a,b,c,e,d){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case n:case p:h=!0}}if(h)return h=a,d=d(h),a=\"\"===e?\".\"+N(h,0):e,Array.isArray(d)?(c=\"\",null!=a&&(c=a.replace(M,\"$&/\")+\"/\"),O(d,b,c,\"\",function(a){return a})):null!=d&&(L(d)&&(d=K(d,c+(!d.key||h&&h.key===d.key?\"\":(\"\"+d.key).replace(M,\"$&/\")+\"/\")+a)),b.push(d)),1;h=0;e=\"\"===e?\".\":e+\":\";if(Array.isArray(a))for(var g=\n0;g<a.length;g++){k=a[g];var f=e+N(k,g);h+=O(k,b,c,f,d)}else if(f=y(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=e+N(k,g++),h+=O(k,b,c,f,d);else if(\"object\"===k)throw b=\"\"+a,Error(z(31,\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b));return h}function P(a,b,c){if(null==a)return a;var e=[],d=0;O(a,e,\"\",\"\",function(a){return b.call(c,a,d++)});return e}\nfunction Q(a){if(-1===a._status){var b=a._result;b=b();a._status=0;a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}if(1===a._status)return a._result;throw a._result;}var R={current:null};function S(){var a=R.current;if(null===a)throw Error(z(321));return a}var T={ReactCurrentDispatcher:R,ReactCurrentBatchConfig:{transition:0},ReactCurrentOwner:G,IsSomeRendererActing:{current:!1},assign:l};\nexports.Children={map:P,forEach:function(a,b,c){P(a,function(){b.apply(this,arguments)},c)},count:function(a){var b=0;P(a,function(){b++});return b},toArray:function(a){return P(a,function(a){return a})||[]},only:function(a){if(!L(a))throw Error(z(143));return a}};exports.Component=C;exports.PureComponent=E;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=T;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(z(267,a));var e=l({},a.props),d=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=G.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)H.call(b,f)&&!I.hasOwnProperty(f)&&(e[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)e.children=c;else if(1<f){g=Array(f);for(var m=0;m<f;m++)g[m]=arguments[m+2];e.children=g}return{$$typeof:n,type:a.type,\nkey:d,ref:k,props:e,_owner:h}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:r,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:q,_context:a};return a.Consumer=a};exports.createElement=J;exports.createFactory=function(a){var b=J.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:t,render:a}};exports.isValidElement=L;\nexports.lazy=function(a){return{$$typeof:v,_payload:{_status:-1,_result:a},_init:Q}};exports.memo=function(a,b){return{$$typeof:u,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return S().useCallback(a,b)};exports.useContext=function(a,b){return S().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return S().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return S().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return S().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return S().useMemo(a,b)};exports.useReducer=function(a,b,c){return S().useReducer(a,b,c)};exports.useRef=function(a){return S().useRef(a)};exports.useState=function(a){return S().useState(a)};exports.version=\"17.0.2\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/**\n * This file automatically generated from `pre-publish.js`.\n * Do not manually edit.\n */\n\nmodule.exports = {\n \"area\": true,\n \"base\": true,\n \"br\": true,\n \"col\": true,\n \"embed\": true,\n \"hr\": true,\n \"img\": true,\n \"input\": true,\n \"link\": true,\n \"meta\": true,\n \"param\": true,\n \"source\": true,\n \"track\": true,\n \"wbr\": true\n};\n","module.exports = __WEBPACK_EXTERNAL_MODULE__32__;","module.exports = __WEBPACK_EXTERNAL_MODULE__464__;","module.exports = __WEBPACK_EXTERNAL_MODULE__867__;","module.exports = __WEBPACK_EXTERNAL_MODULE__762__;","module.exports = __WEBPACK_EXTERNAL_MODULE__369__;","module.exports = __WEBPACK_EXTERNAL_MODULE__836__;","module.exports = __WEBPACK_EXTERNAL_MODULE__845__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","__webpack_require__.F = {};\n__webpack_require__.E = (chunkId) => {\n\tObject.keys(__webpack_require__.F).map((key) => {\n\t\t__webpack_require__.F[key](chunkId);\n\t});\n}","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.O(0, [143], () => {\n\t__webpack_require__.E(143);\n}, 5);","import packageJson from '../package.json';\n\nconst id = packageJson.name;\n\nconst SOPClassHandlerName = 'dicom-sr';\nconst SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;\n\nexport { SOPClassHandlerName, SOPClassHandlerId, id };\n","export default {\n POINT: 'POINT',\n MULTIPOINT: 'MULTIPOINT',\n POLYLINE: 'POLYLINE',\n CIRCLE: 'CIRCLE',\n ELLIPSE: 'ELLIPSE',\n};\n","import { Types, metaData, utilities as csUtils } from '@cornerstonejs/core';\nimport {\n AnnotationTool,\n annotation,\n drawing,\n utilities,\n Types as cs3DToolsTypes,\n} from '@cornerstonejs/tools';\nimport { getTrackingUniqueIdentifiersForElement } from './modules/dicomSRModule';\nimport SCOORD_TYPES from '../constants/scoordTypes';\n\nexport default class DICOMSRDisplayTool extends AnnotationTool {\n static toolName = 'DICOMSRDisplay';\n\n constructor(\n toolProps = {},\n defaultToolProps = {\n configuration: {},\n }\n ) {\n super(toolProps, defaultToolProps);\n }\n\n _getTextBoxLinesFromLabels(labels) {\n // TODO -> max 3 for now (label + shortAxis + longAxis), need a generic solution for this!\n\n const labelLength = Math.min(labels.length, 3);\n const lines = [];\n\n for (let i = 0; i < labelLength; i++) {\n const labelEntry = labels[i];\n lines.push(`${_labelToShorthand(labelEntry.label)}${labelEntry.value}`);\n }\n\n return lines;\n }\n\n // This tool should not inherit from AnnotationTool and we should not need\n // to add the following lines.\n isPointNearTool = () => null;\n getHandleNearImagePoint = () => null;\n\n renderAnnotation = (\n enabledElement: Types.IEnabledElement,\n svgDrawingHelper: any\n ): void => {\n const { viewport } = enabledElement;\n const { element } = viewport;\n\n let annotations = annotation.state.getAnnotations(\n this.getToolName(),\n element\n );\n\n // Todo: We don't need this anymore, filtering happens in triggerAnnotationRender\n if (!annotations?.length) {\n return;\n }\n\n annotations = this.filterInteractableAnnotationsForElement(\n element,\n annotations\n );\n\n if (!annotations?.length) {\n return;\n }\n\n const trackingUniqueIdentifiersForElement = getTrackingUniqueIdentifiersForElement(\n element\n );\n\n const {\n activeIndex,\n trackingUniqueIdentifiers,\n } = trackingUniqueIdentifiersForElement;\n\n const activeTrackingUniqueIdentifier =\n trackingUniqueIdentifiers[activeIndex];\n\n // Filter toolData to only render the data for the active SR.\n const filteredAnnotations = annotations.filter(annotation =>\n trackingUniqueIdentifiers.includes(\n annotation.data?.cachedStats?.TrackingUniqueIdentifier\n )\n );\n\n if (!viewport._actors?.size) {\n return;\n }\n\n const styleSpecifier: cs3DToolsTypes.AnnotationStyle.StyleSpecifier = {\n toolGroupId: this.toolGroupId,\n toolName: this.getToolName(),\n viewportId: enabledElement.viewport.id,\n };\n\n for (let i = 0; i < filteredAnnotations.length; i++) {\n const annotation = filteredAnnotations[i];\n const annotationUID = annotation.annotationUID;\n const { renderableData } = annotation.data.cachedStats;\n const { cachedStats } = annotation.data;\n const { referencedImageId } = annotation.metadata;\n\n styleSpecifier.annotationUID = annotationUID;\n\n const lineWidth = this.getStyle('lineWidth', styleSpecifier, annotation);\n const lineDash = this.getStyle('lineDash', styleSpecifier, annotation);\n const color =\n cachedStats.TrackingUniqueIdentifier === activeTrackingUniqueIdentifier\n ? 'rgb(0, 255, 0)'\n : this.getStyle('color', styleSpecifier, annotation);\n\n const options = {\n color,\n lineDash,\n lineWidth,\n };\n\n Object.keys(renderableData).forEach(GraphicType => {\n const renderableDataForGraphicType = renderableData[GraphicType];\n\n let renderMethod;\n let canvasCoordinatesAdapter;\n\n switch (GraphicType) {\n case SCOORD_TYPES.POINT:\n renderMethod = this.renderPoint;\n break;\n case SCOORD_TYPES.MULTIPOINT:\n renderMethod = this.renderMultipoint;\n break;\n case SCOORD_TYPES.POLYLINE:\n renderMethod = this.renderPolyLine;\n break;\n case SCOORD_TYPES.CIRCLE:\n renderMethod = this.renderEllipse;\n break;\n case SCOORD_TYPES.ELLIPSE:\n renderMethod = this.renderEllipse;\n canvasCoordinatesAdapter =\n utilities.math.ellipse.getCanvasEllipseCorners;\n break;\n default:\n throw new Error(`Unsupported GraphicType: ${GraphicType}`);\n }\n\n const canvasCoordinates = renderMethod(\n svgDrawingHelper,\n viewport,\n renderableDataForGraphicType,\n annotationUID,\n referencedImageId,\n options\n );\n\n this.renderTextBox(\n svgDrawingHelper,\n viewport,\n canvasCoordinates,\n canvasCoordinatesAdapter,\n annotation,\n styleSpecifier,\n options\n );\n });\n }\n };\n\n renderPolyLine(\n svgDrawingHelper,\n viewport,\n renderableData,\n annotationUID,\n referencedImageId,\n options\n ) {\n const drawingOptions = {\n color: options.color,\n width: options.lineWidth,\n };\n let allCanvasCoordinates = [];\n renderableData.map((data, index) => {\n const canvasCoordinates = data.map(p => viewport.worldToCanvas(p));\n const lineUID = `${index}`;\n\n if (canvasCoordinates.length === 2) {\n drawing.drawLine(\n svgDrawingHelper,\n annotationUID,\n lineUID,\n canvasCoordinates[0],\n canvasCoordinates[1],\n drawingOptions\n );\n } else {\n drawing.drawPolyline(\n svgDrawingHelper,\n annotationUID,\n lineUID,\n canvasCoordinates,\n drawingOptions\n );\n }\n\n allCanvasCoordinates = allCanvasCoordinates.concat(canvasCoordinates);\n });\n\n return allCanvasCoordinates; // used for drawing textBox\n }\n\n renderMultipoint(\n svgDrawingHelper,\n viewport,\n renderableData,\n annotationUID,\n referencedImageId,\n options\n ) {\n let canvasCoordinates;\n renderableData.map((data, index) => {\n canvasCoordinates = data.map(p => viewport.worldToCanvas(p));\n const handleGroupUID = '0';\n drawing.drawHandles(\n svgDrawingHelper,\n annotationUID,\n handleGroupUID,\n canvasCoordinates,\n {\n color: options.color,\n }\n );\n });\n }\n\n renderPoint(\n svgDrawingHelper,\n viewport,\n renderableData,\n annotationUID,\n referencedImageId,\n options\n ) {\n const canvasCoordinates = [];\n renderableData.map((data, index) => {\n const point = data[0];\n // This gives us one point for arrow\n canvasCoordinates.push(viewport.worldToCanvas(point));\n\n // We get the other point for the arrow by using the image size\n const imagePixelModule = metaData.get(\n 'imagePixelModule',\n referencedImageId\n );\n\n let xOffset = 10;\n let yOffset = 10;\n\n if (imagePixelModule) {\n const { columns, rows } = imagePixelModule;\n xOffset = columns / 10;\n yOffset = rows / 10;\n }\n\n const imagePoint = csUtils.worldToImageCoords(referencedImageId, point);\n const arrowEnd = csUtils.imageToWorldCoords(referencedImageId, [\n imagePoint[0] + xOffset,\n imagePoint[1] + yOffset,\n ]);\n\n canvasCoordinates.push(viewport.worldToCanvas(arrowEnd));\n\n const arrowUID = `${index}`;\n\n // Todo: handle drawing probe as probe, currently we are drawing it as an arrow\n drawing.drawArrow(\n svgDrawingHelper,\n annotationUID,\n arrowUID,\n canvasCoordinates[1],\n canvasCoordinates[0],\n {\n color: options.color,\n width: options.lineWidth,\n }\n );\n });\n\n return canvasCoordinates; // used for drawing textBox\n }\n\n renderEllipse(\n svgDrawingHelper,\n viewport,\n renderableData,\n annotationUID,\n referencedImageId,\n options\n ) {\n let canvasCoordinates;\n renderableData.map((data, index) => {\n if (data.length === 0) {\n // since oblique ellipse is not supported for hydration right now\n // we just return\n return;\n }\n\n const ellipsePointsWorld = data;\n\n const rotation = viewport.getRotation();\n\n canvasCoordinates = ellipsePointsWorld.map(p =>\n viewport.worldToCanvas(p)\n );\n let canvasCorners;\n if (rotation == 90 || rotation == 270) {\n canvasCorners = <Array<Types.Point2>>(\n utilities.math.ellipse.getCanvasEllipseCorners([\n canvasCoordinates[2],\n canvasCoordinates[3],\n canvasCoordinates[0],\n canvasCoordinates[1],\n ])\n );\n } else {\n canvasCorners = <Array<Types.Point2>>(\n utilities.math.ellipse.getCanvasEllipseCorners(canvasCoordinates)\n );\n }\n\n const lineUID = `${index}`;\n drawing.drawEllipse(\n svgDrawingHelper,\n annotationUID,\n lineUID,\n canvasCorners[0],\n canvasCorners[1],\n {\n color: options.color,\n width: options.lineWidth,\n }\n );\n });\n\n return canvasCoordinates;\n }\n\n renderTextBox(\n svgDrawingHelper,\n viewport,\n canvasCoordinates,\n canvasCoordinatesAdapter,\n annotation,\n styleSpecifier,\n options = {}\n ) {\n if (!canvasCoordinates || !annotation) {\n return;\n }\n\n const { annotationUID, data = {} } = annotation;\n const { label } = data;\n const { color } = options;\n\n let adaptedCanvasCoordinates = canvasCoordinates;\n // adapt coordinates if there is an adapter\n if (typeof canvasCoordinatesAdapter === 'function') {\n adaptedCanvasCoordinates = canvasCoordinatesAdapter(canvasCoordinates);\n }\n const textLines = this._getTextBoxLinesFromLabels(label);\n const canvasTextBoxCoords = utilities.drawing.getTextBoxCoordsCanvas(\n adaptedCanvasCoordinates\n );\n\n annotation.data.handles.textBox.worldPosition = viewport.canvasToWorld(\n canvasTextBoxCoords\n );\n\n const textBoxPosition = viewport.worldToCanvas(\n annotation.data.handles.textBox.worldPosition\n );\n\n const textBoxUID = '1';\n const textBoxOptions = this.getLinkedTextBoxStyle(\n styleSpecifier,\n annotation\n );\n\n const boundingBox = drawing.drawLinkedTextBox(\n svgDrawingHelper,\n annotationUID,\n textBoxUID,\n textLines,\n textBoxPosition,\n canvasCoordinates,\n {},\n {\n ...textBoxOptions,\n color,\n }\n );\n\n const { x: left, y: top, width, height } = boundingBox;\n\n annotation.data.handles.textBox.worldBoundingBox = {\n topLeft: viewport.canvasToWorld([left, top]),\n topRight: viewport.canvasToWorld([left + width, top]),\n bottomLeft: viewport.canvasToWorld([left, top + height]),\n bottomRight: viewport.canvasToWorld([left + width, top + height]),\n };\n }\n}\n\nconst SHORT_HAND_MAP = {\n 'Short Axis': 'W: ',\n 'Long Axis': 'L: ',\n AREA: 'Area: ',\n Length: '',\n CORNERSTONEFREETEXT: '',\n};\n\nfunction _labelToShorthand(label) {\n const shortHand = SHORT_HAND_MAP[label];\n\n if (shortHand !== undefined) {\n return shortHand;\n }\n\n return label;\n}\n","import DICOMSRDisplayTool from './DICOMSRDisplayTool';\n\nconst toolNames = {\n DICOMSRDisplay: DICOMSRDisplayTool.toolName,\n SRLength: 'SRLength',\n SRBidirectional: 'SRBidirectional',\n SREllipticalROI: 'SREllipticalROI',\n SRCircleROI: 'SRCircleROI',\n SRArrowAnnotate: 'SRArrowAnnotate',\n SRAngle: 'SRAngle',\n SRCobbAngle: 'SRCobbAngle',\n SRRectangleROI: 'SRRectangleROI',\n SRPlanarFreehandROI: 'SRPlanarFreehandROI',\n};\n\nexport default toolNames;\n","import { vec3 } from 'gl-matrix';\nimport { Types, annotation } from '@cornerstonejs/tools';\nimport { metaData, utilities, Types as csTypes } from '@cornerstonejs/core';\nimport toolNames from '../tools/toolNames';\nimport SCOORD_TYPES from '../constants/scoordTypes';\n\nconst EPSILON = 1e-4;\n\nconst supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];\n\nexport default function addMeasurement(\n measurement,\n imageId,\n displaySetInstanceUID\n) {\n // TODO -> Render rotated ellipse .\n const toolName = toolNames.DICOMSRDisplay;\n\n const measurementData = {\n TrackingUniqueIdentifier: measurement.TrackingUniqueIdentifier,\n renderableData: {},\n labels: measurement.labels,\n imageId,\n };\n\n measurement.coords.forEach(coord => {\n const { GraphicType, GraphicData } = coord;\n\n if (measurementData.renderableData[GraphicType] === undefined) {\n measurementData.renderableData[GraphicType] = [];\n }\n\n measurementData.renderableData[GraphicType].push(\n _getRenderableData(\n GraphicType,\n GraphicData,\n imageId,\n measurement.TrackingIdentifier\n )\n );\n });\n\n // Use the metadata provider to grab its imagePlaneModule metadata\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n const annotationManager = annotation.state.getAnnotationManager();\n\n // Create Cornerstone3D Annotation from measurement\n const frameNumber =\n (measurement.coords[0].ReferencedSOPSequence &&\n measurement.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber) ||\n 1;\n\n const SRAnnotation: Types.Annotation = {\n annotationUID: measurement.TrackingUniqueIdentifier,\n metadata: {\n FrameOfReferenceUID: imagePlaneModule.frameOfReferenceUID,\n toolName: toolName,\n referencedImageId: imageId,\n },\n data: {\n label: measurement.labels,\n handles: {\n textBox: {},\n },\n cachedStats: {\n TrackingUniqueIdentifier: measurementData.TrackingUniqueIdentifier,\n renderableData: measurementData.renderableData,\n },\n frameNumber: frameNumber,\n },\n };\n\n annotationManager.addAnnotation(SRAnnotation);\n\n measurement.loaded = true;\n measurement.imageId = imageId;\n measurement.displaySetInstanceUID = displaySetInstanceUID;\n\n // Remove the unneeded coord now its processed, but keep the SOPInstanceUID.\n // NOTE: We assume that each SCOORD in the MeasurementGroup maps onto one frame,\n // It'd be super weird if it didn't anyway as a SCOORD.\n measurement.ReferencedSOPInstanceUID =\n measurement.coords[0].ReferencedSOPSequence.ReferencedSOPInstanceUID;\n measurement.frameNumber = frameNumber;\n delete measurement.coords;\n}\n\nfunction _getRenderableData(\n GraphicType,\n GraphicData,\n imageId,\n TrackingIdentifier\n) {\n const [cornerstoneTag, toolName] = TrackingIdentifier.split(':');\n\n let renderableData: csTypes.Point3[];\n\n switch (GraphicType) {\n case SCOORD_TYPES.POINT:\n case SCOORD_TYPES.MULTIPOINT:\n case SCOORD_TYPES.POLYLINE:\n renderableData = [];\n\n for (let i = 0; i < GraphicData.length; i += 2) {\n const worldPos = utilities.imageToWorldCoords(imageId, [\n GraphicData[i],\n GraphicData[i + 1],\n ]);\n\n renderableData.push(worldPos);\n }\n\n break;\n case SCOORD_TYPES.CIRCLE: {\n const pointsWorld = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const worldPos = utilities.imageToWorldCoords(imageId, [\n GraphicData[i],\n GraphicData[i + 1],\n ]);\n\n pointsWorld.push(worldPos);\n }\n\n // We do not have an explicit draw circle svg helper in Cornerstone3D at\n // this time, but we can use the ellipse svg helper to draw a circle, so\n // here we reshape the data for that purpose.\n const center = pointsWorld[0];\n const onPerimeter = pointsWorld[1];\n\n const radius = vec3.distance(center, onPerimeter);\n\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n if (!imagePlaneModule) {\n throw new Error('No imagePlaneModule found');\n }\n\n const {\n columnCosines,\n rowCosines,\n }: {\n columnCosines: csTypes.Point3;\n rowCosines: csTypes.Point3;\n } = imagePlaneModule;\n\n // we need to get major/minor axis (which are both the same size major = minor)\n\n // first axisStart\n const firstAxisStart = vec3.create();\n vec3.scaleAndAdd(firstAxisStart, center, columnCosines, radius);\n\n const firstAxisEnd = vec3.create();\n vec3.scaleAndAdd(firstAxisEnd, center, columnCosines, -radius);\n\n // second axisStart\n const secondAxisStart = vec3.create();\n vec3.scaleAndAdd(secondAxisStart, center, rowCosines, radius);\n\n const secondAxisEnd = vec3.create();\n vec3.scaleAndAdd(secondAxisEnd, center, rowCosines, -radius);\n\n renderableData = [\n firstAxisStart as csTypes.Point3,\n firstAxisEnd as csTypes.Point3,\n secondAxisStart as csTypes.Point3,\n secondAxisEnd as csTypes.Point3,\n ];\n\n break;\n }\n case SCOORD_TYPES.ELLIPSE: {\n // GraphicData is ordered as [majorAxisStartX, majorAxisStartY, majorAxisEndX, majorAxisEndY, minorAxisStartX, minorAxisStartY, minorAxisEndX, minorAxisEndY]\n // But Cornerstone3D points are ordered as top, bottom, left, right for the\n // ellipse so we need to identify if the majorAxis is horizontal or vertical\n // and then choose the correct points to use for the ellipse.\n\n const pointsWorld: csTypes.Point3[] = [];\n for (let i = 0; i < GraphicData.length; i += 2) {\n const worldPos = utilities.imageToWorldCoords(imageId, [\n GraphicData[i],\n GraphicData[i + 1],\n ]);\n\n pointsWorld.push(worldPos);\n }\n\n const majorAxisStart = vec3.fromValues(...pointsWorld[0]);\n const majorAxisEnd = vec3.fromValues(...pointsWorld[1]);\n const minorAxisStart = vec3.fromValues(...pointsWorld[2]);\n const minorAxisEnd = vec3.fromValues(...pointsWorld[3]);\n\n const majorAxisVec = vec3.create();\n vec3.sub(majorAxisVec, majorAxisEnd, majorAxisStart);\n\n // normalize majorAxisVec to avoid scaling issues\n vec3.normalize(majorAxisVec, majorAxisVec);\n\n const minorAxisVec = vec3.create();\n vec3.sub(minorAxisVec, minorAxisEnd, minorAxisStart);\n vec3.normalize(minorAxisVec, minorAxisVec);\n\n const imagePlaneModule = metaData.get('imagePlaneModule', imageId);\n\n if (!imagePlaneModule) {\n throw new Error('imageId does not have imagePlaneModule metadata');\n }\n\n const {\n columnCosines,\n }: { columnCosines: csTypes.Point3 } = imagePlaneModule;\n\n // find which axis is parallel to the columnCosines\n const columnCosinesVec = vec3.fromValues(...columnCosines);\n\n const projectedMajorAxisOnColVec = Math.abs(\n vec3.dot(columnCosinesVec, majorAxisVec)\n );\n const projectedMinorAxisOnColVec = Math.abs(\n vec3.dot(columnCosinesVec, minorAxisVec)\n );\n\n const absoluteOfMajorDotProduct = Math.abs(projectedMajorAxisOnColVec);\n const absoluteOfMinorDotProduct = Math.abs(projectedMinorAxisOnColVec);\n\n renderableData = [];\n if (Math.abs(absoluteOfMajorDotProduct - 1) < EPSILON) {\n renderableData = [\n pointsWorld[0],\n pointsWorld[1],\n pointsWorld[2],\n pointsWorld[3],\n ];\n } else if (Math.abs(absoluteOfMinorDotProduct - 1) < EPSILON) {\n renderableData = [\n pointsWorld[2],\n pointsWorld[3],\n pointsWorld[0],\n pointsWorld[1],\n ];\n } else {\n console.warn('OBLIQUE ELLIPSE NOT YET SUPPORTED');\n }\n break;\n }\n default:\n console.warn('Unsupported GraphicType:', GraphicType);\n }\n\n return renderableData;\n}\n","import { adaptersSR } from '@cornerstonejs/adapters';\n\nconst cornerstoneAdapters =\n adaptersSR.Cornerstone3D.MeasurementReport\n .CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE;\n\nconst supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];\nconst CORNERSTONE_3D_TAG = cornerstoneAdapters.CORNERSTONE_3D_TAG;\n\n/**\n * Checks if the given `displaySet`can be rehydrated into the `measurementService`.\n *\n * @param {object} displaySet The SR `displaySet` to check.\n * @param {object[]} mappings The CornerstoneTools 4 mappings to the `measurementService`.\n * @returns {boolean} True if the SR can be rehydrated into the `measurementService`.\n */\nexport default function isRehydratable(displaySet, mappings) {\n if (!mappings || !mappings.length) {\n return false;\n }\n\n const mappingDefinitions = mappings.map(m => m.annotationType);\n const { measurements } = displaySet;\n\n const adapterKeys = Object.keys(cornerstoneAdapters).filter(\n adapterKey =>\n typeof cornerstoneAdapters[adapterKey]\n .isValidCornerstoneTrackingIdentifier === 'function'\n );\n\n const adapters = [];\n\n adapterKeys.forEach(key => {\n if (mappingDefinitions.includes(key)) {\n // Must have both a dcmjs adapter and a measurementService\n // Definition in order to be a candidate for import.\n adapters.push(cornerstoneAdapters[key]);\n }\n });\n\n for (let i = 0; i < measurements.length; i++) {\n const { TrackingIdentifier } = measurements[i] || {};\n const hydratable = adapters.some(adapter => {\n let [cornerstoneTag, toolName] = TrackingIdentifier.split(':');\n if (supportedLegacyCornerstoneTags.includes(cornerstoneTag)) {\n cornerstoneTag = CORNERSTONE_3D_TAG;\n }\n\n const mappedTrackingIdentifier = `${cornerstoneTag}:${toolName}`;\n\n return adapter.isValidCornerstoneTrackingIdentifier(\n mappedTrackingIdentifier\n );\n });\n\n if (hydratable) {\n return true;\n }\n console.log(\n 'Measurement is not rehydratable',\n TrackingIdentifier,\n measurements[i]\n );\n }\n\n console.log('No measurements found which were rehydratable');\n return false;\n}\n","import { SOPClassHandlerName, SOPClassHandlerId } from './id';\nimport { utils, classes, DisplaySetService, Types } from '@ohif/core';\nimport addMeasurement from './utils/addMeasurement';\nimport isRehydratable from './utils/isRehydratable';\nimport { adaptersSR } from '@cornerstonejs/adapters';\n\ntype InstanceMetadata = Types.InstanceMetadata;\n\nconst { CodeScheme: Cornerstone3DCodeScheme } = adaptersSR.Cornerstone3D;\n\nconst { ImageSet, MetadataProvider: metadataProvider } = classes;\n\n// TODO ->\n// Add SR thumbnail\n// Make viewport\n// Get stacks from referenced displayInstanceUID and load into wrapped CornerStone viewport.\n\nconst sopClassUids = [\n '1.2.840.10008.5.1.4.1.1.88.11', //BASIC_TEXT_SR:\n '1.2.840.10008.5.1.4.1.1.88.22', //ENHANCED_SR:\n '1.2.840.10008.5.1.4.1.1.88.33', //COMPREHENSIVE_SR:\n '1.2.840.10008.5.1.4.1.1.88.34', //COMPREHENSIVE_3D_SR:\n];\n\nconst CORNERSTONE_3D_TOOLS_SOURCE_NAME = 'Cornerstone3DTools';\nconst CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';\n\nconst validateSameStudyUID = (uid: string, instances): void => {\n instances.forEach(it => {\n if (it.StudyInstanceUID !== uid) {\n console.warn('Not all instances have the same UID', uid, it);\n throw new Error(\n `Instances ${it.SOPInstanceUID} does not belong to ${uid}`\n );\n }\n });\n};\n\nconst CodeNameCodeSequenceValues = {\n ImagingMeasurementReport: '126000',\n ImageLibrary: '111028',\n ImagingMeasurements: '126010',\n MeasurementGroup: '125007',\n ImageLibraryGroup: '126200',\n TrackingUniqueIdentifier: '112040',\n TrackingIdentifier: '112039',\n Finding: '121071',\n FindingSite: 'G-C0E3', // SRT\n CornerstoneFreeText: Cornerstone3DCodeScheme.codeValues.CORNERSTONEFREETEXT, //\n};\n\nconst CodingSchemeDesignators = {\n SRT: 'SRT',\n CornerstoneCodeSchemes: [\n Cornerstone3DCodeScheme.CodingSchemeDesignator,\n 'CST4',\n ],\n};\n\nconst RELATIONSHIP_TYPE = {\n INFERRED_FROM: 'INFERRED FROM',\n CONTAINS: 'CONTAINS',\n};\n\nconst CORNERSTONE_FREETEXT_CODE_VALUE = 'CORNERSTONEFREETEXT';\n\n/**\n * Adds instances to the DICOM SR series, rather than creating a new\n * series, so that as SR's are saved, they append to the series, and the\n * key image display set gets updated as well, containing just the new series.\n * @param instances is a list of instances from THIS series that are not\n * in this DICOM SR Display Set already.\n */\nfunction addInstances(\n instances: InstanceMetadata[],\n displaySetService: DisplaySetService\n) {\n this.instances.push(...instances);\n utils.sortStudyInstances(this.instances);\n // The last instance is the newest one, so is the one most interesting.\n // Eventually, the SR viewer should have the ability to choose which SR\n // gets loaded, and to navigate among them.\n this.instance = this.instances[this.instances.length - 1];\n this.isLoaded = false;\n return this;\n}\n\n/**\n * DICOM SR SOP Class Handler\n * For all referenced images in the TID 1500/300 sections, add an image to the\n * display.\n * @param instances is a set of instances all from the same series\n * @param servicesManager is the services that can be used for creating\n * @returns The list of display sets created for the given instances object\n */\nfunction _getDisplaySetsFromSeries(\n instances,\n servicesManager,\n extensionManager\n) {\n // If the series has no instances, stop here\n if (!instances || !instances.length) {\n throw new Error('No instances were provided');\n }\n\n utils.sortStudyInstances(instances);\n // The last instance is the newest one, so is the one most interesting.\n // Eventually, the SR viewer should have the ability to choose which SR\n // gets loaded, and to navigate among them.\n const instance = instances[instances.length - 1];\n\n const {\n StudyInstanceUID,\n SeriesInstanceUID,\n SOPInstanceUID,\n SeriesDescription,\n SeriesNumber,\n SeriesDate,\n ConceptNameCodeSequence,\n SOPClassUID,\n } = instance;\n validateSameStudyUID(instance.StudyInstanceUID, instances);\n\n if (\n !ConceptNameCodeSequence ||\n ConceptNameCodeSequence.CodeValue !==\n CodeNameCodeSequenceValues.ImagingMeasurementReport\n ) {\n servicesManager.services.uiNotificationService.show({\n title: 'DICOM SR',\n message:\n 'OHIF only supports TID1500 Imaging Measurement Report Structured Reports. The SR you’re trying to view is not supported.',\n type: 'warning',\n duration: 6000,\n });\n return [];\n }\n\n const displaySet = {\n //plugin: id,\n Modality: 'SR',\n displaySetInstanceUID: utils.guid(),\n SeriesDescription,\n SeriesNumber,\n SeriesDate,\n SOPInstanceUID,\n SeriesInstanceUID,\n StudyInstanceUID,\n SOPClassHandlerId,\n SOPClassUID,\n instances,\n referencedImages: null,\n measurements: null,\n isDerivedDisplaySet: true,\n isLoaded: false,\n sopClassUids,\n instance,\n addInstances,\n };\n\n displaySet.load = () => _load(displaySet, servicesManager, extensionManager);\n\n return [displaySet];\n}\n\nfunction _load(displaySet, servicesManager, extensionManager) {\n const { displaySetService, measurementService } = servicesManager.services;\n const dataSources = extensionManager.getDataSources();\n const dataSource = dataSources[0];\n\n const { ContentSequence } = displaySet.instance;\n\n displaySet.referencedImages = _getReferencedImagesList(ContentSequence);\n displaySet.measurements = _getMeasurements(ContentSequence);\n\n const mappings = measurementService.getSourceMappings(\n CORNERSTONE_3D_TOOLS_SOURCE_NAME,\n CORNERSTONE_3D_TOOLS_SOURCE_VERSION\n );\n\n displaySet.isHydrated = false;\n displaySet.isRehydratable = isRehydratable(displaySet, mappings);\n displaySet.isLoaded = true;\n\n // Check currently added displaySets and add measurements if the sources exist.\n displaySetService.activeDisplaySets.forEach(activeDisplaySet => {\n _checkIfCanAddMeasurementsToDisplaySet(\n displaySet,\n activeDisplaySet,\n dataSource\n );\n });\n\n // Subscribe to new displaySets as the source may come in after.\n displaySetService.subscribe(\n displaySetService.EVENTS.DISPLAY_SETS_ADDED,\n data => {\n const { displaySetsAdded } = data;\n // If there are still some measurements that have not yet been loaded into cornerstone,\n // See if we can load them onto any of the new displaySets.\n displaySetsAdded.forEach(newDisplaySet => {\n _checkIfCanAddMeasurementsToDisplaySet(\n displaySet,\n newDisplaySet,\n dataSource\n );\n });\n }\n );\n}\n\nfunction _checkIfCanAddMeasurementsToDisplaySet(\n srDisplaySet,\n newDisplaySet,\n dataSource\n) {\n let unloadedMeasurements = srDisplaySet.measurements.filter(\n measurement => measurement.loaded === false\n );\n\n if (unloadedMeasurements.length === 0) {\n // All already loaded!\n return;\n }\n\n if (!newDisplaySet instanceof ImageSet) {\n // This also filters out _this_ displaySet, as it is not an ImageSet.\n return;\n }\n\n const { sopClassUids, images } = newDisplaySet;\n\n // Check if any have the newDisplaySet is the correct SOPClass.\n unloadedMeasurements = unloadedMeasurements.filter(measurement =>\n measurement.coords.some(coord =>\n sopClassUids.includes(coord.ReferencedSOPSequence.ReferencedSOPClassUID)\n )\n );\n\n if (unloadedMeasurements.length === 0) {\n // New displaySet isn't the correct SOPClass, so can't contain the referenced images.\n return;\n }\n\n const SOPInstanceUIDs = [];\n\n unloadedMeasurements.forEach(measurement => {\n const { coords } = measurement;\n\n coords.forEach(coord => {\n const SOPInstanceUID =\n coord.ReferencedSOPSequence.ReferencedSOPInstanceUID;\n\n if (!SOPInstanceUIDs.includes(SOPInstanceUID)) {\n SOPInstanceUIDs.push(SOPInstanceUID);\n }\n });\n });\n\n const imageIdsForDisplaySet = dataSource.getImageIdsForDisplaySet(\n newDisplaySet\n );\n\n for (const imageId of imageIdsForDisplaySet) {\n if (!unloadedMeasurements.length) {\n // All measurements loaded.\n return;\n }\n\n const { SOPInstanceUID, frameNumber } = metadataProvider.getUIDsFromImageID(\n imageId\n );\n\n if (SOPInstanceUIDs.includes(SOPInstanceUID)) {\n for (let j = unloadedMeasurements.length - 1; j >= 0; j--) {\n const measurement = unloadedMeasurements[j];\n if (\n _measurementReferencesSOPInstanceUID(\n measurement,\n SOPInstanceUID,\n frameNumber\n )\n ) {\n addMeasurement(\n measurement,\n imageId,\n newDisplaySet.displaySetInstanceUID\n );\n\n unloadedMeasurements.splice(j, 1);\n }\n }\n }\n }\n}\n\nfunction _measurementReferencesSOPInstanceUID(\n measurement,\n SOPInstanceUID,\n frameNumber\n) {\n const { coords } = measurement;\n\n // NOTE: The ReferencedFrameNumber can be multiple values according to the DICOM\n // Standard. But for now, we will support only one ReferenceFrameNumber.\n const ReferencedFrameNumber =\n (measurement.coords[0].ReferencedSOPSequence &&\n measurement.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber) ||\n 1;\n\n if (frameNumber && Number(frameNumber) !== Number(ReferencedFrameNumber))\n return false;\n\n for (let j = 0; j < coords.length; j++) {\n const coord = coords[j];\n const { ReferencedSOPInstanceUID } = coord.ReferencedSOPSequence;\n\n if (ReferencedSOPInstanceUID === SOPInstanceUID) {\n return true;\n }\n }\n}\n\nfunction getSopClassHandlerModule({ servicesManager, extensionManager }) {\n const getDisplaySetsFromSeries = instances => {\n return _getDisplaySetsFromSeries(\n instances,\n servicesManager,\n extensionManager\n );\n };\n\n return [\n {\n name: SOPClassHandlerName,\n sopClassUids,\n getDisplaySetsFromSeries,\n },\n ];\n}\n\nfunction _getMeasurements(ImagingMeasurementReportContentSequence) {\n const ImagingMeasurements = ImagingMeasurementReportContentSequence.find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.ImagingMeasurements\n );\n\n const MeasurementGroups = _getSequenceAsArray(\n ImagingMeasurements.ContentSequence\n ).filter(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.MeasurementGroup\n );\n\n const mergedContentSequencesByTrackingUniqueIdentifiers = _getMergedContentSequencesByTrackingUniqueIdentifiers(\n MeasurementGroups\n );\n\n const measurements = [];\n\n Object.keys(mergedContentSequencesByTrackingUniqueIdentifiers).forEach(\n trackingUniqueIdentifier => {\n const mergedContentSequence =\n mergedContentSequencesByTrackingUniqueIdentifiers[\n trackingUniqueIdentifier\n ];\n\n const measurement = _processMeasurement(mergedContentSequence);\n\n if (measurement) {\n measurements.push(measurement);\n }\n }\n );\n\n return measurements;\n}\n\nfunction _getMergedContentSequencesByTrackingUniqueIdentifiers(\n MeasurementGroups\n) {\n const mergedContentSequencesByTrackingUniqueIdentifiers = {};\n\n MeasurementGroups.forEach(MeasurementGroup => {\n const ContentSequence = _getSequenceAsArray(\n MeasurementGroup.ContentSequence\n );\n\n const TrackingUniqueIdentifierItem = ContentSequence.find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.TrackingUniqueIdentifier\n );\n\n if (!TrackingUniqueIdentifierItem) {\n console.warn(\n 'No Tracking Unique Identifier, skipping ambiguous measurement.'\n );\n }\n\n const trackingUniqueIdentifier = TrackingUniqueIdentifierItem.UID;\n\n if (\n mergedContentSequencesByTrackingUniqueIdentifiers[\n trackingUniqueIdentifier\n ] === undefined\n ) {\n // Add the full ContentSequence\n mergedContentSequencesByTrackingUniqueIdentifiers[\n trackingUniqueIdentifier\n ] = [...ContentSequence];\n } else {\n // Add the ContentSequence minus the tracking identifier, as we have this\n // Information in the merged ContentSequence anyway.\n ContentSequence.forEach(item => {\n if (\n item.ConceptNameCodeSequence.CodeValue !==\n CodeNameCodeSequenceValues.TrackingUniqueIdentifier\n ) {\n mergedContentSequencesByTrackingUniqueIdentifiers[\n trackingUniqueIdentifier\n ].push(item);\n }\n });\n }\n });\n\n return mergedContentSequencesByTrackingUniqueIdentifiers;\n}\n\nfunction _processMeasurement(mergedContentSequence) {\n if (\n mergedContentSequence.some(\n group => group.ValueType === 'SCOORD' || group.ValueType === 'SCOORD3D'\n )\n ) {\n return _processTID1410Measurement(mergedContentSequence);\n }\n\n return _processNonGeometricallyDefinedMeasurement(mergedContentSequence);\n}\n\nfunction _processTID1410Measurement(mergedContentSequence) {\n // Need to deal with TID 1410 style measurements, which will have a SCOORD or SCOORD3D at the top level,\n // And non-geometric representations where each NUM has \"INFERRED FROM\" SCOORD/SCOORD3D\n\n const graphicItem = mergedContentSequence.find(\n group => group.ValueType === 'SCOORD'\n );\n\n const UIDREFContentItem = mergedContentSequence.find(\n group => group.ValueType === 'UIDREF'\n );\n\n const TrackingIdentifierContentItem = mergedContentSequence.find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.TrackingIdentifier\n );\n\n if (!graphicItem) {\n console.warn(\n `graphic ValueType ${graphicItem.ValueType} not currently supported, skipping annotation.`\n );\n return;\n }\n\n const NUMContentItems = mergedContentSequence.filter(\n group => group.ValueType === 'NUM'\n );\n\n const measurement = {\n loaded: false,\n labels: [],\n coords: [_getCoordsFromSCOORDOrSCOORD3D(graphicItem)],\n TrackingUniqueIdentifier: UIDREFContentItem.UID,\n TrackingIdentifier: TrackingIdentifierContentItem.TextValue,\n };\n\n NUMContentItems.forEach(item => {\n const { ConceptNameCodeSequence, MeasuredValueSequence } = item;\n\n if (MeasuredValueSequence) {\n measurement.labels.push(\n _getLabelFromMeasuredValueSequence(\n ConceptNameCodeSequence,\n MeasuredValueSequence\n )\n );\n }\n });\n\n return measurement;\n}\n\nfunction _processNonGeometricallyDefinedMeasurement(mergedContentSequence) {\n const NUMContentItems = mergedContentSequence.filter(\n group => group.ValueType === 'NUM'\n );\n\n const UIDREFContentItem = mergedContentSequence.find(\n group => group.ValueType === 'UIDREF'\n );\n\n const TrackingIdentifierContentItem = mergedContentSequence.find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.TrackingIdentifier\n );\n\n const finding = mergedContentSequence.find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.Finding\n );\n\n const findingSites = mergedContentSequence.filter(\n item =>\n item.ConceptNameCodeSequence.CodingSchemeDesignator ===\n CodingSchemeDesignators.SRT &&\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.FindingSite\n );\n\n const measurement = {\n loaded: false,\n labels: [],\n coords: [],\n TrackingUniqueIdentifier: UIDREFContentItem.UID,\n TrackingIdentifier: TrackingIdentifierContentItem.TextValue,\n };\n\n if (\n finding &&\n CodingSchemeDesignators.CornerstoneCodeSchemes.includes(\n finding.ConceptCodeSequence.CodingSchemeDesignator\n ) &&\n finding.ConceptCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.CornerstoneFreeText\n ) {\n measurement.labels.push({\n label: CORNERSTONE_FREETEXT_CODE_VALUE,\n value: finding.ConceptCodeSequence.CodeMeaning,\n });\n }\n\n // TODO -> Eventually hopefully support SNOMED or some proper code library, just free text for now.\n if (findingSites.length) {\n const cornerstoneFreeTextFindingSite = findingSites.find(\n FindingSite =>\n CodingSchemeDesignators.CornerstoneCodeSchemes.includes(\n FindingSite.ConceptCodeSequence.CodingSchemeDesignator\n ) &&\n FindingSite.ConceptCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.CornerstoneFreeText\n );\n\n if (cornerstoneFreeTextFindingSite) {\n measurement.labels.push({\n label: CORNERSTONE_FREETEXT_CODE_VALUE,\n value: cornerstoneFreeTextFindingSite.ConceptCodeSequence.CodeMeaning,\n });\n }\n }\n\n NUMContentItems.forEach(item => {\n const {\n ConceptNameCodeSequence,\n ContentSequence,\n MeasuredValueSequence,\n } = item;\n\n const { ValueType } = ContentSequence;\n\n if (!ValueType === 'SCOORD') {\n console.warn(\n `Graphic ${ValueType} not currently supported, skipping annotation.`\n );\n\n return;\n }\n\n const coords = _getCoordsFromSCOORDOrSCOORD3D(ContentSequence);\n\n if (coords) {\n measurement.coords.push(coords);\n }\n\n if (MeasuredValueSequence) {\n measurement.labels.push(\n _getLabelFromMeasuredValueSequence(\n ConceptNameCodeSequence,\n MeasuredValueSequence\n )\n );\n }\n });\n\n return measurement;\n}\n\nfunction _getCoordsFromSCOORDOrSCOORD3D(item) {\n const { ValueType, RelationshipType, GraphicType, GraphicData } = item;\n\n if (\n !(\n RelationshipType == RELATIONSHIP_TYPE.INFERRED_FROM ||\n RelationshipType == RELATIONSHIP_TYPE.CONTAINS\n )\n ) {\n console.warn(\n `Relationshiptype === ${RelationshipType}. Cannot deal with NON TID-1400 SCOORD group with RelationshipType !== \"INFERRED FROM\" or \"CONTAINS\"`\n );\n\n return;\n }\n\n const coords = { ValueType, GraphicType, GraphicData };\n\n // ContentSequence has length of 1 as RelationshipType === 'INFERRED FROM'\n if (ValueType === 'SCOORD') {\n const { ReferencedSOPSequence } = item.ContentSequence;\n\n coords.ReferencedSOPSequence = ReferencedSOPSequence;\n } else if (ValueType === 'SCOORD3D') {\n const { ReferencedFrameOfReferenceSequence } = item.ContentSequence;\n\n coords.ReferencedFrameOfReferenceSequence = ReferencedFrameOfReferenceSequence;\n }\n\n return coords;\n}\n\nfunction _getLabelFromMeasuredValueSequence(\n ConceptNameCodeSequence,\n MeasuredValueSequence\n) {\n const { CodeMeaning } = ConceptNameCodeSequence;\n const { NumericValue, MeasurementUnitsCodeSequence } = MeasuredValueSequence;\n const { CodeValue } = MeasurementUnitsCodeSequence;\n\n const formatedNumericValue = NumericValue\n ? Number(NumericValue).toFixed(2)\n : '';\n\n return {\n label: CodeMeaning,\n value: `${formatedNumericValue} ${CodeValue}`,\n }; // E.g. Long Axis: 31.0 mm\n}\n\nfunction _getReferencedImagesList(ImagingMeasurementReportContentSequence) {\n const ImageLibrary = ImagingMeasurementReportContentSequence.find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.ImageLibrary\n );\n\n const ImageLibraryGroup = _getSequenceAsArray(\n ImageLibrary.ContentSequence\n ).find(\n item =>\n item.ConceptNameCodeSequence.CodeValue ===\n CodeNameCodeSequenceValues.ImageLibraryGroup\n );\n\n const referencedImages = [];\n\n _getSequenceAsArray(ImageLibraryGroup.ContentSequence).forEach(item => {\n const { ReferencedSOPSequence } = item;\n if (!ReferencedSOPSequence) return;\n for (const ref of _getSequenceAsArray(ReferencedSOPSequence)) {\n if (ref.ReferencedSOPClassUID) {\n const { ReferencedSOPClassUID, ReferencedSOPInstanceUID } = ref;\n\n referencedImages.push({\n ReferencedSOPClassUID,\n ReferencedSOPInstanceUID,\n });\n }\n }\n });\n\n return referencedImages;\n}\n\nfunction _getSequenceAsArray(sequence) {\n if (!sequence) return [];\n return Array.isArray(sequence) ? sequence : [sequence];\n}\n\nexport default getSopClassHandlerModule;\n","import { Types } from '@ohif/core';\n\nconst srProtocol: Types.HangingProtocol.Protocol = {\n id: '@ohif/sr',\n // Don't store this hanging protocol as it applies to the currently active\n // display set by default\n // cacheId: null,\n hasUpdatedPriorsInformation: false,\n name: 'SR Key Images',\n // Just apply this one when specifically listed\n protocolMatchingRules: [],\n toolGroupIds: ['default'],\n // -1 would be used to indicate active only, whereas other values are\n // the number of required priors referenced - so 0 means active with\n // 0 or more priors.\n numberOfPriorsReferenced: 0,\n // Default viewport is used to define the viewport when\n // additional viewports are added using the layout tool\n defaultViewport: {\n viewportOptions: {\n viewportType: 'stack',\n toolGroupId: 'default',\n allowUnmatchedView: true,\n },\n displaySets: [\n {\n id: 'srDisplaySetId',\n matchedDisplaySetsIndex: -1,\n },\n ],\n },\n displaySetSelectors: {\n srDisplaySetId: {\n seriesMatchingRules: [\n {\n attribute: 'Modality',\n constraint: {\n equals: 'SR',\n },\n },\n ],\n },\n },\n stages: [\n {\n name: 'SR Key Images',\n viewportStructure: {\n layoutType: 'grid',\n properties: {\n rows: 1,\n columns: 1,\n },\n },\n viewports: [\n {\n viewportOptions: { allowUnmatchedView: true },\n displaySets: [\n {\n id: 'srDisplaySetId',\n },\n ],\n },\n ],\n },\n ],\n};\n\nfunction getHangingProtocolModule() {\n return [\n {\n name: srProtocol.id,\n protocol: srProtocol,\n },\n ];\n}\n\nexport default getHangingProtocolModule;\nexport { srProtocol };\n","import OHIF from '@ohif/core';\nimport { annotation } from '@cornerstonejs/tools';\nconst { log } = OHIF;\n\nfunction getFilteredCornerstoneToolState(\n measurementData,\n additionalFindingTypes\n) {\n const filteredToolState = {};\n\n function addToFilteredToolState(annotation, toolType) {\n if (!annotation.metadata?.referencedImageId) {\n log.warn(\n `[DICOMSR] No referencedImageId found for ${toolType} ${annotation.id}`\n );\n return;\n }\n\n const imageId = annotation.metadata.referencedImageId;\n\n if (!filteredToolState[imageId]) {\n filteredToolState[imageId] = {};\n }\n\n const imageIdSpecificToolState = filteredToolState[imageId];\n\n if (!imageIdSpecificToolState[toolType]) {\n imageIdSpecificToolState[toolType] = {\n data: [],\n };\n }\n\n const measurementDataI = measurementData.find(\n md => md.uid === annotation.annotationUID\n );\n const toolData = imageIdSpecificToolState[toolType].data;\n\n let { finding } = measurementDataI;\n const findingSites = [];\n\n // NOTE -> We use the CORNERSTONEJS coding schemeDesignator which we have\n // defined in the @cornerstonejs/adapters\n if (measurementDataI.label) {\n if (additionalFindingTypes.includes(toolType)) {\n finding = {\n CodeValue: 'CORNERSTONEFREETEXT',\n CodingSchemeDesignator: 'CORNERSTONEJS',\n CodeMeaning: measurementDataI.label,\n };\n } else {\n findingSites.push({\n CodeValue: 'CORNERSTONEFREETEXT',\n CodingSchemeDesignator: 'CORNERSTONEJS',\n CodeMeaning: measurementDataI.label,\n });\n }\n }\n\n if (measurementDataI.findingSites) {\n findingSites.push(...measurementDataI.findingSites);\n }\n\n const measurement = Object.assign({}, annotation, {\n finding,\n findingSites,\n });\n\n toolData.push(measurement);\n }\n\n const uidFilter = measurementData.map(md => md.uid);\n const uids = uidFilter.slice();\n\n const annotationManager = annotation.state.getAnnotationManager();\n const framesOfReference = annotationManager.getFramesOfReference();\n\n for (let i = 0; i < framesOfReference.length; i++) {\n const frameOfReference = framesOfReference[i];\n\n const frameOfReferenceAnnotations = annotationManager.getAnnotations(\n frameOfReference\n );\n\n const toolTypes = Object.keys(frameOfReferenceAnnotations);\n\n for (let j = 0; j < toolTypes.length; j++) {\n const toolType = toolTypes[j];\n\n const annotations = frameOfReferenceAnnotations[toolType];\n\n if (annotations) {\n for (let k = 0; k < annotations.length; k++) {\n const annotation = annotations[k];\n const uidIndex = uids.findIndex(\n uid => uid === annotation.annotationUID\n );\n\n if (uidIndex !== -1) {\n addToFilteredToolState(annotation, toolType);\n uids.splice(uidIndex, 1);\n\n if (!uids.length) {\n return filteredToolState;\n }\n }\n }\n }\n }\n }\n\n return filteredToolState;\n}\n\nexport default getFilteredCornerstoneToolState;\n","import { metaData, utilities } from '@cornerstonejs/core';\n\nimport OHIF, { DicomMetadataStore } from '@ohif/core';\nimport dcmjs from 'dcmjs';\nimport { adaptersSR } from '@cornerstonejs/adapters';\n\nimport getFilteredCornerstoneToolState from './utils/getFilteredCornerstoneToolState';\n\nconst { MeasurementReport } = adaptersSR.Cornerstone3D;\nconst { log } = OHIF;\n\n/**\n *\n * @param measurementData An array of measurements from the measurements service\n * that you wish to serialize.\n * @param additionalFindingTypes toolTypes that should be stored with labels as Findings\n * @param options Naturalized DICOM JSON headers to merge into the displaySet.\n *\n */\nconst _generateReport = (\n measurementData,\n additionalFindingTypes,\n options = {}\n) => {\n const filteredToolState = getFilteredCornerstoneToolState(\n measurementData,\n additionalFindingTypes\n );\n\n const report = MeasurementReport.generateReport(\n filteredToolState,\n metaData,\n utilities.worldToImageCoords,\n options\n );\n\n const { dataset } = report;\n\n // Set the default character set as UTF-8\n // https://dicom.innolitics.com/ciods/nm-image/sop-common/00080005\n if (typeof dataset.SpecificCharacterSet === 'undefined') {\n dataset.SpecificCharacterSet = 'ISO_IR 192';\n }\n return dataset;\n};\n\nconst commandsModule = ({}) => {\n const actions = {\n /**\n *\n * @param measurementData An array of measurements from the measurements service\n * @param additionalFindingTypes toolTypes that should be stored with labels as Findings\n * @param options Naturalized DICOM JSON headers to merge into the displaySet.\n * as opposed to Finding Sites.\n * that you wish to serialize.\n */\n downloadReport: ({\n measurementData,\n additionalFindingTypes,\n options = {},\n }) => {\n const srDataset = actions.generateReport(\n measurementData,\n additionalFindingTypes,\n options\n );\n const reportBlob = dcmjs.data.datasetToBlob(srDataset);\n\n //Create a URL for the binary.\n var objectUrl = URL.createObjectURL(reportBlob);\n window.location.assign(objectUrl);\n },\n\n /**\n *\n * @param measurementData An array of measurements from the measurements service\n * that you wish to serialize.\n * @param dataSource The dataSource that you wish to use to persist the data.\n * @param additionalFindingTypes toolTypes that should be stored with labels as Findings\n * @param options Naturalized DICOM JSON headers to merge into the displaySet.\n * @return The naturalized report\n */\n storeMeasurements: async ({\n measurementData,\n dataSource,\n additionalFindingTypes,\n options = {},\n }) => {\n // Use the @cornerstonejs adapter for converting to/from DICOM\n // But it is good enough for now whilst we only have cornerstone as a datasource.\n log.info('[DICOMSR] storeMeasurements');\n\n if (!dataSource || !dataSource.store || !dataSource.store.dicom) {\n log.error(\n '[DICOMSR] datasource has no dataSource.store.dicom endpoint!'\n );\n return Promise.reject({});\n }\n\n try {\n const naturalizedReport = _generateReport(\n measurementData,\n additionalFindingTypes,\n options\n );\n\n const { StudyInstanceUID, ContentSequence } = naturalizedReport;\n // The content sequence has 5 or more elements, of which\n // the `[4]` element contains the annotation data, so this is\n // checking that there is some annotation data present.\n if (!ContentSequence?.[4].ContentSequence?.length) {\n console.log(\n 'naturalizedReport missing imaging content',\n naturalizedReport\n );\n throw new Error('Invalid report, no content');\n }\n\n await dataSource.store.dicom(naturalizedReport);\n\n if (StudyInstanceUID) {\n dataSource.deleteStudyMetadataPromise(StudyInstanceUID);\n }\n\n // The \"Mode\" route listens for DicomMetadataStore changes\n // When a new instance is added, it listens and\n // automatically calls makeDisplaySets\n DicomMetadataStore.addInstances([naturalizedReport], true);\n\n return naturalizedReport;\n } catch (error) {\n console.warn(error);\n log.error(\n `[DICOMSR] Error while saving the measurements: ${error.message}`\n );\n throw new Error(\n error.message || 'Error while saving the measurements.'\n );\n }\n },\n };\n\n const definitions = {\n downloadReport: {\n commandFn: actions.downloadReport,\n storeContexts: [],\n options: {},\n },\n storeMeasurements: {\n commandFn: actions.storeMeasurements,\n storeContexts: [],\n options: {},\n },\n };\n\n return {\n actions,\n definitions,\n defaultContext: 'CORNERSTONE_STRUCTURED_REPORT',\n };\n};\n\nexport default commandsModule;\n","import { addTool } from '@cornerstonejs/tools';\n\nexport default function addToolInstance(\n name: string,\n toolClass,\n configuration?\n): void {\n class InstanceClass extends toolClass {\n static toolName = name;\n }\n addTool(InstanceClass);\n}\n","import { DisplaySetService, classes } from '@ohif/core';\n\nconst ImageSet = classes.ImageSet;\n\nconst findInstance = (measurement, displaySetService: DisplaySetService) => {\n const { displaySetInstanceUID, ReferencedSOPInstanceUID: sopUid } =\n measurement;\n const referencedDisplaySet = displaySetService.getDisplaySetByUID(\n displaySetInstanceUID\n );\n if (!referencedDisplaySet.images) return;\n return referencedDisplaySet.images.find(it => it.SOPInstanceUID === sopUid);\n};\n\n/** Finds references to display sets inside the measurements\n * contained within the provided display set.\n * @return an array of instances referenced.\n */\nconst findReferencedInstances = (\n displaySetService: DisplaySetService,\n displaySet\n) => {\n const instances = [];\n const instanceById = {};\n for (const measurement of displaySet.measurements) {\n const { imageId } = measurement;\n if (!imageId) continue;\n if (instanceById[imageId]) continue;\n\n const instance = findInstance(measurement, displaySetService);\n if (!instance) {\n console.log('Measurement', measurement, 'had no instances found');\n continue;\n }\n\n instanceById[imageId] = instance;\n instances.push(instance);\n }\n return instances;\n};\n\n/**\n * Creates a new display set containing a single image instance for each\n * referenced image.\n *\n * @param displaySetService\n * @param displaySet - containing measurements referencing images.\n * @returns A new (registered/active) display set containing the referenced images\n */\nconst createReferencedImageDisplaySet = (displaySetService, displaySet) => {\n const instances = findReferencedInstances(displaySetService, displaySet);\n // This will be a member function of the created image set\n const updateInstances = function() {\n this.images.splice(\n 0,\n this.images.length,\n ...findReferencedInstances(displaySetService, displaySet)\n );\n this.numImageFrames = this.images.length;\n };\n\n const imageSet = new ImageSet(instances);\n const instance = instances[0];\n imageSet.setAttributes({\n displaySetInstanceUID: imageSet.uid, // create a local alias for the imageSet UID\n SeriesDate: instance.SeriesDate,\n SeriesTime: instance.SeriesTime,\n SeriesInstanceUID: imageSet.uid,\n StudyInstanceUID: instance.StudyInstanceUID,\n SeriesNumber: instance.SeriesNumber || 0,\n SOPClassUID: instance.SOPClassUID,\n SeriesDescription: `${displaySet.SeriesDescription} KO ${displaySet.instance.SeriesNumber}`,\n Modality: 'KO',\n isMultiFrame: false,\n numImageFrames: instances.length,\n SOPClassHandlerId: `@ohif/extension-default.sopClassHandlerModule.stack`,\n isReconstructable: false,\n // This object is made of multiple instances from other series\n isCompositeStack: true,\n madeInClient: true,\n excludeFromThumbnailBrowser: true,\n updateInstances,\n });\n\n displaySetService.addDisplaySets(imageSet);\n\n return imageSet;\n};\n\nexport default createReferencedImageDisplaySet;\n","import React from 'react';\nimport getSopClassHandlerModule from './getSopClassHandlerModule';\nimport getHangingProtocolModule, {\n srProtocol,\n} from './getHangingProtocolModule';\nimport onModeEnter from './onModeEnter';\nimport getCommandsModule from './commandsModule';\nimport preRegistration from './init';\nimport { id } from './id.js';\nimport toolNames from './tools/toolNames';\nimport hydrateStructuredReport from './utils/hydrateStructuredReport';\nimport createReferencedImageDisplaySet from './utils/createReferencedImageDisplaySet';\n\nconst Component = React.lazy(() => {\n return import(\n /* webpackPrefetch: true */ './viewports/OHIFCornerstoneSRViewport'\n );\n});\n\nconst OHIFCornerstoneSRViewport = props => {\n return (\n <React.Suspense fallback={<div>Loading...</div>}>\n <Component {...props} />\n </React.Suspense>\n );\n};\n\n/**\n *\n */\nconst dicomSRExtension = {\n /**\n * Only required property. Should be a unique value across all extensions.\n */\n id,\n onModeEnter,\n\n preRegistration,\n\n /**\n *\n *\n * @param {object} [configuration={}]\n * @param {object|array} [configuration.csToolsConfig] - Passed directly to `initCornerstoneTools`\n */\n getViewportModule({ servicesManager, extensionManager }) {\n const ExtendedOHIFCornerstoneSRViewport = props => {\n return (\n <OHIFCornerstoneSRViewport\n servicesManager={servicesManager}\n extensionManager={extensionManager}\n {...props}\n />\n );\n };\n\n return [{ name: 'dicom-sr', component: ExtendedOHIFCornerstoneSRViewport }];\n },\n getCommandsModule,\n getSopClassHandlerModule,\n // Include dynmically computed values such as toolNames not known till instantiation\n getUtilityModule({ servicesManager }) {\n return [\n {\n name: 'tools',\n exports: {\n toolNames,\n },\n },\n ];\n },\n};\n\nexport default dicomSRExtension;\n\n// Put static exports here so they can be type checked\nexport { hydrateStructuredReport, createReferencedImageDisplaySet, srProtocol };\n","import { SOPClassHandlerId } from './id';\n\nexport default function onModeEnter({ servicesManager }) {\n const { displaySetService } = servicesManager.services;\n const displaySetCache = displaySetService.getDisplaySetCache();\n\n const srDisplaySets = [...displaySetCache.values()].filter(\n ds => ds.SOPClassHandlerId === SOPClassHandlerId\n );\n\n srDisplaySets.forEach(ds => {\n // New mode route, allow SRs to be hydrated again\n ds.isHydrated = false;\n });\n}\n","import {\n addTool,\n AngleTool,\n annotation,\n ArrowAnnotateTool,\n BidirectionalTool,\n CobbAngleTool,\n EllipticalROITool,\n CircleROITool,\n LengthTool,\n PlanarFreehandROITool,\n} from '@cornerstonejs/tools';\nimport DICOMSRDisplayTool from './tools/DICOMSRDisplayTool';\nimport addToolInstance from './utils/addToolInstance';\nimport { Types } from '@ohif/core';\nimport toolNames from './tools/toolNames';\n\n/**\n * @param {object} configuration\n */\nexport default function init({\n configuration = {},\n}: Types.Extensions.ExtensionParams): void {\n addTool(DICOMSRDisplayTool);\n addToolInstance(toolNames.SRLength, LengthTool, {});\n addToolInstance(toolNames.SRBidirectional, BidirectionalTool);\n addToolInstance(toolNames.SREllipticalROI, EllipticalROITool);\n addToolInstance(toolNames.SRCircleROI, CircleROITool);\n addToolInstance(toolNames.SRArrowAnnotate, ArrowAnnotateTool);\n addToolInstance(toolNames.SRAngle, AngleTool);\n // TODO - fix the SR display of Cobb Angle, as it joins the two lines\n addToolInstance(toolNames.SRCobbAngle, CobbAngleTool);\n // TODO - fix the rehydration of Freehand, as it throws an exception\n // on a missing polyline. The fix is probably in CS3D\n addToolInstance(toolNames.SRPlanarFreehandROI, PlanarFreehandROITool);\n\n // Modify annotation tools to use dashed lines on SR\n const dashedLine = {\n lineDash: '4,4',\n };\n annotation.config.style.setToolGroupToolStyles('SRToolGroup', {\n SRLength: dashedLine,\n SRBidirectional: dashedLine,\n SREllipticalROI: dashedLine,\n SRCircleROI: dashedLine,\n SRArrowAnnotate: dashedLine,\n SRCobbAngle: dashedLine,\n SRAngle: dashedLine,\n SRPlanarFreehandROI: dashedLine,\n global: {},\n });\n}\n"],"names":["root","factory","exports","module","require","define","amd","globalThis","__WEBPACK_EXTERNAL_MODULE__762__","__WEBPACK_EXTERNAL_MODULE__845__","__WEBPACK_EXTERNAL_MODULE__867__","__WEBPACK_EXTERNAL_MODULE__464__","__WEBPACK_EXTERNAL_MODULE__32__","__WEBPACK_EXTERNAL_MODULE__836__","__WEBPACK_EXTERNAL_MODULE__369__","deferred","installedChunks","state","TrackingUniqueIdentifier","trackingIdentifiersByViewportId","setTrackingUniqueIdentifiersForElement","element","trackingUniqueIdentifiers","activeIndex","arguments","length","undefined","enabledElement","getEnabledElement","viewport","id","getTrackingUniqueIdentifiersForElement","guid","OHIF","MeasurementReport","CORNERSTONE_3D_TAG","adaptersSR","CORNERSTONE_3D_TOOLS_SOURCE_NAME","CORNERSTONE_3D_TOOLS_SOURCE_VERSION","supportedLegacyCornerstoneTags","convertCode","codingValues","code","CodingSchemeDesignator","ref","CodeValue","text","CodeMeaning","convertSites","sites","ret","i","site","push","hydrateStructuredReport","_ref","displaySetInstanceUID","servicesManager","extensionManager","dataSource","getActiveDataSource","measurementService","displaySetService","customizationService","services","getCustomization","displaySet","getDisplaySetByUID","mappings","getSourceMappings","Error","instance","DicomMetadataStore","StudyInstanceUID","SeriesInstanceUID","SOPInstanceUID","sopInstanceUIDToImageId","imageIdsForToolState","measurements","forEach","measurement","ReferencedSOPInstanceUID","imageId","frameNumber","datasetToUse","dataset","REPORT","GROUP","TRACKING_IDENTIFIER","imagingMeasurementContent","toArray","ContentSequence","find","codeMeaningEquals","measurementGroups","filter","measurementData","cornerstoneToolClasses","CORNERSTONE_TOOL_CLASSES_BY_UTILITY_TYPE","registeredToolClasses","Object","keys","key","measurementGroup","index","TrackingIdentifierGroup","contentItem","ConceptNameCodeSequence","TrackingIdentifier","TextValue","cornerstoneTag","toolName","split","includes","mappedTrackingIdentifier","_mapLegacyDataSet","storedMeasurementByAnnotationType","generateToolState","utilities","metaData","mappingDefinitions","map","m","annotationType","hydratableMeasurementsInSR","imageIds","targetStudyInstanceUID","toolData","annotation","data","sopInstanceUid","SeriesInstanceUIDs","console","warn","uid","FrameOfReferenceUID","annotationUID","metadata","referencedImageId","source","getSource","label","findingSites","finding","freeTextLabel","fs","getLabelFromDCMJSImportedToolData","matchingMapping","addRawMeasurement","toMeasurementSchema","isHydrated","x","Array","isArray","codeMeaningName","create","_console","_len","args","_key","concat","apply","alreadyWarned","_len2","_key2","Date","loadNamespaces","i18n","ns","cb","isInitialized","on","initialized","setTimeout","off","obj","Symbol","iterator","constructor","prototype","_toPropertyKey","arg","input","hint","prim","toPrimitive","res","call","TypeError","String","Number","value","defineProperty","enumerable","configurable","writable","matchHtmlEntity","htmlEntities","unescapeHtmlEntity","defaultOptions","bindI18n","bindI18nStore","transEmptyNodeValue","transSupportBasicHtmlNodes","transWrapTextNodes","transKeepBasicHtmlNodesFor","useSuspense","unescape","replace","i18nInstance","_defineProperties","target","props","descriptor","createContext","ReportNamespaces","Constructor","_classCallCheck","this","usedNamespaces","protoProps","staticProps","namespaces","_this","_arrayLikeToArray","arr","len","arr2","_i","_s","_e","_x","_r","_arr","_n","_d","next","done","err","o","minLen","n","toString","slice","name","from","test","object","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","getOwnPropertyDescriptors","defineProperties","usePrevious","ignore","useRef","useEffect","current","i18nFromProps","useContext","i18nFromContext","defaultNSFromContext","defaultNS","reportNamespaces","notReadyT","k","optsOrDefaultValue","defaultValue","retNotReady","t","ready","options","react","wait","i18nOptions","keyPrefix","addUsedNamespaces","initializedStoreOnce","every","languages","ignoreJSONStructure","hasLoadedNamespace","precheck","loadNotPending","indexOf","backendConnector","backend","isLanguageChangingTo","lng","fallbackLng","lastLng","toLowerCase","l","loadState","hasResourceBundle","resources","partialBundledLanguages","oldI18nextHasLoadedNamespace","getT","getFixedT","nsMode","_useState2","useState","setT","joinedNS","join","previousJoinedNS","isMounted","boundReset","store","e","isInitial","Promise","resolve","formatDate","utils","OHIFCornerstoneSRViewport","children","displaySets","viewportIndex","viewportLabel","viewportOptions","cornerstoneViewportService","srDisplaySet","viewportGrid","viewportGridService","useViewportGrid","measurementSelected","setMeasurementSelected","measurementCount","setMeasurementCount","activeImageDisplaySetData","setActiveImageDisplaySetData","referencedDisplaySetMetadata","setReferencedDisplaySetMetadata","setElement","viewports","activeViewportIndex","trackedMeasurements","sendTrackedMeasurementsEvent","registeredExtensionIds","contextModule","getModuleEntry","tracked","context","eventName","clearMeasurements","getDisplaySetsForSeries","setDisplaySetsForViewports","displaySetInstanceUIDs","setTrackingIdentifiers","useCallback","onElementEnabled","evt","detail","updateViewport","newMeasurementSelected","sopClassUids","async","referencedDisplaySet","image0","images","PatientID","PatientName","PatientSex","PatientAge","SliceThickness","StudyDate","SeriesDescription","SeriesNumber","ManufacturerModelName","SpacingBetweenSlices","_getViewportReferencedDisplaySetData","then","_ref2","viewportInfo","getViewportInfoByIndex","csViewport","getCornerstoneViewport","getViewportId","imageIdIndex","getImageIds","setImageIdIndex","component","Component","initialImageIndex","findIndex","image","React","_extends","toolGroupId","viewportType","positionIds","onMeasurementChange","direction","onDisplaySetsRemovedSubscription","subscribe","EVENTS","DISPLAY_SETS_REMOVED","_ref3","activeViewport","setDisplaySetsForViewport","unsubscribe","isLoaded","load","numMeasurements","isLocked","trackedSeries","childrenWithProps","child","ViewportActionBar","onDoubleClick","stopPropagation","preventDefault","onArrowsClick","getStatusComponent","_ref4","isRehydratable","handleMouseUp","useTranslation","loadStr","ToolTipMessage","StatusIcon","Icon","StatusArea","className","onMouseUp","Tooltip","content","position","_getStatusComponent","isTracked","studyData","useAltStyling","studyDate","currentSeries","seriesDescription","patientInformation","patientName","Alphabetic","patientSex","patientAge","MRN","thickness","toFixed","spacing","scanner","propTypes","PropTypes","customProps","ServicesManager","isRequired","ExtensionManager","defaultProps","hasOwnProperty","propIsEnumerable","propertyIsEnumerable","assign","test1","getOwnPropertyNames","test2","fromCharCode","test3","letter","shouldUseNative","to","val","toObject","s","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","propName","componentName","location","propFullName","secret","getShim","ReactPropTypes","array","bigint","bool","func","number","string","symbol","any","arrayOf","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","p","Fragment","StrictMode","Profiler","q","r","Suspense","u","v","for","w","z","a","b","c","encodeURIComponent","A","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","B","C","refs","updater","D","E","isReactComponent","setState","forceUpdate","F","isPureReactComponent","G","H","I","__self","__source","J","d","h","g","f","$$typeof","type","_owner","L","M","N","escape","O","K","y","P","Q","_status","_result","default","R","S","T","ReactCurrentDispatcher","ReactCurrentBatchConfig","transition","ReactCurrentOwner","IsSomeRendererActing","Children","count","only","PureComponent","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","cloneElement","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","createElement","createFactory","bind","createRef","forwardRef","render","isValidElement","lazy","_payload","_init","memo","compare","useDebugValue","useImperativeHandle","useLayoutEffect","useMemo","useReducer","version","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","splice","chunkId","getter","__esModule","definition","get","prop","toStringTag","link","document","nc","setAttribute","rel","as","href","head","appendChild","packageJson","SOPClassHandlerName","SOPClassHandlerId","POINT","MULTIPOINT","POLYLINE","CIRCLE","ELLIPSE","DICOMSRDisplayTool","AnnotationTool","super","configuration","isPointNearTool","getHandleNearImagePoint","renderAnnotation","svgDrawingHelper","annotations","getToolName","filterInteractableAnnotationsForElement","trackingUniqueIdentifiersForElement","activeTrackingUniqueIdentifier","filteredAnnotations","cachedStats","_actors","size","styleSpecifier","viewportId","renderableData","lineWidth","getStyle","lineDash","color","GraphicType","renderableDataForGraphicType","renderMethod","canvasCoordinatesAdapter","SCOORD_TYPES","renderPoint","renderMultipoint","renderPolyLine","renderEllipse","canvasCoordinates","renderTextBox","_getTextBoxLinesFromLabels","labels","labelLength","Math","min","lines","labelEntry","_labelToShorthand","drawingOptions","width","allCanvasCoordinates","worldToCanvas","lineUID","drawing","point","imagePixelModule","xOffset","yOffset","columns","rows","imagePoint","csUtils","arrowEnd","arrowUID","ellipsePointsWorld","rotation","getRotation","canvasCorners","adaptedCanvasCoordinates","textLines","canvasTextBoxCoords","handles","textBox","worldPosition","canvasToWorld","textBoxPosition","textBoxOptions","getLinkedTextBoxStyle","boundingBox","left","top","height","worldBoundingBox","topLeft","topRight","bottomLeft","bottomRight","SHORT_HAND_MAP","AREA","Length","CORNERSTONEFREETEXT","shortHand","DICOMSRDisplay","SRLength","SRBidirectional","SREllipticalROI","SRCircleROI","SRArrowAnnotate","SRAngle","SRCobbAngle","SRRectangleROI","SRPlanarFreehandROI","EPSILON","addMeasurement","toolNames","coords","coord","GraphicData","worldPos","pointsWorld","center","onPerimeter","radius","vec3","imagePlaneModule","columnCosines","rowCosines","firstAxisStart","firstAxisEnd","secondAxisStart","secondAxisEnd","majorAxisStart","majorAxisEnd","minorAxisStart","minorAxisEnd","majorAxisVec","minorAxisVec","columnCosinesVec","projectedMajorAxisOnColVec","abs","projectedMinorAxisOnColVec","absoluteOfMajorDotProduct","absoluteOfMinorDotProduct","_getRenderableData","annotationManager","ReferencedSOPSequence","ReferencedFrameNumber","SRAnnotation","frameOfReferenceUID","addAnnotation","loaded","cornerstoneAdapters","CodeScheme","Cornerstone3DCodeScheme","ImageSet","MetadataProvider","metadataProvider","classes","validateSameStudyUID","instances","it","CodeNameCodeSequenceValues","ImagingMeasurementReport","ImageLibrary","ImagingMeasurements","MeasurementGroup","ImageLibraryGroup","Finding","FindingSite","CornerstoneFreeText","codeValues","CodingSchemeDesignators","SRT","CornerstoneCodeSchemes","RELATIONSHIP_TYPE","INFERRED_FROM","CONTAINS","CORNERSTONE_FREETEXT_CODE_VALUE","addInstances","_getDisplaySetsFromSeries","SeriesDate","SOPClassUID","uiNotificationService","show","title","message","duration","Modality","referencedImages","isDerivedDisplaySet","dataSources","getDataSources","ImagingMeasurementReportContentSequence","_getSequenceAsArray","item","ReferencedSOPClassUID","_getReferencedImagesList","mergedContentSequencesByTrackingUniqueIdentifiers","MeasurementGroups","TrackingUniqueIdentifierItem","trackingUniqueIdentifier","UID","_getMergedContentSequencesByTrackingUniqueIdentifiers","mergedContentSequence","some","group","ValueType","graphicItem","UIDREFContentItem","TrackingIdentifierContentItem","NUMContentItems","_getCoordsFromSCOORDOrSCOORD3D","MeasuredValueSequence","_getLabelFromMeasuredValueSequence","_processTID1410Measurement","ConceptCodeSequence","cornerstoneFreeTextFindingSite","_processNonGeometricallyDefinedMeasurement","_processMeasurement","_getMeasurements","adapterKeys","adapterKey","isValidCornerstoneTrackingIdentifier","adapters","adapter","log","activeDisplaySets","activeDisplaySet","_checkIfCanAddMeasurementsToDisplaySet","DISPLAY_SETS_ADDED","displaySetsAdded","newDisplaySet","_load","unloadedMeasurements","SOPInstanceUIDs","imageIdsForDisplaySet","getImageIdsForDisplaySet","getUIDsFromImageID","_measurementReferencesSOPInstanceUID","RelationshipType","ReferencedFrameOfReferenceSequence","NumericValue","MeasurementUnitsCodeSequence","sequence","getDisplaySetsFromSeries","srProtocol","hasUpdatedPriorsInformation","protocolMatchingRules","toolGroupIds","numberOfPriorsReferenced","defaultViewport","allowUnmatchedView","matchedDisplaySetsIndex","displaySetSelectors","srDisplaySetId","seriesMatchingRules","attribute","constraint","equals","stages","viewportStructure","layoutType","properties","additionalFindingTypes","filteredToolState","addToFilteredToolState","toolType","imageIdSpecificToolState","measurementDataI","md","uids","framesOfReference","getFramesOfReference","frameOfReference","frameOfReferenceAnnotations","getAnnotations","toolTypes","uidIndex","actions","downloadReport","srDataset","generateReport","reportBlob","dcmjs","objectUrl","URL","createObjectURL","window","storeMeasurements","info","dicom","error","reject","naturalizedReport","getFilteredCornerstoneToolState","report","SpecificCharacterSet","_generateReport","deleteStudyMetadataPromise","definitions","commandFn","storeContexts","defaultContext","addToolInstance","toolClass","InstanceClass","addTool","findInstance","sopUid","findReferencedInstances","instanceById","createReferencedImageDisplaySet","imageSet","setAttributes","SeriesTime","isMultiFrame","numImageFrames","isReconstructable","isCompositeStack","madeInClient","excludeFromThumbnailBrowser","updateInstances","addDisplaySets","fallback","onModeEnter","getDisplaySetCache","values","ds","preRegistration","LengthTool","BidirectionalTool","EllipticalROITool","CircleROITool","ArrowAnnotateTool","AngleTool","CobbAngleTool","PlanarFreehandROITool","dashedLine","global","getViewportModule","getCommandsModule","getSopClassHandlerModule","getUtilityModule"],"sourceRoot":""}