@flighthq/path-boolean 0.5.1-next.3302.76ece6b → 0.5.1-next.4304.322dc96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/.tsbuildinfo.contract +1 -0
- package/dist/.tsbuildinfo.runtime +1 -0
- package/dist/booleanPaths.d.ts +33 -6
- package/dist/booleanPaths.d.ts.map +1 -1
- package/dist/booleanPaths.js +42 -3
- package/dist/booleanPaths.js.map +1 -1
- package/dist/contract.d.ts +12 -8
- package/dist/contract.d.ts.map +1 -1
- package/dist/contract.js +11 -8
- package/dist/contract.js.map +1 -1
- package/dist/contract.path-boolean-types.d.ts +4 -0
- package/dist/contract.path-boolean-types.d.ts.map +1 -0
- package/dist/contract.path-boolean-types.js +2 -0
- package/dist/contract.path-boolean-types.js.map +1 -0
- package/dist/explainPathBoolean.d.ts +15 -3
- package/dist/explainPathBoolean.d.ts.map +1 -1
- package/dist/explainPathBoolean.js +35 -9
- package/dist/explainPathBoolean.js.map +1 -1
- package/dist/index.d.ts +3 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -8
- package/dist/index.js.map +1 -1
- package/dist/martinezKernel.d.ts +44 -4
- package/dist/martinezKernel.d.ts.map +1 -1
- package/dist/martinezKernel.js +777 -559
- package/dist/martinezKernel.js.map +1 -1
- package/dist/offsetPath.d.ts +15 -2
- package/dist/offsetPath.d.ts.map +1 -1
- package/dist/offsetPath.js +205 -215
- package/dist/offsetPath.js.map +1 -1
- package/dist/pathBoolean.d.ts +53 -0
- package/dist/pathBoolean.d.ts.map +1 -0
- package/dist/pathBoolean.js +115 -0
- package/dist/pathBoolean.js.map +1 -0
- package/dist/pathBooleanCompat.d.ts +3 -0
- package/dist/pathBooleanCompat.d.ts.map +1 -0
- package/dist/pathBooleanCompat.js +2 -0
- package/dist/pathBooleanCompat.js.map +1 -0
- package/dist/resolvePathRegions.d.ts +8 -2
- package/dist/resolvePathRegions.d.ts.map +1 -1
- package/dist/resolvePathRegions.js +11 -3
- package/dist/resolvePathRegions.js.map +1 -1
- package/dist/simplifyPath.d.ts +9 -2
- package/dist/simplifyPath.d.ts.map +1 -1
- package/dist/simplifyPath.js +12 -2
- package/dist/simplifyPath.js.map +1 -1
- package/dist/unionAllPaths.d.ts +9 -2
- package/dist/unionAllPaths.d.ts.map +1 -1
- package/dist/unionAllPaths.js +23 -8
- package/dist/unionAllPaths.js.map +1 -1
- package/dist/writePathBooleanContours.d.ts +8 -2
- package/dist/writePathBooleanContours.d.ts.map +1 -1
- package/dist/writePathBooleanContours.js +16 -4
- package/dist/writePathBooleanContours.js.map +1 -1
- package/package.json +5 -4
- package/src/booleanPaths.test.ts +237 -114
- package/src/explainPathBoolean.test.ts +35 -21
- package/src/fuzzInvariants.test.ts +241 -154
- package/src/martinezKernel.test.ts +334 -328
- package/src/offsetPath.test.ts +296 -166
- package/src/pathBoolean.test.ts +95 -0
- package/src/resolvePathRegions.test.ts +41 -30
- package/src/simplifyPath.test.ts +143 -112
- package/src/unionAllPaths.test.ts +93 -61
- package/src/writePathBooleanContours.test.ts +44 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"booleanPaths.d.ts","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"booleanPaths.d.ts","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAK3D;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,EACvB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,SAAS,EAAE,oBAAoB,EAC/B,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAON;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED;;;GAGG;AACH,iBAAS,gCAAgC,CAAC,OAAO,EAAE,WAAW,GAAG,mBAAmB,CAUnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,IAAI,EACT,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EACjB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,IAAI,CAEN;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
package/dist/booleanPaths.js
CHANGED
|
@@ -1,22 +1,61 @@
|
|
|
1
|
+
// Generated from crates/flight-path-boolean/src/boolean_paths.rs by flight-compiler.
|
|
2
|
+
// Rust is authoritative; run `npm run generate` after changing it.
|
|
1
3
|
import { flattenPath } from '@flighthq/path/contract';
|
|
2
4
|
import { writePathBooleanContours } from "./writePathBooleanContours.js";
|
|
5
|
+
const DEFAULT_FLATTEN_TOLERANCE = 0.25;
|
|
6
|
+
/**
|
|
7
|
+
* Generic boolean operation on two paths. Flattens both operands to polygon
|
|
8
|
+
* contours, dispatches through the kernel, and writes the result into `out`.
|
|
9
|
+
* Alias-safe: the subject and clip are fully captured (flattened) before any
|
|
10
|
+
* write to `out`, so `out` may alias either input.
|
|
11
|
+
*/
|
|
3
12
|
export function booleanPaths(out, pathBooleanKernel, subject, clip, operation, options) {
|
|
4
|
-
const fillRule = options?.fillRule ?? 'nonZero';
|
|
5
|
-
const
|
|
6
|
-
const
|
|
13
|
+
const fillRule = getPathBooleanFillRuleForWinding(options?.fillRule ?? 'nonZero');
|
|
14
|
+
const tolerance = options?.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;
|
|
15
|
+
const subjectContours = flattenPath(subject, tolerance);
|
|
16
|
+
const clipContours = flattenPath(clip, tolerance);
|
|
7
17
|
const result = pathBooleanKernel.computePathBoolean(subjectContours, clipContours, operation, fillRule);
|
|
8
18
|
writePathBooleanContours(out, result);
|
|
9
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Computes the set difference (subject minus clip) and writes the result into `out`.
|
|
22
|
+
*/
|
|
10
23
|
export function differencePaths(out, pathBooleanKernel, a, b, options) {
|
|
11
24
|
booleanPaths(out, pathBooleanKernel, a, b, 'difference', options);
|
|
12
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The kernel fill rule for a public `PathWinding` option (TS passes the winding string straight
|
|
28
|
+
* through, since `PathBooleanFillRule` includes `PathWinding`).
|
|
29
|
+
*/
|
|
30
|
+
function getPathBooleanFillRuleForWinding(winding) {
|
|
31
|
+
return (() => {
|
|
32
|
+
const matchValue = winding;
|
|
33
|
+
switch (matchValue) {
|
|
34
|
+
case 'evenOdd':
|
|
35
|
+
return 'evenOdd';
|
|
36
|
+
case 'nonZero':
|
|
37
|
+
return 'nonZero';
|
|
38
|
+
}
|
|
39
|
+
})();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Computes the intersection of subject and clip and writes the result into `out`.
|
|
43
|
+
*/
|
|
13
44
|
export function intersectPaths(out, pathBooleanKernel, a, b, options) {
|
|
14
45
|
booleanPaths(out, pathBooleanKernel, a, b, 'intersection', options);
|
|
15
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Computes the union of subject and clip and writes the result into `out`.
|
|
49
|
+
*/
|
|
16
50
|
export function unionPaths(out, pathBooleanKernel, a, b, options) {
|
|
17
51
|
booleanPaths(out, pathBooleanKernel, a, b, 'union', options);
|
|
18
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Computes the symmetric difference (XOR) of subject and clip and writes the
|
|
55
|
+
* result into `out`.
|
|
56
|
+
*/
|
|
19
57
|
export function xorPaths(out, pathBooleanKernel, a, b, options) {
|
|
20
58
|
booleanPaths(out, pathBooleanKernel, a, b, 'xor', options);
|
|
21
59
|
}
|
|
60
|
+
export { getPathBooleanFillRuleForWinding };
|
|
22
61
|
//# sourceMappingURL=booleanPaths.js.map
|
package/dist/booleanPaths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"booleanPaths.js","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"booleanPaths.js","sourceRoot":"","sources":["../src/booleanPaths.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,mEAAmE;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,yBAAyB,GAAW,IAAI,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,GAAS,EACT,iBAAiD,EACjD,OAAuB,EACvB,IAAoB,EACpB,SAA+B,EAC/B,OAAsC;IAEtC,MAAM,QAAQ,GAAG,gCAAgC,CAAC,OAAO,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAC;IAClE,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACxG,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAS,EACT,iBAAiD,EACjD,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,SAAS,gCAAgC,CAAC,OAAoB;IAC5D,OAAO,CAAC,GAAG,EAAE;QACX,MAAM,UAAU,GAAG,OAAO,CAAC;QAC3B,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC;YACnB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAS,EACT,iBAAiD,EACjD,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,GAAS,EACT,iBAAiD,EACjD,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,GAAS,EACT,iBAAiD,EACjD,CAAiB,EACjB,CAAiB,EACjB,OAAsC;IAEtC,YAAY,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,OAAO,EAAE,gCAAgC,EAAE,CAAC"}
|
package/dist/contract.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
1
|
+
export { booleanPaths, differencePaths, intersectPaths, unionPaths, xorPaths } from './booleanPaths.ts';
|
|
2
|
+
export { explainOffsetPath, explainSimplifyPath } from './explainPathBoolean.ts';
|
|
3
|
+
export { createMartinezPathBooleanKernel, getPathBooleanFillRuleString, getPathBooleanOperationString, initializeMartinezPathBooleanKernel, martinezPathBooleanKernel, parsePathBooleanFillRule, parsePathBooleanOperation, } from './martinezKernel.ts';
|
|
4
|
+
export type { ComputePathBooleanFunction, PathBooleanContour, PathBooleanFillRule, PathBooleanKernelRaw, PathBooleanOperation, } from './martinezKernel.ts';
|
|
5
|
+
export { offsetPath } from './offsetPath.ts';
|
|
6
|
+
export { getPathBooleanExplanationOperationString, getPathBooleanExplanationReasonString, getPathOffsetEndString, getPathOffsetJoinString, parsePathBooleanExplanationOperation, parsePathBooleanExplanationReason, parsePathOffsetEnd, parsePathOffsetJoin, } from './pathBoolean.ts';
|
|
7
|
+
export type { PathBooleanExplanation, PathBooleanExplanationOperation, PathBooleanExplanationReason, PathBooleanOptions, PathOffsetEnd, PathOffsetJoin, PathOffsetOptions, } from './pathBoolean.ts';
|
|
8
|
+
export type { PathBooleanKernel } from './pathBooleanCompat.ts';
|
|
9
|
+
export { resolvePathRegions } from './resolvePathRegions.ts';
|
|
10
|
+
export { simplifyPath } from './simplifyPath.ts';
|
|
11
|
+
export { unionAllPaths } from './unionAllPaths.ts';
|
|
12
|
+
export { writePathBooleanContours } from './writePathBooleanContours.ts';
|
|
9
13
|
//# sourceMappingURL=contract.d.ts.map
|
package/dist/contract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,mCAAmC,EACnC,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,wCAAwC,EACxC,qCAAqC,EACrC,sBAAsB,EACtB,uBAAuB,EACvB,oCAAoC,EACpC,iCAAiC,EACjC,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,sBAAsB,EACtB,+BAA+B,EAC/B,4BAA4B,EAC5B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/contract.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
1
|
+
// Generated from crates/flight-path-boolean/src/lib.rs by flight-compiler.
|
|
2
|
+
// Rust is authoritative; run `npm run generate` after changing it.
|
|
3
|
+
export { booleanPaths, differencePaths, intersectPaths, unionPaths, xorPaths } from "./booleanPaths.js";
|
|
4
|
+
export { explainOffsetPath, explainSimplifyPath } from "./explainPathBoolean.js";
|
|
5
|
+
export { createMartinezPathBooleanKernel, getPathBooleanFillRuleString, getPathBooleanOperationString, initializeMartinezPathBooleanKernel, martinezPathBooleanKernel, parsePathBooleanFillRule, parsePathBooleanOperation, } from "./martinezKernel.js";
|
|
6
|
+
export { offsetPath } from "./offsetPath.js";
|
|
7
|
+
export { getPathBooleanExplanationOperationString, getPathBooleanExplanationReasonString, getPathOffsetEndString, getPathOffsetJoinString, parsePathBooleanExplanationOperation, parsePathBooleanExplanationReason, parsePathOffsetEnd, parsePathOffsetJoin, } from "./pathBoolean.js";
|
|
8
|
+
export { resolvePathRegions } from "./resolvePathRegions.js";
|
|
9
|
+
export { simplifyPath } from "./simplifyPath.js";
|
|
10
|
+
export { unionAllPaths } from "./unionAllPaths.js";
|
|
11
|
+
export { writePathBooleanContours } from "./writePathBooleanContours.js";
|
|
9
12
|
//# sourceMappingURL=contract.js.map
|
package/dist/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,mEAAmE;AAEnE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EACL,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,mCAAmC,EACnC,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAQ7B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,wCAAwC,EACxC,qCAAqC,EACrC,sBAAsB,EACtB,uBAAuB,EACvB,oCAAoC,EACpC,iCAAiC,EACjC,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { ComputePathBooleanFunction, PathBooleanContour, PathBooleanFillRule, PathBooleanKernelRaw, PathBooleanOperation, } from './martinezKernel.ts';
|
|
2
|
+
export type { PathBooleanExplanation, PathBooleanExplanationOperation, PathBooleanExplanationReason, PathBooleanOptions, PathOffsetEnd, PathOffsetJoin, PathOffsetOptions, } from './pathBoolean.ts';
|
|
3
|
+
export type { PathBooleanKernel } from './pathBooleanCompat.ts';
|
|
4
|
+
//# sourceMappingURL=contract.path-boolean-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.path-boolean-types.d.ts","sourceRoot":"","sources":["../src/contract.path-boolean-types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,sBAAsB,EACtB,+BAA+B,EAC/B,4BAA4B,EAC5B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.path-boolean-types.js","sourceRoot":"","sources":["../src/contract.path-boolean-types.ts"],"names":[],"mappings":""}
|
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import type { Path } from '@flighthq/path/contract';
|
|
2
|
+
import type { PathBooleanKernelRaw } from './martinezKernel.ts';
|
|
3
|
+
import type { PathBooleanExplanation, PathBooleanOptions, PathOffsetOptions } from './pathBoolean.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Checks whether `offsetPath` would produce a meaningful result for the given
|
|
6
|
+
* path and delta. Returns `Some(explanation)` when the result is degenerate or
|
|
7
|
+
* empty, `undefined` when the offset succeeds normally.
|
|
8
|
+
*/
|
|
9
|
+
export declare function explainOffsetPath(pathBooleanKernel: Readonly<PathBooleanKernelRaw>, path: Readonly<Path>, delta: number, options?: Readonly<PathOffsetOptions>): PathBooleanExplanation | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Checks whether `simplifyPath` would produce a meaningful result for the
|
|
12
|
+
* given path. Returns `Some(explanation)` when the result is degenerate or
|
|
13
|
+
* empty, `undefined` when simplification succeeds normally.
|
|
14
|
+
*/
|
|
15
|
+
export declare function explainSimplifyPath(pathBooleanKernel: Readonly<PathBooleanKernelRaw>, path: Readonly<Path>, options?: Readonly<PathBooleanOptions>): PathBooleanExplanation | undefined;
|
|
4
16
|
//# sourceMappingURL=explainPathBoolean.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explainPathBoolean.d.ts","sourceRoot":"","sources":["../src/explainPathBoolean.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"explainPathBoolean.d.ts","sourceRoot":"","sources":["../src/explainPathBoolean.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAKtG;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GACpC,sBAAsB,GAAG,SAAS,CAepC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACjD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EACpB,OAAO,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACrC,sBAAsB,GAAG,SAAS,CAYpC"}
|
|
@@ -1,20 +1,46 @@
|
|
|
1
|
+
// Generated from crates/flight-path-boolean/src/explain_path_boolean.rs by flight-compiler.
|
|
2
|
+
// Rust is authoritative; run `npm run generate` after changing it.
|
|
1
3
|
import { createPath, flattenPath } from '@flighthq/path/contract';
|
|
2
4
|
import { offsetPath } from "./offsetPath.js";
|
|
3
5
|
import { simplifyPath } from "./simplifyPath.js";
|
|
6
|
+
const DEFAULT_FLATTEN_TOLERANCE = 0.25;
|
|
7
|
+
/**
|
|
8
|
+
* Checks whether `offsetPath` would produce a meaningful result for the given
|
|
9
|
+
* path and delta. Returns `Some(explanation)` when the result is degenerate or
|
|
10
|
+
* empty, `undefined` when the offset succeeds normally.
|
|
11
|
+
*/
|
|
4
12
|
export function explainOffsetPath(pathBooleanKernel, path, delta, options) {
|
|
5
|
-
if (!Number.isFinite(delta))
|
|
13
|
+
if (!Number.isFinite(delta)) {
|
|
6
14
|
return { operation: 'offset', reason: 'non-finite-delta' };
|
|
7
|
-
|
|
15
|
+
}
|
|
16
|
+
const tolerance = options?.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;
|
|
17
|
+
const contours = flattenPath(path, tolerance);
|
|
18
|
+
if (contours.length === 0) {
|
|
8
19
|
return { operation: 'offset', reason: 'empty-input' };
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
20
|
+
}
|
|
21
|
+
let result = createPath('nonZero');
|
|
22
|
+
offsetPath(result, pathBooleanKernel, path, delta, options);
|
|
23
|
+
if (result.commands.length === 0) {
|
|
24
|
+
return { operation: 'offset', reason: 'collapsed-or-degenerate' };
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
12
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Checks whether `simplifyPath` would produce a meaningful result for the
|
|
30
|
+
* given path. Returns `Some(explanation)` when the result is degenerate or
|
|
31
|
+
* empty, `undefined` when simplification succeeds normally.
|
|
32
|
+
*/
|
|
13
33
|
export function explainSimplifyPath(pathBooleanKernel, path, options) {
|
|
14
|
-
|
|
34
|
+
const tolerance = options?.tolerance ?? DEFAULT_FLATTEN_TOLERANCE;
|
|
35
|
+
const contours = flattenPath(path, tolerance);
|
|
36
|
+
if (contours.length === 0) {
|
|
15
37
|
return { operation: 'simplify', reason: 'empty-input' };
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
38
|
+
}
|
|
39
|
+
let result = createPath('nonZero');
|
|
40
|
+
simplifyPath(result, pathBooleanKernel, path, options);
|
|
41
|
+
if (result.commands.length === 0) {
|
|
42
|
+
return { operation: 'simplify', reason: 'collapsed-or-degenerate' };
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
19
45
|
}
|
|
20
46
|
//# sourceMappingURL=explainPathBoolean.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explainPathBoolean.js","sourceRoot":"","sources":["../src/explainPathBoolean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"explainPathBoolean.js","sourceRoot":"","sources":["../src/explainPathBoolean.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,mEAAmE;AAEnE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAIlE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,yBAAyB,GAAW,IAAI,CAAC;AAE/C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,iBAAiD,EACjD,IAAoB,EACpB,KAAa,EACb,OAAqC;IAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7D,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAC;IAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACnC,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,iBAAiD,EACjD,IAAoB,EACpB,OAAsC;IAEtC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,yBAAyB,CAAC;IAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACnC,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
4
|
-
export * from './offsetPath.ts';
|
|
5
|
-
export * from './resolvePathRegions.ts';
|
|
6
|
-
export * from './simplifyPath.ts';
|
|
7
|
-
export * from './unionAllPaths.ts';
|
|
8
|
-
export * from './writePathBooleanContours.ts';
|
|
1
|
+
export { booleanPaths, createMartinezPathBooleanKernel, differencePaths, explainOffsetPath, explainSimplifyPath, getPathBooleanExplanationOperationString, getPathBooleanExplanationReasonString, getPathBooleanFillRuleString, getPathBooleanOperationString, getPathOffsetEndString, getPathOffsetJoinString, intersectPaths, martinezPathBooleanKernel, offsetPath, parsePathBooleanExplanationOperation, parsePathBooleanExplanationReason, parsePathBooleanFillRule, parsePathBooleanOperation, parsePathOffsetEnd, parsePathOffsetJoin, resolvePathRegions, simplifyPath, unionAllPaths, unionPaths, writePathBooleanContours, xorPaths, } from './contract.ts';
|
|
2
|
+
export type { ComputePathBooleanFunction, PathBooleanContour, PathBooleanExplanation, PathBooleanExplanationOperation, PathBooleanExplanationReason, PathBooleanFillRule, PathBooleanOperation, PathBooleanOptions, PathOffsetEnd, PathOffsetJoin, PathOffsetOptions, } from './contract.ts';
|
|
3
|
+
export type { PathBooleanKernel } from './pathBooleanCompat.ts';
|
|
9
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,+BAA+B,EAC/B,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,wCAAwC,EACxC,qCAAqC,EACrC,4BAA4B,EAC5B,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,yBAAyB,EACzB,UAAU,EACV,oCAAoC,EACpC,iCAAiC,EACjC,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,QAAQ,GACT,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,sBAAsB,EACtB,+BAA+B,EAC/B,4BAA4B,EAC5B,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export { createMartinezPathBooleanKernel, martinezPathBooleanKernel } from "./
|
|
4
|
-
export * from "./offsetPath.js";
|
|
5
|
-
export * from "./resolvePathRegions.js";
|
|
6
|
-
export * from "./simplifyPath.js";
|
|
7
|
-
export * from "./unionAllPaths.js";
|
|
8
|
-
export * from "./writePathBooleanContours.js";
|
|
1
|
+
// Generated from crates/flight-path-boolean/src/lib.rs by flight-compiler.
|
|
2
|
+
// Rust is authoritative; run `npm run generate` after changing it.
|
|
3
|
+
export { booleanPaths, createMartinezPathBooleanKernel, differencePaths, explainOffsetPath, explainSimplifyPath, getPathBooleanExplanationOperationString, getPathBooleanExplanationReasonString, getPathBooleanFillRuleString, getPathBooleanOperationString, getPathOffsetEndString, getPathOffsetJoinString, intersectPaths, martinezPathBooleanKernel, offsetPath, parsePathBooleanExplanationOperation, parsePathBooleanExplanationReason, parsePathBooleanFillRule, parsePathBooleanOperation, parsePathOffsetEnd, parsePathOffsetJoin, resolvePathRegions, simplifyPath, unionAllPaths, unionPaths, writePathBooleanContours, xorPaths, } from "./contract.js";
|
|
9
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,mEAAmE;AAEnE,OAAO,EACL,YAAY,EACZ,+BAA+B,EAC/B,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,wCAAwC,EACxC,qCAAqC,EACrC,4BAA4B,EAC5B,6BAA6B,EAC7B,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,yBAAyB,EACzB,UAAU,EACV,oCAAoC,EACpC,iCAAiC,EACjC,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,QAAQ,GACT,MAAM,eAAe,CAAC"}
|
package/dist/martinezKernel.d.ts
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import type { EntityRaw } from '@flighthq/entity/contract';
|
|
2
|
+
/**
|
|
3
|
+
* The boolean set operation to perform on two path operands.
|
|
4
|
+
*/
|
|
5
|
+
export type PathBooleanOperation = 'difference' | 'intersection' | 'union' | 'xor';
|
|
6
|
+
/**
|
|
7
|
+
* Fill rule for resolving winding numbers into filled/unfilled regions. Extends
|
|
8
|
+
* PathWinding with positive and negative rules used internally by the offset
|
|
9
|
+
* cleanup pass.
|
|
10
|
+
*/
|
|
11
|
+
export type PathBooleanFillRule = 'evenOdd' | 'nonZero' | 'positive' | 'negative';
|
|
12
|
+
/**
|
|
13
|
+
* A flat array of interleaved `[x, y, x, y, ...]` coordinates representing one
|
|
14
|
+
* polygon contour for boolean operations.
|
|
15
|
+
*/
|
|
16
|
+
export type PathBooleanContour = number[];
|
|
17
|
+
/**
|
|
18
|
+
* The strategy a `PathBooleanKernel` carries (TS `computePathBoolean`): the combined contour set of
|
|
19
|
+
* two operands under an operation and fill rule. A stateless function value (D9d).
|
|
20
|
+
*/
|
|
21
|
+
export type ComputePathBooleanFunction = (arg0: Readonly<PathBooleanContour[]>, arg1: Readonly<PathBooleanContour[]>, arg2: PathBooleanOperation, arg3: PathBooleanFillRule) => PathBooleanContour[];
|
|
22
|
+
/**
|
|
23
|
+
* The boolean kernel (TS `PathBooleanKernel extends Entity`): a strategy entity whose
|
|
24
|
+
* `computePathBoolean` computes the combined contour set of two operands. Callers may supply any
|
|
25
|
+
* kernel; the Martinez kernel is the stock one.
|
|
26
|
+
*/
|
|
27
|
+
export interface PathBooleanKernelRaw extends EntityRaw {
|
|
28
|
+
computePathBoolean: ComputePathBooleanFunction;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The kernel the boolean operations use unless the caller passes another one. A stateless value, so
|
|
32
|
+
* it is one shared instance rather than a per-call construction (TS `martinezPathBooleanKernel`;
|
|
33
|
+
* entity-valued singleton as `LazyLock`, D12).
|
|
34
|
+
*/
|
|
35
|
+
export declare const martinezPathBooleanKernel: PathBooleanKernelRaw;
|
|
36
|
+
export declare function createMartinezPathBooleanKernel(): PathBooleanKernelRaw;
|
|
37
|
+
export declare function getPathBooleanFillRuleString(value: PathBooleanFillRule): string;
|
|
38
|
+
export declare function getPathBooleanOperationString(value: PathBooleanOperation): string;
|
|
39
|
+
/**
|
|
40
|
+
* The construction initializer of `createMartinezPathBooleanKernel`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function initializeMartinezPathBooleanKernel(out: PathBooleanKernelRaw): void;
|
|
43
|
+
export declare function parsePathBooleanFillRule(value: string): PathBooleanFillRule | undefined;
|
|
44
|
+
export declare function parsePathBooleanOperation(value: string): PathBooleanOperation | undefined;
|
|
5
45
|
//# sourceMappingURL=martinezKernel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"martinezKernel.d.ts","sourceRoot":"","sources":["../src/martinezKernel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"martinezKernel.d.ts","sourceRoot":"","sources":["../src/martinezKernel.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,cAAc,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAElF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EACpC,IAAI,EAAE,QAAQ,CAAC,kBAAkB,EAAE,CAAC,EACpC,IAAI,EAAE,oBAAoB,EAC1B,IAAI,EAAE,mBAAmB,KACtB,kBAAkB,EAAE,CAAC;AAE1B;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,SAAS;IACrD,kBAAkB,EAAE,0BAA0B,CAAC;CAChD;AAiFD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,oBAAwD,CAAC;AAQjG,wBAAgB,+BAA+B,IAAI,oBAAoB,CAItE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAc/E;AAgiBD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAcjF;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAEnF;AAqGD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAgBvF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAgBzF"}
|