openpond-sdk 0.1.6 → 0.1.7

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.
@@ -0,0 +1,630 @@
1
+ import { z } from "zod";
2
+ import { ModelProjectVersionedRefSchema } from "./model-projects.js";
3
+ export declare const ModelStarterCatalogQuerySchema: z.ZodObject<{
4
+ afterId: z.ZodOptional<z.ZodString>;
5
+ limit: z.ZodDefault<z.ZodNumber>;
6
+ }, z.core.$strict>;
7
+ export declare const ModelStarterCatalogPageSchema: z.ZodObject<{
8
+ items: z.ZodArray<z.ZodObject<{
9
+ schemaVersion: z.ZodLiteral<"openpond.modelStarter.v1">;
10
+ id: z.ZodString;
11
+ revision: z.ZodNumber;
12
+ name: z.ZodString;
13
+ description: z.ZodString;
14
+ category: z.ZodEnum<{
15
+ coding: "coding";
16
+ extraction: "extraction";
17
+ support: "support";
18
+ operations: "operations";
19
+ knowledge: "knowledge";
20
+ writing: "writing";
21
+ classification: "classification";
22
+ }>;
23
+ taskset: z.ZodObject<{
24
+ id: z.ZodString;
25
+ contentHash: z.ZodString;
26
+ revision: z.ZodNumber;
27
+ }, z.core.$strict>;
28
+ taskDefinition: z.ZodObject<{
29
+ id: z.ZodString;
30
+ contentHash: z.ZodString;
31
+ revision: z.ZodNumber;
32
+ }, z.core.$strict>;
33
+ rewardBinding: z.ZodObject<{
34
+ id: z.ZodString;
35
+ contentHash: z.ZodString;
36
+ revision: z.ZodNumber;
37
+ }, z.core.$strict>;
38
+ rewards: z.ZodArray<z.ZodObject<{
39
+ id: z.ZodString;
40
+ contentHash: z.ZodString;
41
+ revision: z.ZodNumber;
42
+ }, z.core.$strict>>;
43
+ assets: z.ZodArray<z.ZodObject<{
44
+ id: z.ZodString;
45
+ contentHash: z.ZodString;
46
+ revision: z.ZodNumber;
47
+ }, z.core.$strict>>;
48
+ previewTaskIds: z.ZodArray<z.ZodString>;
49
+ startingModel: z.ZodObject<{
50
+ schemaVersion: z.ZodLiteral<"openpond.baseModelPreference.v1">;
51
+ modelId: z.ZodString;
52
+ revision: z.ZodNullable<z.ZodString>;
53
+ tokenizerRevision: z.ZodNullable<z.ZodString>;
54
+ chatTemplateHash: z.ZodNullable<z.ZodString>;
55
+ modelAssetId: z.ZodNullable<z.ZodString>;
56
+ source: z.ZodEnum<{
57
+ local: "local";
58
+ managed: "managed";
59
+ builtin: "builtin";
60
+ }>;
61
+ }, z.core.$strict>;
62
+ supportedMethods: z.ZodArray<z.ZodEnum<{
63
+ sft: "sft";
64
+ dpo: "dpo";
65
+ grpo: "grpo";
66
+ ppo: "ppo";
67
+ sdft: "sdft";
68
+ opd: "opd";
69
+ opsd: "opsd";
70
+ sdpo: "sdpo";
71
+ }>>;
72
+ defaultMethod: z.ZodEnum<{
73
+ sft: "sft";
74
+ dpo: "dpo";
75
+ grpo: "grpo";
76
+ ppo: "ppo";
77
+ sdft: "sdft";
78
+ opd: "opd";
79
+ opsd: "opsd";
80
+ sdpo: "sdpo";
81
+ }>;
82
+ provenance: z.ZodObject<{
83
+ author: z.ZodString;
84
+ license: z.ZodString;
85
+ sourceDescription: z.ZodString;
86
+ }, z.core.$strict>;
87
+ evidence: z.ZodObject<{
88
+ verifierFixtures: z.ZodNullable<z.ZodObject<{
89
+ id: z.ZodString;
90
+ contentHash: z.ZodString;
91
+ revision: z.ZodNumber;
92
+ }, z.core.$strict>>;
93
+ baseline: z.ZodNullable<z.ZodObject<{
94
+ id: z.ZodString;
95
+ contentHash: z.ZodString;
96
+ revision: z.ZodNumber;
97
+ }, z.core.$strict>>;
98
+ training: z.ZodNullable<z.ZodObject<{
99
+ id: z.ZodString;
100
+ contentHash: z.ZodString;
101
+ revision: z.ZodNumber;
102
+ }, z.core.$strict>>;
103
+ evaluation: z.ZodNullable<z.ZodObject<{
104
+ id: z.ZodString;
105
+ contentHash: z.ZodString;
106
+ revision: z.ZodNumber;
107
+ }, z.core.$strict>>;
108
+ }, z.core.$strict>;
109
+ contentHash: z.ZodString;
110
+ }, z.core.$strict>>;
111
+ nextCursor: z.ZodNullable<z.ZodString>;
112
+ }, z.core.$strict>;
113
+ export declare const ModelStarterCatalogErrorSchema: z.ZodObject<{
114
+ code: z.ZodString;
115
+ message: z.ZodString;
116
+ }, z.core.$strict>;
117
+ export declare class OpenPondModelStarterCatalogError extends Error {
118
+ readonly status: number;
119
+ readonly code: string;
120
+ constructor(status: number, code: string, message: string);
121
+ }
122
+ /** One hosted catalog for both clients. Discovery never downloads task rows;
123
+ * exact resolution obtains a bounded, integrity-checked package separately. */
124
+ export declare class OpenPondModelStarterCatalogClient {
125
+ #private;
126
+ constructor(options: {
127
+ baseUrl: string;
128
+ apiKey: string;
129
+ teamId: string;
130
+ fetch?: typeof globalThis.fetch;
131
+ });
132
+ list(query?: z.input<typeof ModelStarterCatalogQuerySchema>, options?: {
133
+ signal?: AbortSignal;
134
+ }): Promise<{
135
+ items: {
136
+ schemaVersion: "openpond.modelStarter.v1";
137
+ id: string;
138
+ revision: number;
139
+ name: string;
140
+ description: string;
141
+ category: "coding" | "extraction" | "support" | "operations" | "knowledge" | "writing" | "classification";
142
+ taskset: {
143
+ id: string;
144
+ contentHash: string;
145
+ revision: number;
146
+ };
147
+ taskDefinition: {
148
+ id: string;
149
+ contentHash: string;
150
+ revision: number;
151
+ };
152
+ rewardBinding: {
153
+ id: string;
154
+ contentHash: string;
155
+ revision: number;
156
+ };
157
+ rewards: {
158
+ id: string;
159
+ contentHash: string;
160
+ revision: number;
161
+ }[];
162
+ assets: {
163
+ id: string;
164
+ contentHash: string;
165
+ revision: number;
166
+ }[];
167
+ previewTaskIds: string[];
168
+ startingModel: {
169
+ schemaVersion: "openpond.baseModelPreference.v1";
170
+ modelId: string;
171
+ revision: string | null;
172
+ tokenizerRevision: string | null;
173
+ chatTemplateHash: string | null;
174
+ modelAssetId: string | null;
175
+ source: "local" | "managed" | "builtin";
176
+ };
177
+ supportedMethods: ("sft" | "dpo" | "grpo" | "ppo" | "sdft" | "opd" | "opsd" | "sdpo")[];
178
+ defaultMethod: "sft" | "dpo" | "grpo" | "ppo" | "sdft" | "opd" | "opsd" | "sdpo";
179
+ provenance: {
180
+ author: string;
181
+ license: string;
182
+ sourceDescription: string;
183
+ };
184
+ evidence: {
185
+ verifierFixtures: {
186
+ id: string;
187
+ contentHash: string;
188
+ revision: number;
189
+ } | null;
190
+ baseline: {
191
+ id: string;
192
+ contentHash: string;
193
+ revision: number;
194
+ } | null;
195
+ training: {
196
+ id: string;
197
+ contentHash: string;
198
+ revision: number;
199
+ } | null;
200
+ evaluation: {
201
+ id: string;
202
+ contentHash: string;
203
+ revision: number;
204
+ } | null;
205
+ };
206
+ contentHash: string;
207
+ }[];
208
+ nextCursor: string | null;
209
+ }>;
210
+ resolve(reference: z.infer<typeof ModelProjectVersionedRefSchema>, options?: {
211
+ signal?: AbortSignal;
212
+ }): Promise<{
213
+ starter: {
214
+ schemaVersion: "openpond.modelStarter.v1";
215
+ id: string;
216
+ revision: number;
217
+ name: string;
218
+ description: string;
219
+ category: "coding" | "extraction" | "support" | "operations" | "knowledge" | "writing" | "classification";
220
+ taskset: {
221
+ id: string;
222
+ contentHash: string;
223
+ revision: number;
224
+ };
225
+ taskDefinition: {
226
+ id: string;
227
+ contentHash: string;
228
+ revision: number;
229
+ };
230
+ rewardBinding: {
231
+ id: string;
232
+ contentHash: string;
233
+ revision: number;
234
+ };
235
+ rewards: {
236
+ id: string;
237
+ contentHash: string;
238
+ revision: number;
239
+ }[];
240
+ assets: {
241
+ id: string;
242
+ contentHash: string;
243
+ revision: number;
244
+ }[];
245
+ previewTaskIds: string[];
246
+ startingModel: {
247
+ schemaVersion: "openpond.baseModelPreference.v1";
248
+ modelId: string;
249
+ revision: string | null;
250
+ tokenizerRevision: string | null;
251
+ chatTemplateHash: string | null;
252
+ modelAssetId: string | null;
253
+ source: "local" | "managed" | "builtin";
254
+ };
255
+ supportedMethods: ("sft" | "dpo" | "grpo" | "ppo" | "sdft" | "opd" | "opsd" | "sdpo")[];
256
+ defaultMethod: "sft" | "dpo" | "grpo" | "ppo" | "sdft" | "opd" | "opsd" | "sdpo";
257
+ provenance: {
258
+ author: string;
259
+ license: string;
260
+ sourceDescription: string;
261
+ };
262
+ evidence: {
263
+ verifierFixtures: {
264
+ id: string;
265
+ contentHash: string;
266
+ revision: number;
267
+ } | null;
268
+ baseline: {
269
+ id: string;
270
+ contentHash: string;
271
+ revision: number;
272
+ } | null;
273
+ training: {
274
+ id: string;
275
+ contentHash: string;
276
+ revision: number;
277
+ } | null;
278
+ evaluation: {
279
+ id: string;
280
+ contentHash: string;
281
+ revision: number;
282
+ } | null;
283
+ };
284
+ contentHash: string;
285
+ };
286
+ taskset: {
287
+ schemaVersion: "openpond.tasksetRelease.v2";
288
+ id: string;
289
+ revision: number;
290
+ policy: {
291
+ policyVisibleFields: string[];
292
+ privilegedFields: string[];
293
+ hiddenGraderRefs: string[];
294
+ connectedAppScopes: string[];
295
+ };
296
+ environment: {
297
+ protocolVersion: "openpond.environment.v1";
298
+ kind: "text" | "work" | "agent" | "custom_program";
299
+ entrypoint: string;
300
+ stateful: boolean;
301
+ deterministicSeeds: boolean;
302
+ lifecycle: ("create" | "reset" | "step" | "collect" | "destroy")[];
303
+ networkPolicy: "none" | "declared_read_only" | "declared_scoped";
304
+ defaultTimeoutMs: number;
305
+ };
306
+ tools: {
307
+ name: string;
308
+ description: string;
309
+ inputSchema: Record<string, unknown>;
310
+ inputSchemaHash: string;
311
+ sideEffect: "read" | "write";
312
+ timeoutMs: number;
313
+ }[];
314
+ capabilities: {
315
+ id: string;
316
+ required: boolean;
317
+ scopes: string[];
318
+ portability: "portable" | "host_adapter" | "local_only" | "hosted_only";
319
+ }[];
320
+ tasks: {
321
+ id: string;
322
+ clusterKey: string;
323
+ split: "train" | "validation" | "test" | "frozen_eval";
324
+ input: Record<string, unknown>;
325
+ expectedOutput: Record<string, unknown> | null;
326
+ policyVisibleContext: Record<string, unknown>;
327
+ privilegedContextRef: string | null;
328
+ artifactRefs: {
329
+ id: string;
330
+ path: string;
331
+ contentHash: string;
332
+ sizeBytes: number;
333
+ mediaType: string;
334
+ visibility: "policy" | "verifier" | "host_private";
335
+ }[];
336
+ tags: string[];
337
+ requiredOutputs?: {
338
+ path: string;
339
+ mediaType: string;
340
+ schemaRef: {
341
+ id: string;
342
+ path: string;
343
+ contentHash: string;
344
+ sizeBytes: number;
345
+ mediaType: string;
346
+ visibility: "policy" | "verifier" | "host_private";
347
+ } | null;
348
+ maxBytes: number | null;
349
+ metadata: Record<string, unknown>;
350
+ }[] | undefined;
351
+ }[];
352
+ graders: ({
353
+ id: string;
354
+ version: string;
355
+ weight: number;
356
+ hardGate: boolean;
357
+ rewardEligible: boolean;
358
+ privileged: boolean;
359
+ kind: "state" | "content" | "schema" | "artifact" | "runtime_event";
360
+ config: Record<string, unknown>;
361
+ } | {
362
+ id: string;
363
+ version: string;
364
+ weight: number;
365
+ hardGate: boolean;
366
+ rewardEligible: boolean;
367
+ privileged: boolean;
368
+ kind: "model_judge";
369
+ rubricRef: {
370
+ id: string;
371
+ path: string;
372
+ contentHash: string;
373
+ sizeBytes: number;
374
+ mediaType: string;
375
+ visibility: "policy" | "verifier" | "host_private";
376
+ };
377
+ calibrationStatus: "failed" | "pending" | "passed";
378
+ model?: {
379
+ providerId: string;
380
+ modelId: string;
381
+ revision: string | null;
382
+ } | undefined;
383
+ temperature?: number | undefined;
384
+ } | {
385
+ id: string;
386
+ version: string;
387
+ weight: number;
388
+ hardGate: boolean;
389
+ rewardEligible: boolean;
390
+ privileged: boolean;
391
+ kind: "custom_verifier";
392
+ verifierRef: {
393
+ id: string;
394
+ path: string;
395
+ contentHash: string;
396
+ sizeBytes: number;
397
+ mediaType: string;
398
+ visibility: "policy" | "verifier" | "host_private";
399
+ };
400
+ timeoutMs: number;
401
+ networkPolicy: "none";
402
+ exportName?: string | undefined;
403
+ } | {
404
+ id: string;
405
+ version: string;
406
+ weight: number;
407
+ hardGate: boolean;
408
+ rewardEligible: boolean;
409
+ privileged: boolean;
410
+ kind: "human";
411
+ rubricRef: {
412
+ id: string;
413
+ path: string;
414
+ contentHash: string;
415
+ sizeBytes: number;
416
+ mediaType: string;
417
+ visibility: "policy" | "verifier" | "host_private";
418
+ };
419
+ reviewerRole: string;
420
+ })[];
421
+ metadata: Record<string, unknown>;
422
+ contentHash: string;
423
+ environmentRelease?: {
424
+ id: string;
425
+ contentHash: string;
426
+ } | undefined;
427
+ verifierSetRelease?: {
428
+ id: string;
429
+ contentHash: string;
430
+ } | undefined;
431
+ };
432
+ taskDefinition: {
433
+ schemaVersion: "openpond.taskDefinition.v1";
434
+ id: string;
435
+ revision: number;
436
+ name: string;
437
+ description: string;
438
+ instructions: string;
439
+ category: "custom" | "structured" | "question_answering" | "coding" | "tool_workflow";
440
+ familyNamespace: string;
441
+ inputSchema: Record<string, unknown>;
442
+ outputSchema: Record<string, unknown>;
443
+ rewardBinding: {
444
+ id: string;
445
+ contentHash: string;
446
+ revision: number;
447
+ };
448
+ harness: {
449
+ id: string;
450
+ contentHash: string;
451
+ } | null;
452
+ execution: {
453
+ policy: {
454
+ policyVisibleFields: string[];
455
+ privilegedFields: string[];
456
+ hiddenGraderRefs: string[];
457
+ connectedAppScopes: string[];
458
+ };
459
+ environment: {
460
+ protocolVersion: "openpond.environment.v1";
461
+ kind: "text" | "work" | "agent" | "custom_program";
462
+ entrypoint: string;
463
+ stateful: boolean;
464
+ deterministicSeeds: boolean;
465
+ lifecycle: ("create" | "reset" | "step" | "collect" | "destroy")[];
466
+ networkPolicy: "none" | "declared_read_only" | "declared_scoped";
467
+ defaultTimeoutMs: number;
468
+ };
469
+ tools: {
470
+ name: string;
471
+ description: string;
472
+ inputSchema: Record<string, unknown>;
473
+ inputSchemaHash: string;
474
+ sideEffect: "read" | "write";
475
+ timeoutMs: number;
476
+ }[];
477
+ capabilities: {
478
+ id: string;
479
+ required: boolean;
480
+ scopes: string[];
481
+ portability: "portable" | "host_adapter" | "local_only" | "hosted_only";
482
+ }[];
483
+ environmentRelease?: {
484
+ id: string;
485
+ contentHash: string;
486
+ } | undefined;
487
+ verifierSetRelease?: {
488
+ id: string;
489
+ contentHash: string;
490
+ } | undefined;
491
+ };
492
+ contentHash: string;
493
+ };
494
+ rewardBinding: {
495
+ schemaVersion: "openpond.rewardBinding.v1";
496
+ id: string;
497
+ revision: number;
498
+ sources: {
499
+ graderId: string;
500
+ reward: {
501
+ id: string;
502
+ contentHash: string;
503
+ revision: number;
504
+ };
505
+ role: "evaluation" | "training";
506
+ normalization: {
507
+ kind: "identity";
508
+ } | {
509
+ kind: "linear";
510
+ minimum: number;
511
+ maximum: number;
512
+ direction: "higher" | "lower";
513
+ };
514
+ weight: number;
515
+ required: boolean;
516
+ hardGate: boolean;
517
+ privileged: boolean;
518
+ fixtureRefs: {
519
+ id: string;
520
+ contentHash: string;
521
+ }[];
522
+ }[];
523
+ aggregation: "weighted_mean";
524
+ unscorable: "exclude_optional_require_all_required";
525
+ contentHash: string;
526
+ name?: string | undefined;
527
+ description?: string | undefined;
528
+ recipeRef?: {
529
+ id: string;
530
+ contentHash: string;
531
+ revision: number;
532
+ } | undefined;
533
+ };
534
+ rewards: {
535
+ schemaVersion: "openpond.rewardRelease.v1";
536
+ id: string;
537
+ revision: number;
538
+ name: string;
539
+ description: string;
540
+ implementation: {
541
+ kind: "state" | "content" | "schema" | "artifact" | "runtime_event";
542
+ config: Record<string, unknown>;
543
+ } | {
544
+ kind: "model_judge";
545
+ rubricRef: {
546
+ id: string;
547
+ path: string;
548
+ contentHash: string;
549
+ sizeBytes: number;
550
+ mediaType: string;
551
+ visibility: "policy" | "verifier" | "host_private";
552
+ };
553
+ calibrationStatus: "failed" | "pending" | "passed";
554
+ model?: {
555
+ providerId: string;
556
+ modelId: string;
557
+ revision: string | null;
558
+ } | undefined;
559
+ temperature?: number | undefined;
560
+ } | {
561
+ kind: "custom_verifier";
562
+ networkPolicy: "none";
563
+ verifierRef: {
564
+ id: string;
565
+ path: string;
566
+ contentHash: string;
567
+ sizeBytes: number;
568
+ mediaType: string;
569
+ visibility: "policy" | "verifier" | "host_private";
570
+ };
571
+ timeoutMs: number;
572
+ exportName?: string | undefined;
573
+ } | {
574
+ kind: "human";
575
+ rubricRef: {
576
+ id: string;
577
+ path: string;
578
+ contentHash: string;
579
+ sizeBytes: number;
580
+ mediaType: string;
581
+ visibility: "policy" | "verifier" | "host_private";
582
+ };
583
+ reviewerRole: string;
584
+ } | {
585
+ kind: "learned_model";
586
+ modelVersion: {
587
+ id: string;
588
+ contentHash: string;
589
+ };
590
+ inputContract: {
591
+ id: string;
592
+ path: string;
593
+ contentHash: string;
594
+ sizeBytes: number;
595
+ mediaType: string;
596
+ visibility: "policy" | "verifier" | "host_private";
597
+ };
598
+ };
599
+ rawScore: {
600
+ minimum: number;
601
+ maximum: number;
602
+ };
603
+ assets: {
604
+ id: string;
605
+ path: string;
606
+ contentHash: string;
607
+ sizeBytes: number;
608
+ mediaType: string;
609
+ visibility: "policy" | "verifier" | "host_private";
610
+ }[];
611
+ contentHash: string;
612
+ }[];
613
+ assets: {
614
+ schemaVersion: "openpond.learningTextAsset.v1";
615
+ id: string;
616
+ revision: 1;
617
+ asset: {
618
+ id: string;
619
+ path: string;
620
+ contentHash: string;
621
+ sizeBytes: number;
622
+ mediaType: string;
623
+ visibility: "policy" | "verifier" | "host_private";
624
+ };
625
+ text: string;
626
+ contentHash: string;
627
+ }[];
628
+ }>;
629
+ }
630
+ //# sourceMappingURL=model-starter-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-starter-catalog.d.ts","sourceRoot":"","sources":["../../../../../src/model-starter-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAGrE,eAAO,MAAM,8BAA8B;;;kBAGhC,CAAC;AACZ,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAG/B,CAAC;AACZ,eAAO,MAAM,8BAA8B;;;kBAAiG,CAAC;AAE7I,qBAAa,gCAAiC,SAAQ,KAAK;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAArC,MAAM,EAAE,MAAM,EAAW,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAC5E;AAED;+EAC+E;AAC/E,qBAAa,iCAAiC;;gBAEhC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;KAAE;IAOnG,IAAI,CAAC,KAAK,GAAE,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IASvG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiChH"}