@camstack/addon-vision 0.1.6 → 0.1.9

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.
Files changed (136) hide show
  1. package/dist/addons/animal-classifier/index.d.mts +30 -0
  2. package/dist/addons/animal-classifier/index.d.ts +30 -0
  3. package/dist/addons/animal-classifier/index.js +822 -999
  4. package/dist/addons/animal-classifier/index.js.map +1 -1
  5. package/dist/addons/animal-classifier/index.mjs +7 -242
  6. package/dist/addons/animal-classifier/index.mjs.map +1 -1
  7. package/dist/addons/audio-classification/index.d.mts +36 -0
  8. package/dist/addons/audio-classification/index.d.ts +36 -0
  9. package/dist/addons/audio-classification/index.js +378 -501
  10. package/dist/addons/audio-classification/index.js.map +1 -1
  11. package/dist/addons/audio-classification/index.mjs +4 -224
  12. package/dist/addons/audio-classification/index.mjs.map +1 -1
  13. package/dist/addons/bird-global-classifier/index.d.mts +31 -0
  14. package/dist/addons/bird-global-classifier/index.d.ts +31 -0
  15. package/dist/addons/bird-global-classifier/index.js +825 -1002
  16. package/dist/addons/bird-global-classifier/index.js.map +1 -1
  17. package/dist/addons/bird-global-classifier/index.mjs +7 -248
  18. package/dist/addons/bird-global-classifier/index.mjs.map +1 -1
  19. package/dist/addons/bird-nabirds-classifier/index.d.mts +33 -0
  20. package/dist/addons/bird-nabirds-classifier/index.d.ts +33 -0
  21. package/dist/addons/bird-nabirds-classifier/index.js +825 -1002
  22. package/dist/addons/bird-nabirds-classifier/index.js.map +1 -1
  23. package/dist/addons/bird-nabirds-classifier/index.mjs +7 -289
  24. package/dist/addons/bird-nabirds-classifier/index.mjs.map +1 -1
  25. package/dist/addons/face-detection/index.d.mts +29 -0
  26. package/dist/addons/face-detection/index.d.ts +29 -0
  27. package/dist/addons/face-detection/index.js +934 -1196
  28. package/dist/addons/face-detection/index.js.map +1 -1
  29. package/dist/addons/face-detection/index.mjs +7 -227
  30. package/dist/addons/face-detection/index.mjs.map +1 -1
  31. package/dist/addons/face-recognition/index.d.mts +29 -0
  32. package/dist/addons/face-recognition/index.d.ts +29 -0
  33. package/dist/addons/face-recognition/index.js +807 -1003
  34. package/dist/addons/face-recognition/index.js.map +1 -1
  35. package/dist/addons/face-recognition/index.mjs +6 -197
  36. package/dist/addons/face-recognition/index.mjs.map +1 -1
  37. package/dist/addons/motion-detection/index.d.mts +28 -0
  38. package/dist/addons/motion-detection/index.d.ts +28 -0
  39. package/dist/addons/motion-detection/index.js +111 -214
  40. package/dist/addons/motion-detection/index.js.map +1 -1
  41. package/dist/addons/motion-detection/index.mjs +9 -12
  42. package/dist/addons/motion-detection/index.mjs.map +1 -1
  43. package/dist/addons/object-detection/index.d.mts +31 -0
  44. package/dist/addons/object-detection/index.d.ts +31 -0
  45. package/dist/addons/object-detection/index.js +1082 -1287
  46. package/dist/addons/object-detection/index.js.map +1 -1
  47. package/dist/addons/object-detection/index.mjs +7 -373
  48. package/dist/addons/object-detection/index.mjs.map +1 -1
  49. package/dist/addons/plate-detection/index.d.mts +30 -0
  50. package/dist/addons/plate-detection/index.d.ts +30 -0
  51. package/dist/addons/plate-detection/index.js +868 -1075
  52. package/dist/addons/plate-detection/index.js.map +1 -1
  53. package/dist/addons/plate-detection/index.mjs +7 -230
  54. package/dist/addons/plate-detection/index.mjs.map +1 -1
  55. package/dist/addons/plate-recognition/index.d.mts +31 -0
  56. package/dist/addons/plate-recognition/index.d.ts +31 -0
  57. package/dist/addons/plate-recognition/index.js +505 -684
  58. package/dist/addons/plate-recognition/index.js.map +1 -1
  59. package/dist/addons/plate-recognition/index.mjs +5 -244
  60. package/dist/addons/plate-recognition/index.mjs.map +1 -1
  61. package/dist/addons/segmentation-refiner/index.d.mts +30 -0
  62. package/dist/addons/segmentation-refiner/index.d.ts +30 -0
  63. package/dist/addons/segmentation-refiner/index.js +790 -967
  64. package/dist/addons/segmentation-refiner/index.js.map +1 -1
  65. package/dist/addons/segmentation-refiner/index.mjs +17 -21
  66. package/dist/addons/segmentation-refiner/index.mjs.map +1 -1
  67. package/dist/addons/vehicle-classifier/index.d.mts +31 -0
  68. package/dist/addons/vehicle-classifier/index.d.ts +31 -0
  69. package/dist/addons/vehicle-classifier/index.js +410 -581
  70. package/dist/addons/vehicle-classifier/index.js.map +1 -1
  71. package/dist/addons/vehicle-classifier/index.mjs +16 -20
  72. package/dist/addons/vehicle-classifier/index.mjs.map +1 -1
  73. package/dist/chunk-22BHCDT5.mjs +101 -0
  74. package/dist/{chunk-WG66JYYW.mjs.map → chunk-22BHCDT5.mjs.map} +1 -1
  75. package/dist/chunk-2IOKI4ES.mjs +335 -0
  76. package/dist/{chunk-PIFS7AIT.mjs.map → chunk-2IOKI4ES.mjs.map} +1 -1
  77. package/dist/chunk-7DYHXUPZ.mjs +36 -0
  78. package/dist/{chunk-BS4DKYGN.mjs.map → chunk-7DYHXUPZ.mjs.map} +1 -1
  79. package/dist/chunk-BJTO5JO5.mjs +11 -0
  80. package/dist/chunk-BP7H4NFS.mjs +412 -0
  81. package/dist/{chunk-MGT6RUVX.mjs.map → chunk-BP7H4NFS.mjs.map} +1 -1
  82. package/dist/chunk-BR2FPGOX.mjs +98 -0
  83. package/dist/{chunk-YYDM6V2F.mjs.map → chunk-BR2FPGOX.mjs.map} +1 -1
  84. package/dist/chunk-D6WEHN33.mjs +276 -0
  85. package/dist/chunk-D6WEHN33.mjs.map +1 -0
  86. package/dist/chunk-DRYFGARD.mjs +289 -0
  87. package/dist/chunk-DRYFGARD.mjs.map +1 -0
  88. package/dist/chunk-DUN6XU3N.mjs +72 -0
  89. package/dist/{chunk-XD7WGXHZ.mjs.map → chunk-DUN6XU3N.mjs.map} +1 -1
  90. package/dist/chunk-ESLHNWWE.mjs +387 -0
  91. package/dist/chunk-ESLHNWWE.mjs.map +1 -0
  92. package/dist/chunk-JUQEW6ON.mjs +256 -0
  93. package/dist/chunk-JUQEW6ON.mjs.map +1 -0
  94. package/dist/chunk-KUO2BVFY.mjs +90 -0
  95. package/dist/{chunk-DE7I3VHO.mjs.map → chunk-KUO2BVFY.mjs.map} +1 -1
  96. package/dist/chunk-R5J3WAUI.mjs +645 -0
  97. package/dist/chunk-R5J3WAUI.mjs.map +1 -0
  98. package/dist/chunk-XZ6ZMXXU.mjs +39 -0
  99. package/dist/{chunk-K36R6HWY.mjs.map → chunk-XZ6ZMXXU.mjs.map} +1 -1
  100. package/dist/chunk-YPU4WTXZ.mjs +269 -0
  101. package/dist/chunk-YPU4WTXZ.mjs.map +1 -0
  102. package/dist/chunk-YUCD2TFH.mjs +242 -0
  103. package/dist/chunk-YUCD2TFH.mjs.map +1 -0
  104. package/dist/chunk-ZTJENCFC.mjs +379 -0
  105. package/dist/chunk-ZTJENCFC.mjs.map +1 -0
  106. package/dist/chunk-ZWYXXCXP.mjs +248 -0
  107. package/dist/chunk-ZWYXXCXP.mjs.map +1 -0
  108. package/dist/index.d.mts +183 -0
  109. package/dist/index.d.ts +183 -0
  110. package/dist/index.js +3930 -4449
  111. package/dist/index.js.map +1 -1
  112. package/dist/index.mjs +250 -2698
  113. package/dist/index.mjs.map +1 -1
  114. package/package.json +5 -5
  115. package/dist/chunk-2YMA6QOV.mjs +0 -193
  116. package/dist/chunk-2YMA6QOV.mjs.map +0 -1
  117. package/dist/chunk-3IIFBJCD.mjs +0 -45
  118. package/dist/chunk-BS4DKYGN.mjs +0 -48
  119. package/dist/chunk-DE7I3VHO.mjs +0 -106
  120. package/dist/chunk-F6D2OZ36.mjs +0 -89
  121. package/dist/chunk-F6D2OZ36.mjs.map +0 -1
  122. package/dist/chunk-GAOIFQDX.mjs +0 -59
  123. package/dist/chunk-GAOIFQDX.mjs.map +0 -1
  124. package/dist/chunk-HUIX2XVR.mjs +0 -159
  125. package/dist/chunk-HUIX2XVR.mjs.map +0 -1
  126. package/dist/chunk-K36R6HWY.mjs +0 -51
  127. package/dist/chunk-MBTAI3WE.mjs +0 -78
  128. package/dist/chunk-MBTAI3WE.mjs.map +0 -1
  129. package/dist/chunk-MGT6RUVX.mjs +0 -423
  130. package/dist/chunk-PIFS7AIT.mjs +0 -446
  131. package/dist/chunk-WG66JYYW.mjs +0 -116
  132. package/dist/chunk-XD7WGXHZ.mjs +0 -82
  133. package/dist/chunk-YYDM6V2F.mjs +0 -113
  134. package/dist/chunk-ZK7P3TZN.mjs +0 -286
  135. package/dist/chunk-ZK7P3TZN.mjs.map +0 -1
  136. /package/dist/{chunk-3IIFBJCD.mjs.map → chunk-BJTO5JO5.mjs.map} +0 -0
@@ -0,0 +1,412 @@
1
+ // src/catalogs/object-detection-models.ts
2
+ import { hfModelUrl, COCO_80_LABELS } from "@camstack/types";
3
+ var HF_REPO = "camstack/camstack-models";
4
+ var MLPACKAGE_FILES = [
5
+ "Manifest.json",
6
+ "Data/com.apple.CoreML/model.mlmodel",
7
+ "Data/com.apple.CoreML/weights/weight.bin"
8
+ ];
9
+ var OBJECT_DETECTION_MODELS = [
10
+ // ── YOLOv8 ──────────────────────────────────────────────────────
11
+ {
12
+ id: "yolov8n",
13
+ name: "YOLOv8 Nano",
14
+ description: "YOLOv8 Nano \u2014 fastest, smallest object detection model",
15
+ inputSize: { width: 640, height: 640 },
16
+ labels: COCO_80_LABELS,
17
+ formats: {
18
+ onnx: {
19
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8n.onnx"),
20
+ sizeMB: 12
21
+ },
22
+ coreml: {
23
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8n.mlpackage"),
24
+ sizeMB: 6,
25
+ isDirectory: true,
26
+ files: MLPACKAGE_FILES,
27
+ runtimes: ["python"]
28
+ },
29
+ openvino: {
30
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8n.xml"),
31
+ sizeMB: 7,
32
+ runtimes: ["python"]
33
+ },
34
+ tflite: {
35
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8n_float32.tflite"),
36
+ sizeMB: 12,
37
+ runtimes: ["python"]
38
+ }
39
+ }
40
+ },
41
+ {
42
+ id: "yolov8s",
43
+ name: "YOLOv8 Small",
44
+ description: "YOLOv8 Small \u2014 balanced speed and accuracy",
45
+ inputSize: { width: 640, height: 640 },
46
+ labels: COCO_80_LABELS,
47
+ formats: {
48
+ onnx: {
49
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8s.onnx"),
50
+ sizeMB: 43
51
+ },
52
+ coreml: {
53
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8s.mlpackage"),
54
+ sizeMB: 21,
55
+ isDirectory: true,
56
+ files: MLPACKAGE_FILES,
57
+ runtimes: ["python"]
58
+ },
59
+ openvino: {
60
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8s.xml"),
61
+ sizeMB: 22,
62
+ runtimes: ["python"]
63
+ },
64
+ tflite: {
65
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8s_float32.tflite"),
66
+ sizeMB: 43,
67
+ runtimes: ["python"]
68
+ }
69
+ }
70
+ },
71
+ {
72
+ id: "yolov8s-relu",
73
+ name: "YOLOv8 Small ReLU",
74
+ description: "YOLOv8 Small with ReLU activation \u2014 better hardware compatibility",
75
+ inputSize: { width: 640, height: 640 },
76
+ labels: COCO_80_LABELS,
77
+ formats: {
78
+ onnx: {
79
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8s-relu.onnx"),
80
+ sizeMB: 43
81
+ }
82
+ }
83
+ },
84
+ {
85
+ id: "yolov8m",
86
+ name: "YOLOv8 Medium",
87
+ description: "YOLOv8 Medium \u2014 higher accuracy, moderate size",
88
+ inputSize: { width: 640, height: 640 },
89
+ labels: COCO_80_LABELS,
90
+ formats: {
91
+ onnx: {
92
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8m.onnx"),
93
+ sizeMB: 99
94
+ },
95
+ coreml: {
96
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8m.mlpackage"),
97
+ sizeMB: 49,
98
+ isDirectory: true,
99
+ files: MLPACKAGE_FILES,
100
+ runtimes: ["python"]
101
+ },
102
+ openvino: {
103
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8m.xml"),
104
+ sizeMB: 50,
105
+ runtimes: ["python"]
106
+ },
107
+ tflite: {
108
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/tflite/camstack-yolov8m_float32.tflite"),
109
+ sizeMB: 99,
110
+ runtimes: ["python"]
111
+ }
112
+ }
113
+ },
114
+ {
115
+ id: "yolov8l",
116
+ name: "YOLOv8 Large",
117
+ description: "YOLOv8 Large \u2014 high-accuracy large model",
118
+ inputSize: { width: 640, height: 640 },
119
+ labels: COCO_80_LABELS,
120
+ formats: {
121
+ onnx: {
122
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8l.onnx"),
123
+ sizeMB: 167
124
+ },
125
+ coreml: {
126
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8l.mlpackage"),
127
+ sizeMB: 83,
128
+ isDirectory: true,
129
+ files: MLPACKAGE_FILES,
130
+ runtimes: ["python"]
131
+ },
132
+ openvino: {
133
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8l.xml"),
134
+ sizeMB: 84,
135
+ runtimes: ["python"]
136
+ }
137
+ }
138
+ },
139
+ {
140
+ id: "yolov8x",
141
+ name: "YOLOv8 Extra-Large",
142
+ description: "YOLOv8 Extra-Large \u2014 maximum accuracy",
143
+ inputSize: { width: 640, height: 640 },
144
+ labels: COCO_80_LABELS,
145
+ formats: {
146
+ onnx: {
147
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/onnx/camstack-yolov8x.onnx"),
148
+ sizeMB: 260
149
+ },
150
+ coreml: {
151
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/coreml/camstack-yolov8x.mlpackage"),
152
+ sizeMB: 130,
153
+ isDirectory: true,
154
+ files: MLPACKAGE_FILES,
155
+ runtimes: ["python"]
156
+ },
157
+ openvino: {
158
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov8/openvino/camstack-yolov8x.xml"),
159
+ sizeMB: 131,
160
+ runtimes: ["python"]
161
+ }
162
+ }
163
+ },
164
+ // ── YOLOv9 ──────────────────────────────────────────────────────
165
+ {
166
+ id: "yolov9t",
167
+ name: "YOLOv9 Tiny",
168
+ description: "YOLOv9 Tiny \u2014 ultra-lightweight next-gen detector",
169
+ inputSize: { width: 640, height: 640 },
170
+ labels: COCO_80_LABELS,
171
+ formats: {
172
+ onnx: {
173
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/onnx/camstack-yolov9t.onnx"),
174
+ sizeMB: 8
175
+ },
176
+ coreml: {
177
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage"),
178
+ sizeMB: 4,
179
+ isDirectory: true,
180
+ files: MLPACKAGE_FILES,
181
+ runtimes: ["python"]
182
+ },
183
+ openvino: {
184
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9t.xml"),
185
+ sizeMB: 6,
186
+ runtimes: ["python"]
187
+ },
188
+ tflite: {
189
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9t_float32.tflite"),
190
+ sizeMB: 8,
191
+ runtimes: ["python"]
192
+ }
193
+ }
194
+ },
195
+ {
196
+ id: "yolov9s",
197
+ name: "YOLOv9 Small",
198
+ description: "YOLOv9 Small \u2014 improved efficiency over YOLOv8s",
199
+ inputSize: { width: 640, height: 640 },
200
+ labels: COCO_80_LABELS,
201
+ formats: {
202
+ onnx: {
203
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/onnx/camstack-yolov9s.onnx"),
204
+ sizeMB: 28
205
+ },
206
+ coreml: {
207
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage"),
208
+ sizeMB: 14,
209
+ isDirectory: true,
210
+ files: MLPACKAGE_FILES,
211
+ runtimes: ["python"]
212
+ },
213
+ openvino: {
214
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9s.xml"),
215
+ sizeMB: 16,
216
+ runtimes: ["python"]
217
+ },
218
+ tflite: {
219
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9s_float32.tflite"),
220
+ sizeMB: 28,
221
+ runtimes: ["python"]
222
+ }
223
+ }
224
+ },
225
+ {
226
+ id: "yolov9c",
227
+ name: "YOLOv9 C",
228
+ description: "YOLOv9 C \u2014 high-accuracy compact model",
229
+ inputSize: { width: 640, height: 640 },
230
+ labels: COCO_80_LABELS,
231
+ formats: {
232
+ onnx: {
233
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/onnx/camstack-yolov9c.onnx"),
234
+ sizeMB: 97
235
+ },
236
+ coreml: {
237
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage"),
238
+ sizeMB: 48,
239
+ isDirectory: true,
240
+ files: MLPACKAGE_FILES,
241
+ runtimes: ["python"]
242
+ },
243
+ openvino: {
244
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/openvino/camstack-yolov9c.xml"),
245
+ sizeMB: 49,
246
+ runtimes: ["python"]
247
+ },
248
+ tflite: {
249
+ url: hfModelUrl(HF_REPO, "objectDetection/yolov9/tflite/camstack-yolov9c_float32.tflite"),
250
+ sizeMB: 97,
251
+ runtimes: ["python"]
252
+ }
253
+ }
254
+ },
255
+ // ── YOLO11 ────────────────────────────────────────────────────
256
+ {
257
+ id: "yolo11n",
258
+ name: "YOLO11 Nano",
259
+ description: "YOLO11 Nano \u2014 fastest, smallest YOLO11 detection model (mAP 39.5)",
260
+ inputSize: { width: 640, height: 640 },
261
+ labels: COCO_80_LABELS,
262
+ formats: {
263
+ onnx: {
264
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11n.onnx"),
265
+ sizeMB: 10
266
+ },
267
+ coreml: {
268
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11n.mlpackage"),
269
+ sizeMB: 5,
270
+ isDirectory: true,
271
+ files: MLPACKAGE_FILES,
272
+ runtimes: ["python"]
273
+ },
274
+ openvino: {
275
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11n.xml"),
276
+ sizeMB: 5,
277
+ runtimes: ["python"]
278
+ },
279
+ tflite: {
280
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11n_float32.tflite"),
281
+ sizeMB: 10,
282
+ runtimes: ["python"]
283
+ }
284
+ }
285
+ },
286
+ {
287
+ id: "yolo11s",
288
+ name: "YOLO11 Small",
289
+ description: "YOLO11 Small \u2014 balanced speed and accuracy (mAP 47.0)",
290
+ inputSize: { width: 640, height: 640 },
291
+ labels: COCO_80_LABELS,
292
+ formats: {
293
+ onnx: {
294
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11s.onnx"),
295
+ sizeMB: 36
296
+ },
297
+ coreml: {
298
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11s.mlpackage"),
299
+ sizeMB: 18,
300
+ isDirectory: true,
301
+ files: MLPACKAGE_FILES,
302
+ runtimes: ["python"]
303
+ },
304
+ openvino: {
305
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11s.xml"),
306
+ sizeMB: 18,
307
+ runtimes: ["python"]
308
+ },
309
+ tflite: {
310
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11s_float32.tflite"),
311
+ sizeMB: 36,
312
+ runtimes: ["python"]
313
+ }
314
+ }
315
+ },
316
+ {
317
+ id: "yolo11m",
318
+ name: "YOLO11 Medium",
319
+ description: "YOLO11 Medium \u2014 higher accuracy, moderate size (mAP 51.5)",
320
+ inputSize: { width: 640, height: 640 },
321
+ labels: COCO_80_LABELS,
322
+ formats: {
323
+ onnx: {
324
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11m.onnx"),
325
+ sizeMB: 77
326
+ },
327
+ coreml: {
328
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11m.mlpackage"),
329
+ sizeMB: 39,
330
+ isDirectory: true,
331
+ files: MLPACKAGE_FILES,
332
+ runtimes: ["python"]
333
+ },
334
+ openvino: {
335
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11m.xml"),
336
+ sizeMB: 39,
337
+ runtimes: ["python"]
338
+ },
339
+ tflite: {
340
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11m_float32.tflite"),
341
+ sizeMB: 77,
342
+ runtimes: ["python"]
343
+ }
344
+ }
345
+ },
346
+ {
347
+ id: "yolo11l",
348
+ name: "YOLO11 Large",
349
+ description: "YOLO11 Large \u2014 high-accuracy large model (mAP 53.4)",
350
+ inputSize: { width: 640, height: 640 },
351
+ labels: COCO_80_LABELS,
352
+ formats: {
353
+ onnx: {
354
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11l.onnx"),
355
+ sizeMB: 97
356
+ },
357
+ coreml: {
358
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11l.mlpackage"),
359
+ sizeMB: 49,
360
+ isDirectory: true,
361
+ files: MLPACKAGE_FILES,
362
+ runtimes: ["python"]
363
+ },
364
+ openvino: {
365
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11l.xml"),
366
+ sizeMB: 49,
367
+ runtimes: ["python"]
368
+ },
369
+ tflite: {
370
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11l_float32.tflite"),
371
+ sizeMB: 97,
372
+ runtimes: ["python"]
373
+ }
374
+ }
375
+ },
376
+ {
377
+ id: "yolo11x",
378
+ name: "YOLO11 Extra-Large",
379
+ description: "YOLO11 Extra-Large \u2014 maximum accuracy (mAP 54.7)",
380
+ inputSize: { width: 640, height: 640 },
381
+ labels: COCO_80_LABELS,
382
+ formats: {
383
+ onnx: {
384
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/onnx/camstack-yolo11x.onnx"),
385
+ sizeMB: 218
386
+ },
387
+ coreml: {
388
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/coreml/camstack-yolo11x.mlpackage"),
389
+ sizeMB: 109,
390
+ isDirectory: true,
391
+ files: MLPACKAGE_FILES,
392
+ runtimes: ["python"]
393
+ },
394
+ openvino: {
395
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/openvino/camstack-yolo11x.xml"),
396
+ sizeMB: 109,
397
+ runtimes: ["python"]
398
+ },
399
+ tflite: {
400
+ url: hfModelUrl(HF_REPO, "objectDetection/yolo11/tflite/camstack-yolo11x_float32.tflite"),
401
+ sizeMB: 218,
402
+ runtimes: ["python"]
403
+ }
404
+ }
405
+ }
406
+ ];
407
+
408
+ export {
409
+ MLPACKAGE_FILES,
410
+ OBJECT_DETECTION_MODELS
411
+ };
412
+ //# sourceMappingURL=chunk-BP7H4NFS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/catalogs/object-detection-models.ts"],"sourcesContent":["import type { ModelCatalogEntry } from '@camstack/types'\nimport { hfModelUrl, COCO_80_LABELS } from '@camstack/types'\n\nconst HF_REPO = 'camstack/camstack-models'\n\n/** Standard files inside every .mlpackage directory bundle */\nexport const MLPACKAGE_FILES = [\n 'Manifest.json',\n 'Data/com.apple.CoreML/model.mlmodel',\n 'Data/com.apple.CoreML/weights/weight.bin',\n] as const\n\nexport const OBJECT_DETECTION_MODELS: readonly ModelCatalogEntry[] = [\n // ── YOLOv8 ──────────────────────────────────────────────────────\n {\n id: 'yolov8n',\n name: 'YOLOv8 Nano',\n description: 'YOLOv8 Nano — fastest, smallest object detection model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8n.onnx'),\n sizeMB: 12,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8n.mlpackage'),\n sizeMB: 6,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8n.xml'),\n sizeMB: 7,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8n_float32.tflite'),\n sizeMB: 12,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8s',\n name: 'YOLOv8 Small',\n description: 'YOLOv8 Small — balanced speed and accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8s.onnx'),\n sizeMB: 43,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8s.mlpackage'),\n sizeMB: 21,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8s.xml'),\n sizeMB: 22,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8s_float32.tflite'),\n sizeMB: 43,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8s-relu',\n name: 'YOLOv8 Small ReLU',\n description: 'YOLOv8 Small with ReLU activation — better hardware compatibility',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8s-relu.onnx'),\n sizeMB: 43,\n },\n },\n },\n {\n id: 'yolov8m',\n name: 'YOLOv8 Medium',\n description: 'YOLOv8 Medium — higher accuracy, moderate size',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8m.onnx'),\n sizeMB: 99,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8m.mlpackage'),\n sizeMB: 49,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8m.xml'),\n sizeMB: 50,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8m_float32.tflite'),\n sizeMB: 99,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8l',\n name: 'YOLOv8 Large',\n description: 'YOLOv8 Large — high-accuracy large model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8l.onnx'),\n sizeMB: 167,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8l.mlpackage'),\n sizeMB: 83,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8l.xml'),\n sizeMB: 84,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8x',\n name: 'YOLOv8 Extra-Large',\n description: 'YOLOv8 Extra-Large — maximum accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8x.onnx'),\n sizeMB: 260,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8x.mlpackage'),\n sizeMB: 130,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8x.xml'),\n sizeMB: 131,\n runtimes: ['python'],\n },\n },\n },\n\n // ── YOLOv9 ──────────────────────────────────────────────────────\n {\n id: 'yolov9t',\n name: 'YOLOv9 Tiny',\n description: 'YOLOv9 Tiny — ultra-lightweight next-gen detector',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9t.onnx'),\n sizeMB: 8,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage'),\n sizeMB: 4,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9t.xml'),\n sizeMB: 6,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9t_float32.tflite'),\n sizeMB: 8,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov9s',\n name: 'YOLOv9 Small',\n description: 'YOLOv9 Small — improved efficiency over YOLOv8s',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9s.onnx'),\n sizeMB: 28,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage'),\n sizeMB: 14,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9s.xml'),\n sizeMB: 16,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9s_float32.tflite'),\n sizeMB: 28,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov9c',\n name: 'YOLOv9 C',\n description: 'YOLOv9 C — high-accuracy compact model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9c.onnx'),\n sizeMB: 97,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage'),\n sizeMB: 48,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9c.xml'),\n sizeMB: 49,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9c_float32.tflite'),\n sizeMB: 97,\n runtimes: ['python'],\n },\n },\n },\n\n // ── YOLO11 ────────────────────────────────────────────────────\n {\n id: 'yolo11n',\n name: 'YOLO11 Nano',\n description: 'YOLO11 Nano — fastest, smallest YOLO11 detection model (mAP 39.5)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11n.onnx'),\n sizeMB: 10,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11n.mlpackage'),\n sizeMB: 5,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11n.xml'),\n sizeMB: 5,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11n_float32.tflite'),\n sizeMB: 10,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11s',\n name: 'YOLO11 Small',\n description: 'YOLO11 Small — balanced speed and accuracy (mAP 47.0)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11s.onnx'),\n sizeMB: 36,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11s.mlpackage'),\n sizeMB: 18,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11s.xml'),\n sizeMB: 18,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11s_float32.tflite'),\n sizeMB: 36,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11m',\n name: 'YOLO11 Medium',\n description: 'YOLO11 Medium — higher accuracy, moderate size (mAP 51.5)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11m.onnx'),\n sizeMB: 77,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11m.mlpackage'),\n sizeMB: 39,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11m.xml'),\n sizeMB: 39,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11m_float32.tflite'),\n sizeMB: 77,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11l',\n name: 'YOLO11 Large',\n description: 'YOLO11 Large — high-accuracy large model (mAP 53.4)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11l.onnx'),\n sizeMB: 97,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11l.mlpackage'),\n sizeMB: 49,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11l.xml'),\n sizeMB: 49,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11l_float32.tflite'),\n sizeMB: 97,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11x',\n name: 'YOLO11 Extra-Large',\n description: 'YOLO11 Extra-Large — maximum accuracy (mAP 54.7)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11x.onnx'),\n sizeMB: 218,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11x.mlpackage'),\n sizeMB: 109,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11x.xml'),\n sizeMB: 109,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11x_float32.tflite'),\n sizeMB: 218,\n runtimes: ['python'],\n },\n },\n },\n] as const\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/catalogs/object-detection-models.ts"],"sourcesContent":["import type { ModelCatalogEntry } from '@camstack/types'\nimport { hfModelUrl, COCO_80_LABELS } from '@camstack/types'\n\nconst HF_REPO = 'camstack/camstack-models'\n\n/** Standard files inside every .mlpackage directory bundle */\nexport const MLPACKAGE_FILES = [\n 'Manifest.json',\n 'Data/com.apple.CoreML/model.mlmodel',\n 'Data/com.apple.CoreML/weights/weight.bin',\n] as const\n\nexport const OBJECT_DETECTION_MODELS: readonly ModelCatalogEntry[] = [\n // ── YOLOv8 ──────────────────────────────────────────────────────\n {\n id: 'yolov8n',\n name: 'YOLOv8 Nano',\n description: 'YOLOv8 Nano — fastest, smallest object detection model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8n.onnx'),\n sizeMB: 12,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8n.mlpackage'),\n sizeMB: 6,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8n.xml'),\n sizeMB: 7,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8n_float32.tflite'),\n sizeMB: 12,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8s',\n name: 'YOLOv8 Small',\n description: 'YOLOv8 Small — balanced speed and accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8s.onnx'),\n sizeMB: 43,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8s.mlpackage'),\n sizeMB: 21,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8s.xml'),\n sizeMB: 22,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8s_float32.tflite'),\n sizeMB: 43,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8s-relu',\n name: 'YOLOv8 Small ReLU',\n description: 'YOLOv8 Small with ReLU activation — better hardware compatibility',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8s-relu.onnx'),\n sizeMB: 43,\n },\n },\n },\n {\n id: 'yolov8m',\n name: 'YOLOv8 Medium',\n description: 'YOLOv8 Medium — higher accuracy, moderate size',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8m.onnx'),\n sizeMB: 99,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8m.mlpackage'),\n sizeMB: 49,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8m.xml'),\n sizeMB: 50,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/tflite/camstack-yolov8m_float32.tflite'),\n sizeMB: 99,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8l',\n name: 'YOLOv8 Large',\n description: 'YOLOv8 Large — high-accuracy large model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8l.onnx'),\n sizeMB: 167,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8l.mlpackage'),\n sizeMB: 83,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8l.xml'),\n sizeMB: 84,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8x',\n name: 'YOLOv8 Extra-Large',\n description: 'YOLOv8 Extra-Large — maximum accuracy',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/onnx/camstack-yolov8x.onnx'),\n sizeMB: 260,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/coreml/camstack-yolov8x.mlpackage'),\n sizeMB: 130,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov8/openvino/camstack-yolov8x.xml'),\n sizeMB: 131,\n runtimes: ['python'],\n },\n },\n },\n\n // ── YOLOv9 ──────────────────────────────────────────────────────\n {\n id: 'yolov9t',\n name: 'YOLOv9 Tiny',\n description: 'YOLOv9 Tiny — ultra-lightweight next-gen detector',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9t.onnx'),\n sizeMB: 8,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9t.mlpackage'),\n sizeMB: 4,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9t.xml'),\n sizeMB: 6,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9t_float32.tflite'),\n sizeMB: 8,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov9s',\n name: 'YOLOv9 Small',\n description: 'YOLOv9 Small — improved efficiency over YOLOv8s',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9s.onnx'),\n sizeMB: 28,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9s.mlpackage'),\n sizeMB: 14,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9s.xml'),\n sizeMB: 16,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9s_float32.tflite'),\n sizeMB: 28,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov9c',\n name: 'YOLOv9 C',\n description: 'YOLOv9 C — high-accuracy compact model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/onnx/camstack-yolov9c.onnx'),\n sizeMB: 97,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/coreml/camstack-yolov9c.mlpackage'),\n sizeMB: 48,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/openvino/camstack-yolov9c.xml'),\n sizeMB: 49,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolov9/tflite/camstack-yolov9c_float32.tflite'),\n sizeMB: 97,\n runtimes: ['python'],\n },\n },\n },\n\n // ── YOLO11 ────────────────────────────────────────────────────\n {\n id: 'yolo11n',\n name: 'YOLO11 Nano',\n description: 'YOLO11 Nano — fastest, smallest YOLO11 detection model (mAP 39.5)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11n.onnx'),\n sizeMB: 10,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11n.mlpackage'),\n sizeMB: 5,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11n.xml'),\n sizeMB: 5,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11n_float32.tflite'),\n sizeMB: 10,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11s',\n name: 'YOLO11 Small',\n description: 'YOLO11 Small — balanced speed and accuracy (mAP 47.0)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11s.onnx'),\n sizeMB: 36,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11s.mlpackage'),\n sizeMB: 18,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11s.xml'),\n sizeMB: 18,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11s_float32.tflite'),\n sizeMB: 36,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11m',\n name: 'YOLO11 Medium',\n description: 'YOLO11 Medium — higher accuracy, moderate size (mAP 51.5)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11m.onnx'),\n sizeMB: 77,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11m.mlpackage'),\n sizeMB: 39,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11m.xml'),\n sizeMB: 39,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11m_float32.tflite'),\n sizeMB: 77,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11l',\n name: 'YOLO11 Large',\n description: 'YOLO11 Large — high-accuracy large model (mAP 53.4)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11l.onnx'),\n sizeMB: 97,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11l.mlpackage'),\n sizeMB: 49,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11l.xml'),\n sizeMB: 49,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11l_float32.tflite'),\n sizeMB: 97,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11x',\n name: 'YOLO11 Extra-Large',\n description: 'YOLO11 Extra-Large — maximum accuracy (mAP 54.7)',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/onnx/camstack-yolo11x.onnx'),\n sizeMB: 218,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/coreml/camstack-yolo11x.mlpackage'),\n sizeMB: 109,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/openvino/camstack-yolo11x.xml'),\n sizeMB: 109,\n runtimes: ['python'],\n },\n tflite: {\n url: hfModelUrl(HF_REPO, 'objectDetection/yolo11/tflite/camstack-yolo11x_float32.tflite'),\n sizeMB: 218,\n runtimes: ['python'],\n },\n },\n },\n] as const\n"],"mappings":"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","names":[]}
@@ -0,0 +1,98 @@
1
+ // src/addons/motion-detection/frame-diff.ts
2
+ function detectMotion(current, previous, width, height, threshold, minArea) {
3
+ const numPixels = width * height;
4
+ const mask = new Uint8Array(numPixels);
5
+ for (let i = 0; i < numPixels; i++) {
6
+ mask[i] = Math.abs((current[i] ?? 0) - (previous[i] ?? 0)) > threshold ? 1 : 0;
7
+ }
8
+ const labels = new Int32Array(numPixels).fill(0);
9
+ const parent = new Int32Array(numPixels + 1).fill(0);
10
+ let nextLabel = 1;
11
+ function findRoot(x) {
12
+ while (parent[x] !== x) {
13
+ parent[x] = parent[parent[x]];
14
+ x = parent[x];
15
+ }
16
+ return x;
17
+ }
18
+ function union(a, b) {
19
+ const ra = findRoot(a);
20
+ const rb = findRoot(b);
21
+ if (ra !== rb) parent[rb] = ra;
22
+ return ra;
23
+ }
24
+ for (let i = 0; i <= numPixels; i++) {
25
+ parent[i] = i;
26
+ }
27
+ for (let y = 0; y < height; y++) {
28
+ for (let x = 0; x < width; x++) {
29
+ const idx = y * width + x;
30
+ if (!mask[idx]) continue;
31
+ const above = y > 0 ? labels[(y - 1) * width + x] ?? 0 : 0;
32
+ const left = x > 0 ? labels[y * width + (x - 1)] ?? 0 : 0;
33
+ if (above === 0 && left === 0) {
34
+ labels[idx] = nextLabel;
35
+ parent[nextLabel] = nextLabel;
36
+ nextLabel++;
37
+ } else if (above !== 0 && left === 0) {
38
+ labels[idx] = above;
39
+ } else if (above === 0 && left !== 0) {
40
+ labels[idx] = left;
41
+ } else {
42
+ labels[idx] = union(above, left);
43
+ }
44
+ }
45
+ }
46
+ for (let i = 0; i < numPixels; i++) {
47
+ if (labels[i]) {
48
+ labels[i] = findRoot(labels[i]);
49
+ }
50
+ }
51
+ const bboxMap = /* @__PURE__ */ new Map();
52
+ for (let y = 0; y < height; y++) {
53
+ for (let x = 0; x < width; x++) {
54
+ const idx = y * width + x;
55
+ const label = labels[idx];
56
+ if (!label) continue;
57
+ const diff = Math.abs((current[idx] ?? 0) - (previous[idx] ?? 0));
58
+ const existing = bboxMap.get(label);
59
+ if (existing) {
60
+ existing.minX = Math.min(existing.minX, x);
61
+ existing.minY = Math.min(existing.minY, y);
62
+ existing.maxX = Math.max(existing.maxX, x);
63
+ existing.maxY = Math.max(existing.maxY, y);
64
+ existing.count++;
65
+ existing.intensitySum += diff;
66
+ } else {
67
+ bboxMap.set(label, {
68
+ minX: x,
69
+ minY: y,
70
+ maxX: x,
71
+ maxY: y,
72
+ count: 1,
73
+ intensitySum: diff
74
+ });
75
+ }
76
+ }
77
+ }
78
+ const regions = [];
79
+ for (const [, info] of bboxMap) {
80
+ if (info.count < minArea) continue;
81
+ regions.push({
82
+ bbox: {
83
+ x: info.minX,
84
+ y: info.minY,
85
+ w: info.maxX - info.minX + 1,
86
+ h: info.maxY - info.minY + 1
87
+ },
88
+ pixelCount: info.count,
89
+ intensity: info.intensitySum / info.count
90
+ });
91
+ }
92
+ return regions;
93
+ }
94
+
95
+ export {
96
+ detectMotion
97
+ };
98
+ //# sourceMappingURL=chunk-BR2FPGOX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/addons/motion-detection/frame-diff.ts"],"sourcesContent":["import type { BoundingBox } from '@camstack/types'\n\nexport interface MotionRegion {\n readonly bbox: BoundingBox\n readonly pixelCount: number\n readonly intensity: number\n}\n\n/**\n * Detect motion by frame differencing.\n *\n * @param current - Grayscale pixel array for the current frame (Uint8Array, length = width * height)\n * @param previous - Grayscale pixel array for the previous frame\n * @param width - Frame width in pixels\n * @param height - Frame height in pixels\n * @param threshold - Pixel diff threshold 0-255; differences below this are ignored\n * @param minArea - Minimum number of changed pixels for a region to be reported\n */\nexport function detectMotion(\n current: Uint8Array,\n previous: Uint8Array,\n width: number,\n height: number,\n threshold: number,\n minArea: number,\n): MotionRegion[] {\n const numPixels = width * height\n\n // Step 1: Compute binary mask — 1 where abs(current - previous) > threshold\n const mask = new Uint8Array(numPixels)\n for (let i = 0; i < numPixels; i++) {\n mask[i] = Math.abs((current[i] ?? 0) - (previous[i] ?? 0)) > threshold ? 1 : 0\n }\n\n // Step 2: Two-pass connected component labeling\n const labels = new Int32Array(numPixels).fill(0)\n const parent = new Int32Array(numPixels + 1).fill(0)\n let nextLabel = 1\n\n // Union-Find helpers\n function findRoot(x: number): number {\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]! // path compression\n x = parent[x]!\n }\n return x\n }\n\n function union(a: number, b: number): number {\n const ra = findRoot(a)\n const rb = findRoot(b)\n if (ra !== rb) parent[rb] = ra\n return ra\n }\n\n // Initialize parent array as identity\n for (let i = 0; i <= numPixels; i++) {\n parent[i] = i\n }\n\n // First pass: assign provisional labels\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = y * width + x\n if (!mask[idx]) continue\n\n const above = y > 0 ? labels[(y - 1) * width + x] ?? 0 : 0\n const left = x > 0 ? labels[y * width + (x - 1)] ?? 0 : 0\n\n if (above === 0 && left === 0) {\n labels[idx] = nextLabel\n parent[nextLabel] = nextLabel\n nextLabel++\n } else if (above !== 0 && left === 0) {\n labels[idx] = above\n } else if (above === 0 && left !== 0) {\n labels[idx] = left\n } else {\n // Both neighbors — merge\n labels[idx] = union(above, left)\n }\n }\n }\n\n // Second pass: resolve all labels to roots\n for (let i = 0; i < numPixels; i++) {\n if (labels[i]) {\n labels[i] = findRoot(labels[i]!)\n }\n }\n\n // Step 3: Collect bounding boxes and pixel counts per root label\n const bboxMap = new Map<\n number,\n { minX: number; minY: number; maxX: number; maxY: number; count: number; intensitySum: number }\n >()\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = y * width + x\n const label = labels[idx]\n if (!label) continue\n\n const diff = Math.abs((current[idx] ?? 0) - (previous[idx] ?? 0))\n const existing = bboxMap.get(label)\n if (existing) {\n existing.minX = Math.min(existing.minX, x)\n existing.minY = Math.min(existing.minY, y)\n existing.maxX = Math.max(existing.maxX, x)\n existing.maxY = Math.max(existing.maxY, y)\n existing.count++\n existing.intensitySum += diff\n } else {\n bboxMap.set(label, {\n minX: x,\n minY: y,\n maxX: x,\n maxY: y,\n count: 1,\n intensitySum: diff,\n })\n }\n }\n }\n\n // Step 4: Filter by minimum area and build result\n const regions: MotionRegion[] = []\n for (const [, info] of bboxMap) {\n if (info.count < minArea) continue\n regions.push({\n bbox: {\n x: info.minX,\n y: info.minY,\n w: info.maxX - info.minX + 1,\n h: info.maxY - info.minY + 1,\n },\n pixelCount: info.count,\n intensity: info.intensitySum / info.count,\n })\n }\n\n return regions\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/addons/motion-detection/frame-diff.ts"],"sourcesContent":["import type { BoundingBox } from '@camstack/types'\n\nexport interface MotionRegion {\n readonly bbox: BoundingBox\n readonly pixelCount: number\n readonly intensity: number\n}\n\n/**\n * Detect motion by frame differencing.\n *\n * @param current - Grayscale pixel array for the current frame (Uint8Array, length = width * height)\n * @param previous - Grayscale pixel array for the previous frame\n * @param width - Frame width in pixels\n * @param height - Frame height in pixels\n * @param threshold - Pixel diff threshold 0-255; differences below this are ignored\n * @param minArea - Minimum number of changed pixels for a region to be reported\n */\nexport function detectMotion(\n current: Uint8Array,\n previous: Uint8Array,\n width: number,\n height: number,\n threshold: number,\n minArea: number,\n): MotionRegion[] {\n const numPixels = width * height\n\n // Step 1: Compute binary mask — 1 where abs(current - previous) > threshold\n const mask = new Uint8Array(numPixels)\n for (let i = 0; i < numPixels; i++) {\n mask[i] = Math.abs((current[i] ?? 0) - (previous[i] ?? 0)) > threshold ? 1 : 0\n }\n\n // Step 2: Two-pass connected component labeling\n const labels = new Int32Array(numPixels).fill(0)\n const parent = new Int32Array(numPixels + 1).fill(0)\n let nextLabel = 1\n\n // Union-Find helpers\n function findRoot(x: number): number {\n while (parent[x] !== x) {\n parent[x] = parent[parent[x]!]! // path compression\n x = parent[x]!\n }\n return x\n }\n\n function union(a: number, b: number): number {\n const ra = findRoot(a)\n const rb = findRoot(b)\n if (ra !== rb) parent[rb] = ra\n return ra\n }\n\n // Initialize parent array as identity\n for (let i = 0; i <= numPixels; i++) {\n parent[i] = i\n }\n\n // First pass: assign provisional labels\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = y * width + x\n if (!mask[idx]) continue\n\n const above = y > 0 ? labels[(y - 1) * width + x] ?? 0 : 0\n const left = x > 0 ? labels[y * width + (x - 1)] ?? 0 : 0\n\n if (above === 0 && left === 0) {\n labels[idx] = nextLabel\n parent[nextLabel] = nextLabel\n nextLabel++\n } else if (above !== 0 && left === 0) {\n labels[idx] = above\n } else if (above === 0 && left !== 0) {\n labels[idx] = left\n } else {\n // Both neighbors — merge\n labels[idx] = union(above, left)\n }\n }\n }\n\n // Second pass: resolve all labels to roots\n for (let i = 0; i < numPixels; i++) {\n if (labels[i]) {\n labels[i] = findRoot(labels[i]!)\n }\n }\n\n // Step 3: Collect bounding boxes and pixel counts per root label\n const bboxMap = new Map<\n number,\n { minX: number; minY: number; maxX: number; maxY: number; count: number; intensitySum: number }\n >()\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = y * width + x\n const label = labels[idx]\n if (!label) continue\n\n const diff = Math.abs((current[idx] ?? 0) - (previous[idx] ?? 0))\n const existing = bboxMap.get(label)\n if (existing) {\n existing.minX = Math.min(existing.minX, x)\n existing.minY = Math.min(existing.minY, y)\n existing.maxX = Math.max(existing.maxX, x)\n existing.maxY = Math.max(existing.maxY, y)\n existing.count++\n existing.intensitySum += diff\n } else {\n bboxMap.set(label, {\n minX: x,\n minY: y,\n maxX: x,\n maxY: y,\n count: 1,\n intensitySum: diff,\n })\n }\n }\n }\n\n // Step 4: Filter by minimum area and build result\n const regions: MotionRegion[] = []\n for (const [, info] of bboxMap) {\n if (info.count < minArea) continue\n regions.push({\n bbox: {\n x: info.minX,\n y: info.minY,\n w: info.maxX - info.minX + 1,\n h: info.maxY - info.minY + 1,\n },\n pixelCount: info.count,\n intensity: info.intensitySum / info.count,\n })\n }\n\n return regions\n}\n"],"mappings":";AAkBO,SAAS,aACd,SACA,UACA,OACA,QACA,WACA,SACgB;AAChB,QAAM,YAAY,QAAQ;AAG1B,QAAM,OAAO,IAAI,WAAW,SAAS;AACrC,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,SAAK,CAAC,IAAI,KAAK,KAAK,QAAQ,CAAC,KAAK,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,YAAY,IAAI;AAAA,EAC/E;AAGA,QAAM,SAAS,IAAI,WAAW,SAAS,EAAE,KAAK,CAAC;AAC/C,QAAM,SAAS,IAAI,WAAW,YAAY,CAAC,EAAE,KAAK,CAAC;AACnD,MAAI,YAAY;AAGhB,WAAS,SAAS,GAAmB;AACnC,WAAO,OAAO,CAAC,MAAM,GAAG;AACtB,aAAO,CAAC,IAAI,OAAO,OAAO,CAAC,CAAE;AAC7B,UAAI,OAAO,CAAC;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAEA,WAAS,MAAM,GAAW,GAAmB;AAC3C,UAAM,KAAK,SAAS,CAAC;AACrB,UAAM,KAAK,SAAS,CAAC;AACrB,QAAI,OAAO,GAAI,QAAO,EAAE,IAAI;AAC5B,WAAO;AAAA,EACT;AAGA,WAAS,IAAI,GAAG,KAAK,WAAW,KAAK;AACnC,WAAO,CAAC,IAAI;AAAA,EACd;AAGA,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,IAAI,QAAQ;AACxB,UAAI,CAAC,KAAK,GAAG,EAAG;AAEhB,YAAM,QAAQ,IAAI,IAAI,QAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,IAAI;AACzD,YAAM,OAAO,IAAI,IAAI,OAAO,IAAI,SAAS,IAAI,EAAE,KAAK,IAAI;AAExD,UAAI,UAAU,KAAK,SAAS,GAAG;AAC7B,eAAO,GAAG,IAAI;AACd,eAAO,SAAS,IAAI;AACpB;AAAA,MACF,WAAW,UAAU,KAAK,SAAS,GAAG;AACpC,eAAO,GAAG,IAAI;AAAA,MAChB,WAAW,UAAU,KAAK,SAAS,GAAG;AACpC,eAAO,GAAG,IAAI;AAAA,MAChB,OAAO;AAEL,eAAO,GAAG,IAAI,MAAM,OAAO,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAGA,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,QAAI,OAAO,CAAC,GAAG;AACb,aAAO,CAAC,IAAI,SAAS,OAAO,CAAC,CAAE;AAAA,IACjC;AAAA,EACF;AAGA,QAAM,UAAU,oBAAI,IAGlB;AAEF,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,MAAM,IAAI,QAAQ;AACxB,YAAM,QAAQ,OAAO,GAAG;AACxB,UAAI,CAAC,MAAO;AAEZ,YAAM,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,EAAE;AAChE,YAAM,WAAW,QAAQ,IAAI,KAAK;AAClC,UAAI,UAAU;AACZ,iBAAS,OAAO,KAAK,IAAI,SAAS,MAAM,CAAC;AACzC,iBAAS,OAAO,KAAK,IAAI,SAAS,MAAM,CAAC;AACzC,iBAAS,OAAO,KAAK,IAAI,SAAS,MAAM,CAAC;AACzC,iBAAS,OAAO,KAAK,IAAI,SAAS,MAAM,CAAC;AACzC,iBAAS;AACT,iBAAS,gBAAgB;AAAA,MAC3B,OAAO;AACL,gBAAQ,IAAI,OAAO;AAAA,UACjB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAA0B,CAAC;AACjC,aAAW,CAAC,EAAE,IAAI,KAAK,SAAS;AAC9B,QAAI,KAAK,QAAQ,QAAS;AAC1B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,QACJ,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,GAAG,KAAK,OAAO,KAAK,OAAO;AAAA,QAC3B,GAAG,KAAK,OAAO,KAAK,OAAO;AAAA,MAC7B;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK,eAAe,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}