@hatiolab/figure-model 0.1.8 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blueprint.d.ts +17 -5
- package/dist/blueprint.d.ts.map +1 -1
- package/dist/blueprint.js +62 -27
- package/dist/blueprint.js.map +1 -1
- package/dist/cost.d.ts +2 -0
- package/dist/cost.d.ts.map +1 -1
- package/dist/cost.js +22 -5
- package/dist/cost.js.map +1 -1
- package/dist/grouping.d.ts +44 -0
- package/dist/grouping.d.ts.map +1 -0
- package/dist/grouping.js +117 -0
- package/dist/grouping.js.map +1 -0
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +5 -2
- package/dist/keys.js.map +1 -1
- package/dist/types.d.ts +205 -31
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +92 -9
- package/dist/types.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +196 -31
- package/dist/validate.js.map +1 -1
- package/docs/design.md +5 -3
- package/docs/format.md +152 -18
- package/docs/validation.md +41 -11
- package/package.json +1 -1
package/dist/types.d.ts
CHANGED
|
@@ -24,8 +24,82 @@ export type MaterialPreset = (typeof MATERIAL_PRESETS)[number];
|
|
|
24
24
|
* stretch 한 축만 늘어난다. 프레임·벨트·레일
|
|
25
25
|
* repeat 개수가 늘어난다. 롤러·선반 단 ← 새 geometry 가 생기지 않는다
|
|
26
26
|
*/
|
|
27
|
+
/** What `sizing` means when a part does not say. */
|
|
28
|
+
export declare const DEFAULT_SIZING: "scale";
|
|
29
|
+
/**
|
|
30
|
+
* How many copies one repeat part may expand to.
|
|
31
|
+
*
|
|
32
|
+
* Every copy is a draw call, so an instance stretched far enough would grow
|
|
33
|
+
* without bound and one asset would eat the frame. Past this point the copies
|
|
34
|
+
* are too small to count anyway, so more of them changes nothing on screen.
|
|
35
|
+
*
|
|
36
|
+
* The renderer enforces the same number. It lives here because the report has
|
|
37
|
+
* to predict what the renderer will do -- things-scene used to keep its own
|
|
38
|
+
* copy of it.
|
|
39
|
+
*/
|
|
40
|
+
export declare const REPEAT_LIMIT = 100;
|
|
27
41
|
export declare const SIZING_RULES: readonly ["scale", "fixed", "stretch", "repeat"];
|
|
28
42
|
export type SizingRule = (typeof SIZING_RULES)[number];
|
|
43
|
+
/**
|
|
44
|
+
* 부품이 한 축에서 기준 상자의 **어느 면을 붙잡나**. 축마다 따로 정한다.
|
|
45
|
+
*
|
|
46
|
+
* scale **아무 면도 안 붙잡는다.** 상자와 함께 비례로 커진다
|
|
47
|
+
* min 아래(또는 왼쪽·뒤) 면에서 잰 거리를 지킨다
|
|
48
|
+
* center 자리는 비례로 따라가고 **크기는 지킨다**
|
|
49
|
+
* max 위(또는 오른쪽·앞) 면에서 잰 거리를 지킨다
|
|
50
|
+
* span **양쪽을 다 붙잡는다.** 가운데가 늘어나 사이를 채운다
|
|
51
|
+
*
|
|
52
|
+
* 붙잡는 면의 수로 읽으면 하나다 — 0 개면 상자와 함께 커지고, 1 개면 그 면에서 잰
|
|
53
|
+
* 거리를 지키고, 2 개면 사이를 채운다. 3D 도구의 나인슬라이스가 하는 일이고 여기서는
|
|
54
|
+
* 그것이 세 축으로 있다.
|
|
55
|
+
*
|
|
56
|
+
* ## `repeat` 의 축에서는 **줄이 어떻게 되는가**를 말한다
|
|
57
|
+
*
|
|
58
|
+
* 같은 「반복」이 두 가지다.
|
|
59
|
+
*
|
|
60
|
+
* 컨베이어의 롤러 길어지면 롤러가 **는다.** 한 칸 간격은 그대로다
|
|
61
|
+
* 셀트레이의 셀 커지면 셀이 **커진다.** 개수는 그 트레이가 몇 셀짜리냐이지
|
|
62
|
+
* 화면에 얼마나 크게 그렸느냐가 아니다
|
|
63
|
+
*
|
|
64
|
+
* 앞의 것이 `center`(줄이 상자를 채운다), 뒤의 것이 `scale`(줄이 상자와 함께 큰다)이다.
|
|
65
|
+
*
|
|
66
|
+
* ## 없던 것을 왜 더하나
|
|
67
|
+
*
|
|
68
|
+
* `sizing` 은 부품의 **크기**가 인스턴스를 어떻게 따라가는지만 말했다. **자리**는
|
|
69
|
+
* 언제나 비례였다. 그래서 시그널 타워를 3 배로 세우면 기둥은 늘어나는데 램프들은
|
|
70
|
+
* 기둥 위 공중으로 흩어졌다 — 저작한 자리 512 가 1536 이 되고, 그 사이의 틈 100 이
|
|
71
|
+
* 300 이 되기 때문이다.
|
|
72
|
+
*
|
|
73
|
+
* 1× foot 0..90 · pole 85..705 · bracket 703..747 · … · cap 1037..1087
|
|
74
|
+
* 3× foot 90..180 · pole 255..2115 · bracket 2153..2197 · … · cap 3161..3211
|
|
75
|
+
*
|
|
76
|
+
* 램프는 상자 안 어디쯤이 아니라 **기둥 꼭대기**에 붙어 있다. 형식에 그 말을 적을
|
|
77
|
+
* 자리가 없었다.
|
|
78
|
+
*
|
|
79
|
+
* ## 적지 않으면 **가까운 면**을 붙잡는다
|
|
80
|
+
*
|
|
81
|
+
* 상자의 위 절반에 저작한 것은 위를, 아래 절반에 저작한 것은 아래를 붙잡는다.
|
|
82
|
+
* 정확히 가운데면 `center` 다. 사람이 램프를 꼭대기 근처에 놓을 때 뜻하는 것이
|
|
83
|
+
* 그것이고, 그래서 표본 열넷 중 어느 것도 이 값을 적지 않고 제대로 선다.
|
|
84
|
+
*
|
|
85
|
+
* `sizing` 이 `'scale'` 인 부품에는 뜻이 없다 — 그 부품은 상자와 함께 커진다.
|
|
86
|
+
*/
|
|
87
|
+
export declare const ANCHOR_RULES: readonly ["scale", "min", "center", "max", "span"];
|
|
88
|
+
export type AnchorRule = (typeof ANCHOR_RULES)[number];
|
|
89
|
+
/**
|
|
90
|
+
* 축별 앵커. 적지 않은 축은 `sizing` 이 정한 것을 따른다.
|
|
91
|
+
*
|
|
92
|
+
* **`sizing` 하나로는 못 하는 말이 있어서 있다.** 컨베이어의 데크가 그렇다 —
|
|
93
|
+
* 길이(x)와 폭(z)은 상자를 채우고 두께(y)는 24 mm 그대로여야 한다. `sizing` 은
|
|
94
|
+
* 부품당 하나라 「x 는 채우고 y 는 붙잡는다」를 적을 자리가 없었다.
|
|
95
|
+
*
|
|
96
|
+
* sizing: 'fixed', anchor: { x: 'span', y: 'max', z: 'span' }
|
|
97
|
+
*/
|
|
98
|
+
export interface PartAnchor {
|
|
99
|
+
x?: AnchorRule;
|
|
100
|
+
y?: AnchorRule;
|
|
101
|
+
z?: AnchorRule;
|
|
102
|
+
}
|
|
29
103
|
/**
|
|
30
104
|
* 디테일 등급 — 이 형상을 얼마나 상세하게 만들 것인지 저작자가 밝히는 값.
|
|
31
105
|
*
|
|
@@ -43,11 +117,30 @@ export declare const DETAIL_LEVELS: readonly ["S", "M", "L"];
|
|
|
43
117
|
export type DetailLevel = (typeof DETAIL_LEVELS)[number];
|
|
44
118
|
/** 등급별 부품 수 상한. */
|
|
45
119
|
export declare const PART_LIMIT: Record<DetailLevel, number>;
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
120
|
+
/**
|
|
121
|
+
* 채널이 무엇을 움직이나. **glTF 의 `target.path` 그대로다.**
|
|
122
|
+
*
|
|
123
|
+
* `weights` 는 없다 — 모프 타깃이 없는 형식이다.
|
|
124
|
+
*/
|
|
125
|
+
export declare const CHANNEL_PATHS: readonly ["translation", "rotation", "scale"];
|
|
126
|
+
export type ChannelPath = (typeof CHANNEL_PATHS)[number];
|
|
127
|
+
/** 키프레임 사이를 어떻게 잇나. glTF 의 `CUBICSPLINE` 은 없다 — 접선을 손으로 적을 형식이 아니다. */
|
|
128
|
+
export declare const INTERPOLATIONS: readonly ["linear", "step"];
|
|
129
|
+
export type Interpolation = (typeof INTERPOLATIONS)[number];
|
|
130
|
+
/**
|
|
131
|
+
* clip 이 어떻게 구동되나.
|
|
132
|
+
*
|
|
133
|
+
* **glTF 에는 없는 항목이다.** glTF 는 재생을 런타임에 맡긴다. 여기서 형식이 말하는
|
|
134
|
+
* 이유는 트윈이 타임라인을 재생하지 않기 때문이다 — 「문 열기 클립을 재생하라」가 아니라
|
|
135
|
+
* 「지금 40% 열려 있다」다.
|
|
136
|
+
*
|
|
137
|
+
* loop 시각이 흐른다. 인스턴스가 주는 값은 **배속**이다. 도는 롤러가 그렇다
|
|
138
|
+
* hold 시각이 멈춰 있다. 인스턴스가 주는 값은 **0~1 위치**다. 열린 정도가 그렇다
|
|
139
|
+
*
|
|
140
|
+
* 같은 clip 이 둘 다 될 수 있지만, 그 자산이 무엇인지는 저작 시점에 정해진다.
|
|
141
|
+
*/
|
|
142
|
+
export declare const CLIP_DRIVES: readonly ["loop", "hold"];
|
|
143
|
+
export type ClipDrive = (typeof CLIP_DRIVES)[number];
|
|
51
144
|
export declare const AXES: readonly ["x", "y", "z"];
|
|
52
145
|
export type Axis = (typeof AXES)[number];
|
|
53
146
|
/** 텍스트를 언제 보이나. 표현 수단(sprite·overlay)은 런타임이 고른다. */
|
|
@@ -238,18 +331,53 @@ export interface RepeatSpec {
|
|
|
238
331
|
*/
|
|
239
332
|
pitch: number;
|
|
240
333
|
}
|
|
334
|
+
/** 한 시각의 값. glTF sampler 의 input 한 칸과 output 한 칸이다. */
|
|
335
|
+
export interface Keyframe {
|
|
336
|
+
/** 시각(초). 0 이상이고 **오름차순**이어야 한다. */
|
|
337
|
+
at: number;
|
|
338
|
+
/**
|
|
339
|
+
* 그 시각의 값. 경로마다 뜻이 다르다.
|
|
340
|
+
*
|
|
341
|
+
* translation 부품 기준 옮김
|
|
342
|
+
* rotation **오일러 도(°)** — `transform.rotation` 과 같은 약속
|
|
343
|
+
* scale 배율. 1 이 제 크기
|
|
344
|
+
*/
|
|
345
|
+
value: Vec3;
|
|
346
|
+
}
|
|
241
347
|
/**
|
|
242
|
-
*
|
|
348
|
+
* 한 부품의 한 속성을 시간에 따라 움직인다. **glTF 의 channel + sampler 를 합친 것.**
|
|
243
349
|
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
* 몸체 가운데를 돌아야 하면 피봇을 명시해야 한다.
|
|
350
|
+
* glTF 는 채널과 샘플러를 나누어 여러 채널이 한 샘플러를 나눠 쓸 수 있게 한다. 그건
|
|
351
|
+
* 정점 데이터를 아끼려는 장치고, 손으로 적는 형식에서는 한 겹 더 들어갈 뿐이라 합쳤다.
|
|
247
352
|
*/
|
|
248
|
-
export interface
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
353
|
+
export interface AnimationChannel {
|
|
354
|
+
/** 어느 부품인가. `FigurePart.name`. **노드 인덱스가 아니다** — 이 형식은 이름으로 가리킨다. */
|
|
355
|
+
target: string;
|
|
356
|
+
path: ChannelPath;
|
|
357
|
+
/**
|
|
358
|
+
* 회전 중심. `rotation` 에서만 뜻이 있고, 부품 기준 로컬이다.
|
|
359
|
+
*
|
|
360
|
+
* **glTF 에는 없다.** 거기서는 부모 노드를 하나 끼워서 중심을 옮긴다. 이 형식의 부품은
|
|
361
|
+
* 겹치지 않으므로 끼울 노드가 없어 여기 둔다. 안 적으면 부품 제 중심이다.
|
|
362
|
+
*/
|
|
252
363
|
pivot?: Vec3;
|
|
364
|
+
/** 안 적으면 `linear`. */
|
|
365
|
+
interpolation?: Interpolation;
|
|
366
|
+
/** **둘 이상**이어야 한다. 하나뿐이면 움직이는 것이 아니라 자세 하나다. */
|
|
367
|
+
keys: Keyframe[];
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* 움직임 한 벌. **glTF 의 `animations[]` 한 칸이다.**
|
|
371
|
+
*
|
|
372
|
+
* 길이는 적지 않는다 — 마지막 키의 시각이 곧 길이다. 따로 적으면 어긋날 수 있고,
|
|
373
|
+
* 어긋나면 어느 쪽이 맞는지 알 방법이 없다.
|
|
374
|
+
*/
|
|
375
|
+
export interface AnimationClip {
|
|
376
|
+
/** **저장되는 식별자다.** 인스턴스가 이 이름으로 구동한다. */
|
|
377
|
+
name: string;
|
|
378
|
+
/** 안 적으면 `loop`. */
|
|
379
|
+
drive?: ClipDrive;
|
|
380
|
+
channels: AnimationChannel[];
|
|
253
381
|
}
|
|
254
382
|
/** 텍스트 표현 자리. 무엇을·언제만 정하고 수단은 런타임이 고른다. */
|
|
255
383
|
export interface LabelSpec {
|
|
@@ -264,6 +392,35 @@ export interface PartShape {
|
|
|
264
392
|
path?: Point2[];
|
|
265
393
|
/** 코너 라운드. `rect` · `polygon` 공통. */
|
|
266
394
|
round?: number;
|
|
395
|
+
/** 속을 판다. `HollowSpec` 참고. */
|
|
396
|
+
hollow?: HollowSpec;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* 민 단면의 **속을 판다** — 트레이 · 토트 · 통 · 케이스 · 프레임이 전부 이 모양이다.
|
|
400
|
+
*
|
|
401
|
+
* 없을 때는 바닥판 하나에 벽 넷을 세워 만들었다. 다섯 부품이 드는 것도 문제지만 더
|
|
402
|
+
* 나쁜 것은 **모양이 안 맞는다**는 것이다. 셀트레이의 바닥판은 모서리를 둥글게 깎았는데
|
|
403
|
+
* 벽 넷은 각진 상자라, 네 귀퉁이에서 둥근 것과 각진 것이 만난다.
|
|
404
|
+
*
|
|
405
|
+
* 한 덩어리로 밀면 바깥 테가 한 바퀴 이어지고, 안쪽 테도 같은 반경에서 두께만큼 줄어든
|
|
406
|
+
* 채 따라온다. 벽과 바닥이 맞닿는 자리가 없어져 z-fighting 이 날 자리도 하나 준다.
|
|
407
|
+
*
|
|
408
|
+
* `size` 는 **바깥 치수**다. 판 자리는 그 안쪽이다.
|
|
409
|
+
*
|
|
410
|
+
* ## 왜 프리미티브를 새로 만들지 않았나
|
|
411
|
+
*
|
|
412
|
+
* 「속을 판다」는 상자만의 성질이 아니다. `polygon` 을 파면 U 자 가드 · ㄷ 자 프레임이
|
|
413
|
+
* 같은 규칙으로 나온다. 새 프리미티브를 두면 그 둘이 서로 모르는 두 벌이 된다.
|
|
414
|
+
*/
|
|
415
|
+
export interface HollowSpec {
|
|
416
|
+
/** 벽 두께. 안쪽 테는 바깥 테에서 이만큼 들어온다. */
|
|
417
|
+
wall: number;
|
|
418
|
+
/**
|
|
419
|
+
* 바닥 두께. 없으면 벽과 같다.
|
|
420
|
+
*
|
|
421
|
+
* `0` 이면 **위아래가 다 뚫린다** — 통이 아니라 테두리다. 프레임 · 덕트가 그렇다.
|
|
422
|
+
*/
|
|
423
|
+
floor?: number;
|
|
267
424
|
}
|
|
268
425
|
export interface FigurePart {
|
|
269
426
|
/**
|
|
@@ -278,11 +435,24 @@ export interface FigurePart {
|
|
|
278
435
|
/** extrude 계열의 단면. */
|
|
279
436
|
shape?: PartShape;
|
|
280
437
|
material: PartMaterial;
|
|
281
|
-
/**
|
|
282
|
-
|
|
438
|
+
/**
|
|
439
|
+
* 상태 색이 연동될 재질 슬롯. 없으면 상태를 표현하지 않는다.
|
|
440
|
+
*
|
|
441
|
+
* **`slot` 이 아니라 `materialSlot` 이다.** 이 낱말은 스택에서 이미 임자가 있다 —
|
|
442
|
+
* operato-scene 의 `SlotDef` 는 **보유물이 앉는 자리**이고, 그것이 언젠가 이 형식에도
|
|
443
|
+
* 들어온다(`Capacity.get slots()`). 그때 한 형식 안에서 `slot` 이 「재질 인덱스」와
|
|
444
|
+
* 「자재가 앉는 자리」 둘을 뜻하게 된다. 여기는 재질 쪽이므로 그렇게 부른다.
|
|
445
|
+
*/
|
|
446
|
+
materialSlot?: MaterialSlot;
|
|
283
447
|
sizing?: SizingRule;
|
|
448
|
+
/**
|
|
449
|
+
* 어느 면을 붙잡나. 적지 않은 축은 **가까운 면**이다(`ANCHOR_ENDS` 참고).
|
|
450
|
+
*
|
|
451
|
+
* `sizing` 이 정한 것을 축마다 덮어쓴다. `sizing: 'stretch'` 는 가장 긴 축에
|
|
452
|
+
* `'span'` 을 넣는 짧은 표기이고, 여기 적으면 그것이 이긴다.
|
|
453
|
+
*/
|
|
454
|
+
anchor?: PartAnchor;
|
|
284
455
|
repeat?: RepeatSpec;
|
|
285
|
-
animation?: AnimationPoint;
|
|
286
456
|
label?: LabelSpec;
|
|
287
457
|
}
|
|
288
458
|
/** 저작 결과. 편집 가능한 원본 데이터. */
|
|
@@ -301,6 +471,13 @@ export interface FigureSource {
|
|
|
301
471
|
/** StyleKit 참조. 팔레트·분할 수·그리드·등급을 한 번에 받는다. */
|
|
302
472
|
styleKit?: string;
|
|
303
473
|
parts: FigurePart[];
|
|
474
|
+
/**
|
|
475
|
+
* 움직임. **glTF 처럼 부품 바깥에 둔다.**
|
|
476
|
+
*
|
|
477
|
+
* 한 clip 이 부품 여럿을 같이 움직이기 때문이다 — 문 두 짝이 같이 열리는 것이 clip
|
|
478
|
+
* 하나다. 부품 안에 넣으면 그 「같이」를 적을 자리가 없다.
|
|
479
|
+
*/
|
|
480
|
+
animations?: AnimationClip[];
|
|
304
481
|
}
|
|
305
482
|
/** 청사진 스키마 버전. 형식이 바뀌면 올린다. */
|
|
306
483
|
export declare const BLUEPRINT_VERSION = 1;
|
|
@@ -318,6 +495,8 @@ export interface BlueprintMember {
|
|
|
318
495
|
*/
|
|
319
496
|
segments?: number;
|
|
320
497
|
sizing: SizingRule;
|
|
498
|
+
/** 어느 면을 붙잡나. 원본에 적힌 것만 실린다 — 적지 않은 축은 그리는 쪽이 센다. */
|
|
499
|
+
anchor?: PartAnchor;
|
|
321
500
|
repeat?: RepeatSpec;
|
|
322
501
|
shape?: PartShape;
|
|
323
502
|
/** 이 부품의 삼각형 수 추정. */
|
|
@@ -333,18 +512,13 @@ export interface BlueprintGroup {
|
|
|
333
512
|
/** MaterialBank 키. */
|
|
334
513
|
materialKey: string;
|
|
335
514
|
material: PartMaterial;
|
|
336
|
-
|
|
337
|
-
/**
|
|
515
|
+
materialSlot?: MaterialSlot;
|
|
516
|
+
/** 움직이는 부품이 든 그룹인지. 그런 그룹은 부품을 하나만 갖는다. */
|
|
338
517
|
animated: boolean;
|
|
339
518
|
members: BlueprintMember[];
|
|
340
519
|
}
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
name: string;
|
|
344
|
-
kind: AnimationKind;
|
|
345
|
-
axis?: Axis;
|
|
346
|
-
pivot?: Vec3;
|
|
347
|
-
}
|
|
520
|
+
/** 청사진의 clip. 원본에 적은 것 그대로다. */
|
|
521
|
+
export type BlueprintClip = AnimationClip;
|
|
348
522
|
export interface BlueprintLabel extends LabelSpec {
|
|
349
523
|
/** 어느 부품에 붙나. `FigurePart.name`. */
|
|
350
524
|
at: string;
|
|
@@ -365,13 +539,13 @@ export interface Violation {
|
|
|
365
539
|
* 처리를 정해야 하는데, 코드가 늘어난 것이 알려지지 않으면 그 대응이 빠진다. 뜻은
|
|
366
540
|
* `docs/validation.md` 에 있고, 문서와 이 목록이 어긋나면 테스트가 실패한다.
|
|
367
541
|
*/
|
|
368
|
-
export declare const ERROR_CODES: readonly ["not-object", "not-finite", "not-positive", "out-of-range", "not-integer", "not-boolean", "not-allowed", "missing-type", "missing-base", "missing-parts", "bad-style-kit", "missing-name", "duplicate-name", "missing-transform", "missing-position", "missing-size", "too-few-segments", "missing-shape-path", "bad-shape-point", "missing-material", "material-unresolvable", "missing-repeat", "missing-
|
|
542
|
+
export declare const ERROR_CODES: readonly ["not-object", "not-finite", "not-positive", "out-of-range", "not-integer", "not-boolean", "not-allowed", "missing-type", "missing-base", "missing-parts", "bad-style-kit", "missing-name", "duplicate-name", "missing-transform", "missing-position", "missing-size", "too-few-segments", "missing-shape-path", "bad-shape-point", "hollow-too-thick", "hollow-not-convex", "missing-material", "material-unresolvable", "missing-repeat", "missing-channels", "unknown-channel-target", "too-few-keys", "keys-out-of-order", "missing-surface-ref", "missing-label-name", "missing-label-source"];
|
|
369
543
|
export type ErrorCode = (typeof ERROR_CODES)[number];
|
|
370
544
|
/**
|
|
371
545
|
* 위반 코드 전부. 위반은 컴파일을 막지 않는다 — 저작 화면이 알려 주는 데 쓴다.
|
|
372
546
|
* 뜻과 한도는 `docs/validation.md` 에 있다.
|
|
373
547
|
*/
|
|
374
|
-
export declare const VIOLATION_CODES: readonly ["segments-off-preset", "segments-ignored", "repeat-ignored", "detail-level-missing", "too-many-parts", "too-many-
|
|
548
|
+
export declare const VIOLATION_CODES: readonly ["segments-off-preset", "segments-ignored", "repeat-ignored", "anchor-ignored", "hollow-ignored", "pivot-ignored", "detail-level-missing", "too-many-parts", "too-many-animated-parts", "too-many-material-groups", "too-many-transparent", "too-many-surface-textures", "too-many-always-labels"];
|
|
375
549
|
export type ViolationCode = (typeof VIOLATION_CODES)[number];
|
|
376
550
|
/** 형식·정합성 오류. 이것이 있으면 컴파일할 수 없다. */
|
|
377
551
|
export interface FigureError {
|
|
@@ -392,11 +566,11 @@ export interface FigureBlueprint {
|
|
|
392
566
|
detailLevel?: DetailLevel;
|
|
393
567
|
budget: {
|
|
394
568
|
triangles: number;
|
|
395
|
-
/** 묶음 수 = 재질·슬롯 조합 수 +
|
|
569
|
+
/** 묶음 수 = 재질·슬롯 조합 수 + 움직이는 부품 수. **재는 것은 이것이다.** */
|
|
396
570
|
groups: number;
|
|
397
571
|
};
|
|
398
572
|
groups: BlueprintGroup[];
|
|
399
|
-
|
|
573
|
+
animations: BlueprintClip[];
|
|
400
574
|
labels: BlueprintLabel[];
|
|
401
575
|
violations: Violation[];
|
|
402
576
|
}
|
|
@@ -444,8 +618,8 @@ export interface FigureInstanceModel {
|
|
|
444
618
|
export declare const LIMITS: {
|
|
445
619
|
/** 재질·슬롯 조합 수. */
|
|
446
620
|
readonly materialGroups: 3;
|
|
447
|
-
/**
|
|
448
|
-
readonly
|
|
621
|
+
/** 움직이는 부품 수. 프레임마다 매트릭스를 갱신하고, 저마다 단독 묶음이다. */
|
|
622
|
+
readonly animatedParts: 2;
|
|
449
623
|
/** 투명 재질. 정렬 비용이 크다. */
|
|
450
624
|
readonly transparentMaterials: 1;
|
|
451
625
|
/**
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAqBA,8CAA8C;AAC9C,eAAO,MAAM,eAAe,oEAAqE,CAAA;AACjG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,+BAA+B;AAC/B,eAAO,MAAM,kBAAkB,EAAE,SAAS,aAAa,EAAwB,CAAA;AAE/E,oCAAoC;AACpC,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAA2C,CAAA;AAE/F,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,EAAE,SAAS,aAAa,EAA2B,CAAA;AAEpF;;;GAGG;AACH,eAAO,MAAM,cAAc,0BAA2B,CAAA;AACtD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,gFAAiF,CAAA;AAC9G,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,kDAAmD,CAAA;AAC5E,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa,0BAA2B,CAAA;AACrD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAExD,mBAAmB;AACnB,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAyB,CAAA;AAE5E,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -41,7 +41,66 @@ export const MATERIAL_PRESETS = ['default', 'metal', 'glass', 'plastic', 'wood',
|
|
|
41
41
|
* stretch 한 축만 늘어난다. 프레임·벨트·레일
|
|
42
42
|
* repeat 개수가 늘어난다. 롤러·선반 단 ← 새 geometry 가 생기지 않는다
|
|
43
43
|
*/
|
|
44
|
+
/** What `sizing` means when a part does not say. */
|
|
45
|
+
export const DEFAULT_SIZING = 'scale';
|
|
46
|
+
/**
|
|
47
|
+
* How many copies one repeat part may expand to.
|
|
48
|
+
*
|
|
49
|
+
* Every copy is a draw call, so an instance stretched far enough would grow
|
|
50
|
+
* without bound and one asset would eat the frame. Past this point the copies
|
|
51
|
+
* are too small to count anyway, so more of them changes nothing on screen.
|
|
52
|
+
*
|
|
53
|
+
* The renderer enforces the same number. It lives here because the report has
|
|
54
|
+
* to predict what the renderer will do -- things-scene used to keep its own
|
|
55
|
+
* copy of it.
|
|
56
|
+
*/
|
|
57
|
+
export const REPEAT_LIMIT = 100;
|
|
44
58
|
export const SIZING_RULES = ['scale', 'fixed', 'stretch', 'repeat'];
|
|
59
|
+
/**
|
|
60
|
+
* 부품이 한 축에서 기준 상자의 **어느 면을 붙잡나**. 축마다 따로 정한다.
|
|
61
|
+
*
|
|
62
|
+
* scale **아무 면도 안 붙잡는다.** 상자와 함께 비례로 커진다
|
|
63
|
+
* min 아래(또는 왼쪽·뒤) 면에서 잰 거리를 지킨다
|
|
64
|
+
* center 자리는 비례로 따라가고 **크기는 지킨다**
|
|
65
|
+
* max 위(또는 오른쪽·앞) 면에서 잰 거리를 지킨다
|
|
66
|
+
* span **양쪽을 다 붙잡는다.** 가운데가 늘어나 사이를 채운다
|
|
67
|
+
*
|
|
68
|
+
* 붙잡는 면의 수로 읽으면 하나다 — 0 개면 상자와 함께 커지고, 1 개면 그 면에서 잰
|
|
69
|
+
* 거리를 지키고, 2 개면 사이를 채운다. 3D 도구의 나인슬라이스가 하는 일이고 여기서는
|
|
70
|
+
* 그것이 세 축으로 있다.
|
|
71
|
+
*
|
|
72
|
+
* ## `repeat` 의 축에서는 **줄이 어떻게 되는가**를 말한다
|
|
73
|
+
*
|
|
74
|
+
* 같은 「반복」이 두 가지다.
|
|
75
|
+
*
|
|
76
|
+
* 컨베이어의 롤러 길어지면 롤러가 **는다.** 한 칸 간격은 그대로다
|
|
77
|
+
* 셀트레이의 셀 커지면 셀이 **커진다.** 개수는 그 트레이가 몇 셀짜리냐이지
|
|
78
|
+
* 화면에 얼마나 크게 그렸느냐가 아니다
|
|
79
|
+
*
|
|
80
|
+
* 앞의 것이 `center`(줄이 상자를 채운다), 뒤의 것이 `scale`(줄이 상자와 함께 큰다)이다.
|
|
81
|
+
*
|
|
82
|
+
* ## 없던 것을 왜 더하나
|
|
83
|
+
*
|
|
84
|
+
* `sizing` 은 부품의 **크기**가 인스턴스를 어떻게 따라가는지만 말했다. **자리**는
|
|
85
|
+
* 언제나 비례였다. 그래서 시그널 타워를 3 배로 세우면 기둥은 늘어나는데 램프들은
|
|
86
|
+
* 기둥 위 공중으로 흩어졌다 — 저작한 자리 512 가 1536 이 되고, 그 사이의 틈 100 이
|
|
87
|
+
* 300 이 되기 때문이다.
|
|
88
|
+
*
|
|
89
|
+
* 1× foot 0..90 · pole 85..705 · bracket 703..747 · … · cap 1037..1087
|
|
90
|
+
* 3× foot 90..180 · pole 255..2115 · bracket 2153..2197 · … · cap 3161..3211
|
|
91
|
+
*
|
|
92
|
+
* 램프는 상자 안 어디쯤이 아니라 **기둥 꼭대기**에 붙어 있다. 형식에 그 말을 적을
|
|
93
|
+
* 자리가 없었다.
|
|
94
|
+
*
|
|
95
|
+
* ## 적지 않으면 **가까운 면**을 붙잡는다
|
|
96
|
+
*
|
|
97
|
+
* 상자의 위 절반에 저작한 것은 위를, 아래 절반에 저작한 것은 아래를 붙잡는다.
|
|
98
|
+
* 정확히 가운데면 `center` 다. 사람이 램프를 꼭대기 근처에 놓을 때 뜻하는 것이
|
|
99
|
+
* 그것이고, 그래서 표본 열넷 중 어느 것도 이 값을 적지 않고 제대로 선다.
|
|
100
|
+
*
|
|
101
|
+
* `sizing` 이 `'scale'` 인 부품에는 뜻이 없다 — 그 부품은 상자와 함께 커진다.
|
|
102
|
+
*/
|
|
103
|
+
export const ANCHOR_RULES = ['scale', 'min', 'center', 'max', 'span'];
|
|
45
104
|
/**
|
|
46
105
|
* 디테일 등급 — 이 형상을 얼마나 상세하게 만들 것인지 저작자가 밝히는 값.
|
|
47
106
|
*
|
|
@@ -58,10 +117,27 @@ export const SIZING_RULES = ['scale', 'fixed', 'stretch', 'repeat'];
|
|
|
58
117
|
export const DETAIL_LEVELS = ['S', 'M', 'L'];
|
|
59
118
|
/** 등급별 부품 수 상한. */
|
|
60
119
|
export const PART_LIMIT = { S: 3, M: 8, L: 20 };
|
|
61
|
-
/**
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
120
|
+
/**
|
|
121
|
+
* 채널이 무엇을 움직이나. **glTF 의 `target.path` 그대로다.**
|
|
122
|
+
*
|
|
123
|
+
* `weights` 는 없다 — 모프 타깃이 없는 형식이다.
|
|
124
|
+
*/
|
|
125
|
+
export const CHANNEL_PATHS = ['translation', 'rotation', 'scale'];
|
|
126
|
+
/** 키프레임 사이를 어떻게 잇나. glTF 의 `CUBICSPLINE` 은 없다 — 접선을 손으로 적을 형식이 아니다. */
|
|
127
|
+
export const INTERPOLATIONS = ['linear', 'step'];
|
|
128
|
+
/**
|
|
129
|
+
* clip 이 어떻게 구동되나.
|
|
130
|
+
*
|
|
131
|
+
* **glTF 에는 없는 항목이다.** glTF 는 재생을 런타임에 맡긴다. 여기서 형식이 말하는
|
|
132
|
+
* 이유는 트윈이 타임라인을 재생하지 않기 때문이다 — 「문 열기 클립을 재생하라」가 아니라
|
|
133
|
+
* 「지금 40% 열려 있다」다.
|
|
134
|
+
*
|
|
135
|
+
* loop 시각이 흐른다. 인스턴스가 주는 값은 **배속**이다. 도는 롤러가 그렇다
|
|
136
|
+
* hold 시각이 멈춰 있다. 인스턴스가 주는 값은 **0~1 위치**다. 열린 정도가 그렇다
|
|
137
|
+
*
|
|
138
|
+
* 같은 clip 이 둘 다 될 수 있지만, 그 자산이 무엇인지는 저작 시점에 정해진다.
|
|
139
|
+
*/
|
|
140
|
+
export const CLIP_DRIVES = ['loop', 'hold'];
|
|
65
141
|
export const AXES = ['x', 'y', 'z'];
|
|
66
142
|
/** 텍스트를 언제 보이나. 표현 수단(sprite·overlay)은 런타임이 고른다. */
|
|
67
143
|
export const LABEL_WHENS = ['always', 'zoomed', 'selected', 'abnormal'];
|
|
@@ -114,14 +190,18 @@ export const ERROR_CODES = [
|
|
|
114
190
|
// 단면
|
|
115
191
|
'missing-shape-path',
|
|
116
192
|
'bad-shape-point',
|
|
193
|
+
'hollow-too-thick',
|
|
194
|
+
'hollow-not-convex',
|
|
117
195
|
// 재질
|
|
118
196
|
'missing-material',
|
|
119
197
|
'material-unresolvable',
|
|
120
198
|
// 크기 반응
|
|
121
199
|
'missing-repeat',
|
|
122
200
|
// 애니메이션
|
|
123
|
-
'missing-
|
|
124
|
-
'
|
|
201
|
+
'missing-channels',
|
|
202
|
+
'unknown-channel-target',
|
|
203
|
+
'too-few-keys',
|
|
204
|
+
'keys-out-of-order',
|
|
125
205
|
// 예외 표면
|
|
126
206
|
'missing-surface-ref',
|
|
127
207
|
// 라벨
|
|
@@ -136,9 +216,12 @@ export const VIOLATION_CODES = [
|
|
|
136
216
|
'segments-off-preset',
|
|
137
217
|
'segments-ignored',
|
|
138
218
|
'repeat-ignored',
|
|
219
|
+
'anchor-ignored',
|
|
220
|
+
'hollow-ignored',
|
|
221
|
+
'pivot-ignored',
|
|
139
222
|
'detail-level-missing',
|
|
140
223
|
'too-many-parts',
|
|
141
|
-
'too-many-
|
|
224
|
+
'too-many-animated-parts',
|
|
142
225
|
'too-many-material-groups',
|
|
143
226
|
'too-many-transparent',
|
|
144
227
|
'too-many-surface-textures',
|
|
@@ -156,8 +239,8 @@ export const VIOLATION_CODES = [
|
|
|
156
239
|
export const LIMITS = {
|
|
157
240
|
/** 재질·슬롯 조합 수. */
|
|
158
241
|
materialGroups: 3,
|
|
159
|
-
/**
|
|
160
|
-
|
|
242
|
+
/** 움직이는 부품 수. 프레임마다 매트릭스를 갱신하고, 저마다 단독 묶음이다. */
|
|
243
|
+
animatedParts: 2,
|
|
161
244
|
/** 투명 재질. 정렬 비용이 크다. */
|
|
162
245
|
transparentMaterials: 1,
|
|
163
246
|
/**
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAU,CAAA;AAGjG,+BAA+B;AAC/B,MAAM,CAAC,MAAM,kBAAkB,GAA6B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAE/E,oCAAoC;AACpC,MAAM,CAAC,MAAM,eAAe,GAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;AAE/F,kCAAkC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;AAEpF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAA;AAGtD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAG9G;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAG5E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAGrD,mBAAmB;AACnB,MAAM,CAAC,MAAM,UAAU,GAAgC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;AAE5E
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAU,CAAA;AAGjG,+BAA+B;AAC/B,MAAM,CAAC,MAAM,kBAAkB,GAA6B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAE/E,oCAAoC;AACpC,MAAM,CAAC,MAAM,eAAe,GAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;AAE/F,kCAAkC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAA6B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;AAEpF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAA;AAGtD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAG9G;;;;;;;GAOG;AACH,oDAAoD;AACpD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAA;AAE9C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAA;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAA;AAG5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAU,CAAA;AAkB9E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAGrD,mBAAmB;AACnB,MAAM,CAAC,MAAM,UAAU,GAAgC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;AAE5E;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,UAAU,EAAE,OAAO,CAAU,CAAA;AAG1E,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAU,CAAA;AAGzD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAA;AAGpD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAG5C,oDAAoD;AACpD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAU,CAAA;AAwDhF;;;;;GAKG;AACH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU,CAAA;AA4R7D,2EAA2E;AAE3E,+BAA+B;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAyDlC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK;IACL,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,oCAAoC;IACpC,cAAc;IACd,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,KAAK;IACL,cAAc;IACd,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,cAAc;IACd,kBAAkB;IAClB,KAAK;IACL,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;IACnB,KAAK;IACL,kBAAkB;IAClB,uBAAuB;IACvB,QAAQ;IACR,gBAAgB;IAChB,QAAQ;IACR,kBAAkB;IAClB,wBAAwB;IACxB,cAAc;IACd,mBAAmB;IACnB,QAAQ;IACR,qBAAqB;IACrB,KAAK;IACL,oBAAoB;IACpB,sBAAsB;CACd,CAAA;AAGV;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,qBAAqB;IACrB,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,eAAe;IACf,sBAAsB;IACtB,gBAAgB;IAChB,yBAAyB;IACzB,0BAA0B;IAC1B,sBAAsB;IACtB,2BAA2B;IAC3B,wBAAwB;CAChB,CAAA;AAoEV,0EAA0E;AAE1E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,kBAAkB;IAClB,cAAc,EAAE,CAAC;IACjB,gDAAgD;IAChD,aAAa,EAAE,CAAC;IAChB,wBAAwB;IACxB,oBAAoB,EAAE,CAAC;IACvB;;;;;;;OAOG;IACH,eAAe,EAAE,CAAC;IAClB,iCAAiC;IACjC,WAAW,EAAE,CAAC;CACN,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA"}
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAqBA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAqBA,OAAO,EAoBL,KAAK,WAAW,EAGhB,KAAK,SAAS,EAEf,MAAM,YAAY,CAAA;AAOnB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,UAAU,EAAE,SAAS,EAAE,CAAA;CACxB;AAmgBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CA2CxD"}
|