@mistralai/mistralai 1.7.4 → 1.7.5
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/README.md +10 -0
- package/docs/sdks/audio/README.md +6 -0
- package/docs/sdks/transcriptions/README.md +167 -0
- package/examples/src/async_audio_transcription_stream.ts +17 -0
- package/funcs/audioTranscriptionsComplete.d.ts +13 -0
- package/funcs/audioTranscriptionsComplete.d.ts.map +1 -0
- package/funcs/audioTranscriptionsComplete.js +133 -0
- package/funcs/audioTranscriptionsComplete.js.map +1 -0
- package/funcs/audioTranscriptionsStream.d.ts +14 -0
- package/funcs/audioTranscriptionsStream.d.ts.map +1 -0
- package/funcs/audioTranscriptionsStream.js +143 -0
- package/funcs/audioTranscriptionsStream.js.map +1 -0
- package/funcs/batchJobsList.js +1 -0
- package/funcs/batchJobsList.js.map +1 -1
- package/jsr.json +1 -1
- package/lib/config.d.ts +2 -2
- package/lib/config.js +2 -2
- package/models/components/audiochunk.d.ts +54 -0
- package/models/components/audiochunk.d.ts.map +1 -0
- package/models/components/audiochunk.js +88 -0
- package/models/components/audiochunk.js.map +1 -0
- package/models/components/audiotranscriptionrequest.d.ts +57 -0
- package/models/components/audiotranscriptionrequest.d.ts.map +1 -0
- package/models/components/audiotranscriptionrequest.js +91 -0
- package/models/components/audiotranscriptionrequest.js.map +1 -0
- package/models/components/audiotranscriptionrequeststream.d.ts +57 -0
- package/models/components/audiotranscriptionrequeststream.d.ts.map +1 -0
- package/models/components/audiotranscriptionrequeststream.js +91 -0
- package/models/components/audiotranscriptionrequeststream.js.map +1 -0
- package/models/components/basemodelcard.d.ts +7 -7
- package/models/components/basemodelcard.d.ts.map +1 -1
- package/models/components/basemodelcard.js +11 -11
- package/models/components/basemodelcard.js.map +1 -1
- package/models/components/batchjobin.d.ts +4 -2
- package/models/components/batchjobin.d.ts.map +1 -1
- package/models/components/batchjobin.js +6 -2
- package/models/components/batchjobin.js.map +1 -1
- package/models/components/batchjobout.d.ts +4 -2
- package/models/components/batchjobout.d.ts.map +1 -1
- package/models/components/batchjobout.js +6 -2
- package/models/components/batchjobout.js.map +1 -1
- package/models/components/classifierftmodelout.d.ts +4 -0
- package/models/components/classifierftmodelout.d.ts.map +1 -1
- package/models/components/classifierftmodelout.js +8 -0
- package/models/components/classifierftmodelout.js.map +1 -1
- package/models/components/completionargs.d.ts +2 -2
- package/models/components/completionargs.d.ts.map +1 -1
- package/models/components/completionargs.js +2 -2
- package/models/components/completionargs.js.map +1 -1
- package/models/components/completionftmodelout.d.ts +4 -0
- package/models/components/completionftmodelout.d.ts.map +1 -1
- package/models/components/completionftmodelout.js +8 -0
- package/models/components/completionftmodelout.js.map +1 -1
- package/models/components/contentchunk.d.ts +10 -0
- package/models/components/contentchunk.d.ts.map +1 -1
- package/models/components/contentchunk.js +14 -0
- package/models/components/contentchunk.js.map +1 -1
- package/models/components/fileschema.d.ts +4 -0
- package/models/components/fileschema.d.ts.map +1 -1
- package/models/components/fileschema.js +4 -0
- package/models/components/fileschema.js.map +1 -1
- package/models/components/index.d.ts +13 -0
- package/models/components/index.d.ts.map +1 -1
- package/models/components/index.js +13 -0
- package/models/components/index.js.map +1 -1
- package/models/components/retrievefileout.d.ts +4 -0
- package/models/components/retrievefileout.d.ts.map +1 -1
- package/models/components/retrievefileout.js +4 -0
- package/models/components/retrievefileout.js.map +1 -1
- package/models/components/thinkchunk.d.ts +82 -0
- package/models/components/thinkchunk.d.ts.map +1 -0
- package/models/components/thinkchunk.js +106 -0
- package/models/components/thinkchunk.js.map +1 -0
- package/models/components/timestampgranularity.d.ts +25 -0
- package/models/components/timestampgranularity.d.ts.map +1 -0
- package/models/components/timestampgranularity.js +49 -0
- package/models/components/timestampgranularity.js.map +1 -0
- package/models/components/toolcall.d.ts +23 -0
- package/models/components/toolcall.d.ts.map +1 -1
- package/models/components/toolcall.js +26 -1
- package/models/components/toolcall.js.map +1 -1
- package/models/components/transcriptionresponse.d.ts +43 -0
- package/models/components/transcriptionresponse.d.ts.map +1 -0
- package/models/components/transcriptionresponse.js +78 -0
- package/models/components/transcriptionresponse.js.map +1 -0
- package/models/components/transcriptionsegmentchunk.d.ts +62 -0
- package/models/components/transcriptionsegmentchunk.d.ts.map +1 -0
- package/models/components/transcriptionsegmentchunk.js +92 -0
- package/models/components/transcriptionsegmentchunk.js.map +1 -0
- package/models/components/transcriptionstreamdone.d.ts +68 -0
- package/models/components/transcriptionstreamdone.d.ts.map +1 -0
- package/models/components/transcriptionstreamdone.js +98 -0
- package/models/components/transcriptionstreamdone.js.map +1 -0
- package/models/components/transcriptionstreamevents.d.ts +89 -0
- package/models/components/transcriptionstreamevents.d.ts.map +1 -0
- package/models/components/transcriptionstreamevents.js +138 -0
- package/models/components/transcriptionstreamevents.js.map +1 -0
- package/models/components/transcriptionstreameventtypes.d.ts +34 -0
- package/models/components/transcriptionstreameventtypes.d.ts.map +1 -0
- package/models/components/transcriptionstreameventtypes.js +52 -0
- package/models/components/transcriptionstreameventtypes.js.map +1 -0
- package/models/components/transcriptionstreamlanguage.d.ts +58 -0
- package/models/components/transcriptionstreamlanguage.d.ts.map +1 -0
- package/models/components/transcriptionstreamlanguage.js +93 -0
- package/models/components/transcriptionstreamlanguage.js.map +1 -0
- package/models/components/transcriptionstreamsegmentdelta.d.ts +62 -0
- package/models/components/transcriptionstreamsegmentdelta.d.ts.map +1 -0
- package/models/components/transcriptionstreamsegmentdelta.js +92 -0
- package/models/components/transcriptionstreamsegmentdelta.js.map +1 -0
- package/models/components/transcriptionstreamtextdelta.d.ts +58 -0
- package/models/components/transcriptionstreamtextdelta.d.ts.map +1 -0
- package/models/components/transcriptionstreamtextdelta.js +88 -0
- package/models/components/transcriptionstreamtextdelta.js.map +1 -0
- package/models/components/uploadfileout.d.ts +4 -0
- package/models/components/uploadfileout.d.ts.map +1 -1
- package/models/components/uploadfileout.js +4 -0
- package/models/components/uploadfileout.js.map +1 -1
- package/models/components/usageinfo.d.ts +9 -3
- package/models/components/usageinfo.d.ts.map +1 -1
- package/models/components/usageinfo.js +22 -13
- package/models/components/usageinfo.js.map +1 -1
- package/models/operations/jobsapiroutesbatchgetbatchjobs.d.ts +2 -0
- package/models/operations/jobsapiroutesbatchgetbatchjobs.d.ts.map +1 -1
- package/models/operations/jobsapiroutesbatchgetbatchjobs.js +4 -0
- package/models/operations/jobsapiroutesbatchgetbatchjobs.js.map +1 -1
- package/package.json +1 -1
- package/sdk/audio.d.ts +7 -0
- package/sdk/audio.d.ts.map +1 -0
- package/sdk/audio.js +15 -0
- package/sdk/audio.js.map +1 -0
- package/sdk/sdk.d.ts +3 -0
- package/sdk/sdk.d.ts.map +1 -1
- package/sdk/sdk.js +4 -0
- package/sdk/sdk.js.map +1 -1
- package/sdk/transcriptions.d.ts +14 -0
- package/sdk/transcriptions.d.ts.map +1 -0
- package/sdk/transcriptions.js +26 -0
- package/sdk/transcriptions.js.map +1 -0
- package/src/funcs/audioTranscriptionsComplete.ts +193 -0
- package/src/funcs/audioTranscriptionsStream.ts +207 -0
- package/src/funcs/batchJobsList.ts +1 -0
- package/src/lib/config.ts +2 -2
- package/src/models/components/audiochunk.ts +102 -0
- package/src/models/components/audiotranscriptionrequest.ts +133 -0
- package/src/models/components/audiotranscriptionrequeststream.ts +135 -0
- package/src/models/components/basemodelcard.ts +13 -12
- package/src/models/components/batchjobin.ts +10 -4
- package/src/models/components/batchjobout.ts +10 -4
- package/src/models/components/classifierftmodelout.ts +12 -0
- package/src/models/components/completionargs.ts +4 -4
- package/src/models/components/completionftmodelout.ts +12 -0
- package/src/models/components/contentchunk.ts +38 -2
- package/src/models/components/fileschema.ts +8 -0
- package/src/models/components/index.ts +13 -0
- package/src/models/components/retrievefileout.ts +8 -0
- package/src/models/components/thinkchunk.ts +162 -0
- package/src/models/components/timestampgranularity.ts +32 -0
- package/src/models/components/toolcall.ts +50 -0
- package/src/models/components/transcriptionresponse.ts +112 -0
- package/src/models/components/transcriptionsegmentchunk.ts +122 -0
- package/src/models/components/transcriptionstreamdone.ts +149 -0
- package/src/models/components/transcriptionstreamevents.ts +273 -0
- package/src/models/components/transcriptionstreameventtypes.ts +37 -0
- package/src/models/components/transcriptionstreamlanguage.ts +128 -0
- package/src/models/components/transcriptionstreamsegmentdelta.ts +133 -0
- package/src/models/components/transcriptionstreamtextdelta.ts +123 -0
- package/src/models/components/uploadfileout.ts +8 -0
- package/src/models/components/usageinfo.ts +37 -17
- package/src/models/operations/jobsapiroutesbatchgetbatchjobs.ts +6 -0
- package/src/sdk/audio.ts +13 -0
- package/src/sdk/sdk.ts +6 -0
- package/src/sdk/transcriptions.ts +40 -0
|
@@ -47,7 +47,9 @@ export type UploadFileOut = {
|
|
|
47
47
|
purpose: FilePurpose;
|
|
48
48
|
sampleType: SampleType;
|
|
49
49
|
numLines?: number | null | undefined;
|
|
50
|
+
mimetype?: string | null | undefined;
|
|
50
51
|
source: Source;
|
|
52
|
+
signature?: string | null | undefined;
|
|
51
53
|
};
|
|
52
54
|
|
|
53
55
|
/** @internal */
|
|
@@ -64,7 +66,9 @@ export const UploadFileOut$inboundSchema: z.ZodType<
|
|
|
64
66
|
purpose: FilePurpose$inboundSchema,
|
|
65
67
|
sample_type: SampleType$inboundSchema,
|
|
66
68
|
num_lines: z.nullable(z.number().int()).optional(),
|
|
69
|
+
mimetype: z.nullable(z.string()).optional(),
|
|
67
70
|
source: Source$inboundSchema,
|
|
71
|
+
signature: z.nullable(z.string()).optional(),
|
|
68
72
|
}).transform((v) => {
|
|
69
73
|
return remap$(v, {
|
|
70
74
|
"bytes": "sizeBytes",
|
|
@@ -84,7 +88,9 @@ export type UploadFileOut$Outbound = {
|
|
|
84
88
|
purpose: string;
|
|
85
89
|
sample_type: string;
|
|
86
90
|
num_lines?: number | null | undefined;
|
|
91
|
+
mimetype?: string | null | undefined;
|
|
87
92
|
source: string;
|
|
93
|
+
signature?: string | null | undefined;
|
|
88
94
|
};
|
|
89
95
|
|
|
90
96
|
/** @internal */
|
|
@@ -101,7 +107,9 @@ export const UploadFileOut$outboundSchema: z.ZodType<
|
|
|
101
107
|
purpose: FilePurpose$outboundSchema,
|
|
102
108
|
sampleType: SampleType$outboundSchema,
|
|
103
109
|
numLines: z.nullable(z.number().int()).optional(),
|
|
110
|
+
mimetype: z.nullable(z.string()).optional(),
|
|
104
111
|
source: Source$outboundSchema,
|
|
112
|
+
signature: z.nullable(z.string()).optional(),
|
|
105
113
|
}).transform((v) => {
|
|
106
114
|
return remap$(v, {
|
|
107
115
|
sizeBytes: "bytes",
|
|
@@ -4,14 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
import * as z from "zod";
|
|
6
6
|
import { remap as remap$ } from "../../lib/primitives.js";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
collectExtraKeys as collectExtraKeys$,
|
|
9
|
+
safeParse,
|
|
10
|
+
} from "../../lib/schemas.js";
|
|
8
11
|
import { Result as SafeParseResult } from "../../types/fp.js";
|
|
9
12
|
import { SDKValidationError } from "../errors/sdkvalidationerror.js";
|
|
10
13
|
|
|
11
14
|
export type UsageInfo = {
|
|
12
|
-
promptTokens
|
|
13
|
-
completionTokens
|
|
14
|
-
totalTokens
|
|
15
|
+
promptTokens?: number | undefined;
|
|
16
|
+
completionTokens?: number | undefined;
|
|
17
|
+
totalTokens?: number | undefined;
|
|
18
|
+
promptAudioSeconds?: number | null | undefined;
|
|
19
|
+
additionalProperties?: { [k: string]: any };
|
|
15
20
|
};
|
|
16
21
|
|
|
17
22
|
/** @internal */
|
|
@@ -19,15 +24,21 @@ export const UsageInfo$inboundSchema: z.ZodType<
|
|
|
19
24
|
UsageInfo,
|
|
20
25
|
z.ZodTypeDef,
|
|
21
26
|
unknown
|
|
22
|
-
> =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
> = collectExtraKeys$(
|
|
28
|
+
z.object({
|
|
29
|
+
prompt_tokens: z.number().int().default(0),
|
|
30
|
+
completion_tokens: z.number().int().default(0),
|
|
31
|
+
total_tokens: z.number().int().default(0),
|
|
32
|
+
prompt_audio_seconds: z.nullable(z.number().int()).optional(),
|
|
33
|
+
}).catchall(z.any()),
|
|
34
|
+
"additionalProperties",
|
|
35
|
+
true,
|
|
36
|
+
).transform((v) => {
|
|
27
37
|
return remap$(v, {
|
|
28
38
|
"prompt_tokens": "promptTokens",
|
|
29
39
|
"completion_tokens": "completionTokens",
|
|
30
40
|
"total_tokens": "totalTokens",
|
|
41
|
+
"prompt_audio_seconds": "promptAudioSeconds",
|
|
31
42
|
});
|
|
32
43
|
});
|
|
33
44
|
|
|
@@ -36,6 +47,8 @@ export type UsageInfo$Outbound = {
|
|
|
36
47
|
prompt_tokens: number;
|
|
37
48
|
completion_tokens: number;
|
|
38
49
|
total_tokens: number;
|
|
50
|
+
prompt_audio_seconds?: number | null | undefined;
|
|
51
|
+
[additionalProperties: string]: unknown;
|
|
39
52
|
};
|
|
40
53
|
|
|
41
54
|
/** @internal */
|
|
@@ -44,15 +57,22 @@ export const UsageInfo$outboundSchema: z.ZodType<
|
|
|
44
57
|
z.ZodTypeDef,
|
|
45
58
|
UsageInfo
|
|
46
59
|
> = z.object({
|
|
47
|
-
promptTokens: z.number().int(),
|
|
48
|
-
completionTokens: z.number().int(),
|
|
49
|
-
totalTokens: z.number().int(),
|
|
60
|
+
promptTokens: z.number().int().default(0),
|
|
61
|
+
completionTokens: z.number().int().default(0),
|
|
62
|
+
totalTokens: z.number().int().default(0),
|
|
63
|
+
promptAudioSeconds: z.nullable(z.number().int()).optional(),
|
|
64
|
+
additionalProperties: z.record(z.any()),
|
|
50
65
|
}).transform((v) => {
|
|
51
|
-
return
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
66
|
+
return {
|
|
67
|
+
...v.additionalProperties,
|
|
68
|
+
...remap$(v, {
|
|
69
|
+
promptTokens: "prompt_tokens",
|
|
70
|
+
completionTokens: "completion_tokens",
|
|
71
|
+
totalTokens: "total_tokens",
|
|
72
|
+
promptAudioSeconds: "prompt_audio_seconds",
|
|
73
|
+
additionalProperties: null,
|
|
74
|
+
}),
|
|
75
|
+
};
|
|
56
76
|
});
|
|
57
77
|
|
|
58
78
|
/**
|
|
@@ -13,6 +13,7 @@ export type JobsApiRoutesBatchGetBatchJobsRequest = {
|
|
|
13
13
|
page?: number | undefined;
|
|
14
14
|
pageSize?: number | undefined;
|
|
15
15
|
model?: string | null | undefined;
|
|
16
|
+
agentId?: string | null | undefined;
|
|
16
17
|
metadata?: { [k: string]: any } | null | undefined;
|
|
17
18
|
createdAfter?: Date | null | undefined;
|
|
18
19
|
createdByMe?: boolean | undefined;
|
|
@@ -28,6 +29,7 @@ export const JobsApiRoutesBatchGetBatchJobsRequest$inboundSchema: z.ZodType<
|
|
|
28
29
|
page: z.number().int().default(0),
|
|
29
30
|
page_size: z.number().int().default(100),
|
|
30
31
|
model: z.nullable(z.string()).optional(),
|
|
32
|
+
agent_id: z.nullable(z.string()).optional(),
|
|
31
33
|
metadata: z.nullable(z.record(z.any())).optional(),
|
|
32
34
|
created_after: z.nullable(
|
|
33
35
|
z.string().datetime({ offset: true }).transform(v => new Date(v)),
|
|
@@ -38,6 +40,7 @@ export const JobsApiRoutesBatchGetBatchJobsRequest$inboundSchema: z.ZodType<
|
|
|
38
40
|
}).transform((v) => {
|
|
39
41
|
return remap$(v, {
|
|
40
42
|
"page_size": "pageSize",
|
|
43
|
+
"agent_id": "agentId",
|
|
41
44
|
"created_after": "createdAfter",
|
|
42
45
|
"created_by_me": "createdByMe",
|
|
43
46
|
});
|
|
@@ -48,6 +51,7 @@ export type JobsApiRoutesBatchGetBatchJobsRequest$Outbound = {
|
|
|
48
51
|
page: number;
|
|
49
52
|
page_size: number;
|
|
50
53
|
model?: string | null | undefined;
|
|
54
|
+
agent_id?: string | null | undefined;
|
|
51
55
|
metadata?: { [k: string]: any } | null | undefined;
|
|
52
56
|
created_after?: string | null | undefined;
|
|
53
57
|
created_by_me: boolean;
|
|
@@ -63,6 +67,7 @@ export const JobsApiRoutesBatchGetBatchJobsRequest$outboundSchema: z.ZodType<
|
|
|
63
67
|
page: z.number().int().default(0),
|
|
64
68
|
pageSize: z.number().int().default(100),
|
|
65
69
|
model: z.nullable(z.string()).optional(),
|
|
70
|
+
agentId: z.nullable(z.string()).optional(),
|
|
66
71
|
metadata: z.nullable(z.record(z.any())).optional(),
|
|
67
72
|
createdAfter: z.nullable(z.date().transform(v => v.toISOString())).optional(),
|
|
68
73
|
createdByMe: z.boolean().default(false),
|
|
@@ -71,6 +76,7 @@ export const JobsApiRoutesBatchGetBatchJobsRequest$outboundSchema: z.ZodType<
|
|
|
71
76
|
}).transform((v) => {
|
|
72
77
|
return remap$(v, {
|
|
73
78
|
pageSize: "page_size",
|
|
79
|
+
agentId: "agent_id",
|
|
74
80
|
createdAfter: "created_after",
|
|
75
81
|
createdByMe: "created_by_me",
|
|
76
82
|
});
|
package/src/sdk/audio.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { ClientSDK } from "../lib/sdks.js";
|
|
6
|
+
import { Transcriptions } from "./transcriptions.js";
|
|
7
|
+
|
|
8
|
+
export class Audio extends ClientSDK {
|
|
9
|
+
private _transcriptions?: Transcriptions;
|
|
10
|
+
get transcriptions(): Transcriptions {
|
|
11
|
+
return (this._transcriptions ??= new Transcriptions(this._options));
|
|
12
|
+
}
|
|
13
|
+
}
|
package/src/sdk/sdk.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { ClientSDK } from "../lib/sdks.js";
|
|
6
6
|
import { Agents } from "./agents.js";
|
|
7
|
+
import { Audio } from "./audio.js";
|
|
7
8
|
import { Batch } from "./batch.js";
|
|
8
9
|
import { Beta } from "./beta.js";
|
|
9
10
|
import { Chat } from "./chat.js";
|
|
@@ -70,4 +71,9 @@ export class Mistral extends ClientSDK {
|
|
|
70
71
|
get ocr(): Ocr {
|
|
71
72
|
return (this._ocr ??= new Ocr(this._options));
|
|
72
73
|
}
|
|
74
|
+
|
|
75
|
+
private _audio?: Audio;
|
|
76
|
+
get audio(): Audio {
|
|
77
|
+
return (this._audio ??= new Audio(this._options));
|
|
78
|
+
}
|
|
73
79
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { audioTranscriptionsComplete } from "../funcs/audioTranscriptionsComplete.js";
|
|
6
|
+
import { audioTranscriptionsStream } from "../funcs/audioTranscriptionsStream.js";
|
|
7
|
+
import { EventStream } from "../lib/event-streams.js";
|
|
8
|
+
import { ClientSDK, RequestOptions } from "../lib/sdks.js";
|
|
9
|
+
import * as components from "../models/components/index.js";
|
|
10
|
+
import { unwrapAsync } from "../types/fp.js";
|
|
11
|
+
|
|
12
|
+
export class Transcriptions extends ClientSDK {
|
|
13
|
+
/**
|
|
14
|
+
* Create Transcription
|
|
15
|
+
*/
|
|
16
|
+
async complete(
|
|
17
|
+
request: components.AudioTranscriptionRequest,
|
|
18
|
+
options?: RequestOptions,
|
|
19
|
+
): Promise<components.TranscriptionResponse> {
|
|
20
|
+
return unwrapAsync(audioTranscriptionsComplete(
|
|
21
|
+
this,
|
|
22
|
+
request,
|
|
23
|
+
options,
|
|
24
|
+
));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Create streaming transcription (SSE)
|
|
29
|
+
*/
|
|
30
|
+
async stream(
|
|
31
|
+
request: components.AudioTranscriptionRequestStream,
|
|
32
|
+
options?: RequestOptions,
|
|
33
|
+
): Promise<EventStream<components.TranscriptionStreamEvents>> {
|
|
34
|
+
return unwrapAsync(audioTranscriptionsStream(
|
|
35
|
+
this,
|
|
36
|
+
request,
|
|
37
|
+
options,
|
|
38
|
+
));
|
|
39
|
+
}
|
|
40
|
+
}
|