@sigmacomputing/embed-sdk 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +72 -3
- package/dist/index.d.ts +72 -3
- package/dist/index.js +70 -4
- package/dist/index.mjs +61 -3
- package/package.json +5 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,15 +1,84 @@
|
|
|
1
|
+
type Value_t = Object | Date | boolean | number | string | null;
|
|
2
|
+
declare enum CellType_t {
|
|
3
|
+
Value = "valueCell",
|
|
4
|
+
RowHeader = "rowHeader",
|
|
5
|
+
ColumnHeader = "columnHeader",
|
|
6
|
+
Total = "total"
|
|
7
|
+
}
|
|
8
|
+
type DataRow_t = Record<string, Value_t>;
|
|
9
|
+
type DataRows_t = DataRow_t[];
|
|
10
|
+
interface Data_t {
|
|
11
|
+
rows: DataRows_t;
|
|
12
|
+
isTruncated: boolean;
|
|
13
|
+
length: number;
|
|
14
|
+
}
|
|
15
|
+
interface Cell_t {
|
|
16
|
+
value: Value_t;
|
|
17
|
+
cellType: CellType_t;
|
|
18
|
+
columnName: string;
|
|
19
|
+
}
|
|
20
|
+
interface LevelTableValueCell_t extends Cell_t {
|
|
21
|
+
cellType: CellType_t.Value;
|
|
22
|
+
underlyingData: Data_t;
|
|
23
|
+
}
|
|
24
|
+
interface LevelTableColumnCell_t extends Cell_t {
|
|
25
|
+
cellType: CellType_t.ColumnHeader;
|
|
26
|
+
}
|
|
27
|
+
type LevelTableCell_t = LevelTableValueCell_t | LevelTableColumnCell_t;
|
|
28
|
+
type LevelTableCells = LevelTableCell_t[];
|
|
29
|
+
declare const WorkbookLoadedEventName: "workbook:loaded";
|
|
30
|
+
declare const WorkbookErrorEventName: "workbook:error";
|
|
31
|
+
declare const WorkbookVariableEventName: "workbook:variables:onchange";
|
|
32
|
+
declare const WorkbookTableCellSelectEventName: "workbook:table:oncellselect";
|
|
33
|
+
declare const WorkbookPublishedEventName: "workbook:published";
|
|
34
|
+
declare const WorkbookFullScreenEventName: "workbook:fullscreen:onchange";
|
|
35
|
+
declare const WorkbookPageHeightEventName: "workbook:pageheight:onchange";
|
|
36
|
+
declare const WorkbookPageSelectedNodeEventName: "workbook:selectednodeid:onchange";
|
|
1
37
|
interface WorkbookLoadedEvent {
|
|
2
|
-
type:
|
|
38
|
+
type: typeof WorkbookLoadedEventName;
|
|
3
39
|
workbook: {
|
|
4
40
|
variables: Record<string, string>;
|
|
5
41
|
};
|
|
6
42
|
}
|
|
7
43
|
interface WorkbookErrorEvent {
|
|
8
|
-
type:
|
|
44
|
+
type: typeof WorkbookErrorEventName;
|
|
9
45
|
code: string;
|
|
10
46
|
message: string;
|
|
11
47
|
}
|
|
48
|
+
interface WorkbookVariableEvent {
|
|
49
|
+
type: typeof WorkbookVariableEventName;
|
|
50
|
+
variables: Record<string, string>;
|
|
51
|
+
}
|
|
52
|
+
interface WorkbookTableCellSelectEvent {
|
|
53
|
+
type: typeof WorkbookTableCellSelectEventName;
|
|
54
|
+
nodeId: string;
|
|
55
|
+
title: string;
|
|
56
|
+
cells: LevelTableCells;
|
|
57
|
+
}
|
|
58
|
+
type WorkbookPublishedEvent = {
|
|
59
|
+
type: typeof WorkbookPublishedEventName;
|
|
60
|
+
workbookId: string;
|
|
61
|
+
};
|
|
62
|
+
type WorkbookFullScreenEvent = {
|
|
63
|
+
type: typeof WorkbookFullScreenEventName;
|
|
64
|
+
fullScreen: boolean;
|
|
65
|
+
};
|
|
66
|
+
type WorkbookPageHeightEvent = {
|
|
67
|
+
type: typeof WorkbookPageHeightEventName;
|
|
68
|
+
pageHeight: number;
|
|
69
|
+
};
|
|
70
|
+
type WorkbookPageSelectedNodeEvent = {
|
|
71
|
+
type: typeof WorkbookPageSelectedNodeEventName;
|
|
72
|
+
selectedNodeId: string | null;
|
|
73
|
+
};
|
|
74
|
+
|
|
12
75
|
declare const workbookLoadedListener: (event: MessageEvent, iframe: HTMLIFrameElement, onLoaded: (event: WorkbookLoadedEvent) => void) => void;
|
|
13
76
|
declare const workbookErrorListener: (event: MessageEvent, iframe: HTMLIFrameElement, onError: (event: WorkbookErrorEvent) => void) => void;
|
|
77
|
+
declare const workbookVariableListener: (event: MessageEvent, iframe: HTMLIFrameElement, onVariable: (event: WorkbookVariableEvent) => void) => void;
|
|
78
|
+
declare const workbookTableCellSelectListener: (event: MessageEvent, iframe: HTMLIFrameElement, onTableCellSelect: (event: WorkbookTableCellSelectEvent) => void) => void;
|
|
79
|
+
declare const workbookPublishedListener: (event: MessageEvent, iframe: HTMLIFrameElement, onPublished: (event: WorkbookPublishedEvent) => void) => void;
|
|
80
|
+
declare const workbookFullScreenListener: (event: MessageEvent, iframe: HTMLIFrameElement, onFullScreen: (event: WorkbookFullScreenEvent) => void) => void;
|
|
81
|
+
declare const workbookPageHeightListener: (event: MessageEvent, iframe: HTMLIFrameElement, onPageHeight: (event: WorkbookPageHeightEvent) => void) => void;
|
|
82
|
+
declare const workbookPageSelectedNodeListener: (event: MessageEvent, iframe: HTMLIFrameElement, onPageSelectedNode: (event: WorkbookPageSelectedNodeEvent) => void) => void;
|
|
14
83
|
|
|
15
|
-
export {
|
|
84
|
+
export { workbookErrorListener, workbookFullScreenListener, workbookLoadedListener, workbookPageHeightListener, workbookPageSelectedNodeListener, workbookPublishedListener, workbookTableCellSelectListener, workbookVariableListener };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,84 @@
|
|
|
1
|
+
type Value_t = Object | Date | boolean | number | string | null;
|
|
2
|
+
declare enum CellType_t {
|
|
3
|
+
Value = "valueCell",
|
|
4
|
+
RowHeader = "rowHeader",
|
|
5
|
+
ColumnHeader = "columnHeader",
|
|
6
|
+
Total = "total"
|
|
7
|
+
}
|
|
8
|
+
type DataRow_t = Record<string, Value_t>;
|
|
9
|
+
type DataRows_t = DataRow_t[];
|
|
10
|
+
interface Data_t {
|
|
11
|
+
rows: DataRows_t;
|
|
12
|
+
isTruncated: boolean;
|
|
13
|
+
length: number;
|
|
14
|
+
}
|
|
15
|
+
interface Cell_t {
|
|
16
|
+
value: Value_t;
|
|
17
|
+
cellType: CellType_t;
|
|
18
|
+
columnName: string;
|
|
19
|
+
}
|
|
20
|
+
interface LevelTableValueCell_t extends Cell_t {
|
|
21
|
+
cellType: CellType_t.Value;
|
|
22
|
+
underlyingData: Data_t;
|
|
23
|
+
}
|
|
24
|
+
interface LevelTableColumnCell_t extends Cell_t {
|
|
25
|
+
cellType: CellType_t.ColumnHeader;
|
|
26
|
+
}
|
|
27
|
+
type LevelTableCell_t = LevelTableValueCell_t | LevelTableColumnCell_t;
|
|
28
|
+
type LevelTableCells = LevelTableCell_t[];
|
|
29
|
+
declare const WorkbookLoadedEventName: "workbook:loaded";
|
|
30
|
+
declare const WorkbookErrorEventName: "workbook:error";
|
|
31
|
+
declare const WorkbookVariableEventName: "workbook:variables:onchange";
|
|
32
|
+
declare const WorkbookTableCellSelectEventName: "workbook:table:oncellselect";
|
|
33
|
+
declare const WorkbookPublishedEventName: "workbook:published";
|
|
34
|
+
declare const WorkbookFullScreenEventName: "workbook:fullscreen:onchange";
|
|
35
|
+
declare const WorkbookPageHeightEventName: "workbook:pageheight:onchange";
|
|
36
|
+
declare const WorkbookPageSelectedNodeEventName: "workbook:selectednodeid:onchange";
|
|
1
37
|
interface WorkbookLoadedEvent {
|
|
2
|
-
type:
|
|
38
|
+
type: typeof WorkbookLoadedEventName;
|
|
3
39
|
workbook: {
|
|
4
40
|
variables: Record<string, string>;
|
|
5
41
|
};
|
|
6
42
|
}
|
|
7
43
|
interface WorkbookErrorEvent {
|
|
8
|
-
type:
|
|
44
|
+
type: typeof WorkbookErrorEventName;
|
|
9
45
|
code: string;
|
|
10
46
|
message: string;
|
|
11
47
|
}
|
|
48
|
+
interface WorkbookVariableEvent {
|
|
49
|
+
type: typeof WorkbookVariableEventName;
|
|
50
|
+
variables: Record<string, string>;
|
|
51
|
+
}
|
|
52
|
+
interface WorkbookTableCellSelectEvent {
|
|
53
|
+
type: typeof WorkbookTableCellSelectEventName;
|
|
54
|
+
nodeId: string;
|
|
55
|
+
title: string;
|
|
56
|
+
cells: LevelTableCells;
|
|
57
|
+
}
|
|
58
|
+
type WorkbookPublishedEvent = {
|
|
59
|
+
type: typeof WorkbookPublishedEventName;
|
|
60
|
+
workbookId: string;
|
|
61
|
+
};
|
|
62
|
+
type WorkbookFullScreenEvent = {
|
|
63
|
+
type: typeof WorkbookFullScreenEventName;
|
|
64
|
+
fullScreen: boolean;
|
|
65
|
+
};
|
|
66
|
+
type WorkbookPageHeightEvent = {
|
|
67
|
+
type: typeof WorkbookPageHeightEventName;
|
|
68
|
+
pageHeight: number;
|
|
69
|
+
};
|
|
70
|
+
type WorkbookPageSelectedNodeEvent = {
|
|
71
|
+
type: typeof WorkbookPageSelectedNodeEventName;
|
|
72
|
+
selectedNodeId: string | null;
|
|
73
|
+
};
|
|
74
|
+
|
|
12
75
|
declare const workbookLoadedListener: (event: MessageEvent, iframe: HTMLIFrameElement, onLoaded: (event: WorkbookLoadedEvent) => void) => void;
|
|
13
76
|
declare const workbookErrorListener: (event: MessageEvent, iframe: HTMLIFrameElement, onError: (event: WorkbookErrorEvent) => void) => void;
|
|
77
|
+
declare const workbookVariableListener: (event: MessageEvent, iframe: HTMLIFrameElement, onVariable: (event: WorkbookVariableEvent) => void) => void;
|
|
78
|
+
declare const workbookTableCellSelectListener: (event: MessageEvent, iframe: HTMLIFrameElement, onTableCellSelect: (event: WorkbookTableCellSelectEvent) => void) => void;
|
|
79
|
+
declare const workbookPublishedListener: (event: MessageEvent, iframe: HTMLIFrameElement, onPublished: (event: WorkbookPublishedEvent) => void) => void;
|
|
80
|
+
declare const workbookFullScreenListener: (event: MessageEvent, iframe: HTMLIFrameElement, onFullScreen: (event: WorkbookFullScreenEvent) => void) => void;
|
|
81
|
+
declare const workbookPageHeightListener: (event: MessageEvent, iframe: HTMLIFrameElement, onPageHeight: (event: WorkbookPageHeightEvent) => void) => void;
|
|
82
|
+
declare const workbookPageSelectedNodeListener: (event: MessageEvent, iframe: HTMLIFrameElement, onPageSelectedNode: (event: WorkbookPageSelectedNodeEvent) => void) => void;
|
|
14
83
|
|
|
15
|
-
export {
|
|
84
|
+
export { workbookErrorListener, workbookFullScreenListener, workbookLoadedListener, workbookPageHeightListener, workbookPageSelectedNodeListener, workbookPublishedListener, workbookTableCellSelectListener, workbookVariableListener };
|
package/dist/index.js
CHANGED
|
@@ -21,25 +21,91 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var src_exports = {};
|
|
22
22
|
__export(src_exports, {
|
|
23
23
|
workbookErrorListener: () => workbookErrorListener,
|
|
24
|
-
|
|
24
|
+
workbookFullScreenListener: () => workbookFullScreenListener,
|
|
25
|
+
workbookLoadedListener: () => workbookLoadedListener,
|
|
26
|
+
workbookPageHeightListener: () => workbookPageHeightListener,
|
|
27
|
+
workbookPageSelectedNodeListener: () => workbookPageSelectedNodeListener,
|
|
28
|
+
workbookPublishedListener: () => workbookPublishedListener,
|
|
29
|
+
workbookTableCellSelectListener: () => workbookTableCellSelectListener,
|
|
30
|
+
workbookVariableListener: () => workbookVariableListener
|
|
25
31
|
});
|
|
26
32
|
module.exports = __toCommonJS(src_exports);
|
|
33
|
+
|
|
34
|
+
// src/types.ts
|
|
35
|
+
var WorkbookLoadedEventName = "workbook:loaded";
|
|
36
|
+
var WorkbookErrorEventName = "workbook:error";
|
|
37
|
+
var WorkbookVariableEventName = "workbook:variables:onchange";
|
|
38
|
+
var WorkbookTableCellSelectEventName = "workbook:table:oncellselect";
|
|
39
|
+
var WorkbookPublishedEventName = "workbook:published";
|
|
40
|
+
var WorkbookFullScreenEventName = "workbook:fullscreen:onchange";
|
|
41
|
+
var WorkbookPageHeightEventName = "workbook:pageheight:onchange";
|
|
42
|
+
var WorkbookPageSelectedNodeEventName = "workbook:selectednodeid:onchange";
|
|
43
|
+
|
|
44
|
+
// src/index.ts
|
|
27
45
|
var workbookLoadedListener = (event, iframe, onLoaded) => {
|
|
28
46
|
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
29
|
-
if (event.data.type ===
|
|
47
|
+
if (event.data.type === WorkbookLoadedEventName) {
|
|
30
48
|
onLoaded(event.data);
|
|
31
49
|
}
|
|
32
50
|
}
|
|
33
51
|
};
|
|
34
52
|
var workbookErrorListener = (event, iframe, onError) => {
|
|
35
53
|
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
36
|
-
if (event.data.type ===
|
|
54
|
+
if (event.data.type === WorkbookErrorEventName) {
|
|
37
55
|
onError(event.data);
|
|
38
56
|
}
|
|
39
57
|
}
|
|
40
58
|
};
|
|
59
|
+
var workbookVariableListener = (event, iframe, onVariable) => {
|
|
60
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
61
|
+
if (event.data.type === WorkbookVariableEventName) {
|
|
62
|
+
onVariable(event.data);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
var workbookTableCellSelectListener = (event, iframe, onTableCellSelect) => {
|
|
67
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
68
|
+
if (event.data.type === WorkbookTableCellSelectEventName) {
|
|
69
|
+
onTableCellSelect(event.data);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var workbookPublishedListener = (event, iframe, onPublished) => {
|
|
74
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
75
|
+
if (event.data.type === WorkbookPublishedEventName) {
|
|
76
|
+
onPublished(event.data);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var workbookFullScreenListener = (event, iframe, onFullScreen) => {
|
|
81
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
82
|
+
if (event.data.type === WorkbookFullScreenEventName) {
|
|
83
|
+
onFullScreen(event.data);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
var workbookPageHeightListener = (event, iframe, onPageHeight) => {
|
|
88
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
89
|
+
if (event.data.type === WorkbookPageHeightEventName) {
|
|
90
|
+
onPageHeight(event.data);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
var workbookPageSelectedNodeListener = (event, iframe, onPageSelectedNode) => {
|
|
95
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
96
|
+
if (event.data.type === WorkbookPageSelectedNodeEventName) {
|
|
97
|
+
onPageSelectedNode(event.data);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
41
101
|
// Annotate the CommonJS export names for ESM import in node:
|
|
42
102
|
0 && (module.exports = {
|
|
43
103
|
workbookErrorListener,
|
|
44
|
-
|
|
104
|
+
workbookFullScreenListener,
|
|
105
|
+
workbookLoadedListener,
|
|
106
|
+
workbookPageHeightListener,
|
|
107
|
+
workbookPageSelectedNodeListener,
|
|
108
|
+
workbookPublishedListener,
|
|
109
|
+
workbookTableCellSelectListener,
|
|
110
|
+
workbookVariableListener
|
|
45
111
|
});
|
package/dist/index.mjs
CHANGED
|
@@ -1,19 +1,77 @@
|
|
|
1
|
+
// src/types.ts
|
|
2
|
+
var WorkbookLoadedEventName = "workbook:loaded";
|
|
3
|
+
var WorkbookErrorEventName = "workbook:error";
|
|
4
|
+
var WorkbookVariableEventName = "workbook:variables:onchange";
|
|
5
|
+
var WorkbookTableCellSelectEventName = "workbook:table:oncellselect";
|
|
6
|
+
var WorkbookPublishedEventName = "workbook:published";
|
|
7
|
+
var WorkbookFullScreenEventName = "workbook:fullscreen:onchange";
|
|
8
|
+
var WorkbookPageHeightEventName = "workbook:pageheight:onchange";
|
|
9
|
+
var WorkbookPageSelectedNodeEventName = "workbook:selectednodeid:onchange";
|
|
10
|
+
|
|
1
11
|
// src/index.ts
|
|
2
12
|
var workbookLoadedListener = (event, iframe, onLoaded) => {
|
|
3
13
|
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
4
|
-
if (event.data.type ===
|
|
14
|
+
if (event.data.type === WorkbookLoadedEventName) {
|
|
5
15
|
onLoaded(event.data);
|
|
6
16
|
}
|
|
7
17
|
}
|
|
8
18
|
};
|
|
9
19
|
var workbookErrorListener = (event, iframe, onError) => {
|
|
10
20
|
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
11
|
-
if (event.data.type ===
|
|
21
|
+
if (event.data.type === WorkbookErrorEventName) {
|
|
12
22
|
onError(event.data);
|
|
13
23
|
}
|
|
14
24
|
}
|
|
15
25
|
};
|
|
26
|
+
var workbookVariableListener = (event, iframe, onVariable) => {
|
|
27
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
28
|
+
if (event.data.type === WorkbookVariableEventName) {
|
|
29
|
+
onVariable(event.data);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
var workbookTableCellSelectListener = (event, iframe, onTableCellSelect) => {
|
|
34
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
35
|
+
if (event.data.type === WorkbookTableCellSelectEventName) {
|
|
36
|
+
onTableCellSelect(event.data);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var workbookPublishedListener = (event, iframe, onPublished) => {
|
|
41
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
42
|
+
if (event.data.type === WorkbookPublishedEventName) {
|
|
43
|
+
onPublished(event.data);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var workbookFullScreenListener = (event, iframe, onFullScreen) => {
|
|
48
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
49
|
+
if (event.data.type === WorkbookFullScreenEventName) {
|
|
50
|
+
onFullScreen(event.data);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var workbookPageHeightListener = (event, iframe, onPageHeight) => {
|
|
55
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
56
|
+
if (event.data.type === WorkbookPageHeightEventName) {
|
|
57
|
+
onPageHeight(event.data);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var workbookPageSelectedNodeListener = (event, iframe, onPageSelectedNode) => {
|
|
62
|
+
if (event.source === iframe.contentWindow && event.origin === "https://staging.sigmacomputing.io") {
|
|
63
|
+
if (event.data.type === WorkbookPageSelectedNodeEventName) {
|
|
64
|
+
onPageSelectedNode(event.data);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
16
68
|
export {
|
|
17
69
|
workbookErrorListener,
|
|
18
|
-
|
|
70
|
+
workbookFullScreenListener,
|
|
71
|
+
workbookLoadedListener,
|
|
72
|
+
workbookPageHeightListener,
|
|
73
|
+
workbookPageSelectedNodeListener,
|
|
74
|
+
workbookPublishedListener,
|
|
75
|
+
workbookTableCellSelectListener,
|
|
76
|
+
workbookVariableListener
|
|
19
77
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sigmacomputing/embed-sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "JavaScript SDK to interact with Sigma Computing's Embed API",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"prepublish": "npm run build",
|
|
@@ -18,5 +18,8 @@
|
|
|
18
18
|
},
|
|
19
19
|
"files": [
|
|
20
20
|
"dist"
|
|
21
|
-
]
|
|
21
|
+
],
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@sigmacomputing/typescript-config": "*"
|
|
24
|
+
}
|
|
22
25
|
}
|