webgl2-sdf 0.0.1 → 0.0.2
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/browser/index.min.js +1 -0
- package/node/bezier/bezier-curves-to-line-segs.js +31 -0
- package/node/bezier/bezier-curves-to-line-segs.js.map +1 -0
- package/node/bezier/eval-de-casteljau.js +61 -0
- package/node/bezier/eval-de-casteljau.js.map +1 -0
- package/node/bezier/from-to/from-to-2.js +134 -0
- package/node/bezier/from-to/from-to-2.js.map +1 -0
- package/node/bezier/from-to/from-to-3.js +159 -0
- package/node/bezier/from-to/from-to-3.js.map +1 -0
- package/node/bezier/from-to/from-to.js +21 -0
- package/node/bezier/from-to/from-to.js.map +1 -0
- package/node/bezier/is-cubic-obtuse.js +24 -0
- package/node/bezier/is-cubic-obtuse.js.map +1 -0
- package/node/bezier/is-quad-obtuse.js +20 -0
- package/node/bezier/is-quad-obtuse.js.map +1 -0
- package/node/bezier/is-really-point.js +19 -0
- package/node/bezier/is-really-point.js.map +1 -0
- package/node/bezier/split-by-deviation-from-straight-line-cubic.js +85 -0
- package/node/bezier/split-by-deviation-from-straight-line-cubic.js.map +1 -0
- package/node/bezier/split-by-deviation-from-straight-line-quad.js +50 -0
- package/node/bezier/split-by-deviation-from-straight-line-quad.js.map +1 -0
- package/node/bezier/split-into-line-segments.js +29 -0
- package/node/bezier/split-into-line-segments.js.map +1 -0
- package/node/generate-sdf.js +57 -0
- package/node/generate-sdf.js.map +1 -0
- package/node/index.js +2 -0
- package/node/index.js.map +1 -0
- package/node/main-program.js +100 -0
- package/node/main-program.js.map +1 -0
- package/node/max-aspect-ratio-before-stretch.js +3 -0
- package/node/max-aspect-ratio-before-stretch.js.map +1 -0
- package/node/prepare-buffers.js +114 -0
- package/node/prepare-buffers.js.map +1 -0
- package/node/row-count.js +4 -0
- package/node/row-count.js.map +1 -0
- package/node/shaders/main.fragment.js +149 -0
- package/node/shaders/main.fragment.js.map +1 -0
- package/node/shaders/main.vertex.js +53 -0
- package/node/shaders/main.vertex.js.map +1 -0
- package/node/svg/get-beziers-from-raw-paths.js +91 -0
- package/node/svg/get-beziers-from-raw-paths.js.map +1 -0
- package/node/svg/get-paths-from-str.js +14 -0
- package/node/svg/get-paths-from-str.js.map +1 -0
- package/node/svg/path-data-polyfill/parse-number.js +101 -0
- package/node/svg/path-data-polyfill/parse-number.js.map +1 -0
- package/node/svg/path-data-polyfill/parse-path-data-string.js +21 -0
- package/node/svg/path-data-polyfill/parse-path-data-string.js.map +1 -0
- package/node/svg/path-data-polyfill/source.js +147 -0
- package/node/svg/path-data-polyfill/source.js.map +1 -0
- package/node/svg/path-segment/c.js +29 -0
- package/node/svg/path-segment/c.js.map +1 -0
- package/node/svg/path-segment/h.js +23 -0
- package/node/svg/path-segment/h.js.map +1 -0
- package/node/svg/path-segment/l.js +24 -0
- package/node/svg/path-segment/l.js.map +1 -0
- package/node/svg/path-segment/q.js +23 -0
- package/node/svg/path-segment/q.js.map +1 -0
- package/node/svg/path-segment/s.js +34 -0
- package/node/svg/path-segment/s.js.map +1 -0
- package/node/svg/path-segment/t.js +28 -0
- package/node/svg/path-segment/t.js.map +1 -0
- package/node/svg/path-segment/v.js +23 -0
- package/node/svg/path-segment/v.js.map +1 -0
- package/node/svg/path-segment/z.js +21 -0
- package/node/svg/path-segment/z.js.map +1 -0
- package/node/svg/path-state.js +2 -0
- package/node/svg/path-state.js.map +1 -0
- package/node/tex-width.js +12 -0
- package/node/tex-width.js.map +1 -0
- package/node/types/attribute.js +2 -0
- package/node/types/attribute.js.map +1 -0
- package/node/types/cell.js +2 -0
- package/node/types/cell.js.map +1 -0
- package/node/types/gl-context.js +2 -0
- package/node/types/gl-context.js.map +1 -0
- package/node/types/gl-type.js +2 -0
- package/node/types/gl-type.js.map +1 -0
- package/node/types/gl-usage.js +2 -0
- package/node/types/gl-usage.js.map +1 -0
- package/node/types/program.js +2 -0
- package/node/types/program.js.map +1 -0
- package/node/types/strip.js +2 -0
- package/node/types/strip.js.map +1 -0
- package/node/types/texture.js +2 -0
- package/node/types/texture.js.map +1 -0
- package/node/utils/calc-circs.js +97 -0
- package/node/utils/calc-circs.js.map +1 -0
- package/node/utils/clip-line-segment-to-grid.js +98 -0
- package/node/utils/clip-line-segment-to-grid.js.map +1 -0
- package/node/utils/clip-line-segment-to-strips.js +150 -0
- package/node/utils/clip-line-segment-to-strips.js.map +1 -0
- package/node/utils/create-empty-grid.js +24 -0
- package/node/utils/create-empty-grid.js.map +1 -0
- package/node/utils/create-empty-strips.js +16 -0
- package/node/utils/create-empty-strips.js.map +1 -0
- package/node/utils/distance-seg-to-p.js +35 -0
- package/node/utils/distance-seg-to-p.js.map +1 -0
- package/node/utils/find-close-cells.js +130 -0
- package/node/utils/find-close-cells.js.map +1 -0
- package/node/utils/find-crossing-cells.js +31 -0
- package/node/utils/find-crossing-cells.js.map +1 -0
- package/node/utils/get-distance-to-line-function.js +45 -0
- package/node/utils/get-distance-to-line-function.js.map +1 -0
- package/node/utils/jump-idx.js +81 -0
- package/node/utils/jump-idx.js.map +1 -0
- package/node/utils/map-to-viewbox.js +29 -0
- package/node/utils/map-to-viewbox.js.map +1 -0
- package/node/utils/seg-box-x.js +69 -0
- package/node/utils/seg-box-x.js.map +1 -0
- package/node/utils/seg-strip-x.js +58 -0
- package/node/utils/seg-strip-x.js.map +1 -0
- package/node/vector/dot.js +11 -0
- package/node/vector/dot.js.map +1 -0
- package/node/vector/from-to-vec.js +11 -0
- package/node/vector/from-to-vec.js.map +1 -0
- package/node/vector/len.js +9 -0
- package/node/vector/len.js.map +1 -0
- package/node/webgl-utils/compile-shader.js +8 -0
- package/node/webgl-utils/compile-shader.js.map +1 -0
- package/node/webgl-utils/get-gl-context.js +43 -0
- package/node/webgl-utils/get-gl-context.js.map +1 -0
- package/node/webgl-utils/set-attribute.js +52 -0
- package/node/webgl-utils/set-attribute.js.map +1 -0
- package/node/webgl-utils/set-uniform-block.js +31 -0
- package/node/webgl-utils/set-uniform-block.js.map +1 -0
- package/node/webgl-utils/set-uniform.js +11 -0
- package/node/webgl-utils/set-uniform.js.map +1 -0
- package/node/webgl-utils/uniform-block.js +2 -0
- package/node/webgl-utils/uniform-block.js.map +1 -0
- package/node/webgl-utils/uniform-type.js +2 -0
- package/node/webgl-utils/uniform-type.js.map +1 -0
- package/node/webgl-utils/use-program.js +31 -0
- package/node/webgl-utils/use-program.js.map +1 -0
- package/node/webgl-utils/use-texture.js +25 -0
- package/node/webgl-utils/use-texture.js.map +1 -0
- package/package.json +4 -5
- package/node/debug-shaders.d.ts +0 -9
- package/node/helpers/calc-circs.d.ts +0 -11
- package/node/helpers/clip-line-segment-to-grid.d.ts +0 -14
- package/node/helpers/clip-line-segment-to-strips.d.ts +0 -13
- package/node/helpers/create-empty-grid.d.ts +0 -8
- package/node/helpers/create-empty-strips.d.ts +0 -7
- package/node/helpers/distance-seg-to-p.d.ts +0 -5
- package/node/helpers/find-close-cells.d.ts +0 -3
- package/node/helpers/find-crossing-cells.d.ts +0 -3
- package/node/helpers/get-distance-to-line-function.d.ts +0 -10
- package/node/helpers/jump-idx.d.ts +0 -2
- package/node/helpers/map-to-viewbox.d.ts +0 -2
- package/node/helpers/seg-box-x.d.ts +0 -10
- package/node/helpers/seg-strip-x.d.ts +0 -9
- package/node/webgl2.d.ts +0 -2
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ROW_COUNT } from "../row-count";
|
|
2
|
+
const cache = {};
|
|
3
|
+
function getMainFragment(colCount, padCount) {
|
|
4
|
+
const fragment = cache[1024 * colCount + padCount];
|
|
5
|
+
if (fragment !== undefined) {
|
|
6
|
+
return fragment;
|
|
7
|
+
}
|
|
8
|
+
const main_Fragment =
|
|
9
|
+
/*glsl*/ `#version 300 es
|
|
10
|
+
|
|
11
|
+
precision highp float;
|
|
12
|
+
|
|
13
|
+
uniform float uMaxDistance;
|
|
14
|
+
uniform float uExponent;
|
|
15
|
+
uniform highp sampler2D uSegs;
|
|
16
|
+
uniform highp isampler2D uCloseCellIdxs;
|
|
17
|
+
uniform highp isampler2D uCrossCellIdxs;
|
|
18
|
+
uniform int uIncl; // bit 0 -> incl inside, bit 1 -> incl outside
|
|
19
|
+
|
|
20
|
+
uniform SegIdxRangePerCellBlock {
|
|
21
|
+
ivec4 uSegIdxRangePerCell[${(ROW_COUNT + 2 * padCount) * (colCount + 2 * padCount) / 2}];
|
|
22
|
+
};
|
|
23
|
+
uniform SegIdxRangePerStripBlock {
|
|
24
|
+
ivec4 uSegIdxRangePerStrip[${ROW_COUNT / 2}];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
in vec2 vXY;
|
|
28
|
+
flat in int instanceId;
|
|
29
|
+
flat in ivec2 closeCellIdxRange;
|
|
30
|
+
flat in ivec2 crossCellIdxRange;
|
|
31
|
+
out vec4 FragColor;
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
float absDistToSegment(vec2 point, vec2 lineA, vec2 lineB) {
|
|
35
|
+
vec2 lineDir = lineB - lineA;
|
|
36
|
+
float lenSq = dot(lineDir, lineDir);
|
|
37
|
+
float t = clamp(dot(point - lineA, lineDir) / lenSq, 0.0, 1.0);
|
|
38
|
+
vec2 linePt = lineA + t * lineDir;
|
|
39
|
+
|
|
40
|
+
return distance(point, linePt);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
void main() {
|
|
45
|
+
///////////////////////////////////////////////////////////////////////////
|
|
46
|
+
// Project a ray to the left to check if it crosses the segment in order
|
|
47
|
+
// to find the fragment's winding number to determine whether fragment
|
|
48
|
+
// is inside or outside the shape.
|
|
49
|
+
|
|
50
|
+
int crossIdxS = crossCellIdxRange.x;
|
|
51
|
+
int crossLen = crossCellIdxRange.y;
|
|
52
|
+
float winds = 0.0;
|
|
53
|
+
// Iterate over all relevant cell indexes
|
|
54
|
+
for (int i = crossIdxS; i < crossIdxS + crossLen; i++) {
|
|
55
|
+
int crossIdx = texelFetch(uCrossCellIdxs, ivec2(i%256, i/256), 0).x;
|
|
56
|
+
|
|
57
|
+
bool isEven = crossIdx % 2 == 0;
|
|
58
|
+
|
|
59
|
+
ivec4 uSegIdxRange = uSegIdxRangePerCell[crossIdx / 2];
|
|
60
|
+
int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
|
|
61
|
+
int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
|
|
62
|
+
|
|
63
|
+
for (int j = segIdx; j < segIdx + segLen; j++) {
|
|
64
|
+
// Fetch segment from texture
|
|
65
|
+
vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);
|
|
66
|
+
|
|
67
|
+
// line segment's min-y is excluded
|
|
68
|
+
bool crossing =
|
|
69
|
+
(seg.y > vXY.y != seg.w > vXY.y) &&
|
|
70
|
+
(vXY.x > (seg.z - seg.x)*(vXY.y - seg.y) / (seg.w - seg.y) + seg.x);
|
|
71
|
+
|
|
72
|
+
bool crossingUp = seg.y < seg.w;
|
|
73
|
+
|
|
74
|
+
winds += crossing ? (crossingUp ? 1.0 : -1.0) : 0.0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
{
|
|
79
|
+
bool isEven = (instanceId % ${ROW_COUNT}) % 2 == 0;
|
|
80
|
+
|
|
81
|
+
ivec4 uSegIdxRange = uSegIdxRangePerStrip[(instanceId % ${ROW_COUNT}) / 2];
|
|
82
|
+
int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
|
|
83
|
+
int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
|
|
84
|
+
|
|
85
|
+
for (int j = segIdx; j < segIdx + segLen; j++) {
|
|
86
|
+
// Fetch segment from texture
|
|
87
|
+
vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);
|
|
88
|
+
|
|
89
|
+
// line segment's min-y is excluded
|
|
90
|
+
bool crossing =
|
|
91
|
+
(seg.y > vXY.y != seg.w > vXY.y) &&
|
|
92
|
+
(vXY.x > (seg.z - seg.x)*(vXY.y - seg.y) / (seg.w - seg.y) + seg.x);
|
|
93
|
+
|
|
94
|
+
bool crossingUp = seg.y < seg.w;
|
|
95
|
+
|
|
96
|
+
winds += crossing ? (crossingUp ? 1.0 : -1.0) : 0.0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
bool inside = winds != 0.0;
|
|
102
|
+
///////////////////////////////////////////////////////////////////////////
|
|
103
|
+
|
|
104
|
+
///////////////////////////////////////////////////////////////////////////
|
|
105
|
+
float res = 1.0; // sdf result
|
|
106
|
+
|
|
107
|
+
if ((inside && (uIncl % 2 != 0)) || (!inside && (uIncl > 1))) {
|
|
108
|
+
int cellIdxS = closeCellIdxRange.x;
|
|
109
|
+
int cellLen = closeCellIdxRange.y;
|
|
110
|
+
// Iterate over all relevant cell indexes
|
|
111
|
+
for (int i = cellIdxS; i < cellIdxS + cellLen; i++) {
|
|
112
|
+
int cellIdx = texelFetch(uCloseCellIdxs, ivec2(i%256, i/256), 0).x;
|
|
113
|
+
|
|
114
|
+
bool isEven = cellIdx % 2 == 0;
|
|
115
|
+
ivec4 uSegIdxRange = uSegIdxRangePerCell[cellIdx / 2];
|
|
116
|
+
int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
|
|
117
|
+
int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
|
|
118
|
+
|
|
119
|
+
for (int j = segIdx; j < segIdx + segLen; j++) {
|
|
120
|
+
// Fetch segment from texture
|
|
121
|
+
vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);
|
|
122
|
+
|
|
123
|
+
// Find unsigned distance to the segment; only the nearest will be kept
|
|
124
|
+
float d = absDistToSegment(vXY, seg.xy, seg.zw);
|
|
125
|
+
// Apply exponential transform TODO
|
|
126
|
+
// val = pow(1.0 - clamp(d / uMaxDistance, 0.0, 1.0), uExponent) * 0.5;
|
|
127
|
+
float val = clamp(d / uMaxDistance, 0.0, 1.0);
|
|
128
|
+
res = min(res, val);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
///////////////////////////////////////////////////////////////////////////
|
|
133
|
+
|
|
134
|
+
// DEBUG!
|
|
135
|
+
float alpha = ((instanceId + instanceId/${ROW_COUNT}) % 2 == 0 ? 0.3 : 0.5);
|
|
136
|
+
|
|
137
|
+
float red = inside ? 0.2 : 0.8;
|
|
138
|
+
float green = abs(sin(50.0 * res));
|
|
139
|
+
float blue = 0.5;
|
|
140
|
+
// float alpha = inside ? 0.5 : 0.0;
|
|
141
|
+
|
|
142
|
+
FragColor = vec4(red, green, blue, alpha);
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
cache[1024 * colCount + padCount] = main_Fragment;
|
|
146
|
+
return main_Fragment;
|
|
147
|
+
}
|
|
148
|
+
export { getMainFragment };
|
|
149
|
+
//# sourceMappingURL=main.fragment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.fragment.js","sourceRoot":"","sources":["../../src/shaders/main.fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAGxC,MAAM,KAAK,GAAkD,EAAE,CAAC;AAGhE,SAAS,eAAe,CAChB,QAAgB,EAChB,QAAgB;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC;IAEpD,MAAM,aAAa;IACnB,QAAQ,CAAA;;;;;;;;;;;;gCAYwB,CAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAC,CAAC,QAAQ,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAG,CAAC;;;iCAGnD,SAAS,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAuDR,SAAS;;kEAEmB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8CAsD7B,SAAS;;;;;;;;;CAStD,CAAA;IAEG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,aAAa,CAAC;IAChD,OAAO,aAAa,CAAC;AACzB,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ROW_COUNT } from "../row-count";
|
|
2
|
+
const main_Vertex = /*glsl*/ `#version 300 es
|
|
3
|
+
|
|
4
|
+
precision highp float;
|
|
5
|
+
|
|
6
|
+
uniform vec2 uWidthHeight;
|
|
7
|
+
uniform float uStretch;
|
|
8
|
+
in vec2 aUV;
|
|
9
|
+
in ivec2 aCloseCellIdxRangePerCell;
|
|
10
|
+
in ivec2 aCrossIdxRangePerCell;
|
|
11
|
+
out vec2 vXY;
|
|
12
|
+
flat out int instanceId;
|
|
13
|
+
flat out ivec2 closeCellIdxRange;
|
|
14
|
+
flat out ivec2 crossCellIdxRange;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
void main() {
|
|
18
|
+
instanceId = gl_InstanceID;
|
|
19
|
+
closeCellIdxRange = aCloseCellIdxRangePerCell;
|
|
20
|
+
crossCellIdxRange = aCrossIdxRangePerCell;
|
|
21
|
+
|
|
22
|
+
// drawn column-by-column
|
|
23
|
+
float i = float(instanceId / ${ROW_COUNT}); // column index
|
|
24
|
+
float j = float(instanceId % ${ROW_COUNT}); // row index
|
|
25
|
+
|
|
26
|
+
vec2 trans = vec2(
|
|
27
|
+
i / float(${ROW_COUNT}),
|
|
28
|
+
j / float(${ROW_COUNT})
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
vec2 uv = aUV + trans;
|
|
32
|
+
|
|
33
|
+
float width = uWidthHeight.x;
|
|
34
|
+
float height = uWidthHeight.y;
|
|
35
|
+
|
|
36
|
+
vXY = vec2(
|
|
37
|
+
height * uv.x,
|
|
38
|
+
height * uv.y
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
float aspectRatio = width / height;
|
|
42
|
+
|
|
43
|
+
gl_Position = vec4(
|
|
44
|
+
vec2(
|
|
45
|
+
(2.0*(uv.x / aspectRatio) - 1.0),
|
|
46
|
+
2.0*uv.y - 1.0
|
|
47
|
+
),
|
|
48
|
+
0.0, 1.0
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
export { main_Vertex };
|
|
53
|
+
//# sourceMappingURL=main.vertex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.vertex.js","sourceRoot":"","sources":["../../src/shaders/main.vertex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,WAAW,GAAG,QAAQ,CAAA;;;;;;;;;;;;;;;;;;;;;mCAqBO,SAAS;mCACT,SAAS;;;oBAGxB,SAAS;oBACT,SAAS;;;;;;;;;;;;;;;;;;;;;;;CAuB5B,CAAC;AAGF,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { z } from './path-segment/z.js';
|
|
2
|
+
import { c } from './path-segment/c.js';
|
|
3
|
+
import { s } from './path-segment/s.js';
|
|
4
|
+
import { l } from './path-segment/l.js';
|
|
5
|
+
import { h } from './path-segment/h.js';
|
|
6
|
+
import { v } from './path-segment/v.js';
|
|
7
|
+
import { q } from './path-segment/q.js';
|
|
8
|
+
import { t } from './path-segment/t.js';
|
|
9
|
+
const pathFs = {
|
|
10
|
+
c, // cubic bezier
|
|
11
|
+
h, // horizontal line
|
|
12
|
+
l, // line
|
|
13
|
+
q, // quadratic bezier
|
|
14
|
+
s, // cubic bezier (smooth)
|
|
15
|
+
t, // quadratic bezier (smooth)
|
|
16
|
+
v, // vertical line
|
|
17
|
+
z // close path
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Returns order 1, 2 and 3 beziers from the given SVG DOM element. If a path
|
|
21
|
+
* data tag is not "C, Q or L, etc", i.e. if it is not an absolute bezier
|
|
22
|
+
* coordinate then it is converted into one.
|
|
23
|
+
*
|
|
24
|
+
* @param paths An SVG element
|
|
25
|
+
*/
|
|
26
|
+
function getBeziersFromRawPaths(paths) {
|
|
27
|
+
if (paths.length === 0) {
|
|
28
|
+
return []; // A shape is not described
|
|
29
|
+
}
|
|
30
|
+
if (paths[0].type.toLowerCase() !== 'm') {
|
|
31
|
+
throw new Error('Invalid SVG - every new path must start with an M or m.');
|
|
32
|
+
}
|
|
33
|
+
const s = { p: [0, 0] };
|
|
34
|
+
const beziersArrays = [];
|
|
35
|
+
let beziers = [];
|
|
36
|
+
let prevType = undefined;
|
|
37
|
+
for (let i = 0; i < paths.length; i++) {
|
|
38
|
+
const pathSeg = paths[i];
|
|
39
|
+
const type = pathSeg.type.toLowerCase();
|
|
40
|
+
s.vals = pathSeg.values;
|
|
41
|
+
// If pathSeg was lowercase, it is relative - make absolute
|
|
42
|
+
if (pathSeg.type === type) {
|
|
43
|
+
if (type === 'v') {
|
|
44
|
+
s.vals[0] += s.p[1];
|
|
45
|
+
}
|
|
46
|
+
else if (type === 'a') {
|
|
47
|
+
s.vals[5] += s.p[0];
|
|
48
|
+
s.vals[6] += s.p[1];
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
for (let i = 0; i < s.vals.length; i++) {
|
|
52
|
+
s.vals[i] += s.p[i % 2];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (type === 'm') {
|
|
57
|
+
if (beziers.length) {
|
|
58
|
+
// This is a subpath, close as if the previous command was a
|
|
59
|
+
// Z or z.
|
|
60
|
+
if (prevType !== 'z') {
|
|
61
|
+
beziers.push(z(s));
|
|
62
|
+
}
|
|
63
|
+
// Start new path
|
|
64
|
+
beziersArrays.push(beziers);
|
|
65
|
+
beziers = [];
|
|
66
|
+
}
|
|
67
|
+
s.initialPoint = s.p = s.vals;
|
|
68
|
+
prevType = type;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const f = pathFs[type];
|
|
72
|
+
if (!f) {
|
|
73
|
+
throw new Error('Invalid SVG - command not recognized.');
|
|
74
|
+
}
|
|
75
|
+
const ps = f(s);
|
|
76
|
+
s.p = ps[ps.length - 1]; // Update current point
|
|
77
|
+
beziers.push(ps);
|
|
78
|
+
prevType = type;
|
|
79
|
+
}
|
|
80
|
+
if (beziers.length > 0) {
|
|
81
|
+
// This is a subpath, close as if the previous command was a Z or z.
|
|
82
|
+
if (prevType !== 'z') {
|
|
83
|
+
beziers.push(z(s));
|
|
84
|
+
}
|
|
85
|
+
// Start new path
|
|
86
|
+
beziersArrays.push(beziers);
|
|
87
|
+
}
|
|
88
|
+
return beziersArrays;
|
|
89
|
+
}
|
|
90
|
+
export { getBeziersFromRawPaths };
|
|
91
|
+
//# sourceMappingURL=get-beziers-from-raw-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-beziers-from-raw-paths.js","sourceRoot":"","sources":["../../src/svg/get-beziers-from-raw-paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getBeziersFromRawPaths } from './get-beziers-from-raw-paths.js';
|
|
2
|
+
import { parsePathDataString } from './path-data-polyfill/parse-path-data-string.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns an array of loops with each loop consisting of an array of beziers
|
|
5
|
+
* and each bezier in turn consisting of an array of control points from the
|
|
6
|
+
* given SVG path string. An array of loops are returned (as opposed to a single
|
|
7
|
+
* loop) since an SVG path may have sub-paths.
|
|
8
|
+
* @param str The SVG path string, e.g. 'M1 1 C 5 1 5 2 4 2 C 3 3 1 3 1 1 z'
|
|
9
|
+
*/
|
|
10
|
+
function getPathsFromStr(str) {
|
|
11
|
+
return getBeziersFromRawPaths(parsePathDataString(str));
|
|
12
|
+
}
|
|
13
|
+
export { getPathsFromStr };
|
|
14
|
+
//# sourceMappingURL=get-paths-from-str.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-paths-from-str.js","sourceRoot":"","sources":["../../src/svg/get-paths-from-str.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGrF;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAW;IAChC,OAAO,sBAAsB,CACzB,mBAAmB,CAAC,GAAG,CAAC,CAC3B,CAAC;AACN,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hidden
|
|
3
|
+
* Parse a number from an SVG path. This very closely follows genericParseNumber(...) from
|
|
4
|
+
* Source/core/svg/SVGParserUtilities.cpp.
|
|
5
|
+
* Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF
|
|
6
|
+
* @param source
|
|
7
|
+
*/
|
|
8
|
+
function parseNumber(source) {
|
|
9
|
+
let exponent = 0;
|
|
10
|
+
let integer = 0;
|
|
11
|
+
let frac = 1;
|
|
12
|
+
let decimal = 0;
|
|
13
|
+
let sign = 1;
|
|
14
|
+
let expsign = 1;
|
|
15
|
+
const startIndex = source._currentIndex;
|
|
16
|
+
source._skipOptionalSpaces();
|
|
17
|
+
// Read the sign.
|
|
18
|
+
if (source._currentIndex < source._endIndex && source._string[source._currentIndex] === "+") {
|
|
19
|
+
source._currentIndex += 1;
|
|
20
|
+
}
|
|
21
|
+
else if (source._currentIndex < source._endIndex && source._string[source._currentIndex] === "-") {
|
|
22
|
+
source._currentIndex += 1;
|
|
23
|
+
sign = -1;
|
|
24
|
+
}
|
|
25
|
+
if (source._currentIndex === source._endIndex ||
|
|
26
|
+
((source._string[source._currentIndex] < "0" || source._string[source._currentIndex] > "9") &&
|
|
27
|
+
source._string[source._currentIndex] !== ".")) {
|
|
28
|
+
throw new Error('The first character of a number must be one of [0-9+-.].');
|
|
29
|
+
}
|
|
30
|
+
// Read the integer part, build right-to-left.
|
|
31
|
+
const startIntPartIndex = source._currentIndex;
|
|
32
|
+
while (source._currentIndex < source._endIndex &&
|
|
33
|
+
source._string[source._currentIndex] >= "0" &&
|
|
34
|
+
source._string[source._currentIndex] <= "9") {
|
|
35
|
+
source._currentIndex += 1; // Advance to first non-digit.
|
|
36
|
+
}
|
|
37
|
+
if (source._currentIndex !== startIntPartIndex) {
|
|
38
|
+
let scanIntPartIndex = source._currentIndex - 1;
|
|
39
|
+
let multiplier = 1;
|
|
40
|
+
while (scanIntPartIndex >= startIntPartIndex) {
|
|
41
|
+
integer += multiplier * (Number(source._string[scanIntPartIndex]) - 0);
|
|
42
|
+
scanIntPartIndex -= 1;
|
|
43
|
+
multiplier *= 10;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Read the decimals.
|
|
47
|
+
if (source._currentIndex < source._endIndex && source._string[source._currentIndex] === ".") {
|
|
48
|
+
source._currentIndex += 1;
|
|
49
|
+
if (source._currentIndex >= source._endIndex ||
|
|
50
|
+
source._string[source._currentIndex] < "0" ||
|
|
51
|
+
source._string[source._currentIndex] > "9") {
|
|
52
|
+
throw new Error('There must be a least one digit following the .');
|
|
53
|
+
}
|
|
54
|
+
while (source._currentIndex < source._endIndex &&
|
|
55
|
+
source._string[source._currentIndex] >= "0" &&
|
|
56
|
+
source._string[source._currentIndex] <= "9") {
|
|
57
|
+
frac *= 10;
|
|
58
|
+
decimal += (Number(source._string.charAt(source._currentIndex))) / frac;
|
|
59
|
+
source._currentIndex += 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Read the exponent part.
|
|
63
|
+
if (source._currentIndex !== startIndex &&
|
|
64
|
+
source._currentIndex + 1 < source._endIndex &&
|
|
65
|
+
(source._string[source._currentIndex] === "e" || source._string[source._currentIndex] === "E") &&
|
|
66
|
+
(source._string[source._currentIndex + 1] !== "x" && source._string[source._currentIndex + 1] !== "m")) {
|
|
67
|
+
source._currentIndex += 1;
|
|
68
|
+
// Read the sign of the exponent.
|
|
69
|
+
if (source._string[source._currentIndex] === "+") {
|
|
70
|
+
source._currentIndex += 1;
|
|
71
|
+
}
|
|
72
|
+
else if (source._string[source._currentIndex] === "-") {
|
|
73
|
+
source._currentIndex += 1;
|
|
74
|
+
expsign = -1;
|
|
75
|
+
}
|
|
76
|
+
if (source._currentIndex >= source._endIndex ||
|
|
77
|
+
source._string[source._currentIndex] < "0" ||
|
|
78
|
+
source._string[source._currentIndex] > "9") {
|
|
79
|
+
throw new Error('There must be an exponent.');
|
|
80
|
+
}
|
|
81
|
+
while (source._currentIndex < source._endIndex &&
|
|
82
|
+
source._string[source._currentIndex] >= "0" &&
|
|
83
|
+
source._string[source._currentIndex] <= "9") {
|
|
84
|
+
exponent *= 10;
|
|
85
|
+
exponent += (Number(source._string[source._currentIndex]));
|
|
86
|
+
source._currentIndex += 1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
let number = integer + decimal;
|
|
90
|
+
number *= sign;
|
|
91
|
+
if (exponent) {
|
|
92
|
+
number *= Math.pow(10, expsign * exponent);
|
|
93
|
+
}
|
|
94
|
+
if (startIndex === source._currentIndex) {
|
|
95
|
+
throw new Error('Internal error: startIndex === source._currentIndex');
|
|
96
|
+
}
|
|
97
|
+
source._skipOptionalSpacesOrDelimiter();
|
|
98
|
+
return number;
|
|
99
|
+
}
|
|
100
|
+
export { parseNumber };
|
|
101
|
+
//# sourceMappingURL=parse-number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-number.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/parse-number.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Source } from './source.js';
|
|
2
|
+
/**
|
|
3
|
+
* @hidden
|
|
4
|
+
* @param string
|
|
5
|
+
*/
|
|
6
|
+
function parsePathDataString(string) {
|
|
7
|
+
if (!string.length) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
const source = new Source(string);
|
|
11
|
+
const pathData = [];
|
|
12
|
+
if (!source.initialCommandIsMoveTo()) {
|
|
13
|
+
throw new Error('Path must start with m or M');
|
|
14
|
+
}
|
|
15
|
+
while (source.hasMoreData()) {
|
|
16
|
+
pathData.push(source.parseSegment());
|
|
17
|
+
}
|
|
18
|
+
return pathData;
|
|
19
|
+
}
|
|
20
|
+
export { parsePathDataString };
|
|
21
|
+
//# sourceMappingURL=parse-path-data-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-path-data-string.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/parse-path-data-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC;;;GAGG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAElC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAGD,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { parseNumber } from './parse-number.js';
|
|
2
|
+
/** @hidden */
|
|
3
|
+
const COMMAND_MAP = {
|
|
4
|
+
Z: "Z", M: "M", L: "L", C: "C", Q: "Q", A: "A", H: "H", V: "V", S: "S", T: "T",
|
|
5
|
+
z: "Z", m: "m", l: "l", c: "c", q: "q", a: "a", h: "h", v: "v", s: "s", t: "t"
|
|
6
|
+
};
|
|
7
|
+
/** @hidden */
|
|
8
|
+
class Source {
|
|
9
|
+
_string;
|
|
10
|
+
_currentIndex;
|
|
11
|
+
_endIndex;
|
|
12
|
+
_prevCommand;
|
|
13
|
+
constructor(string) {
|
|
14
|
+
this._string = string;
|
|
15
|
+
this._currentIndex = 0;
|
|
16
|
+
this._endIndex = this._string.length;
|
|
17
|
+
this._prevCommand = undefined;
|
|
18
|
+
this._skipOptionalSpaces();
|
|
19
|
+
}
|
|
20
|
+
parseSegment() {
|
|
21
|
+
const char = this._string[this._currentIndex];
|
|
22
|
+
let command = COMMAND_MAP[char];
|
|
23
|
+
if (command === undefined) {
|
|
24
|
+
if (this._prevCommand === undefined) {
|
|
25
|
+
throw new Error('Implicit command not allowed for first commands.');
|
|
26
|
+
}
|
|
27
|
+
// Check for remaining coordinates in the current command.
|
|
28
|
+
if ((char === "+" || char === "-" || char === "." || (char >= "0" && char <= "9")) &&
|
|
29
|
+
this._prevCommand !== "Z") {
|
|
30
|
+
if (this._prevCommand === "M") {
|
|
31
|
+
command = "L";
|
|
32
|
+
}
|
|
33
|
+
else if (this._prevCommand === "m") {
|
|
34
|
+
command = "l";
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
command = this._prevCommand;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw new Error('Remaining coordinates not found for implicit command');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this._currentIndex += 1;
|
|
46
|
+
}
|
|
47
|
+
this._prevCommand = command;
|
|
48
|
+
let values = undefined;
|
|
49
|
+
const cmd = command.toUpperCase();
|
|
50
|
+
if (cmd === "H" || cmd === "V") {
|
|
51
|
+
values = [parseNumber(this)];
|
|
52
|
+
}
|
|
53
|
+
else if (cmd === "M" || cmd === "L" || cmd === "T") {
|
|
54
|
+
values = [parseNumber(this), parseNumber(this)];
|
|
55
|
+
}
|
|
56
|
+
else if (cmd === "S" || cmd === "Q") {
|
|
57
|
+
values = [parseNumber(this), parseNumber(this), parseNumber(this), parseNumber(this)];
|
|
58
|
+
}
|
|
59
|
+
else if (cmd === "C") {
|
|
60
|
+
values = [
|
|
61
|
+
parseNumber(this),
|
|
62
|
+
parseNumber(this),
|
|
63
|
+
parseNumber(this),
|
|
64
|
+
parseNumber(this),
|
|
65
|
+
parseNumber(this),
|
|
66
|
+
parseNumber(this)
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
else if (cmd === "A") {
|
|
70
|
+
values = [
|
|
71
|
+
parseNumber(this),
|
|
72
|
+
parseNumber(this),
|
|
73
|
+
parseNumber(this),
|
|
74
|
+
this._parseArcFlag(),
|
|
75
|
+
this._parseArcFlag(),
|
|
76
|
+
parseNumber(this),
|
|
77
|
+
parseNumber(this)
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
else if (cmd === "Z") {
|
|
81
|
+
this._skipOptionalSpaces();
|
|
82
|
+
values = [];
|
|
83
|
+
}
|
|
84
|
+
if (values === undefined) {
|
|
85
|
+
throw new Error('Unknown command');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return { type: command, values };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
hasMoreData() {
|
|
92
|
+
return this._currentIndex < this._endIndex;
|
|
93
|
+
}
|
|
94
|
+
initialCommandIsMoveTo() {
|
|
95
|
+
// If the path is empty it is still valid, so return true.
|
|
96
|
+
if (!this.hasMoreData()) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
const command = COMMAND_MAP[this._string[this._currentIndex]];
|
|
100
|
+
return command === "M" || command === "m";
|
|
101
|
+
}
|
|
102
|
+
_isCurrentSpace() {
|
|
103
|
+
const char = this._string[this._currentIndex];
|
|
104
|
+
return char <= " " && (char === " " || char === "\n" || char === "\t" || char === "\r" || char === "\f");
|
|
105
|
+
}
|
|
106
|
+
_skipOptionalSpaces() {
|
|
107
|
+
while (this._currentIndex < this._endIndex && this._isCurrentSpace()) {
|
|
108
|
+
this._currentIndex += 1;
|
|
109
|
+
}
|
|
110
|
+
return this._currentIndex < this._endIndex;
|
|
111
|
+
}
|
|
112
|
+
_skipOptionalSpacesOrDelimiter() {
|
|
113
|
+
if (this._currentIndex < this._endIndex &&
|
|
114
|
+
!this._isCurrentSpace() &&
|
|
115
|
+
this._string[this._currentIndex] !== ",") {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (this._skipOptionalSpaces()) {
|
|
119
|
+
if (this._currentIndex < this._endIndex && this._string[this._currentIndex] === ",") {
|
|
120
|
+
this._currentIndex += 1;
|
|
121
|
+
this._skipOptionalSpaces();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return this._currentIndex < this._endIndex;
|
|
125
|
+
}
|
|
126
|
+
_parseArcFlag() {
|
|
127
|
+
if (this._currentIndex >= this._endIndex) {
|
|
128
|
+
throw new Error('Unable to parse arc flag');
|
|
129
|
+
}
|
|
130
|
+
let flag = undefined;
|
|
131
|
+
const flagChar = this._string[this._currentIndex];
|
|
132
|
+
this._currentIndex += 1;
|
|
133
|
+
if (flagChar === "0") {
|
|
134
|
+
flag = 0;
|
|
135
|
+
}
|
|
136
|
+
else if (flagChar === "1") {
|
|
137
|
+
flag = 1;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
throw new Error('Unable to parse arc flag - arc flag must be 0 or 1');
|
|
141
|
+
}
|
|
142
|
+
this._skipOptionalSpacesOrDelimiter();
|
|
143
|
+
return flag;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
export { Source };
|
|
147
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hidden
|
|
3
|
+
* C and c: (from www.w3.org)
|
|
4
|
+
*
|
|
5
|
+
* params: x1 y1 x2 y2 x y
|
|
6
|
+
*
|
|
7
|
+
* Draws a cubic Bézier curve from the current point to (x,y)
|
|
8
|
+
* using (x1,y1) as the control point at the beginning of the
|
|
9
|
+
* curve and (x2,y2) as the control point at the end of the
|
|
10
|
+
* curve. C (uppercase) indicates that absolute coordinates
|
|
11
|
+
* will follow; c (lowercase) indicates that relative
|
|
12
|
+
* coordinates will follow. Multiple sets of coordinates may
|
|
13
|
+
* be specified to draw a polybézier. At the end of the
|
|
14
|
+
* command, the new current point becomes the final (x,y)
|
|
15
|
+
* coordinate pair used in the polybézier.
|
|
16
|
+
*/
|
|
17
|
+
function c(s) {
|
|
18
|
+
const ps = [
|
|
19
|
+
s.p,
|
|
20
|
+
[s.vals[0], s.vals[1]],
|
|
21
|
+
[s.vals[2], s.vals[3]],
|
|
22
|
+
[s.vals[4], s.vals[5]]
|
|
23
|
+
];
|
|
24
|
+
s.prev2ndCubicControlPoint = ps[2];
|
|
25
|
+
s.prev2ndQuadraticControlPoint = undefined;
|
|
26
|
+
return ps;
|
|
27
|
+
}
|
|
28
|
+
export { c };
|
|
29
|
+
//# sourceMappingURL=c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c.js","sourceRoot":"","sources":["../../../src/svg/path-segment/c.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,SAAS,CAAC,CAAC,CAAY;IACnB,MAAM,EAAE,GAAG;QACP,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAC;IACF,CAAC,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,4BAA4B,GAAG,SAAS,CAAC;IAE3C,OAAO,EAAE,CAAC;AACd,CAAC;AAGD,OAAO,EAAE,CAAC,EAAE,CAAA"}
|