@snaptrude/plugin-core 0.9.4 → 0.9.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @snaptrude/plugin-core
2
2
 
3
+ ## 0.9.6
4
+
5
+ ### Patch Changes
6
+
7
+ - Add five APIs the plugin agent repeatedly reached for but that did not exist.
8
+ - `core.project.getInfo()` — project id, display name, unit type, storey count (scoped to the active building), active storey, and site location in one call. Closes a genuine capability gap: nothing previously returned the current project's identity.
9
+ - `core.storeys.getActive()` — `setActive` had no getter, unlike `core.buildings`, `core.layers` and `core.proposals`.
10
+ - `core.camera.getMode()` — `setMode` had no getter, while `getProjection`/`setProjection` on the same class were paired.
11
+ - `design.visibility.show(components)` — `hide` previously had only `showAll` as its inverse, so specific components could not be revealed.
12
+ - `design.furniture.listCatalogGroups()` — matches `design.doors` and `design.windows`, so all three catalog surfaces are named alike. `design.furniture.listCategories()` is deprecated but still supported.
13
+
3
14
  ## 0.9.4
4
15
 
5
16
  ### Patch Changes
package/api-manifest.json CHANGED
@@ -483,6 +483,17 @@
483
483
  "argsType": "string",
484
484
  "resultType": "PluginCoreBuildingsUpdateResult"
485
485
  },
486
+ {
487
+ "path": "core.camera.getMode",
488
+ "namespace": "core.camera",
489
+ "summary": "Get the current camera mode. Paired with {@linkcode PluginCameraApi.setMode}.",
490
+ "examplePrompts": [
491
+ "Am I in 2D or 3D?",
492
+ "What view mode is the editor in?\n\n# Example\n```ts\nif ((await snaptrude.core.camera.getMode()) === \"2d\") {\nawait snaptrude.core.camera.setMode(\"3d\")\n}\n```"
493
+ ],
494
+ "argsType": null,
495
+ "resultType": "PluginCameraMode"
496
+ },
486
497
  {
487
498
  "path": "core.camera.getProjection",
488
499
  "namespace": "core.camera",
@@ -2907,6 +2918,19 @@
2907
2918
  "argsType": "number",
2908
2919
  "resultType": "void"
2909
2920
  },
2921
+ {
2922
+ "path": "core.io.underlay.classifyArcs",
2923
+ "namespace": "core.io.underlay",
2924
+ "summary": "Classify one retained AutoCAD layer's **arcs as door swings** — the deterministic tracing primitive behind CAD-to-BIM door placement. A door swing is drawn as a ~90° arc whose radius IS the leaf width and whose centre IS the hinge point. This filters the layer's arcs by plausible radius and sweep (rejecting inch-scale fillets, full-circle symbols and long shallow curves), reads each survivor as a door candidate (hinge, leaf width, swing direction, hosting wall direction), merges mirrored pairs sharing a chord line into double doors, and returns a radius histogram — real drawings use a handful of standard door sizes, so the histogram's clusters are the drawing's door widths (sanity-check them against the catalog; distrust arcs in no cluster).",
2925
+ "examplePrompts": [
2926
+ "Find the doors on the a-door CAD layer",
2927
+ "Classify the door swing arcs in the imported drawing",
2928
+ "What door sizes does this DWG use?",
2929
+ "Read hinge points and leaf widths from the CAD door layer\n\n# Example\n```ts\nconst [cad] = await snaptrude.core.io.underlay.list()\nconst r = await snaptrude.core.io.underlay.classifyArcs(cad, \"a-door\")\nif (r) {\nconsole.log(`${r.doors.length} doors; sizes:`,\nr.radiusHistogram.filter((b) => b.count > 1))\n}\n```"
2930
+ ],
2931
+ "argsType": "UnderlayHandle",
2932
+ "resultType": "PluginCadArcClassifyResult | null"
2933
+ },
2910
2934
  {
2911
2935
  "path": "core.io.underlay.delete",
2912
2936
  "namespace": "core.io.underlay",
@@ -2920,6 +2944,19 @@
2920
2944
  "argsType": "UnderlayHandle",
2921
2945
  "resultType": "void"
2922
2946
  },
2947
+ {
2948
+ "path": "core.io.underlay.extractCenterlines",
2949
+ "namespace": "core.io.underlay",
2950
+ "summary": "Extract **continuous wall centrelines** from one retained AutoCAD layer's double-line wall faces — the deterministic tracing primitive behind CAD-to-BIM wall conversion. Instead of paging raw curves and re-deriving the geometry in worker code, this reads the whole layer and runs the vetted pipeline: cull fragments, dedupe, merge collinear runs into *faces*, pair parallel faces a wall-thickness apart into centrelines (midline = axis, separation = thickness), bridge collinear gaps up to `bridgeOpenings.maxWidth` into ONE continuous centreline while recording each bridged span as an opening, then snap near-touching endpoints at junctions.",
2951
+ "examplePrompts": [
2952
+ "Trace the walls from the a-wall CAD layer",
2953
+ "Convert the AutoCAD wall linework into Snaptrude walls",
2954
+ "Extract wall centrelines with thickness from the imported DWG",
2955
+ "Find the glazing runs on the a-glazing layer\n\n# Example\n```ts\nconst [cad] = await snaptrude.core.io.underlay.list()\nconst r = await snaptrude.core.io.underlay.extractCenterlines(cad, \"a-wall\")\nif (r) {\nconst items = r.centerlines.map((c) => ({\nprofile: [c.start, c.end],\nthickness: c.thickness,\n}))\nconsole.log(`${items.length} walls, ${r.unpaired.length} unpaired faces`)\n}\n```"
2956
+ ],
2957
+ "argsType": "UnderlayHandle",
2958
+ "resultType": "PluginCadCenterlinesResult | null"
2959
+ },
2923
2960
  {
2924
2961
  "path": "core.io.underlay.getBounds",
2925
2962
  "namespace": "core.io.underlay",
@@ -2933,6 +2970,17 @@
2933
2970
  "argsType": "UnderlayHandle",
2934
2971
  "resultType": "BBoxComponents | null"
2935
2972
  },
2973
+ {
2974
+ "path": "core.io.underlay.getCadLayerGeometry",
2975
+ "namespace": "core.io.underlay",
2976
+ "summary": "Read one original AutoCAD layer's retained line and arc geometry in **Snaptrude world space** and Snaptrude internal units. Results are paged so large drawings can be inspected without returning the whole DWG at once.",
2977
+ "examplePrompts": [
2978
+ "Read the wall geometry from the A-WALL layer in this CAD underlay",
2979
+ "Get the next 500 curves from the structural CAD layer\n\n# Example\n```ts\nconst page = await snaptrude.core.io.underlay.getCadLayerGeometry(\ncad,\n\"A-WALL\",\n{ offset: 0, limit: 500 },\n)\nif (page) console.log(`${page.curves.length} of ${page.total} curves`)\n```"
2980
+ ],
2981
+ "argsType": "UnderlayHandle",
2982
+ "resultType": "PluginCadLayerGeometryPage | null"
2983
+ },
2936
2984
  {
2937
2985
  "path": "core.io.underlay.getOpacity",
2938
2986
  "namespace": "core.io.underlay",
@@ -2972,6 +3020,17 @@
2972
3020
  "argsType": "number",
2973
3021
  "resultType": "UnderlayHandle[]"
2974
3022
  },
3023
+ {
3024
+ "path": "core.io.underlay.listCadLayers",
3025
+ "namespace": "core.io.underlay",
3026
+ "summary": "List the distinct original AutoCAD layer names retained by a placed CAD underlay. Returns `[]` for non-CAD underlays, legacy imports created before source-layer retention, missing underlays, or CAD drawings without layer tags.",
3027
+ "examplePrompts": [
3028
+ "List the original AutoCAD layers in this imported drawing",
3029
+ "Which CAD layers are available in this underlay?\n\n# Example\n```ts\nconst layers = await snaptrude.core.io.underlay.listCadLayers(cad)\nconsole.log(layers)\n```"
3030
+ ],
3031
+ "argsType": "UnderlayHandle",
3032
+ "resultType": "string[]"
3033
+ },
2975
3034
  {
2976
3035
  "path": "core.io.underlay.resetScale",
2977
3036
  "namespace": "core.io.underlay",
@@ -3349,6 +3408,19 @@
3349
3408
  "argsType": "PluginAppMode",
3350
3409
  "resultType": "PluginCoreModeSetResult"
3351
3410
  },
3411
+ {
3412
+ "path": "core.project.getInfo",
3413
+ "namespace": "core.project",
3414
+ "summary": "Read identity and headline facts about the currently open project — id, display name, unit type, storey count, active storey, and site location when the project is geo-located.",
3415
+ "examplePrompts": [
3416
+ "What is this project called?",
3417
+ "Where is this project located?",
3418
+ "Give me a summary of this project",
3419
+ "How many storeys does this project have?\n\n# Example\n```ts\nconst info = await snaptrude.core.project.getInfo()\nconsole.log(info.name, info.units, info.storeyCount)\n```"
3420
+ ],
3421
+ "argsType": null,
3422
+ "resultType": "PluginProjectInfo"
3423
+ },
3352
3424
  {
3353
3425
  "path": "core.project.settings.getTolerance",
3354
3426
  "namespace": "core.project.settings",
@@ -3771,6 +3843,17 @@
3771
3843
  "argsType": "number",
3772
3844
  "resultType": "PluginStoryGetResult"
3773
3845
  },
3846
+ {
3847
+ "path": "core.storeys.getActive",
3848
+ "namespace": "core.storeys",
3849
+ "summary": "Get the active storey's value. Paired with {@linkcode PluginCoreStoreysApi.setActive}.",
3850
+ "examplePrompts": [
3851
+ "Which storey am I on?",
3852
+ "What is the current storey?\n\n# Example\n```ts\nconst storey = await snaptrude.core.storeys.getActive()\n```"
3853
+ ],
3854
+ "argsType": null,
3855
+ "resultType": "number"
3856
+ },
3774
3857
  {
3775
3858
  "path": "core.storeys.list",
3776
3859
  "namespace": "core.storeys",
@@ -4274,6 +4357,18 @@
4274
4357
  "argsType": "BrepHandle",
4275
4358
  "resultType": "ComponentHandle"
4276
4359
  },
4360
+ {
4361
+ "path": "design.create.opening",
4362
+ "namespace": "design.create",
4363
+ "summary": "Place a catalog **door or window** into a host wall with optional size overrides.",
4364
+ "examplePrompts": [
4365
+ "Add a 1m wide door to this wall here",
4366
+ "Place a window with a 0.9m sill height on the selected wall"
4367
+ ],
4368
+ "argsType": "PluginDesignCreateOpeningOptions",
4369
+ "resultType": "ComponentHandle",
4370
+ "performance": "Single-opening creator — use it for one hosted opening. A plural API is intentionally unavailable until host placement can be atomic. # Example ```ts const opening = await snaptrude.design.create.opening({ kind: \"window\", catalogId: windowType.id, hostWall: wall, position: await snaptrude.core.math.vec3.new(3, 0, 5), width: 1.2, height: 1.5, sillHeight: 0.9, }) ```"
4371
+ },
4277
4372
  {
4278
4373
  "path": "design.create.referenceLines",
4279
4374
  "namespace": "design.create",
@@ -4697,6 +4792,17 @@
4697
4792
  "argsType": "\"team\" | \"general\"",
4698
4793
  "resultType": "PluginFurnitureCatalogItem[]"
4699
4794
  },
4795
+ {
4796
+ "path": "design.furniture.listCatalogGroups",
4797
+ "namespace": "design.furniture",
4798
+ "summary": "List the furniture catalog's groups. Matches {@linkcode PluginDesignDoorsApi.listCatalogGroups} and {@linkcode PluginDesignWindowsApi.listCatalogGroups}, so all three catalog surfaces are named alike.",
4799
+ "examplePrompts": [
4800
+ "What furniture groups are available?",
4801
+ "List the furniture categories in this project\n\n# Example\n```ts\nconst groups = await snaptrude.design.furniture.listCatalogGroups()\nfor (const g of groups) console.log(g.dbType, g.label, g.source)\n```"
4802
+ ],
4803
+ "argsType": null,
4804
+ "resultType": "PluginObjectCatalogGroup[]"
4805
+ },
4700
4806
  {
4701
4807
  "path": "design.furniture.listCategories",
4702
4808
  "namespace": "design.furniture",
@@ -4708,7 +4814,8 @@
4708
4814
  "Which furniture categories can I filter by?\n\n# Example\n```ts\nconst categories = await snaptrude.design.furniture.listCategories()\nconst [first] = categories\nconst items = await snaptrude.design.furniture.listCatalog(undefined, first)\nconsole.log(first, \"→\", items.length, \"items\")\n```"
4709
4815
  ],
4710
4816
  "argsType": null,
4711
- "resultType": "string[]"
4817
+ "resultType": "string[]",
4818
+ "deprecated": "design.furniture.listCatalogGroups"
4712
4819
  },
4713
4820
  {
4714
4821
  "path": "design.furniture.setDimensions",
@@ -5471,6 +5578,19 @@
5471
5578
  "argsType": "ComponentHandle",
5472
5579
  "resultType": "ContourHandle | null"
5473
5580
  },
5581
+ {
5582
+ "path": "design.query.storeyOutline",
5583
+ "namespace": "design.query",
5584
+ "summary": "Compute the plan **outline of what is built on a storey** — the union of the storey's wall (by default) footprints as polygons-with-holes. This is the footprint-from-the-built-model query: by the time slabs are needed the walls exist, and the engine's own solids (snapped, joined and mitred at creation) are the cleanest wall network available — no CAD re-tracing.",
5585
+ "examplePrompts": [
5586
+ "What is the building footprint on the ground floor?",
5587
+ "Create a floor slab covering the whole storey",
5588
+ "Get the outline of the walls on storey 1",
5589
+ "How much area do the ground-floor walls enclose?\n\n# Example\n```ts\nconst r = await snaptrude.design.query.storeyOutline({ storey: 1 })\nconst main = r.footprints.find((f) => f.enclosed)\nif (main) {\nconst profile = await snaptrude.core.geom.create.profileFromLinePoints(\nmain.outline.map((p) => ({ x: p.x, y: 0, z: p.z })),\n)\n// → design.create.slab with the profile's contour\n}\n```"
5590
+ ],
5591
+ "argsType": "PluginStoreyOutlineOptions",
5592
+ "resultType": "PluginStoreyOutlineResult"
5593
+ },
5474
5594
  {
5475
5595
  "path": "design.selection.add",
5476
5596
  "namespace": "design.selection",
@@ -5863,6 +5983,17 @@
5863
5983
  "argsType": "ComponentHandle[]",
5864
5984
  "resultType": "PluginDesignChangeResult"
5865
5985
  },
5986
+ {
5987
+ "path": "design.visibility.show",
5988
+ "namespace": "design.visibility",
5989
+ "summary": "Reveal specific hidden components — the inverse of {@linkcode PluginDesignVisibilityApi.hide}. Use {@linkcode PluginDesignVisibilityApi.showAll} to reveal everything.",
5990
+ "examplePrompts": [
5991
+ "Show these walls again",
5992
+ "Unhide the selected furniture\n\n# Example\n```ts\nawait snaptrude.design.visibility.show([wall])\n```"
5993
+ ],
5994
+ "argsType": "ComponentHandle[]",
5995
+ "resultType": "PluginDesignChangeResult"
5996
+ },
5866
5997
  {
5867
5998
  "path": "design.visibility.showAll",
5868
5999
  "namespace": "design.visibility",
@@ -7551,6 +7682,17 @@
7551
7682
  "argsType": null,
7552
7683
  "resultType": "PluginProgramSiteNorthAngleResult"
7553
7684
  },
7685
+ {
7686
+ "path": "program.site.getSiteAnalysis",
7687
+ "namespace": "program.site",
7688
+ "summary": "Read the persisted Site Analysis sheet for the active proposal.",
7689
+ "examplePrompts": [
7690
+ "Read the current Site Analysis sheet",
7691
+ "What zoning constraints are recorded for this proposal?\n\n# Example\n```ts\nconst analysis = await snaptrude.program.site.getSiteAnalysis()\nif (analysis) console.log(analysis.sheetName, analysis.rows)\n```"
7692
+ ],
7693
+ "argsType": null,
7694
+ "resultType": "PluginProgramSiteAnalysisResult"
7695
+ },
7554
7696
  {
7555
7697
  "path": "program.site.getTimezone",
7556
7698
  "namespace": "program.site",
@@ -7615,6 +7757,17 @@
7615
7757
  "argsType": null,
7616
7758
  "resultType": "PluginProgramSiteListPolygonsResult"
7617
7759
  },
7760
+ {
7761
+ "path": "program.site.updateSiteAnalysis",
7762
+ "namespace": "program.site",
7763
+ "summary": "Merge sourced site/zoning constraints into the active proposal's persisted Site Analysis sheet.",
7764
+ "examplePrompts": [
7765
+ "Save these zoning constraints to Site Analysis",
7766
+ "Update the FAR and setbacks in the Site Analysis sheet\n\n# Example\n```ts\nconst result = await snaptrude.program.site.updateSiteAnalysis([\n{ category: \"FAR\", description: \"Floor Area Ratio\", quantity: 3.5, unit: \"ratio\" },\n{ category: \"Set backs\", description: \"Front setbacks\", quantity: 6, unit: \"m\" },\n])\nconsole.log(result.sheetName, result.updatedRows, result.appendedRows)\n```"
7767
+ ],
7768
+ "argsType": "PluginSiteAnalysisRow[]",
7769
+ "resultType": "PluginProgramSiteAnalysisUpdateResult"
7770
+ },
7618
7771
  {
7619
7772
  "path": "program.spreadsheet.addChart",
7620
7773
  "namespace": "program.spreadsheet",
@@ -53,6 +53,22 @@ export declare abstract class PluginCameraApi {
53
53
  * ```
54
54
  */
55
55
  abstract setStandardView(view: PluginStandardView): PluginApiReturn<boolean>;
56
+ /**
57
+ * Get the current camera mode. Paired with {@linkcode PluginCameraApi.setMode}.
58
+ *
59
+ * @returns `"2d"` when the editor is in plan view, `"3d"` otherwise.
60
+ *
61
+ * @examplePrompt Am I in 2D or 3D?
62
+ * @examplePrompt What view mode is the editor in?
63
+ *
64
+ * # Example
65
+ * ```ts
66
+ * if ((await snaptrude.core.camera.getMode()) === "2d") {
67
+ * await snaptrude.core.camera.setMode("3d")
68
+ * }
69
+ * ```
70
+ */
71
+ abstract getMode(): PluginApiReturn<PluginCameraMode>;
56
72
  /**
57
73
  * Toggle the modelling mode between `2d` (plan) and `3d`. Mirrors the canvas
58
74
  * 2D/3D toggle: `3d` enters the isometric perspective view, `2d` drops to the
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/api/core/camera/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;;;;GAQG;AACH,8BAAsB,eAAe;;IAGnC;;;;;;;;;;;;;;;;;;OAkBG;aACa,QAAQ,CACtB,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,UAAU,GACjB,eAAe,CAAC,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;OAmBG;aACa,eAAe,CAC7B,IAAI,EAAE,kBAAkB,GACvB,eAAe,CAAC,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;OAiBG;aACa,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC;IAEzE;;;;;;;;;;;;;;;;OAgBG;aACa,aAAa,IAAI,eAAe,CAAC,sBAAsB,CAAC;IAExE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACa,aAAa,CAC3B,UAAU,EAAE,sBAAsB,GACjC,eAAe,CAAC,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;OAgBG;aACa,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC;IAEvD;;;;;;;;;;;;;;;;;OAiBG;aACa,aAAa,IAAI,eAAe,CAAC,OAAO,CAAC;CAC1D;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;EAO7B,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;EAAuB,CAAA;AACpD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;EAA0C,CAAA;AAC7E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;;;iBAGnC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;iBAE1C,CAAA;AACF,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CACnD,OAAO,+BAA+B,CACvC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;iBAElC,CAAA;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B;;;;;iBAExC,CAAA;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,6BAA6B,CACrC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/api/core/camera/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C;;;;;;;;GAQG;AACH,8BAAsB,eAAe;;IAGnC;;;;;;;;;;;;;;;;;;OAkBG;aACa,QAAQ,CACtB,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,UAAU,GACjB,eAAe,CAAC,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;OAmBG;aACa,eAAe,CAC7B,IAAI,EAAE,kBAAkB,GACvB,eAAe,CAAC,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;OAcG;aACa,OAAO,IAAI,eAAe,CAAC,gBAAgB,CAAC;IAE5D;;;;;;;;;;;;;;;;;OAiBG;aACa,OAAO,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC;IAEzE;;;;;;;;;;;;;;;;OAgBG;aACa,aAAa,IAAI,eAAe,CAAC,sBAAsB,CAAC;IAExE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;aACa,aAAa,CAC3B,UAAU,EAAE,sBAAsB,GACjC,eAAe,CAAC,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;OAgBG;aACa,WAAW,IAAI,eAAe,CAAC,OAAO,CAAC;IAEvD;;;;;;;;;;;;;;;;;OAiBG;aACa,aAAa,IAAI,eAAe,CAAC,OAAO,CAAC;CAC1D;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;EAO7B,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAEnE;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;EAAuB,CAAA;AACpD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAE/D;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;EAA0C,CAAA;AAC7E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;;;iBAGnC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;iBAE1C,CAAA;AACF,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CACnD,OAAO,+BAA+B,CACvC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;iBAElC,CAAA;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B;;;;;iBAExC,CAAA;AACF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,6BAA6B,CACrC,CAAA"}