@cornerstonejs/adapters 5.0.0-beta.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/adapters/Cornerstone/Angle.js +23 -16
- package/dist/esm/adapters/Cornerstone/ArrowAnnotate.js +14 -19
- package/dist/esm/adapters/Cornerstone/Bidirectional.js +22 -27
- package/dist/esm/adapters/Cornerstone/CircleRoi.js +21 -27
- package/dist/esm/adapters/Cornerstone/CobbAngle.js +23 -16
- package/dist/esm/adapters/Cornerstone/EllipticalRoi.js +20 -26
- package/dist/esm/adapters/Cornerstone/FreehandRoi.js +22 -26
- package/dist/esm/adapters/Cornerstone/Length.js +19 -16
- package/dist/esm/adapters/Cornerstone/MeasurementReport.js +20 -40
- package/dist/esm/adapters/Cornerstone/ParametricMap.js +27 -38
- package/dist/esm/adapters/Cornerstone/RectangleRoi.js +27 -26
- package/dist/esm/adapters/Cornerstone/Segmentation_3X.js +19 -31
- package/dist/esm/adapters/Cornerstone/Segmentation_4X.js +69 -90
- package/dist/esm/adapters/Cornerstone/index.d.ts +11 -11
- package/dist/esm/adapters/Cornerstone3D/Angle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Angle.js +19 -26
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/ArrowAnnotate.js +24 -38
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/BaseAdapter3D.js +20 -31
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Bidirectional.js +27 -39
- package/dist/esm/adapters/Cornerstone3D/CircleROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CircleROI.js +29 -37
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/CobbAngle.js +27 -30
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/ControlPointPolyline.js +85 -0
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/EllipticalROI.js +27 -35
- package/dist/esm/adapters/Cornerstone3D/KeyImage.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/KeyImage.js +5 -11
- package/dist/esm/adapters/Cornerstone3D/LabelData.d.ts +3 -1
- package/dist/esm/adapters/Cornerstone3D/LabelData.js +41 -33
- package/dist/esm/adapters/Cornerstone3D/Length.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Length.js +21 -29
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.d.ts +2 -1
- package/dist/esm/adapters/Cornerstone3D/MeasurementReport.js +108 -120
- package/dist/esm/adapters/Cornerstone3D/ParametricMap/generateToolState.js +2 -6
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.d.ts +11 -1
- package/dist/esm/adapters/Cornerstone3D/PlanarFreehandROI.js +58 -44
- package/dist/esm/adapters/Cornerstone3D/Probe.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Probe.js +21 -32
- package/dist/esm/adapters/Cornerstone3D/RTStruct/RTSS.js +14 -30
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/RTStruct/index.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedFrameOfReferenceSequence.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getReferencedSeriesSequence.js +7 -13
- package/dist/esm/adapters/Cornerstone3D/RTStruct/utilities/getStructureSetModule.js +1 -3
- package/dist/esm/adapters/Cornerstone3D/RectangleROI.js +30 -32
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/Segmentation/compactMergeSegData.js +5 -9
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateLabelMaps2DFrom3D.js +2 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateSegmentation.js +6 -16
- package/dist/esm/adapters/Cornerstone3D/Segmentation/generateToolState.js +3 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/index.d.ts +4 -4
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.d.ts +2 -2
- package/dist/esm/adapters/Cornerstone3D/Segmentation/labelmapImagesFromBuffer.js +147 -179
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.d.ts +1 -1
- package/dist/esm/adapters/Cornerstone3D/UltrasoundDirectional.js +15 -26
- package/dist/esm/adapters/Cornerstone3D/constants/index.d.ts +10 -0
- package/dist/esm/adapters/Cornerstone3D/constants/index.js +12 -2
- package/dist/esm/adapters/Cornerstone3D/metricHandler.js +57 -24
- package/dist/esm/adapters/Cornerstone3D/unitMapper.d.ts +5 -0
- package/dist/esm/adapters/Cornerstone3D/unitMapper.js +16 -0
- package/dist/esm/adapters/VTKjs/Segmentation.js +2 -4
- package/dist/esm/adapters/VTKjs/index.d.ts +1 -1
- package/dist/esm/adapters/enums/index.d.ts +1 -1
- package/dist/esm/adapters/helpers/checkOrientation.js +5 -7
- package/dist/esm/adapters/helpers/downloadDICOMData.js +1 -3
- package/dist/esm/adapters/helpers/getDatasetsFromImages.js +3 -7
- package/dist/esm/adapters/helpers/index.d.ts +9 -9
- package/dist/esm/adapters/helpers/scoordToWorld.d.ts +1 -1
- package/dist/esm/adapters/helpers/scoordToWorld.js +5 -13
- package/dist/esm/adapters/helpers/toPoint3.d.ts +1 -1
- package/dist/esm/adapters/helpers/toPoint3.js +1 -3
- package/dist/esm/adapters/helpers/toScoordType.d.ts +1 -1
- package/dist/esm/adapters/helpers/toScoordType.js +3 -7
- package/dist/esm/adapters/index.d.ts +4 -4
- package/dist/esm/adapters/index.js +3 -2
- package/dist/esm/utilities/createInstance.js +9 -8
- package/dist/esm/utilities/referencedMetadataProvider.d.ts +3 -4
- package/dist/esm/utilities/referencedMetadataProvider.js +8 -14
- package/dist/esm/version.d.ts +1 -1
- package/package.json +13 -9
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/defineProperty.js +0 -12
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +0 -14
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +0 -9
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/typeof.js +0 -11
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Angle: TID300Angle
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Angle = utilities.TID300.Angle;
|
|
11
10
|
const ANGLE = 'Angle';
|
|
12
11
|
class Angle {
|
|
13
12
|
/**
|
|
14
13
|
* Generate TID300 measurement data for a plane angle measurement - use a Angle, but label it as Angle
|
|
15
14
|
*/
|
|
16
15
|
static getMeasurementData(MeasurementGroup) {
|
|
17
|
-
const
|
|
18
|
-
defaultState,
|
|
19
|
-
NUMGroup,
|
|
20
|
-
SCOORDGroup
|
|
21
|
-
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup);
|
|
16
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
17
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
18
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
19
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
22
20
|
const state = _objectSpread(_objectSpread({}, defaultState), {}, {
|
|
23
21
|
rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
24
22
|
toolType: Angle.toolType,
|
|
@@ -35,15 +33,21 @@ class Angle {
|
|
|
35
33
|
}
|
|
36
34
|
}
|
|
37
35
|
});
|
|
38
|
-
|
|
36
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
|
|
37
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
38
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
39
|
+
state.handles.middle.x = _SCOORDGroup$GraphicD[2];
|
|
40
|
+
state.handles.middle.y = _SCOORDGroup$GraphicD[3];
|
|
41
|
+
state.handles.middle.x = _SCOORDGroup$GraphicD[4];
|
|
42
|
+
state.handles.middle.y = _SCOORDGroup$GraphicD[5];
|
|
43
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[6];
|
|
44
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[7];
|
|
39
45
|
return state;
|
|
40
46
|
}
|
|
41
47
|
static getTID300RepresentationArguments(tool) {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
findingSites
|
|
46
|
-
} = tool;
|
|
48
|
+
const handles = tool.handles,
|
|
49
|
+
finding = tool.finding,
|
|
50
|
+
findingSites = tool.findingSites;
|
|
47
51
|
const point1 = handles.start;
|
|
48
52
|
const point2 = handles.middle;
|
|
49
53
|
const point3 = handles.middle;
|
|
@@ -69,7 +73,10 @@ Angle.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
69
73
|
if (!TrackingIdentifier.includes(':')) {
|
|
70
74
|
return false;
|
|
71
75
|
}
|
|
72
|
-
const
|
|
76
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
77
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
78
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
79
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
73
80
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
74
81
|
return false;
|
|
75
82
|
}
|
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Point: TID300Point
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Point = utilities.TID300.Point;
|
|
11
10
|
const ARROW_ANNOTATE = 'ArrowAnnotate';
|
|
12
11
|
const CORNERSTONEFREETEXT = 'CORNERSTONEFREETEXT';
|
|
13
12
|
class ArrowAnnotate {
|
|
14
13
|
static getMeasurementData(MeasurementGroup) {
|
|
15
|
-
const
|
|
16
|
-
defaultState,
|
|
17
|
-
SCOORDGroup
|
|
18
|
-
findingGroup
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
GraphicData
|
|
22
|
-
} = SCOORDGroup;
|
|
14
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
15
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
16
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
17
|
+
_MeasurementReport$ge.findingGroup;
|
|
18
|
+
const GraphicData = SCOORDGroup.GraphicData;
|
|
23
19
|
const state = _objectSpread(_objectSpread({}, defaultState), {}, {
|
|
24
20
|
toolType: ArrowAnnotate.toolType,
|
|
25
21
|
active: false,
|
|
@@ -53,12 +49,8 @@ class ArrowAnnotate {
|
|
|
53
49
|
}
|
|
54
50
|
static getTID300RepresentationArguments(tool) {
|
|
55
51
|
const points = [tool.handles.start, tool.handles.end];
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
} = tool;
|
|
59
|
-
let {
|
|
60
|
-
finding
|
|
61
|
-
} = tool;
|
|
52
|
+
const findingSites = tool.findingSites;
|
|
53
|
+
let finding = tool.finding;
|
|
62
54
|
const TID300RepresentationArguments = {
|
|
63
55
|
points,
|
|
64
56
|
trackingIdentifierTextValue: "cornerstoneTools@^4.0.0:ArrowAnnotate",
|
|
@@ -84,7 +76,10 @@ ArrowAnnotate.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
84
76
|
if (!TrackingIdentifier.includes(':')) {
|
|
85
77
|
return false;
|
|
86
78
|
}
|
|
87
|
-
const
|
|
79
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
80
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
81
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
82
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
88
83
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
89
84
|
return false;
|
|
90
85
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
1
2
|
import { utilities } from 'dcmjs';
|
|
2
3
|
import MeasurementReport from './MeasurementReport.js';
|
|
3
4
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
4
5
|
import { toArray } from '../helpers/toArray.js';
|
|
5
|
-
import '
|
|
6
|
+
import '../helpers/downloadDICOMData.js';
|
|
7
|
+
import '../helpers/toScoordType.js';
|
|
8
|
+
import '../helpers/scoordToWorld.js';
|
|
6
9
|
|
|
7
|
-
const
|
|
8
|
-
Bidirectional: TID300Bidirectional
|
|
9
|
-
} = utilities.TID300;
|
|
10
|
+
const TID300Bidirectional = utilities.TID300.Bidirectional;
|
|
10
11
|
const BIDIRECTIONAL = 'Bidirectional';
|
|
11
12
|
const LONG_AXIS = 'Long Axis';
|
|
12
13
|
const SHORT_AXIS = 'Short Axis';
|
|
@@ -15,22 +16,16 @@ const FINDING_SITE = 'G-C0E3';
|
|
|
15
16
|
class Bidirectional {
|
|
16
17
|
// TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
|
|
17
18
|
static getMeasurementData(MeasurementGroup) {
|
|
18
|
-
const
|
|
19
|
-
ContentSequence
|
|
20
|
-
} = MeasurementGroup;
|
|
19
|
+
const ContentSequence = MeasurementGroup.ContentSequence;
|
|
21
20
|
const findingGroup = toArray(ContentSequence).find(group => group.ConceptNameCodeSequence.CodeValue === FINDING);
|
|
22
21
|
const findingSiteGroups = toArray(ContentSequence).filter(group => group.ConceptNameCodeSequence.CodeValue === FINDING_SITE);
|
|
23
22
|
const longAxisNUMGroup = toArray(ContentSequence).find(group => group.ConceptNameCodeSequence.CodeMeaning === LONG_AXIS);
|
|
24
23
|
const longAxisSCOORDGroup = toArray(longAxisNUMGroup.ContentSequence).find(group => group.ValueType === 'SCOORD');
|
|
25
24
|
const shortAxisNUMGroup = toArray(ContentSequence).find(group => group.ConceptNameCodeSequence.CodeMeaning === SHORT_AXIS);
|
|
26
25
|
const shortAxisSCOORDGroup = toArray(shortAxisNUMGroup.ContentSequence).find(group => group.ValueType === 'SCOORD');
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const {
|
|
31
|
-
ReferencedSOPInstanceUID,
|
|
32
|
-
ReferencedFrameNumber
|
|
33
|
-
} = ReferencedSOPSequence;
|
|
26
|
+
const ReferencedSOPSequence = longAxisSCOORDGroup.ContentSequence.ReferencedSOPSequence;
|
|
27
|
+
const ReferencedSOPInstanceUID = ReferencedSOPSequence.ReferencedSOPInstanceUID,
|
|
28
|
+
ReferencedFrameNumber = ReferencedSOPSequence.ReferencedFrameNumber;
|
|
34
29
|
|
|
35
30
|
// Long axis
|
|
36
31
|
|
|
@@ -106,18 +101,15 @@ class Bidirectional {
|
|
|
106
101
|
return state;
|
|
107
102
|
}
|
|
108
103
|
static getTID300RepresentationArguments(tool) {
|
|
109
|
-
const
|
|
110
|
-
start,
|
|
111
|
-
end,
|
|
112
|
-
perpendicularStart,
|
|
113
|
-
perpendicularEnd
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
finding,
|
|
119
|
-
findingSites
|
|
120
|
-
} = tool;
|
|
104
|
+
const _tool$handles = tool.handles,
|
|
105
|
+
start = _tool$handles.start,
|
|
106
|
+
end = _tool$handles.end,
|
|
107
|
+
perpendicularStart = _tool$handles.perpendicularStart,
|
|
108
|
+
perpendicularEnd = _tool$handles.perpendicularEnd;
|
|
109
|
+
const shortestDiameter = tool.shortestDiameter,
|
|
110
|
+
longestDiameter = tool.longestDiameter,
|
|
111
|
+
finding = tool.finding,
|
|
112
|
+
findingSites = tool.findingSites;
|
|
121
113
|
const trackingIdentifierTextValue = 'cornerstoneTools@^4.0.0:Bidirectional';
|
|
122
114
|
return {
|
|
123
115
|
longAxis: {
|
|
@@ -143,7 +135,10 @@ Bidirectional.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
143
135
|
if (!TrackingIdentifier.includes(':')) {
|
|
144
136
|
return false;
|
|
145
137
|
}
|
|
146
|
-
const
|
|
138
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
139
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
140
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
141
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
147
142
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
148
143
|
return false;
|
|
149
144
|
}
|
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Circle: TID300Circle
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Circle = utilities.TID300.Circle;
|
|
11
10
|
const CIRCLEROI = 'CircleRoi';
|
|
12
11
|
class CircleRoi {
|
|
13
12
|
/** Gets the measurement data for cornerstone, given DICOM SR measurement data. */
|
|
14
13
|
static getMeasurementData(MeasurementGroup) {
|
|
15
|
-
const
|
|
16
|
-
defaultState,
|
|
17
|
-
NUMGroup,
|
|
18
|
-
SCOORDGroup
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
GraphicData
|
|
22
|
-
} = SCOORDGroup;
|
|
14
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
15
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
16
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
17
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
18
|
+
const GraphicData = SCOORDGroup.GraphicData;
|
|
23
19
|
const center = {
|
|
24
20
|
x: GraphicData[0],
|
|
25
21
|
y: GraphicData[1]
|
|
@@ -68,20 +64,15 @@ class CircleRoi {
|
|
|
68
64
|
* @returns
|
|
69
65
|
*/
|
|
70
66
|
static getTID300RepresentationArguments(tool) {
|
|
71
|
-
const
|
|
72
|
-
cachedStats = {},
|
|
73
|
-
handles,
|
|
74
|
-
finding,
|
|
75
|
-
findingSites
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
} = handles;
|
|
81
|
-
const {
|
|
82
|
-
area,
|
|
83
|
-
radius
|
|
84
|
-
} = cachedStats;
|
|
67
|
+
const _tool$cachedStats = tool.cachedStats,
|
|
68
|
+
cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
|
|
69
|
+
handles = tool.handles,
|
|
70
|
+
finding = tool.finding,
|
|
71
|
+
findingSites = tool.findingSites;
|
|
72
|
+
const center = handles.start,
|
|
73
|
+
end = handles.end;
|
|
74
|
+
const area = cachedStats.area,
|
|
75
|
+
radius = cachedStats.radius;
|
|
85
76
|
const perimeter = 2 * Math.PI * radius;
|
|
86
77
|
const points = [];
|
|
87
78
|
points.push(center);
|
|
@@ -105,7 +96,10 @@ CircleRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
105
96
|
if (!TrackingIdentifier.includes(':')) {
|
|
106
97
|
return false;
|
|
107
98
|
}
|
|
108
|
-
const
|
|
99
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
100
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
101
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
102
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
109
103
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
110
104
|
return false;
|
|
111
105
|
}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
CobbAngle: TID300CobbAngle
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300CobbAngle = utilities.TID300.CobbAngle;
|
|
11
10
|
const COBB_ANGLE = 'CobbAngle';
|
|
12
11
|
class CobbAngle {
|
|
13
12
|
// TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
|
|
14
13
|
static getMeasurementData(MeasurementGroup) {
|
|
15
|
-
const
|
|
16
|
-
defaultState,
|
|
17
|
-
NUMGroup,
|
|
18
|
-
SCOORDGroup
|
|
19
|
-
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup);
|
|
14
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
15
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
16
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
17
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
20
18
|
const state = _objectSpread(_objectSpread({}, defaultState), {}, {
|
|
21
19
|
rAngle: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
22
20
|
toolType: CobbAngle.toolType,
|
|
@@ -40,15 +38,21 @@ class CobbAngle {
|
|
|
40
38
|
}
|
|
41
39
|
}
|
|
42
40
|
});
|
|
43
|
-
|
|
41
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 8);
|
|
42
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
43
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
44
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[2];
|
|
45
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[3];
|
|
46
|
+
state.handles.start2.x = _SCOORDGroup$GraphicD[4];
|
|
47
|
+
state.handles.start2.y = _SCOORDGroup$GraphicD[5];
|
|
48
|
+
state.handles.end2.x = _SCOORDGroup$GraphicD[6];
|
|
49
|
+
state.handles.end2.y = _SCOORDGroup$GraphicD[7];
|
|
44
50
|
return state;
|
|
45
51
|
}
|
|
46
52
|
static getTID300RepresentationArguments(tool) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
findingSites
|
|
51
|
-
} = tool;
|
|
53
|
+
const handles = tool.handles,
|
|
54
|
+
finding = tool.finding,
|
|
55
|
+
findingSites = tool.findingSites;
|
|
52
56
|
const point1 = handles.start;
|
|
53
57
|
const point2 = handles.end;
|
|
54
58
|
const point3 = handles.start2;
|
|
@@ -74,7 +78,10 @@ CobbAngle.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
74
78
|
if (!TrackingIdentifier.includes(':')) {
|
|
75
79
|
return false;
|
|
76
80
|
}
|
|
77
|
-
const
|
|
81
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
82
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
83
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
84
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
78
85
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
79
86
|
return false;
|
|
80
87
|
}
|
|
@@ -1,25 +1,21 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Ellipse: TID300Ellipse
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Ellipse = utilities.TID300.Ellipse;
|
|
11
10
|
const ELLIPTICALROI = 'EllipticalRoi';
|
|
12
11
|
class EllipticalRoi {
|
|
13
12
|
// TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
|
|
14
13
|
static getMeasurementData(MeasurementGroup) {
|
|
15
|
-
const
|
|
16
|
-
defaultState,
|
|
17
|
-
NUMGroup,
|
|
18
|
-
SCOORDGroup
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
GraphicData
|
|
22
|
-
} = SCOORDGroup;
|
|
14
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
15
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
16
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
17
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
18
|
+
const GraphicData = SCOORDGroup.GraphicData;
|
|
23
19
|
const majorAxis = [{
|
|
24
20
|
x: GraphicData[0],
|
|
25
21
|
y: GraphicData[1]
|
|
@@ -89,19 +85,14 @@ class EllipticalRoi {
|
|
|
89
85
|
return state;
|
|
90
86
|
}
|
|
91
87
|
static getTID300RepresentationArguments(tool) {
|
|
92
|
-
const
|
|
93
|
-
cachedStats = {},
|
|
94
|
-
handles,
|
|
95
|
-
finding,
|
|
96
|
-
findingSites
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
end
|
|
101
|
-
} = handles;
|
|
102
|
-
const {
|
|
103
|
-
area
|
|
104
|
-
} = cachedStats;
|
|
88
|
+
const _tool$cachedStats = tool.cachedStats,
|
|
89
|
+
cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats,
|
|
90
|
+
handles = tool.handles,
|
|
91
|
+
finding = tool.finding,
|
|
92
|
+
findingSites = tool.findingSites;
|
|
93
|
+
const start = handles.start,
|
|
94
|
+
end = handles.end;
|
|
95
|
+
const area = cachedStats.area;
|
|
105
96
|
const halfXLength = Math.abs(start.x - end.x) / 2;
|
|
106
97
|
const halfYLength = Math.abs(start.y - end.y) / 2;
|
|
107
98
|
const points = [];
|
|
@@ -167,7 +158,10 @@ EllipticalRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
167
158
|
if (!TrackingIdentifier.includes(':')) {
|
|
168
159
|
return false;
|
|
169
160
|
}
|
|
170
|
-
const
|
|
161
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
162
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
163
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
164
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
171
165
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
172
166
|
return false;
|
|
173
167
|
}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Polyline: TID300Polyline
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Polyline = utilities.TID300.Polyline;
|
|
11
10
|
class FreehandRoi {
|
|
12
11
|
static getMeasurementData(MeasurementGroup) {
|
|
13
|
-
const
|
|
14
|
-
defaultState,
|
|
15
|
-
SCOORDGroup,
|
|
16
|
-
NUMGroup
|
|
17
|
-
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup);
|
|
12
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
13
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
14
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup,
|
|
15
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup;
|
|
18
16
|
const state = _objectSpread(_objectSpread({}, defaultState), {}, {
|
|
19
17
|
toolType: FreehandRoi.toolType,
|
|
20
18
|
handles: {
|
|
@@ -34,9 +32,7 @@ class FreehandRoi {
|
|
|
34
32
|
color: undefined,
|
|
35
33
|
invalidated: true
|
|
36
34
|
});
|
|
37
|
-
const
|
|
38
|
-
GraphicData
|
|
39
|
-
} = SCOORDGroup;
|
|
35
|
+
const GraphicData = SCOORDGroup.GraphicData;
|
|
40
36
|
for (let i = 0; i < GraphicData.length; i += 2) {
|
|
41
37
|
state.handles.points.push({
|
|
42
38
|
x: GraphicData[i],
|
|
@@ -46,19 +42,16 @@ class FreehandRoi {
|
|
|
46
42
|
return state;
|
|
47
43
|
}
|
|
48
44
|
static getTID300RepresentationArguments(tool) {
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
cachedStats = {}
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
area = 0,
|
|
60
|
-
perimeter = 0
|
|
61
|
-
} = cachedStats;
|
|
45
|
+
const handles = tool.handles,
|
|
46
|
+
finding = tool.finding,
|
|
47
|
+
findingSites = tool.findingSites,
|
|
48
|
+
_tool$cachedStats = tool.cachedStats,
|
|
49
|
+
cachedStats = _tool$cachedStats === void 0 ? {} : _tool$cachedStats;
|
|
50
|
+
const points = handles.points;
|
|
51
|
+
const _cachedStats$area = cachedStats.area,
|
|
52
|
+
area = _cachedStats$area === void 0 ? 0 : _cachedStats$area,
|
|
53
|
+
_cachedStats$perimete = cachedStats.perimeter,
|
|
54
|
+
perimeter = _cachedStats$perimete === void 0 ? 0 : _cachedStats$perimete;
|
|
62
55
|
const trackingIdentifierTextValue = 'cornerstoneTools@^4.0.0:FreehandRoi';
|
|
63
56
|
return {
|
|
64
57
|
points,
|
|
@@ -77,7 +70,10 @@ FreehandRoi.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
77
70
|
if (!TrackingIdentifier.includes(':')) {
|
|
78
71
|
return false;
|
|
79
72
|
}
|
|
80
|
-
const
|
|
73
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
74
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
75
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
76
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
81
77
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
82
78
|
return false;
|
|
83
79
|
}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
2
3
|
import { utilities } from 'dcmjs';
|
|
3
4
|
import MeasurementReport from './MeasurementReport.js';
|
|
4
5
|
import CORNERSTONE_4_TAG from './cornerstone4Tag.js';
|
|
5
6
|
|
|
6
7
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7
8
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
8
|
-
const
|
|
9
|
-
Length: TID300Length
|
|
10
|
-
} = utilities.TID300;
|
|
9
|
+
const TID300Length = utilities.TID300.Length;
|
|
11
10
|
const LENGTH = 'Length';
|
|
12
11
|
class Length {
|
|
13
12
|
// TODO: this function is required for all Cornerstone Tool Adapters, since it is called by MeasurementReport.
|
|
14
13
|
static getMeasurementData(MeasurementGroup) {
|
|
15
|
-
const
|
|
16
|
-
defaultState,
|
|
17
|
-
NUMGroup,
|
|
18
|
-
SCOORDGroup
|
|
19
|
-
} = MeasurementReport.getSetupMeasurementData(MeasurementGroup);
|
|
14
|
+
const _MeasurementReport$ge = MeasurementReport.getSetupMeasurementData(MeasurementGroup),
|
|
15
|
+
defaultState = _MeasurementReport$ge.defaultState,
|
|
16
|
+
NUMGroup = _MeasurementReport$ge.NUMGroup,
|
|
17
|
+
SCOORDGroup = _MeasurementReport$ge.SCOORDGroup;
|
|
20
18
|
const state = _objectSpread(_objectSpread({}, defaultState), {}, {
|
|
21
19
|
length: NUMGroup.MeasuredValueSequence.NumericValue,
|
|
22
20
|
toolType: Length.toolType,
|
|
@@ -32,15 +30,17 @@ class Length {
|
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
});
|
|
35
|
-
|
|
33
|
+
var _SCOORDGroup$GraphicD = _slicedToArray(SCOORDGroup.GraphicData, 4);
|
|
34
|
+
state.handles.start.x = _SCOORDGroup$GraphicD[0];
|
|
35
|
+
state.handles.start.y = _SCOORDGroup$GraphicD[1];
|
|
36
|
+
state.handles.end.x = _SCOORDGroup$GraphicD[2];
|
|
37
|
+
state.handles.end.y = _SCOORDGroup$GraphicD[3];
|
|
36
38
|
return state;
|
|
37
39
|
}
|
|
38
40
|
static getTID300RepresentationArguments(tool) {
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
findingSites
|
|
43
|
-
} = tool;
|
|
41
|
+
const handles = tool.handles,
|
|
42
|
+
finding = tool.finding,
|
|
43
|
+
findingSites = tool.findingSites;
|
|
44
44
|
const point1 = handles.start;
|
|
45
45
|
const point2 = handles.end;
|
|
46
46
|
const distance = tool.length;
|
|
@@ -62,7 +62,10 @@ Length.isValidCornerstoneTrackingIdentifier = TrackingIdentifier => {
|
|
|
62
62
|
if (!TrackingIdentifier.includes(':')) {
|
|
63
63
|
return false;
|
|
64
64
|
}
|
|
65
|
-
const
|
|
65
|
+
const _TrackingIdentifier$s = TrackingIdentifier.split(':'),
|
|
66
|
+
_TrackingIdentifier$s2 = _slicedToArray(_TrackingIdentifier$s, 2),
|
|
67
|
+
cornerstone4Tag = _TrackingIdentifier$s2[0],
|
|
68
|
+
toolType = _TrackingIdentifier$s2[1];
|
|
66
69
|
if (cornerstone4Tag !== CORNERSTONE_4_TAG) {
|
|
67
70
|
return false;
|
|
68
71
|
}
|