@pacem/pacem-3d 1.0.0-abel → 1.0.0-amaldi

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../esm/index-components.js", "../esm/index-components-drawing3d.js", "../esm/types.js", "../esm/converters.js", "../esm/stage.js", "../esm/constants.js", "../esm/detector.js", "../esm/materials/material.js", "../esm/materials/basic.js", "../esm/materials/lambert.js", "../esm/materials/line.js", "../esm/materials/phong.js", "../esm/materials/standard.js", "../esm/primitives/primitive.js", "../esm/primitives/box.js", "../esm/geometry.js", "../esm/decorators.js", "../esm/primitives/cone.js", "../esm/primitives/cylinder.js", "../esm/primitives/line.js", "../esm/primitives/plane.js", "../esm/primitives/polyhedra.js", "../esm/primitives/sphere.js", "../esm/primitives/torus.js", "../esm/adapters/shared.js", "../esm/adapters/threejsadapter.js", "../esm/adapters/webgpu/webgpuadapter.js", "../esm/adapters/webgpu/renderer.js", "../esm/adapters/webgpu/constants.js", "../esm/adapters/webgpu/pipelinefactory.js", "../esm/adapters/webgpu/abstractions.js", "../esm/adapters/webgpu/buffers.js", "../esm/adapters/webgpu/materials.js", "../esm/adapters/webgpu/wgsl/basic-material-fragment.js", "../esm/adapters/webgpu/wgsl/line-material-fragment.js", "../esm/adapters/webgpu/wgsl/mesh-vertex.js", "../esm/adapters/webgpu/wgsl/shared.js", "../esm/adapters/webgpu/wgsl/line-vertex.js", "../esm/adapters/webgpu/wgsl/object-picking-fragment.js", "../esm/adapters/webgpu/wgsl/texture-fragment.js", "../esm/adapters/webgpu/wgsl/directional-light-fragment.js", "../esm/adapters/webgpu/wgsl/omni-light-fragment.js", "../esm/adapters/webgpu/wgsl/ambient-light-fragment.js", "../esm/adapters/webgpu/renderablebuffer.js", "../esm/adapters/webgpu/cameras.js", "../esm/adapters/webgpu/raycaster.js", "../esm/adapters/webgpu/behaviors/orbit-camera.js", "../esm/index-drawing3d.js", "../esm/parsers/parser.js"],
4
- "sourcesContent": ["export * as Drawing3D from './index-components-drawing3d';\n", "export * from './types';\nexport * from './detector';\nexport * from './materials/material';\nexport * from './materials/basic';\nexport * from './materials/lambert';\nexport * from './materials/line';\nexport * from './materials/phong';\nexport * from './materials/standard';\nexport * from './primitives/primitive';\nexport * from './primitives/box';\nexport * from './primitives/cone';\nexport * from './primitives/cylinder';\nexport * from './primitives/line';\nexport * from './primitives/plane';\nexport * from './primitives/polyhedra';\nexport * from './primitives/sphere';\nexport * from './primitives/torus';\nexport * from './adapters/shared';\nexport * from './adapters/threejsadapter';\nexport * from './adapters/webgpu/webgpuadapter';\nexport * from './adapters/webgpu/behaviors/orbit-camera';\nexport * from './stage';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Watch, PropertyConverters, CustomElement, PacemEventTarget, PropertyChangeEvent, CustomElementUtils, CustomUIEvent, P, Utils, Components } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { Point3DConverter, Point3DOrNumberConverter, QuaternionConverter } from './converters';\nimport { Pacem3DElement } from './stage';\nimport { TAG_MIDDLE_NAME } from './constants';\nexport function isStage(object) {\n return !Utils.isNull(object) && 'render' in object && typeof object['render'] === 'function';\n}\nexport function isRenderable(object) {\n return isStage(object?.stage);\n}\nexport function isUi3DObject(object) {\n return 'transformMatrix' in object && isRenderable(object);\n}\nexport function isCamera(object) {\n return 'type' in object && 'up' in object && 'lookAt' in object && isRenderable(object);\n}\nexport function isPerspectiveCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'perspective';\n}\nexport function isOrthographicCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'orthographic';\n}\nexport function isLight(object) {\n return 'type' in object && (object.type === 'ambient' || object.type === 'omni' || object.type === 'direction' || object.type == 'spot') && isRenderable(object);\n}\nexport function isMesh(object) {\n return 'geometry' in object && isUi3DObject(object);\n}\nexport function isGeometry(object) {\n return 'positions' in object && Utils.isArray(object.positions);\n}\nexport function isMeshGeometry(object) {\n return ('triangleIndices' in object && Utils.isArray(object.triangleIndices)\n || 'normals' in object && Utils.isArray(object.normals)\n || 'textureCoordinates' in object && Utils.isArray(object.textureCoordinates)) && isGeometry(object);\n}\nexport function isGroup(object) {\n return 'childRenderables' in object && Utils.isArray(object['childRenderables']) && isUi3DObject(object);\n}\n/**\n * Sets the normals to a mesh geometry by computing each face's unit orthogonal vector.\n * @param geometry\n */\nexport function computeSharpVertexNormals(geometry) {\n const normals = [];\n if (!Utils.isNullOrEmpty(geometry)) {\n const indices = geometry.triangleIndices;\n if (indices.length % 3 !== 0) {\n throw new RangeError(`Invalid mesh geometry: ${indices.length} is not multiple of 3.`);\n }\n for (let j = 2; j < indices.length; j += 3) {\n const u = indices[j - 2], v = indices[j - 1], w = indices[j];\n const a = geometry.positions[u], b = geometry.positions[v], c = geometry.positions[w];\n const normal = computePlaneNormal(a, b, c);\n normals.push(normal, normal, normal);\n }\n }\n geometry.normals = normals;\n}\n/**\n * Computes the unit vector orthogonal to the plane identified by 3 points.\n * @param a\n * @param b\n * @param c\n */\nexport function computePlaneNormal(a, b, c) {\n // TODO: check input correctness (distinct points)\n const vAB = Geometry.LinearAlgebra.Vector3D.subtract(a, b), vAC = Geometry.LinearAlgebra.Vector3D.subtract(a, c);\n const orthogonal = Geometry.LinearAlgebra.Vector3D.cross(vAB, vAC);\n return Geometry.LinearAlgebra.Vector3D.unit(orthogonal);\n}\nexport class UI3DEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent, point) {\n super(type, eventInit, originalEvent);\n this.#point = point;\n }\n #point;\n /** Gets the event's source position in 3d coordinates. */\n get point() {\n return this.#point;\n }\n}\nexport class DragEvent extends UI3DEvent {\n}\nexport class RenderableEvent extends UI3DEvent {\n constructor(type, args, originalEvent, p) {\n super(type, { detail: args, bubbles: true, cancelable: true }, originalEvent, p);\n }\n}\nexport var StalePropertyFlag;\n(function (StalePropertyFlag) {\n StalePropertyFlag[\"Position\"] = \"position\";\n StalePropertyFlag[\"Transform\"] = \"transform\";\n StalePropertyFlag[\"Geometry\"] = \"geometry\";\n StalePropertyFlag[\"Children\"] = \"children\";\n StalePropertyFlag[\"Material\"] = \"material\";\n StalePropertyFlag[\"Light\"] = \"light\";\n StalePropertyFlag[\"Camera\"] = \"camera\";\n StalePropertyFlag[\"Visibility\"] = \"visibility\";\n})(StalePropertyFlag || (StalePropertyFlag = {}));\nexport function isInteraction(object) {\n return typeof object === 'object' && 'time' in object && typeof object['time'] === 'number';\n}\n//namespace Pacem.Components.Drawing3D {\nconst Constants = {\n OBJECT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-object',\n LIGHT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-light',\n PERSPECTIVE_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-perspective-camera',\n ORTHO_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-orthographic-camera',\n LINE_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-line',\n MESH_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-mesh',\n GROUP_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-group',\n DEFAULT_COORDS: { x: 0, y: 0, z: 0 }\n};\nexport class RenderableElement extends Components.PacemCrossItemsContainerElement {\n constructor() {\n super(...arguments);\n this.position = Constants.DEFAULT_COORDS;\n this.#staleFlags = [];\n }\n validate(_) {\n // by default no children allowed (Group will except)\n return false;\n }\n findContainer() {\n // override\n return this.parent || this.stage;\n }\n get stage() {\n return this['_scene'] = this['_scene'] || CustomElementUtils.findAncestorOfType(this, Pacem3DElement);\n }\n get parent() {\n return this['_drawableParent'] = this['_drawableParent'] || CustomElementUtils.findAncestor(this, i => i instanceof RenderableElement);\n }\n disconnectedCallback() {\n delete this['_scene'];\n delete this['_drawableParent'];\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'hide':\n this.setAsDirty(StalePropertyFlag.Visibility);\n break;\n case 'items':\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n case 'position':\n this.setAsDirty(StalePropertyFlag.Position);\n break;\n }\n }\n #staleFlags;\n get flags() {\n return this.#staleFlags;\n }\n /** Calls for a redraw of the current element in the next rendering process. */\n setAsDirty(...flags) {\n // set the flags that identify the stale part of the object to be updated.\n for (let flag of flags) {\n if (!this.flags.includes(flag)) {\n this.flags.push(flag);\n }\n }\n this.stage?.render(this);\n }\n}\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], RenderableElement.prototype, \"position\", void 0);\n__decorate([\n Watch({ emit: false, reflectBack: true, converter: PropertyConverters.String })\n], RenderableElement.prototype, \"tag\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], RenderableElement.prototype, \"inert\", void 0);\nexport class Ui3DElement extends RenderableElement {\n // #endregion\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'transformMatrix':\n this.setAsDirty(StalePropertyFlag.Transform);\n break;\n case 'translateZ':\n case 'translateX':\n case 'translateY':\n this.offset = { x: this.translateX, y: this.translateY, z: this.translateZ };\n break;\n case 'scaleX':\n case 'scaleY':\n case 'scaleZ':\n this.scale = { x: this.scaleX, y: this.scaleY, z: this.scaleZ };\n break;\n case 'scale':\n case 'offset':\n case 'rotate':\n this._computeTransformMatrix();\n break;\n }\n }\n _computeTransformMatrix() {\n const MAT3D = Geometry.LinearAlgebra.Matrix3D, VEC3D = Geometry.LinearAlgebra.Vector3D, QUAT = Geometry.LinearAlgebra.Quaternion;\n // scale\n const scale = this.scale ?? VEC3D.from(1, 1, 1);\n let m = MAT3D.scale(MAT3D.identity(), scale);\n // rotate\n if (!Utils.isNull(this.rotate)) {\n const rot = QUAT.toRotationMatrix(this.rotate);\n m = MAT3D.multiply(m, rot);\n }\n // translate\n const offset = this.offset ?? VEC3D.from(0, 0, 0);\n m = MAT3D.translate(m, offset);\n this.transformMatrix = m;\n }\n}\n__decorate([\n Watch({ emit: false, converter: QuaternionConverter })\n], Ui3DElement.prototype, \"rotate\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"scale\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"offset\", void 0);\n__decorate([\n Watch({ emit: false })\n], Ui3DElement.prototype, \"transformMatrix\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleZ\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateZ\", void 0);\nlet Pacem3DGroupElement = class Pacem3DGroupElement extends Ui3DElement {\n validate(child) {\n // overrides default denial\n return child instanceof RenderableElement;\n }\n #children = [];\n get childRenderables() {\n return this.#children;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'items':\n case 'datasource':\n this.#children = (val || []);\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DGroupElement.prototype, \"datasource\", void 0);\nPacem3DGroupElement = __decorate([\n CustomElement({ tagName: Constants.GROUP_SELECTOR })\n], Pacem3DGroupElement);\nexport { Pacem3DGroupElement };\nlet Pacem3DMeshElement = class Pacem3DMeshElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'geometry':\n this.setAsDirty(StalePropertyFlag.Geometry);\n break;\n case 'material':\n case 'backMaterial':\n this.setAsDirty(StalePropertyFlag.Material);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"geometry\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"backMaterial\", void 0);\nPacem3DMeshElement = __decorate([\n CustomElement({ tagName: Constants.MESH_SELECTOR })\n], Pacem3DMeshElement);\nexport { Pacem3DMeshElement };\nlet Pacem3DObjectElement = class Pacem3DObjectElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'content' || name === 'type') {\n this.setAsDirty(StalePropertyFlag.Geometry, StalePropertyFlag.Material);\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DObjectElement.prototype, \"content\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DObjectElement.prototype, \"type\", void 0);\nPacem3DObjectElement = __decorate([\n CustomElement({ tagName: Constants.OBJECT_SELECTOR })\n], Pacem3DObjectElement);\nexport { Pacem3DObjectElement };\nlet Pacem3DLightElement = class Pacem3DLightElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.intensity = .85;\n this.target = Constants.DEFAULT_COORDS;\n this.color = '#fff';\n this.type = 'omni';\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'color':\n case 'intensity':\n case 'target':\n this.setAsDirty(StalePropertyFlag.Light);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DLightElement.prototype, \"intensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DLightElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"type\", void 0);\nPacem3DLightElement = __decorate([\n CustomElement({ tagName: Constants.LIGHT_SELECTOR })\n], Pacem3DLightElement);\nexport { Pacem3DLightElement };\nexport class Pacem3DCameraElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.near = 0.1;\n this.far = 1000.0;\n this.up = Geometry.LinearAlgebra.Vector3D.j();\n this.lookAt = Constants.DEFAULT_COORDS;\n }\n #sphere;\n _resetBoundingSphere() {\n const oldValue = this.#sphere;\n const eye = this.position, center = this.lookAt;\n const radius = Utils.isNullOrEmpty(eye) || Utils.isNullOrEmpty(center) ? 0\n : Geometry.LinearAlgebra.Vector3D.mag(Geometry.LinearAlgebra.Vector3D.subtract(eye, center));\n const currentValue = this.#sphere = { center, radius };\n this.dispatchEvent(new PropertyChangeEvent({ currentValue, propertyName: 'boundingSphere', oldValue }));\n }\n get boundingSphere() {\n return this.#sphere;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'lookAt':\n case 'position':\n this._resetBoundingSphere();\n case 'near':\n case 'far':\n case 'up':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"near\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"far\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"up\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"lookAt\", void 0);\nlet Pacem3DPerspectiveCameraElement = class Pacem3DPerspectiveCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.fov = 45;\n this.aspect = 1;\n }\n get type() {\n return \"perspective\";\n }\n get aspectRatio() {\n return this.aspect;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'fov':\n case 'aspect':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"fov\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"aspect\", void 0);\nPacem3DPerspectiveCameraElement = __decorate([\n CustomElement({ tagName: Constants.PERSPECTIVE_CAMERA_SELECTOR })\n], Pacem3DPerspectiveCameraElement);\nexport { Pacem3DPerspectiveCameraElement };\nlet Pacem3DOrthographicCameraElement = class Pacem3DOrthographicCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.top = 1;\n this.left = -1;\n this.bottom = -1;\n this.right = 1;\n }\n get type() {\n return \"orthographic\";\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'top':\n case 'left':\n case 'bottom':\n case 'right':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"top\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"left\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"bottom\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"right\", void 0);\nPacem3DOrthographicCameraElement = __decorate([\n CustomElement({ tagName: Constants.ORTHO_CAMERA_SELECTOR })\n], Pacem3DOrthographicCameraElement);\nexport { Pacem3DOrthographicCameraElement };\nexport class Pacem3DAdapterElement extends PacemEventTarget {\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { parseAsNumericalArray } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\n//namespace Pacem.Drawing3D {\nexport const Point3DConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Vector3D.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const Point3DOrNumberConverter = {\n convert: (attr) => {\n const arr = parseAsNumericalArray(attr);\n const throwErr = () => { throw new Error(`Cannot parse \"${attr}\" as a valid Vector3D.`); };\n if (Utils.isNullOrEmpty(arr)) {\n throwErr();\n }\n if (arr.length === 3) {\n return Geometry.LinearAlgebra.Vector3D.from(...arr);\n }\n if (arr.length === 1) {\n const v = arr[0];\n return Geometry.LinearAlgebra.Vector3D.from(v, v, v);\n }\n throwErr();\n },\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const QuaternionConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Quaternion.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0} ${prop.w || 0}`\n};\nexport const BooleanOrNumberConverter = {\n convert: (attr) => {\n if (attr === 'true')\n return true;\n if (attr === 'false')\n return false;\n return parseAsNumericalArray(attr)[0];\n },\n convertBack: (prop) => prop.toString()\n};\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, PCSS, Defaults, ViewChild, Watch, PropertyConverters, Utils, Components, PropertyChangeEventName, Logging, Animations, UI } from '@pacem/pacem-core';\nimport { RenderableEvent, DragEvent, RenderableElement } from './types';\nimport { TAG_MIDDLE_NAME } from './constants';\n//namespace Pacem.Components.Drawing3D {\nlet Pacem3DElement = class Pacem3DElement extends Components.PacemItemsContainerElement {\n constructor() {\n super(...arguments);\n this._itemPropertyChangeHandler = (evt) => {\n const renderable = evt.target;\n // clear flags\n // TODO: be more precise\n this.adapter &&\n this.adapter.updateItem(this, renderable);\n renderable.flags.splice(0);\n };\n this._clickHandler = (evt) => {\n let me = this;\n if (!me.interactive || Utils.isNull(me._lastHitResult)) {\n return;\n }\n const type = evt.type.replace(/^mouse/, '');\n const hit = me._lastHitResult, object = hit.object, point = hit.point;\n this._itemDispatch(object, point, type, evt);\n };\n this._hitTestCallback = (result, evt) => {\n const me = this;\n // TODO: handle dragging\n if (result != me._lastHitResult) {\n if (result?.object != me._lastHitResult?.object) {\n const obj = result?.object, last = me._lastHitResult?.object, pt = result?.point;\n if (!Utils.isNull(last)) {\n this._itemDispatch(last, pt, 'out', evt);\n }\n if (!Utils.isNull(obj)) {\n this._itemDispatch(obj, pt, 'over', evt);\n }\n }\n me._lastHitResult = result;\n }\n };\n this._moveHandler = (evt) => {\n let me = this;\n if (!me.adapter || !me.interactive) {\n return;\n }\n const rect = me._resizer.currentSize;\n const callback = (r) => me._hitTestCallback(r, evt);\n const pixel = evt.type === 'mousemove' ? { x: evt.pageX - rect.left, y: evt.pageY - rect.top } : { x: -1, y: -1 };\n me.adapter.raycast(this, pixel, rect, callback);\n };\n this._resizeHandler = (evt) => {\n const oldSize = this.#size;\n const size = evt.detail;\n if (!Utils.isNull(oldSize) && oldSize.height === size.height && oldSize.width === size.width) {\n return;\n }\n this.#size = size;\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n this.adapter.invalidateSize(this, size);\n this.dispatchEvent(new Components.ResizeEvent(size));\n }\n };\n //#endregion\n }\n validate(item) {\n return item instanceof RenderableElement;\n }\n get stage() {\n return this._container;\n }\n get scene() {\n return this.adapter && this.adapter.getScene(this);\n }\n register(item) {\n const retval = super.register(item);\n if (retval) {\n this._add(item);\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n }\n return retval;\n }\n unregister(item) {\n const retval = super.unregister(item);\n if (retval) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n this._erase(item);\n }\n return retval;\n }\n _refreshDatasource(val = this.datasource) {\n this.adapter?.updateItem(this, undefined);\n }\n _buildUpDatasourceFromDOM(val = this.items) {\n if (!Utils.isNullOrEmpty(val)) {\n this.datasource = val.slice();\n }\n }\n _add(item) {\n this.adapter &&\n this.adapter.addItem(this, item);\n }\n _erase(item) {\n this.adapter &&\n this.adapter.removeItem(this, item);\n }\n _initializeAdapter(old, val) {\n return new Promise((resolve, reject) => {\n const items = this.datasource || [];\n if (!Utils.isNull(old)) {\n items.forEach(i => old.removeItem(this, i));\n }\n if (!Utils.isNull(this._container) && !Utils.isNull(val)) {\n val.initialize(this).then(_ => {\n (items || []).forEach(i => this._add(i));\n resolve();\n }, e => {\n this.log(Logging.LogLevel.Error, e?.toString());\n reject(e);\n });\n }\n else {\n resolve();\n }\n });\n }\n //#region lifecycle\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'adapter':\n this._initializeAdapter(old, val);\n break;\n case 'items':\n this._buildUpDatasourceFromDOM(val);\n break;\n case 'transparent':\n this.adapter?.invalidateSize(this, this.size);\n break;\n case 'datasource':\n this._refreshDatasource(val);\n case 'disabled':\n case 'background':\n this.render();\n break;\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n // stage\n const container = this._container;\n // resizer\n const resizer = this._resizer;\n resizer.addEventListener('resize', this._resizeHandler, false);\n resizer.target = container;\n // adapter\n this._initializeAdapter(null, this.adapter).then(_ => {\n container.addEventListener('mousemove', this._moveHandler, false);\n container.addEventListener('click', this._clickHandler, false);\n container.addEventListener('mouseup', this._clickHandler, false);\n container.addEventListener('mousedown', this._clickHandler, false);\n container.addEventListener('mouseout', this._moveHandler, false);\n this._buildUpDatasourceFromDOM();\n this.render();\n });\n }\n _itemDispatch(target, point, type, offset) {\n if (!Utils.isNull(target)) {\n var dragArgs, originalEvent, evtType;\n if (offset instanceof Event) {\n originalEvent = offset;\n }\n else {\n dragArgs = { item: target, offset: offset };\n }\n if (typeof type === 'string') {\n evtType = type;\n }\n else {\n evtType = type.type;\n originalEvent = type.originalEvent;\n }\n const m = point;\n const evt = () => offset instanceof Event ? new RenderableEvent(evtType, target, originalEvent, m) : new DragEvent(evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m), itemevt = offset instanceof Event ? new RenderableEvent('item' + evtType, target, originalEvent, m) : new DragEvent('item' + evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m);\n var prevent = false;\n if (target instanceof EventTarget) {\n const evnt = evt();\n target.dispatchEvent(evnt);\n prevent = evnt.defaultPrevented;\n }\n target.stage.dispatchEvent(itemevt);\n // was the event (in one of its forms) rejected?\n return prevent || itemevt.defaultPrevented;\n }\n return false;\n }\n disconnectedCallback() {\n this.#handle?.stop();\n const resizer = this._resizer, container = this._container;\n if (!Utils.isNull(container)) {\n container.removeEventListener('click', this._clickHandler, false);\n container.removeEventListener('mouseup', this._clickHandler, false);\n container.removeEventListener('mousedown', this._clickHandler, false);\n container.removeEventListener('mousemove', this._moveHandler, false);\n container.removeEventListener('mouseout', this._moveHandler, false);\n }\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener('resize', this._resizeHandler, false);\n }\n super.disconnectedCallback();\n }\n #size;\n get size() {\n return this.#size;\n }\n render(item, deepUpdate, now = performance.now()) {\n if (!Utils.isNull(item)) {\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n adapter.updateItem(this, item);\n }\n }\n else {\n this.#handle?.stop();\n this.#handle = Animations.Timer.run(_ => this._doRender());\n //this._doRender();\n }\n }\n #handle;\n _doRender() {\n if (!this.disabled && !Utils.isNull(this.adapter)) {\n const scene = this.adapter.getScene(this);\n let cancelable = new CustomEvent('prerender', { detail: { scene }, cancelable: true });\n this.dispatchEvent(cancelable);\n if (!cancelable.defaultPrevented) {\n this.adapter.render(this);\n this.dispatchEvent(new CustomEvent('render', { detail: { scene } }));\n }\n }\n }\n};\n__decorate([\n ViewChild(`.${PCSS}-3d`)\n], Pacem3DElement.prototype, \"_container\", void 0);\n__decorate([\n ViewChild(P + '-resize')\n], Pacem3DElement.prototype, \"_resizer\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"interactive\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"transparent\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DElement.prototype, \"background\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Element })\n], Pacem3DElement.prototype, \"adapter\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"orbit\", void 0);\nPacem3DElement = __decorate([\n CustomElement({\n tagName: P + '-' + TAG_MIDDLE_NAME, shadow: Defaults.USE_SHADOW_ROOT, template: `<${P}-resize watch-position=\"true\"></${P}-resize><div class=\"${PCSS}-3d\"></div><${P}-content></${P}-content>`\n })\n], Pacem3DElement);\nexport { Pacem3DElement };\n", "export const TAG_MIDDLE_NAME = \"3d\";\nexport const DEG2RAD = Math.PI / 180;\n", "//namespace Pacem.Components.Drawing3D {\n/** @deprecated*/\nexport class Pacem3DDetector {\n constructor() {\n this._detected = {\n supported: false, info: {}\n };\n let cvs = document.createElement('canvas');\n let contextNames = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];\n let ctx;\n let getParam = function (str) {\n if (!str)\n return undefined;\n return ctx.getParameter(str);\n };\n // addLine\n let addLine = (section, name, value) => {\n let detected = this._detected;\n var info = detected.info[section] = detected.info[section] || {};\n name = name.replace(/[^\\w]+/g, '');\n name = name.substring(0, 1).toLowerCase() + name.substring(1);\n info[name] = value;\n };\n if (navigator.userAgent.indexOf('MSIE') >= 0) {\n try {\n ctx = window['WebGLHelper'].CreateGLContext(cvs, 'canvas');\n }\n catch (e) { }\n }\n else {\n for (var i = 0; i < contextNames.length; i++) {\n try {\n ctx = cvs.getContext(contextNames[i]);\n if (ctx) {\n addLine('main', 'Context Name', contextNames[i]);\n break;\n }\n }\n catch (e) { }\n }\n }\n this._detected.supported = !!ctx;\n addLine('main', 'Platform', navigator.platform);\n addLine('main', 'Agent', navigator.userAgent);\n if (ctx) {\n addLine('main', 'Vendor', getParam(ctx.VENDOR));\n addLine('main', 'Version', getParam(ctx.VERSION));\n addLine('main', 'Renderer', getParam(ctx.RENDERER));\n addLine('main', 'Shading Language Version', getParam(ctx.SHADING_LANGUAGE_VERSION));\n addLine('bits', 'Rgba Bits', getParam(ctx.RED_BITS) + ', ' + getParam(ctx.GREEN_BITS) + ', ' + getParam(ctx.BLUE_BITS) + ', ' + getParam(ctx.ALPHA_BITS));\n addLine('bits', 'Depth Bits', getParam(ctx.DEPTH_BITS));\n addLine('shader', 'Max Vertex Attribs', getParam(ctx.MAX_VERTEX_ATTRIBS));\n addLine('shader', 'Max Vertex Texture Image Units', getParam(ctx.MAX_VERTEX_TEXTURE_IMAGE_UNITS));\n addLine('shader', 'Max Varying Vectors', getParam(ctx.MAX_VARYING_VECTORS));\n addLine('shader', 'Max Uniform Vectors', getParam(ctx.MAX_VERTEX_UNIFORM_VECTORS));\n addLine('tex', 'Max Combined Texture Image Units', getParam(ctx.MAX_COMBINED_TEXTURE_IMAGE_UNITS));\n addLine('tex', 'Max Texture Size', getParam(ctx.MAX_TEXTURE_SIZE));\n addLine('tex', 'Max Cube Map Texture Size', getParam(ctx.MAX_CUBE_MAP_TEXTURE_SIZE));\n addLine('tex', 'Num. Compressed Texture Formats', getParam(ctx.COMPRESSED_TEXTURE_FORMATS));\n addLine('misc', 'Max Render Buffer Size', getParam(ctx.MAX_RENDERBUFFER_SIZE));\n addLine('misc', 'Max Viewport Dimensions', getParam(ctx.MAX_VIEWPORT_DIMS));\n addLine('misc', 'Aliased Line Width Range', getParam(ctx.ALIASED_LINE_WIDTH_RANGE));\n addLine('misc', 'Aliased Point Size Range', getParam(ctx.ALIASED_POINT_SIZE_RANGE));\n addLine('misc', 'Supported Extensions', ctx.getSupportedExtensions() || []);\n }\n }\n get info() {\n return this._detected.info;\n }\n get supported() {\n return this._detected.supported;\n }\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Utils, Watch, PropertyConverters, PCSS } from '@pacem/pacem-core';\nimport { Imaging } from '@pacem/pacem-foundation';\nimport { StalePropertyFlag } from '../types';\n//namespace Pacem.Drawing3D {\nexport var KnownShader;\n(function (KnownShader) {\n KnownShader[\"Basic\"] = \"basic\";\n KnownShader[\"Lambert\"] = \"lambert\";\n KnownShader[\"Phong\"] = \"phong\";\n KnownShader[\"Standard\"] = \"standard\";\n KnownShader[\"Line\"] = \"line\";\n KnownShader[\"Custom\"] = \"custom\";\n})(KnownShader || (KnownShader = {}));\nexport function isMaterial(obj) {\n return /*'color' in obj &&*/ 'shader' in obj;\n}\nexport function isBasicMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Basic;\n}\nexport function isLineMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Line;\n}\nexport function isLambertMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Lambert;\n}\nexport function isPhongMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Phong;\n}\nexport function isStandardMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Standard;\n}\nexport function isShaderMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Custom;\n}\n//namespace Pacem.Components.Drawing3D {\nexport class MaterialElement extends PacemEventTarget {\n constructor(shader) {\n super();\n this.#shader = shader;\n }\n #shader;\n get shader() {\n return this.#shader;\n }\n async _loadMap(url, old = this.material?.texture) {\n if (!Utils.isNull(old)) {\n old.close();\n }\n if (Utils.isNullOrEmpty(url)) {\n return null;\n }\n const blob = await Imaging.loadImage(url);\n if (Utils.isNull(blob)) {\n return null;\n }\n return await createImageBitmap(blob);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'map':\n case 'opacity':\n case 'wireframe':\n case 'color':\n case 'hide':\n this.updateMaterial();\n break;\n }\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.updateMaterial();\n }\n updateMaterial() {\n this.createMaterial().then(m => {\n this.material = Utils.extend(m, { flags: [StalePropertyFlag.Material] });\n });\n }\n async createMaterial() {\n return {\n opacity: this.opacity ?? 1.0,\n wireframe: this.wireframe ?? false,\n color: this.color || Utils.Css.getVariableValue(`--${PCSS}-color-primary`),\n visible: !(this.hide ?? false),\n map: this.map,\n texture: await this._loadMap(this.map),\n shader: this.shader,\n flags: [],\n };\n }\n}\n__decorate([\n Watch()\n], MaterialElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], MaterialElement.prototype, \"opacity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"wireframe\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"hide\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"map\", void 0);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P } from '@pacem/pacem-core';\nimport { KnownShader, MaterialElement } from './material';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet BasicMaterialElement = class BasicMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Basic);\n }\n};\nBasicMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-basic` })\n], BasicMaterialElement);\nexport { BasicMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LambertMaterialElement = class LambertMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Lambert);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LambertMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"refractionRatio\", void 0);\nLambertMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-lambert` })\n], LambertMaterialElement);\nexport { LambertMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LineMaterialElement = class LineMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Line);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'lineWidth':\n case 'lineJoin':\n case 'lineCap':\n case 'dashArray':\n this.updateMaterial();\n break;\n }\n }\n }\n async createMaterial() {\n return Utils.extend({\n lineWidth: this.lineWidth ?? 1,\n lineJoin: this.lineJoin ?? 'round',\n lineCap: this.lineCap ?? 'round',\n dashArray: this.dashArray,\n }, await super.createMaterial());\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LineMaterialElement.prototype, \"lineWidth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineJoin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineCap\", void 0);\n__decorate([\n Watch({\n emit: false, converter: {\n convert: (attr) => attr?.split(',').map(i => parseInt(i)).filter(i => !Number.isNaN(i)),\n convertBack: (prop) => prop?.join(',')\n }\n })\n], LineMaterialElement.prototype, \"dashArray\", void 0);\nLineMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-line` })\n], LineMaterialElement);\nexport { LineMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet PhongMaterialElement = class PhongMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Phong);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0,\n specularColor: this.specularColor || '#000',\n shininess: this.shininess ?? 0,\n flatShading: this.flatShading ?? true\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n case 'specularColor':\n case 'shininess':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"specularColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"shininess\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], PhongMaterialElement.prototype, \"flatShading\", void 0);\nPhongMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-phong` })\n], PhongMaterialElement);\nexport { PhongMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet StandardMaterialElement = class StandardMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Standard);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n refractionRatio: this.refractionRatio ?? 0,\n metalness: this.metalness ?? 0,\n roughness: this.roughness ?? 0,\n flatShading: this.flatShading ?? false\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'roughness':\n case 'metalness':\n case 'refractionRatio':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], StandardMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"roughness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"metalness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], StandardMaterialElement.prototype, \"flatShading\", void 0);\nStandardMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-standard` })\n], StandardMaterialElement);\nexport { StandardMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\n//namespace Pacem.Components.Drawing3D {\nexport class Pacem3DPrimitiveElement extends PacemEventTarget {\n viewActivatedCallback() {\n super.viewActivatedCallback();\n if (Utils.isNull(this.geometry)) {\n this.geometry = this.createDefaultGeometry();\n }\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], Pacem3DPrimitiveElement.prototype, \"geometry\", void 0);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemBoxElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemBoxElement = PacemBoxElement_1 = class PacemBoxElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {\n const w = width || 1, h = height || 1, d = depth || 1, sw = widthSegments || 1, sh = heightSegments || 1, sd = depthSegments || 1;\n const positions = [];\n const uv = [];\n const indices = [];\n // populationg positions\n for (var j = 0; j <= sh; j++) {\n var y = h / 2.0 - h * (1.0 * j) / (1.0 * sh); // ??\n for (var k = 0; k <= sd; k++) {\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n for (var i = 0; i <= sw; i++) {\n var x = -w / 2.0 + w * (1.0 * i) / (1.0 * sw);\n // add only surface nodes\n if (i == 0 || i == sw || k == 0 || k == sd || j == 0 || j == sh)\n positions.push({ x, y, z });\n }\n }\n }\n var getPosIndex = function (x, y, z) {\n var epsilon = .00001;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n if (Math.abs(pt.x - x) < epsilon && Math.abs(pt.y - y) < epsilon && Math.abs(pt.z - z) < epsilon)\n return i;\n }\n return -1;\n };\n var appendFace = function (c_1, c_2, c_3, c_4, u, v, u_next, v_next) {\n indices.push(c_1);\n indices.push(c_2);\n indices.push(c_3);\n indices.push(c_1);\n indices.push(c_3);\n indices.push(c_4);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n };\n // top face (1)\n for (var k = 0; k < sd; k++) {\n var y = h / 2.0;\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n var z_next = -d / 2.0 + d * (1.0 * (k + 1)) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + (1.0 * i) * w / (1.0 * sw);\n var x_next = -w / 2.0 + (1.0 * (i + 1)) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (1.0 * (i + 1)) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (1.0 * (k + 1)) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // back face (2)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = -d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = w / 2.0 - 1.0 * i * w / (1.0 * sw);\n var x_next = w / 2.0 - (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - 1.0 * j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // left face (3)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = -w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = -d / 2.0 + k * d / (1.0 * sd);\n var z_next = -d / 2.0 + (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // front face (4)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // right face (5)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = d / 2.0 - k * d / (1.0 * sd);\n var z_next = d / 2.0 - (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // bottom face (6)\n for (var k = 0; k < sd; k++) {\n var y = -h / 2.0;\n var z = d / 2.0 - d * k / (1.0 * sd);\n var z_next = d / 2.0 - d * (k + 1.0) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (k + 1.0) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `box_${width}x${height}x${depth}_w${widthSegments}_h${heightSegments}_d${depthSegments}`;\n computeSharpVertexNormals(geom);\n const center = { x: 0, y: 0, z: 0 };\n const w2 = width / 2, h2 = height / 2, d2 = depth / 2;\n //\n geom.barycenter = center;\n geom.boundingBox = { maxX: w2, maxY: h2, maxZ: d2, minX: -w2, minY: -h2, minZ: -d2 };\n geom.boundingSphere = { center, radius: Math.sqrt(Math.pow(w2, 2) + Math.pow(h2, 2) + Math.pow(d2, 2)) };\n //\n return geom;\n }\n createDefaultGeometry() {\n return PacemBoxElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'height':\n case 'depth':\n case 'widthSegments':\n case 'heightSegments':\n case 'depthSegments':\n this.geometry = PacemBoxElement_1.createMeshGeometry(this.width, this.height, this.depth, this.widthSegments, this.heightSegments, this.depthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depthSegments\", void 0);\nPacemBoxElement = PacemBoxElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-box' })\n], PacemBoxElement);\nexport { PacemBoxElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Utils } from '@pacem/pacem-core';\nimport { StalePropertyFlag } from './types';\nimport { NotifyChange } from './decorators';\nexport class NodeGeometry {\n constructor(positions = []) {\n this.positions = positions;\n }\n static barycenter(positions) {\n var bary = { x: 0, y: 0, z: 0 };\n if (!Utils.isNullOrEmpty(positions)) {\n var count = positions.length;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n bary.x += pt.x;\n bary.y += pt.y;\n bary.z += pt.z;\n }\n var countDbl = 1.0 * count;\n bary.x /= countDbl;\n bary.y /= countDbl;\n bary.z /= countDbl;\n }\n return bary;\n }\n static boundingBox(positions) {\n const output = {\n minX: +Infinity, minY: +Infinity, minZ: +Infinity,\n maxX: -Infinity, maxY: -Infinity, maxZ: -Infinity\n };\n if (!Utils.isNullOrEmpty(positions)) {\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n output.minX = Math.min(output.minX, pt.x);\n output.minY = Math.min(output.minY, pt.y);\n output.minZ = Math.min(output.minZ, pt.z);\n output.maxX = Math.max(output.maxX, pt.x);\n output.maxY = Math.max(output.maxY, pt.y);\n output.maxZ = Math.max(output.maxZ, pt.z);\n }\n }\n return output;\n }\n setAsDirty() {\n setSelfAsDirty.call(this);\n }\n}\nfunction setSelfAsDirty() {\n const me = this;\n me.flags = [/* no further specifications, other than 'geometry' */ StalePropertyFlag.Geometry];\n}\nexport class LineGeometry extends NodeGeometry {\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], LineGeometry.prototype, \"positions\", void 0);\nexport class MeshGeometry extends NodeGeometry {\n #boundingBox;\n #boundingSphere;\n #barycenter;\n get barycenter() {\n return this.#barycenter ??= NodeGeometry.barycenter(this.positions);\n }\n set barycenter(point) {\n this.#barycenter = point;\n }\n get boundingBox() {\n return this.#boundingBox ??= NodeGeometry.boundingBox(this.positions);\n }\n set boundingBox(bbox) {\n this.#boundingBox = bbox;\n }\n get boundingSphere() {\n return this.#boundingSphere;\n }\n set boundingSphere(sphere) {\n this.#boundingSphere = sphere;\n }\n constructor(positions, triangleIndices, textureCoordinates = [], normals = []) {\n super(positions);\n this.triangleIndices = triangleIndices;\n this.textureCoordinates = textureCoordinates;\n this.normals = normals;\n }\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"positions\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"triangleIndices\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"textureCoordinates\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"normals\", void 0);\n", "import { Utils } from '@pacem/pacem-core';\n//namespace Pacem.Drawing3D {\nexport function NotifyChange(callback) {\n return (target, prop, descriptor) => {\n const backingField = `_${prop}_${Utils.uniqueCode()}_backingField`;\n function getter() {\n return this[backingField];\n }\n function setter(val) {\n if (val !== this[backingField]) {\n const old = this[backingField];\n this[backingField] = val;\n callback.call(this, prop, old, val);\n }\n }\n //if (delete target[prop]) {\n Object.defineProperty(target, prop, {\n get: function () {\n return getter.call(this);\n },\n set: function (val) {\n setter.call(this, val);\n },\n enumerable: true,\n configurable: false\n });\n //}\n };\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemConeElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemConeElement = PacemConeElement_1 = class PacemConeElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n const slope = r / height;\n const fY = height / heightSegments;\n const fU = 1.0 / sides;\n // top vertex\n nodes.push({ x: .0, y: height, z: .0 });\n // ======================================\n // side loops\n for (let j = 1; j <= heightSegments; j++) {\n const y = height - fY * j;\n const v = y / height;\n const rj = (height - y) * slope;\n // for loops other than tip loop\n const y_prev = y + fY;\n const v_prev = y_prev / height;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i;\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y, z });\n const index = 1 + sides * (j - 1) + i;\n const index_prev = i == 0 ? index + sides - 1 : index - 1;\n const u = i * fU;\n const u_prev = i == 0 ? (1 - fU) : fU * (i - 1);\n if (j == 1) {\n // tip loop\n // 1 triangle\n indices.push(0, index_prev, index);\n uv.push({ x: u, y: 1 }, { x: u_prev, y: v }, { x: u, y: v });\n continue;\n }\n const prevLoopIndex = 1 + sides * (j - 2) + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(C, A, B);\n indices.push(C, D, A);\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u_prev, y: v };\n const uvC = { x: u, y: v };\n const uvD = { x: u, y: v_prev };\n uv.push(uvC, uvA, uvB);\n uv.push(uvC, uvD, uvA);\n }\n }\n // bottom cap\n const startCapIndex = 1 + (heightSegments - 1) * sides;\n // bottom vertex (pivot)\n nodes.push({ x: .0, y: 0, z: .0 });\n const bottomIndex = startCapIndex + sides;\n // ======================================\n for (let j = 1; j <= capSegments; j++) {\n const rj_norm = j / capSegments;\n const rj = radius * rj_norm;\n // for loops other than bottom vertex loop\n const rj_norm_prev = (j - 1) / capSegments;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i, cos = Math.cos(angle), sin = Math.sin(angle);\n const angle_prev = angle - theta, cos_prev = Math.cos(angle_prev), sin_prev = Math.sin(angle_prev);\n const u = .5 * (1 + cos * rj_norm), v = .5 * (1 + sin * rj_norm);\n const u_prev = .5 * (1 + cos_prev * rj_norm), v_prev = .5 * (1 + sin_prev * rj_norm);\n let index, index_prev;\n if (j != capSegments) {\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y: 0, z });\n index = bottomIndex + 1 + (j - 1) * sides + i;\n index_prev = i == 0 ? index + sides - 1 : index - 1;\n }\n else {\n index = startCapIndex + i;\n index_prev = i == 0 ? startCapIndex + sides - 1 : index - 1;\n }\n if (j == 1) {\n // bottom vertex loop\n // 1 triangle\n indices.push(bottomIndex, index, index_prev);\n uv.push({ x: .5, y: .5 }, { x: u, y: v }, { x: u_prev, y: v_prev });\n continue;\n }\n const prevLoopU = .5 * (1 + cos * rj_norm_prev), prevLoopV = .5 * (1 + sin * rj_norm_prev);\n const prevLoopU_prev = .5 * (1 + cos_prev * rj_norm_prev), prevLoopV_prev = .5 * (1 + sin_prev * rj_norm_prev);\n const prevLoopIndex = bottomIndex + 1 + (j - 2) * sides + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(A, D, B);\n indices.push(B, D, C);\n const uvA = { x: prevLoopU_prev, y: prevLoopV_prev };\n const uvB = { x: u_prev, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: prevLoopU, y: prevLoopV };\n uv.push(uvA, uvD, uvB);\n uv.push(uvB, uvD, uvC);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cone_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemConeElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemConeElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"capSegments\", void 0);\nPacemConeElement = PacemConeElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cone' })\n], PacemConeElement);\nexport { PacemConeElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemCylinderElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemCylinderElement = PacemCylinderElement_1 = class PacemCylinderElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n // top & bottom vertices (pivot @(0,0,0))\n nodes.push({ x: .0, y: height, z: .0 });\n nodes.push({ x: .0, y: .0, z: .0 });\n // ======================================\n // cap loops\n const capRadius = r / capSegments;\n for (let j = 1; j <= capSegments; j++) {\n //int j_prev = j - 1;\n var rho = capRadius * j;\n for (var i = 0; i < sides; i++) {\n const startIndex = 2 + 2 * sides * (j - 1);\n const A = i == 0 ? startIndex + 2 * (sides - 1) : startIndex + 2 * (i - 1);\n const B = startIndex + 2 * i;\n const u = Math.cos(theta * i);\n const v = -Math.sin(theta * i);\n const u_prev = Math.cos(theta * (i - 1.0));\n const v_prev = -Math.sin(theta * (i - 1.0));\n const x = rho * u;\n const z = rho * v;\n const topPoint = { x, y: height, z };\n const bottomPoint = { x, y: .0, z };\n //\n nodes.push(topPoint);\n nodes.push(bottomPoint);\n // coordinates & texture\n const factor = .5 * rho / r;\n const uB = u * factor;\n const vB = v * factor;\n const uA = u_prev * factor;\n const vA = v_prev * factor;\n if (j == 1) {\n const faceIndicesTop = [0 /* top vertex*/, A, B];\n const faceIndicesBottom = [1 /* bottom vertex*/, B + 1, A + 1];\n // texture\n const uvTop = [\n { x: .5, y: .5 },\n { x: .5 + uA, y: .5 - vA },\n { x: 0.5 + uB, y: .5 - vB }\n ];\n const uvBottom = [\n { x: .5, y: .5 },\n { x: 0.5 + uB, y: .5 + vB },\n { x: .5 + uA, y: .5 + vA }\n ];\n // faces\n indices.push(...faceIndicesTop);\n indices.push(...faceIndicesBottom);\n // texture\n for (let i = 0; i < uvTop.length; i++)\n uv.push(uvTop[i]);\n for (let i = 0; i < uvBottom.length; i++)\n uv.push(uvBottom[i]);\n }\n else {\n const startIndexPrevLoop = 2 + 2 * sides * (j - 2);\n const D = i == 0 ? startIndexPrevLoop + 2 * (sides - 1) : startIndexPrevLoop + 2 * (i - 1);\n const C = startIndexPrevLoop + 2 * i;\n // coordinates & texture\n const factor0 = .5 * ((j - 1.0) / capSegments);\n const uC = u * factor0;\n const vC = v * factor0;\n const uD = u_prev * factor0;\n const vD = v_prev * factor0;\n const uvA = { x: .5 + uA, y: .5 - vA };\n const uvB = { x: .5 + uB, y: .5 - vB };\n const uvC = { x: .5 + uC, y: .5 - vC };\n const uvD = { x: .5 + uD, y: .5 - vD };\n const uvA2 = { x: .5 + uA, y: .5 + vA };\n const uvB2 = { x: .5 + uB, y: .5 + vB };\n const uvC2 = { x: .5 + uC, y: .5 + vC };\n const uvD2 = { x: .5 + uD, y: .5 + vD };\n // top\n indices.push(A);\n indices.push(B);\n indices.push(D);\n indices.push(D);\n indices.push(B);\n indices.push(C);\n // bottom\n indices.push(C + 1);\n indices.push(B + 1);\n indices.push(A + 1);\n indices.push(C + 1);\n indices.push(A + 1);\n indices.push(D + 1);\n // textures top\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvD);\n uv.push(uvD);\n uv.push(uvB);\n uv.push(uvC);\n // texture bottom\n uv.push(uvC2);\n uv.push(uvB2);\n uv.push(uvA2);\n uv.push(uvC2);\n uv.push(uvA2);\n uv.push(uvD2);\n }\n }\n }\n // ======================================\n // side loops\n const sideStartIndex = 2 + 2 * sides * (capSegments);\n const capLastIndex = 2 + 2 * sides * (capSegments - 1);\n const fU = 1.0 / sides;\n const fV = 1.0 / heightSegments;\n for (let j = 1; j <= heightSegments; j++) {\n for (let i = 0; i < sides; i++) {\n if (j != heightSegments) {\n var x = r * Math.cos(theta * i);\n var z = -r * Math.sin(theta * i);\n var y = (height * j) / heightSegments;\n //\n nodes.push({ x, y, z });\n }\n const i_prev = i == 0 ? sides - 1 : i - 1;\n const A = j == 1 ? capLastIndex + 2 * i_prev + 1 : sideStartIndex + sides * (j - 2) + i_prev;\n const B = j == 1 ? capLastIndex + 2 * i + 1 : sideStartIndex + sides * (j - 2) + i;\n const C = j == heightSegments ? capLastIndex + 2 * i : sideStartIndex + sides * (j - 1) + i;\n const D = j == heightSegments ? capLastIndex + 2 * i_prev : sideStartIndex + sides * (j - 1) + i_prev;\n const u_prev = i_prev * fU;\n const v_prev = (j - 1) * fV;\n const u = i == 0 ? 1.0 : i * fU;\n const v = j * fV;\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: u_prev, y: v };\n indices.push(A);\n indices.push(B);\n indices.push(C);\n indices.push(A);\n indices.push(C);\n indices.push(D);\n //\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvC);\n uv.push(uvA);\n uv.push(uvC);\n uv.push(uvD);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cylinder_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemCylinderElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemCylinderElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"capSegments\", void 0);\nPacemCylinderElement = PacemCylinderElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cylinder' })\n], PacemCylinderElement);\nexport { PacemCylinderElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemLineElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { LineGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst DEFAULT_LINE = [{ x: 0, y: 0, z: 0 }, { x: 0, y: 1, z: 0 }];\nlet PacemLineElement = PacemLineElement_1 = class PacemLineElement extends Pacem3DPrimitiveElement {\n static createLineGeometry(positions) {\n return new LineGeometry(positions || DEFAULT_LINE);\n }\n createDefaultGeometry() {\n return PacemLineElement_1.createLineGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'positions':\n this.geometry = PacemLineElement_1.createLineGeometry(val);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemLineElement.prototype, \"positions\", void 0);\nPacemLineElement = PacemLineElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-line' })\n], PacemLineElement);\nexport { PacemLineElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemPlaneElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemPlaneElement = PacemPlaneElement_1 = class PacemPlaneElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, length, widthSegments, lengthSegments) {\n width ||= 1.0;\n length ||= 1.0;\n widthSegments ||= 4;\n lengthSegments ||= 4;\n const halfWidth = width * .5, halfLength = length * .5;\n const nodes = [];\n const uv = [];\n const indices = [];\n const normals = [], normal = Geometry.LinearAlgebra.Vector3D.from(0, 0, 1);\n for (let j = 0; j <= lengthSegments; j++) {\n for (let i = 0; i <= widthSegments; i++) {\n const x = -halfWidth + i * width / (1.0 * widthSegments);\n const y = .0;\n const z = -halfLength + j * length / (1.0 * lengthSegments);\n nodes.push({ x, y, z });\n if (j < lengthSegments && i < widthSegments) {\n const rowPoints = widthSegments + 1;\n // const colPoints = lengthSegments + 1;\n const u_next = (i + 1.0) / (1.0 * widthSegments);\n const u = (1.0 * i) / (1.0 * widthSegments);\n const v_next = 1.0 - (j + 1.0) / (1.0 * lengthSegments);\n const v = 1.0 - (1.0 * j) / (1.0 * lengthSegments);\n indices.push((j + 1) * rowPoints + i);\n indices.push((j + 1) * rowPoints + i + 1);\n indices.push(j * rowPoints + i + 1);\n indices.push((j + 1) * rowPoints + i);\n indices.push(j * rowPoints + i + 1);\n indices.push(j * rowPoints + i);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n normals.push(normal, normal, normal, normal, normal, normal);\n }\n }\n }\n const geom = new MeshGeometry(nodes, indices, uv, normals);\n geom.key = `plane_${width}x${length}_w${widthSegments}_l${lengthSegments}`;\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemPlaneElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'length':\n case 'widthSegments':\n case 'lengthSegments':\n this.geometry = PacemPlaneElement_1.createMeshGeometry(this.width, this.length, this.widthSegments, this.lengthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"length\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"lengthSegments\", void 0);\nPacemPlaneElement = PacemPlaneElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-plane' })\n], PacemPlaneElement);\nexport { PacemPlaneElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTetrahedronElement_1, PacemOctahedronElement_1, PacemHexahedronElement_1, PacemIcosahedronElement_1, PacemDodecahedronElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { PacemBoxElement } from './box';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst _utils = {\n parseFloats: function (input) {\n const pattern = /([\\d.-]+)/i;\n var match = pattern.exec(input);\n const ret = [];\n while (match != null) {\n const g = match[0];\n const j = parseFloat(g);\n ret.push(j);\n input = input.replace(g, '');\n match = pattern.exec(input);\n }\n return ret;\n }\n};\nconst Point3D = Geometry.LinearAlgebra.Vector3D;\nexport class PolyhedronElement extends Pacem3DPrimitiveElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'radius') {\n this._assignMeshGeometry(val);\n }\n }\n _assignMeshGeometry(radius) {\n this.geometry = this.createMeshGeometry(radius > .0 ? radius : 1.0);\n }\n createDefaultGeometry() {\n return this.createMeshGeometry(1.0);\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PolyhedronElement.prototype, \"radius\", void 0);\n// #region Tetrahedron\nlet PacemTetrahedronElement = PacemTetrahedronElement_1 = class PacemTetrahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.5774 -0.8165, 0 0.5774 0.8165, 0.8165 -0.5774 0, -0.8165 -0.5774 0\";\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const indices = [1, 2, 0, 2, 3, 0, 3, 1, 0, 3, 2, 1];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.0004995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995\";\n const pointsToParse = textureCoordsString.split(',');\n const texIndices = [4, 5, 6, 7, 8, 9, 10, 11, 0, 3, 2, 1];\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `tetrahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemTetrahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemTetrahedronElement = PacemTetrahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-tetrahedron' })\n], PacemTetrahedronElement);\nexport { PacemTetrahedronElement };\n// #endregion\n// #region Octahedron\nlet PacemOctahedronElement = PacemOctahedronElement_1 = class PacemOctahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n // -------------------------------------------------------------------------------------------------\n const nodesCoordsString = \"0 0.7071 -0.7071, 0 0.7071 0.7071, 1 0 0, 0 -0.7071 -0.7071, -1 0 0, 0 -0.7071 0.7071\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 0, 4, 5, 1, 5, 2, 1, 2, 5, 3, 4, 3, 5];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.9995, 0.0004995 0.5, 0.5 0.9995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.9995\";\n const texIndices = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 20, 21, 1, 2, 22, 23, 4, 3, 5];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `octahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemOctahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemOctahedronElement = PacemOctahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-octahedron' })\n], PacemOctahedronElement);\nexport { PacemOctahedronElement };\n// #endregion\n// #region Hexahedron\nlet PacemHexahedronElement = PacemHexahedronElement_1 = class PacemHexahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const inv_sqrt3 = 1.0 / Math.sqrt(3.0);\n const w = 2.0 * radius * inv_sqrt3;\n const geom = PacemBoxElement.createMeshGeometry(w, w, w);\n geom.key = `hexahedron_${radius}`;\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemHexahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemHexahedronElement = PacemHexahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-hexahedron' })\n], PacemHexahedronElement);\nexport { PacemHexahedronElement };\n// #endregion\n// #region Icosahedron\nlet PacemIcosahedronElement = PacemIcosahedronElement_1 = class PacemIcosahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.850651 -0.525731, 0 0.850651 0.525731, 0.850651 0.525731 0, 0.525731 0 -0.850651, -0.525731 0 -0.850651, -0.850651 0.525731 0, -0.525731 0 0.850651, 0.525731 0 0.850651, 0.850651 -0.525731 0, 0 -0.850651 0.525731, 0 -0.850651 -0.525731, -0.850651 -0.525731 0\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 1, 0,\n 5, 6, 1, 6, 7, 1, 7, 2, 1, 2, 8, 3,\n 2, 7, 8, 6, 9, 7, 9, 8, 7, 8, 10, 3,\n 8, 9, 10, 6, 11, 9, 11, 10, 9, 10, 4, 3,\n 10, 11, 4, 6, 5, 11, 5, 4, 11];\n const textureCoordsString = \"0.5 0.808708, 0.5 0.999501, 0.5 0.808708, 0.191292 0.5, \" +\n \"0.000499547 0.5, 0.5 0.808708, 0.9995 0.5, 0.808708 0.5,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.000499487, 0.5 0.191292,\" +\n \"0.5 0.191292, 0.999501 0.5, 0.5 0.808708, 0.5 0.808708,\" +\n \"0.9995 0.5, 0.808708 0.999501, 0.191292 0.5, 0.808708 0.5,\" +\n \"0.5 0.999501, 0.808708 0.5, 0.999501 0.808708, 0.5 0.999501,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.808708, 0.9995 0.5,\" +\n \"0.808708 0.999501, 0.191292 0.5, 0.808708 0.5, 0.5 0.999501,\" +\n \"0.808708 0.5, 0.999501 0.808708, 0.5 0.808708, 0.5 0.191292,\" +\n \"0.9995 0.5, 0.000499547 0.5, 0.5 0.191292, 0.191292 0.5,\" +\n \"0.5 0.000499487, 0.808708 0.5, 0.5 0.000499487, 0.999501 0.191292,\" +\n \"0.5 0.191292, 0.808708 0.000499487, 0.9995 0.5, 0.5 0.191292,\" +\n \"0.5 0.808708, 0.9995 0.5, 0.5 0.191292, 0.808708 0.000499487,\" +\n \"0.999501 0.5, 0.5 0.808708, 0.5 0.000499487, 0.808708 0.5,\" +\n \"0.999501 0.191292, 0.808708 0.5, 0.5 0.808708, 0.5 0.191292\";\n const texIndices = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 0, 26, 27, 28, 29, 30, 31, 32, 33, 1,\n 34, 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, 7,\n 44, 45, 46, 8, 47, 48, 49, 50, 51, 52, 53, 9,\n 54, 55, 3, 10, 56, 57, 6, 58, 59, 5, 4, 11];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `icosahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemIcosahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemIcosahedronElement = PacemIcosahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-icosahedron' })\n], PacemIcosahedronElement);\nexport { PacemIcosahedronElement };\n// #endregion\n// #region Dodecahedron\nlet PacemDodecahedronElement = PacemDodecahedronElement_1 = class PacemDodecahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const n1 = Point3D.from(0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n2 = Point3D.from(-0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n3 = Point3D.from(0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n4 = Point3D.from(0 * radius, 0.356822 * radius, -0.934172 * radius);\n const n5 = Point3D.from(-0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n6 = Point3D.from(-0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n7 = Point3D.from(0 * radius, 0.356822 * radius, 0.934172 * radius);\n const n8 = Point3D.from(0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n9 = Point3D.from(0.934172 * radius, 0 * radius, -0.356822 * radius);\n const n10 = Point3D.from(0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n11 = Point3D.from(0 * radius, -0.356822 * radius, 0.934172 * radius);\n const n12 = Point3D.from(0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n13 = Point3D.from(0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n14 = Point3D.from(0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n15 = Point3D.from(-0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n16 = Point3D.from(-0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n17 = Point3D.from(0 * radius, -0.356822 * radius, -0.934172 * radius);\n const n18 = Point3D.from(-0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n19 = Point3D.from(-0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n20 = Point3D.from(-0.934172 * radius, 0 * radius, -0.356822 * radius);\n const positions = [\n n1,\n n2,\n n3,\n n4,\n n5,\n n6,\n n7,\n n8,\n n9,\n n10,\n n11,\n n12,\n n13,\n n14,\n n15,\n n16,\n n17,\n n18,\n n19,\n n20\n ];\n const indices = [0, 2, 3, 0, 3, 4, 0, 4, 1, 1, 5, 6, 1, 6, 7,\n 1, 7, 0, 7, 9, 8, 7, 8, 2, 7, 2, 0,\n 7, 6, 10, 7, 10, 11, 7, 11, 9, 11, 13, 12,\n 11, 12, 8, 11, 8, 9, 11, 10, 14, 11, 14, 15,\n 11, 15, 13, 15, 17, 16, 15, 16, 12, 15, 12, 13,\n 15, 14, 18, 15, 18, 19, 15, 19, 17, 19, 4, 3,\n 19, 3, 16, 19, 16, 17, 19, 18, 5, 19, 5, 1,\n 19, 1, 4, 18, 14, 10, 18, 10, 6, 18, 6, 5,\n 3, 2, 8, 3, 8, 12, 3, 12, 16];\n const textureCoordsString = `0.5 0.999501, 0.5 0.999501, 0.191292 0.808708, 0.5 0.690792,\n 0.191292 0.808708, 0.191292 0.808708, 0.5 0.690792,\n 0.808708 0.808708, 0.000499517 0.5, 0.309208 0.5, 0.5 0.309208,\n 0.191292 0.191292, 0.191292 0.191292, 0.309208 0.5,\n 0.191292 0.191292, 0.5 0.000499517, 0.5 0.309208, 0.808708 0.191292,\n 0.000499517 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.309208 0.5,\n 0.191292 0.191292, 0.5 0.000499517, 0.309208 0.5, 0.5 0.000499517,\n 0.808708 0.191292, 0.309208 0.5, 0.808708 0.191292,\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.690792 0.5,\n 0.191292 0.808708, 0.690792 0.5, 0.808708 0.808708,\n 0.191292 0.808708, 0.808708 0.808708, 0.808708 0.808708,\n 0.5 0.690792, 0.5 0.309208, 0.808708 0.808708, 0.5 0.309208,\n 0.808708 0.191292, 0.808708 0.191292, 0.9995 0.5, 0.191292 0.191292,\n 0.5 0.000499517, 0.808708 0.191292, 0.191292 0.191292,\n 0.808708 0.191292, 0.690792 0.5, 0.191292 0.191292,\n 0.690792 0.5, 0.191292 0.191292, 0.5 0.000499517, 0.808708 0.191292,\n 0.191292 0.191292, 0.808708 0.191292, 0.690792 0.5,\n 0.690792 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\n 0.690792 0.5, 0.191292 0.808708, 0.5 0.000499517, 0.808708 0.191292,\n 0.690792 0.5, 0.5 0.000499517, 0.690792 0.5, 0.309208 0.5,\n 0.309208 0.5, 0.191292 0.191292, 0.9995 0.5, 0.808708 0.808708,\n 0.5 0.690792, 0.9995 0.5, 0.5 0.690792, 0.5 0.309208,\n 0.9995 0.5, 0.5 0.309208, 0.309208 0.5, 0.690792 0.5,\n 0.808708 0.808708, 0.309208 0.5, 0.808708 0.808708,\n 0.5 0.999501, 0.000499517 0.5, 0.5 0.309208, 0.000499517 0.5,\n 0.5 0.690792, 0.5 0.690792, 0.000499517 0.5, 0.5 0.690792,\n 0.191292 0.191292`;\n const texIndices = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,\n 44, 45, 0, 46, 47, 48, 49, 50, 51, 7, 52, 53,\n 54, 55, 56, 57, 58, 59, 60, 61, 9, 62, 63, 64,\n 65, 66, 67, 11, 68, 69, 70, 71, 72, 73, 74, 75,\n 76, 77, 13, 78, 79, 80, 81, 82, 83, 15, 84, 85,\n 86, 87, 88, 89, 90, 91, 92, 93, 17, 94, 95, 96,\n 97, 98, 99, 19, 1, 4, 100, 14, 101, 102, 10, 103,\n 18, 6, 5, 104, 2, 105, 106, 8, 107, 3, 12, 16];\n // -------------------------------------------------------------------------------------------------\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `dodecahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemDodecahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemDodecahedronElement = PacemDodecahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-dodecahedron' })\n], PacemDodecahedronElement);\nexport { PacemDodecahedronElement };\n// #endregion\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemSphereElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemSphereElement = PacemSphereElement_1 = class PacemSphereElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, segs = 8) {\n //\n const nodes = [];\n const uv = [];\n const indices = [];\n //\n const r = radius, tessellation = segs;\n const theta = DEG2RAD * (360.0 / tessellation);\n const segments = tessellation % 2 == 0 ? tessellation / 2 : (tessellation - 1) / 2;\n // top vertex\n nodes.push({ x: .0, y: r, z: .0 });\n for (let j = 1; j < segments; j++) {\n // loop \"latitude\"\n const angle1 = theta * j;\n const cos_angle1 = Math.cos(angle1);\n const sin_angle1 = Math.sin(angle1);\n const v = 1.0 - 1.0 * j / segments;\n for (let i = 0; i < tessellation; i++) {\n // loop \"longitude\"\n const angle2 = theta * i - Math.PI / 2.0;\n const cos_angle2 = Math.cos(angle2);\n const sin_angle2 = Math.sin(angle2);\n const x = r * sin_angle1 * cos_angle2;\n const y = r * cos_angle1;\n const z = r * sin_angle1 * sin_angle2;\n nodes.push({ x, y, z });\n // coordinates & texture\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n // triangles\n if (j == 1) {\n indices.push(1 + i);\n indices.push(1 + i_prev);\n indices.push(0);\n //\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: .5, y: 1.0 });\n }\n else {\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 1) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i + 1);\n //\n const v_prev = 1.0 - (j - 1.0) / segments;\n //var faceUV = [];\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v_prev });\n }\n }\n }\n // bottom vertex\n nodes.push({ x: .0, y: -r, z: .0 });\n const last = nodes.length - 1;\n for (let i = 0; i < tessellation; i++) {\n const j = segments - 2;\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n const v = 1.0 - (j + 1.0) / segments;\n // triangles\n indices.push(last);\n indices.push(j * tessellation + 1 + i_prev);\n indices.push(j * tessellation + 1 + i);\n uv.push({ x: .5, y: 0 });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `sphere_${radius}_s${segs}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemSphereElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'segments':\n this.geometry = PacemSphereElement_1.createMeshGeometry(this.radius, this.segments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"segments\", void 0);\nPacemSphereElement = PacemSphereElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-sphere' })\n], PacemSphereElement);\nexport { PacemSphereElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTorusElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemTorusElement = PacemTorusElement_1 = class PacemTorusElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, innerRadius = .25, segments = 24, sides = 12) {\n //\n const nodes = [];\n const uv = [];\n const coords = [];\n const theta = DEG2RAD * (360.0 / segments);\n const phi = DEG2RAD * (360.0 / sides);\n const r1 = radius;\n const r2 = innerRadius;\n for (let j = 0; j < segments; j++) {\n // Math.PI/2 adjustement (useful for UV mapping)\n const angle1 = theta * j - Math.PI / 2.0;\n const sin_angle1 = Math.sin(angle1);\n const cos_angle1 = Math.cos(angle1);\n for (let i = 0; i < sides; i++) {\n // Math.PI adjustement (useful for UV mapping)\n const angle2 = phi * i + Math.PI;\n const cos_angle2 = Math.cos(angle2);\n const x = r1 * cos_angle1 + r2 * cos_angle2 * cos_angle1;\n const y = r2 * Math.sin(angle2);\n const z = r1 * sin_angle1 + r2 * cos_angle2 * sin_angle1;\n nodes.push({ x, y, z });\n const prev_j = j > 0 ? j - 1 : segments - 1;\n const prev_i = i > 0 ? i - 1 : sides - 1;\n const u = j == 0 ? .0 : 1.0 - 1.0 * j / segments;\n const v = i > 0 ? 1.0 * i / sides : 1.0;\n const u_prev = j > 0 ? 1.0 - (j - 1.0) / segments : 1.0 / segments;\n const v_prev = i > 0 ? (i - 1.0) / sides : 1.0 - 1.0 / sides;\n // triangles <=> Int32Collection\n // <=> PointCollection\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + i);\n //\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n }\n const geom = new MeshGeometry(nodes, coords, uv);\n geom.key = `torus_${radius}x${innerRadius}_t${segments}_s${sides}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemTorusElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'innerRadius':\n case 'segments':\n case 'sides':\n this.geometry = PacemTorusElement_1.createMeshGeometry(this.radius, this.innerRadius, this.segments, this.sides);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"innerRadius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"segments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"sides\", void 0);\nPacemTorusElement = PacemTorusElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-torus' })\n], PacemTorusElement);\nexport { PacemTorusElement };\n", "import { CustomEventUtils, Utils } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { isCamera } from '../types';\nfunction _clipPoint(evt, rect) {\n let x, y;\n if (Point.isPoint(evt)) {\n x = evt.x;\n y = evt.y;\n }\n else {\n const { page } = CustomEventUtils.getEventCoordinates(evt);\n const p = { x: page.x - rect.x, y: page.y - rect.y };\n x = p.x;\n y = p.y;\n }\n const clipX = x / rect.width * 2 - 1;\n const clipY = y / rect.height * -2 + 1;\n return { x: clipX, y: clipY };\n}\nexport class AdapterUtils {\n static isMeshGeometry(obj) {\n return 'positions' in obj && Utils.isArray(obj.positions)\n && 'triangleIndices' in obj && Utils.isArray(obj.triangleIndices);\n }\n static isVector3D(obj) {\n return 'x' in obj && typeof obj.x === 'number'\n && 'y' in obj && typeof obj.y === 'number'\n && 'z' in obj && typeof obj.z === 'number';\n }\n static isRgba(obj) {\n return 'r' in obj && typeof obj.r === 'number'\n && 'g' in obj && typeof obj.g === 'number'\n && 'b' in obj && typeof obj.b === 'number';\n }\n static flattenVectorArray(array) {\n const retval = [];\n for (let v of array) {\n if (AdapterUtils.isVector3D(v)) {\n retval.push(v.x, v.y, v.z);\n }\n else if (AdapterUtils.isRgba(v)) {\n retval.push(v.r, v.g, v.b, v.a ?? 1);\n }\n else {\n retval.push(v.x, v.y);\n }\n }\n return retval;\n }\n static findCamera(items) {\n return (items || []).find(r => isCamera(r) && !r.hide);\n }\n clipPixel(evt, viewport) {\n if (viewport instanceof HTMLElement) {\n viewport = Utils.offsetRect(viewport);\n }\n return _clipPoint(evt, viewport);\n }\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomElementUtils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isUi3DObject, Pacem3DAdapterElement, Pacem3DObjectElement, Pacem3DGroupElement, Pacem3DLightElement, Pacem3DCameraElement, Pacem3DPerspectiveCameraElement, Pacem3DOrthographicCameraElement, Pacem3DMeshElement } from '../types';\nimport { MeshGeometry, LineGeometry } from '../geometry';\nimport { AdapterUtils } from './shared';\nimport { isStandardMaterial, isPhongMaterial, isLambertMaterial, isLineMaterial, isMaterial } from '../materials/material';\n//namespace Pacem.Components.Drawing3D {\nfunction isMeshGeometry(obj) {\n return AdapterUtils.isMeshGeometry(obj);\n}\nfunction isVector3D(obj) {\n return AdapterUtils.isVector3D(obj);\n}\nfunction flattenVectorArray(array) {\n return AdapterUtils.flattenVectorArray(array);\n}\nconst threeJsVersion = '0.152.2', lastOrbitCtrlJsVersion = '0.147.0';\n;\nconst consts = {\n VERSION: threeJsVersion,\n API_URI: `https://unpkg.com/three@${threeJsVersion}/build/three.min.js`,\n ORBIT_URI: `https://unpkg.com/three@${lastOrbitCtrlJsVersion}/examples/js/controls/OrbitControls.js`,\n LOADERS: [\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/OBJLoader.js`,\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/MTLLoader.js`,\n ],\n DEFAULT_MATERIAL: function () {\n return new THREE.MeshStandardMaterial({ color: '#069', flatShading: true });\n }\n};\nfunction matrix3DToMatrix4(m) {\n const matrix = new THREE.Matrix4();\n matrix.set(m.m11, m.m12, m.m13, m.m14, m.m21, m.m22, m.m23, m.m24, m.m31, m.m32, m.m33, m.m34, m.offsetX, m.offsetY, m.offsetZ, m.m44);\n return matrix;\n}\n// as of https://codepen.io/discoverthreejs/full/vwVeZB\nfunction fitCameraToSelection(camera, controls /* OrbitControls */, selection, fitOffset = 1.333) {\n const box = new THREE.Box3();\n for (const object of selection) {\n box.expandByObject(object);\n }\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z);\n const fitHeightDistance = maxSize / (2 * Math.atan(Math.PI * camera.fov / 360));\n const fitWidthDistance = fitHeightDistance / camera.aspect;\n const distance = fitOffset * Math.max(fitHeightDistance, fitWidthDistance);\n const hasControls = !Utils.isNull(controls);\n var direction;\n if (hasControls) {\n direction = controls.target.clone()\n .sub(camera.position)\n .normalize()\n .multiplyScalar(distance);\n controls.maxDistance = distance * 10;\n controls.target.copy(center);\n }\n camera.near = distance / 100;\n camera.far = distance * 100;\n camera.updateProjectionMatrix();\n if (hasControls) {\n camera.position.copy(controls.target).sub(direction);\n controls.update();\n }\n}\nfunction flattenMatrix3D(m) {\n return [\n // right way to translate the matrix3D to matrix4\n m.m11, m.m21, m.m31, m.offsetX,\n m.m12, m.m22, m.m32, m.offsetY,\n m.m13, m.m23, m.m33, m.offsetZ,\n m.m14, m.m24, m.m34, m.m44,\n ];\n}\nfunction nodeGeometryToBufferGeometry(mesh) {\n const geometry = new THREE.BufferGeometry();\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n if (mesh instanceof MeshGeometry) {\n if (!Utils.isNullOrEmpty(mesh.triangleIndices)) {\n geometry.setIndex(mesh.triangleIndices);\n }\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n const uvs = flattenVectorArray(mesh.textureCoordinates);\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\n if (Utils.isNullOrEmpty(mesh.normals)) {\n geometry.computeVertexNormals();\n }\n else {\n const normals = flattenVectorArray(mesh.normals);\n geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));\n }\n }\n return geometry;\n}\nfunction lightToLight(item) {\n var light;\n switch (item.type) {\n case 'spot':\n const spotLight = new THREE.SpotLight();\n spotLight.target.position.set(item.target.x, item.target.y, item.target.z);\n light = spotLight;\n break;\n default:\n light = new THREE.PointLight();\n break;\n }\n return light;\n}\nfunction materialToMaterial(material) {\n if (Utils.isNull(material)) {\n return null;\n }\n const lineBase = {\n color: typeof material.color === 'string' ? material.color : Colors.stringify(material.color),\n opacity: material.opacity ?? 1,\n transparent: true,\n wireframe: material.wireframe ?? false,\n visible: material.visible ?? true\n };\n const base = Utils.extend({}, lineBase, { wireframe: material.wireframe ?? false });\n const mipMapMaterial = (m) => {\n if (material.map) {\n m['map'] = new THREE.TextureLoader().load(material.map, _ => {\n // console.log('texture loaded!');\n m.needsUpdate = true;\n });\n }\n return m;\n };\n if (isStandardMaterial(material)) {\n const std = mipMapMaterial(new THREE.MeshStandardMaterial(Utils.extend(base, {\n roughness: material.roughness,\n metalness: material.metalness,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n refractionRatio: material.refractionRatio,\n })));\n return std;\n }\n else if (isPhongMaterial(material)) {\n const phong = mipMapMaterial(new THREE.MeshPhongMaterial(Utils.extend(base, {\n shininess: material.shininess,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n specular: material.specularColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return phong;\n }\n else if (isLambertMaterial(material)) {\n const lambert = mipMapMaterial(new THREE.MeshLambertMaterial(Utils.extend(base, {\n emissive: material.emissiveColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return lambert;\n }\n else if (isLineMaterial(material)) {\n const dash = material.dashArray && material.dashArray[0] || null, gap = material.dashArray && material.dashArray.length > 1 && material.dashArray[1] || dash;\n const lineMatOptions = Utils.extend(lineBase, {\n linecap: material.lineCap ?? 'round',\n linejoin: material.lineJoin ?? 'round',\n linewidth: material.lineWidth ?? 1\n });\n return Utils.isNullOrEmpty(material.dashArray) ?\n new THREE.LineBasicMaterial(lineMatOptions)\n : new THREE.LineDashedMaterial(Utils.extend({ dashSize: dash, gapSize: gap }, lineMatOptions));\n }\n else if (isMaterial(material)) {\n const basic = mipMapMaterial(new THREE.MeshBasicMaterial(base));\n return basic;\n }\n else {\n return null;\n }\n}\nfunction materialToMaterials(frontMaterial, backMaterial, multiAllowed) {\n // material\n const multi = multiAllowed;\n // composite\n const materials = [];\n // front mat\n const material = materialToMaterial(frontMaterial);\n if (!Utils.isNull(material)) {\n material.side = THREE.FrontSide;\n materials.push(material);\n }\n // back mat\n if (!Utils.isNull(backMaterial)) {\n if (backMaterial == frontMaterial) {\n material.side = THREE.DoubleSide;\n }\n else {\n // multi-material\n const backsideMaterial = materialToMaterial(backMaterial);\n if (!Utils.isNull(backsideMaterial)) {\n backsideMaterial.side = THREE.BackSide;\n materials.push(backsideMaterial);\n }\n }\n }\n return multi && materials.length > 1 ? materials : material;\n}\nfunction load(item) {\n if (!Utils.isNullOrEmpty(item.content)) {\n const type = item.type?.toLowerCase();\n switch (type) {\n case 'obj':\n const obj = new THREE['OBJLoader']();\n return obj.parse(item.content);\n default:\n const loader = new THREE.ObjectLoader();\n return loader.parse(item.content);\n }\n }\n else {\n throw new Error('Missing content.');\n }\n}\nfunction meshType(geometry) {\n return geometry instanceof LineGeometry ? THREE.Line : THREE.Mesh;\n}\nfunction build(mesh) {\n if (Utils.isNullOrEmpty(mesh.geometry)) {\n return null;\n }\n const ctor = meshType(mesh.geometry);\n return new ctor();\n}\nfunction isTHREEAvailable() {\n return 'THREE' in window;\n}\nasync function whenTHREEAvailable(...args) {\n const start = Date.now();\n var initialized = false;\n do {\n initialized = isTHREEAvailable();\n for (let pred of args) {\n initialized &&= pred();\n }\n if (!initialized) {\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n } while (!initialized && (Date.now() - start) < 30000);\n if (!initialized) {\n throw new Error('The wait for THREE adapter initialization timed out.');\n }\n}\nlet Pacem3DThreeAdapterElement = class Pacem3DThreeAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this._renderer = null;\n this._camera = null;\n this._scene = null;\n this._orbitCtrls = null;\n this._objects = new WeakMap();\n this._dict = {};\n this._orbitControlsDelegate = (_) => {\n };\n this._ensureAndRefresh = (item, object3D, parent) => {\n object3D.matrixAutoUpdate = false;\n // choose whether to render the object or not\n if (object3D.visible = !item.hide) {\n // the modeling part\n // 1. pacem 3d mesh\n if (isMesh(item)) {\n let mesh3D = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Geometry) >= 0) {\n mesh3D.geometry.dispose();\n // swap Line <-> Mesh according to the geometry\n const mesh3D2 = build(item);\n if (mesh3D2.constructor.name !== mesh3D.constructor.name) {\n parent.remove(object3D);\n delete this._dict[object3D.id];\n object3D = mesh3D = mesh3D2;\n }\n // /swap\n mesh3D.geometry = nodeGeometryToBufferGeometry(item.geometry);\n }\n if (item.flags.indexOf(StalePropertyFlag.Material) >= 0) {\n if (Utils.isArray(mesh3D.material)) {\n for (let m of mesh3D.material) {\n m.dispose();\n }\n }\n else {\n mesh3D.material.dispose();\n }\n mesh3D.material = materialToMaterials(item.material) || consts.DEFAULT_MATERIAL();\n }\n }\n // 2. 3d 'native' object\n else if (item instanceof Pacem3DObjectElement\n && (item.flags.indexOf(StalePropertyFlag.Material) >= 0 || item.flags.indexOf(StalePropertyFlag.Geometry) >= 0)) {\n // swap reference\n object3D.parent && object3D.parent.remove(object3D);\n object3D = load(item);\n }\n // 3. grouping object\n else if (item instanceof Pacem3DGroupElement) {\n if (item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n // remove all children\n for (let j = object3D.children.length - 1; j >= 0; j--) {\n const child = object3D.children[j];\n object3D.remove(child);\n }\n // re-create\n for (let child of item.items) {\n this._addOrUpdateItem(child, object3D);\n }\n }\n }\n // 4. light\n else if (item instanceof Pacem3DLightElement) {\n const light = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Light) >= 0) {\n light.color = new THREE.Color(item.color);\n light.intensity = item.intensity;\n }\n }\n // the configuring part\n let posv = item.position; // || new THREE.Vector3(0, 0, 0);\n if (isUi3DObject(item)\n && !Utils.isNull(item.transformMatrix)\n && (item.flags.indexOf(StalePropertyFlag.Position) >= 0 || item.flags.indexOf(StalePropertyFlag.Transform) >= 0)) {\n const positionMatrix = Geometry.LinearAlgebra.Matrix3D.from(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, posv.x, posv.y, posv.z, 1);\n // item.transformMatrix is a local matrix thus\n // prepend in the multiplication (i.e. FIRST apply transform THEN apply positioning)\n const transformMatrix = Geometry.LinearAlgebra.Matrix3D.multiply(item.transformMatrix, positionMatrix);\n THREE.Matrix4.prototype.set.apply(object3D.matrix, flattenMatrix3D(transformMatrix));\n //object3D.updateMatrix();\n }\n else if (item.flags.indexOf(StalePropertyFlag.Position) >= 0) {\n object3D.position.set(posv.x, posv.y, posv.z);\n object3D.updateMatrix();\n }\n }\n object3D.userData = item.tag;\n if (Utils.isNull(parent.getObjectById(object3D.id))) {\n parent.add(object3D);\n this._dict[object3D.id] = item;\n }\n // clear flags\n item.flags.splice(0);\n return object3D;\n };\n //#endregion\n }\n _assertMonoStage(scene) {\n if (scene != this._3d && !Utils.isNull(this._3d)) {\n throw new Error('Stage mismatch.');\n }\n }\n dispose(scene) {\n // do nothing\n }\n snapshot(scene, background, type, quality) {\n if (scene != this._3d) {\n return Promise.resolve(null);\n }\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render();\n Utils.snapshotElement(this._stage, background, mime, compression).then(resolve);\n });\n }\n project(scene, point3D) {\n this._assertMonoStage(scene);\n // check feasibility\n if (Utils.isNull(this._camera) || Utils.isNull(this._stage))\n return null;\n //\n const stage = this._stage;\n const vector = new THREE.Vector3(point3D.x, point3D.y, point3D.z);\n const width = stage.width, height = stage.height;\n const widthHalf = width / 2, heightHalf = height / 2;\n const point = vector.project(this._camera);\n const x = (point.x * widthHalf) + widthHalf;\n const y = -(point.y * heightHalf) + heightHalf;\n return { x: x, y: y };\n }\n zoomFit(scene, ...items) {\n this._assertMonoStage(scene);\n return new Promise((resolve, reject) => {\n const camera = this._camera;\n const map = this._objects;\n const targets = items.filter(o => map.has(o)).map(o => map.get(o));\n if (Utils.isNull(camera) || Utils.isNullOrEmpty(targets)) {\n resolve();\n }\n fitCameraToSelection(camera, this._orbitCtrls, targets);\n resolve();\n });\n }\n getScene(scene) {\n this._assertMonoStage(scene);\n return this._scene;\n }\n raycast(scene, point, size, callback) {\n this._assertMonoStage(scene);\n if (isTHREEAvailable() && !Utils.isNull(this._camera)) {\n const camera = this._camera;\n const vector = new THREE.Vector2((point.x / size.width) * 2 - 1, -(point.y / size.height) * 2 + 1);\n const raycaster = new THREE.Raycaster();\n raycaster.setFromCamera(vector, camera);\n const intersects = raycaster.intersectObjects(this._scene.children, true);\n let obj;\n let intersection;\n let j = 0;\n while (intersects.length > j && (intersection = intersects[j++]) && (obj = intersection.object)) {\n const item = this._dict[obj.id];\n if (item.inert) {\n continue;\n }\n const v = intersection.point, x = v.x, y = v.y, z = v.z, point = { x, y, z };\n callback({ object: this._dict[obj.id], point });\n return;\n }\n }\n callback(null);\n }\n // #region ABSTRACT IMPLEMENTATION\n async initialize(container) {\n if (!Utils.isNull(this._stage)) {\n return this._stage;\n }\n this._3d = container;\n const wrapper = container.stage;\n const stage = this._stage = document.createElement('canvas');\n wrapper.innerHTML = '';\n wrapper.appendChild(stage);\n if (!isTHREEAvailable()) {\n await CustomElementUtils.importjs(consts.API_URI);\n await whenTHREEAvailable();\n await Promise.all([CustomElementUtils.importjs(consts.ORBIT_URI)]\n .concat(consts.LOADERS.map(js => CustomElementUtils.importjs(js))));\n }\n // here comes THREE.js\n this._scene = new THREE.Scene();\n // this._scene.add(new THREE.Mesh(new THREE.PlaneGeometry(1, 1, 1, 1), consts.DEFAULT_MATERIAL()));\n this.invalidateSize(container);\n let w = this._stage.width, h = this._stage.height;\n //if (!ctrl.renderer)\n let parameters = {\n canvas: stage, antialias: true, stencil: false, alpha: container.transparent ?? true //, clearAlpha: 1\n };\n this._renderer = new THREE.WebGLRenderer(parameters);\n this._renderer.setSize(w, h);\n if (container.background && !container.transparent) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n this._renderer.setClearColor(theejsClr, clr.a);\n }\n this.orbit = container.orbit;\n return stage;\n }\n _setCamera(cam) {\n this._camera = cam;\n this.invalidateSize(this._3d);\n this._disposeOrbitControls();\n // re-init\n if (this.orbit) {\n this._initOrbitControls();\n }\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'orbit') {\n if (val === true)\n this._initOrbitControls();\n else\n this._disposeOrbitControls();\n }\n }\n _initOrbitControls() {\n const cam = this._camera;\n if (Utils.isNull(this._3d) || Utils.isNull(cam)) {\n return;\n }\n const controls = this._orbitCtrls = new THREE['OrbitControls'](cam, this._3d.stage);\n controls.addEventListener('change', this._orbitControlsDelegate);\n }\n _disposeOrbitControls() {\n const controls = this._orbitCtrls;\n if (Utils.isNull(controls)) {\n return;\n }\n controls.removeEventListener('change', this._orbitControlsDelegate);\n controls.dispose();\n }\n _updateRenderer(container, renderer = this._renderer) {\n if (!container.transparent) {\n if (container.background) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n renderer.setClearColor(theejsClr, clr.a);\n }\n else {\n renderer.setClearColor(null);\n }\n }\n else {\n renderer.setClearAlpha(0);\n }\n }\n invalidateSize(scene, size = scene.size) {\n this._assertMonoStage(scene);\n if (!isTHREEAvailable() || Utils.isNull(size)) {\n return;\n }\n let w = size.width;\n let h = size.height;\n this._stage.width = w;\n this._stage.height = h;\n let camera = this._camera;\n if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n if (this._renderer) {\n this._renderer.setSize(w, h);\n this._updateRenderer(scene);\n }\n }\n removeItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n const obj3d = bag.get(item);\n if (!Utils.isNull(obj3d)) {\n this._scene.remove(obj3d);\n delete this._dict[obj3d.id];\n bag.delete(item);\n }\n }\n updateItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n if (!Utils.isNull(item.parent) && bag.has(item.parent)) {\n const parent3d = bag.get(item.parent);\n this._addOrUpdateItem(item, parent3d);\n }\n else {\n this._addOrUpdateItem(item);\n }\n }\n addItem(scene, item) {\n this._assertMonoStage(scene);\n this._addOrUpdateItem(item);\n }\n _addOrUpdateItem(item, parent = this._scene) {\n if (!isTHREEAvailable() || Utils.isNull(parent)) {\n return;\n }\n if (item instanceof Pacem3DCameraElement) {\n if (item instanceof Pacem3DPerspectiveCameraElement) {\n var pcam;\n if (this._camera instanceof THREE.PerspectiveCamera) {\n var pcam = this._camera;\n }\n else {\n pcam = new THREE.PerspectiveCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n pcam.lookAt(lookAtVector);\n pcam.position.set(item.position.x, item.position.y, item.position.z);\n pcam.fov = item.fov;\n pcam.aspect = item.aspect;\n pcam.near = item.near;\n pcam.far = item.far;\n //\n this._setCamera(pcam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === pcam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else if (item instanceof Pacem3DOrthographicCameraElement) {\n // bunch of duplicated code\n // no need to refactor since it's a deprecating branch of development\n var ocam;\n if (this._camera instanceof THREE.OrthographicCamera) {\n var ocam = this._camera;\n }\n else {\n ocam = new THREE.OrthographicCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n ocam.lookAt(lookAtVector);\n ocam.position.set(item.position.x, item.position.y, item.position.z);\n ocam.left = item.left;\n ocam.right = item.right;\n ocam.top = item.top;\n ocam.bottom = item.bottom;\n ocam.near = item.near;\n ocam.far = item.far;\n //\n this._setCamera(ocam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === ocam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else {\n // cam not supported\n throw new Error(`Camera ${item} not supported.`);\n }\n }\n else {\n if (!this._objects.has(item)) {\n // adding\n const then = (object3D) => {\n // clear flags\n // item.flags.splice(0);\n if (object3D) {\n object3D = this._ensureAndRefresh(item, object3D, parent);\n this._objects.set(item, object3D);\n }\n else {\n // object not built\n // throw?\n }\n };\n // TODO: switch to interface matching\n if (item instanceof Pacem3DObjectElement) {\n const mesh = load(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DMeshElement) {\n // beware! a change in the geometry could cause a change in the object3D type\n const mesh = build(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DLightElement) {\n const light = lightToLight(item);\n then(light);\n }\n else if (item instanceof Pacem3DGroupElement) {\n const group = new THREE.Group();\n then(group);\n }\n }\n else {\n // updating\n const obj = this._objects.get(item);\n const objOut = this._ensureAndRefresh(item, obj, parent);\n if (objOut != obj) {\n this._objects.set(item, objOut);\n }\n }\n }\n }\n render() {\n if (this._camera) {\n this._renderer.render(this._scene, this._camera);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DThreeAdapterElement.prototype, \"orbit\", void 0);\nPacem3DThreeAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-three-adapter' })\n], Pacem3DThreeAdapterElement);\nexport { Pacem3DThreeAdapterElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElementUtils, CustomElement, P, Watch, PropertyConverters, PropertyChangeEvent, PropertyChangeEventName, Debounce, Utils, Logging, Components } from '@pacem/pacem-core';\nimport { Strings } from '@pacem/pacem-foundation';\nimport { Pacem3DAdapterElement, StalePropertyFlag } from '../../types';\nimport { Renderers, WebGPUIssueCause } from './renderer';\n//namespace Pacem.Components.Drawing3D {\nconst WEBGPU_RAYCAST_CALLBACK_PROP = 'WebGPURaycastCallback';\nconst WEBGPU_RAYCAST_PIXEL_PROP = 'WebGPURaycastPixel';\nconst GETVAL = CustomElementUtils.getAttachedPropertyValue, SETVAL = CustomElementUtils.setAttachedPropertyValue, DELVAL = CustomElementUtils.deleteAttachedPropertyValue;\nlet Pacem3DWgslScriptElement = class Pacem3DWgslScriptElement extends Components.PacemItemElement {\n findContainer() {\n return CustomElementUtils.findAncestor(this, n => n instanceof Pacem3DWebgpuAdapterElement);\n }\n #version = '';\n get version() {\n return this.#version;\n }\n #observer = new MutationObserver(() => {\n this.wgsl = this.textContent;\n });\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.wgsl = this.textContent;\n this.#observer.observe(this, { characterData: true });\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'wgsl') {\n this._computeVersion(val);\n }\n }\n _computeVersion(wgsl = this.wgsl) {\n Strings.hash(wgsl).then(v => {\n if (v !== this.#version) {\n const old = this.#version;\n const val = v;\n this.#version = val;\n const evt = new PropertyChangeEvent({ propertyName: 'version', oldValue: old, currentValue: val, firstChange: Utils.isNullOrEmpty(old) });\n this.dispatchEvent(evt);\n }\n });\n }\n disconnectedCallback() {\n this.#observer.disconnect();\n super.disconnectedCallback();\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"wgsl\", void 0);\nPacem3DWgslScriptElement = __decorate([\n CustomElement({ tagName: P + '-3d-wgsl-script' })\n], Pacem3DWgslScriptElement);\nexport { Pacem3DWgslScriptElement };\nlet Pacem3DWebgpuAdapterElement = class Pacem3DWebgpuAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this.#items = [];\n this._scriptVersionChangeHandler = (evt) => {\n const { propertyName: name } = evt.detail;\n if (name === 'version') {\n this._parseWgslModifiers(evt.detail.currentValue);\n }\n };\n this.#scenes = new Set();\n this.#renderers = new Map();\n this.#supported = true;\n this.#active = true;\n this.#sceneToUpdate = new WeakMap();\n }\n invalidateSize(stage, size = stage.size) {\n const renderer = this._ensureRenderer(stage);\n renderer?.resize(size);\n }\n #items;\n get items() {\n return this.#items;\n }\n register(item) {\n const items = this.#items;\n if (item instanceof Pacem3DWgslScriptElement && !items.includes(item)) {\n item.addEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.push(item);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n unregister(item) {\n const items = this.#items;\n const ndx = items.indexOf(item);\n if (ndx >= 0) {\n item.removeEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.splice(ndx, 1);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n #scenes;\n #renderers;\n #supported;\n #active;\n get supported() {\n return this.#supported;\n }\n get active() {\n return this.#active;\n }\n _webGPUNotSupported(issue) {\n if (this.#supported && issue.cause === WebGPUIssueCause.NotSupported) {\n this.#supported = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'supported', oldValue: null, currentValue: false }));\n }\n if (this.#active) {\n this.#active = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'active', oldValue: null, currentValue: false }));\n }\n }\n initialize(scene) {\n const set = this.#renderers;\n const scenes = this.#scenes;\n if (!scenes.has(scene)) {\n scenes.add(scene);\n }\n return Renderers.create(scene, { enableValidation: this.enableValidation ?? false, modifiers: this.modifiers })\n .then(renderer => {\n set.get(scene)?.update( /* empty */);\n // update dictionary with the actual renderer\n set.set(scene, renderer);\n // assign datasource immediately\n this._updatePipeline(scene);\n return renderer.canvas;\n }, (issue) => {\n this.log(Logging.LogLevel.Error, issue.message);\n this._webGPUNotSupported(issue);\n return null;\n });\n }\n _parseWgslModifiers(val) {\n const scripts = this.#items, vertexGeometryScript = scripts.find(a => a.type == 'vertex-input'), vertexOutputScript = scripts.find(a => a.type == 'vertex-output'), fragmentScript = scripts.find(a => a.type == 'fragment');\n const vertexInput = vertexGeometryScript?.wgsl, vertexOutput = vertexOutputScript?.wgsl, fragment = fragmentScript?.wgsl;\n this.modifiers = { vertexInput, vertexOutput, fragment, version: val };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'modifiers':\n case 'enableValidation':\n // reinitialize\n this._reinitialize();\n break;\n }\n }\n disconnectedCallback() {\n const set = this.#renderers;\n for (let [_, renderer] of set) {\n renderer?.dispose();\n }\n set.clear();\n this.#scenes.clear();\n super.disconnectedCallback();\n }\n dispose(scene) {\n const renderers = this.#renderers, scenes = this.#scenes;\n ;\n if (renderers.has(scene)) {\n renderers.get(scene)?.dispose();\n renderers.delete(scene);\n }\n if (scenes.has(scene)) {\n scenes.delete(scene);\n }\n }\n _reinitialize() {\n for (let scene of this.#scenes.values()) {\n // rebuild renderer with new config in association to scene\n this.initialize(scene);\n }\n }\n _ensureRenderer(scene) {\n const set = this.#renderers;\n return set.get(scene);\n }\n _updatePipeline(scene) {\n const renderer = this._ensureRenderer(scene);\n renderer?.update(...scene.datasource);\n }\n #sceneToUpdate;\n /**\n * Called when scene datasource changes.\n * @param scene\n */\n render(scene) {\n // do not render hidden stages\n const width = scene.size?.width, height = scene.size?.height;\n if (!(width > 0) || !(height > 0)) {\n return;\n }\n // retrieve stage renderer\n const renderer = this._ensureRenderer(scene);\n if (Utils.isNull(renderer)) {\n return;\n }\n if (this.#sceneToUpdate.has(scene)) {\n this.#sceneToUpdate.delete(scene);\n this._itemsChangedExec(scene);\n }\n // draw\n const pixel = GETVAL(scene, WEBGPU_RAYCAST_PIXEL_PROP);\n renderer.render({ cursor: pixel, time: performance.now(), resolution: { width, height } });\n // raycast, just in case\n if (!scene.interactive) {\n return;\n }\n const callback = GETVAL(scene, WEBGPU_RAYCAST_CALLBACK_PROP);\n if (Utils.isNullOrEmpty(callback)) {\n return;\n }\n if (Utils.isNullOrEmpty(pixel)) {\n callback(null);\n return;\n }\n // draw again\n renderer.raycast(pixel).then(array => {\n if (Utils.isNullOrEmpty(array)) {\n callback(null);\n }\n else {\n const retval = {\n object: array[0], point: null\n };\n callback(retval);\n }\n });\n }\n snapshot(scene, background, type, quality) {\n const renderers = this.#renderers;\n if (!renderers.has(scene)) {\n return Promise.resolve(null);\n }\n const { canvas } = renderers.get(scene);\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render(scene);\n Utils.snapshotElement(canvas, background, mime, compression).then(resolve);\n });\n }\n raycast(stage, point, size, callback) {\n SETVAL(stage, WEBGPU_RAYCAST_CALLBACK_PROP, callback);\n if (point.x < 0 || point.y < 0 || point.x >= size.width || point.y >= size.height) {\n DELVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP);\n }\n else {\n SETVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP, point);\n }\n }\n _itemsChangedExec(stage) {\n this._updatePipeline(stage);\n }\n _itemsChanged(stage, _) {\n this.#sceneToUpdate.set(stage, true);\n }\n addItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n removeItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n updateItem(stage, item) {\n // if 'hide' property has changed or 'children' property (for groups)\n // then there's need to regenerate the tree view (camera switch, more/less meshes, ...)\n if (Utils.isNull(item)\n || item.flags.indexOf(StalePropertyFlag.Visibility) >= 0\n || item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n this._itemsChanged(stage, item);\n }\n }\n zoomFit(stage, ...items) {\n // TODO: implement on the renderer side\n return Promise.resolve();\n }\n project(stage, point3D) {\n // TODO: implement on the renderer side\n return { x: 0, y: 0 };\n }\n getScene(stage) {\n // no 3rd-party/proprietary scene objects to provide.\n return stage;\n }\n};\n__decorate([\n Debounce(100)\n], Pacem3DWebgpuAdapterElement.prototype, \"_parseWgslModifiers\", null);\n__decorate([\n Watch({ emit: false })\n], Pacem3DWebgpuAdapterElement.prototype, \"modifiers\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DWebgpuAdapterElement.prototype, \"enableValidation\", void 0);\nPacem3DWebgpuAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-webgpu-adapter' })\n], Pacem3DWebgpuAdapterElement);\nexport { Pacem3DWebgpuAdapterElement };\n", "import { Utils, P, Logging } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isCamera, isLight, isGroup } from '../../types';\nimport { AdapterUtils } from '../shared';\nimport { LABEL_PREFIX, GPUTextureUsage } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\nimport { Raycasters } from './raycaster';\nimport { RenderableBuffers, RenderLooper, ManagedBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nexport var WebGPUIssueCause;\n(function (WebGPUIssueCause) {\n WebGPUIssueCause[WebGPUIssueCause[\"NotSupported\"] = 0] = \"NotSupported\";\n WebGPUIssueCause[WebGPUIssueCause[\"Disabled\"] = 1] = \"Disabled\";\n})(WebGPUIssueCause || (WebGPUIssueCause = {}));\nexport class Renderers {\n static create(stage, config) {\n return new Promise((resolve, reject) => {\n if (!navigator.gpu) {\n const message = \"WebGPU not supported.\";\n const issue = { message, cause: WebGPUIssueCause.NotSupported };\n reject(issue);\n }\n else {\n const retval = new RendererClass(stage);\n retval.init(config).then(_ => resolve(retval), error => {\n const message = typeof error === 'string' ? error : error.message;\n const issue = { message, cause: WebGPUIssueCause.Disabled };\n reject(issue);\n });\n }\n });\n }\n}\nfunction getDefaultCamera(stage) {\n return {\n bottom: -1, top: 1, left: -1, right: 1, near: .1, far: 200, lookAt: Vector3D.from(0, 0, 0), up: Vector3D.j(), position: Vector3D.from(0, 0, 1), type: \"orthographic\",\n flags: [], stage\n };\n}\nfunction destroyTextures(...textures) {\n for (let tex of textures || []) {\n tex?.destroy();\n }\n}\nclass RendererClass {\n #stage;\n #canvas;\n #context;\n #renderables;\n #geometries;\n #materials;\n #looper;\n #textures;\n #config;\n #disabled;\n // interaction buffer\n #interactionBuffer;\n // interaction buffer underlying data\n #interaction;\n constructor(stage) {\n this.#renderables = new WeakMap();\n this.#geometries = new WeakMap();\n this.#materials = new WeakMap();\n this.#config = { enableValidation: false };\n this.#disabled = false;\n this._logError = (evt) => {\n const stage = this.#stage, logger = stage.logger;\n if (!Utils.isNull(logger)) {\n const error = 'error' in evt ? evt.error : evt;\n logger.log(Logging.LogLevel.Error, error.message, 'WebGPU');\n }\n };\n this.#rebuildingContext = true;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n this.#hasModifiers = false;\n const wrapper = (this.#stage = stage).stage;\n const canvas = document.createElement('canvas');\n canvas.id = P + '_3d_stage_' + Utils.uniqueCode();\n // cleanup\n wrapper.innerHTML = '';\n wrapper.appendChild(this.#canvas = canvas);\n // interaction stuff\n this.#interactionBuffer = ManagedBuffers.create(this.#interaction = {\n time: performance.now(), cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n });\n }\n _buildPassDescriptor({ multisample, format }) {\n const { context, device } = this.#context;\n const canvasTexture = context.getCurrentTexture();\n let textures = this.#textures;\n if (Utils.isNull(textures)) {\n textures = {};\n if (multisample) {\n const renderTex = device.createTexture({\n label: LABEL_PREFIX + 'render-texture',\n format: format ?? canvasTexture.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.render = {\n texture: renderTex, view: renderTex.createView({ label: LABEL_PREFIX + 'render-texture-view' })\n };\n const depthTex = device.createTexture({\n label: LABEL_PREFIX + 'depth-texture',\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.depth = {\n texture: depthTex, view: depthTex.createView({ label: LABEL_PREFIX + 'depth-texture-view' })\n };\n }\n this.#textures = textures;\n }\n const { transparent, background } = this.#stage;\n const backColor = transparent ? { r: 0, g: 0, b: 0, a: 0 } : background ? (typeof background === 'string' ? Colors.parse(background) : background) : { r: 0, g: 0, b: 0, a: 1 };\n const bgColor = AdapterUtils.flattenVectorArray([backColor]);\n const canvasTexView = canvasTexture.createView({ label: LABEL_PREFIX + 'canvas-texture-view' });\n const colorAttachment = {\n view: canvasTexView,\n clearValue: bgColor,\n loadOp: 'clear',\n storeOp: 'store',\n };\n const passDescriptor = {\n colorAttachments: [colorAttachment]\n };\n if (multisample) {\n const renderTexView = textures.render.view;\n const depthTexView = textures.depth.view;\n passDescriptor.depthStencilAttachment = {\n view: depthTexView,\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n stencilClearValue: 0,\n stencilReadOnly: true,\n };\n // override\n colorAttachment.view = renderTexView;\n colorAttachment.resolveTarget = canvasTexView;\n }\n return passDescriptor;\n }\n ;\n _buildContext(canvas = this.#canvas, size = this.#stage.size) {\n size ??= canvas;\n let w = size.width;\n let h = size.height;\n const devicePixelRatio = 1; // window.devicePixelRatio;\n canvas.width = w * devicePixelRatio;\n canvas.height = h * devicePixelRatio;\n const context = canvas.getContext('webgpu');\n const textureFormat = navigator.gpu.getPreferredCanvasFormat();\n return { context, textureFormat };\n }\n _buildUpContext(device, adapter, context, format) {\n const { transparent } = this.#stage;\n context.configure({\n alphaMode: transparent ? 'premultiplied' : 'opaque',\n device,\n format,\n });\n this.#context = { device, adapter, canvas: this.#canvas, context, format };\n this.#rebuildingContext = false;\n }\n async init(config) {\n this.#config = config;\n const adapter = await navigator.gpu.requestAdapter();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU adapter unavalable or disabled.');\n }\n const device = await adapter.requestDevice();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU device unavalable or disabled.');\n }\n device.addEventListener('uncapturederror', this._logError);\n // set flag for shader modifiers presence, this will be used to determine whether to update the interaction buffer on each render call\n this.#hasModifiers = !Utils.isNull(config.modifiers?.version) && !Utils.isNull(config.modifiers)\n && (!Utils.isNull(config.modifiers.vertexInput) || !Utils.isNull(config.modifiers.vertexOutput) || !Utils.isNull(config.modifiers.fragment));\n const { context, textureFormat: format } = this._buildContext();\n this._buildUpContext(device, adapter, context, format);\n }\n #rebuildingContext;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n #hasModifiers;\n /**\n * Render procedure.\n */\n render(interaction) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper) || !(this.#canvas.width > 0) || !(this.#canvas.height > 0)) {\n return;\n }\n const context = this.#context, device = context.device, \n // looper\n looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n if (this.#hasModifiers) {\n // update underlying interaction data, this will trigger buffer update\n Utils.extend(this.#interaction, interaction);\n }\n const multisample = true;\n const passDescriptor = this._buildPassDescriptor({ multisample });\n // rendering zone\n const commandEncoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'renderer' });\n const pass = commandEncoder.beginRenderPass(passDescriptor);\n // loop\n looper.loop((mesh, camera, lights) => {\n if (mesh.item.hide) {\n // this code branching is NOT NEEDED ANYMORE,\n // remove it safely\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n const renderables = [mesh, camera, ...lights];\n // inject here (pipeline options) any global rendering data (time, cursor, etc.) that may be needed by the shader modifiers\n const pipeline = RenderPipelines.create(context, renderables, { multisample: true, modifiers: this.#config.modifiers });\n // render\n pipeline.frame(pass, this.#interactionBuffer, ...renderables);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n pass.end();\n device.queue.submit([commandEncoder.finish()]);\n }\n set disabled(v) {\n this.#disabled = v;\n }\n get disabled() {\n return this.#disabled;\n }\n raycast(pixel) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper)) {\n return Promise.resolve([]);\n }\n const context = this.#context, device = context.device, looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n // rendering zone\n const raycaster = Raycasters.createColorPicking(context);\n raycaster.begin();\n // loop\n looper.loop((mesh, camera) => {\n if (mesh.item.hide) {\n // TODO: remove unwraps and move to nested loops\n // in order to centralize hidden renderable skip logic\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n raycaster.frame(this.#interactionBuffer, mesh, camera);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n return raycaster.end(pixel);\n }\n _disposeRenderableJustInCase(item) {\n const store = this.#renderables;\n if (store.has(item)) {\n store.get(item)?.destroy();\n store.delete(item);\n }\n }\n _createOrYieldRenderable(item, geometries = this.#geometries, materials = this.#materials) {\n item.stage ??= this.#stage;\n const store = this.#renderables;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = RenderableBuffers.create(item, geometries));\n }\n return found;\n }\n _createOrYieldGeometry(item) {\n const store = this.#geometries;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _createOrYieldMaterial(item) {\n const store = this.#materials;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _unwrapBuffers(grp, accumulator) {\n accumulator ??= { meshes: [], lights: [], cameras: [], groups: [] };\n for (let itemBuffer of grp.children) {\n itemBuffer.item.stage ??= this.#stage;\n if (isMesh(itemBuffer.item)) {\n accumulator.meshes.push(itemBuffer);\n }\n if (isCamera(itemBuffer.item)) {\n accumulator.cameras.push(itemBuffer);\n }\n if (isLight(itemBuffer.item)) {\n accumulator.lights.push(itemBuffer);\n }\n if (isGroup(itemBuffer.item)) {\n accumulator.groups.push(itemBuffer);\n this._unwrapBuffers(itemBuffer, accumulator);\n }\n }\n return accumulator;\n }\n ;\n _update(array) {\n const groupBuffers = [];\n const meshBuffers = [];\n const lightBuffers = [];\n const factory = i => this._createOrYieldRenderable(i);\n let camera;\n for (let item of array) {\n if (item.hide) {\n // remove stored renderable just in case\n this._disposeRenderableJustInCase(item);\n continue;\n }\n // ensure stage\n item.stage ??= this.#stage;\n // groups\n if (isGroup(item)) {\n const g = item;\n if (g.flags.includes(StalePropertyFlag.Children)) {\n this.#renderables.delete(g);\n }\n groupBuffers.push(factory(g));\n }\n // meshes\n if (isMesh(item) && item.geometry) {\n // build pipelines based on provided element wrappers (cached buffers)\n this._createOrYieldGeometry(item.geometry);\n if (!Utils.isNull(item.material)) {\n this._createOrYieldMaterial(item.material);\n }\n meshBuffers.push(factory(item));\n }\n // lights\n if (isLight(item)) {\n lightBuffers.push(factory(item));\n }\n if (isCamera(item)) {\n // pick the first only\n camera ??= item;\n }\n }\n // find first active camera\n camera ??= getDefaultCamera(this.#stage);\n const cameraBuffer = factory(camera);\n let accumulator = {\n meshes: meshBuffers, lights: lightBuffers, cameras: [cameraBuffer], groups: groupBuffers\n };\n for (let groupBuffer of groupBuffers) {\n accumulator = this._unwrapBuffers(groupBuffer, accumulator);\n }\n // destroy leftovers\n this.#looper?.items.meshes.forEach(buffer => {\n if (!meshBuffers.includes(buffer)) {\n buffer.destroy();\n }\n });\n this.#looper = new RenderLooper(accumulator);\n }\n update(...items) {\n this._update(Array.from(items));\n }\n dispose() {\n this.#looper = null;\n if (this._disposeContext()) {\n const { device } = this.#context;\n device.removeEventListener('uncapturederror', this._logError);\n device.destroy;\n }\n }\n _disposeContext() {\n const ctx = this.#context;\n if (Utils.isNull(ctx)) {\n return false;\n }\n // dispose associated raycasters, if any\n Raycasters.dispose(ctx);\n // dispose associated pipelines, if any\n RenderPipelines.dispose(ctx);\n // dispose textures\n const textures = this.#textures;\n this.#textures = null;\n if (!Utils.isNull(textures)) {\n const { render, depth } = textures;\n destroyTextures(render?.texture, depth?.texture);\n }\n // dispose context\n ctx.context.unconfigure();\n return true;\n }\n resize(size) {\n this.#rebuildingContext = true;\n if (this._disposeContext()) {\n const { device, adapter } = this.#context;\n const { context, textureFormat: format } = this._buildContext(this.canvas, size);\n this._buildUpContext(device, adapter, context, format);\n // interaction\n if (this.#hasModifiers) {\n Utils.extend(this.#interaction, { resolution: size });\n }\n }\n }\n get canvas() {\n return this.#canvas;\n }\n}\n", "//namespace Pacem.Drawing3D.WebGPU {\nexport const LABEL_PREFIX = 'pacem-3d-';\nexport const U32_MAX = 4_294_967_295;\n// #region vertex state\nexport const VERTEX_BUFFER_INDEX_MESH_POSITION = 0;\nexport const VERTEX_BUFFER_INDEX_MESH_NORMAL = 1;\nexport const VERTEX_BUFFER_INDEX_MESH_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_NORMAL = 0;\nexport const VERTEX_OUTPUT_LOCATION_VERTEX = 1;\nexport const VERTEX_OUTPUT_LOCATION_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_INDEX = 3;\nexport const VERTEX_OUTPUT_LOCATION_RAY = 4;\nexport const VERTEX_OUTPUT_LOCATION_INSTANCE = 5;\nexport const UNIFORM_GROUP_INDEX_TRANSFORM = 1;\nexport const UNIFORM_GROUP_INDEX_CAMERA = 0;\nexport const UNIFORM_GROUP_INDEX_INTERACTION = UNIFORM_GROUP_INDEX_CAMERA; // put it in camera same binding group\nexport const STORAGE_GROUP_INDEX_LINE = 2;\nexport const UNIFORM_GROUP_INDEX_COLORPICKING = 2;\nexport const UNIFORM_BINDING_INDEX_TRANSFORM = 0;\nexport const UNIFORM_BINDING_INDEX_CAMERA = 0;\nexport const UNIFORM_BINDING_INDEX_INTERACTION = 1;\n// #endregion\n// #region fragment state\nexport const MATERIAL_GROUP_INDEX = 2;\nexport const UNIFORM_GROUP_INDEX_LIGHTING = MATERIAL_GROUP_INDEX + 1;\nexport const STORAGE_MATERIAL_INDEX = 0;\nexport const SAMPLER_BINDING_INDEX = 1;\nexport const TEXTURE_BINDING_INDEX = 2;\nexport const MATERIAL_REFERENCE = 'material';\nexport const VERTEX_COLOR_REFERENCE = 'color';\nexport const AMBIENT_COLOR_REFERENCE = 'ambient';\nexport const LIGHTING_COLOR_REFERENCE = 'lighting';\n// #endregion\n// #region WGSL\nexport const WGSL_VERTEXINPUT_STRUCT_NAME = 'VertexInput';\nexport const WGSL_VERTEXOUTPUT_STRUCT_NAME = 'VertexOutput';\nexport const WGSL_INTERACTIONDATA_STRUCT_NAME = 'InteractionData';\n// #endregion\n// Kinda polyfill for WebGPU constants, as TypeScript 6.0 does include WebGPU types but does NOT include these constants for magic numbers:\nexport var GPUBufferUsage;\n(function (GPUBufferUsage) {\n GPUBufferUsage[GPUBufferUsage[\"COPY_SRC\"] = 4] = \"COPY_SRC\";\n GPUBufferUsage[GPUBufferUsage[\"COPY_DST\"] = 8] = \"COPY_DST\";\n GPUBufferUsage[GPUBufferUsage[\"INDEX\"] = 16] = \"INDEX\";\n GPUBufferUsage[GPUBufferUsage[\"INDIRECT\"] = 256] = \"INDIRECT\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_READ\"] = 1] = \"MAP_READ\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_WRITE\"] = 2] = \"MAP_WRITE\";\n GPUBufferUsage[GPUBufferUsage[\"QUERY_RESOLVE\"] = 512] = \"QUERY_RESOLVE\";\n GPUBufferUsage[GPUBufferUsage[\"STORAGE\"] = 128] = \"STORAGE\";\n GPUBufferUsage[GPUBufferUsage[\"UNIFORM\"] = 64] = \"UNIFORM\";\n GPUBufferUsage[GPUBufferUsage[\"VERTEX\"] = 32] = \"VERTEX\";\n})(GPUBufferUsage || (GPUBufferUsage = {}));\nexport var GPUTextureUsage;\n(function (GPUTextureUsage) {\n GPUTextureUsage[GPUTextureUsage[\"COPY_SRC\"] = 1] = \"COPY_SRC\";\n GPUTextureUsage[GPUTextureUsage[\"COPY_DST\"] = 2] = \"COPY_DST\";\n GPUTextureUsage[GPUTextureUsage[\"RENDER_ATTACHMENT\"] = 16] = \"RENDER_ATTACHMENT\";\n GPUTextureUsage[GPUTextureUsage[\"STORAGE_BINDING\"] = 8] = \"STORAGE_BINDING\";\n GPUTextureUsage[GPUTextureUsage[\"TEXTURE_BINDING\"] = 4] = \"TEXTURE_BINDING\";\n})(GPUTextureUsage || (GPUTextureUsage = {}));\nexport var GPUShaderStage;\n(function (GPUShaderStage) {\n GPUShaderStage[GPUShaderStage[\"VERTEX\"] = 1] = \"VERTEX\";\n GPUShaderStage[GPUShaderStage[\"FRAGMENT\"] = 2] = \"FRAGMENT\";\n GPUShaderStage[GPUShaderStage[\"COMPUTE\"] = 4] = \"COMPUTE\";\n})(GPUShaderStage || (GPUShaderStage = {}));\nexport var GPUMapMode;\n(function (GPUMapMode) {\n GPUMapMode[GPUMapMode[\"READ\"] = 1] = \"READ\";\n GPUMapMode[GPUMapMode[\"WRITE\"] = 2] = \"WRITE\";\n})(GPUMapMode || (GPUMapMode = {}));\n", "import { Utils } from '@pacem/pacem-core';\nimport { isMesh, isCamera, isLight, isMeshGeometry } from '../../types';\nimport { KnownShader, isLineMaterial } from '../../materials/material';\nimport { WGSLBindingType } from './abstractions';\nimport { LABEL_PREFIX, MATERIAL_GROUP_INDEX, UNIFORM_GROUP_INDEX_LIGHTING, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_INTERACTION, UNIFORM_BINDING_INDEX_INTERACTION, STORAGE_MATERIAL_INDEX, STORAGE_GROUP_INDEX_LINE, SAMPLER_BINDING_INDEX, TEXTURE_BINDING_INDEX, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE, UNIFORM_GROUP_INDEX_COLORPICKING, GPUShaderStage } from './constants';\nimport { BufferLayouts } from './buffers';\nimport { BasicMaterial, LineMaterial } from './materials';\nimport { getMeshVertexWgsl } from './wgsl/mesh-vertex';\nimport { getDefaultLineVertexWgsl, getFatLineVertexWgsl } from './wgsl/line-vertex';\nimport { getColorPickingFragmentWgsl } from './wgsl/object-picking-fragment';\nimport { textureMap } from './wgsl/texture-fragment';\nimport { directionalLight } from './wgsl/directional-light-fragment';\nimport { omniLight } from './wgsl/omni-light-fragment';\nimport { ambientLight } from './wgsl/ambient-light-fragment';\nimport { RenderableBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\n// #region constants\nconst labelPrefix = LABEL_PREFIX;\nconst DefaultPipelineOptions = {\n multisample: true,\n packedVertices: true,\n primitive: {\n topology: 'triangle-list',\n frontFace: 'ccw',\n cullMode: 'back'\n }\n};\nconst EMPTY_BIND_DELEGATE = (_) => { };\nexport class RenderPipelines {\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n const cache = memoizer.get(ctx);\n if (!Utils.isNull(cache)) {\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n static createColorPicking(ctx, items) {\n const renderPipeline = RenderPipelines.create(ctx, items);\n if (renderPipeline instanceof MeshRenderPipelineClass\n || renderPipeline instanceof LineRenderPipelineClass) {\n return {\n frame: renderPipeline.raycast\n };\n }\n return null;\n }\n static create(ctx, [mesh, camera, ...lights], pipelineOptions) {\n const memoizer = RenderPipelines._memoizer;\n let cache = memoizer.get(ctx);\n if (Utils.isNull(cache)) {\n memoizer.set(ctx, cache = new Map());\n }\n //const camera = items.find(i => isCamera(i.item));\n //const lights = items.filter(i => isLight(i.item));\n //// find main object\n //const mesh = items.find(i => isMesh(i.item));\n if (!Utils.isNull(mesh)) {\n if (isMesh(mesh.item)) {\n const isMesh = isMeshGeometry(mesh.item.geometry);\n const isLine = !isMesh && isLineMaterial(mesh.item.material);\n if (!isMesh && !isLine) {\n throw new Error('Pipeline not implemented, given the provided mesh argument.');\n }\n const builder = isMesh ? new MeshWGSLBuilder(mesh, camera, ...lights)\n : new LineWGSLBuilder(mesh, camera);\n // cache peek for sudden return\n const key = builder.key + (pipelineOptions?.modifiers?.version ?? '');\n const found = cache.get(key);\n if (found) {\n return found;\n }\n const pipeline = isMesh ? new MeshRenderPipelineClass(ctx, builder)\n : new LineRenderPipelineClass(ctx, builder);\n // no cache -> build it\n pipeline.build(pipelineOptions);\n const retval = pipeline;\n Utils.extend(retval, {\n id: key + '-' + ctx.canvas.width + 'x' + ctx.canvas.height + '-' + Utils.Dates.now().toISOString()\n });\n cache.set(key, retval);\n return retval;\n }\n else {\n throw new ReferenceError('Pipeline not implemented, given thst the first argument is not a mesh.');\n }\n }\n else {\n throw new Error('Pipeline not implemented, given the provided arguments.');\n }\n }\n}\nclass RenderPipelineCache {\n constructor() {\n this.#cache = new Map();\n }\n #cache;\n ensureBindGroup({ device }, item, buffers, refresh, layout, label, callback = () => { }) {\n const cache = this.#cache;\n const key = typeof item === 'string' ? item : item.key;\n let set = cache.get(key);\n if (Utils.isNull(set)) {\n cache.set(key, set = new Map());\n }\n if (refresh || !set.has(label)) {\n const entries = buffers.map((item, index) => {\n const entry = {\n binding: index,\n resource: {\n buffer: item\n }\n };\n return entry;\n });\n const descriptor = {\n label,\n layout,\n entries\n };\n // custom config happens here\n callback(descriptor);\n const retval = device.createBindGroup(descriptor);\n set.set(label, retval);\n return retval;\n }\n else {\n return set.get(label);\n }\n }\n}\nclass MeshWGSLBuilder {\n #lights = [];\n #mesh;\n #camera;\n #bindgroups = new Map();\n #key = { shader: 'basic', lights: '' };\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#lights.splice(0);\n this.#mesh = null;\n this.#bindgroups.clear();\n this.#key = { shader: 'basic', lights: '' };\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#mesh)) {\n this.#mesh = obj;\n const material = obj.item.material ?? { shader: KnownShader.Basic };\n this.#key.shader = material.shader + '-' + (material.map ? 'map' : 'nomap');\n }\n else {\n throw new Error('Mesh already added.');\n }\n }\n else if (isLight(obj.item)) {\n const lights = this.#lights;\n lights.push(obj);\n this.#key.lights += ('-' + obj.item.type);\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n // add interaction\n }\n build(modifiers) {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex({ inputModifier: modifiers?.vertexInput, outputModifier: modifiers?.vertexOutput }), fragment = this.fragment(data, { modifier: modifiers?.fragment }), bindings = (...args) => MeshWGSLBuilder.prototype.bindgroup.apply(this, args);\n const metadata = {\n lightCount: this.#lights.length,\n mapCount: this.#mesh.item.material?.map ? 1 : 0\n };\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata\n };\n }\n get key() {\n const { shader, lights } = this.#key;\n // TODO: consider backMap\n return `mesh-` + shader + lights;\n //return `mesh-${shader}${(hasTexture ? '-map' : '-nomap')}`;\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(options) {\n return getMeshVertexWgsl(options);\n }\n _computeBasicData() {\n const mesh = this.#mesh.item, lights = this.#lights, material = mesh.material, hasTexture = !Utils.isNull(material?.texture), hasLighting = !Utils.isNullOrEmpty(lights);\n const shader = Utils.isNull(mesh) ? KnownShader.Basic : (mesh.material?.shader ?? KnownShader.Basic);\n const materialBindGroupIndex = MATERIAL_GROUP_INDEX, lightingBindGroupIndex = UNIFORM_GROUP_INDEX_LIGHTING;\n return {\n hasTexture, hasLighting, shader,\n materialBindGroupIndex,\n lightingBindGroupIndex,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const { hasTexture, materialBindGroupIndex, lightingBindGroupIndex } = data;\n const bindgroups = this.#bindgroups, lights = this.#lights;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: materialBindGroupIndex, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n if (hasTexture) {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, { key: 'texture', group: materialBindGroupIndex, type: 'texture' }]);\n }\n else {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material]);\n }\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n // lights\n const lArr = lights.map((_, ndx) => {\n return { key: 'light', group: lightingBindGroupIndex, binding: ndx, type: 'buffer' };\n });\n lArr.push(...lArr);\n // interaction\n bindgroups.set(WGSLBindingType.Interaction, [{ key: 'interaction', group: UNIFORM_GROUP_INDEX_INTERACTION, type: 'buffer', binding: UNIFORM_BINDING_INDEX_INTERACTION }]);\n }\n fragment(data = this._computeBasicData(), options) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n const merge = (x) => {\n for (let definition of x.definitions ?? []) {\n if (extra.definitions.indexOf(definition) === -1) {\n extra.definitions.push(definition);\n }\n }\n if (!Utils.isNullOrEmpty(x.bindings)) {\n extra.bindings.push(...x.bindings);\n }\n if (!Utils.isNullOrEmpty(x.modifiers)) {\n extra.modifiers.push(...x.modifiers);\n }\n };\n /* TODO: consider injecting customizations (options.modifier) into `WGSLFragmentExtra`*/\n switch (data.shader) {\n case KnownShader.Basic:\n // texture\n if (data.hasTexture) {\n const materialGroupIndex = data.materialBindGroupIndex;\n const wgslTex = textureMap({ inputColor: VERTEX_COLOR_REFERENCE, outputColors: [VERTEX_COLOR_REFERENCE], uv: 'uv' }, materialGroupIndex);\n merge(wgslTex);\n }\n // lights\n let lightIndex = 0;\n const lights = this.#lights;\n for (let lightBuffer of lights) {\n const light = lightBuffer.item; // TODO: consider implementing Pacem.Drawing3D.WebGPU.Light interface (as of Materials)\n switch (light.type) {\n case 'direction':\n const dirLightExtra = directionalLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal' }, data.lightingBindGroupIndex, lightIndex);\n merge(dirLightExtra);\n break;\n case 'omni':\n const omniLightExtra = omniLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal', position: 'vertex', /*specularColor: MATERIAL_REFERENCE + '.specularColor', shininess: MATERIAL_REFERENCE + '.shininess'*/ }, data.lightingBindGroupIndex, lightIndex);\n merge(omniLightExtra);\n break;\n case 'ambient':\n const ambLightExtra = ambientLight({ inputColor: VERTEX_COLOR_REFERENCE, outputColor: AMBIENT_COLOR_REFERENCE }, data.lightingBindGroupIndex, lightIndex);\n merge(ambLightExtra);\n break;\n }\n lightIndex++;\n }\n return BasicMaterial.fragment(extra, options);\n }\n }\n}\nconst PipelineUtils = {\n writeBufferConditionally: (device, buffer) => {\n if (!buffer.fresh) {\n return;\n }\n device.queue.writeBuffer(buffer.buffer, 0, buffer.value);\n }\n};\nclass MeshRenderPipelineClass {\n constructor(_context, _builder, _cache = new RenderPipelineCache()) {\n this._context = _context;\n this._builder = _builder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureU32idBindGroup = (item, buffer, refresh) => {\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, this._pickBindGroupLayout, labelPrefix + 'mesh-colorpick-bind-group');\n };\n this._ensureMaterialBindGroup = (item, buffer, texture, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindGroupLayouts[layoutIndex], label = labelPrefix + 'material-bind-group';\n if (layout.label !== (labelPrefix + 'material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, layout, label, (descriptor) => {\n const { device } = this.context;\n const entries = descriptor.entries /* entries are build as array in the method */;\n if (texture) {\n entries.push({\n binding: SAMPLER_BINDING_INDEX, resource: device.createSampler({\n addressModeU: 'repeat',\n addressModeV: 'repeat',\n magFilter: 'linear',\n minFilter: 'linear',\n })\n }, {\n binding: TEXTURE_BINDING_INDEX, resource: texture.createView()\n });\n }\n });\n };\n this._ensureWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'mesh-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-transforms-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [buffer], refresh, layout, label);\n };\n this._ensureCameraProjectionAndInteractionDataBindGroup = (item, viewBuffer, interactionBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-view-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [viewBuffer, interactionBuffer], refresh, layout, label);\n };\n this._ensureLightingBindGroup = (lights, refresh, layoutIndex = UNIFORM_GROUP_INDEX_LIGHTING) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = lights.map(l => l.id).join(':');\n const buffers = lights.map(l => l.buffer.buffer);\n return this._cache.ensureBindGroup(this._context, key, buffers, refresh, layout, labelPrefix + 'mesh-lighting-bind-group');\n };\n this._bindGroupLayouts = [];\n this._bindVertex = EMPTY_BIND_DELEGATE;\n this._bindPicker = EMPTY_BIND_DELEGATE;\n this._bindWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindRaycastCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindLighting = EMPTY_BIND_DELEGATE;\n this._bindMaterial = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, interactionBuffer, meshBuffer, cameraBuffer, ...lightBuffers) => {\n // set\n pass.setPipeline(this._pipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindWorldTransform(pass, meshBuffer);\n this._bindMaterial(pass, meshBuffer);\n this._bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindLighting(pass, ...lightBuffers);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices?.length || geometry.positions.length);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, interactionBuffer, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickPipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindRaycastWorldTransform(pass, meshBuffer);\n this._bindRaycastCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindPicker(pass, meshBuffer);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices.length);\n }\n catch (e) { }\n };\n this._key = _builder.key;\n }\n get context() {\n return this._context;\n }\n get key() {\n return this._key;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._builder, wgsl = builder.build(options.modifiers);\n const ctx = Utils.extend({ pipeline: this }, this._context);\n const device = ctx.device;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: options.packedVertices ?\n [\n // packed\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3, 3, 2),\n ]\n : [\n // position\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3),\n // normal\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_NORMAL, 3),\n // uv\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_UV, 2)\n ]\n };\n // bind group layouts\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n },\n // interaction\n {\n binding: UNIFORM_BINDING_INDEX_INTERACTION,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-view-bind-group-layout'\n });\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-transforms-bind-group-layout'\n });\n const bindGroupLayouts = [viewBindGroupLayout, worldBindGroupLayout];\n // #endregion\n // #region FRAGMENT\n // TODO: https://stackoverflow.com/questions/50720534/implementing-depth-testing-for-semi-transparent-objects\n // Weighted Blended Order-Independent Transparency https://jcgt.org/published/0002/02/09/\n // a-buffer: https://webgpu.github.io/webgpu-samples/?sample=a-buffer#composite.wgsl\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n // material / texture\n const { mapCount } = wgsl.metadata, hasTex = mapCount > 0;\n if (hasTex) {\n materialBindGroupLayoutDescriptorEntries.push({ visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX, sampler: {} }, ...Array(mapCount).keys().map(index => { return { visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX + 1 + index, texture: {} }; }));\n }\n else {\n }\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // lighting\n const lightingGroupIndex = bindGroupLayouts.length;\n const { lightCount } = wgsl.metadata, hasLighting = lightCount > 0;\n if (hasLighting) {\n const lightingBindGroupLayout = device.createBindGroupLayout({\n entries: [...Array(lightCount).keys()].map((_, index) => {\n return {\n visibility: GPUShaderStage.FRAGMENT, binding: index, buffer: {\n type: 'uniform'\n }\n };\n }),\n label: labelPrefix + 'lighting-bind-group-layout'\n });\n bindGroupLayouts.push(lightingBindGroupLayout);\n }\n // #endregion\n // #region PIPELINE\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'mesh-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-render-pipeline-layout',\n bindGroupLayouts: (this._bindGroupLayouts = bindGroupLayouts)\n }),\n primitive: options.primitive\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._pipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'mesh-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'mesh-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(UNIFORM_GROUP_INDEX_COLORPICKING)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-colorpick-pipeline-layout',\n bindGroupLayouts: [viewBindGroupLayout, worldBindGroupLayout, pickFragGroupLayout]\n }),\n primitive: options.primitive,\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickPipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // vertex buffers\n const bindVertexSplit = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer: positions } = meshBuffer.buffer(ctx, 'geometryPositions');\n const { buffer: normals } = meshBuffer.buffer(ctx, 'geometryNormals');\n const { buffer: uv } = meshBuffer.buffer(ctx, 'geometryTexCoords');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, positions);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_NORMAL, normals);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_UV, uv);\n };\n const bindVertexPacked = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer } = meshBuffer.buffer(ctx, 'geometry');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, buffer);\n };\n this._bindVertex = options.packedVertices ? bindVertexPacked : bindVertexSplit;\n // world transform\n const bindWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, worldTransform.fresh /*false*/ /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, false);\n };\n this._bindRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices and interaction data\n const bindCameraProjectionAndInteractionData = (pass, cameraBuffer, interactionBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n // camera view\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n // interaction\n if (Utils.isNull(interactionBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing interaction buffers was provided.`);\n }\n const interactionDataBuffer = interactionBuffer.buffer(ctx, 'interaction'), interactionDataBufferBuffer = interactionDataBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, interactionDataBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const { group: interactionGroup } = wgsl.bindings(WGSLBindingType.Interaction, 'interaction', 0);\n if (group !== interactionGroup) {\n throw new ReferenceError(`Layout bind group mismatch: ${group} vs ${interactionGroup}.`);\n }\n const bindGroup = this._ensureCameraProjectionAndInteractionDataBindGroup(cameraBuffer.item, viewTransformBufferBuffer, interactionDataBufferBuffer, \n // since fresh could mean also \"camera switched\" (e.g. from ortho to perspective and then back to ortho) there's risk\n // to target destroyed buffers, this refresh the bind group if either buffer is fresh.\n // Possibilities for fine-tuning in future.\n viewTransformBuffer.fresh || interactionDataBuffer.fresh, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, false);\n };\n this._bindRaycastCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, true);\n };\n // vertexColors and textures\n this._bindMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n let tex = meshBuffer.texture(ctx);\n const texBmp = tex?.texture;\n const bindGroup = this._ensureMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, texBmp, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n if (hasTex) {\n device.queue.copyExternalImageToTexture({ source: tex.source, flipY: true }, { texture: texBmp }, { width: texBmp.width, height: texBmp.height });\n }\n };\n // lights\n this._bindLighting = (pass, ...buffers) => {\n if (hasLighting) {\n const lightArray = Array.from(buffers);\n const lightBuffers = lightArray.map(l => { return { buffer: l.buffer(ctx, 'light'), id: l.item.key }; });\n const refresh = lightBuffers.some(b => b.buffer.fresh);\n const bindGroup = this._ensureLightingBindGroup(lightBuffers, refresh, lightingGroupIndex);\n for (let lightBuffer of lightBuffers) {\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lightBuffer.buffer);\n }\n pass.setBindGroup(lightingGroupIndex, bindGroup);\n }\n };\n // picker\n this._bindPicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const group = UNIFORM_GROUP_INDEX_COLORPICKING;\n const refresh = u32id.fresh;\n const bindGroup = this._ensureU32idBindGroup(meshBuffer.item, u32idBuffer, refresh /* reuse u32id.fresh*/);\n pass.setBindGroup(group, bindGroup);\n };\n }\n}\nclass LineWGSLBuilder {\n #line;\n #camera;\n #bindgroups = new Map();\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#line = null;\n this.#bindgroups.clear();\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#line)) {\n this.#line = obj;\n }\n else {\n throw new Error('Line already added.');\n }\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else if (isLight(obj.item)) {\n // ignore\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n }\n build() {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex(data), fragment = this.fragment(data), bindings = (...args) => LineWGSLBuilder.prototype.bindgroup.apply(this, args);\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata: { thickness: data.thickness, dashPattern: data.dashPattern }\n };\n }\n get key() {\n const fat = (this.#line?.item).material?.lineWidth > 1;\n return KnownShader.Line + (fat ? '-fat' : '');\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(data = this._computeBasicData()) {\n return data.thickness > 1 ? getFatLineVertexWgsl() : getDefaultLineVertexWgsl();\n }\n _computeBasicData() {\n const mesh = this.#line.item;\n const shader = Utils.isNull(mesh) ? KnownShader.Line : (mesh.material?.shader ?? KnownShader.Line);\n const material = mesh.material;\n const thickness = material?.lineWidth ?? 1;\n const dashPattern = material?.dashArray;\n return {\n shader,\n thickness, dashPattern,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const bindgroups = this.#bindgroups;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: STORAGE_GROUP_INDEX_LINE + 1, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n const geometryPositions = { key: 'geometryPositions', group: STORAGE_GROUP_INDEX_LINE, binding: 0, type: 'buffer' };\n const line = { key: 'line', group: STORAGE_GROUP_INDEX_LINE, binding: 1, type: 'buffer' };\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, geometryPositions, line]);\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n }\n fragment(data = this._computeBasicData()) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n switch (data.shader) {\n case KnownShader.Line:\n return LineMaterial.fragment(extra);\n }\n }\n}\nclass LineRenderPipelineClass {\n #context;\n constructor(context, _lineBuilder, _cache = new RenderPipelineCache()) {\n this._lineBuilder = _lineBuilder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureLineU32idBindGroup = (item, buffer, refresh) => {\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, this._pickLineBindGroupLayout, labelPrefix + 'line-colorpick-bind-group');\n };\n this._ensureLineMaterialBindGroup = (item, buffer, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, layout, labelPrefix + 'line-material-bind-group');\n };\n this._ensureLinePositionsBindGroup = (item, buffers, refresh, layoutIndex) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-positions-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, buffers, refresh, layout, labelPrefix + 'line-positions-bind-group');\n };\n this._ensureLineWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-transforms-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [buffer], refresh, layout, label);\n };\n this._ensureLineCameraProjectionBindGroup = (item, viewBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-view-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [viewBuffer], refresh, layout, label);\n };\n this._bindLineGroupLayouts = [];\n this._bindLinePositions = EMPTY_BIND_DELEGATE;\n this._bindLinePicker = EMPTY_BIND_DELEGATE;\n this._bindLineWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineMaterial = EMPTY_BIND_DELEGATE;\n this._drawLine = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._linePipeline);\n try {\n // bind\n this._bindLineWorldTransform(pass, meshBuffer);\n this._bindLineCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLineMaterial(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickLinePipeline);\n try {\n // bind\n this._bindLineRaycastWorldTransform(pass, meshBuffer);\n this._bindLineRaycastCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLinePicker(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) { }\n };\n this.#context = context;\n this._lineKey = _lineBuilder.key;\n }\n get context() {\n return this.#context;\n }\n get key() {\n return this._lineKey;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._lineBuilder, wgsl = builder.build();\n const ctx = Utils.extend({ pipeline: this }, this.#context);\n const device = ctx.device;\n // TODO: switch topology based on this flag\n const fatLines = wgsl.metadata.thickness > 1;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: []\n };\n // bind group layouts\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-transforms-bind-group-layout'\n });\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-view-bind-group-layout'\n });\n const lineEntries = [\n // positions array\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'read-only-storage'\n }\n }\n ];\n if (fatLines) {\n lineEntries.push(\n // line properties (width, dash-array, lineCap, ...)\n {\n binding: 1,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n });\n }\n const lineBindGroupLayout = device.createBindGroupLayout({\n entries: lineEntries, label: labelPrefix + 'line-positions-bind-group-layout'\n });\n const vertexBindGroupLayouts = [worldBindGroupLayout, viewBindGroupLayout, lineBindGroupLayout];\n const raycastLayoutIndex = vertexBindGroupLayouts.length;\n const bindGroupLayouts = vertexBindGroupLayouts.slice();\n // #endregion\n // #region FRAGMENT\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'line-material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // #endregion\n // #region PIPELINE\n const topology = fatLines ? options.primitive.topology : 'line-list';\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'line-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-render-pipeline-layout',\n bindGroupLayouts: (this._bindLineGroupLayouts = bindGroupLayouts)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._linePipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickLineBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'line-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'line-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(raycastLayoutIndex)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-colorpick-pipeline-layout',\n bindGroupLayouts: vertexBindGroupLayouts.concat(pickFragGroupLayout)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickLinePipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // world transform\n const bindLineWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureLineWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, \n /*worldTransform.fresh*/ false /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, false);\n };\n this._bindLineRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices\n const bindLineCameraProjection = (pass, cameraBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const bindGroup = this._ensureLineCameraProjectionBindGroup(cameraBuffer.item, viewTransformBufferBuffer, \n /*viewTransformBuffer.fresh*/ false, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, false);\n };\n this._bindLineRaycastCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, true);\n };\n // positions storage\n this._bindLinePositions = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided as index 0.`);\n }\n // storage buffer\n const positionsBuffer = /* should have a storage buffer here */ meshBuffer.buffer(ctx, 'geometryPositions'), positionsBufferBuffer = positionsBuffer.buffer;\n let refresh = positionsBuffer.fresh;\n const buffersInput = [positionsBufferBuffer];\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, positionsBuffer);\n if (fatLines) {\n const lineBuffer = meshBuffer.buffer(ctx, 'line'), lineBufferBuffer = lineBuffer.buffer;\n refresh ||= lineBuffer.fresh;\n buffersInput.push(lineBufferBuffer);\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lineBuffer);\n }\n const { group: groupIndex } = wgsl.bindings(WGSLBindingType.Mesh, 'line' /* or 'geometryPositions' */, 0);\n const bindGroup = this._ensureLinePositionsBindGroup(meshBuffer.item, buffersInput, refresh, groupIndex);\n pass.setBindGroup(groupIndex, bindGroup);\n };\n // vertexColors\n this._bindLineMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n const bindGroup = this._ensureLineMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n };\n // picker\n this._bindLinePicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer, u32idArray = u32id.value;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const bindGroup = this._ensureLineU32idBindGroup(meshBuffer.item, u32idBuffer, /* reuse */ false /*u32id.fresh*/);\n pass.setBindGroup(raycastLayoutIndex, bindGroup);\n };\n this._drawLine = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n const mesh = meshBuffer.item, geometry = mesh.geometry /* as NodeGeometry*/;\n if (fatLines) {\n pass.draw(6, geometry.positions.length - 1, 0, 0);\n }\n else {\n pass.draw(geometry.positions.length);\n }\n };\n }\n}\n// #endregion\n", "export var WGSLBindingType;\n(function (WGSLBindingType) {\n WGSLBindingType[\"Mesh\"] = \"mesh\";\n WGSLBindingType[\"Camera\"] = \"camera\";\n WGSLBindingType[\"Texture\"] = \"texture\";\n WGSLBindingType[\"Light\"] = \"light\";\n WGSLBindingType[\"Interaction\"] = \"interaction\";\n})(WGSLBindingType || (WGSLBindingType = {}));\n", "import { GPUBufferUsage } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Buffers {\n static create(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Float32Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n static createUniform(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n }\n static createStorage(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n static createIndexed(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Uint16Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n}\nexport class BufferLayouts {\n static createVertex(shaderLocationStart = 0, size = 3, ...sizes) {\n const attributes = [];\n let fullSize = 0, index = 0;\n for (let sz of [size].concat(sizes)) {\n attributes.push({\n shaderLocation: shaderLocationStart + index,\n offset: fullSize * Float32Array.BYTES_PER_ELEMENT,\n format: `float32x${sz}`,\n });\n fullSize += sz;\n index++;\n }\n return {\n arrayStride: fullSize /* x, y, z */ * Float32Array.BYTES_PER_ELEMENT,\n attributes,\n stepMode: 'vertex'\n };\n }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { isBasicMaterial, isLineMaterial, KnownShader } from '../../materials/material';\nimport { Buffers } from './buffers';\nimport { GPUTextureUsage } from './constants';\nimport { getBasicMaterialFragmentWgsl } from './wgsl/basic-material-fragment';\nimport { getLineMaterialFragmentWgsl } from './wgsl/line-material-fragment';\nimport { LABEL_PREFIX } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Materials {\n static create(material) {\n if (isBasicMaterial(material)) {\n return new BasicMaterial(material);\n }\n if (isLineMaterial(material)) {\n return new LineMaterial(material);\n }\n throw new TypeError(`Material type '${material.shader}' not supported.`);\n }\n}\nconst EmptyMaterialWGSLDelegates = {\n// empty delegates\n};\nclass MaterialBase {\n constructor(material) {\n if (Utils.isNull(this.#material = material)) {\n throw new ReferenceError(\"Null material provided.\");\n }\n }\n #material;\n get material() { return this.#material; }\n get wgsl() {\n return EmptyMaterialWGSLDelegates;\n }\n buffer({ device }, label = LABEL_PREFIX + 'material-' + this.shader + '-buffer') {\n const { r, g, b, a } = this._diffuseColor();\n const materialValue = new Float32Array([r, g, b, a]);\n return { buffer: Buffers.createStorage(device, materialValue, label), value: materialValue, version: performance.now() };\n }\n _diffuseColor() {\n const { visible, opacity, color } = this.material;\n if (!(visible ?? true)) {\n return { r: 0, g: 0, b: 0, a: 0 };\n }\n const retval = typeof color === 'string' ? Colors.parse(color) : (color ?? { r: 1, g: 1, b: 1, a: 1 });\n if (opacity >= 0 && opacity <= 1) {\n return Utils.extend(retval, { a: retval.a * opacity });\n }\n return retval;\n }\n}\nexport class BasicMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Basic;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Basic material expected.\");\n }\n }\n texture({ device }, key = 'texture') {\n const material = this.material;\n if (key === 'texture' && !Utils.isNull(material.texture)) {\n const texBmp = material.texture;\n const texture = device.createTexture({\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST,\n size: [texBmp.width, texBmp.height],\n });\n return { texture, source: texBmp };\n }\n return null;\n }\n // TODO: put it in the material instance/interface\n static { this.fragment = getBasicMaterialFragmentWgsl; }\n}\nexport class LineMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Line;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Line material expected.\");\n }\n }\n buffer(ctx, key) {\n switch (key) {\n case 'line':\n const { device, canvas } = ctx;\n const lineMaterial = this.material;\n const lineValue = new Float32Array([canvas.clientWidth, canvas.clientHeight, lineMaterial.lineWidth / 2]);\n return { buffer: Buffers.createUniform(device, lineValue, LABEL_PREFIX + 'line-' + this.shader + '-buffer'), value: lineValue, version: performance.now() };\n default:\n return super.buffer(ctx);\n }\n }\n texture(_) {\n return null;\n }\n static { this.fragment = getLineMaterialFragmentWgsl; }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, MATERIAL_GROUP_INDEX, STORAGE_MATERIAL_INDEX, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE } from '../constants';\nconst DefaultBasicMaterialFragmentOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputRayIndexLocation: VERTEX_OUTPUT_LOCATION_RAY,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n storageMaterialGroupIndex: MATERIAL_GROUP_INDEX,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n\\t');\n }\n else {\n output += `${VERTEX_COLOR_REFERENCE} = ${trimmed};\\r\\n\\t`;\n }\n }\n return output;\n}\nexport function getBasicMaterialFragmentWgsl(extensions = {}, options = DefaultBasicMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultBasicMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n const color = VERTEX_COLOR_REFERENCE, lighting = LIGHTING_COLOR_REFERENCE, ambient = AMBIENT_COLOR_REFERENCE;\n return `// definitions\n\n${definitions}\n\n// bindings\n@group(${opts.storageMaterialGroupIndex}) @binding(${opts.storageMaterialBindingIndex}) var<storage, read> diffuseColor: vec4f;\n${bindings}\n\nconst empty = vec4f(0,0,0,0);\nconst white = vec4f(1,1,1,1);\n\n@fragment fn main (\n @builtin(position) position: vec4f, // clip-space position\n @location(${opts.outputNormalLocation}) normal: vec3f, // world-space normal\n @location(${opts.outputVertexLocation}) vertex: vec3f, // world-space position\n @location(${opts.outputUvLocation}) uv: vec2f,\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32, // vertex index,\n @location(${opts.outputRayIndexLocation}) ray: vec3f, // ray (eye-to-vertex) vector\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n) -> @location(0) vec4f {\n var ${color} = diffuseColor;\n var ${ambient}: vec4f = empty;\n var ${lighting}: vec4f = empty;\n\n // modifiers\n ${modifiers}\n\n ${lighting} = select(white, ${lighting}, ${lighting}.a > 0);\n return ${color} * ${lighting} + ${ambient};\n}`;\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { STORAGE_GROUP_INDEX_LINE, STORAGE_MATERIAL_INDEX } from '../constants';\nconst DefaultLineMaterialFragmentOptions = {\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storageMaterialGroupIndex: STORAGE_GROUP_INDEX_LINE + 1,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n');\n }\n else {\n output += `output = ${trimmed};\\r\\n`;\n }\n }\n return output;\n}\nexport function getLineMaterialFragmentWgsl(extensions = {}, options = DefaultLineMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultLineMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n return `// definitions\n${definitions}\n\n// bindings\n@group(${options.storageMaterialGroupIndex}) @binding(${options.storageMaterialBindingIndex}) var<storage, read> vertexColors: array<vec4f>;\n${bindings}\n\nfn getVertexColor(index: u32) -> vec4f {\n let numColors = arrayLength(&vertexColors);\n let vertexColorIndex = index % numColors;\n return vertexColors[vertexColorIndex];\n}\n\n@fragment fn main (\n @builtin(position) position: vec4f, // clip-space position\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance: u32, // instance index\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32 // vertex index\n) -> @location(0) vec4f {\n var output = getVertexColor(index);\n\n // modifiers\n ${modifiers}\n\n return output;\n}`;\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_INTERACTION, UNIFORM_GROUP_INDEX_INTERACTION, WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\nimport { extractMeshVertexModifierFunctionComponents } from './shared';\nconst DefaultMeshVertexOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n outputRayLocation: VERTEX_OUTPUT_LOCATION_RAY,\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n inputNormalLocation: VERTEX_BUFFER_INDEX_MESH_NORMAL,\n inputUvLocation: VERTEX_BUFFER_INDEX_MESH_UV,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformInteractionBindingIndex: UNIFORM_BINDING_INDEX_INTERACTION,\n uniformInteractionGroupIndex: UNIFORM_GROUP_INDEX_INTERACTION,\n};\nexport function getMeshVertexWgsl(options = DefaultMeshVertexOptions) {\n if (options != DefaultMeshVertexOptions) {\n options = Utils.extend({}, DefaultMeshVertexOptions, options);\n }\n // vertex input modifier?\n const modifierInput = options.inputModifier;\n let modifyInstructionInput = 'vertexInput', modifierFnInput = '';\n if (!Utils.isNullOrEmpty(modifierInput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierInput);\n modifyInstructionInput = `${modifierName}(vertexInput, interaction)`;\n modifierFnInput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} {\n ${modifierBody}\n}`;\n }\n // vertex output modifier?\n const modifierOutput = options.outputModifier;\n let modifyInstructionOutput = 'output', modifierFnOutput = '';\n if (!Utils.isNullOrEmpty(modifierOutput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierOutput);\n modifyInstructionOutput = `${modifierName}(output, interaction)`;\n modifierFnOutput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\n ${modifierBody}\n}`;\n }\n const opts = Utils.extend({}, DefaultMeshVertexOptions, options);\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\n @builtin(position) position : vec4f, // clip space position\n @location(${opts.outputNormalLocation}) normal: vec3f, // world space normal\n @location(${opts.outputVertexLocation}) vertex : vec3f, // world space position\n @location(${opts.outputUvLocation}) uv : vec2f, // texture coordinates\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\n @location(${opts.outputRayLocation}) ray : vec3f, // eye-to-point vector in world space\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n}\n\nstruct ${WGSL_VERTEXINPUT_STRUCT_NAME} {\n @location(${opts.inputPositionLocation}) position: vec3f,\n @location(${opts.inputNormalLocation}) normal: vec3f,\n @location(${opts.inputUvLocation}) uv: vec2f,\n @builtin(vertex_index) index: u32,\n @builtin(instance_index) instance: u32,\n}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f,\n}\n\nstruct ${WGSL_INTERACTIONDATA_STRUCT_NAME} {\n // mouse coordinatges in NDC space ([-1,1], [-1,1])\n cursor: vec2f,\n // canvas size in pixels\n resolution: vec2f,\n // some phase timer (e.g. time since mouse down, or time since last click, etc.)\n time: f32,\n}\n\n${modifierFnInput}\n\n${modifierFnOutput}\n\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${opts.uniformInteractionGroupIndex}) @binding(${opts.uniformInteractionBindingIndex}) var<uniform> interaction: ${WGSL_INTERACTIONDATA_STRUCT_NAME};\n\n@vertex fn main(vertexInput: ${WGSL_VERTEXINPUT_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\n let input = ${modifyInstructionInput};\n let position4 = vec4f(input.position, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n let worldPosition = (worldTransform * position4).xyz;\n let output = ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\n worldViewProjectionTransform * position4,\n transforms.normal * input.normal,\n worldPosition,\n input.uv,\n input.index,\n normalize(worldPosition - camera.position),\n input.instance\n );\n return ${modifyInstructionOutput};\n}`;\n}\n", "import { WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\nconst defaultVertexGeometryModifierArgs = ['input', 'data'];\n//const defaultVertexGeometryModifier: VertexInputModifierDelegate = (...defaultVertexGeometryModifierArgs) => {\n// const [inputRef, dataRef] = defaultVertexGeometryModifierArgs;\n// return `fn echo(${inputRef}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${dataRef}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} { return ${inputRef}; }`;\n//};\nexport function extractMeshVertexModifierFunctionComponents(wgsl) {\n if (typeof wgsl !== 'string') {\n wgsl = wgsl(...defaultVertexGeometryModifierArgs);\n }\n // regex that remove all the wgsl comments and extract the function name, arguments and body\n const regex = new RegExp(`fn\\\\s+(\\\\w+)\\\\s*\\\\(([^)]*)\\\\)\\\\s*->\\\\s*(${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME})\\\\s*{((.|\\\\n)+)}\\\\s*$`);\n const match = wgsl.match(regex);\n if (match) {\n const name = match[1];\n const args = match[2].split(',').map(arg => {\n const kvp = arg.split(':');\n return { name: kvp[0].trim(), type: kvp[1].trim() };\n });\n if (args.length !== 2\n || args[0].type !== match[3] // the first argument type must match the function return type\n || args[1].type !== WGSL_INTERACTIONDATA_STRUCT_NAME) {\n throw new Error(`Invalid modifier function. Invalid signature types (arg1: ${args[0]?.type}, arg2: ${args[1]?.type})`);\n }\n const body = match[4].trim();\n return { name, args: args.map(i => i.name), body };\n }\n else {\n throw new Error(`Invalid modifier function. Must be a valid WGSL function with the signature: fn name(arg1: ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}, arg2: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}`);\n }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_BUFFER_INDEX_MESH_POSITION, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, STORAGE_GROUP_INDEX_LINE, WGSL_VERTEXOUTPUT_STRUCT_NAME } from '../constants';\nconst DefaultLineVertexOptions = {\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storagePositionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n storagePositionsBindingIndex: 0,\n uniformDimensionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n uniformDimensionsBindingIndex: 1,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n};\nfunction getVertexOutputStructDefinition(opts) {\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\n @builtin(position) position : vec4f, // clip space position\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\n}`;\n}\nexport function getDefaultLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f\n}\n\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\n\n@vertex fn main(@builtin(instance_index) instance: u32,\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\n\n let x = positions[3u * index + 0u];\n let y = positions[3u * index + 1u];\n let z = positions[3u * index + 2u];\n let position4 = vec4f(x, y, z, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n let worldPosition = (worldTransform * position4).xyz;\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\n worldViewProjectionTransform * position4,\n instance,\n index);\n}`;\n}\nexport function getFatLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\n\nstruct Transforms {\n world: mat4x4f,\n normal: mat3x3f,\n}\n\nstruct Camera {\n view: mat4x4f,\n projection: mat4x4f,\n position: vec3f\n}\n\nstruct Pixels {\n viewportWidth: f32,\n viewportHeight: f32,\n halfLineWidth: f32\n}\n\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\n@group(${opts.uniformDimensionsGroupIndex}) @binding(${opts.uniformDimensionsBindingIndex}) var<uniform> dimensions: Pixels;\n\nfn computeClipPosition(index: u32) -> vec4f {\n let x = positions[3u * index + 0u];\n let y = positions[3u * index + 1u];\n let z = positions[3u * index + 2u];\n let position4 = vec4f(x, y, z, 1.0);\n let worldTransform = transforms.world;\n let viewProjectionTransform = camera.projection;\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\n return worldViewProjectionTransform * position4;\n}\n\nfn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {\n\n let viewportSize = vec2f(dimensions.viewportWidth, dimensions.viewportHeight);\n let normalizedSize = normalize(viewportSize);\n let halfThickness = dimensions.halfLineWidth / dimensions.viewportWidth;\n let p0ndc = p0.xyz / p0.w;\n let p1ndc = p1.xyz / p1.w;\n let dir = normalize((p1ndc - p0ndc).xy);\n let offsetX = halfThickness * 2.0 / normalizedSize.x;\n let offsetY = halfThickness * 2.0 / normalizedSize.y;\n\n // perp\n let perp0 = vec2f(-dir.y * offsetX, dir.x * offsetY);\n let perp1 = perp0;\n\n /*\n\n position0-0 -----*----- position0-1\n |\\\\ |\n | \\\\ |\n | \\\\ |\n | \\\\ |\n | \\\\ |\n | \\\\ |\n | \\\\ |\n | \\\\|\n position1-0 -----*----- position1-1\n\n indexes:\n ------------\n p0-0 -> 0, 3\n p0-1 -> 5\n p1-0 -> 1\n p1-1 -> 2, 4\n */\n\n var outPos: vec2f;\n var w = p0.w;\n var z = p0.z;\n if (index == 0 || index == 3){\n outPos = p0ndc.xy - perp0;\n }\n else if (index == 1){\n outPos = p1ndc.xy - perp1;\n w = p1.w;\n z = p1.z;\n }\n else if (index == 5){\n outPos = p0ndc.xy + perp0;\n }\n else { //if (index == 2 || index == 4)\n outPos = p1ndc.xy + perp1;\n w = p1.w;\n z = p1.z;\n }\n\n // return vec4f(outPos , 0, 1.0);\n return vec4f(outPos * w, z, w);\n}\n\n@vertex fn main(@builtin(instance_index) instance: u32,\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\n\n // vertex index starting at 1\n let position0 = computeClipPosition(instance);\n let position1 = computeClipPosition(instance + 1);\n\n // apply offset\n let position = computeOffsetPosition(position0, position1, index);\n\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\n position,\n instance,\n index\n );\n}`;\n}\n", "import { UNIFORM_GROUP_INDEX_COLORPICKING } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\n/**\n * Generate a WGSL piece of code that eases 3D picking using color strategy.\n */\nexport function getColorPickingFragmentWgsl(groupIndex = UNIFORM_GROUP_INDEX_COLORPICKING) {\n return `struct ColorPicker {\n id: u32,\n };\n\n @group(${groupIndex}) @binding(0) var<uniform> colorPicker: ColorPicker;\n\n @fragment\n fn main(@builtin(position) position: vec4f) -> @location(0) u32 {\n return colorPicker.id;\n }\n `;\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { SAMPLER_BINDING_INDEX } from '../constants';\nconst DefaultTextureMapReferences = {\n uv: 'uv',\n};\nexport function textureMap(references = DefaultTextureMapReferences, group, binding = SAMPLER_BINDING_INDEX) {\n const key = Utils.uniqueCode();\n const samplerReference = `sampler_${key}`;\n const texReference = `tex_${key}`;\n const ref = Utils.extend({}, DefaultTextureMapReferences, references);\n const inputColor = ref.inputColor, outputColors = ref.outputColors;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n const modifiers = outputColors ?\n outputColors.map((name, index) => index === 0 ? `${name} = textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor};` : `${name} = ${outputColors[0]};`)\n : [`textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor}`];\n return {\n // type definitions\n //definition: '',\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var ${samplerReference}: sampler;`,\n `@group(${group}) @binding(${binding + 1}) var ${texReference}: texture_2d<f32>;`],\n // modifiers\n modifiers\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nconst DefaultDirectionalLightReferences = {\n normal: 'normal', inputColor: 'white'\n};\nexport function directionalLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `directional_${key}`;\n const ref = Utils.extend({}, DefaultDirectionalLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal ?? 'normal';\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct DirectionalLight {\n color: vec4f,\n direction: vec3f,\n intensity: f32\n}`, `fn computeDirectional(normal: vec3f, color: vec4f, light: DirectionalLight) -> vec4f {\n let n = normalize(normal);\n let d = normalize(light.direction);\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\n let output = color.rgb * light.color.rgb * factor;\n return vec4f(output, color.a);\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: DirectionalLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeDirectional(${normal}, ${inputColor}, ${lightReference});`] : [`computeDirectional(${normal}, ${inputColor}, ${lightReference})`]\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nconst DefaultOmniLightReferences = {\n normal: 'normal', position: 'vertex', ray: 'ray', inputColor: 'white', specularColor: 'empty', shininess: '0'\n};\nexport function omniLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `omni_${key}`;\n const ref = Utils.extend({}, DefaultOmniLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal, ray = ref.ray, vertex = ref.position, shininess = ref.shininess, specularColor = ref.specularColor;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct OmniLight {\n color: vec4f,\n position: vec3f,\n intensity: f32\n}`, `fn computeOmni(position: vec3f, normal: vec3f, ray: vec3f, color: vec4f, specularColor: vec4f, shininess: f32, light: OmniLight) -> vec4f {\n\n // color\n let n = normalize(normal);\n let d = normalize(position - light.position);\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\n\n // specular\n let r = normalize(ray);\n let halfVector = normalize(d + r);\n let specular = specularColor.rgb * shininess * dot(n, -halfVector);\n\n let output = color.rgb * light.color.rgb * factor + specular;\n return vec4f(output, color.a);\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: OmniLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference});`] : [`computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference})`]\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nexport function ambientLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `ambient_${key}`;\n const inputColor = references.inputColor, outputColor = references.outputColor;\n if (Utils.isNullOrEmpty(inputColor) || Utils.isNullOrEmpty(outputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n return {\n // type definitions\n definitions: [`struct AmbientLight {\n color: vec4f,\n intensity: f32\n}`, `fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {\n return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: AmbientLight;`],\n // modifiers\n modifiers: [`${outputColor} = computeAmbient(${inputColor}, ${lightReference});`]\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isGroup, isMesh, isCamera, isLight, isGeometry, isInteraction, isMeshGeometry } from '../../types';\nimport { KnownShader, isMaterial } from '../../materials/material';\nimport { AdapterUtils } from '../shared';\nimport { U32_MAX, LABEL_PREFIX } from './constants';\nimport { Buffers } from './buffers';\nimport { Cameras } from './cameras';\nimport { Materials } from './materials';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nfunction throwBufferRequestError(key, type) {\n if (typeof type === 'function') {\n type = type.name;\n }\n throw new RangeError(`Buffer '${key}' not available for ${type}.`);\n}\nfunction createRenderableBuffer(item, parent, ...args) {\n item.stage ??= parent?.item.stage;\n if (isGroup(item)) {\n item.key ??= 'group_' + Utils.uniqueCode();\n return new RenderableGroupBuffer(item, parent, ...args);\n }\n if (isMesh(item)) {\n item.key ??= 'mesh_' + Utils.uniqueCode();\n return new RenderableMeshBuffer(item, parent, ...args);\n }\n if (isCamera(item)) {\n item.key ??= 'camera_' + Utils.uniqueCode();\n return new RenderableCameraBuffer(item /*, parent*/);\n }\n if (isLight(item)) {\n item.key ??= 'light_' + item.type + '_' + Utils.uniqueCode();\n return new RenderableLightBuffer(item /*, parent*/);\n }\n throw new Error(`Renderable is not supported.`);\n}\nexport class RenderLooper {\n constructor(_set) {\n this._set = _set;\n }\n /** @internal */\n get items() {\n return this._set;\n }\n loop(render) {\n const { meshes, cameras, groups, lights } = this._set;\n const camera = cameras[0];\n let cameraDone = false, lightsDone = false;\n for (let mesh of meshes) {\n if (mesh.disposed) {\n continue;\n }\n // execute\n const rendered = render(mesh, camera, lights);\n if (!rendered) {\n continue;\n }\n // seal buffers\n RenderableBuffers.clearFlags(mesh);\n if (!cameraDone) {\n RenderableBuffers.clearFlags(camera);\n cameraDone = true;\n }\n if (!lightsDone) {\n lights.forEach(light => RenderableBuffers.clearFlags(light));\n lightsDone = true;\n }\n }\n for (let group of groups) {\n // seal group buffers\n RenderableBuffers.clearFlags(group);\n }\n }\n}\nexport class ManagedBuffers {\n static create(item) {\n if (isGeometry(item)) {\n item.key ??= 'geometry_' + Utils.uniqueCode();\n return new GeometryBuffer(item);\n }\n if (isMaterial(item)) {\n return new MaterialBuffer(item);\n }\n if (isInteraction(item)) {\n return new InteractionBuffer(item);\n }\n throw new Error(`Object is not supported.`);\n }\n}\nexport class RenderableBuffers {\n static create(item, ...args) {\n return createRenderableBuffer(item, null, ...args);\n }\n static clearFlags(buffer, includeParent = false) {\n buffer.item.flags.splice(0);\n if (includeParent) {\n const bufferBase = buffer;\n if (!Utils.isNull(bufferBase.parent)) {\n RenderableBuffers.clearFlags(bufferBase.parent, true);\n }\n }\n }\n static allFlags(buffer) {\n const bufferBase = buffer;\n const parentBufferBase = bufferBase.parent;\n const parentFlags = Utils.isNull(parentBufferBase) ? [] : RenderableBuffers.allFlags(parentBufferBase);\n return bufferBase.item.flags.union(parentFlags);\n }\n}\nclass ManagedBufferBase {\n #item;\n constructor(item) {\n this.#item = item;\n }\n get item() {\n return this.#item;\n }\n #lock = false;\n lock() {\n this.#lock = true;\n }\n unlock() {\n this.#lock = false;\n const garbage = this.#garbage;\n while (garbage.length > 0) {\n const obj = garbage.shift();\n this._destroyUnsafe(obj);\n }\n }\n #garbage = [];\n _destroyUnsafe(obj) {\n if ('texture' in obj) {\n obj.texture.destroy();\n }\n else if ('buffer' in obj) {\n obj.buffer.destroy();\n }\n }\n destroySafely(...objects) {\n for (let obj of Array.from(objects).concat(...this.#garbage.splice(0))) {\n if (!obj) {\n continue;\n }\n if (this.#lock) {\n this.#garbage.push(obj);\n }\n else {\n this._destroyUnsafe(obj);\n }\n }\n }\n #disposed = false;\n destroy() {\n this.dispose();\n this.#disposed = true;\n }\n get disposed() {\n return this.#disposed;\n }\n}\nclass RenderableBufferBase extends ManagedBufferBase {\n constructor(item, parentBuffer) {\n super(item);\n this.#parent = parentBuffer;\n this.#u32id = Utils.uniqueId() % U32_MAX;\n }\n #u32id;\n #parent;\n #u32idBuffer = new Map();\n get parent() {\n return this.#parent;\n }\n get id() {\n return this.#u32id;\n }\n allFlags() {\n const parent = this.parent;\n // TODO: this one line is a perf hog!\n return this.item.flags.union(parent?.allFlags() ?? []);\n }\n buildParentWorldTransform() {\n let worldMatrix = Matrix3D.identity();\n let step = this;\n while (!Utils.isNull(step.parent)) {\n const parentItem = step.parent.item;\n const parentItemMatrix = Matrix3D.translate(parentItem.transformMatrix ?? Matrix3D.identity(), parentItem.position ?? Vector3D.zero());\n worldMatrix = Matrix3D.multiply(worldMatrix, parentItemMatrix);\n step = step.parent;\n }\n return worldMatrix;\n }\n buildWorldTransform() {\n const itemMatrix = Matrix3D.translate(this.item.transformMatrix ?? Matrix3D.identity(), this.item.position ?? Vector3D.zero());\n const parentWorldMatrix = this.buildParentWorldTransform();\n return Matrix3D.multiply(itemMatrix, parentWorldMatrix);\n }\n #versions = new Map();\n version(key) {\n return this.#versions.get(key) ?? 0;\n }\n buffer(context, key) {\n if (key === 'u32id') {\n const u32idBuffer = this.#u32idBuffer;\n const { pipeline, device } = context;\n if (u32idBuffer.has(pipeline)) {\n return Utils.extend({ fresh: false }, u32idBuffer.get(pipeline));\n }\n const u32idBufferValue = new Uint32Array([this.id]);\n const u32idBufferBuffer = Buffers.createUniform(device, u32idBufferValue, LABEL_PREFIX + 'u32id-buffer');\n const retval = Utils.extend({ buffer: u32idBufferBuffer, value: u32idBufferValue, version: performance.now() }, { fresh: true });\n this.#u32idBuffer.set(pipeline, retval);\n return retval;\n }\n const retval = this.specificBuffer(context, key);\n this.#versions.set(key, retval.version);\n return retval;\n }\n}\nconst DefaultMaterial = { shader: KnownShader.Basic, color: '#c0c0c0', flags: [] };\n// #region GROUP\nclass RenderableGroupBuffer extends RenderableBufferBase {\n #children;\n constructor(group, parent, ...args) {\n super(group, parent);\n this.#children = group.childRenderables.map(i => createRenderableBuffer(i, this, ...args));\n }\n get children() {\n return this.#children;\n }\n specificBuffer(ctx, key) {\n return null;\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n dispose() {\n this.#children.forEach(i => i.destroy());\n //this.#children = null;\n }\n}\n// #endregion\n// #region CAMERA\nclass RenderableCameraBuffer extends RenderableBufferBase {\n #viewBag = new Map();\n #view;\n constructor(camera) {\n super(camera);\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n //const camera = this.item;\n let fresh = false;\n if (this.allFlags().length > 0 || Utils.isNull(this.#view)) {\n fresh = true;\n this.#viewBag.clear();\n this._rebuildMatrices(context);\n }\n const { pipeline } = context;\n if (!this.#viewBag.has(pipeline)) {\n fresh = true;\n this.#viewBag.set(pipeline, this.#view);\n }\n RenderableBuffers.clearFlags(this);\n switch (key) {\n case 'cameraViewTransform':\n return Utils.extend(this.#view, { fresh });\n default:\n throwBufferRequestError(key, RenderableCameraBuffer);\n }\n }\n _rebuildMatrices({ device, canvas }) {\n // this._destroyView();\n const cam = this.item;\n const camera = Cameras.create(cam);\n const { x, y, z } = cam.position;\n const view = camera.view();\n const projection = camera.projection(canvas);\n const viewProjection = Matrix3D.multiply(view, projection);\n const viewValue = new Float32Array(16 + 16 + 4);\n viewValue.set(Matrix3D.toArray(view), 0);\n viewValue.set(Matrix3D.toArray(viewProjection), 16);\n viewValue.set([x, y, z], 32);\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#view)) {\n const viewBuffer = Buffers.createUniform(device, viewValue, LABEL_PREFIX + 'view-buffer');\n this.#view = { buffer: viewBuffer, value: viewValue, version: performance.now().roundoff() };\n }\n else {\n this.#view.value = viewValue;\n this.#view.version = performance.now().roundoff();\n }\n }\n _destroyView() {\n this.#viewBag.clear();\n const view = this.#view;\n this.#view = null;\n this.destroySafely(view);\n }\n dispose() {\n this._destroyView();\n }\n}\n// #endregion\n// #region GEOMETRY\nclass GeometryBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #freshness = { positions: true, normals: true, uv: true, packed: true };\n #geometryBuffers;\n constructor(geometry) {\n super(geometry);\n geometry.flags ??= [];\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n if (Utils.isNull(this.#geometryBuffers) || flags.includes(StalePropertyFlag.Geometry)) {\n flags.splice(0);\n this.#bufferBag = /* reset */ {};\n this._rebuildGeometryBuffers(context);\n }\n const freshness = this.#freshness;\n const geom = this.#geometryBuffers;\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n const newInPipeline = !bag.has(pipeline);\n const ensureInBag = (buffer) => {\n if (newInPipeline) {\n bag.set(pipeline, buffer);\n }\n return buffer;\n };\n switch (key) {\n case 'geometryPositions':\n const { positions } = geom, posFresh = freshness.positions;\n freshness.positions = false;\n return Utils.extend(ensureInBag(positions), { fresh: posFresh || newInPipeline });\n case 'geometryNormals':\n const { normals } = geom, normFresh = freshness.normals;\n freshness.normals = false;\n return Utils.extend(ensureInBag(normals), { fresh: normFresh || newInPipeline });\n case 'geometryTexCoords':\n const { uv } = geom, uvFresh = freshness.uv;\n freshness.uv = false;\n return Utils.extend({ fresh: uvFresh || newInPipeline }, ensureInBag(uv));\n case 'geometry':\n // alltogether\n const { packed } = geom, geomFresh = freshness.packed;\n freshness.packed = false;\n return Utils.extend(ensureInBag(packed), { fresh: geomFresh || newInPipeline });\n default:\n throwBufferRequestError(key, GeometryBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _rebuildGeometryBuffers({ device }) {\n this._destroyBuffers();\n const version = performance.now();\n const geometry = this.item, key = geometry.key;\n if (isMeshGeometry(geometry)) {\n const meshGeometry = geometry;\n // flatten positions...\n const hasTriangleIndices = !Utils.isNullOrEmpty(meshGeometry.triangleIndices);\n const flatPositions = hasTriangleIndices ?\n meshGeometry.triangleIndices.map(index => meshGeometry.positions[index])\n : meshGeometry.positions;\n const length2 = flatPositions.length * 2, length3 = length2 + flatPositions.length;\n const positionsValue = new Float32Array(length3);\n const normalsValue = new Float32Array(length3);\n const uvValue = new Float32Array(length2);\n const geomValue = new Float32Array(2 * length3 + length2);\n for (let j = 0; j < flatPositions.length; j++) {\n const offset2 = 2 * j;\n const offset3 = 3 * j;\n const { x, y, z } = flatPositions[j];\n const { x: nx, y: ny, z: nz } = meshGeometry.normals[j];\n const { x: u, y: v } = meshGeometry.textureCoordinates[j];\n positionsValue.set([x, y, z], offset3);\n normalsValue.set([nx, ny, nz], offset3);\n uvValue.set([u, v], offset2);\n geomValue.set([x, y, z, nx, ny, nz, u, v], offset3 * 2 + offset2);\n }\n const positions = Buffers.create(device, positionsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-positions-buffer');\n const normals = Buffers.create(device, normalsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-normals-buffer');\n const uv = Buffers.create(device, uvValue, LABEL_PREFIX + 'meshgeometry-' + key + '-uvmap-buffer');\n const geom = Buffers.create(device, geomValue, LABEL_PREFIX + 'meshgeometry-' + key + '-buffer');\n this.#geometryBuffers = {\n packed: { buffer: geom, value: geomValue, version },\n positions: { buffer: positions, value: positionsValue, version },\n normals: { buffer: normals, value: normalsValue, version },\n uv: { buffer: uv, value: uvValue, version },\n };\n this.#freshness = { positions: true, normals: true, uv: true, packed: true };\n }\n else {\n const positionsValue = new Float32Array(AdapterUtils.flattenVectorArray(geometry.positions));\n const positions = Buffers.createStorage(device, positionsValue, LABEL_PREFIX + 'nodegeometry-' + key + '-positions-buffer');\n this.#geometryBuffers = {\n positions: { buffer: positions, value: positionsValue, version },\n packed: { buffer: positions, value: positionsValue, version }\n };\n this.#freshness = { positions: true, packed: true };\n }\n }\n _destroyBuffers() {\n this.#bufferBag = {};\n const obsolete = this.#geometryBuffers;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete.positions, obsolete.normals, obsolete.uv);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MATERIAL\nclass MaterialBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #textureBag = {};\n #wgpuMaterial;\n #buffers = new Map();\n #textures = new Map();\n constructor(material) {\n super(material);\n material.flags ??= [];\n if (material.flags.indexOf(StalePropertyFlag.Material) === -1) {\n material.flags.push(StalePropertyFlag.Material);\n }\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n let fresh = Utils.isNull(this.#wgpuMaterial);\n if (flags.includes(StalePropertyFlag.Material)) {\n this.#bufferBag = /* reset */ {};\n flags.splice(0);\n fresh = true;\n this.#textures.clear();\n this._resetMaterialBuffers();\n }\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n switch (key) {\n case 'material':\n case 'line':\n const buffer = this._ensureMaterialBuffer(context, key);\n if (buffer) {\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, buffer);\n }\n return Utils.extend(buffer, { fresh });\n }\n return null;\n default:\n throwBufferRequestError(key, MaterialBuffer);\n }\n }\n _ensureMaterialBuffer(ctx, key = 'material') {\n const set = this.#buffers;\n let retval = set.get(key);\n if (retval) {\n return retval;\n }\n if (set.has(key)) {\n return null;\n }\n retval = this.#wgpuMaterial?.buffer(ctx, key);\n if (retval) {\n set.set(key, retval);\n }\n return retval;\n }\n _resetMaterialBuffers() {\n this.#wgpuMaterial = Materials.create(this.item);\n this._destroyBuffers();\n }\n texture(ctx, key = 'texture') {\n const set = this.#textures;\n let retval = set.get(key), fresh = false;\n if (!retval) {\n retval = this.#wgpuMaterial?.texture(ctx, key);\n if (!retval) {\n return null;\n }\n set.set(key, retval);\n fresh = true;\n //\n this.#textureBag = /* reset */ {};\n }\n const { pipeline } = ctx;\n const bag = (this.#textureBag[key] ??= new Map());\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, retval);\n }\n return Utils.extend(retval, { fresh });\n }\n dispose() {\n this._destroyBuffers();\n }\n _destroyBuffers() {\n // memoizers\n this.#bufferBag = {};\n this.#textureBag = {};\n // buffers\n const buffers = this.#buffers.values();\n this.#buffers.clear(); // clear before destroying\n this.destroySafely(...buffers);\n // textures\n const textures = this.#textures.values();\n this.#textures.clear(); // clear before destroying\n textures.forEach(t => t.texture.destroy());\n }\n}\n// #endregion\n// #region INTERACTION\nclass InteractionBuffer extends ManagedBufferBase {\n #fields = {\n time: 0, cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n };\n #buffer;\n #bufferBag = new Map();\n constructor(data) {\n super(data);\n Utils.extend(this.#fields, data);\n }\n buffer(context, key) {\n switch (key) {\n // altogether\n case 'interaction':\n return this._ensureInteractionBuffer(context);\n default:\n throwBufferRequestError(key, InteractionBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _ensureInteractionBuffer(ctx, key = 'interaction') {\n const fields = this.#fields, item = this.item;\n let fresh = (!this.#buffer\n || item.time !== fields.time\n || item.resolution?.width !== fields.resolution.width\n || item.resolution?.height !== fields.resolution.height);\n if (!fresh && !Utils.isNull(item.cursor)) {\n fresh = item.cursor.x !== fields.cursor.x\n || item.cursor.y !== fields.cursor.y;\n }\n if (fresh) {\n // [4bytes cursor.x, 4bytes cursor.y, 4bytes resolution.width, 4bytes resolution.height, 4bytes time] = 20 bytes total]\n const value = new Float32Array([item.cursor?.x ?? 0, item.cursor?.y ?? 0, item.resolution.width, item.resolution.height, item.time, /* padding */ .0]);\n const buffer = Buffers.createUniform(ctx.device, value, LABEL_PREFIX + 'interaction-buffer');\n this.#buffer = { buffer, value, version: performance.now() };\n this.#bufferBag.clear();\n }\n const { pipeline } = ctx;\n const bag = this.#bufferBag;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n return Utils.extend(this.#buffer, { fresh });\n }\n _destroyBuffers() {\n // memoizer\n this.#bufferBag.clear();\n // buffer itself\n const obsolete = this.#buffer;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MESH\nclass RenderableMeshBuffer extends RenderableBufferBase {\n #geometryBuffers;\n #geometryBuffer;\n #materialBuffers;\n #materialBuffer;\n #worldTransform;\n #freshness = {\n geometry: true, material: true, transform: true\n };\n #worldTransformBufferBag = new Map();\n constructor(mesh, parent, geometries, materials) {\n super(mesh, parent);\n mesh.flags ??= [];\n if (mesh.flags.indexOf(StalePropertyFlag.Geometry) === -1) {\n mesh.flags.push(StalePropertyFlag.Geometry);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Material) === -1) {\n mesh.flags.push(StalePropertyFlag.Material);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Position) === -1 && mesh.flags.indexOf(StalePropertyFlag.Transform) === -1) {\n mesh.flags.push(StalePropertyFlag.Transform);\n }\n this.#geometryBuffers = geometries;\n this.#materialBuffers = materials;\n }\n texture(ctx, key) {\n const material = this.#materialBuffer;\n return material?.texture(ctx, key);\n }\n specificBuffer(context, key) {\n const freshness = this.#freshness;\n const flags = this.allFlags();\n if (Utils.isNull(this.#worldTransform) || flags.includes(StalePropertyFlag.Position) || flags.includes(StalePropertyFlag.Transform)) {\n this.#worldTransformBufferBag.clear();\n // world transform bind group buffer\n freshness.transform = true;\n this._rebuildWorldMatrices(context);\n }\n if (Utils.isNull(this.#geometryBuffer) || flags.includes(StalePropertyFlag.Geometry)) {\n // vertex buffers\n freshness.geometry = true;\n this._ensureGeometryBuffer();\n }\n if (Utils.isNull(this.#materialBuffer) || flags.includes(StalePropertyFlag.Material)) {\n freshness.material = true;\n this._ensureMaterialBuffer();\n }\n RenderableBuffers.clearFlags(this);\n const geom = this.#geometryBuffer;\n const mater = this.#materialBuffer;\n switch (key) {\n case 'geometryPositions':\n case 'geometryNormals':\n case 'geometryTexCoords':\n case 'geometry':\n return geom.buffer(context, key);\n case 'material':\n case 'line':\n return mater.buffer(context, key);\n case 'objectWorldTransform':\n const mat = this.#worldTransform, wFresh = freshness.transform;\n freshness.transform = false;\n const bag = this.#worldTransformBufferBag, { pipeline } = context;\n const newInPipeline = !bag.has(pipeline);\n if (newInPipeline) {\n bag.set(pipeline, mat);\n }\n return Utils.extend(mat, { fresh: wFresh || newInPipeline });\n default:\n throwBufferRequestError(key, RenderableMeshBuffer);\n }\n }\n _ensureGeometryBuffer() {\n const current = this.#geometryBuffer;\n const cache = this.#geometryBuffers;\n const mesh = this.item;\n const geom = mesh.geometry;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#geometryBuffer = new GeometryBuffer(geom);\n }\n else {\n let buffer = cache?.get(geom);\n if (buffer?.disposed !== false) {\n buffer = new GeometryBuffer(geom);\n cache.set(geom, buffer);\n }\n this.#geometryBuffer = buffer;\n }\n }\n _ensureMaterialBuffer() {\n const current = this.#materialBuffer;\n const cache = this.#materialBuffers;\n const mesh = this.item;\n const material = mesh.material ?? DefaultMaterial;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#materialBuffer = new MaterialBuffer(material);\n }\n else {\n let buffer = cache?.get(material);\n if (buffer?.disposed !== false) {\n buffer = new MaterialBuffer(material);\n cache.set(material, buffer);\n }\n this.#materialBuffer = buffer;\n }\n }\n _rebuildWorldMatrices({ device }) {\n //this.destroySafely(this.#worldTransform);\n const item = this.item;\n const matrix = this.buildWorldTransform();\n const normal = Matrix3D.transpose(Matrix3D.invert(matrix));\n const value = new Float32Array(28);\n value.set(Matrix3D.toArray(matrix), 0);\n value.set([normal.m11, normal.m12, normal.m13, 0, normal.m21, normal.m22, normal.m23, 0, normal.m31, normal.m32, normal.m33, 0], 16);\n //const current = this.#worldTransform;\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#worldTransform)) {\n const buffer = Buffers.createUniform(device, value, LABEL_PREFIX + 'mesh-' + item.key + '-worldmatrix-buffer');\n this.#worldTransform = { buffer, value, version: performance.now().roundoff() };\n }\n else {\n this.#worldTransform.value = value;\n this.#worldTransform.version = performance.now().roundoff();\n }\n //if (!Utils.isNull(current)) {\n // this.destroySafely(current);\n //}\n }\n dispose() {\n // memoizer\n this.#worldTransformBufferBag.clear();\n const world = this.#worldTransform;\n this.#worldTransform = null;\n this.destroySafely(world);\n const material = this.#materialBuffer;\n this.#materialBuffer = null;\n material?.destroy();\n const geometry = this.#geometryBuffer;\n this.#geometryBuffer = null;\n geometry?.destroy();\n }\n}\n// #endregion\n// #region LIGHTS\nclass RenderableLightBuffer extends RenderableBufferBase {\n #buffer;\n #bufferBag = new Map();\n constructor(light) {\n super(light);\n light.flags.push(StalePropertyFlag.Light);\n }\n /**\n * Ambient light buffer building\n * @param param0\n */\n _rebuildAmbientLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szColor = 4, szIntensity = 1, offsetColor = 0, offsetIntensity = 4;\n const szTotal = 24; // offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'ambient-light-buffer'), version: performance.now() };\n }\n /**\n * Directional light buffer building\n * @param param0\n */\n _rebuildDirectionalLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szDirection = 3, offsetColor = 0, offsetDirection = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // direction\n const direction = Vector3D.subtract(light.position, light.target);\n values.set([direction.x, direction.y, direction.z], offsetDirection);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'directional-light-buffer'), version: performance.now() };\n }\n /**\n * Omni light buffer building\n * @param param0\n */\n _rebuildOmniLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szPosition = 3, offsetColor = 0, offsetPosition = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // position\n values.set([light.position.x, light.position.y, light.position.z], offsetPosition);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'omni-light-buffer'), version: performance.now() };\n }\n _rebuildLight(context) {\n this.destroySafely(this.#buffer);\n const light = this.item;\n switch (light.type) {\n case 'direction':\n this._rebuildDirectionalLightBuffer(context);\n break;\n case 'omni':\n this._rebuildOmniLightBuffer(context);\n break;\n case 'ambient':\n this._rebuildAmbientLightBuffer(context);\n break;\n default:\n throw new Error(`Light '${light.type}' is not supported.`);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n const bag = this.#bufferBag;\n let fresh = Utils.isNull(this.#buffer) || this.allFlags().length > 0;\n if (fresh) {\n bag.clear();\n this._rebuildLight(context);\n }\n RenderableBuffers.clearFlags(this);\n const { pipeline } = context;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n if (key === 'light') {\n return Utils.extend(this.#buffer, { fresh });\n }\n throwBufferRequestError(key, RenderableLightBuffer);\n }\n dispose() {\n this.#bufferBag.clear();\n const buffer = this.#buffer;\n this.#buffer = null;\n this.destroySafely(buffer);\n }\n}\n// #endregion\n", "import { Geometry } from '@pacem/pacem-numerical';\nimport { isPerspectiveCamera, isOrthographicCamera } from '../../types';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst DEFAULT_SIZE = { width: 1, height: 1 };\nexport class Cameras {\n /**\n * Creates a new webgpu {@link Camera} given a canonic one.\n * @param camera\n * @returns\n */\n static create(camera) {\n if (isPerspectiveCamera(camera)) {\n return new PerspectiveCamera(camera);\n }\n if (isOrthographicCamera(camera)) {\n return new OrthographicCamera(camera);\n }\n throw new TypeError(`Camera type '${camera['type']}' not supported.`);\n }\n}\n/**\n * Camera orientation 4x4 matrix.\n * @param eye\n * @param target\n * @param up\n * @returns\n */\nfunction view(eye, target, up) {\n const z = /* inverse forward is eye -> target */ Vector3D.subtract(target, eye);\n const x = Vector3D.cross(up, z);\n const y = Vector3D.cross(z, x);\n Vector3D.normalize(x);\n Vector3D.normalize(z);\n Vector3D.normalize(y);\n const offsetX = -Vector3D.dot(x, eye);\n const offsetY = -Vector3D.dot(y, eye);\n const offsetZ = -Vector3D.dot(z, eye);\n return Matrix3D.from(x.x, y.x, z.x, 0, x.y, y.y, z.y, 0, x.z, y.z, z.z, 0, offsetX, offsetY, offsetZ, 1);\n}\nfunction assertNearFarCorrectness(near, far) {\n if (near <= 0) {\n throw new RangeError(\"Near plane distance must be positive.\");\n }\n if (far <= near) {\n throw new RangeError(\"Far plane distance must be greater than near plane distance.\");\n }\n}\n/**\n * Perspective transformation 4x4 matrix.\n * @param fovY Vertical field of view (in radians)\n * @param aspectRatio Frustum aspect ratio\n * @param near Clipping plane near distance (not z coordinate)\n * @param far Clipping plane far distance (not z coordinate)\n * @returns\n */\nfunction perspective(fovY = 120, aspectRatio = 1, near = 0.1, far = 1000) {\n assertNearFarCorrectness(near, far);\n const scale = Math.tan(.5 * Math.PI * (1 - fovY / 180));\n const m11 = scale / aspectRatio;\n const finitelyFar = Number.isFinite(far);\n const m33 = finitelyFar ? (far / (near - far)) : -1;\n const offsetZ = finitelyFar ? (far * near / (near - far)) : -near;\n return Matrix3D.from(m11, 0, 0, 0, 0, scale, 0, 0, 0, 0, m33, -1, 0, 0, offsetZ, 0);\n}\n/**\n * Othographic transformation 4x4 matrix.\n * @param left Viewport's left side\n * @param right Viewport's right side\n * @param top Viewport's top side\n * @param bottom Viewport's bottom side\n * @param near Clipping plane near distance\n * @param far Clipping plane far distance\n */\nfunction orthographic(left, right, top, bottom, near = .1, far = 1000) {\n assertNearFarCorrectness(near, far);\n return Matrix3D.from(2 / (right - left), 0, 0, 0, 0, 2 / (top - bottom), 0, 0, 0, 0, 1 / (near - far), 0, (left + right) / (left - right), (top + bottom) / (bottom - top), near / (near - far), 1);\n}\nexport class OrthographicCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const eye = camera.position, target = camera.lookAt;\n const z = Vector3D.subtract(target, eye);\n Vector3D.normalize(z);\n const zoom = Vector3D.dot(z, eye);\n const { height, width } = size;\n const ratio = width / height;\n const factor = .5 * zoom;\n const w = factor * ratio, h = factor;\n const top = camera.top * h, bottom = camera.bottom * h;\n const right = camera.right * w, left = camera.left * w;\n return orthographic(left, right, top, bottom, camera.near, camera.far);\n }\n view() {\n return OrthographicCamera.view(this._camera);\n }\n projection(size) {\n return OrthographicCamera.projection(this._camera, size);\n }\n}\nexport class PerspectiveCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const aspectRatio = (size.width / size.height) / camera.aspectRatio;\n return perspective(camera.fov, aspectRatio, camera.near, camera.far);\n }\n view() {\n return PerspectiveCamera.view(this._camera);\n }\n projection(size) {\n return PerspectiveCamera.projection(this._camera, size);\n }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { LABEL_PREFIX, GPUTextureUsage, GPUBufferUsage, GPUMapMode } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Raycasters {\n // learn from:\n // https://webglfundamentals.org/webgl/lessons/webgl-qna-how-to-get-the-3d-coordinates-of-a-mouse-click.html\n // https://github.com/mrdoob/three.js/blob/master/src/core/Raycaster.js\n // https://shi-yan.github.io/webgpuunleashed/Control/object_picking.html\n // https://gist.github.com/greggman/57c3c0d3cf1db14f1baad2d9b0094397 (color picking)\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n if (memoizer.has(ctx)) {\n const cache = memoizer.get(ctx);\n for (let raycaster of cache.values()) {\n raycaster.destroy();\n }\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n /** Creates a raycaster that uses color picking as a strategy to hit-test objects. */\n static createColorPicking(ctx) {\n const memoizer = this._memoizer;\n if (!memoizer.has(ctx)) {\n memoizer.set(ctx, new Map());\n }\n const cache = memoizer.get(ctx);\n const key = 'colorpick';\n if (cache.has(key)) {\n return cache.get(key);\n }\n const retval = new ColorPickingRaycaster(ctx);\n cache.set(key, retval);\n return retval;\n }\n}\nconst NUM_PIXELS = 1;\nclass ColorPickingRaycaster {\n constructor(_context) {\n this._context = _context;\n this._objects = new Map();\n this.frame = (interaction, ...buffers) => {\n if (Utils.isNull(this._encoder)) {\n throw new Error('Null encoder. Maybe you missed to call the \\'begin\\' method first.');\n }\n const objects = Array.from(buffers);\n const pipeline = RenderPipelines.createColorPicking(this._context, objects);\n pipeline?.frame(this._pass, interaction, ...buffers);\n for (let buffer of objects) {\n const item = buffer.item;\n if (item.inert) {\n continue;\n }\n //buffer.lock();\n this._objects.set(buffer.id, buffer);\n }\n };\n this.end = (pixel) => {\n if (!Utils.isNull(this._handle)) {\n return this._handle;\n }\n const pass = this._pass;\n const commandEncoder = this._encoder;\n const { device } = this._context;\n const { render } = this._textures;\n const pickTexture = render.texture;\n const pickBuffer = this._ensureBuffer();\n pass.end();\n commandEncoder.copyTextureToBuffer({\n texture: pickTexture,\n // mipLevel: 0,\n origin: {\n x: pixel.x,\n y: pixel.y,\n }\n }, {\n buffer: pickBuffer,\n bytesPerRow: ((NUM_PIXELS * 4 + 255) | 0) * 256,\n rowsPerImage: 1,\n }, {\n width: NUM_PIXELS,\n // height: 1,\n // depth: 1,\n });\n device.queue.submit([commandEncoder.finish()]);\n // remove\n this._encoder = null;\n const _this = this;\n const objects = _this._objects;\n const resetHandle = () => {\n _this._handle = null;\n };\n return this._handle = new Promise((resolve, _) => {\n pickBuffer.mapAsync(GPUMapMode.READ, 0, 4 * NUM_PIXELS).then(_ => {\n const ids = new Uint32Array(pickBuffer.getMappedRange(0, 4 * NUM_PIXELS));\n const id = ids[0];\n pickBuffer.unmap();\n // remove promise reference\n resetHandle();\n const buffer = objects.get(id);\n if (!buffer) {\n resolve([]);\n }\n else {\n resolve([buffer.item]);\n }\n // cleanup\n //pickBuffer.destroy();\n //pickTexture.destroy();\n //objects.values().forEach(b => b.unlock());\n });\n });\n };\n }\n _createTexture(format) {\n const { device, canvas } = this._context;\n const width = Math.min(device.limits.maxTextureDimension2D, canvas.clientWidth), height = Math.min(device.limits.maxTextureDimension2D, canvas.clientHeight);\n return device.createTexture({\n size: [width, height, 1],\n format,\n usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT\n });\n }\n _ensureBuffer() {\n const buffer = this._buffer;\n if (!Utils.isNull(buffer)) {\n return buffer;\n }\n const { device } = this._context;\n return this._buffer = device.createBuffer({\n label: LABEL_PREFIX + 'colorpick-output-buffer',\n size: NUM_PIXELS * 4,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n }\n _ensureTextures() {\n const textures = this._textures;\n if (!Utils.isNull(textures)) {\n return textures;\n }\n const renderTex = this._createTexture('r32uint'), depthTex = this._createTexture('depth24plus');\n const render = { texture: renderTex, view: renderTex.createView() };\n const depth = { texture: depthTex, view: depthTex.createView() };\n return this._textures = { render, depth };\n }\n ;\n _destroyTexture(texture) {\n if (Utils.isNull(texture)) {\n return;\n }\n texture.texture?.destroy();\n }\n destroy() {\n const textures = this._textures, buffer = this._buffer;\n if (!Utils.isNullOrEmpty(textures)) {\n const { render, depth } = textures;\n this._destroyTexture(render);\n this._destroyTexture(depth);\n this._textures = null;\n }\n if (!Utils.isNull(buffer)) {\n buffer.destroy();\n this._buffer = null;\n }\n }\n begin() {\n const { device } = this._context;\n this._encoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'colorpick-raycaster' });\n const { render, depth } = this._ensureTextures();\n const passDescriptor = {\n label: LABEL_PREFIX + 'colorpick-raycaster-pass',\n colorAttachments: [\n {\n view: render.view,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n depthStencilAttachment: {\n view: depth.view, // Assigned later\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n };\n this._pass = this._encoder.beginRenderPass(passDescriptor);\n this._objects.clear();\n }\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomEventUtils, avoidHandler, Behaviors, PropertyChangeEventName } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { isCamera, StalePropertyFlag } from '../../../types';\nimport { TAG_MIDDLE_NAME } from '../../../constants';\nimport { BooleanOrNumberConverter } from '../../../converters';\n//namespace Pacem.Components.Drawing3D {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst Quaternion = Geometry.LinearAlgebra.Quaternion;\nconst Spherical = Geometry.LinearAlgebra.Spherical;\nfunction findCameraStage(element) {\n if (isCamera(element)) {\n return element.stage;\n }\n return null;\n}\nconst ROTATION_FACTOR = 1, ZOOM_FACTOR = 1, FRICTION_FACTOR = .05, EPSILON = 0.001;\nconst DEFAULT_CONFIGURATION = {\n maxAzimuth: 180, minAzimuth: -180, inertia: false, maxPolar: Infinity, minPolar: -Infinity,\n zoom: { enabled: true }, pan: { enabled: true, button: 2 }, rotation: { enabled: true, button: 0 }\n};\nexport class OrbitCameraBehavior {\n constructor(item, _config) {\n this._config = _config;\n /** State of the current configuration, obtained from the interaction inputs. */\n this._input = {\n /** Zoom/scale */\n rho: 0,\n /** Azimuth (rotation around x axis in webgpu) */\n theta: 0,\n /** Polar (rotation around y axis in webgpu) */\n phi: 0,\n /** pan/offset x*/\n x: 0,\n /** pan/offset y*/\n y: 0,\n };\n /** Sibling state of {@link _input} that comes helpful when inertia is involved. */\n this._progress = {\n rho: 0,\n theta: 0,\n phi: 0,\n x: 0,\n y: 0,\n };\n this._startHandler = (evt) => {\n const { rotation, pan } = this._config;\n const isMouse = evt.pointerType === 'mouse';\n const rotating = rotation.enabled && isMouse && evt.button === rotation.button && CustomEventUtils.matchModifiers(evt, rotation.modifiers);\n const panning = pan.enabled && isMouse && evt.button === pan.button && CustomEventUtils.matchModifiers(evt, pan.modifiers);\n if (!rotating && !panning) {\n return;\n }\n this.#rotating = rotating;\n if (this.#panning = panning) {\n // build current state from the current camera configuration\n this._currentState = OrbitCameraBehavior._buildState(this._camera);\n // reset pan offsets\n Utils.extend(this._input, Vector3D.zero());\n this._progress.x = this._progress.y = 0;\n }\n avoidHandler(evt);\n window.addEventListener('pointerup', this._endHandler, false);\n window.addEventListener('pointermove', this._moveHandler, false);\n window.addEventListener('contextmenu', this._avoidHandler, false);\n };\n this._avoidHandler = (evt) => avoidHandler(evt);\n this._endHandler = (evt) => {\n avoidHandler(evt);\n // delay the listener removals a bit (~frame)\n window.setTimeout(() => {\n window.removeEventListener('pointerup', this._endHandler);\n window.removeEventListener('pointermove', this._moveHandler);\n window.removeEventListener('contextmenu', this._avoidHandler);\n }, 20);\n };\n this._zoomHandler = (evt) => {\n const { zoom } = this._config;\n const zooming = zoom.enabled && CustomEventUtils.matchModifiers(evt, zoom.modifiers);\n if (!zooming) {\n return;\n }\n avoidHandler(evt);\n const coords = this._input;\n coords.rho -= Math.sign(evt.deltaY);\n };\n this._moveHandler = (evt) => {\n avoidHandler(evt);\n const { height, width } = this._scene.size;\n const coords = this._input;\n const size = Math.min(height, width);\n if (this.#rotating) {\n // rotation\n const f0 = -ROTATION_FACTOR * 360 / size;\n const { phi, theta } = coords;\n const { maxPolar, minPolar, maxAzimuth, minAzimuth } = this._config;\n coords.phi = (phi + evt.movementX * f0).clamp(minPolar, maxPolar);\n coords.theta = (theta + evt.movementY * f0).clamp(minAzimuth, maxAzimuth);\n }\n else if (this.#panning) {\n // pan\n const f0 = this._currentState.radius / size;\n coords.x += -evt.movementX * f0;\n coords.y += evt.movementY * f0;\n }\n };\n this._renderHandler = (_) => {\n this._update();\n };\n const scene = this._scene = (this._camera = item).stage;\n this._initialState = this._currentState = OrbitCameraBehavior._buildState(item);\n const canvas = this._canvas = scene.stage;\n canvas.addEventListener('pointerdown', this._startHandler, false);\n canvas.addEventListener('wheel', this._zoomHandler, { passive: false });\n scene.addEventListener('render', this._renderHandler, false);\n }\n static _buildState(camera) {\n const vector = Vector3D.subtract(camera.position, camera.lookAt);\n const radius = Vector3D.mag(vector);\n return { target: camera.lookAt, versor: Vector3D.unit(vector), up: camera.up, radius, position: camera.position };\n }\n /**\n * Tries to attach a new {@link OrbitCameraBehavior} to the provided element, if the element is a proper renderable and it is ready.\n * @param element\n * @returns\n */\n static tryAttach(element, config) {\n config ??= DEFAULT_CONFIGURATION;\n const canvas = findCameraStage(element)?.stage;\n if (!Utils.isNull(canvas)) {\n const { position, lookAt } = element;\n if (Utils.isNull(position) || Utils.isNull(lookAt) || Vector3D.areClose(position, lookAt)) {\n return null;\n }\n return new OrbitCameraBehavior(element, config);\n }\n else {\n return null;\n }\n }\n get configuration() {\n return this._config;\n }\n set configuration(v) {\n this._config = v;\n }\n #panning;\n #rotating;\n _getSafeAzimuth({ theta }) {\n return OrbitCameraBehavior._modAngle(theta);\n }\n _getSafePolar({ phi }) {\n return OrbitCameraBehavior._modAngle(phi);\n }\n static _modAngle(deg) {\n while (deg < 0) {\n deg += 360;\n }\n return deg % 360;\n }\n static _getViewXYZ(state) {\n const { versor, up: initUp } = state;\n const right = Vector3D.cross(versor, initUp);\n const up = Vector3D.cross(right, versor);\n Vector3D.normalize(right);\n Vector3D.normalize(up);\n return { right, up, versor };\n }\n #updating;\n _update() {\n if (this.#updating) {\n return;\n }\n this.#updating = true;\n const camera = this._camera;\n const { radius, versor, target: initTarget, up: initUp } = this._initialState;\n const { target: trackedLookAt } = this._currentState;\n const { theta, phi, rho, x, y } = this._input;\n const progress = this._progress;\n const { theta: theta_, phi: phi_, rho: rho_, x: x_, y: y_ } = progress;\n const rotated = Math.abs(phi_ - phi) > EPSILON || Math.abs(theta_ - theta) > EPSILON, zoomed = Math.abs(rho_ - rho) > EPSILON, panned = Math.abs(x - x_) > EPSILON || Math.abs(y - y_) > EPSILON;\n if (zoomed || rotated || panned) {\n const inertia = typeof this._config.inertia === 'boolean' ? (this._config.inertia ? FRICTION_FACTOR : 0) : this._config.inertia;\n const inertiaSpecified = inertia > 0 && inertia < 1;\n const { right, up } = OrbitCameraBehavior._getViewXYZ(this._initialState);\n // setup position\n let newPosition = initTarget;\n let newUp = initUp;\n let newLookAt = trackedLookAt;\n //if (zoomed) { 2\n let rho0 = rho_;\n if (inertiaSpecified) {\n rho0 += (rho - rho_) * inertia;\n }\n else {\n rho0 = rho;\n }\n progress.rho = rho0;\n const scale = Math.pow(.95, rho0 * ZOOM_FACTOR);\n const zoom = Vector3D.scale(versor, -scale * radius);\n newPosition = Vector3D.add(newPosition, zoom);\n //}\n //if (rotated) { 3\n let phi0 = phi_;\n let theta0 = theta_;\n if (inertiaSpecified) {\n phi0 += (phi - phi_) * inertia;\n theta0 += (theta - theta_) * inertia;\n }\n else {\n phi0 = phi;\n theta0 = theta;\n }\n const PHI = this._getSafePolar({ phi: progress.phi = phi0 });\n const THETA = this._getSafeAzimuth({ theta: progress.theta = theta0 });\n // pivot of the rotation matrix should be the center of the bounding sphere\n const pivot = Vector3D.negate(initTarget);\n let m = Matrix3D.translate(Matrix3D.identity(), pivot);\n const qy = Quaternion.fromAxisAngle(up, PHI);\n const qx = Quaternion.fromAxisAngle(right, THETA);\n const rot = Matrix3D.multiply(Quaternion.toRotationMatrix(qx), Quaternion.toRotationMatrix(qy));\n m = Matrix3D.multiply(m, rot);\n m = Matrix3D.translate(m, Vector3D.negate(pivot));\n newPosition = Matrix3D.transform(newPosition, m);\n newUp = Matrix3D.transform(newUp, Matrix3D.clone(m, m0 => { m0.offsetX = m0.offsetY = m0.offsetZ = 0; }));\n //}\n //if (panned){ 1\n const x1 = x_, y1 = y_;\n let x0 = x1, y0 = y1;\n if (inertiaSpecified) {\n x0 += (x - x1) * inertia;\n y0 += (y - y1) * inertia;\n }\n else {\n x0 = x;\n y0 = y;\n }\n progress.x = x0;\n progress.y = y0;\n const { right: currentRight, up: currentUp } = OrbitCameraBehavior._getViewXYZ(this._currentState);\n const r = Vector3D.scale(currentRight, x0), u = Vector3D.scale(currentUp, y0);\n const offset = Vector3D.add(r, u);\n newLookAt = Vector3D.add(trackedLookAt, offset);\n camera.lookAt = newLookAt;\n camera.position = newPosition; // Vector3D.add(newPosition, Vector3D.subtract(initTarget, newLookAt));\n camera.up = newUp;\n // notify something has changed about the target renderable\n camera.flags.push(StalePropertyFlag.Camera);\n }\n this.#updating = false;\n }\n /** Detaches and removes handlers and resources. */\n dispose() {\n const canvas = this._canvas, scene = this._scene;\n if (!Utils.isNull(canvas)) {\n canvas.removeEventListener('pointerdown', this._startHandler);\n canvas.removeEventListener('wheel', this._zoomHandler);\n }\n scene.removeEventListener('render', this._renderHandler, false);\n }\n}\nlet PacemOrbitCameraBehaviorElement = class PacemOrbitCameraBehaviorElement extends Behaviors.PacemBehavior {\n constructor() {\n super(...arguments);\n this.#map = new Map();\n this._readyHandler = (evt) => {\n if (evt.detail.propertyName === 'isReady' && evt.detail.currentValue === true) {\n const element = evt.currentTarget;\n element.removeEventListener(PropertyChangeEventName, this._readyHandler);\n this._decorateCore(element);\n }\n };\n }\n #map;\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'maxAzimuth':\n case 'minAzimuth':\n case 'inertia':\n case 'zoomControl':\n case 'panControl':\n case 'rotationControl':\n const config = this._buildConfig();\n const items = this.#map;\n for (let tr of items.values()) {\n tr.configuration = config;\n }\n break;\n }\n }\n disconnectedCallback() {\n const items = this.#map;\n for (let tr of items.values()) {\n tr.dispose();\n }\n items.clear();\n super.disconnectedCallback();\n }\n _buildConfig() {\n return Utils.extend({}, DEFAULT_CONFIGURATION, {\n maxAzimuth: this.maxAzimuth ?? Infinity,\n minAzimuth: this.minAzimuth ?? -Infinity,\n minPolar: this.minPolar ?? -Infinity,\n maxPolar: this.maxPolar ?? Infinity,\n inertia: this.inertia ?? false,\n zoom: this.zoomControl ?? DEFAULT_CONFIGURATION.zoom,\n pan: this.panControl ?? DEFAULT_CONFIGURATION.pan,\n rotation: this.rotationControl ?? DEFAULT_CONFIGURATION.rotation,\n });\n }\n _decorateCore(element) {\n const behavior = OrbitCameraBehavior.tryAttach(element, this._buildConfig());\n if (!Utils.isNull(behavior)) {\n this.#map.set(element, behavior);\n }\n }\n decorate(element) {\n if (element.isConnected) {\n this._decorateCore(element);\n }\n else {\n element.addEventListener(PropertyChangeEventName, this._readyHandler, false);\n }\n }\n undecorate(element) {\n const map = this.#map;\n if (map.has(element)) {\n map.get(element).dispose();\n map.delete(element);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"zoomControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"rotationControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"panControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: BooleanOrNumberConverter })\n], PacemOrbitCameraBehaviorElement.prototype, \"inertia\", void 0);\nPacemOrbitCameraBehaviorElement = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-orbit-camera' })\n], PacemOrbitCameraBehaviorElement);\nexport { PacemOrbitCameraBehaviorElement };\n", "export * from './types';\nexport * from './geometry';\nexport * from './decorators';\nexport * from './converters';\nexport * from './materials/material';\nexport * from './parsers/parser';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Transformer } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { MeshGeometry } from '../geometry';\nimport { Point3DConverter } from '../converters';\n//namespace Pacem.Drawing3D {\nclass OBJParser {\n static parse(content) {\n // vertices\n const vertices = [];\n const vParser = /^v((\\s+-?[\\d\\.]+){3})/gm;\n let arr = vParser.exec(content);\n while (arr && arr.length) {\n vertices.push(Point3DConverter.convert(arr[1]));\n arr = vParser.exec(content);\n }\n // uvmap\n const vt = [];\n const tParser = /^vt((\\s+-?[\\d\\.]+){2})/gm;\n arr = tParser.exec(content);\n while (arr && arr.length) {\n vt.push(Point.parse(arr[1]));\n arr = tParser.exec(content);\n }\n // normals\n const vn = [];\n const nParser = /^vn((\\s+-?[\\d\\.]+){3})/gm;\n arr = nParser.exec(content);\n while (arr && arr.length) {\n vn.push(Point3DConverter.convert(arr[1]));\n arr = nParser.exec(content);\n }\n const normals = [];\n const uv = [];\n const positions = [];\n const fParser = /^f((\\s+([\\d]+\\/[\\d]+\\/[\\d]+)){3,})/gm;\n arr = fParser.exec(content);\n while (arr && arr.length) {\n const fjParser = /([\\d]+)\\/([\\d]+)\\/([\\d]+)/g;\n const face = arr[1];\n let jArr = fjParser.exec(face);\n let jIndex = 0;\n var vIndex0, tIndex0, nIndex0;\n var vIndex, tIndex, nIndex;\n while (jArr && jArr.length) {\n if (jIndex > 2) {\n // 4+ vertex-face\n // but mesh only allows triangluar faces\n // re-add(0)\n positions.push(vIndex0);\n uv.push(vt[tIndex0]);\n normals.push(vn[nIndex0]);\n // re-add(last)\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n }\n // OBJ indexes are 1-based\n vIndex = parseInt(jArr[1]) - 1;\n tIndex = parseInt(jArr[2]) - 1;\n nIndex = parseInt(jArr[3]) - 1;\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n if (jIndex === 0) {\n vIndex0 = vIndex;\n tIndex0 = tIndex;\n nIndex0 = nIndex;\n }\n jIndex++;\n jArr = fjParser.exec(face);\n }\n // loop\n arr = fParser.exec(content);\n }\n // faces\n return new MeshGeometry(vertices, positions, uv, normals);\n }\n}\nclass Parser3D {\n static parseGeometry(content, type) {\n switch (type.toLowerCase()) {\n case 'obj':\n return OBJParser.parse(content);\n default:\n throw new Error(`Type '${type}' is not supported.`);\n }\n }\n}\n__decorate([\n Transformer('parse3D')\n], Parser3D, \"parseGeometry\", null);\n"],
4
+ "sourcesContent": ["export * as Drawing3D from './index-components-drawing3d';\n", "export * from './types';\nexport * from './detector';\nexport * from './materials/material';\nexport * from './materials/basic';\nexport * from './materials/lambert';\nexport * from './materials/line';\nexport * from './materials/phong';\nexport * from './materials/standard';\nexport * from './primitives/primitive';\nexport * from './primitives/box';\nexport * from './primitives/cone';\nexport * from './primitives/cylinder';\nexport * from './primitives/line';\nexport * from './primitives/plane';\nexport * from './primitives/polyhedra';\nexport * from './primitives/sphere';\nexport * from './primitives/torus';\nexport * from './adapters/shared';\nexport * from './adapters/threejsadapter';\nexport * from './adapters/webgpu/webgpuadapter';\nexport * from './adapters/webgpu/behaviors/orbit-camera';\nexport * from './stage';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Watch, PropertyConverters, CustomElement, PacemEventTarget, PropertyChangeEvent, CustomElementUtils, CustomUIEvent, P, Utils, Components } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { Point3DConverter, Point3DOrNumberConverter, QuaternionConverter } from './converters';\nimport { Pacem3DElement } from './stage';\nimport { TAG_MIDDLE_NAME } from './constants';\nexport function isStage(object) {\n return !Utils.isNull(object) && 'render' in object && typeof object['render'] === 'function';\n}\nexport function isRenderable(object) {\n return isStage(object?.stage);\n}\nexport function isUi3DObject(object) {\n return 'transformMatrix' in object && isRenderable(object);\n}\nexport function isCamera(object) {\n return 'type' in object && 'up' in object && 'lookAt' in object && isRenderable(object);\n}\nexport function isPerspectiveCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'perspective';\n}\nexport function isOrthographicCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'orthographic';\n}\nexport function isLight(object) {\n return 'type' in object && (object.type === 'ambient' || object.type === 'omni' || object.type === 'direction' || object.type == 'spot') && isRenderable(object);\n}\nexport function isMesh(object) {\n return 'geometry' in object && isUi3DObject(object);\n}\nexport function isGeometry(object) {\n return 'positions' in object && Utils.isArray(object.positions);\n}\nexport function isMeshGeometry(object) {\n return ('triangleIndices' in object && Utils.isArray(object.triangleIndices)\n || 'normals' in object && Utils.isArray(object.normals)\n || 'textureCoordinates' in object && Utils.isArray(object.textureCoordinates)) && isGeometry(object);\n}\nexport function isGroup(object) {\n return 'childRenderables' in object && Utils.isArray(object['childRenderables']) && isUi3DObject(object);\n}\n/**\n * Sets the normals to a mesh geometry by computing each face's unit orthogonal vector.\n * @param geometry\n */\nexport function computeSharpVertexNormals(geometry) {\n const normals = [];\n if (!Utils.isNullOrEmpty(geometry)) {\n const indices = geometry.triangleIndices;\n if (indices.length % 3 !== 0) {\n throw new RangeError(`Invalid mesh geometry: ${indices.length} is not multiple of 3.`);\n }\n for (let j = 2; j < indices.length; j += 3) {\n const u = indices[j - 2], v = indices[j - 1], w = indices[j];\n const a = geometry.positions[u], b = geometry.positions[v], c = geometry.positions[w];\n const normal = computePlaneNormal(a, b, c);\n normals.push(normal, normal, normal);\n }\n }\n geometry.normals = normals;\n}\n/**\n * Computes the unit vector orthogonal to the plane identified by 3 points.\n * @param a\n * @param b\n * @param c\n */\nexport function computePlaneNormal(a, b, c) {\n // TODO: check input correctness (distinct points)\n const vAB = Geometry.LinearAlgebra.Vector3D.subtract(a, b), vAC = Geometry.LinearAlgebra.Vector3D.subtract(a, c);\n const orthogonal = Geometry.LinearAlgebra.Vector3D.cross(vAB, vAC);\n return Geometry.LinearAlgebra.Vector3D.unit(orthogonal);\n}\nexport class UI3DEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent, point) {\n super(type, eventInit, originalEvent);\n this.#point = point;\n }\n #point;\n /** Gets the event's source position in 3d coordinates. */\n get point() {\n return this.#point;\n }\n}\nexport class DragEvent extends UI3DEvent {\n}\nexport class RenderableEvent extends UI3DEvent {\n constructor(type, args, originalEvent, p) {\n super(type, { detail: args, bubbles: true, cancelable: true }, originalEvent, p);\n }\n}\nexport var StalePropertyFlag;\n(function (StalePropertyFlag) {\n StalePropertyFlag[\"Position\"] = \"position\";\n StalePropertyFlag[\"Transform\"] = \"transform\";\n StalePropertyFlag[\"Geometry\"] = \"geometry\";\n StalePropertyFlag[\"Children\"] = \"children\";\n StalePropertyFlag[\"Material\"] = \"material\";\n StalePropertyFlag[\"Light\"] = \"light\";\n StalePropertyFlag[\"Camera\"] = \"camera\";\n StalePropertyFlag[\"Visibility\"] = \"visibility\";\n})(StalePropertyFlag || (StalePropertyFlag = {}));\nexport function isInteraction(object) {\n return typeof object === 'object' && 'time' in object && typeof object['time'] === 'number';\n}\n//namespace Pacem.Components.Drawing3D {\nconst Constants = {\n OBJECT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-object',\n LIGHT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-light',\n PERSPECTIVE_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-perspective-camera',\n ORTHO_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-orthographic-camera',\n LINE_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-line',\n MESH_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-mesh',\n GROUP_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-group',\n DEFAULT_COORDS: { x: 0, y: 0, z: 0 }\n};\nexport class RenderableElement extends Components.PacemCrossItemsContainerElement {\n constructor() {\n super(...arguments);\n this.position = Constants.DEFAULT_COORDS;\n this.#staleFlags = [];\n }\n validate(_) {\n // by default no children allowed (Group will except)\n return false;\n }\n findContainer() {\n // override\n return this.parent || this.stage;\n }\n get stage() {\n return this['_scene'] = this['_scene'] || CustomElementUtils.findAncestorOfType(this, Pacem3DElement);\n }\n get parent() {\n return this['_drawableParent'] = this['_drawableParent'] || CustomElementUtils.findAncestor(this, i => i instanceof RenderableElement);\n }\n disconnectedCallback() {\n delete this['_scene'];\n delete this['_drawableParent'];\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'hide':\n this.setAsDirty(StalePropertyFlag.Visibility);\n break;\n case 'items':\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n case 'position':\n this.setAsDirty(StalePropertyFlag.Position);\n break;\n }\n }\n #staleFlags;\n get flags() {\n return this.#staleFlags;\n }\n /** Calls for a redraw of the current element in the next rendering process. */\n setAsDirty(...flags) {\n // set the flags that identify the stale part of the object to be updated.\n for (let flag of flags) {\n if (!this.flags.includes(flag)) {\n this.flags.push(flag);\n }\n }\n this.stage?.render(this);\n }\n}\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], RenderableElement.prototype, \"position\", void 0);\n__decorate([\n Watch({ emit: false, reflectBack: true, converter: PropertyConverters.String })\n], RenderableElement.prototype, \"tag\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], RenderableElement.prototype, \"inert\", void 0);\nexport class Ui3DElement extends RenderableElement {\n // #endregion\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'transformMatrix':\n this.setAsDirty(StalePropertyFlag.Transform);\n break;\n case 'translateZ':\n case 'translateX':\n case 'translateY':\n this.offset = { x: this.translateX, y: this.translateY, z: this.translateZ };\n break;\n case 'scaleX':\n case 'scaleY':\n case 'scaleZ':\n this.scale = { x: this.scaleX, y: this.scaleY, z: this.scaleZ };\n break;\n case 'scale':\n case 'offset':\n case 'rotate':\n this._computeTransformMatrix();\n break;\n }\n }\n _computeTransformMatrix() {\n const MAT3D = Geometry.LinearAlgebra.Matrix3D, VEC3D = Geometry.LinearAlgebra.Vector3D, QUAT = Geometry.LinearAlgebra.Quaternion;\n // scale\n const scale = this.scale ?? VEC3D.from(1, 1, 1);\n let m = MAT3D.scale(MAT3D.identity(), scale);\n // rotate\n if (!Utils.isNull(this.rotate)) {\n const rot = QUAT.toRotationMatrix(this.rotate);\n m = MAT3D.multiply(m, rot);\n }\n // translate\n const offset = this.offset ?? VEC3D.from(0, 0, 0);\n m = MAT3D.translate(m, offset);\n this.transformMatrix = m;\n }\n}\n__decorate([\n Watch({ emit: false, converter: QuaternionConverter })\n], Ui3DElement.prototype, \"rotate\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"scale\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"offset\", void 0);\n__decorate([\n Watch({ emit: false })\n], Ui3DElement.prototype, \"transformMatrix\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleZ\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateZ\", void 0);\nlet Pacem3DGroupElement = class Pacem3DGroupElement extends Ui3DElement {\n validate(child) {\n // overrides default denial\n return child instanceof RenderableElement;\n }\n #children = [];\n get childRenderables() {\n return this.#children;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'items':\n case 'datasource':\n this.#children = (val || []);\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DGroupElement.prototype, \"datasource\", void 0);\nPacem3DGroupElement = __decorate([\n CustomElement({ tagName: Constants.GROUP_SELECTOR })\n], Pacem3DGroupElement);\nexport { Pacem3DGroupElement };\nlet Pacem3DMeshElement = class Pacem3DMeshElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'geometry':\n this.setAsDirty(StalePropertyFlag.Geometry);\n break;\n case 'material':\n case 'backMaterial':\n this.setAsDirty(StalePropertyFlag.Material);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"geometry\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"backMaterial\", void 0);\nPacem3DMeshElement = __decorate([\n CustomElement({ tagName: Constants.MESH_SELECTOR })\n], Pacem3DMeshElement);\nexport { Pacem3DMeshElement };\nlet Pacem3DObjectElement = class Pacem3DObjectElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'content' || name === 'type') {\n this.setAsDirty(StalePropertyFlag.Geometry, StalePropertyFlag.Material);\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DObjectElement.prototype, \"content\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DObjectElement.prototype, \"type\", void 0);\nPacem3DObjectElement = __decorate([\n CustomElement({ tagName: Constants.OBJECT_SELECTOR })\n], Pacem3DObjectElement);\nexport { Pacem3DObjectElement };\nlet Pacem3DLightElement = class Pacem3DLightElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.intensity = .85;\n this.target = Constants.DEFAULT_COORDS;\n this.color = '#fff';\n this.type = 'omni';\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'color':\n case 'intensity':\n case 'target':\n this.setAsDirty(StalePropertyFlag.Light);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DLightElement.prototype, \"intensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DLightElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"type\", void 0);\nPacem3DLightElement = __decorate([\n CustomElement({ tagName: Constants.LIGHT_SELECTOR })\n], Pacem3DLightElement);\nexport { Pacem3DLightElement };\nexport class Pacem3DCameraElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.near = 0.1;\n this.far = 1000.0;\n this.up = Geometry.LinearAlgebra.Vector3D.j();\n this.lookAt = Constants.DEFAULT_COORDS;\n }\n #sphere;\n _resetBoundingSphere() {\n const oldValue = this.#sphere;\n const eye = this.position, center = this.lookAt;\n const radius = Utils.isNullOrEmpty(eye) || Utils.isNullOrEmpty(center) ? 0\n : Geometry.LinearAlgebra.Vector3D.mag(Geometry.LinearAlgebra.Vector3D.subtract(eye, center));\n const currentValue = this.#sphere = { center, radius };\n this.dispatchEvent(new PropertyChangeEvent({ currentValue, propertyName: 'boundingSphere', oldValue }));\n }\n get boundingSphere() {\n return this.#sphere;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'lookAt':\n case 'position':\n this._resetBoundingSphere();\n case 'near':\n case 'far':\n case 'up':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"near\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"far\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"up\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"lookAt\", void 0);\nlet Pacem3DPerspectiveCameraElement = class Pacem3DPerspectiveCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.fov = 45;\n this.aspect = 1;\n }\n get type() {\n return \"perspective\";\n }\n get aspectRatio() {\n return this.aspect;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'fov':\n case 'aspect':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"fov\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"aspect\", void 0);\nPacem3DPerspectiveCameraElement = __decorate([\n CustomElement({ tagName: Constants.PERSPECTIVE_CAMERA_SELECTOR })\n], Pacem3DPerspectiveCameraElement);\nexport { Pacem3DPerspectiveCameraElement };\nlet Pacem3DOrthographicCameraElement = class Pacem3DOrthographicCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.top = 1;\n this.left = -1;\n this.bottom = -1;\n this.right = 1;\n }\n get type() {\n return \"orthographic\";\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'top':\n case 'left':\n case 'bottom':\n case 'right':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"top\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"left\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"bottom\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"right\", void 0);\nPacem3DOrthographicCameraElement = __decorate([\n CustomElement({ tagName: Constants.ORTHO_CAMERA_SELECTOR })\n], Pacem3DOrthographicCameraElement);\nexport { Pacem3DOrthographicCameraElement };\nexport class Pacem3DAdapterElement extends PacemEventTarget {\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { parseAsNumericalArray } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\n//namespace Pacem.Drawing3D {\nexport const Point3DConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Vector3D.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const Point3DOrNumberConverter = {\n convert: (attr) => {\n const arr = parseAsNumericalArray(attr);\n const throwErr = () => { throw new Error(`Cannot parse \"${attr}\" as a valid Vector3D.`); };\n if (Utils.isNullOrEmpty(arr)) {\n throwErr();\n }\n if (arr.length === 3) {\n return Geometry.LinearAlgebra.Vector3D.from(...arr);\n }\n if (arr.length === 1) {\n const v = arr[0];\n return Geometry.LinearAlgebra.Vector3D.from(v, v, v);\n }\n throwErr();\n },\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const QuaternionConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Quaternion.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0} ${prop.w || 0}`\n};\nexport const BooleanOrNumberConverter = {\n convert: (attr) => {\n if (attr === 'true')\n return true;\n if (attr === 'false')\n return false;\n return parseAsNumericalArray(attr)[0];\n },\n convertBack: (prop) => prop.toString()\n};\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, PCSS, Defaults, ViewChild, Watch, PropertyConverters, Utils, Components, PropertyChangeEventName, Logging, Animations, UI } from '@pacem/pacem-core';\nimport { RenderableEvent, DragEvent, RenderableElement } from './types';\nimport { TAG_MIDDLE_NAME } from './constants';\n//namespace Pacem.Components.Drawing3D {\nlet Pacem3DElement = class Pacem3DElement extends Components.PacemItemsContainerElement {\n constructor() {\n super(...arguments);\n this._itemPropertyChangeHandler = (evt) => {\n const renderable = evt.target;\n // clear flags\n // TODO: be more precise\n this.adapter &&\n this.adapter.updateItem(this, renderable);\n renderable.flags.splice(0);\n };\n this._clickHandler = (evt) => {\n let me = this;\n if (!me.interactive || Utils.isNull(me._lastHitResult)) {\n return;\n }\n const type = evt.type.replace(/^mouse/, '');\n const hit = me._lastHitResult, object = hit.object, point = hit.point;\n this._itemDispatch(object, point, type, evt);\n };\n this._hitTestCallback = (result, evt) => {\n const me = this;\n // TODO: handle dragging\n if (result != me._lastHitResult) {\n if (result?.object != me._lastHitResult?.object) {\n const obj = result?.object, last = me._lastHitResult?.object, pt = result?.point;\n if (!Utils.isNull(last)) {\n this._itemDispatch(last, pt, 'out', evt);\n }\n if (!Utils.isNull(obj)) {\n this._itemDispatch(obj, pt, 'over', evt);\n }\n }\n me._lastHitResult = result;\n }\n };\n this._moveHandler = (evt) => {\n let me = this;\n if (!me.adapter || !me.interactive) {\n return;\n }\n const rect = me._resizer.currentSize;\n const callback = (r) => me._hitTestCallback(r, evt);\n const pixel = evt.type === 'mousemove' ? { x: evt.pageX - rect.left, y: evt.pageY - rect.top } : { x: -1, y: -1 };\n me.adapter.raycast(this, pixel, rect, callback);\n };\n this._resizeHandler = (evt) => {\n const oldSize = this.#size;\n const size = evt.detail;\n if (!Utils.isNull(oldSize) && oldSize.height === size.height && oldSize.width === size.width) {\n return;\n }\n this.#size = size;\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n this.adapter.invalidateSize(this, size);\n this.dispatchEvent(new Components.ResizeEvent(size));\n }\n };\n //#endregion\n }\n validate(item) {\n return item instanceof RenderableElement;\n }\n get stage() {\n return this._container;\n }\n get scene() {\n return this.adapter && this.adapter.getScene(this);\n }\n register(item) {\n const retval = super.register(item);\n if (retval) {\n this._add(item);\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n }\n return retval;\n }\n unregister(item) {\n const retval = super.unregister(item);\n if (retval) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n this._erase(item);\n }\n return retval;\n }\n _refreshDatasource(val = this.datasource) {\n this.adapter?.updateItem(this, undefined);\n }\n _buildUpDatasourceFromDOM(val = this.items) {\n if (!Utils.isNullOrEmpty(val)) {\n this.datasource = val.slice();\n }\n }\n _add(item) {\n this.adapter &&\n this.adapter.addItem(this, item);\n }\n _erase(item) {\n this.adapter &&\n this.adapter.removeItem(this, item);\n }\n _initializeAdapter(old, val) {\n return new Promise((resolve, reject) => {\n const items = this.datasource || [];\n if (!Utils.isNull(old)) {\n items.forEach(i => old.removeItem(this, i));\n }\n if (!Utils.isNull(this._container) && !Utils.isNull(val)) {\n val.initialize(this).then(_ => {\n (items || []).forEach(i => this._add(i));\n resolve();\n }, e => {\n this.log(Logging.LogLevel.Error, e?.toString());\n reject(e);\n });\n }\n else {\n resolve();\n }\n });\n }\n //#region lifecycle\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'adapter':\n this._initializeAdapter(old, val);\n break;\n case 'items':\n this._buildUpDatasourceFromDOM(val);\n break;\n case 'transparent':\n this.adapter?.invalidateSize(this, this.size);\n break;\n case 'datasource':\n this._refreshDatasource(val);\n case 'disabled':\n case 'background':\n this.render();\n break;\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n // stage\n const container = this._container;\n // resizer\n const resizer = this._resizer;\n resizer.addEventListener('resize', this._resizeHandler, false);\n resizer.target = container;\n // adapter\n this._initializeAdapter(null, this.adapter).then(_ => {\n container.addEventListener('mousemove', this._moveHandler, false);\n container.addEventListener('click', this._clickHandler, false);\n container.addEventListener('mouseup', this._clickHandler, false);\n container.addEventListener('mousedown', this._clickHandler, false);\n container.addEventListener('mouseout', this._moveHandler, false);\n this._buildUpDatasourceFromDOM();\n this.render();\n });\n }\n _itemDispatch(target, point, type, offset) {\n if (!Utils.isNull(target)) {\n var dragArgs, originalEvent, evtType;\n if (offset instanceof Event) {\n originalEvent = offset;\n }\n else {\n dragArgs = { item: target, offset: offset };\n }\n if (typeof type === 'string') {\n evtType = type;\n }\n else {\n evtType = type.type;\n originalEvent = type.originalEvent;\n }\n const m = point;\n const evt = () => offset instanceof Event ? new RenderableEvent(evtType, target, originalEvent, m) : new DragEvent(evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m), itemevt = offset instanceof Event ? new RenderableEvent('item' + evtType, target, originalEvent, m) : new DragEvent('item' + evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m);\n var prevent = false;\n if (target instanceof EventTarget) {\n const evnt = evt();\n target.dispatchEvent(evnt);\n prevent = evnt.defaultPrevented;\n }\n target.stage.dispatchEvent(itemevt);\n // was the event (in one of its forms) rejected?\n return prevent || itemevt.defaultPrevented;\n }\n return false;\n }\n disconnectedCallback() {\n this.#handle?.stop();\n const resizer = this._resizer, container = this._container;\n if (!Utils.isNull(container)) {\n container.removeEventListener('click', this._clickHandler, false);\n container.removeEventListener('mouseup', this._clickHandler, false);\n container.removeEventListener('mousedown', this._clickHandler, false);\n container.removeEventListener('mousemove', this._moveHandler, false);\n container.removeEventListener('mouseout', this._moveHandler, false);\n }\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener('resize', this._resizeHandler, false);\n }\n super.disconnectedCallback();\n }\n #size;\n get size() {\n return this.#size;\n }\n render(item, deepUpdate, now = performance.now()) {\n if (!Utils.isNull(item)) {\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n adapter.updateItem(this, item);\n }\n }\n else {\n this.#handle?.stop();\n this.#handle = Animations.Timer.run(_ => this._doRender());\n //this._doRender();\n }\n }\n #handle;\n _doRender() {\n if (!this.disabled && !Utils.isNull(this.adapter)) {\n const scene = this.adapter.getScene(this);\n let cancelable = new CustomEvent('prerender', { detail: { scene }, cancelable: true });\n this.dispatchEvent(cancelable);\n if (!cancelable.defaultPrevented) {\n this.adapter.render(this);\n this.dispatchEvent(new CustomEvent('render', { detail: { scene } }));\n }\n }\n }\n};\n__decorate([\n ViewChild(`.${PCSS}-3d`)\n], Pacem3DElement.prototype, \"_container\", void 0);\n__decorate([\n ViewChild(P + '-resize')\n], Pacem3DElement.prototype, \"_resizer\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"interactive\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"transparent\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DElement.prototype, \"background\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Element })\n], Pacem3DElement.prototype, \"adapter\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"orbit\", void 0);\nPacem3DElement = __decorate([\n CustomElement({\n tagName: P + '-' + TAG_MIDDLE_NAME, shadow: Defaults.USE_SHADOW_ROOT, template: `<${P}-resize watch-position=\"true\"></${P}-resize><div class=\"${PCSS}-3d\"></div><${P}-content></${P}-content>`\n })\n], Pacem3DElement);\nexport { Pacem3DElement };\n", "export const TAG_MIDDLE_NAME = \"3d\";\nexport const DEG2RAD = Math.PI / 180;\n", "//namespace Pacem.Components.Drawing3D {\n/** @deprecated*/\nexport class Pacem3DDetector {\n constructor() {\n this._detected = {\n supported: false, info: {}\n };\n let cvs = document.createElement('canvas');\n let contextNames = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];\n let ctx;\n let getParam = function (str) {\n if (!str)\n return undefined;\n return ctx.getParameter(str);\n };\n // addLine\n let addLine = (section, name, value) => {\n let detected = this._detected;\n var info = detected.info[section] = detected.info[section] || {};\n name = name.replace(/[^\\w]+/g, '');\n name = name.substring(0, 1).toLowerCase() + name.substring(1);\n info[name] = value;\n };\n if (navigator.userAgent.indexOf('MSIE') >= 0) {\n try {\n ctx = window['WebGLHelper'].CreateGLContext(cvs, 'canvas');\n }\n catch (e) { }\n }\n else {\n for (var i = 0; i < contextNames.length; i++) {\n try {\n ctx = cvs.getContext(contextNames[i]);\n if (ctx) {\n addLine('main', 'Context Name', contextNames[i]);\n break;\n }\n }\n catch (e) { }\n }\n }\n this._detected.supported = !!ctx;\n addLine('main', 'Platform', navigator.platform);\n addLine('main', 'Agent', navigator.userAgent);\n if (ctx) {\n addLine('main', 'Vendor', getParam(ctx.VENDOR));\n addLine('main', 'Version', getParam(ctx.VERSION));\n addLine('main', 'Renderer', getParam(ctx.RENDERER));\n addLine('main', 'Shading Language Version', getParam(ctx.SHADING_LANGUAGE_VERSION));\n addLine('bits', 'Rgba Bits', getParam(ctx.RED_BITS) + ', ' + getParam(ctx.GREEN_BITS) + ', ' + getParam(ctx.BLUE_BITS) + ', ' + getParam(ctx.ALPHA_BITS));\n addLine('bits', 'Depth Bits', getParam(ctx.DEPTH_BITS));\n addLine('shader', 'Max Vertex Attribs', getParam(ctx.MAX_VERTEX_ATTRIBS));\n addLine('shader', 'Max Vertex Texture Image Units', getParam(ctx.MAX_VERTEX_TEXTURE_IMAGE_UNITS));\n addLine('shader', 'Max Varying Vectors', getParam(ctx.MAX_VARYING_VECTORS));\n addLine('shader', 'Max Uniform Vectors', getParam(ctx.MAX_VERTEX_UNIFORM_VECTORS));\n addLine('tex', 'Max Combined Texture Image Units', getParam(ctx.MAX_COMBINED_TEXTURE_IMAGE_UNITS));\n addLine('tex', 'Max Texture Size', getParam(ctx.MAX_TEXTURE_SIZE));\n addLine('tex', 'Max Cube Map Texture Size', getParam(ctx.MAX_CUBE_MAP_TEXTURE_SIZE));\n addLine('tex', 'Num. Compressed Texture Formats', getParam(ctx.COMPRESSED_TEXTURE_FORMATS));\n addLine('misc', 'Max Render Buffer Size', getParam(ctx.MAX_RENDERBUFFER_SIZE));\n addLine('misc', 'Max Viewport Dimensions', getParam(ctx.MAX_VIEWPORT_DIMS));\n addLine('misc', 'Aliased Line Width Range', getParam(ctx.ALIASED_LINE_WIDTH_RANGE));\n addLine('misc', 'Aliased Point Size Range', getParam(ctx.ALIASED_POINT_SIZE_RANGE));\n addLine('misc', 'Supported Extensions', ctx.getSupportedExtensions() || []);\n }\n }\n get info() {\n return this._detected.info;\n }\n get supported() {\n return this._detected.supported;\n }\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Utils, Watch, PropertyConverters, PCSS } from '@pacem/pacem-core';\nimport { Imaging } from '@pacem/pacem-foundation';\nimport { StalePropertyFlag } from '../types';\n//namespace Pacem.Drawing3D {\nexport var KnownShader;\n(function (KnownShader) {\n KnownShader[\"Basic\"] = \"basic\";\n KnownShader[\"Lambert\"] = \"lambert\";\n KnownShader[\"Phong\"] = \"phong\";\n KnownShader[\"Standard\"] = \"standard\";\n KnownShader[\"Line\"] = \"line\";\n KnownShader[\"Custom\"] = \"custom\";\n})(KnownShader || (KnownShader = {}));\nexport function isMaterial(obj) {\n return /*'color' in obj &&*/ 'shader' in obj;\n}\nexport function isBasicMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Basic;\n}\nexport function isLineMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Line;\n}\nexport function isLambertMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Lambert;\n}\nexport function isPhongMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Phong;\n}\nexport function isStandardMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Standard;\n}\nexport function isShaderMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Custom;\n}\n//namespace Pacem.Components.Drawing3D {\nexport class MaterialElement extends PacemEventTarget {\n constructor(shader) {\n super();\n this.#shader = shader;\n }\n #shader;\n get shader() {\n return this.#shader;\n }\n async _loadMap(url, old = this.material?.texture) {\n if (!Utils.isNull(old)) {\n old.close();\n }\n if (Utils.isNullOrEmpty(url)) {\n return null;\n }\n const blob = await Imaging.loadImage(url);\n if (Utils.isNull(blob)) {\n return null;\n }\n return await createImageBitmap(blob);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'map':\n case 'opacity':\n case 'wireframe':\n case 'color':\n case 'hide':\n this.updateMaterial();\n break;\n }\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.updateMaterial();\n }\n updateMaterial() {\n this.createMaterial().then(m => {\n this.material = Utils.extend(m, { flags: [StalePropertyFlag.Material] });\n });\n }\n async createMaterial() {\n return {\n opacity: this.opacity ?? 1.0,\n wireframe: this.wireframe ?? false,\n color: this.color || Utils.Css.getVariableValue(`--${PCSS}-color-primary`),\n visible: !(this.hide ?? false),\n map: this.map,\n texture: await this._loadMap(this.map),\n shader: this.shader,\n flags: [],\n };\n }\n}\n__decorate([\n Watch()\n], MaterialElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], MaterialElement.prototype, \"opacity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"wireframe\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"hide\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"map\", void 0);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P } from '@pacem/pacem-core';\nimport { KnownShader, MaterialElement } from './material';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet BasicMaterialElement = class BasicMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Basic);\n }\n};\nBasicMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-basic` })\n], BasicMaterialElement);\nexport { BasicMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LambertMaterialElement = class LambertMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Lambert);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LambertMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"refractionRatio\", void 0);\nLambertMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-lambert` })\n], LambertMaterialElement);\nexport { LambertMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LineMaterialElement = class LineMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Line);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'lineWidth':\n case 'lineJoin':\n case 'lineCap':\n case 'dashArray':\n this.updateMaterial();\n break;\n }\n }\n }\n async createMaterial() {\n return Utils.extend({\n lineWidth: this.lineWidth ?? 1,\n lineJoin: this.lineJoin ?? 'round',\n lineCap: this.lineCap ?? 'round',\n dashArray: this.dashArray,\n }, await super.createMaterial());\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LineMaterialElement.prototype, \"lineWidth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineJoin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineCap\", void 0);\n__decorate([\n Watch({\n emit: false, converter: {\n convert: (attr) => attr?.split(',').map(i => parseInt(i)).filter(i => !Number.isNaN(i)),\n convertBack: (prop) => prop?.join(',')\n }\n })\n], LineMaterialElement.prototype, \"dashArray\", void 0);\nLineMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-line` })\n], LineMaterialElement);\nexport { LineMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet PhongMaterialElement = class PhongMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Phong);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0,\n specularColor: this.specularColor || '#000',\n shininess: this.shininess ?? 0,\n flatShading: this.flatShading ?? true\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n case 'specularColor':\n case 'shininess':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"specularColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"shininess\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], PhongMaterialElement.prototype, \"flatShading\", void 0);\nPhongMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-phong` })\n], PhongMaterialElement);\nexport { PhongMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet StandardMaterialElement = class StandardMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Standard);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n refractionRatio: this.refractionRatio ?? 0,\n metalness: this.metalness ?? 0,\n roughness: this.roughness ?? 0,\n flatShading: this.flatShading ?? false\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'roughness':\n case 'metalness':\n case 'refractionRatio':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], StandardMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"roughness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"metalness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], StandardMaterialElement.prototype, \"flatShading\", void 0);\nStandardMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-standard` })\n], StandardMaterialElement);\nexport { StandardMaterialElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\n//namespace Pacem.Components.Drawing3D {\nexport class Pacem3DPrimitiveElement extends PacemEventTarget {\n viewActivatedCallback() {\n super.viewActivatedCallback();\n if (Utils.isNull(this.geometry)) {\n this.geometry = this.createDefaultGeometry();\n }\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], Pacem3DPrimitiveElement.prototype, \"geometry\", void 0);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemBoxElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemBoxElement = PacemBoxElement_1 = class PacemBoxElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {\n const w = width || 1, h = height || 1, d = depth || 1, sw = widthSegments || 1, sh = heightSegments || 1, sd = depthSegments || 1;\n const positions = [];\n const uv = [];\n const indices = [];\n // populationg positions\n for (var j = 0; j <= sh; j++) {\n var y = h / 2.0 - h * (1.0 * j) / (1.0 * sh); // ??\n for (var k = 0; k <= sd; k++) {\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n for (var i = 0; i <= sw; i++) {\n var x = -w / 2.0 + w * (1.0 * i) / (1.0 * sw);\n // add only surface nodes\n if (i == 0 || i == sw || k == 0 || k == sd || j == 0 || j == sh)\n positions.push({ x, y, z });\n }\n }\n }\n var getPosIndex = function (x, y, z) {\n var epsilon = .00001;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n if (Math.abs(pt.x - x) < epsilon && Math.abs(pt.y - y) < epsilon && Math.abs(pt.z - z) < epsilon)\n return i;\n }\n return -1;\n };\n var appendFace = function (c_1, c_2, c_3, c_4, u, v, u_next, v_next) {\n indices.push(c_1);\n indices.push(c_2);\n indices.push(c_3);\n indices.push(c_1);\n indices.push(c_3);\n indices.push(c_4);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n };\n // top face (1)\n for (var k = 0; k < sd; k++) {\n var y = h / 2.0;\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n var z_next = -d / 2.0 + d * (1.0 * (k + 1)) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + (1.0 * i) * w / (1.0 * sw);\n var x_next = -w / 2.0 + (1.0 * (i + 1)) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (1.0 * (i + 1)) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (1.0 * (k + 1)) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // back face (2)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = -d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = w / 2.0 - 1.0 * i * w / (1.0 * sw);\n var x_next = w / 2.0 - (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - 1.0 * j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // left face (3)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = -w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = -d / 2.0 + k * d / (1.0 * sd);\n var z_next = -d / 2.0 + (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // front face (4)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // right face (5)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = d / 2.0 - k * d / (1.0 * sd);\n var z_next = d / 2.0 - (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // bottom face (6)\n for (var k = 0; k < sd; k++) {\n var y = -h / 2.0;\n var z = d / 2.0 - d * k / (1.0 * sd);\n var z_next = d / 2.0 - d * (k + 1.0) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (k + 1.0) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `box_${width}x${height}x${depth}_w${widthSegments}_h${heightSegments}_d${depthSegments}`;\n computeSharpVertexNormals(geom);\n const center = { x: 0, y: 0, z: 0 };\n const w2 = width / 2, h2 = height / 2, d2 = depth / 2;\n //\n geom.barycenter = center;\n geom.boundingBox = { maxX: w2, maxY: h2, maxZ: d2, minX: -w2, minY: -h2, minZ: -d2 };\n geom.boundingSphere = { center, radius: Math.sqrt(Math.pow(w2, 2) + Math.pow(h2, 2) + Math.pow(d2, 2)) };\n //\n return geom;\n }\n createDefaultGeometry() {\n return PacemBoxElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'height':\n case 'depth':\n case 'widthSegments':\n case 'heightSegments':\n case 'depthSegments':\n this.geometry = PacemBoxElement_1.createMeshGeometry(this.width, this.height, this.depth, this.widthSegments, this.heightSegments, this.depthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depthSegments\", void 0);\nPacemBoxElement = PacemBoxElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-box' })\n], PacemBoxElement);\nexport { PacemBoxElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Utils } from '@pacem/pacem-core';\nimport { StalePropertyFlag } from './types';\nimport { NotifyChange } from './decorators';\nexport class NodeGeometry {\n constructor(positions = []) {\n this.positions = positions;\n }\n static barycenter(positions) {\n var bary = { x: 0, y: 0, z: 0 };\n if (!Utils.isNullOrEmpty(positions)) {\n var count = positions.length;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n bary.x += pt.x;\n bary.y += pt.y;\n bary.z += pt.z;\n }\n var countDbl = 1.0 * count;\n bary.x /= countDbl;\n bary.y /= countDbl;\n bary.z /= countDbl;\n }\n return bary;\n }\n static boundingBox(positions) {\n const output = {\n minX: +Infinity, minY: +Infinity, minZ: +Infinity,\n maxX: -Infinity, maxY: -Infinity, maxZ: -Infinity\n };\n if (!Utils.isNullOrEmpty(positions)) {\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n output.minX = Math.min(output.minX, pt.x);\n output.minY = Math.min(output.minY, pt.y);\n output.minZ = Math.min(output.minZ, pt.z);\n output.maxX = Math.max(output.maxX, pt.x);\n output.maxY = Math.max(output.maxY, pt.y);\n output.maxZ = Math.max(output.maxZ, pt.z);\n }\n }\n return output;\n }\n setAsDirty() {\n setSelfAsDirty.call(this);\n }\n}\nfunction setSelfAsDirty() {\n const me = this;\n me.flags = [/* no further specifications, other than 'geometry' */ StalePropertyFlag.Geometry];\n}\nexport class LineGeometry extends NodeGeometry {\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], LineGeometry.prototype, \"positions\", void 0);\nexport class MeshGeometry extends NodeGeometry {\n #boundingBox;\n #boundingSphere;\n #barycenter;\n get barycenter() {\n return this.#barycenter ??= NodeGeometry.barycenter(this.positions);\n }\n set barycenter(point) {\n this.#barycenter = point;\n }\n get boundingBox() {\n return this.#boundingBox ??= NodeGeometry.boundingBox(this.positions);\n }\n set boundingBox(bbox) {\n this.#boundingBox = bbox;\n }\n get boundingSphere() {\n return this.#boundingSphere;\n }\n set boundingSphere(sphere) {\n this.#boundingSphere = sphere;\n }\n constructor(positions, triangleIndices, textureCoordinates = [], normals = []) {\n super(positions);\n this.triangleIndices = triangleIndices;\n this.textureCoordinates = textureCoordinates;\n this.normals = normals;\n }\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"positions\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"triangleIndices\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"textureCoordinates\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"normals\", void 0);\n", "import { Utils } from '@pacem/pacem-core';\n//namespace Pacem.Drawing3D {\nexport function NotifyChange(callback) {\n return (target, prop, descriptor) => {\n const backingField = `_${prop}_${Utils.uniqueCode()}_backingField`;\n function getter() {\n return this[backingField];\n }\n function setter(val) {\n if (val !== this[backingField]) {\n const old = this[backingField];\n this[backingField] = val;\n callback.call(this, prop, old, val);\n }\n }\n //if (delete target[prop]) {\n Object.defineProperty(target, prop, {\n get: function () {\n return getter.call(this);\n },\n set: function (val) {\n setter.call(this, val);\n },\n enumerable: true,\n configurable: false\n });\n //}\n };\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemConeElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemConeElement = PacemConeElement_1 = class PacemConeElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n const slope = r / height;\n const fY = height / heightSegments;\n const fU = 1.0 / sides;\n // top vertex\n nodes.push({ x: .0, y: height, z: .0 });\n // ======================================\n // side loops\n for (let j = 1; j <= heightSegments; j++) {\n const y = height - fY * j;\n const v = y / height;\n const rj = (height - y) * slope;\n // for loops other than tip loop\n const y_prev = y + fY;\n const v_prev = y_prev / height;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i;\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y, z });\n const index = 1 + sides * (j - 1) + i;\n const index_prev = i == 0 ? index + sides - 1 : index - 1;\n const u = i * fU;\n const u_prev = i == 0 ? (1 - fU) : fU * (i - 1);\n if (j == 1) {\n // tip loop\n // 1 triangle\n indices.push(0, index_prev, index);\n uv.push({ x: u, y: 1 }, { x: u_prev, y: v }, { x: u, y: v });\n continue;\n }\n const prevLoopIndex = 1 + sides * (j - 2) + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(C, A, B);\n indices.push(C, D, A);\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u_prev, y: v };\n const uvC = { x: u, y: v };\n const uvD = { x: u, y: v_prev };\n uv.push(uvC, uvA, uvB);\n uv.push(uvC, uvD, uvA);\n }\n }\n // bottom cap\n const startCapIndex = 1 + (heightSegments - 1) * sides;\n // bottom vertex (pivot)\n nodes.push({ x: .0, y: 0, z: .0 });\n const bottomIndex = startCapIndex + sides;\n // ======================================\n for (let j = 1; j <= capSegments; j++) {\n const rj_norm = j / capSegments;\n const rj = radius * rj_norm;\n // for loops other than bottom vertex loop\n const rj_norm_prev = (j - 1) / capSegments;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i, cos = Math.cos(angle), sin = Math.sin(angle);\n const angle_prev = angle - theta, cos_prev = Math.cos(angle_prev), sin_prev = Math.sin(angle_prev);\n const u = .5 * (1 + cos * rj_norm), v = .5 * (1 + sin * rj_norm);\n const u_prev = .5 * (1 + cos_prev * rj_norm), v_prev = .5 * (1 + sin_prev * rj_norm);\n let index, index_prev;\n if (j != capSegments) {\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y: 0, z });\n index = bottomIndex + 1 + (j - 1) * sides + i;\n index_prev = i == 0 ? index + sides - 1 : index - 1;\n }\n else {\n index = startCapIndex + i;\n index_prev = i == 0 ? startCapIndex + sides - 1 : index - 1;\n }\n if (j == 1) {\n // bottom vertex loop\n // 1 triangle\n indices.push(bottomIndex, index, index_prev);\n uv.push({ x: .5, y: .5 }, { x: u, y: v }, { x: u_prev, y: v_prev });\n continue;\n }\n const prevLoopU = .5 * (1 + cos * rj_norm_prev), prevLoopV = .5 * (1 + sin * rj_norm_prev);\n const prevLoopU_prev = .5 * (1 + cos_prev * rj_norm_prev), prevLoopV_prev = .5 * (1 + sin_prev * rj_norm_prev);\n const prevLoopIndex = bottomIndex + 1 + (j - 2) * sides + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(A, D, B);\n indices.push(B, D, C);\n const uvA = { x: prevLoopU_prev, y: prevLoopV_prev };\n const uvB = { x: u_prev, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: prevLoopU, y: prevLoopV };\n uv.push(uvA, uvD, uvB);\n uv.push(uvB, uvD, uvC);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cone_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemConeElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemConeElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"capSegments\", void 0);\nPacemConeElement = PacemConeElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cone' })\n], PacemConeElement);\nexport { PacemConeElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemCylinderElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemCylinderElement = PacemCylinderElement_1 = class PacemCylinderElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n // top & bottom vertices (pivot @(0,0,0))\n nodes.push({ x: .0, y: height, z: .0 });\n nodes.push({ x: .0, y: .0, z: .0 });\n // ======================================\n // cap loops\n const capRadius = r / capSegments;\n for (let j = 1; j <= capSegments; j++) {\n //int j_prev = j - 1;\n var rho = capRadius * j;\n for (var i = 0; i < sides; i++) {\n const startIndex = 2 + 2 * sides * (j - 1);\n const A = i == 0 ? startIndex + 2 * (sides - 1) : startIndex + 2 * (i - 1);\n const B = startIndex + 2 * i;\n const u = Math.cos(theta * i);\n const v = -Math.sin(theta * i);\n const u_prev = Math.cos(theta * (i - 1.0));\n const v_prev = -Math.sin(theta * (i - 1.0));\n const x = rho * u;\n const z = rho * v;\n const topPoint = { x, y: height, z };\n const bottomPoint = { x, y: .0, z };\n //\n nodes.push(topPoint);\n nodes.push(bottomPoint);\n // coordinates & texture\n const factor = .5 * rho / r;\n const uB = u * factor;\n const vB = v * factor;\n const uA = u_prev * factor;\n const vA = v_prev * factor;\n if (j == 1) {\n const faceIndicesTop = [0 /* top vertex*/, A, B];\n const faceIndicesBottom = [1 /* bottom vertex*/, B + 1, A + 1];\n // texture\n const uvTop = [\n { x: .5, y: .5 },\n { x: .5 + uA, y: .5 - vA },\n { x: 0.5 + uB, y: .5 - vB }\n ];\n const uvBottom = [\n { x: .5, y: .5 },\n { x: 0.5 + uB, y: .5 + vB },\n { x: .5 + uA, y: .5 + vA }\n ];\n // faces\n indices.push(...faceIndicesTop);\n indices.push(...faceIndicesBottom);\n // texture\n for (let i = 0; i < uvTop.length; i++)\n uv.push(uvTop[i]);\n for (let i = 0; i < uvBottom.length; i++)\n uv.push(uvBottom[i]);\n }\n else {\n const startIndexPrevLoop = 2 + 2 * sides * (j - 2);\n const D = i == 0 ? startIndexPrevLoop + 2 * (sides - 1) : startIndexPrevLoop + 2 * (i - 1);\n const C = startIndexPrevLoop + 2 * i;\n // coordinates & texture\n const factor0 = .5 * ((j - 1.0) / capSegments);\n const uC = u * factor0;\n const vC = v * factor0;\n const uD = u_prev * factor0;\n const vD = v_prev * factor0;\n const uvA = { x: .5 + uA, y: .5 - vA };\n const uvB = { x: .5 + uB, y: .5 - vB };\n const uvC = { x: .5 + uC, y: .5 - vC };\n const uvD = { x: .5 + uD, y: .5 - vD };\n const uvA2 = { x: .5 + uA, y: .5 + vA };\n const uvB2 = { x: .5 + uB, y: .5 + vB };\n const uvC2 = { x: .5 + uC, y: .5 + vC };\n const uvD2 = { x: .5 + uD, y: .5 + vD };\n // top\n indices.push(A);\n indices.push(B);\n indices.push(D);\n indices.push(D);\n indices.push(B);\n indices.push(C);\n // bottom\n indices.push(C + 1);\n indices.push(B + 1);\n indices.push(A + 1);\n indices.push(C + 1);\n indices.push(A + 1);\n indices.push(D + 1);\n // textures top\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvD);\n uv.push(uvD);\n uv.push(uvB);\n uv.push(uvC);\n // texture bottom\n uv.push(uvC2);\n uv.push(uvB2);\n uv.push(uvA2);\n uv.push(uvC2);\n uv.push(uvA2);\n uv.push(uvD2);\n }\n }\n }\n // ======================================\n // side loops\n const sideStartIndex = 2 + 2 * sides * (capSegments);\n const capLastIndex = 2 + 2 * sides * (capSegments - 1);\n const fU = 1.0 / sides;\n const fV = 1.0 / heightSegments;\n for (let j = 1; j <= heightSegments; j++) {\n for (let i = 0; i < sides; i++) {\n if (j != heightSegments) {\n var x = r * Math.cos(theta * i);\n var z = -r * Math.sin(theta * i);\n var y = (height * j) / heightSegments;\n //\n nodes.push({ x, y, z });\n }\n const i_prev = i == 0 ? sides - 1 : i - 1;\n const A = j == 1 ? capLastIndex + 2 * i_prev + 1 : sideStartIndex + sides * (j - 2) + i_prev;\n const B = j == 1 ? capLastIndex + 2 * i + 1 : sideStartIndex + sides * (j - 2) + i;\n const C = j == heightSegments ? capLastIndex + 2 * i : sideStartIndex + sides * (j - 1) + i;\n const D = j == heightSegments ? capLastIndex + 2 * i_prev : sideStartIndex + sides * (j - 1) + i_prev;\n const u_prev = i_prev * fU;\n const v_prev = (j - 1) * fV;\n const u = i == 0 ? 1.0 : i * fU;\n const v = j * fV;\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: u_prev, y: v };\n indices.push(A);\n indices.push(B);\n indices.push(C);\n indices.push(A);\n indices.push(C);\n indices.push(D);\n //\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvC);\n uv.push(uvA);\n uv.push(uvC);\n uv.push(uvD);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cylinder_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemCylinderElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemCylinderElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"capSegments\", void 0);\nPacemCylinderElement = PacemCylinderElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cylinder' })\n], PacemCylinderElement);\nexport { PacemCylinderElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemLineElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { LineGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst DEFAULT_LINE = [{ x: 0, y: 0, z: 0 }, { x: 0, y: 1, z: 0 }];\nlet PacemLineElement = PacemLineElement_1 = class PacemLineElement extends Pacem3DPrimitiveElement {\n static createLineGeometry(positions) {\n return new LineGeometry(positions || DEFAULT_LINE);\n }\n createDefaultGeometry() {\n return PacemLineElement_1.createLineGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'positions':\n this.geometry = PacemLineElement_1.createLineGeometry(val);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemLineElement.prototype, \"positions\", void 0);\nPacemLineElement = PacemLineElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-line' })\n], PacemLineElement);\nexport { PacemLineElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemPlaneElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemPlaneElement = PacemPlaneElement_1 = class PacemPlaneElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, length, widthSegments, lengthSegments) {\n width ||= 1.0;\n length ||= 1.0;\n widthSegments ||= 4;\n lengthSegments ||= 4;\n const halfWidth = width * .5, halfLength = length * .5;\n const nodes = [];\n const uv = [];\n const indices = [];\n const normals = [], normal = Geometry.LinearAlgebra.Vector3D.from(0, 0, 1);\n for (let j = 0; j <= lengthSegments; j++) {\n for (let i = 0; i <= widthSegments; i++) {\n const x = -halfWidth + i * width / (1.0 * widthSegments);\n const y = .0;\n const z = -halfLength + j * length / (1.0 * lengthSegments);\n nodes.push({ x, y, z });\n if (j < lengthSegments && i < widthSegments) {\n const rowPoints = widthSegments + 1;\n // const colPoints = lengthSegments + 1;\n const u_next = (i + 1.0) / (1.0 * widthSegments);\n const u = (1.0 * i) / (1.0 * widthSegments);\n const v_next = 1.0 - (j + 1.0) / (1.0 * lengthSegments);\n const v = 1.0 - (1.0 * j) / (1.0 * lengthSegments);\n indices.push((j + 1) * rowPoints + i);\n indices.push((j + 1) * rowPoints + i + 1);\n indices.push(j * rowPoints + i + 1);\n indices.push((j + 1) * rowPoints + i);\n indices.push(j * rowPoints + i + 1);\n indices.push(j * rowPoints + i);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n normals.push(normal, normal, normal, normal, normal, normal);\n }\n }\n }\n const geom = new MeshGeometry(nodes, indices, uv, normals);\n geom.key = `plane_${width}x${length}_w${widthSegments}_l${lengthSegments}`;\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemPlaneElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'length':\n case 'widthSegments':\n case 'lengthSegments':\n this.geometry = PacemPlaneElement_1.createMeshGeometry(this.width, this.length, this.widthSegments, this.lengthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"length\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"lengthSegments\", void 0);\nPacemPlaneElement = PacemPlaneElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-plane' })\n], PacemPlaneElement);\nexport { PacemPlaneElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTetrahedronElement_1, PacemOctahedronElement_1, PacemHexahedronElement_1, PacemIcosahedronElement_1, PacemDodecahedronElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { PacemBoxElement } from './box';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst _utils = {\n parseFloats: function (input) {\n const pattern = /([\\d.-]+)/i;\n var match = pattern.exec(input);\n const ret = [];\n while (match != null) {\n const g = match[0];\n const j = parseFloat(g);\n ret.push(j);\n input = input.replace(g, '');\n match = pattern.exec(input);\n }\n return ret;\n }\n};\nconst Point3D = Geometry.LinearAlgebra.Vector3D;\nexport class PolyhedronElement extends Pacem3DPrimitiveElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'radius') {\n this._assignMeshGeometry(val);\n }\n }\n _assignMeshGeometry(radius) {\n this.geometry = this.createMeshGeometry(radius > .0 ? radius : 1.0);\n }\n createDefaultGeometry() {\n return this.createMeshGeometry(1.0);\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PolyhedronElement.prototype, \"radius\", void 0);\n// #region Tetrahedron\nlet PacemTetrahedronElement = PacemTetrahedronElement_1 = class PacemTetrahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.5774 -0.8165, 0 0.5774 0.8165, 0.8165 -0.5774 0, -0.8165 -0.5774 0\";\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const indices = [1, 2, 0, 2, 3, 0, 3, 1, 0, 3, 2, 1];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.0004995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995\";\n const pointsToParse = textureCoordsString.split(',');\n const texIndices = [4, 5, 6, 7, 8, 9, 10, 11, 0, 3, 2, 1];\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `tetrahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemTetrahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemTetrahedronElement = PacemTetrahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-tetrahedron' })\n], PacemTetrahedronElement);\nexport { PacemTetrahedronElement };\n// #endregion\n// #region Octahedron\nlet PacemOctahedronElement = PacemOctahedronElement_1 = class PacemOctahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n // -------------------------------------------------------------------------------------------------\n const nodesCoordsString = \"0 0.7071 -0.7071, 0 0.7071 0.7071, 1 0 0, 0 -0.7071 -0.7071, -1 0 0, 0 -0.7071 0.7071\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 0, 4, 5, 1, 5, 2, 1, 2, 5, 3, 4, 3, 5];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.9995, 0.0004995 0.5, 0.5 0.9995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.9995\";\n const texIndices = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 20, 21, 1, 2, 22, 23, 4, 3, 5];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `octahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemOctahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemOctahedronElement = PacemOctahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-octahedron' })\n], PacemOctahedronElement);\nexport { PacemOctahedronElement };\n// #endregion\n// #region Hexahedron\nlet PacemHexahedronElement = PacemHexahedronElement_1 = class PacemHexahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const inv_sqrt3 = 1.0 / Math.sqrt(3.0);\n const w = 2.0 * radius * inv_sqrt3;\n const geom = PacemBoxElement.createMeshGeometry(w, w, w);\n geom.key = `hexahedron_${radius}`;\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemHexahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemHexahedronElement = PacemHexahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-hexahedron' })\n], PacemHexahedronElement);\nexport { PacemHexahedronElement };\n// #endregion\n// #region Icosahedron\nlet PacemIcosahedronElement = PacemIcosahedronElement_1 = class PacemIcosahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.850651 -0.525731, 0 0.850651 0.525731, 0.850651 0.525731 0, 0.525731 0 -0.850651, -0.525731 0 -0.850651, -0.850651 0.525731 0, -0.525731 0 0.850651, 0.525731 0 0.850651, 0.850651 -0.525731 0, 0 -0.850651 0.525731, 0 -0.850651 -0.525731, -0.850651 -0.525731 0\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 1, 0,\n 5, 6, 1, 6, 7, 1, 7, 2, 1, 2, 8, 3,\n 2, 7, 8, 6, 9, 7, 9, 8, 7, 8, 10, 3,\n 8, 9, 10, 6, 11, 9, 11, 10, 9, 10, 4, 3,\n 10, 11, 4, 6, 5, 11, 5, 4, 11];\n const textureCoordsString = \"0.5 0.808708, 0.5 0.999501, 0.5 0.808708, 0.191292 0.5, \" +\n \"0.000499547 0.5, 0.5 0.808708, 0.9995 0.5, 0.808708 0.5,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.000499487, 0.5 0.191292,\" +\n \"0.5 0.191292, 0.999501 0.5, 0.5 0.808708, 0.5 0.808708,\" +\n \"0.9995 0.5, 0.808708 0.999501, 0.191292 0.5, 0.808708 0.5,\" +\n \"0.5 0.999501, 0.808708 0.5, 0.999501 0.808708, 0.5 0.999501,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.808708, 0.9995 0.5,\" +\n \"0.808708 0.999501, 0.191292 0.5, 0.808708 0.5, 0.5 0.999501,\" +\n \"0.808708 0.5, 0.999501 0.808708, 0.5 0.808708, 0.5 0.191292,\" +\n \"0.9995 0.5, 0.000499547 0.5, 0.5 0.191292, 0.191292 0.5,\" +\n \"0.5 0.000499487, 0.808708 0.5, 0.5 0.000499487, 0.999501 0.191292,\" +\n \"0.5 0.191292, 0.808708 0.000499487, 0.9995 0.5, 0.5 0.191292,\" +\n \"0.5 0.808708, 0.9995 0.5, 0.5 0.191292, 0.808708 0.000499487,\" +\n \"0.999501 0.5, 0.5 0.808708, 0.5 0.000499487, 0.808708 0.5,\" +\n \"0.999501 0.191292, 0.808708 0.5, 0.5 0.808708, 0.5 0.191292\";\n const texIndices = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 0, 26, 27, 28, 29, 30, 31, 32, 33, 1,\n 34, 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, 7,\n 44, 45, 46, 8, 47, 48, 49, 50, 51, 52, 53, 9,\n 54, 55, 3, 10, 56, 57, 6, 58, 59, 5, 4, 11];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `icosahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemIcosahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemIcosahedronElement = PacemIcosahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-icosahedron' })\n], PacemIcosahedronElement);\nexport { PacemIcosahedronElement };\n// #endregion\n// #region Dodecahedron\nlet PacemDodecahedronElement = PacemDodecahedronElement_1 = class PacemDodecahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const n1 = Point3D.from(0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n2 = Point3D.from(-0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n3 = Point3D.from(0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n4 = Point3D.from(0 * radius, 0.356822 * radius, -0.934172 * radius);\n const n5 = Point3D.from(-0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n6 = Point3D.from(-0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n7 = Point3D.from(0 * radius, 0.356822 * radius, 0.934172 * radius);\n const n8 = Point3D.from(0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n9 = Point3D.from(0.934172 * radius, 0 * radius, -0.356822 * radius);\n const n10 = Point3D.from(0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n11 = Point3D.from(0 * radius, -0.356822 * radius, 0.934172 * radius);\n const n12 = Point3D.from(0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n13 = Point3D.from(0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n14 = Point3D.from(0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n15 = Point3D.from(-0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n16 = Point3D.from(-0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n17 = Point3D.from(0 * radius, -0.356822 * radius, -0.934172 * radius);\n const n18 = Point3D.from(-0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n19 = Point3D.from(-0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n20 = Point3D.from(-0.934172 * radius, 0 * radius, -0.356822 * radius);\n const positions = [\n n1,\n n2,\n n3,\n n4,\n n5,\n n6,\n n7,\n n8,\n n9,\n n10,\n n11,\n n12,\n n13,\n n14,\n n15,\n n16,\n n17,\n n18,\n n19,\n n20\n ];\n const indices = [0, 2, 3, 0, 3, 4, 0, 4, 1, 1, 5, 6, 1, 6, 7,\n 1, 7, 0, 7, 9, 8, 7, 8, 2, 7, 2, 0,\n 7, 6, 10, 7, 10, 11, 7, 11, 9, 11, 13, 12,\n 11, 12, 8, 11, 8, 9, 11, 10, 14, 11, 14, 15,\n 11, 15, 13, 15, 17, 16, 15, 16, 12, 15, 12, 13,\n 15, 14, 18, 15, 18, 19, 15, 19, 17, 19, 4, 3,\n 19, 3, 16, 19, 16, 17, 19, 18, 5, 19, 5, 1,\n 19, 1, 4, 18, 14, 10, 18, 10, 6, 18, 6, 5,\n 3, 2, 8, 3, 8, 12, 3, 12, 16];\n const textureCoordsString = `0.5 0.999501, 0.5 0.999501, 0.191292 0.808708, 0.5 0.690792,\r\n 0.191292 0.808708, 0.191292 0.808708, 0.5 0.690792,\r\n 0.808708 0.808708, 0.000499517 0.5, 0.309208 0.5, 0.5 0.309208,\r\n 0.191292 0.191292, 0.191292 0.191292, 0.309208 0.5,\r\n 0.191292 0.191292, 0.5 0.000499517, 0.5 0.309208, 0.808708 0.191292,\r\n 0.000499517 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\r\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.309208 0.5,\r\n 0.191292 0.191292, 0.5 0.000499517, 0.309208 0.5, 0.5 0.000499517,\r\n 0.808708 0.191292, 0.309208 0.5, 0.808708 0.191292,\r\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.690792 0.5,\r\n 0.191292 0.808708, 0.690792 0.5, 0.808708 0.808708,\r\n 0.191292 0.808708, 0.808708 0.808708, 0.808708 0.808708,\r\n 0.5 0.690792, 0.5 0.309208, 0.808708 0.808708, 0.5 0.309208,\r\n 0.808708 0.191292, 0.808708 0.191292, 0.9995 0.5, 0.191292 0.191292,\r\n 0.5 0.000499517, 0.808708 0.191292, 0.191292 0.191292,\r\n 0.808708 0.191292, 0.690792 0.5, 0.191292 0.191292,\r\n 0.690792 0.5, 0.191292 0.191292, 0.5 0.000499517, 0.808708 0.191292,\r\n 0.191292 0.191292, 0.808708 0.191292, 0.690792 0.5,\r\n 0.690792 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\r\n 0.690792 0.5, 0.191292 0.808708, 0.5 0.000499517, 0.808708 0.191292,\r\n 0.690792 0.5, 0.5 0.000499517, 0.690792 0.5, 0.309208 0.5,\r\n 0.309208 0.5, 0.191292 0.191292, 0.9995 0.5, 0.808708 0.808708,\r\n 0.5 0.690792, 0.9995 0.5, 0.5 0.690792, 0.5 0.309208,\r\n 0.9995 0.5, 0.5 0.309208, 0.309208 0.5, 0.690792 0.5,\r\n 0.808708 0.808708, 0.309208 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.000499517 0.5, 0.5 0.309208, 0.000499517 0.5,\r\n 0.5 0.690792, 0.5 0.690792, 0.000499517 0.5, 0.5 0.690792,\r\n 0.191292 0.191292`;\n const texIndices = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,\n 44, 45, 0, 46, 47, 48, 49, 50, 51, 7, 52, 53,\n 54, 55, 56, 57, 58, 59, 60, 61, 9, 62, 63, 64,\n 65, 66, 67, 11, 68, 69, 70, 71, 72, 73, 74, 75,\n 76, 77, 13, 78, 79, 80, 81, 82, 83, 15, 84, 85,\n 86, 87, 88, 89, 90, 91, 92, 93, 17, 94, 95, 96,\n 97, 98, 99, 19, 1, 4, 100, 14, 101, 102, 10, 103,\n 18, 6, 5, 104, 2, 105, 106, 8, 107, 3, 12, 16];\n // -------------------------------------------------------------------------------------------------\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `dodecahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemDodecahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemDodecahedronElement = PacemDodecahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-dodecahedron' })\n], PacemDodecahedronElement);\nexport { PacemDodecahedronElement };\n// #endregion\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemSphereElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemSphereElement = PacemSphereElement_1 = class PacemSphereElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, segs = 8) {\n //\n const nodes = [];\n const uv = [];\n const indices = [];\n //\n const r = radius, tessellation = segs;\n const theta = DEG2RAD * (360.0 / tessellation);\n const segments = tessellation % 2 == 0 ? tessellation / 2 : (tessellation - 1) / 2;\n // top vertex\n nodes.push({ x: .0, y: r, z: .0 });\n for (let j = 1; j < segments; j++) {\n // loop \"latitude\"\n const angle1 = theta * j;\n const cos_angle1 = Math.cos(angle1);\n const sin_angle1 = Math.sin(angle1);\n const v = 1.0 - 1.0 * j / segments;\n for (let i = 0; i < tessellation; i++) {\n // loop \"longitude\"\n const angle2 = theta * i - Math.PI / 2.0;\n const cos_angle2 = Math.cos(angle2);\n const sin_angle2 = Math.sin(angle2);\n const x = r * sin_angle1 * cos_angle2;\n const y = r * cos_angle1;\n const z = r * sin_angle1 * sin_angle2;\n nodes.push({ x, y, z });\n // coordinates & texture\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n // triangles\n if (j == 1) {\n indices.push(1 + i);\n indices.push(1 + i_prev);\n indices.push(0);\n //\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: .5, y: 1.0 });\n }\n else {\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 1) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i + 1);\n //\n const v_prev = 1.0 - (j - 1.0) / segments;\n //var faceUV = [];\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v_prev });\n }\n }\n }\n // bottom vertex\n nodes.push({ x: .0, y: -r, z: .0 });\n const last = nodes.length - 1;\n for (let i = 0; i < tessellation; i++) {\n const j = segments - 2;\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n const v = 1.0 - (j + 1.0) / segments;\n // triangles\n indices.push(last);\n indices.push(j * tessellation + 1 + i_prev);\n indices.push(j * tessellation + 1 + i);\n uv.push({ x: .5, y: 0 });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `sphere_${radius}_s${segs}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemSphereElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'segments':\n this.geometry = PacemSphereElement_1.createMeshGeometry(this.radius, this.segments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"segments\", void 0);\nPacemSphereElement = PacemSphereElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-sphere' })\n], PacemSphereElement);\nexport { PacemSphereElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTorusElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemTorusElement = PacemTorusElement_1 = class PacemTorusElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, innerRadius = .25, segments = 24, sides = 12) {\n //\n const nodes = [];\n const uv = [];\n const coords = [];\n const theta = DEG2RAD * (360.0 / segments);\n const phi = DEG2RAD * (360.0 / sides);\n const r1 = radius;\n const r2 = innerRadius;\n for (let j = 0; j < segments; j++) {\n // Math.PI/2 adjustement (useful for UV mapping)\n const angle1 = theta * j - Math.PI / 2.0;\n const sin_angle1 = Math.sin(angle1);\n const cos_angle1 = Math.cos(angle1);\n for (let i = 0; i < sides; i++) {\n // Math.PI adjustement (useful for UV mapping)\n const angle2 = phi * i + Math.PI;\n const cos_angle2 = Math.cos(angle2);\n const x = r1 * cos_angle1 + r2 * cos_angle2 * cos_angle1;\n const y = r2 * Math.sin(angle2);\n const z = r1 * sin_angle1 + r2 * cos_angle2 * sin_angle1;\n nodes.push({ x, y, z });\n const prev_j = j > 0 ? j - 1 : segments - 1;\n const prev_i = i > 0 ? i - 1 : sides - 1;\n const u = j == 0 ? .0 : 1.0 - 1.0 * j / segments;\n const v = i > 0 ? 1.0 * i / sides : 1.0;\n const u_prev = j > 0 ? 1.0 - (j - 1.0) / segments : 1.0 / segments;\n const v_prev = i > 0 ? (i - 1.0) / sides : 1.0 - 1.0 / sides;\n // triangles <=> Int32Collection\n // <=> PointCollection\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + i);\n //\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n }\n const geom = new MeshGeometry(nodes, coords, uv);\n geom.key = `torus_${radius}x${innerRadius}_t${segments}_s${sides}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemTorusElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'innerRadius':\n case 'segments':\n case 'sides':\n this.geometry = PacemTorusElement_1.createMeshGeometry(this.radius, this.innerRadius, this.segments, this.sides);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"innerRadius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"segments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"sides\", void 0);\nPacemTorusElement = PacemTorusElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-torus' })\n], PacemTorusElement);\nexport { PacemTorusElement };\n", "import { CustomEventUtils, Utils } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { isCamera } from '../types';\nfunction _clipPoint(evt, rect) {\n let x, y;\n if (Point.isPoint(evt)) {\n x = evt.x;\n y = evt.y;\n }\n else {\n const { page } = CustomEventUtils.getEventCoordinates(evt);\n const p = { x: page.x - rect.x, y: page.y - rect.y };\n x = p.x;\n y = p.y;\n }\n const clipX = x / rect.width * 2 - 1;\n const clipY = y / rect.height * -2 + 1;\n return { x: clipX, y: clipY };\n}\nexport class AdapterUtils {\n static isMeshGeometry(obj) {\n return 'positions' in obj && Utils.isArray(obj.positions)\n && 'triangleIndices' in obj && Utils.isArray(obj.triangleIndices);\n }\n static isVector3D(obj) {\n return 'x' in obj && typeof obj.x === 'number'\n && 'y' in obj && typeof obj.y === 'number'\n && 'z' in obj && typeof obj.z === 'number';\n }\n static isRgba(obj) {\n return 'r' in obj && typeof obj.r === 'number'\n && 'g' in obj && typeof obj.g === 'number'\n && 'b' in obj && typeof obj.b === 'number';\n }\n static flattenVectorArray(array) {\n const retval = [];\n for (let v of array) {\n if (AdapterUtils.isVector3D(v)) {\n retval.push(v.x, v.y, v.z);\n }\n else if (AdapterUtils.isRgba(v)) {\n retval.push(v.r, v.g, v.b, v.a ?? 1);\n }\n else {\n retval.push(v.x, v.y);\n }\n }\n return retval;\n }\n static findCamera(items) {\n return (items || []).find(r => isCamera(r) && !r.hide);\n }\n clipPixel(evt, viewport) {\n if (viewport instanceof HTMLElement) {\n viewport = Utils.offsetRect(viewport);\n }\n return _clipPoint(evt, viewport);\n }\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomElementUtils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isUi3DObject, Pacem3DAdapterElement, Pacem3DObjectElement, Pacem3DGroupElement, Pacem3DLightElement, Pacem3DCameraElement, Pacem3DPerspectiveCameraElement, Pacem3DOrthographicCameraElement, Pacem3DMeshElement } from '../types';\nimport { MeshGeometry, LineGeometry } from '../geometry';\nimport { AdapterUtils } from './shared';\nimport { isStandardMaterial, isPhongMaterial, isLambertMaterial, isLineMaterial, isMaterial } from '../materials/material';\n//namespace Pacem.Components.Drawing3D {\nfunction isMeshGeometry(obj) {\n return AdapterUtils.isMeshGeometry(obj);\n}\nfunction isVector3D(obj) {\n return AdapterUtils.isVector3D(obj);\n}\nfunction flattenVectorArray(array) {\n return AdapterUtils.flattenVectorArray(array);\n}\nconst threeJsVersion = '0.152.2', lastOrbitCtrlJsVersion = '0.147.0';\n;\nconst consts = {\n VERSION: threeJsVersion,\n API_URI: `https://unpkg.com/three@${threeJsVersion}/build/three.min.js`,\n ORBIT_URI: `https://unpkg.com/three@${lastOrbitCtrlJsVersion}/examples/js/controls/OrbitControls.js`,\n LOADERS: [\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/OBJLoader.js`,\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/MTLLoader.js`,\n ],\n DEFAULT_MATERIAL: function () {\n return new THREE.MeshStandardMaterial({ color: '#069', flatShading: true });\n }\n};\nfunction matrix3DToMatrix4(m) {\n const matrix = new THREE.Matrix4();\n matrix.set(m.m11, m.m12, m.m13, m.m14, m.m21, m.m22, m.m23, m.m24, m.m31, m.m32, m.m33, m.m34, m.offsetX, m.offsetY, m.offsetZ, m.m44);\n return matrix;\n}\n// as of https://codepen.io/discoverthreejs/full/vwVeZB\nfunction fitCameraToSelection(camera, controls /* OrbitControls */, selection, fitOffset = 1.333) {\n const box = new THREE.Box3();\n for (const object of selection) {\n box.expandByObject(object);\n }\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z);\n const fitHeightDistance = maxSize / (2 * Math.atan(Math.PI * camera.fov / 360));\n const fitWidthDistance = fitHeightDistance / camera.aspect;\n const distance = fitOffset * Math.max(fitHeightDistance, fitWidthDistance);\n const hasControls = !Utils.isNull(controls);\n var direction;\n if (hasControls) {\n direction = controls.target.clone()\n .sub(camera.position)\n .normalize()\n .multiplyScalar(distance);\n controls.maxDistance = distance * 10;\n controls.target.copy(center);\n }\n camera.near = distance / 100;\n camera.far = distance * 100;\n camera.updateProjectionMatrix();\n if (hasControls) {\n camera.position.copy(controls.target).sub(direction);\n controls.update();\n }\n}\nfunction flattenMatrix3D(m) {\n return [\n // right way to translate the matrix3D to matrix4\n m.m11, m.m21, m.m31, m.offsetX,\n m.m12, m.m22, m.m32, m.offsetY,\n m.m13, m.m23, m.m33, m.offsetZ,\n m.m14, m.m24, m.m34, m.m44,\n ];\n}\nfunction nodeGeometryToBufferGeometry(mesh) {\n const geometry = new THREE.BufferGeometry();\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n if (mesh instanceof MeshGeometry) {\n if (!Utils.isNullOrEmpty(mesh.triangleIndices)) {\n geometry.setIndex(mesh.triangleIndices);\n }\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n const uvs = flattenVectorArray(mesh.textureCoordinates);\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\n if (Utils.isNullOrEmpty(mesh.normals)) {\n geometry.computeVertexNormals();\n }\n else {\n const normals = flattenVectorArray(mesh.normals);\n geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));\n }\n }\n return geometry;\n}\nfunction lightToLight(item) {\n var light;\n switch (item.type) {\n case 'spot':\n const spotLight = new THREE.SpotLight();\n spotLight.target.position.set(item.target.x, item.target.y, item.target.z);\n light = spotLight;\n break;\n default:\n light = new THREE.PointLight();\n break;\n }\n return light;\n}\nfunction materialToMaterial(material) {\n if (Utils.isNull(material)) {\n return null;\n }\n const lineBase = {\n color: typeof material.color === 'string' ? material.color : Colors.stringify(material.color),\n opacity: material.opacity ?? 1,\n transparent: true,\n wireframe: material.wireframe ?? false,\n visible: material.visible ?? true\n };\n const base = Utils.extend({}, lineBase, { wireframe: material.wireframe ?? false });\n const mipMapMaterial = (m) => {\n if (material.map) {\n m['map'] = new THREE.TextureLoader().load(material.map, _ => {\n // console.log('texture loaded!');\n m.needsUpdate = true;\n });\n }\n return m;\n };\n if (isStandardMaterial(material)) {\n const std = mipMapMaterial(new THREE.MeshStandardMaterial(Utils.extend(base, {\n roughness: material.roughness,\n metalness: material.metalness,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n refractionRatio: material.refractionRatio,\n })));\n return std;\n }\n else if (isPhongMaterial(material)) {\n const phong = mipMapMaterial(new THREE.MeshPhongMaterial(Utils.extend(base, {\n shininess: material.shininess,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n specular: material.specularColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return phong;\n }\n else if (isLambertMaterial(material)) {\n const lambert = mipMapMaterial(new THREE.MeshLambertMaterial(Utils.extend(base, {\n emissive: material.emissiveColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return lambert;\n }\n else if (isLineMaterial(material)) {\n const dash = material.dashArray && material.dashArray[0] || null, gap = material.dashArray && material.dashArray.length > 1 && material.dashArray[1] || dash;\n const lineMatOptions = Utils.extend(lineBase, {\n linecap: material.lineCap ?? 'round',\n linejoin: material.lineJoin ?? 'round',\n linewidth: material.lineWidth ?? 1\n });\n return Utils.isNullOrEmpty(material.dashArray) ?\n new THREE.LineBasicMaterial(lineMatOptions)\n : new THREE.LineDashedMaterial(Utils.extend({ dashSize: dash, gapSize: gap }, lineMatOptions));\n }\n else if (isMaterial(material)) {\n const basic = mipMapMaterial(new THREE.MeshBasicMaterial(base));\n return basic;\n }\n else {\n return null;\n }\n}\nfunction materialToMaterials(frontMaterial, backMaterial, multiAllowed) {\n // material\n const multi = multiAllowed;\n // composite\n const materials = [];\n // front mat\n const material = materialToMaterial(frontMaterial);\n if (!Utils.isNull(material)) {\n material.side = THREE.FrontSide;\n materials.push(material);\n }\n // back mat\n if (!Utils.isNull(backMaterial)) {\n if (backMaterial == frontMaterial) {\n material.side = THREE.DoubleSide;\n }\n else {\n // multi-material\n const backsideMaterial = materialToMaterial(backMaterial);\n if (!Utils.isNull(backsideMaterial)) {\n backsideMaterial.side = THREE.BackSide;\n materials.push(backsideMaterial);\n }\n }\n }\n return multi && materials.length > 1 ? materials : material;\n}\nfunction load(item) {\n if (!Utils.isNullOrEmpty(item.content)) {\n const type = item.type?.toLowerCase();\n switch (type) {\n case 'obj':\n const obj = new THREE['OBJLoader']();\n return obj.parse(item.content);\n default:\n const loader = new THREE.ObjectLoader();\n return loader.parse(item.content);\n }\n }\n else {\n throw new Error('Missing content.');\n }\n}\nfunction meshType(geometry) {\n return geometry instanceof LineGeometry ? THREE.Line : THREE.Mesh;\n}\nfunction build(mesh) {\n if (Utils.isNullOrEmpty(mesh.geometry)) {\n return null;\n }\n const ctor = meshType(mesh.geometry);\n return new ctor();\n}\nfunction isTHREEAvailable() {\n return 'THREE' in window;\n}\nasync function whenTHREEAvailable(...args) {\n const start = Date.now();\n var initialized = false;\n do {\n initialized = isTHREEAvailable();\n for (let pred of args) {\n initialized &&= pred();\n }\n if (!initialized) {\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n } while (!initialized && (Date.now() - start) < 30000);\n if (!initialized) {\n throw new Error('The wait for THREE adapter initialization timed out.');\n }\n}\nlet Pacem3DThreeAdapterElement = class Pacem3DThreeAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this._renderer = null;\n this._camera = null;\n this._scene = null;\n this._orbitCtrls = null;\n this._objects = new WeakMap();\n this._dict = {};\n this._orbitControlsDelegate = (_) => {\n };\n this._ensureAndRefresh = (item, object3D, parent) => {\n object3D.matrixAutoUpdate = false;\n // choose whether to render the object or not\n if (object3D.visible = !item.hide) {\n // the modeling part\n // 1. pacem 3d mesh\n if (isMesh(item)) {\n let mesh3D = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Geometry) >= 0) {\n mesh3D.geometry.dispose();\n // swap Line <-> Mesh according to the geometry\n const mesh3D2 = build(item);\n if (mesh3D2.constructor.name !== mesh3D.constructor.name) {\n parent.remove(object3D);\n delete this._dict[object3D.id];\n object3D = mesh3D = mesh3D2;\n }\n // /swap\n mesh3D.geometry = nodeGeometryToBufferGeometry(item.geometry);\n }\n if (item.flags.indexOf(StalePropertyFlag.Material) >= 0) {\n if (Utils.isArray(mesh3D.material)) {\n for (let m of mesh3D.material) {\n m.dispose();\n }\n }\n else {\n mesh3D.material.dispose();\n }\n mesh3D.material = materialToMaterials(item.material) || consts.DEFAULT_MATERIAL();\n }\n }\n // 2. 3d 'native' object\n else if (item instanceof Pacem3DObjectElement\n && (item.flags.indexOf(StalePropertyFlag.Material) >= 0 || item.flags.indexOf(StalePropertyFlag.Geometry) >= 0)) {\n // swap reference\n object3D.parent && object3D.parent.remove(object3D);\n object3D = load(item);\n }\n // 3. grouping object\n else if (item instanceof Pacem3DGroupElement) {\n if (item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n // remove all children\n for (let j = object3D.children.length - 1; j >= 0; j--) {\n const child = object3D.children[j];\n object3D.remove(child);\n }\n // re-create\n for (let child of item.items) {\n this._addOrUpdateItem(child, object3D);\n }\n }\n }\n // 4. light\n else if (item instanceof Pacem3DLightElement) {\n const light = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Light) >= 0) {\n light.color = new THREE.Color(item.color);\n light.intensity = item.intensity;\n }\n }\n // the configuring part\n let posv = item.position; // || new THREE.Vector3(0, 0, 0);\n if (isUi3DObject(item)\n && !Utils.isNull(item.transformMatrix)\n && (item.flags.indexOf(StalePropertyFlag.Position) >= 0 || item.flags.indexOf(StalePropertyFlag.Transform) >= 0)) {\n const positionMatrix = Geometry.LinearAlgebra.Matrix3D.from(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, posv.x, posv.y, posv.z, 1);\n // item.transformMatrix is a local matrix thus\n // prepend in the multiplication (i.e. FIRST apply transform THEN apply positioning)\n const transformMatrix = Geometry.LinearAlgebra.Matrix3D.multiply(item.transformMatrix, positionMatrix);\n THREE.Matrix4.prototype.set.apply(object3D.matrix, flattenMatrix3D(transformMatrix));\n //object3D.updateMatrix();\n }\n else if (item.flags.indexOf(StalePropertyFlag.Position) >= 0) {\n object3D.position.set(posv.x, posv.y, posv.z);\n object3D.updateMatrix();\n }\n }\n object3D.userData = item.tag;\n if (Utils.isNull(parent.getObjectById(object3D.id))) {\n parent.add(object3D);\n this._dict[object3D.id] = item;\n }\n // clear flags\n item.flags.splice(0);\n return object3D;\n };\n //#endregion\n }\n _assertMonoStage(scene) {\n if (scene != this._3d && !Utils.isNull(this._3d)) {\n throw new Error('Stage mismatch.');\n }\n }\n dispose(scene) {\n // do nothing\n }\n snapshot(scene, background, type, quality) {\n if (scene != this._3d) {\n return Promise.resolve(null);\n }\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render();\n Utils.snapshotElement(this._stage, background, mime, compression).then(resolve);\n });\n }\n project(scene, point3D) {\n this._assertMonoStage(scene);\n // check feasibility\n if (Utils.isNull(this._camera) || Utils.isNull(this._stage))\n return null;\n //\n const stage = this._stage;\n const vector = new THREE.Vector3(point3D.x, point3D.y, point3D.z);\n const width = stage.width, height = stage.height;\n const widthHalf = width / 2, heightHalf = height / 2;\n const point = vector.project(this._camera);\n const x = (point.x * widthHalf) + widthHalf;\n const y = -(point.y * heightHalf) + heightHalf;\n return { x: x, y: y };\n }\n zoomFit(scene, ...items) {\n this._assertMonoStage(scene);\n return new Promise((resolve, reject) => {\n const camera = this._camera;\n const map = this._objects;\n const targets = items.filter(o => map.has(o)).map(o => map.get(o));\n if (Utils.isNull(camera) || Utils.isNullOrEmpty(targets)) {\n resolve();\n }\n fitCameraToSelection(camera, this._orbitCtrls, targets);\n resolve();\n });\n }\n getScene(scene) {\n this._assertMonoStage(scene);\n return this._scene;\n }\n raycast(scene, point, size, callback) {\n this._assertMonoStage(scene);\n if (isTHREEAvailable() && !Utils.isNull(this._camera)) {\n const camera = this._camera;\n const vector = new THREE.Vector2((point.x / size.width) * 2 - 1, -(point.y / size.height) * 2 + 1);\n const raycaster = new THREE.Raycaster();\n raycaster.setFromCamera(vector, camera);\n const intersects = raycaster.intersectObjects(this._scene.children, true);\n let obj;\n let intersection;\n let j = 0;\n while (intersects.length > j && (intersection = intersects[j++]) && (obj = intersection.object)) {\n const item = this._dict[obj.id];\n if (item.inert) {\n continue;\n }\n const v = intersection.point, x = v.x, y = v.y, z = v.z, point = { x, y, z };\n callback({ object: this._dict[obj.id], point });\n return;\n }\n }\n callback(null);\n }\n // #region ABSTRACT IMPLEMENTATION\n async initialize(container) {\n if (!Utils.isNull(this._stage)) {\n return this._stage;\n }\n this._3d = container;\n const wrapper = container.stage;\n const stage = this._stage = document.createElement('canvas');\n wrapper.innerHTML = '';\n wrapper.appendChild(stage);\n if (!isTHREEAvailable()) {\n await CustomElementUtils.importjs(consts.API_URI);\n await whenTHREEAvailable();\n await Promise.all([CustomElementUtils.importjs(consts.ORBIT_URI)]\n .concat(consts.LOADERS.map(js => CustomElementUtils.importjs(js))));\n }\n // here comes THREE.js\n this._scene = new THREE.Scene();\n // this._scene.add(new THREE.Mesh(new THREE.PlaneGeometry(1, 1, 1, 1), consts.DEFAULT_MATERIAL()));\n this.invalidateSize(container);\n let w = this._stage.width, h = this._stage.height;\n //if (!ctrl.renderer)\n let parameters = {\n canvas: stage, antialias: true, stencil: false, alpha: container.transparent ?? true //, clearAlpha: 1\n };\n this._renderer = new THREE.WebGLRenderer(parameters);\n this._renderer.setSize(w, h);\n if (container.background && !container.transparent) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n this._renderer.setClearColor(theejsClr, clr.a);\n }\n this.orbit = container.orbit;\n return stage;\n }\n _setCamera(cam) {\n this._camera = cam;\n this.invalidateSize(this._3d);\n this._disposeOrbitControls();\n // re-init\n if (this.orbit) {\n this._initOrbitControls();\n }\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'orbit') {\n if (val === true)\n this._initOrbitControls();\n else\n this._disposeOrbitControls();\n }\n }\n _initOrbitControls() {\n const cam = this._camera;\n if (Utils.isNull(this._3d) || Utils.isNull(cam)) {\n return;\n }\n const controls = this._orbitCtrls = new THREE['OrbitControls'](cam, this._3d.stage);\n controls.addEventListener('change', this._orbitControlsDelegate);\n }\n _disposeOrbitControls() {\n const controls = this._orbitCtrls;\n if (Utils.isNull(controls)) {\n return;\n }\n controls.removeEventListener('change', this._orbitControlsDelegate);\n controls.dispose();\n }\n _updateRenderer(container, renderer = this._renderer) {\n if (!container.transparent) {\n if (container.background) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n renderer.setClearColor(theejsClr, clr.a);\n }\n else {\n renderer.setClearColor(null);\n }\n }\n else {\n renderer.setClearAlpha(0);\n }\n }\n invalidateSize(scene, size = scene.size) {\n this._assertMonoStage(scene);\n if (!isTHREEAvailable() || Utils.isNull(size)) {\n return;\n }\n let w = size.width;\n let h = size.height;\n this._stage.width = w;\n this._stage.height = h;\n let camera = this._camera;\n if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n if (this._renderer) {\n this._renderer.setSize(w, h);\n this._updateRenderer(scene);\n }\n }\n removeItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n const obj3d = bag.get(item);\n if (!Utils.isNull(obj3d)) {\n this._scene.remove(obj3d);\n delete this._dict[obj3d.id];\n bag.delete(item);\n }\n }\n updateItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n if (!Utils.isNull(item.parent) && bag.has(item.parent)) {\n const parent3d = bag.get(item.parent);\n this._addOrUpdateItem(item, parent3d);\n }\n else {\n this._addOrUpdateItem(item);\n }\n }\n addItem(scene, item) {\n this._assertMonoStage(scene);\n this._addOrUpdateItem(item);\n }\n _addOrUpdateItem(item, parent = this._scene) {\n if (!isTHREEAvailable() || Utils.isNull(parent)) {\n return;\n }\n if (item instanceof Pacem3DCameraElement) {\n if (item instanceof Pacem3DPerspectiveCameraElement) {\n var pcam;\n if (this._camera instanceof THREE.PerspectiveCamera) {\n var pcam = this._camera;\n }\n else {\n pcam = new THREE.PerspectiveCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n pcam.lookAt(lookAtVector);\n pcam.position.set(item.position.x, item.position.y, item.position.z);\n pcam.fov = item.fov;\n pcam.aspect = item.aspect;\n pcam.near = item.near;\n pcam.far = item.far;\n //\n this._setCamera(pcam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === pcam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else if (item instanceof Pacem3DOrthographicCameraElement) {\n // bunch of duplicated code\n // no need to refactor since it's a deprecating branch of development\n var ocam;\n if (this._camera instanceof THREE.OrthographicCamera) {\n var ocam = this._camera;\n }\n else {\n ocam = new THREE.OrthographicCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n ocam.lookAt(lookAtVector);\n ocam.position.set(item.position.x, item.position.y, item.position.z);\n ocam.left = item.left;\n ocam.right = item.right;\n ocam.top = item.top;\n ocam.bottom = item.bottom;\n ocam.near = item.near;\n ocam.far = item.far;\n //\n this._setCamera(ocam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === ocam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else {\n // cam not supported\n throw new Error(`Camera ${item} not supported.`);\n }\n }\n else {\n if (!this._objects.has(item)) {\n // adding\n const then = (object3D) => {\n // clear flags\n // item.flags.splice(0);\n if (object3D) {\n object3D = this._ensureAndRefresh(item, object3D, parent);\n this._objects.set(item, object3D);\n }\n else {\n // object not built\n // throw?\n }\n };\n // TODO: switch to interface matching\n if (item instanceof Pacem3DObjectElement) {\n const mesh = load(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DMeshElement) {\n // beware! a change in the geometry could cause a change in the object3D type\n const mesh = build(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DLightElement) {\n const light = lightToLight(item);\n then(light);\n }\n else if (item instanceof Pacem3DGroupElement) {\n const group = new THREE.Group();\n then(group);\n }\n }\n else {\n // updating\n const obj = this._objects.get(item);\n const objOut = this._ensureAndRefresh(item, obj, parent);\n if (objOut != obj) {\n this._objects.set(item, objOut);\n }\n }\n }\n }\n render() {\n if (this._camera) {\n this._renderer.render(this._scene, this._camera);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DThreeAdapterElement.prototype, \"orbit\", void 0);\nPacem3DThreeAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-three-adapter' })\n], Pacem3DThreeAdapterElement);\nexport { Pacem3DThreeAdapterElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElementUtils, CustomElement, P, Watch, PropertyConverters, PropertyChangeEvent, PropertyChangeEventName, Debounce, Utils, Logging, Components } from '@pacem/pacem-core';\nimport { Strings } from '@pacem/pacem-foundation';\nimport { Pacem3DAdapterElement, StalePropertyFlag } from '../../types';\nimport { Renderers, WebGPUIssueCause } from './renderer';\n//namespace Pacem.Components.Drawing3D {\nconst WEBGPU_RAYCAST_CALLBACK_PROP = 'WebGPURaycastCallback';\nconst WEBGPU_RAYCAST_PIXEL_PROP = 'WebGPURaycastPixel';\nconst GETVAL = CustomElementUtils.getAttachedPropertyValue, SETVAL = CustomElementUtils.setAttachedPropertyValue, DELVAL = CustomElementUtils.deleteAttachedPropertyValue;\nlet Pacem3DWgslScriptElement = class Pacem3DWgslScriptElement extends Components.PacemItemElement {\n findContainer() {\n return CustomElementUtils.findAncestor(this, n => n instanceof Pacem3DWebgpuAdapterElement);\n }\n #version = '';\n get version() {\n return this.#version;\n }\n #observer = new MutationObserver(() => {\n this.wgsl = this.textContent;\n });\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.wgsl = this.textContent;\n this.#observer.observe(this, { characterData: true });\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'wgsl') {\n this._computeVersion(val);\n }\n }\n _computeVersion(wgsl = this.wgsl) {\n Strings.hash(wgsl).then(v => {\n if (v !== this.#version) {\n const old = this.#version;\n const val = v;\n this.#version = val;\n const evt = new PropertyChangeEvent({ propertyName: 'version', oldValue: old, currentValue: val, firstChange: Utils.isNullOrEmpty(old) });\n this.dispatchEvent(evt);\n }\n });\n }\n disconnectedCallback() {\n this.#observer.disconnect();\n super.disconnectedCallback();\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"wgsl\", void 0);\nPacem3DWgslScriptElement = __decorate([\n CustomElement({ tagName: P + '-3d-wgsl-script' })\n], Pacem3DWgslScriptElement);\nexport { Pacem3DWgslScriptElement };\nlet Pacem3DWebgpuAdapterElement = class Pacem3DWebgpuAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this.#items = [];\n this._scriptVersionChangeHandler = (evt) => {\n const { propertyName: name } = evt.detail;\n if (name === 'version') {\n this._parseWgslModifiers(evt.detail.currentValue);\n }\n };\n this.#scenes = new Set();\n this.#renderers = new Map();\n this.#supported = true;\n this.#active = true;\n this.#sceneToUpdate = new WeakMap();\n }\n invalidateSize(stage, size = stage.size) {\n const renderer = this._ensureRenderer(stage);\n renderer?.resize(size);\n }\n #items;\n get items() {\n return this.#items;\n }\n register(item) {\n const items = this.#items;\n if (item instanceof Pacem3DWgslScriptElement && !items.includes(item)) {\n item.addEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.push(item);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n unregister(item) {\n const items = this.#items;\n const ndx = items.indexOf(item);\n if (ndx >= 0) {\n item.removeEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.splice(ndx, 1);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n #scenes;\n #renderers;\n #supported;\n #active;\n get supported() {\n return this.#supported;\n }\n get active() {\n return this.#active;\n }\n _webGPUNotSupported(issue) {\n if (this.#supported && issue.cause === WebGPUIssueCause.NotSupported) {\n this.#supported = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'supported', oldValue: null, currentValue: false }));\n }\n if (this.#active) {\n this.#active = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'active', oldValue: null, currentValue: false }));\n }\n }\n initialize(scene) {\n const set = this.#renderers;\n const scenes = this.#scenes;\n if (!scenes.has(scene)) {\n scenes.add(scene);\n }\n return Renderers.create(scene, { enableValidation: this.enableValidation ?? false, modifiers: this.modifiers })\n .then(renderer => {\n set.get(scene)?.update( /* empty */);\n // update dictionary with the actual renderer\n set.set(scene, renderer);\n // assign datasource immediately\n this._updatePipeline(scene);\n return renderer.canvas;\n }, (issue) => {\n this.log(Logging.LogLevel.Error, issue.message);\n this._webGPUNotSupported(issue);\n return null;\n });\n }\n _parseWgslModifiers(val) {\n const scripts = this.#items, vertexGeometryScript = scripts.find(a => a.type == 'vertex-input'), vertexOutputScript = scripts.find(a => a.type == 'vertex-output'), fragmentScript = scripts.find(a => a.type == 'fragment');\n const vertexInput = vertexGeometryScript?.wgsl, vertexOutput = vertexOutputScript?.wgsl, fragment = fragmentScript?.wgsl;\n this.modifiers = { vertexInput, vertexOutput, fragment, version: val };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'modifiers':\n case 'enableValidation':\n // reinitialize\n this._reinitialize();\n break;\n }\n }\n disconnectedCallback() {\n const set = this.#renderers;\n for (let [_, renderer] of set) {\n renderer?.dispose();\n }\n set.clear();\n this.#scenes.clear();\n super.disconnectedCallback();\n }\n dispose(scene) {\n const renderers = this.#renderers, scenes = this.#scenes;\n ;\n if (renderers.has(scene)) {\n renderers.get(scene)?.dispose();\n renderers.delete(scene);\n }\n if (scenes.has(scene)) {\n scenes.delete(scene);\n }\n }\n _reinitialize() {\n for (let scene of this.#scenes.values()) {\n // rebuild renderer with new config in association to scene\n this.initialize(scene);\n }\n }\n _ensureRenderer(scene) {\n const set = this.#renderers;\n return set.get(scene);\n }\n _updatePipeline(scene) {\n const renderer = this._ensureRenderer(scene);\n renderer?.update(...scene.datasource);\n }\n #sceneToUpdate;\n /**\n * Called when scene datasource changes.\n * @param scene\n */\n render(scene) {\n // do not render hidden stages\n const width = scene.size?.width, height = scene.size?.height;\n if (!(width > 0) || !(height > 0)) {\n return;\n }\n // retrieve stage renderer\n const renderer = this._ensureRenderer(scene);\n if (Utils.isNull(renderer)) {\n return;\n }\n if (this.#sceneToUpdate.has(scene)) {\n this.#sceneToUpdate.delete(scene);\n this._itemsChangedExec(scene);\n }\n // draw\n const pixel = GETVAL(scene, WEBGPU_RAYCAST_PIXEL_PROP);\n renderer.render({ cursor: pixel, time: performance.now(), resolution: { width, height } });\n // raycast, just in case\n if (!scene.interactive) {\n return;\n }\n const callback = GETVAL(scene, WEBGPU_RAYCAST_CALLBACK_PROP);\n if (Utils.isNullOrEmpty(callback)) {\n return;\n }\n if (Utils.isNullOrEmpty(pixel)) {\n callback(null);\n return;\n }\n // draw again\n renderer.raycast(pixel).then(array => {\n if (Utils.isNullOrEmpty(array)) {\n callback(null);\n }\n else {\n const retval = {\n object: array[0], point: null\n };\n callback(retval);\n }\n });\n }\n snapshot(scene, background, type, quality) {\n const renderers = this.#renderers;\n if (!renderers.has(scene)) {\n return Promise.resolve(null);\n }\n const { canvas } = renderers.get(scene);\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render(scene);\n Utils.snapshotElement(canvas, background, mime, compression).then(resolve);\n });\n }\n raycast(stage, point, size, callback) {\n SETVAL(stage, WEBGPU_RAYCAST_CALLBACK_PROP, callback);\n if (point.x < 0 || point.y < 0 || point.x >= size.width || point.y >= size.height) {\n DELVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP);\n }\n else {\n SETVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP, point);\n }\n }\n _itemsChangedExec(stage) {\n this._updatePipeline(stage);\n }\n _itemsChanged(stage, _) {\n this.#sceneToUpdate.set(stage, true);\n }\n addItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n removeItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n updateItem(stage, item) {\n // if 'hide' property has changed or 'children' property (for groups)\n // then there's need to regenerate the tree view (camera switch, more/less meshes, ...)\n if (Utils.isNull(item)\n || item.flags.indexOf(StalePropertyFlag.Visibility) >= 0\n || item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n this._itemsChanged(stage, item);\n }\n }\n zoomFit(stage, ...items) {\n // TODO: implement on the renderer side\n return Promise.resolve();\n }\n project(stage, point3D) {\n // TODO: implement on the renderer side\n return { x: 0, y: 0 };\n }\n getScene(stage) {\n // no 3rd-party/proprietary scene objects to provide.\n return stage;\n }\n};\n__decorate([\n Debounce(100)\n], Pacem3DWebgpuAdapterElement.prototype, \"_parseWgslModifiers\", null);\n__decorate([\n Watch({ emit: false })\n], Pacem3DWebgpuAdapterElement.prototype, \"modifiers\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DWebgpuAdapterElement.prototype, \"enableValidation\", void 0);\nPacem3DWebgpuAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-webgpu-adapter' })\n], Pacem3DWebgpuAdapterElement);\nexport { Pacem3DWebgpuAdapterElement };\n", "import { Utils, P, Logging } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isCamera, isLight, isGroup } from '../../types';\nimport { AdapterUtils } from '../shared';\nimport { LABEL_PREFIX, GPUTextureUsage } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\nimport { Raycasters } from './raycaster';\nimport { RenderableBuffers, RenderLooper, ManagedBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nexport var WebGPUIssueCause;\n(function (WebGPUIssueCause) {\n WebGPUIssueCause[WebGPUIssueCause[\"NotSupported\"] = 0] = \"NotSupported\";\n WebGPUIssueCause[WebGPUIssueCause[\"Disabled\"] = 1] = \"Disabled\";\n})(WebGPUIssueCause || (WebGPUIssueCause = {}));\nexport class Renderers {\n static create(stage, config) {\n return new Promise((resolve, reject) => {\n if (!navigator.gpu) {\n const message = \"WebGPU not supported.\";\n const issue = { message, cause: WebGPUIssueCause.NotSupported };\n reject(issue);\n }\n else {\n const retval = new RendererClass(stage);\n retval.init(config).then(_ => resolve(retval), error => {\n const message = typeof error === 'string' ? error : error.message;\n const issue = { message, cause: WebGPUIssueCause.Disabled };\n reject(issue);\n });\n }\n });\n }\n}\nfunction getDefaultCamera(stage) {\n return {\n bottom: -1, top: 1, left: -1, right: 1, near: .1, far: 200, lookAt: Vector3D.from(0, 0, 0), up: Vector3D.j(), position: Vector3D.from(0, 0, 1), type: \"orthographic\",\n flags: [], stage\n };\n}\nfunction destroyTextures(...textures) {\n for (let tex of textures || []) {\n tex?.destroy();\n }\n}\nclass RendererClass {\n #stage;\n #canvas;\n #context;\n #renderables;\n #geometries;\n #materials;\n #looper;\n #textures;\n #config;\n #disabled;\n // interaction buffer\n #interactionBuffer;\n // interaction buffer underlying data\n #interaction;\n constructor(stage) {\n this.#renderables = new WeakMap();\n this.#geometries = new WeakMap();\n this.#materials = new WeakMap();\n this.#config = { enableValidation: false };\n this.#disabled = false;\n this._logError = (evt) => {\n const stage = this.#stage, logger = stage.logger;\n if (!Utils.isNull(logger)) {\n const error = 'error' in evt ? evt.error : evt;\n logger.log(Logging.LogLevel.Error, error.message, 'WebGPU');\n }\n };\n this.#rebuildingContext = true;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n this.#hasModifiers = false;\n const wrapper = (this.#stage = stage).stage;\n const canvas = document.createElement('canvas');\n canvas.id = P + '_3d_stage_' + Utils.uniqueCode();\n // cleanup\n wrapper.innerHTML = '';\n wrapper.appendChild(this.#canvas = canvas);\n // interaction stuff\n this.#interactionBuffer = ManagedBuffers.create(this.#interaction = {\n time: performance.now(), cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n });\n }\n _buildPassDescriptor({ multisample, format }) {\n const { context, device } = this.#context;\n const canvasTexture = context.getCurrentTexture();\n let textures = this.#textures;\n if (Utils.isNull(textures)) {\n textures = {};\n if (multisample) {\n const renderTex = device.createTexture({\n label: LABEL_PREFIX + 'render-texture',\n format: format ?? canvasTexture.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.render = {\n texture: renderTex, view: renderTex.createView({ label: LABEL_PREFIX + 'render-texture-view' })\n };\n const depthTex = device.createTexture({\n label: LABEL_PREFIX + 'depth-texture',\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.depth = {\n texture: depthTex, view: depthTex.createView({ label: LABEL_PREFIX + 'depth-texture-view' })\n };\n }\n this.#textures = textures;\n }\n const { transparent, background } = this.#stage;\n const backColor = transparent ? { r: 0, g: 0, b: 0, a: 0 } : background ? (typeof background === 'string' ? Colors.parse(background) : background) : { r: 0, g: 0, b: 0, a: 1 };\n const bgColor = AdapterUtils.flattenVectorArray([backColor]);\n const canvasTexView = canvasTexture.createView({ label: LABEL_PREFIX + 'canvas-texture-view' });\n const colorAttachment = {\n view: canvasTexView,\n clearValue: bgColor,\n loadOp: 'clear',\n storeOp: 'store',\n };\n const passDescriptor = {\n colorAttachments: [colorAttachment]\n };\n if (multisample) {\n const renderTexView = textures.render.view;\n const depthTexView = textures.depth.view;\n passDescriptor.depthStencilAttachment = {\n view: depthTexView,\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n stencilClearValue: 0,\n stencilReadOnly: true,\n };\n // override\n colorAttachment.view = renderTexView;\n colorAttachment.resolveTarget = canvasTexView;\n }\n return passDescriptor;\n }\n ;\n _buildContext(canvas = this.#canvas, size = this.#stage.size) {\n size ??= canvas;\n let w = size.width;\n let h = size.height;\n const devicePixelRatio = 1; // window.devicePixelRatio;\n canvas.width = w * devicePixelRatio;\n canvas.height = h * devicePixelRatio;\n const context = canvas.getContext('webgpu');\n const textureFormat = navigator.gpu.getPreferredCanvasFormat();\n return { context, textureFormat };\n }\n _buildUpContext(device, adapter, context, format) {\n const { transparent } = this.#stage;\n context.configure({\n alphaMode: transparent ? 'premultiplied' : 'opaque',\n device,\n format,\n });\n this.#context = { device, adapter, canvas: this.#canvas, context, format };\n this.#rebuildingContext = false;\n }\n async init(config) {\n this.#config = config;\n const adapter = await navigator.gpu.requestAdapter();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU adapter unavalable or disabled.');\n }\n const device = await adapter.requestDevice();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU device unavalable or disabled.');\n }\n device.addEventListener('uncapturederror', this._logError);\n // set flag for shader modifiers presence, this will be used to determine whether to update the interaction buffer on each render call\n this.#hasModifiers = !Utils.isNull(config.modifiers?.version) && !Utils.isNull(config.modifiers)\n && (!Utils.isNull(config.modifiers.vertexInput) || !Utils.isNull(config.modifiers.vertexOutput) || !Utils.isNull(config.modifiers.fragment));\n const { context, textureFormat: format } = this._buildContext();\n this._buildUpContext(device, adapter, context, format);\n }\n #rebuildingContext;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n #hasModifiers;\n /**\n * Render procedure.\n */\n render(interaction) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper) || !(this.#canvas.width > 0) || !(this.#canvas.height > 0)) {\n return;\n }\n const context = this.#context, device = context.device, \n // looper\n looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n if (this.#hasModifiers) {\n // update underlying interaction data, this will trigger buffer update\n Utils.extend(this.#interaction, interaction);\n }\n const multisample = true;\n const passDescriptor = this._buildPassDescriptor({ multisample });\n // rendering zone\n const commandEncoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'renderer' });\n const pass = commandEncoder.beginRenderPass(passDescriptor);\n // loop\n looper.loop((mesh, camera, lights) => {\n if (mesh.item.hide) {\n // this code branching is NOT NEEDED ANYMORE,\n // remove it safely\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n const renderables = [mesh, camera, ...lights];\n // inject here (pipeline options) any global rendering data (time, cursor, etc.) that may be needed by the shader modifiers\n const pipeline = RenderPipelines.create(context, renderables, { multisample: true, modifiers: this.#config.modifiers });\n // render\n pipeline.frame(pass, this.#interactionBuffer, ...renderables);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n pass.end();\n device.queue.submit([commandEncoder.finish()]);\n }\n set disabled(v) {\n this.#disabled = v;\n }\n get disabled() {\n return this.#disabled;\n }\n raycast(pixel) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper)) {\n return Promise.resolve([]);\n }\n const context = this.#context, device = context.device, looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n // rendering zone\n const raycaster = Raycasters.createColorPicking(context);\n raycaster.begin();\n // loop\n looper.loop((mesh, camera) => {\n if (mesh.item.hide) {\n // TODO: remove unwraps and move to nested loops\n // in order to centralize hidden renderable skip logic\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n raycaster.frame(this.#interactionBuffer, mesh, camera);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n return raycaster.end(pixel);\n }\n _disposeRenderableJustInCase(item) {\n const store = this.#renderables;\n if (store.has(item)) {\n store.get(item)?.destroy();\n store.delete(item);\n }\n }\n _createOrYieldRenderable(item, geometries = this.#geometries, materials = this.#materials) {\n item.stage ??= this.#stage;\n const store = this.#renderables;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = RenderableBuffers.create(item, geometries));\n }\n return found;\n }\n _createOrYieldGeometry(item) {\n const store = this.#geometries;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _createOrYieldMaterial(item) {\n const store = this.#materials;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _unwrapBuffers(grp, accumulator) {\n accumulator ??= { meshes: [], lights: [], cameras: [], groups: [] };\n for (let itemBuffer of grp.children) {\n itemBuffer.item.stage ??= this.#stage;\n if (isMesh(itemBuffer.item)) {\n accumulator.meshes.push(itemBuffer);\n }\n if (isCamera(itemBuffer.item)) {\n accumulator.cameras.push(itemBuffer);\n }\n if (isLight(itemBuffer.item)) {\n accumulator.lights.push(itemBuffer);\n }\n if (isGroup(itemBuffer.item)) {\n accumulator.groups.push(itemBuffer);\n this._unwrapBuffers(itemBuffer, accumulator);\n }\n }\n return accumulator;\n }\n ;\n _update(array) {\n const groupBuffers = [];\n const meshBuffers = [];\n const lightBuffers = [];\n const factory = i => this._createOrYieldRenderable(i);\n let camera;\n for (let item of array) {\n if (item.hide) {\n // remove stored renderable just in case\n this._disposeRenderableJustInCase(item);\n continue;\n }\n // ensure stage\n item.stage ??= this.#stage;\n // groups\n if (isGroup(item)) {\n const g = item;\n if (g.flags.includes(StalePropertyFlag.Children)) {\n this.#renderables.delete(g);\n }\n groupBuffers.push(factory(g));\n }\n // meshes\n if (isMesh(item) && item.geometry) {\n // build pipelines based on provided element wrappers (cached buffers)\n this._createOrYieldGeometry(item.geometry);\n if (!Utils.isNull(item.material)) {\n this._createOrYieldMaterial(item.material);\n }\n meshBuffers.push(factory(item));\n }\n // lights\n if (isLight(item)) {\n lightBuffers.push(factory(item));\n }\n if (isCamera(item)) {\n // pick the first only\n camera ??= item;\n }\n }\n // find first active camera\n camera ??= getDefaultCamera(this.#stage);\n const cameraBuffer = factory(camera);\n let accumulator = {\n meshes: meshBuffers, lights: lightBuffers, cameras: [cameraBuffer], groups: groupBuffers\n };\n for (let groupBuffer of groupBuffers) {\n accumulator = this._unwrapBuffers(groupBuffer, accumulator);\n }\n // destroy leftovers\n this.#looper?.items.meshes.forEach(buffer => {\n if (!meshBuffers.includes(buffer)) {\n buffer.destroy();\n }\n });\n this.#looper = new RenderLooper(accumulator);\n }\n update(...items) {\n this._update(Array.from(items));\n }\n dispose() {\n this.#looper = null;\n if (this._disposeContext()) {\n const { device } = this.#context;\n device.removeEventListener('uncapturederror', this._logError);\n device.destroy;\n }\n }\n _disposeContext() {\n const ctx = this.#context;\n if (Utils.isNull(ctx)) {\n return false;\n }\n // dispose associated raycasters, if any\n Raycasters.dispose(ctx);\n // dispose associated pipelines, if any\n RenderPipelines.dispose(ctx);\n // dispose textures\n const textures = this.#textures;\n this.#textures = null;\n if (!Utils.isNull(textures)) {\n const { render, depth } = textures;\n destroyTextures(render?.texture, depth?.texture);\n }\n // dispose context\n ctx.context.unconfigure();\n return true;\n }\n resize(size) {\n this.#rebuildingContext = true;\n if (this._disposeContext()) {\n const { device, adapter } = this.#context;\n const { context, textureFormat: format } = this._buildContext(this.canvas, size);\n this._buildUpContext(device, adapter, context, format);\n // interaction\n if (this.#hasModifiers) {\n Utils.extend(this.#interaction, { resolution: size });\n }\n }\n }\n get canvas() {\n return this.#canvas;\n }\n}\n", "//namespace Pacem.Drawing3D.WebGPU {\nexport const LABEL_PREFIX = 'pacem-3d-';\nexport const U32_MAX = 4_294_967_295;\n// #region vertex state\nexport const VERTEX_BUFFER_INDEX_MESH_POSITION = 0;\nexport const VERTEX_BUFFER_INDEX_MESH_NORMAL = 1;\nexport const VERTEX_BUFFER_INDEX_MESH_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_NORMAL = 0;\nexport const VERTEX_OUTPUT_LOCATION_VERTEX = 1;\nexport const VERTEX_OUTPUT_LOCATION_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_INDEX = 3;\nexport const VERTEX_OUTPUT_LOCATION_RAY = 4;\nexport const VERTEX_OUTPUT_LOCATION_INSTANCE = 5;\nexport const UNIFORM_GROUP_INDEX_TRANSFORM = 1;\nexport const UNIFORM_GROUP_INDEX_CAMERA = 0;\nexport const UNIFORM_GROUP_INDEX_INTERACTION = UNIFORM_GROUP_INDEX_CAMERA; // put it in camera same binding group\nexport const STORAGE_GROUP_INDEX_LINE = 2;\nexport const UNIFORM_GROUP_INDEX_COLORPICKING = 2;\nexport const UNIFORM_BINDING_INDEX_TRANSFORM = 0;\nexport const UNIFORM_BINDING_INDEX_CAMERA = 0;\nexport const UNIFORM_BINDING_INDEX_INTERACTION = 1;\n// #endregion\n// #region fragment state\nexport const MATERIAL_GROUP_INDEX = 2;\nexport const UNIFORM_GROUP_INDEX_LIGHTING = MATERIAL_GROUP_INDEX + 1;\nexport const STORAGE_MATERIAL_INDEX = 0;\nexport const SAMPLER_BINDING_INDEX = 1;\nexport const TEXTURE_BINDING_INDEX = 2;\nexport const MATERIAL_REFERENCE = 'material';\nexport const VERTEX_COLOR_REFERENCE = 'color';\nexport const AMBIENT_COLOR_REFERENCE = 'ambient';\nexport const LIGHTING_COLOR_REFERENCE = 'lighting';\n// #endregion\n// #region WGSL\nexport const WGSL_VERTEXINPUT_STRUCT_NAME = 'VertexInput';\nexport const WGSL_VERTEXOUTPUT_STRUCT_NAME = 'VertexOutput';\nexport const WGSL_INTERACTIONDATA_STRUCT_NAME = 'InteractionData';\n// #endregion\n// Kinda polyfill for WebGPU constants, as TypeScript 6.0 does include WebGPU types but does NOT include these constants for magic numbers:\nexport var GPUBufferUsage;\n(function (GPUBufferUsage) {\n GPUBufferUsage[GPUBufferUsage[\"COPY_SRC\"] = 4] = \"COPY_SRC\";\n GPUBufferUsage[GPUBufferUsage[\"COPY_DST\"] = 8] = \"COPY_DST\";\n GPUBufferUsage[GPUBufferUsage[\"INDEX\"] = 16] = \"INDEX\";\n GPUBufferUsage[GPUBufferUsage[\"INDIRECT\"] = 256] = \"INDIRECT\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_READ\"] = 1] = \"MAP_READ\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_WRITE\"] = 2] = \"MAP_WRITE\";\n GPUBufferUsage[GPUBufferUsage[\"QUERY_RESOLVE\"] = 512] = \"QUERY_RESOLVE\";\n GPUBufferUsage[GPUBufferUsage[\"STORAGE\"] = 128] = \"STORAGE\";\n GPUBufferUsage[GPUBufferUsage[\"UNIFORM\"] = 64] = \"UNIFORM\";\n GPUBufferUsage[GPUBufferUsage[\"VERTEX\"] = 32] = \"VERTEX\";\n})(GPUBufferUsage || (GPUBufferUsage = {}));\nexport var GPUTextureUsage;\n(function (GPUTextureUsage) {\n GPUTextureUsage[GPUTextureUsage[\"COPY_SRC\"] = 1] = \"COPY_SRC\";\n GPUTextureUsage[GPUTextureUsage[\"COPY_DST\"] = 2] = \"COPY_DST\";\n GPUTextureUsage[GPUTextureUsage[\"RENDER_ATTACHMENT\"] = 16] = \"RENDER_ATTACHMENT\";\n GPUTextureUsage[GPUTextureUsage[\"STORAGE_BINDING\"] = 8] = \"STORAGE_BINDING\";\n GPUTextureUsage[GPUTextureUsage[\"TEXTURE_BINDING\"] = 4] = \"TEXTURE_BINDING\";\n})(GPUTextureUsage || (GPUTextureUsage = {}));\nexport var GPUShaderStage;\n(function (GPUShaderStage) {\n GPUShaderStage[GPUShaderStage[\"VERTEX\"] = 1] = \"VERTEX\";\n GPUShaderStage[GPUShaderStage[\"FRAGMENT\"] = 2] = \"FRAGMENT\";\n GPUShaderStage[GPUShaderStage[\"COMPUTE\"] = 4] = \"COMPUTE\";\n})(GPUShaderStage || (GPUShaderStage = {}));\nexport var GPUMapMode;\n(function (GPUMapMode) {\n GPUMapMode[GPUMapMode[\"READ\"] = 1] = \"READ\";\n GPUMapMode[GPUMapMode[\"WRITE\"] = 2] = \"WRITE\";\n})(GPUMapMode || (GPUMapMode = {}));\n", "import { Utils } from '@pacem/pacem-core';\nimport { isMesh, isCamera, isLight, isMeshGeometry } from '../../types';\nimport { KnownShader, isLineMaterial } from '../../materials/material';\nimport { WGSLBindingType } from './abstractions';\nimport { LABEL_PREFIX, MATERIAL_GROUP_INDEX, UNIFORM_GROUP_INDEX_LIGHTING, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_INTERACTION, UNIFORM_BINDING_INDEX_INTERACTION, STORAGE_MATERIAL_INDEX, STORAGE_GROUP_INDEX_LINE, SAMPLER_BINDING_INDEX, TEXTURE_BINDING_INDEX, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE, UNIFORM_GROUP_INDEX_COLORPICKING, GPUShaderStage } from './constants';\nimport { BufferLayouts } from './buffers';\nimport { BasicMaterial, LineMaterial } from './materials';\nimport { getMeshVertexWgsl } from './wgsl/mesh-vertex';\nimport { getDefaultLineVertexWgsl, getFatLineVertexWgsl } from './wgsl/line-vertex';\nimport { getColorPickingFragmentWgsl } from './wgsl/object-picking-fragment';\nimport { textureMap } from './wgsl/texture-fragment';\nimport { directionalLight } from './wgsl/directional-light-fragment';\nimport { omniLight } from './wgsl/omni-light-fragment';\nimport { ambientLight } from './wgsl/ambient-light-fragment';\nimport { RenderableBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\n// #region constants\nconst labelPrefix = LABEL_PREFIX;\nconst DefaultPipelineOptions = {\n multisample: true,\n packedVertices: true,\n primitive: {\n topology: 'triangle-list',\n frontFace: 'ccw',\n cullMode: 'back'\n }\n};\nconst EMPTY_BIND_DELEGATE = (_) => { };\nexport class RenderPipelines {\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n const cache = memoizer.get(ctx);\n if (!Utils.isNull(cache)) {\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n static createColorPicking(ctx, items) {\n const renderPipeline = RenderPipelines.create(ctx, items);\n if (renderPipeline instanceof MeshRenderPipelineClass\n || renderPipeline instanceof LineRenderPipelineClass) {\n return {\n frame: renderPipeline.raycast\n };\n }\n return null;\n }\n static create(ctx, [mesh, camera, ...lights], pipelineOptions) {\n const memoizer = RenderPipelines._memoizer;\n let cache = memoizer.get(ctx);\n if (Utils.isNull(cache)) {\n memoizer.set(ctx, cache = new Map());\n }\n //const camera = items.find(i => isCamera(i.item));\n //const lights = items.filter(i => isLight(i.item));\n //// find main object\n //const mesh = items.find(i => isMesh(i.item));\n if (!Utils.isNull(mesh)) {\n if (isMesh(mesh.item)) {\n const isMesh = isMeshGeometry(mesh.item.geometry);\n const isLine = !isMesh && isLineMaterial(mesh.item.material);\n if (!isMesh && !isLine) {\n throw new Error('Pipeline not implemented, given the provided mesh argument.');\n }\n const builder = isMesh ? new MeshWGSLBuilder(mesh, camera, ...lights)\n : new LineWGSLBuilder(mesh, camera);\n // cache peek for sudden return\n const key = builder.key + (pipelineOptions?.modifiers?.version ?? '');\n const found = cache.get(key);\n if (found) {\n return found;\n }\n const pipeline = isMesh ? new MeshRenderPipelineClass(ctx, builder)\n : new LineRenderPipelineClass(ctx, builder);\n // no cache -> build it\n pipeline.build(pipelineOptions);\n const retval = pipeline;\n Utils.extend(retval, {\n id: key + '-' + ctx.canvas.width + 'x' + ctx.canvas.height + '-' + Utils.Dates.now().toISOString()\n });\n cache.set(key, retval);\n return retval;\n }\n else {\n throw new ReferenceError('Pipeline not implemented, given thst the first argument is not a mesh.');\n }\n }\n else {\n throw new Error('Pipeline not implemented, given the provided arguments.');\n }\n }\n}\nclass RenderPipelineCache {\n constructor() {\n this.#cache = new Map();\n }\n #cache;\n ensureBindGroup({ device }, item, buffers, refresh, layout, label, callback = () => { }) {\n const cache = this.#cache;\n const key = typeof item === 'string' ? item : item.key;\n let set = cache.get(key);\n if (Utils.isNull(set)) {\n cache.set(key, set = new Map());\n }\n if (refresh || !set.has(label)) {\n const entries = buffers.map((item, index) => {\n const entry = {\n binding: index,\n resource: {\n buffer: item\n }\n };\n return entry;\n });\n const descriptor = {\n label,\n layout,\n entries\n };\n // custom config happens here\n callback(descriptor);\n const retval = device.createBindGroup(descriptor);\n set.set(label, retval);\n return retval;\n }\n else {\n return set.get(label);\n }\n }\n}\nclass MeshWGSLBuilder {\n #lights = [];\n #mesh;\n #camera;\n #bindgroups = new Map();\n #key = { shader: 'basic', lights: '' };\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#lights.splice(0);\n this.#mesh = null;\n this.#bindgroups.clear();\n this.#key = { shader: 'basic', lights: '' };\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#mesh)) {\n this.#mesh = obj;\n const material = obj.item.material ?? { shader: KnownShader.Basic };\n this.#key.shader = material.shader + '-' + (material.map ? 'map' : 'nomap');\n }\n else {\n throw new Error('Mesh already added.');\n }\n }\n else if (isLight(obj.item)) {\n const lights = this.#lights;\n lights.push(obj);\n this.#key.lights += ('-' + obj.item.type);\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n // add interaction\n }\n build(modifiers) {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex({ inputModifier: modifiers?.vertexInput, outputModifier: modifiers?.vertexOutput }), fragment = this.fragment(data, { modifier: modifiers?.fragment }), bindings = (...args) => MeshWGSLBuilder.prototype.bindgroup.apply(this, args);\n const metadata = {\n lightCount: this.#lights.length,\n mapCount: this.#mesh.item.material?.map ? 1 : 0\n };\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata\n };\n }\n get key() {\n const { shader, lights } = this.#key;\n // TODO: consider backMap\n return `mesh-` + shader + lights;\n //return `mesh-${shader}${(hasTexture ? '-map' : '-nomap')}`;\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(options) {\n return getMeshVertexWgsl(options);\n }\n _computeBasicData() {\n const mesh = this.#mesh.item, lights = this.#lights, material = mesh.material, hasTexture = !Utils.isNull(material?.texture), hasLighting = !Utils.isNullOrEmpty(lights);\n const shader = Utils.isNull(mesh) ? KnownShader.Basic : (mesh.material?.shader ?? KnownShader.Basic);\n const materialBindGroupIndex = MATERIAL_GROUP_INDEX, lightingBindGroupIndex = UNIFORM_GROUP_INDEX_LIGHTING;\n return {\n hasTexture, hasLighting, shader,\n materialBindGroupIndex,\n lightingBindGroupIndex,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const { hasTexture, materialBindGroupIndex, lightingBindGroupIndex } = data;\n const bindgroups = this.#bindgroups, lights = this.#lights;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: materialBindGroupIndex, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n if (hasTexture) {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, { key: 'texture', group: materialBindGroupIndex, type: 'texture' }]);\n }\n else {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material]);\n }\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n // lights\n const lArr = lights.map((_, ndx) => {\n return { key: 'light', group: lightingBindGroupIndex, binding: ndx, type: 'buffer' };\n });\n lArr.push(...lArr);\n // interaction\n bindgroups.set(WGSLBindingType.Interaction, [{ key: 'interaction', group: UNIFORM_GROUP_INDEX_INTERACTION, type: 'buffer', binding: UNIFORM_BINDING_INDEX_INTERACTION }]);\n }\n fragment(data = this._computeBasicData(), options) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n const merge = (x) => {\n for (let definition of x.definitions ?? []) {\n if (extra.definitions.indexOf(definition) === -1) {\n extra.definitions.push(definition);\n }\n }\n if (!Utils.isNullOrEmpty(x.bindings)) {\n extra.bindings.push(...x.bindings);\n }\n if (!Utils.isNullOrEmpty(x.modifiers)) {\n extra.modifiers.push(...x.modifiers);\n }\n };\n /* TODO: consider injecting customizations (options.modifier) into `WGSLFragmentExtra`*/\n switch (data.shader) {\n case KnownShader.Basic:\n // texture\n if (data.hasTexture) {\n const materialGroupIndex = data.materialBindGroupIndex;\n const wgslTex = textureMap({ inputColor: VERTEX_COLOR_REFERENCE, outputColors: [VERTEX_COLOR_REFERENCE], uv: 'uv' }, materialGroupIndex);\n merge(wgslTex);\n }\n // lights\n let lightIndex = 0;\n const lights = this.#lights;\n for (let lightBuffer of lights) {\n const light = lightBuffer.item; // TODO: consider implementing Pacem.Drawing3D.WebGPU.Light interface (as of Materials)\n switch (light.type) {\n case 'direction':\n const dirLightExtra = directionalLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal' }, data.lightingBindGroupIndex, lightIndex);\n merge(dirLightExtra);\n break;\n case 'omni':\n const omniLightExtra = omniLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal', position: 'vertex', /*specularColor: MATERIAL_REFERENCE + '.specularColor', shininess: MATERIAL_REFERENCE + '.shininess'*/ }, data.lightingBindGroupIndex, lightIndex);\n merge(omniLightExtra);\n break;\n case 'ambient':\n const ambLightExtra = ambientLight({ inputColor: VERTEX_COLOR_REFERENCE, outputColor: AMBIENT_COLOR_REFERENCE }, data.lightingBindGroupIndex, lightIndex);\n merge(ambLightExtra);\n break;\n }\n lightIndex++;\n }\n return BasicMaterial.fragment(extra, options);\n }\n }\n}\nconst PipelineUtils = {\n writeBufferConditionally: (device, buffer) => {\n if (!buffer.fresh) {\n return;\n }\n device.queue.writeBuffer(buffer.buffer, 0, buffer.value);\n }\n};\nclass MeshRenderPipelineClass {\n constructor(_context, _builder, _cache = new RenderPipelineCache()) {\n this._context = _context;\n this._builder = _builder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureU32idBindGroup = (item, buffer, refresh) => {\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, this._pickBindGroupLayout, labelPrefix + 'mesh-colorpick-bind-group');\n };\n this._ensureMaterialBindGroup = (item, buffer, texture, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindGroupLayouts[layoutIndex], label = labelPrefix + 'material-bind-group';\n if (layout.label !== (labelPrefix + 'material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, layout, label, (descriptor) => {\n const { device } = this.context;\n const entries = descriptor.entries /* entries are build as array in the method */;\n if (texture) {\n entries.push({\n binding: SAMPLER_BINDING_INDEX, resource: device.createSampler({\n addressModeU: 'repeat',\n addressModeV: 'repeat',\n magFilter: 'linear',\n minFilter: 'linear',\n })\n }, {\n binding: TEXTURE_BINDING_INDEX, resource: texture.createView()\n });\n }\n });\n };\n this._ensureWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'mesh-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-transforms-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [buffer], refresh, layout, label);\n };\n this._ensureCameraProjectionAndInteractionDataBindGroup = (item, viewBuffer, interactionBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-view-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [viewBuffer, interactionBuffer], refresh, layout, label);\n };\n this._ensureLightingBindGroup = (lights, refresh, layoutIndex = UNIFORM_GROUP_INDEX_LIGHTING) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = lights.map(l => l.id).join(':');\n const buffers = lights.map(l => l.buffer.buffer);\n return this._cache.ensureBindGroup(this._context, key, buffers, refresh, layout, labelPrefix + 'mesh-lighting-bind-group');\n };\n this._bindGroupLayouts = [];\n this._bindVertex = EMPTY_BIND_DELEGATE;\n this._bindPicker = EMPTY_BIND_DELEGATE;\n this._bindWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindRaycastCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindLighting = EMPTY_BIND_DELEGATE;\n this._bindMaterial = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, interactionBuffer, meshBuffer, cameraBuffer, ...lightBuffers) => {\n // set\n pass.setPipeline(this._pipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindWorldTransform(pass, meshBuffer);\n this._bindMaterial(pass, meshBuffer);\n this._bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindLighting(pass, ...lightBuffers);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices?.length || geometry.positions.length);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, interactionBuffer, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickPipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindRaycastWorldTransform(pass, meshBuffer);\n this._bindRaycastCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindPicker(pass, meshBuffer);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices.length);\n }\n catch (e) { }\n };\n this._key = _builder.key;\n }\n get context() {\n return this._context;\n }\n get key() {\n return this._key;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._builder, wgsl = builder.build(options.modifiers);\n const ctx = Utils.extend({ pipeline: this }, this._context);\n const device = ctx.device;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: options.packedVertices ?\n [\n // packed\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3, 3, 2),\n ]\n : [\n // position\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3),\n // normal\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_NORMAL, 3),\n // uv\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_UV, 2)\n ]\n };\n // bind group layouts\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n },\n // interaction\n {\n binding: UNIFORM_BINDING_INDEX_INTERACTION,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-view-bind-group-layout'\n });\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-transforms-bind-group-layout'\n });\n const bindGroupLayouts = [viewBindGroupLayout, worldBindGroupLayout];\n // #endregion\n // #region FRAGMENT\n // TODO: https://stackoverflow.com/questions/50720534/implementing-depth-testing-for-semi-transparent-objects\n // Weighted Blended Order-Independent Transparency https://jcgt.org/published/0002/02/09/\n // a-buffer: https://webgpu.github.io/webgpu-samples/?sample=a-buffer#composite.wgsl\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n // material / texture\n const { mapCount } = wgsl.metadata, hasTex = mapCount > 0;\n if (hasTex) {\n materialBindGroupLayoutDescriptorEntries.push({ visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX, sampler: {} }, ...Array(mapCount).keys().map(index => { return { visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX + 1 + index, texture: {} }; }));\n }\n else {\n }\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // lighting\n const lightingGroupIndex = bindGroupLayouts.length;\n const { lightCount } = wgsl.metadata, hasLighting = lightCount > 0;\n if (hasLighting) {\n const lightingBindGroupLayout = device.createBindGroupLayout({\n entries: [...Array(lightCount).keys()].map((_, index) => {\n return {\n visibility: GPUShaderStage.FRAGMENT, binding: index, buffer: {\n type: 'uniform'\n }\n };\n }),\n label: labelPrefix + 'lighting-bind-group-layout'\n });\n bindGroupLayouts.push(lightingBindGroupLayout);\n }\n // #endregion\n // #region PIPELINE\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'mesh-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-render-pipeline-layout',\n bindGroupLayouts: (this._bindGroupLayouts = bindGroupLayouts)\n }),\n primitive: options.primitive\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._pipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'mesh-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'mesh-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(UNIFORM_GROUP_INDEX_COLORPICKING)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-colorpick-pipeline-layout',\n bindGroupLayouts: [viewBindGroupLayout, worldBindGroupLayout, pickFragGroupLayout]\n }),\n primitive: options.primitive,\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickPipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // vertex buffers\n const bindVertexSplit = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer: positions } = meshBuffer.buffer(ctx, 'geometryPositions');\n const { buffer: normals } = meshBuffer.buffer(ctx, 'geometryNormals');\n const { buffer: uv } = meshBuffer.buffer(ctx, 'geometryTexCoords');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, positions);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_NORMAL, normals);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_UV, uv);\n };\n const bindVertexPacked = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer } = meshBuffer.buffer(ctx, 'geometry');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, buffer);\n };\n this._bindVertex = options.packedVertices ? bindVertexPacked : bindVertexSplit;\n // world transform\n const bindWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, worldTransform.fresh /*false*/ /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, false);\n };\n this._bindRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices and interaction data\n const bindCameraProjectionAndInteractionData = (pass, cameraBuffer, interactionBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n // camera view\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n // interaction\n if (Utils.isNull(interactionBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing interaction buffers was provided.`);\n }\n const interactionDataBuffer = interactionBuffer.buffer(ctx, 'interaction'), interactionDataBufferBuffer = interactionDataBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, interactionDataBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const { group: interactionGroup } = wgsl.bindings(WGSLBindingType.Interaction, 'interaction', 0);\n if (group !== interactionGroup) {\n throw new ReferenceError(`Layout bind group mismatch: ${group} vs ${interactionGroup}.`);\n }\n const bindGroup = this._ensureCameraProjectionAndInteractionDataBindGroup(cameraBuffer.item, viewTransformBufferBuffer, interactionDataBufferBuffer, \n // since fresh could mean also \"camera switched\" (e.g. from ortho to perspective and then back to ortho) there's risk\n // to target destroyed buffers, this refresh the bind group if either buffer is fresh.\n // Possibilities for fine-tuning in future.\n viewTransformBuffer.fresh || interactionDataBuffer.fresh, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, false);\n };\n this._bindRaycastCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, true);\n };\n // vertexColors and textures\n this._bindMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n let tex = meshBuffer.texture(ctx);\n const texBmp = tex?.texture;\n const bindGroup = this._ensureMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, texBmp, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n if (hasTex) {\n device.queue.copyExternalImageToTexture({ source: tex.source, flipY: true }, { texture: texBmp }, { width: texBmp.width, height: texBmp.height });\n }\n };\n // lights\n this._bindLighting = (pass, ...buffers) => {\n if (hasLighting) {\n const lightArray = Array.from(buffers);\n const lightBuffers = lightArray.map(l => { return { buffer: l.buffer(ctx, 'light'), id: l.item.key }; });\n const refresh = lightBuffers.some(b => b.buffer.fresh);\n const bindGroup = this._ensureLightingBindGroup(lightBuffers, refresh, lightingGroupIndex);\n for (let lightBuffer of lightBuffers) {\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lightBuffer.buffer);\n }\n pass.setBindGroup(lightingGroupIndex, bindGroup);\n }\n };\n // picker\n this._bindPicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const group = UNIFORM_GROUP_INDEX_COLORPICKING;\n const refresh = u32id.fresh;\n const bindGroup = this._ensureU32idBindGroup(meshBuffer.item, u32idBuffer, refresh /* reuse u32id.fresh*/);\n pass.setBindGroup(group, bindGroup);\n };\n }\n}\nclass LineWGSLBuilder {\n #line;\n #camera;\n #bindgroups = new Map();\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#line = null;\n this.#bindgroups.clear();\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#line)) {\n this.#line = obj;\n }\n else {\n throw new Error('Line already added.');\n }\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else if (isLight(obj.item)) {\n // ignore\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n }\n build() {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex(data), fragment = this.fragment(data), bindings = (...args) => LineWGSLBuilder.prototype.bindgroup.apply(this, args);\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata: { thickness: data.thickness, dashPattern: data.dashPattern }\n };\n }\n get key() {\n const fat = (this.#line?.item).material?.lineWidth > 1;\n return KnownShader.Line + (fat ? '-fat' : '');\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(data = this._computeBasicData()) {\n return data.thickness > 1 ? getFatLineVertexWgsl() : getDefaultLineVertexWgsl();\n }\n _computeBasicData() {\n const mesh = this.#line.item;\n const shader = Utils.isNull(mesh) ? KnownShader.Line : (mesh.material?.shader ?? KnownShader.Line);\n const material = mesh.material;\n const thickness = material?.lineWidth ?? 1;\n const dashPattern = material?.dashArray;\n return {\n shader,\n thickness, dashPattern,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const bindgroups = this.#bindgroups;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: STORAGE_GROUP_INDEX_LINE + 1, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n const geometryPositions = { key: 'geometryPositions', group: STORAGE_GROUP_INDEX_LINE, binding: 0, type: 'buffer' };\n const line = { key: 'line', group: STORAGE_GROUP_INDEX_LINE, binding: 1, type: 'buffer' };\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, geometryPositions, line]);\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n }\n fragment(data = this._computeBasicData()) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n switch (data.shader) {\n case KnownShader.Line:\n return LineMaterial.fragment(extra);\n }\n }\n}\nclass LineRenderPipelineClass {\n #context;\n constructor(context, _lineBuilder, _cache = new RenderPipelineCache()) {\n this._lineBuilder = _lineBuilder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureLineU32idBindGroup = (item, buffer, refresh) => {\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, this._pickLineBindGroupLayout, labelPrefix + 'line-colorpick-bind-group');\n };\n this._ensureLineMaterialBindGroup = (item, buffer, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, layout, labelPrefix + 'line-material-bind-group');\n };\n this._ensureLinePositionsBindGroup = (item, buffers, refresh, layoutIndex) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-positions-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, buffers, refresh, layout, labelPrefix + 'line-positions-bind-group');\n };\n this._ensureLineWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-transforms-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [buffer], refresh, layout, label);\n };\n this._ensureLineCameraProjectionBindGroup = (item, viewBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-view-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [viewBuffer], refresh, layout, label);\n };\n this._bindLineGroupLayouts = [];\n this._bindLinePositions = EMPTY_BIND_DELEGATE;\n this._bindLinePicker = EMPTY_BIND_DELEGATE;\n this._bindLineWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineMaterial = EMPTY_BIND_DELEGATE;\n this._drawLine = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._linePipeline);\n try {\n // bind\n this._bindLineWorldTransform(pass, meshBuffer);\n this._bindLineCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLineMaterial(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickLinePipeline);\n try {\n // bind\n this._bindLineRaycastWorldTransform(pass, meshBuffer);\n this._bindLineRaycastCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLinePicker(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) { }\n };\n this.#context = context;\n this._lineKey = _lineBuilder.key;\n }\n get context() {\n return this.#context;\n }\n get key() {\n return this._lineKey;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._lineBuilder, wgsl = builder.build();\n const ctx = Utils.extend({ pipeline: this }, this.#context);\n const device = ctx.device;\n // TODO: switch topology based on this flag\n const fatLines = wgsl.metadata.thickness > 1;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: []\n };\n // bind group layouts\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-transforms-bind-group-layout'\n });\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-view-bind-group-layout'\n });\n const lineEntries = [\n // positions array\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'read-only-storage'\n }\n }\n ];\n if (fatLines) {\n lineEntries.push(\n // line properties (width, dash-array, lineCap, ...)\n {\n binding: 1,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n });\n }\n const lineBindGroupLayout = device.createBindGroupLayout({\n entries: lineEntries, label: labelPrefix + 'line-positions-bind-group-layout'\n });\n const vertexBindGroupLayouts = [worldBindGroupLayout, viewBindGroupLayout, lineBindGroupLayout];\n const raycastLayoutIndex = vertexBindGroupLayouts.length;\n const bindGroupLayouts = vertexBindGroupLayouts.slice();\n // #endregion\n // #region FRAGMENT\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'line-material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // #endregion\n // #region PIPELINE\n const topology = fatLines ? options.primitive.topology : 'line-list';\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'line-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-render-pipeline-layout',\n bindGroupLayouts: (this._bindLineGroupLayouts = bindGroupLayouts)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._linePipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickLineBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'line-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'line-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(raycastLayoutIndex)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-colorpick-pipeline-layout',\n bindGroupLayouts: vertexBindGroupLayouts.concat(pickFragGroupLayout)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickLinePipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // world transform\n const bindLineWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureLineWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, \n /*worldTransform.fresh*/ false /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, false);\n };\n this._bindLineRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices\n const bindLineCameraProjection = (pass, cameraBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const bindGroup = this._ensureLineCameraProjectionBindGroup(cameraBuffer.item, viewTransformBufferBuffer, \n /*viewTransformBuffer.fresh*/ false, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, false);\n };\n this._bindLineRaycastCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, true);\n };\n // positions storage\n this._bindLinePositions = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided as index 0.`);\n }\n // storage buffer\n const positionsBuffer = /* should have a storage buffer here */ meshBuffer.buffer(ctx, 'geometryPositions'), positionsBufferBuffer = positionsBuffer.buffer;\n let refresh = positionsBuffer.fresh;\n const buffersInput = [positionsBufferBuffer];\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, positionsBuffer);\n if (fatLines) {\n const lineBuffer = meshBuffer.buffer(ctx, 'line'), lineBufferBuffer = lineBuffer.buffer;\n refresh ||= lineBuffer.fresh;\n buffersInput.push(lineBufferBuffer);\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lineBuffer);\n }\n const { group: groupIndex } = wgsl.bindings(WGSLBindingType.Mesh, 'line' /* or 'geometryPositions' */, 0);\n const bindGroup = this._ensureLinePositionsBindGroup(meshBuffer.item, buffersInput, refresh, groupIndex);\n pass.setBindGroup(groupIndex, bindGroup);\n };\n // vertexColors\n this._bindLineMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n const bindGroup = this._ensureLineMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n };\n // picker\n this._bindLinePicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer, u32idArray = u32id.value;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const bindGroup = this._ensureLineU32idBindGroup(meshBuffer.item, u32idBuffer, /* reuse */ false /*u32id.fresh*/);\n pass.setBindGroup(raycastLayoutIndex, bindGroup);\n };\n this._drawLine = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n const mesh = meshBuffer.item, geometry = mesh.geometry /* as NodeGeometry*/;\n if (fatLines) {\n pass.draw(6, geometry.positions.length - 1, 0, 0);\n }\n else {\n pass.draw(geometry.positions.length);\n }\n };\n }\n}\n// #endregion\n", "export var WGSLBindingType;\n(function (WGSLBindingType) {\n WGSLBindingType[\"Mesh\"] = \"mesh\";\n WGSLBindingType[\"Camera\"] = \"camera\";\n WGSLBindingType[\"Texture\"] = \"texture\";\n WGSLBindingType[\"Light\"] = \"light\";\n WGSLBindingType[\"Interaction\"] = \"interaction\";\n})(WGSLBindingType || (WGSLBindingType = {}));\n", "import { GPUBufferUsage } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Buffers {\n static create(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Float32Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n static createUniform(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n }\n static createStorage(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n static createIndexed(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Uint16Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n}\nexport class BufferLayouts {\n static createVertex(shaderLocationStart = 0, size = 3, ...sizes) {\n const attributes = [];\n let fullSize = 0, index = 0;\n for (let sz of [size].concat(sizes)) {\n attributes.push({\n shaderLocation: shaderLocationStart + index,\n offset: fullSize * Float32Array.BYTES_PER_ELEMENT,\n format: `float32x${sz}`,\n });\n fullSize += sz;\n index++;\n }\n return {\n arrayStride: fullSize /* x, y, z */ * Float32Array.BYTES_PER_ELEMENT,\n attributes,\n stepMode: 'vertex'\n };\n }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { isBasicMaterial, isLineMaterial, KnownShader } from '../../materials/material';\nimport { Buffers } from './buffers';\nimport { GPUTextureUsage } from './constants';\nimport { getBasicMaterialFragmentWgsl } from './wgsl/basic-material-fragment';\nimport { getLineMaterialFragmentWgsl } from './wgsl/line-material-fragment';\nimport { LABEL_PREFIX } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Materials {\n static create(material) {\n if (isBasicMaterial(material)) {\n return new BasicMaterial(material);\n }\n if (isLineMaterial(material)) {\n return new LineMaterial(material);\n }\n throw new TypeError(`Material type '${material.shader}' not supported.`);\n }\n}\nconst EmptyMaterialWGSLDelegates = {\n// empty delegates\n};\nclass MaterialBase {\n constructor(material) {\n if (Utils.isNull(this.#material = material)) {\n throw new ReferenceError(\"Null material provided.\");\n }\n }\n #material;\n get material() { return this.#material; }\n get wgsl() {\n return EmptyMaterialWGSLDelegates;\n }\n buffer({ device }, label = LABEL_PREFIX + 'material-' + this.shader + '-buffer') {\n const { r, g, b, a } = this._diffuseColor();\n const materialValue = new Float32Array([r, g, b, a]);\n return { buffer: Buffers.createStorage(device, materialValue, label), value: materialValue, version: performance.now() };\n }\n _diffuseColor() {\n const { visible, opacity, color } = this.material;\n if (!(visible ?? true)) {\n return { r: 0, g: 0, b: 0, a: 0 };\n }\n const retval = typeof color === 'string' ? Colors.parse(color) : (color ?? { r: 1, g: 1, b: 1, a: 1 });\n if (opacity >= 0 && opacity <= 1) {\n return Utils.extend(retval, { a: retval.a * opacity });\n }\n return retval;\n }\n}\nexport class BasicMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Basic;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Basic material expected.\");\n }\n }\n texture({ device }, key = 'texture') {\n const material = this.material;\n if (key === 'texture' && !Utils.isNull(material.texture)) {\n const texBmp = material.texture;\n const texture = device.createTexture({\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST,\n size: [texBmp.width, texBmp.height],\n });\n return { texture, source: texBmp };\n }\n return null;\n }\n // TODO: put it in the material instance/interface\n static { this.fragment = getBasicMaterialFragmentWgsl; }\n}\nexport class LineMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Line;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Line material expected.\");\n }\n }\n buffer(ctx, key) {\n switch (key) {\n case 'line':\n const { device, canvas } = ctx;\n const lineMaterial = this.material;\n const lineValue = new Float32Array([canvas.clientWidth, canvas.clientHeight, lineMaterial.lineWidth / 2]);\n return { buffer: Buffers.createUniform(device, lineValue, LABEL_PREFIX + 'line-' + this.shader + '-buffer'), value: lineValue, version: performance.now() };\n default:\n return super.buffer(ctx);\n }\n }\n texture(_) {\n return null;\n }\n static { this.fragment = getLineMaterialFragmentWgsl; }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, MATERIAL_GROUP_INDEX, STORAGE_MATERIAL_INDEX, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE } from '../constants';\nconst DefaultBasicMaterialFragmentOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputRayIndexLocation: VERTEX_OUTPUT_LOCATION_RAY,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n storageMaterialGroupIndex: MATERIAL_GROUP_INDEX,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n\\t');\n }\n else {\n output += `${VERTEX_COLOR_REFERENCE} = ${trimmed};\\r\\n\\t`;\n }\n }\n return output;\n}\nexport function getBasicMaterialFragmentWgsl(extensions = {}, options = DefaultBasicMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultBasicMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n const color = VERTEX_COLOR_REFERENCE, lighting = LIGHTING_COLOR_REFERENCE, ambient = AMBIENT_COLOR_REFERENCE;\n return `// definitions\r\n\r\n${definitions}\r\n\r\n// bindings\r\n@group(${opts.storageMaterialGroupIndex}) @binding(${opts.storageMaterialBindingIndex}) var<storage, read> diffuseColor: vec4f;\r\n${bindings}\r\n\r\nconst empty = vec4f(0,0,0,0);\r\nconst white = vec4f(1,1,1,1);\r\n\r\n@fragment fn main (\r\n @builtin(position) position: vec4f, // clip-space position\r\n @location(${opts.outputNormalLocation}) normal: vec3f, // world-space normal\r\n @location(${opts.outputVertexLocation}) vertex: vec3f, // world-space position\r\n @location(${opts.outputUvLocation}) uv: vec2f,\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32, // vertex index,\r\n @location(${opts.outputRayIndexLocation}) ray: vec3f, // ray (eye-to-vertex) vector\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n) -> @location(0) vec4f {\r\n var ${color} = diffuseColor;\r\n var ${ambient}: vec4f = empty;\r\n var ${lighting}: vec4f = empty;\r\n\r\n // modifiers\r\n ${modifiers}\r\n\r\n ${lighting} = select(white, ${lighting}, ${lighting}.a > 0);\r\n return ${color} * ${lighting} + ${ambient};\r\n}`;\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { STORAGE_GROUP_INDEX_LINE, STORAGE_MATERIAL_INDEX } from '../constants';\nconst DefaultLineMaterialFragmentOptions = {\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storageMaterialGroupIndex: STORAGE_GROUP_INDEX_LINE + 1,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n');\n }\n else {\n output += `output = ${trimmed};\\r\\n`;\n }\n }\n return output;\n}\nexport function getLineMaterialFragmentWgsl(extensions = {}, options = DefaultLineMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultLineMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n return `// definitions\r\n${definitions}\r\n\r\n// bindings\r\n@group(${options.storageMaterialGroupIndex}) @binding(${options.storageMaterialBindingIndex}) var<storage, read> vertexColors: array<vec4f>;\r\n${bindings}\r\n\r\nfn getVertexColor(index: u32) -> vec4f {\r\n let numColors = arrayLength(&vertexColors);\r\n let vertexColorIndex = index % numColors;\r\n return vertexColors[vertexColorIndex];\r\n}\r\n\r\n@fragment fn main (\r\n @builtin(position) position: vec4f, // clip-space position\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance: u32, // instance index\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32 // vertex index\r\n) -> @location(0) vec4f {\r\n var output = getVertexColor(index);\r\n\r\n // modifiers\r\n ${modifiers}\r\n\r\n return output;\r\n}`;\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_INTERACTION, UNIFORM_GROUP_INDEX_INTERACTION, WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\nimport { extractMeshVertexModifierFunctionComponents } from './shared';\nconst DefaultMeshVertexOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n outputRayLocation: VERTEX_OUTPUT_LOCATION_RAY,\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n inputNormalLocation: VERTEX_BUFFER_INDEX_MESH_NORMAL,\n inputUvLocation: VERTEX_BUFFER_INDEX_MESH_UV,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformInteractionBindingIndex: UNIFORM_BINDING_INDEX_INTERACTION,\n uniformInteractionGroupIndex: UNIFORM_GROUP_INDEX_INTERACTION,\n};\nexport function getMeshVertexWgsl(options = DefaultMeshVertexOptions) {\n if (options != DefaultMeshVertexOptions) {\n options = Utils.extend({}, DefaultMeshVertexOptions, options);\n }\n // vertex input modifier?\n const modifierInput = options.inputModifier;\n let modifyInstructionInput = 'vertexInput', modifierFnInput = '';\n if (!Utils.isNullOrEmpty(modifierInput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierInput);\n modifyInstructionInput = `${modifierName}(vertexInput, interaction)`;\n modifierFnInput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} {\r\n ${modifierBody}\r\n}`;\n }\n // vertex output modifier?\n const modifierOutput = options.outputModifier;\n let modifyInstructionOutput = 'output', modifierFnOutput = '';\n if (!Utils.isNullOrEmpty(modifierOutput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierOutput);\n modifyInstructionOutput = `${modifierName}(output, interaction)`;\n modifierFnOutput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n ${modifierBody}\r\n}`;\n }\n const opts = Utils.extend({}, DefaultMeshVertexOptions, options);\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n @builtin(position) position : vec4f, // clip space position\r\n @location(${opts.outputNormalLocation}) normal: vec3f, // world space normal\r\n @location(${opts.outputVertexLocation}) vertex : vec3f, // world space position\r\n @location(${opts.outputUvLocation}) uv : vec2f, // texture coordinates\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\r\n @location(${opts.outputRayLocation}) ray : vec3f, // eye-to-point vector in world space\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n}\r\n\r\nstruct ${WGSL_VERTEXINPUT_STRUCT_NAME} {\r\n @location(${opts.inputPositionLocation}) position: vec3f,\r\n @location(${opts.inputNormalLocation}) normal: vec3f,\r\n @location(${opts.inputUvLocation}) uv: vec2f,\r\n @builtin(vertex_index) index: u32,\r\n @builtin(instance_index) instance: u32,\r\n}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f,\r\n}\r\n\r\nstruct ${WGSL_INTERACTIONDATA_STRUCT_NAME} {\r\n // mouse coordinatges in NDC space ([-1,1], [-1,1])\r\n cursor: vec2f,\r\n // canvas size in pixels\r\n resolution: vec2f,\r\n // some phase timer (e.g. time since mouse down, or time since last click, etc.)\r\n time: f32,\r\n}\r\n\r\n${modifierFnInput}\r\n\r\n${modifierFnOutput}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.uniformInteractionGroupIndex}) @binding(${opts.uniformInteractionBindingIndex}) var<uniform> interaction: ${WGSL_INTERACTIONDATA_STRUCT_NAME};\r\n\r\n@vertex fn main(vertexInput: ${WGSL_VERTEXINPUT_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n let input = ${modifyInstructionInput};\r\n let position4 = vec4f(input.position, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n let worldPosition = (worldTransform * position4).xyz;\r\n let output = ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n worldViewProjectionTransform * position4,\r\n transforms.normal * input.normal,\r\n worldPosition,\r\n input.uv,\r\n input.index,\r\n normalize(worldPosition - camera.position),\r\n input.instance\r\n );\r\n return ${modifyInstructionOutput};\r\n}`;\n}\n", "import { WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\nconst defaultVertexGeometryModifierArgs = ['input', 'data'];\n//const defaultVertexGeometryModifier: VertexInputModifierDelegate = (...defaultVertexGeometryModifierArgs) => {\n// const [inputRef, dataRef] = defaultVertexGeometryModifierArgs;\n// return `fn echo(${inputRef}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${dataRef}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} { return ${inputRef}; }`;\n//};\nexport function extractMeshVertexModifierFunctionComponents(wgsl) {\n if (typeof wgsl !== 'string') {\n wgsl = wgsl(...defaultVertexGeometryModifierArgs);\n }\n // regex that remove all the wgsl comments and extract the function name, arguments and body\n const regex = new RegExp(`fn\\\\s+(\\\\w+)\\\\s*\\\\(([^)]*)\\\\)\\\\s*->\\\\s*(${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME})\\\\s*{((.|\\\\n)+)}\\\\s*$`);\n const match = wgsl.match(regex);\n if (match) {\n const name = match[1];\n const args = match[2].split(',').map(arg => {\n const kvp = arg.split(':');\n return { name: kvp[0].trim(), type: kvp[1].trim() };\n });\n if (args.length !== 2\n || args[0].type !== match[3] // the first argument type must match the function return type\n || args[1].type !== WGSL_INTERACTIONDATA_STRUCT_NAME) {\n throw new Error(`Invalid modifier function. Invalid signature types (arg1: ${args[0]?.type}, arg2: ${args[1]?.type})`);\n }\n const body = match[4].trim();\n return { name, args: args.map(i => i.name), body };\n }\n else {\n throw new Error(`Invalid modifier function. Must be a valid WGSL function with the signature: fn name(arg1: ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}, arg2: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}`);\n }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_BUFFER_INDEX_MESH_POSITION, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, STORAGE_GROUP_INDEX_LINE, WGSL_VERTEXOUTPUT_STRUCT_NAME } from '../constants';\nconst DefaultLineVertexOptions = {\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storagePositionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n storagePositionsBindingIndex: 0,\n uniformDimensionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n uniformDimensionsBindingIndex: 1,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n};\nfunction getVertexOutputStructDefinition(opts) {\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n @builtin(position) position : vec4f, // clip space position\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\r\n}`;\n}\nexport function getDefaultLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f\r\n}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\r\n\r\n@vertex fn main(@builtin(instance_index) instance: u32,\r\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n\r\n let x = positions[3u * index + 0u];\r\n let y = positions[3u * index + 1u];\r\n let z = positions[3u * index + 2u];\r\n let position4 = vec4f(x, y, z, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n let worldPosition = (worldTransform * position4).xyz;\r\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n worldViewProjectionTransform * position4,\r\n instance,\r\n index);\r\n}`;\n}\nexport function getFatLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f\r\n}\r\n\r\nstruct Pixels {\r\n viewportWidth: f32,\r\n viewportHeight: f32,\r\n halfLineWidth: f32\r\n}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\r\n@group(${opts.uniformDimensionsGroupIndex}) @binding(${opts.uniformDimensionsBindingIndex}) var<uniform> dimensions: Pixels;\r\n\r\nfn computeClipPosition(index: u32) -> vec4f {\r\n let x = positions[3u * index + 0u];\r\n let y = positions[3u * index + 1u];\r\n let z = positions[3u * index + 2u];\r\n let position4 = vec4f(x, y, z, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n return worldViewProjectionTransform * position4;\r\n}\r\n\r\nfn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {\r\n\r\n let viewportSize = vec2f(dimensions.viewportWidth, dimensions.viewportHeight);\r\n let normalizedSize = normalize(viewportSize);\r\n let halfThickness = dimensions.halfLineWidth / dimensions.viewportWidth;\r\n let p0ndc = p0.xyz / p0.w;\r\n let p1ndc = p1.xyz / p1.w;\r\n let dir = normalize((p1ndc - p0ndc).xy);\r\n let offsetX = halfThickness * 2.0 / normalizedSize.x;\r\n let offsetY = halfThickness * 2.0 / normalizedSize.y;\r\n\r\n // perp\r\n let perp0 = vec2f(-dir.y * offsetX, dir.x * offsetY);\r\n let perp1 = perp0;\r\n\r\n /*\r\n\r\n position0-0 -----*----- position0-1\r\n |\\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\|\r\n position1-0 -----*----- position1-1\r\n\r\n indexes:\r\n ------------\r\n p0-0 -> 0, 3\r\n p0-1 -> 5\r\n p1-0 -> 1\r\n p1-1 -> 2, 4\r\n */\r\n\r\n var outPos: vec2f;\r\n var w = p0.w;\r\n var z = p0.z;\r\n if (index == 0 || index == 3){\r\n outPos = p0ndc.xy - perp0;\r\n }\r\n else if (index == 1){\r\n outPos = p1ndc.xy - perp1;\r\n w = p1.w;\r\n z = p1.z;\r\n }\r\n else if (index == 5){\r\n outPos = p0ndc.xy + perp0;\r\n }\r\n else { //if (index == 2 || index == 4)\r\n outPos = p1ndc.xy + perp1;\r\n w = p1.w;\r\n z = p1.z;\r\n }\r\n\r\n // return vec4f(outPos , 0, 1.0);\r\n return vec4f(outPos * w, z, w);\r\n}\r\n\r\n@vertex fn main(@builtin(instance_index) instance: u32,\r\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n\r\n // vertex index starting at 1\r\n let position0 = computeClipPosition(instance);\r\n let position1 = computeClipPosition(instance + 1);\r\n\r\n // apply offset\r\n let position = computeOffsetPosition(position0, position1, index);\r\n\r\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n position,\r\n instance,\r\n index\r\n );\r\n}`;\n}\n", "import { UNIFORM_GROUP_INDEX_COLORPICKING } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\n/**\n * Generate a WGSL piece of code that eases 3D picking using color strategy.\n */\nexport function getColorPickingFragmentWgsl(groupIndex = UNIFORM_GROUP_INDEX_COLORPICKING) {\n return `struct ColorPicker {\r\n id: u32,\r\n };\r\n\r\n @group(${groupIndex}) @binding(0) var<uniform> colorPicker: ColorPicker;\r\n\r\n @fragment\r\n fn main(@builtin(position) position: vec4f) -> @location(0) u32 {\r\n return colorPicker.id;\r\n }\r\n `;\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { SAMPLER_BINDING_INDEX } from '../constants';\nconst DefaultTextureMapReferences = {\n uv: 'uv',\n};\nexport function textureMap(references = DefaultTextureMapReferences, group, binding = SAMPLER_BINDING_INDEX) {\n const key = Utils.uniqueCode();\n const samplerReference = `sampler_${key}`;\n const texReference = `tex_${key}`;\n const ref = Utils.extend({}, DefaultTextureMapReferences, references);\n const inputColor = ref.inputColor, outputColors = ref.outputColors;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n const modifiers = outputColors ?\n outputColors.map((name, index) => index === 0 ? `${name} = textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor};` : `${name} = ${outputColors[0]};`)\n : [`textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor}`];\n return {\n // type definitions\n //definition: '',\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var ${samplerReference}: sampler;`,\n `@group(${group}) @binding(${binding + 1}) var ${texReference}: texture_2d<f32>;`],\n // modifiers\n modifiers\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nconst DefaultDirectionalLightReferences = {\n normal: 'normal', inputColor: 'white'\n};\nexport function directionalLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `directional_${key}`;\n const ref = Utils.extend({}, DefaultDirectionalLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal ?? 'normal';\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct DirectionalLight {\r\n color: vec4f,\r\n direction: vec3f,\r\n intensity: f32\r\n}`, `fn computeDirectional(normal: vec3f, color: vec4f, light: DirectionalLight) -> vec4f {\r\n let n = normalize(normal);\r\n let d = normalize(light.direction);\r\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\r\n let output = color.rgb * light.color.rgb * factor;\r\n return vec4f(output, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: DirectionalLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeDirectional(${normal}, ${inputColor}, ${lightReference});`] : [`computeDirectional(${normal}, ${inputColor}, ${lightReference})`]\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nconst DefaultOmniLightReferences = {\n normal: 'normal', position: 'vertex', ray: 'ray', inputColor: 'white', specularColor: 'empty', shininess: '0'\n};\nexport function omniLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `omni_${key}`;\n const ref = Utils.extend({}, DefaultOmniLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal, ray = ref.ray, vertex = ref.position, shininess = ref.shininess, specularColor = ref.specularColor;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct OmniLight {\r\n color: vec4f,\r\n position: vec3f,\r\n intensity: f32\r\n}`, `fn computeOmni(position: vec3f, normal: vec3f, ray: vec3f, color: vec4f, specularColor: vec4f, shininess: f32, light: OmniLight) -> vec4f {\r\n\r\n // color\r\n let n = normalize(normal);\r\n let d = normalize(position - light.position);\r\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\r\n\r\n // specular\r\n let r = normalize(ray);\r\n let halfVector = normalize(d + r);\r\n let specular = specularColor.rgb * shininess * dot(n, -halfVector);\r\n\r\n let output = color.rgb * light.color.rgb * factor + specular;\r\n return vec4f(output, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: OmniLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference});`] : [`computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference})`]\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nexport function ambientLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `ambient_${key}`;\n const inputColor = references.inputColor, outputColor = references.outputColor;\n if (Utils.isNullOrEmpty(inputColor) || Utils.isNullOrEmpty(outputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n return {\n // type definitions\n definitions: [`struct AmbientLight {\r\n color: vec4f,\r\n intensity: f32\r\n}`, `fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {\r\n return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: AmbientLight;`],\n // modifiers\n modifiers: [`${outputColor} = computeAmbient(${inputColor}, ${lightReference});`]\n };\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isGroup, isMesh, isCamera, isLight, isGeometry, isInteraction, isMeshGeometry } from '../../types';\nimport { KnownShader, isMaterial } from '../../materials/material';\nimport { AdapterUtils } from '../shared';\nimport { U32_MAX, LABEL_PREFIX } from './constants';\nimport { Buffers } from './buffers';\nimport { Cameras } from './cameras';\nimport { Materials } from './materials';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nfunction throwBufferRequestError(key, type) {\n if (typeof type === 'function') {\n type = type.name;\n }\n throw new RangeError(`Buffer '${key}' not available for ${type}.`);\n}\nfunction createRenderableBuffer(item, parent, ...args) {\n item.stage ??= parent?.item.stage;\n if (isGroup(item)) {\n item.key ??= 'group_' + Utils.uniqueCode();\n return new RenderableGroupBuffer(item, parent, ...args);\n }\n if (isMesh(item)) {\n item.key ??= 'mesh_' + Utils.uniqueCode();\n return new RenderableMeshBuffer(item, parent, ...args);\n }\n if (isCamera(item)) {\n item.key ??= 'camera_' + Utils.uniqueCode();\n return new RenderableCameraBuffer(item /*, parent*/);\n }\n if (isLight(item)) {\n item.key ??= 'light_' + item.type + '_' + Utils.uniqueCode();\n return new RenderableLightBuffer(item /*, parent*/);\n }\n throw new Error(`Renderable is not supported.`);\n}\nexport class RenderLooper {\n constructor(_set) {\n this._set = _set;\n }\n /** @internal */\n get items() {\n return this._set;\n }\n loop(render) {\n const { meshes, cameras, groups, lights } = this._set;\n const camera = cameras[0];\n let cameraDone = false, lightsDone = false;\n for (let mesh of meshes) {\n if (mesh.disposed) {\n continue;\n }\n // execute\n const rendered = render(mesh, camera, lights);\n if (!rendered) {\n continue;\n }\n // seal buffers\n RenderableBuffers.clearFlags(mesh);\n if (!cameraDone) {\n RenderableBuffers.clearFlags(camera);\n cameraDone = true;\n }\n if (!lightsDone) {\n lights.forEach(light => RenderableBuffers.clearFlags(light));\n lightsDone = true;\n }\n }\n for (let group of groups) {\n // seal group buffers\n RenderableBuffers.clearFlags(group);\n }\n }\n}\nexport class ManagedBuffers {\n static create(item) {\n if (isGeometry(item)) {\n item.key ??= 'geometry_' + Utils.uniqueCode();\n return new GeometryBuffer(item);\n }\n if (isMaterial(item)) {\n return new MaterialBuffer(item);\n }\n if (isInteraction(item)) {\n return new InteractionBuffer(item);\n }\n throw new Error(`Object is not supported.`);\n }\n}\nexport class RenderableBuffers {\n static create(item, ...args) {\n return createRenderableBuffer(item, null, ...args);\n }\n static clearFlags(buffer, includeParent = false) {\n buffer.item.flags.splice(0);\n if (includeParent) {\n const bufferBase = buffer;\n if (!Utils.isNull(bufferBase.parent)) {\n RenderableBuffers.clearFlags(bufferBase.parent, true);\n }\n }\n }\n static allFlags(buffer) {\n const bufferBase = buffer;\n const parentBufferBase = bufferBase.parent;\n const parentFlags = Utils.isNull(parentBufferBase) ? [] : RenderableBuffers.allFlags(parentBufferBase);\n return bufferBase.item.flags.union(parentFlags);\n }\n}\nclass ManagedBufferBase {\n #item;\n constructor(item) {\n this.#item = item;\n }\n get item() {\n return this.#item;\n }\n #lock = false;\n lock() {\n this.#lock = true;\n }\n unlock() {\n this.#lock = false;\n const garbage = this.#garbage;\n while (garbage.length > 0) {\n const obj = garbage.shift();\n this._destroyUnsafe(obj);\n }\n }\n #garbage = [];\n _destroyUnsafe(obj) {\n if ('texture' in obj) {\n obj.texture.destroy();\n }\n else if ('buffer' in obj) {\n obj.buffer.destroy();\n }\n }\n destroySafely(...objects) {\n for (let obj of Array.from(objects).concat(...this.#garbage.splice(0))) {\n if (!obj) {\n continue;\n }\n if (this.#lock) {\n this.#garbage.push(obj);\n }\n else {\n this._destroyUnsafe(obj);\n }\n }\n }\n #disposed = false;\n destroy() {\n this.dispose();\n this.#disposed = true;\n }\n get disposed() {\n return this.#disposed;\n }\n}\nclass RenderableBufferBase extends ManagedBufferBase {\n constructor(item, parentBuffer) {\n super(item);\n this.#parent = parentBuffer;\n this.#u32id = Utils.uniqueId() % U32_MAX;\n }\n #u32id;\n #parent;\n #u32idBuffer = new Map();\n get parent() {\n return this.#parent;\n }\n get id() {\n return this.#u32id;\n }\n allFlags() {\n const parent = this.parent;\n // TODO: this one line is a perf hog!\n return this.item.flags.union(parent?.allFlags() ?? []);\n }\n buildParentWorldTransform() {\n let worldMatrix = Matrix3D.identity();\n let step = this;\n while (!Utils.isNull(step.parent)) {\n const parentItem = step.parent.item;\n const parentItemMatrix = Matrix3D.translate(parentItem.transformMatrix ?? Matrix3D.identity(), parentItem.position ?? Vector3D.zero());\n worldMatrix = Matrix3D.multiply(worldMatrix, parentItemMatrix);\n step = step.parent;\n }\n return worldMatrix;\n }\n buildWorldTransform() {\n const itemMatrix = Matrix3D.translate(this.item.transformMatrix ?? Matrix3D.identity(), this.item.position ?? Vector3D.zero());\n const parentWorldMatrix = this.buildParentWorldTransform();\n return Matrix3D.multiply(itemMatrix, parentWorldMatrix);\n }\n #versions = new Map();\n version(key) {\n return this.#versions.get(key) ?? 0;\n }\n buffer(context, key) {\n if (key === 'u32id') {\n const u32idBuffer = this.#u32idBuffer;\n const { pipeline, device } = context;\n if (u32idBuffer.has(pipeline)) {\n return Utils.extend({ fresh: false }, u32idBuffer.get(pipeline));\n }\n const u32idBufferValue = new Uint32Array([this.id]);\n const u32idBufferBuffer = Buffers.createUniform(device, u32idBufferValue, LABEL_PREFIX + 'u32id-buffer');\n const retval = Utils.extend({ buffer: u32idBufferBuffer, value: u32idBufferValue, version: performance.now() }, { fresh: true });\n this.#u32idBuffer.set(pipeline, retval);\n return retval;\n }\n const retval = this.specificBuffer(context, key);\n this.#versions.set(key, retval.version);\n return retval;\n }\n}\nconst DefaultMaterial = { shader: KnownShader.Basic, color: '#c0c0c0', flags: [] };\n// #region GROUP\nclass RenderableGroupBuffer extends RenderableBufferBase {\n #children;\n constructor(group, parent, ...args) {\n super(group, parent);\n this.#children = group.childRenderables.map(i => createRenderableBuffer(i, this, ...args));\n }\n get children() {\n return this.#children;\n }\n specificBuffer(ctx, key) {\n return null;\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n dispose() {\n this.#children.forEach(i => i.destroy());\n //this.#children = null;\n }\n}\n// #endregion\n// #region CAMERA\nclass RenderableCameraBuffer extends RenderableBufferBase {\n #viewBag = new Map();\n #view;\n constructor(camera) {\n super(camera);\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n //const camera = this.item;\n let fresh = false;\n if (this.allFlags().length > 0 || Utils.isNull(this.#view)) {\n fresh = true;\n this.#viewBag.clear();\n this._rebuildMatrices(context);\n }\n const { pipeline } = context;\n if (!this.#viewBag.has(pipeline)) {\n fresh = true;\n this.#viewBag.set(pipeline, this.#view);\n }\n RenderableBuffers.clearFlags(this);\n switch (key) {\n case 'cameraViewTransform':\n return Utils.extend(this.#view, { fresh });\n default:\n throwBufferRequestError(key, RenderableCameraBuffer);\n }\n }\n _rebuildMatrices({ device, canvas }) {\n // this._destroyView();\n const cam = this.item;\n const camera = Cameras.create(cam);\n const { x, y, z } = cam.position;\n const view = camera.view();\n const projection = camera.projection(canvas);\n const viewProjection = Matrix3D.multiply(view, projection);\n const viewValue = new Float32Array(16 + 16 + 4);\n viewValue.set(Matrix3D.toArray(view), 0);\n viewValue.set(Matrix3D.toArray(viewProjection), 16);\n viewValue.set([x, y, z], 32);\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#view)) {\n const viewBuffer = Buffers.createUniform(device, viewValue, LABEL_PREFIX + 'view-buffer');\n this.#view = { buffer: viewBuffer, value: viewValue, version: performance.now().roundoff() };\n }\n else {\n this.#view.value = viewValue;\n this.#view.version = performance.now().roundoff();\n }\n }\n _destroyView() {\n this.#viewBag.clear();\n const view = this.#view;\n this.#view = null;\n this.destroySafely(view);\n }\n dispose() {\n this._destroyView();\n }\n}\n// #endregion\n// #region GEOMETRY\nclass GeometryBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #freshness = { positions: true, normals: true, uv: true, packed: true };\n #geometryBuffers;\n constructor(geometry) {\n super(geometry);\n geometry.flags ??= [];\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n if (Utils.isNull(this.#geometryBuffers) || flags.includes(StalePropertyFlag.Geometry)) {\n flags.splice(0);\n this.#bufferBag = /* reset */ {};\n this._rebuildGeometryBuffers(context);\n }\n const freshness = this.#freshness;\n const geom = this.#geometryBuffers;\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n const newInPipeline = !bag.has(pipeline);\n const ensureInBag = (buffer) => {\n if (newInPipeline) {\n bag.set(pipeline, buffer);\n }\n return buffer;\n };\n switch (key) {\n case 'geometryPositions':\n const { positions } = geom, posFresh = freshness.positions;\n freshness.positions = false;\n return Utils.extend(ensureInBag(positions), { fresh: posFresh || newInPipeline });\n case 'geometryNormals':\n const { normals } = geom, normFresh = freshness.normals;\n freshness.normals = false;\n return Utils.extend(ensureInBag(normals), { fresh: normFresh || newInPipeline });\n case 'geometryTexCoords':\n const { uv } = geom, uvFresh = freshness.uv;\n freshness.uv = false;\n return Utils.extend({ fresh: uvFresh || newInPipeline }, ensureInBag(uv));\n case 'geometry':\n // alltogether\n const { packed } = geom, geomFresh = freshness.packed;\n freshness.packed = false;\n return Utils.extend(ensureInBag(packed), { fresh: geomFresh || newInPipeline });\n default:\n throwBufferRequestError(key, GeometryBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _rebuildGeometryBuffers({ device }) {\n this._destroyBuffers();\n const version = performance.now();\n const geometry = this.item, key = geometry.key;\n if (isMeshGeometry(geometry)) {\n const meshGeometry = geometry;\n // flatten positions...\n const hasTriangleIndices = !Utils.isNullOrEmpty(meshGeometry.triangleIndices);\n const flatPositions = hasTriangleIndices ?\n meshGeometry.triangleIndices.map(index => meshGeometry.positions[index])\n : meshGeometry.positions;\n const length2 = flatPositions.length * 2, length3 = length2 + flatPositions.length;\n const positionsValue = new Float32Array(length3);\n const normalsValue = new Float32Array(length3);\n const uvValue = new Float32Array(length2);\n const geomValue = new Float32Array(2 * length3 + length2);\n for (let j = 0; j < flatPositions.length; j++) {\n const offset2 = 2 * j;\n const offset3 = 3 * j;\n const { x, y, z } = flatPositions[j];\n const { x: nx, y: ny, z: nz } = meshGeometry.normals[j];\n const { x: u, y: v } = meshGeometry.textureCoordinates[j];\n positionsValue.set([x, y, z], offset3);\n normalsValue.set([nx, ny, nz], offset3);\n uvValue.set([u, v], offset2);\n geomValue.set([x, y, z, nx, ny, nz, u, v], offset3 * 2 + offset2);\n }\n const positions = Buffers.create(device, positionsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-positions-buffer');\n const normals = Buffers.create(device, normalsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-normals-buffer');\n const uv = Buffers.create(device, uvValue, LABEL_PREFIX + 'meshgeometry-' + key + '-uvmap-buffer');\n const geom = Buffers.create(device, geomValue, LABEL_PREFIX + 'meshgeometry-' + key + '-buffer');\n this.#geometryBuffers = {\n packed: { buffer: geom, value: geomValue, version },\n positions: { buffer: positions, value: positionsValue, version },\n normals: { buffer: normals, value: normalsValue, version },\n uv: { buffer: uv, value: uvValue, version },\n };\n this.#freshness = { positions: true, normals: true, uv: true, packed: true };\n }\n else {\n const positionsValue = new Float32Array(AdapterUtils.flattenVectorArray(geometry.positions));\n const positions = Buffers.createStorage(device, positionsValue, LABEL_PREFIX + 'nodegeometry-' + key + '-positions-buffer');\n this.#geometryBuffers = {\n positions: { buffer: positions, value: positionsValue, version },\n packed: { buffer: positions, value: positionsValue, version }\n };\n this.#freshness = { positions: true, packed: true };\n }\n }\n _destroyBuffers() {\n this.#bufferBag = {};\n const obsolete = this.#geometryBuffers;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete.positions, obsolete.normals, obsolete.uv);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MATERIAL\nclass MaterialBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #textureBag = {};\n #wgpuMaterial;\n #buffers = new Map();\n #textures = new Map();\n constructor(material) {\n super(material);\n material.flags ??= [];\n if (material.flags.indexOf(StalePropertyFlag.Material) === -1) {\n material.flags.push(StalePropertyFlag.Material);\n }\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n let fresh = Utils.isNull(this.#wgpuMaterial);\n if (flags.includes(StalePropertyFlag.Material)) {\n this.#bufferBag = /* reset */ {};\n flags.splice(0);\n fresh = true;\n this.#textures.clear();\n this._resetMaterialBuffers();\n }\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n switch (key) {\n case 'material':\n case 'line':\n const buffer = this._ensureMaterialBuffer(context, key);\n if (buffer) {\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, buffer);\n }\n return Utils.extend(buffer, { fresh });\n }\n return null;\n default:\n throwBufferRequestError(key, MaterialBuffer);\n }\n }\n _ensureMaterialBuffer(ctx, key = 'material') {\n const set = this.#buffers;\n let retval = set.get(key);\n if (retval) {\n return retval;\n }\n if (set.has(key)) {\n return null;\n }\n retval = this.#wgpuMaterial?.buffer(ctx, key);\n if (retval) {\n set.set(key, retval);\n }\n return retval;\n }\n _resetMaterialBuffers() {\n this.#wgpuMaterial = Materials.create(this.item);\n this._destroyBuffers();\n }\n texture(ctx, key = 'texture') {\n const set = this.#textures;\n let retval = set.get(key), fresh = false;\n if (!retval) {\n retval = this.#wgpuMaterial?.texture(ctx, key);\n if (!retval) {\n return null;\n }\n set.set(key, retval);\n fresh = true;\n //\n this.#textureBag = /* reset */ {};\n }\n const { pipeline } = ctx;\n const bag = (this.#textureBag[key] ??= new Map());\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, retval);\n }\n return Utils.extend(retval, { fresh });\n }\n dispose() {\n this._destroyBuffers();\n }\n _destroyBuffers() {\n // memoizers\n this.#bufferBag = {};\n this.#textureBag = {};\n // buffers\n const buffers = this.#buffers.values();\n this.#buffers.clear(); // clear before destroying\n this.destroySafely(...buffers);\n // textures\n const textures = this.#textures.values();\n this.#textures.clear(); // clear before destroying\n textures.forEach(t => t.texture.destroy());\n }\n}\n// #endregion\n// #region INTERACTION\nclass InteractionBuffer extends ManagedBufferBase {\n #fields = {\n time: 0, cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n };\n #buffer;\n #bufferBag = new Map();\n constructor(data) {\n super(data);\n Utils.extend(this.#fields, data);\n }\n buffer(context, key) {\n switch (key) {\n // altogether\n case 'interaction':\n return this._ensureInteractionBuffer(context);\n default:\n throwBufferRequestError(key, InteractionBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _ensureInteractionBuffer(ctx, key = 'interaction') {\n const fields = this.#fields, item = this.item;\n let fresh = (!this.#buffer\n || item.time !== fields.time\n || item.resolution?.width !== fields.resolution.width\n || item.resolution?.height !== fields.resolution.height);\n if (!fresh && !Utils.isNull(item.cursor)) {\n fresh = item.cursor.x !== fields.cursor.x\n || item.cursor.y !== fields.cursor.y;\n }\n if (fresh) {\n // [4bytes cursor.x, 4bytes cursor.y, 4bytes resolution.width, 4bytes resolution.height, 4bytes time] = 20 bytes total]\n const value = new Float32Array([item.cursor?.x ?? 0, item.cursor?.y ?? 0, item.resolution.width, item.resolution.height, item.time, /* padding */ .0]);\n const buffer = Buffers.createUniform(ctx.device, value, LABEL_PREFIX + 'interaction-buffer');\n this.#buffer = { buffer, value, version: performance.now() };\n this.#bufferBag.clear();\n }\n const { pipeline } = ctx;\n const bag = this.#bufferBag;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n return Utils.extend(this.#buffer, { fresh });\n }\n _destroyBuffers() {\n // memoizer\n this.#bufferBag.clear();\n // buffer itself\n const obsolete = this.#buffer;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MESH\nclass RenderableMeshBuffer extends RenderableBufferBase {\n #geometryBuffers;\n #geometryBuffer;\n #materialBuffers;\n #materialBuffer;\n #worldTransform;\n #freshness = {\n geometry: true, material: true, transform: true\n };\n #worldTransformBufferBag = new Map();\n constructor(mesh, parent, geometries, materials) {\n super(mesh, parent);\n mesh.flags ??= [];\n if (mesh.flags.indexOf(StalePropertyFlag.Geometry) === -1) {\n mesh.flags.push(StalePropertyFlag.Geometry);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Material) === -1) {\n mesh.flags.push(StalePropertyFlag.Material);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Position) === -1 && mesh.flags.indexOf(StalePropertyFlag.Transform) === -1) {\n mesh.flags.push(StalePropertyFlag.Transform);\n }\n this.#geometryBuffers = geometries;\n this.#materialBuffers = materials;\n }\n texture(ctx, key) {\n const material = this.#materialBuffer;\n return material?.texture(ctx, key);\n }\n specificBuffer(context, key) {\n const freshness = this.#freshness;\n const flags = this.allFlags();\n if (Utils.isNull(this.#worldTransform) || flags.includes(StalePropertyFlag.Position) || flags.includes(StalePropertyFlag.Transform)) {\n this.#worldTransformBufferBag.clear();\n // world transform bind group buffer\n freshness.transform = true;\n this._rebuildWorldMatrices(context);\n }\n if (Utils.isNull(this.#geometryBuffer) || flags.includes(StalePropertyFlag.Geometry)) {\n // vertex buffers\n freshness.geometry = true;\n this._ensureGeometryBuffer();\n }\n if (Utils.isNull(this.#materialBuffer) || flags.includes(StalePropertyFlag.Material)) {\n freshness.material = true;\n this._ensureMaterialBuffer();\n }\n RenderableBuffers.clearFlags(this);\n const geom = this.#geometryBuffer;\n const mater = this.#materialBuffer;\n switch (key) {\n case 'geometryPositions':\n case 'geometryNormals':\n case 'geometryTexCoords':\n case 'geometry':\n return geom.buffer(context, key);\n case 'material':\n case 'line':\n return mater.buffer(context, key);\n case 'objectWorldTransform':\n const mat = this.#worldTransform, wFresh = freshness.transform;\n freshness.transform = false;\n const bag = this.#worldTransformBufferBag, { pipeline } = context;\n const newInPipeline = !bag.has(pipeline);\n if (newInPipeline) {\n bag.set(pipeline, mat);\n }\n return Utils.extend(mat, { fresh: wFresh || newInPipeline });\n default:\n throwBufferRequestError(key, RenderableMeshBuffer);\n }\n }\n _ensureGeometryBuffer() {\n const current = this.#geometryBuffer;\n const cache = this.#geometryBuffers;\n const mesh = this.item;\n const geom = mesh.geometry;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#geometryBuffer = new GeometryBuffer(geom);\n }\n else {\n let buffer = cache?.get(geom);\n if (buffer?.disposed !== false) {\n buffer = new GeometryBuffer(geom);\n cache.set(geom, buffer);\n }\n this.#geometryBuffer = buffer;\n }\n }\n _ensureMaterialBuffer() {\n const current = this.#materialBuffer;\n const cache = this.#materialBuffers;\n const mesh = this.item;\n const material = mesh.material ?? DefaultMaterial;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#materialBuffer = new MaterialBuffer(material);\n }\n else {\n let buffer = cache?.get(material);\n if (buffer?.disposed !== false) {\n buffer = new MaterialBuffer(material);\n cache.set(material, buffer);\n }\n this.#materialBuffer = buffer;\n }\n }\n _rebuildWorldMatrices({ device }) {\n //this.destroySafely(this.#worldTransform);\n const item = this.item;\n const matrix = this.buildWorldTransform();\n const normal = Matrix3D.transpose(Matrix3D.invert(matrix));\n const value = new Float32Array(28);\n value.set(Matrix3D.toArray(matrix), 0);\n value.set([normal.m11, normal.m12, normal.m13, 0, normal.m21, normal.m22, normal.m23, 0, normal.m31, normal.m32, normal.m33, 0], 16);\n //const current = this.#worldTransform;\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#worldTransform)) {\n const buffer = Buffers.createUniform(device, value, LABEL_PREFIX + 'mesh-' + item.key + '-worldmatrix-buffer');\n this.#worldTransform = { buffer, value, version: performance.now().roundoff() };\n }\n else {\n this.#worldTransform.value = value;\n this.#worldTransform.version = performance.now().roundoff();\n }\n //if (!Utils.isNull(current)) {\n // this.destroySafely(current);\n //}\n }\n dispose() {\n // memoizer\n this.#worldTransformBufferBag.clear();\n const world = this.#worldTransform;\n this.#worldTransform = null;\n this.destroySafely(world);\n const material = this.#materialBuffer;\n this.#materialBuffer = null;\n material?.destroy();\n const geometry = this.#geometryBuffer;\n this.#geometryBuffer = null;\n geometry?.destroy();\n }\n}\n// #endregion\n// #region LIGHTS\nclass RenderableLightBuffer extends RenderableBufferBase {\n #buffer;\n #bufferBag = new Map();\n constructor(light) {\n super(light);\n light.flags.push(StalePropertyFlag.Light);\n }\n /**\n * Ambient light buffer building\n * @param param0\n */\n _rebuildAmbientLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szColor = 4, szIntensity = 1, offsetColor = 0, offsetIntensity = 4;\n const szTotal = 24; // offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'ambient-light-buffer'), version: performance.now() };\n }\n /**\n * Directional light buffer building\n * @param param0\n */\n _rebuildDirectionalLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szDirection = 3, offsetColor = 0, offsetDirection = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // direction\n const direction = Vector3D.subtract(light.position, light.target);\n values.set([direction.x, direction.y, direction.z], offsetDirection);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'directional-light-buffer'), version: performance.now() };\n }\n /**\n * Omni light buffer building\n * @param param0\n */\n _rebuildOmniLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szPosition = 3, offsetColor = 0, offsetPosition = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // position\n values.set([light.position.x, light.position.y, light.position.z], offsetPosition);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'omni-light-buffer'), version: performance.now() };\n }\n _rebuildLight(context) {\n this.destroySafely(this.#buffer);\n const light = this.item;\n switch (light.type) {\n case 'direction':\n this._rebuildDirectionalLightBuffer(context);\n break;\n case 'omni':\n this._rebuildOmniLightBuffer(context);\n break;\n case 'ambient':\n this._rebuildAmbientLightBuffer(context);\n break;\n default:\n throw new Error(`Light '${light.type}' is not supported.`);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n const bag = this.#bufferBag;\n let fresh = Utils.isNull(this.#buffer) || this.allFlags().length > 0;\n if (fresh) {\n bag.clear();\n this._rebuildLight(context);\n }\n RenderableBuffers.clearFlags(this);\n const { pipeline } = context;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n if (key === 'light') {\n return Utils.extend(this.#buffer, { fresh });\n }\n throwBufferRequestError(key, RenderableLightBuffer);\n }\n dispose() {\n this.#bufferBag.clear();\n const buffer = this.#buffer;\n this.#buffer = null;\n this.destroySafely(buffer);\n }\n}\n// #endregion\n", "import { Geometry } from '@pacem/pacem-numerical';\nimport { isPerspectiveCamera, isOrthographicCamera } from '../../types';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst DEFAULT_SIZE = { width: 1, height: 1 };\nexport class Cameras {\n /**\n * Creates a new webgpu {@link Camera} given a canonic one.\n * @param camera\n * @returns\n */\n static create(camera) {\n if (isPerspectiveCamera(camera)) {\n return new PerspectiveCamera(camera);\n }\n if (isOrthographicCamera(camera)) {\n return new OrthographicCamera(camera);\n }\n throw new TypeError(`Camera type '${camera['type']}' not supported.`);\n }\n}\n/**\n * Camera orientation 4x4 matrix.\n * @param eye\n * @param target\n * @param up\n * @returns\n */\nfunction view(eye, target, up) {\n const z = /* inverse forward is eye -> target */ Vector3D.subtract(target, eye);\n const x = Vector3D.cross(up, z);\n const y = Vector3D.cross(z, x);\n Vector3D.normalize(x);\n Vector3D.normalize(z);\n Vector3D.normalize(y);\n const offsetX = -Vector3D.dot(x, eye);\n const offsetY = -Vector3D.dot(y, eye);\n const offsetZ = -Vector3D.dot(z, eye);\n return Matrix3D.from(x.x, y.x, z.x, 0, x.y, y.y, z.y, 0, x.z, y.z, z.z, 0, offsetX, offsetY, offsetZ, 1);\n}\nfunction assertNearFarCorrectness(near, far) {\n if (near <= 0) {\n throw new RangeError(\"Near plane distance must be positive.\");\n }\n if (far <= near) {\n throw new RangeError(\"Far plane distance must be greater than near plane distance.\");\n }\n}\n/**\n * Perspective transformation 4x4 matrix.\n * @param fovY Vertical field of view (in radians)\n * @param aspectRatio Frustum aspect ratio\n * @param near Clipping plane near distance (not z coordinate)\n * @param far Clipping plane far distance (not z coordinate)\n * @returns\n */\nfunction perspective(fovY = 120, aspectRatio = 1, near = 0.1, far = 1000) {\n assertNearFarCorrectness(near, far);\n const scale = Math.tan(.5 * Math.PI * (1 - fovY / 180));\n const m11 = scale / aspectRatio;\n const finitelyFar = Number.isFinite(far);\n const m33 = finitelyFar ? (far / (near - far)) : -1;\n const offsetZ = finitelyFar ? (far * near / (near - far)) : -near;\n return Matrix3D.from(m11, 0, 0, 0, 0, scale, 0, 0, 0, 0, m33, -1, 0, 0, offsetZ, 0);\n}\n/**\n * Othographic transformation 4x4 matrix.\n * @param left Viewport's left side\n * @param right Viewport's right side\n * @param top Viewport's top side\n * @param bottom Viewport's bottom side\n * @param near Clipping plane near distance\n * @param far Clipping plane far distance\n */\nfunction orthographic(left, right, top, bottom, near = .1, far = 1000) {\n assertNearFarCorrectness(near, far);\n return Matrix3D.from(2 / (right - left), 0, 0, 0, 0, 2 / (top - bottom), 0, 0, 0, 0, 1 / (near - far), 0, (left + right) / (left - right), (top + bottom) / (bottom - top), near / (near - far), 1);\n}\nexport class OrthographicCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const eye = camera.position, target = camera.lookAt;\n const z = Vector3D.subtract(target, eye);\n Vector3D.normalize(z);\n const zoom = Vector3D.dot(z, eye);\n const { height, width } = size;\n const ratio = width / height;\n const factor = .5 * zoom;\n const w = factor * ratio, h = factor;\n const top = camera.top * h, bottom = camera.bottom * h;\n const right = camera.right * w, left = camera.left * w;\n return orthographic(left, right, top, bottom, camera.near, camera.far);\n }\n view() {\n return OrthographicCamera.view(this._camera);\n }\n projection(size) {\n return OrthographicCamera.projection(this._camera, size);\n }\n}\nexport class PerspectiveCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const aspectRatio = (size.width / size.height) / camera.aspectRatio;\n return perspective(camera.fov, aspectRatio, camera.near, camera.far);\n }\n view() {\n return PerspectiveCamera.view(this._camera);\n }\n projection(size) {\n return PerspectiveCamera.projection(this._camera, size);\n }\n}\n", "import { Utils } from '@pacem/pacem-core';\nimport { LABEL_PREFIX, GPUTextureUsage, GPUBufferUsage, GPUMapMode } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Raycasters {\n // learn from:\n // https://webglfundamentals.org/webgl/lessons/webgl-qna-how-to-get-the-3d-coordinates-of-a-mouse-click.html\n // https://github.com/mrdoob/three.js/blob/master/src/core/Raycaster.js\n // https://shi-yan.github.io/webgpuunleashed/Control/object_picking.html\n // https://gist.github.com/greggman/57c3c0d3cf1db14f1baad2d9b0094397 (color picking)\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n if (memoizer.has(ctx)) {\n const cache = memoizer.get(ctx);\n for (let raycaster of cache.values()) {\n raycaster.destroy();\n }\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n /** Creates a raycaster that uses color picking as a strategy to hit-test objects. */\n static createColorPicking(ctx) {\n const memoizer = this._memoizer;\n if (!memoizer.has(ctx)) {\n memoizer.set(ctx, new Map());\n }\n const cache = memoizer.get(ctx);\n const key = 'colorpick';\n if (cache.has(key)) {\n return cache.get(key);\n }\n const retval = new ColorPickingRaycaster(ctx);\n cache.set(key, retval);\n return retval;\n }\n}\nconst NUM_PIXELS = 1;\nclass ColorPickingRaycaster {\n constructor(_context) {\n this._context = _context;\n this._objects = new Map();\n this.frame = (interaction, ...buffers) => {\n if (Utils.isNull(this._encoder)) {\n throw new Error('Null encoder. Maybe you missed to call the \\'begin\\' method first.');\n }\n const objects = Array.from(buffers);\n const pipeline = RenderPipelines.createColorPicking(this._context, objects);\n pipeline?.frame(this._pass, interaction, ...buffers);\n for (let buffer of objects) {\n const item = buffer.item;\n if (item.inert) {\n continue;\n }\n //buffer.lock();\n this._objects.set(buffer.id, buffer);\n }\n };\n this.end = (pixel) => {\n if (!Utils.isNull(this._handle)) {\n return this._handle;\n }\n const pass = this._pass;\n const commandEncoder = this._encoder;\n const { device } = this._context;\n const { render } = this._textures;\n const pickTexture = render.texture;\n const pickBuffer = this._ensureBuffer();\n pass.end();\n commandEncoder.copyTextureToBuffer({\n texture: pickTexture,\n // mipLevel: 0,\n origin: {\n x: pixel.x,\n y: pixel.y,\n }\n }, {\n buffer: pickBuffer,\n bytesPerRow: ((NUM_PIXELS * 4 + 255) | 0) * 256,\n rowsPerImage: 1,\n }, {\n width: NUM_PIXELS,\n // height: 1,\n // depth: 1,\n });\n device.queue.submit([commandEncoder.finish()]);\n // remove\n this._encoder = null;\n const _this = this;\n const objects = _this._objects;\n const resetHandle = () => {\n _this._handle = null;\n };\n return this._handle = new Promise((resolve, _) => {\n pickBuffer.mapAsync(GPUMapMode.READ, 0, 4 * NUM_PIXELS).then(_ => {\n const ids = new Uint32Array(pickBuffer.getMappedRange(0, 4 * NUM_PIXELS));\n const id = ids[0];\n pickBuffer.unmap();\n // remove promise reference\n resetHandle();\n const buffer = objects.get(id);\n if (!buffer) {\n resolve([]);\n }\n else {\n resolve([buffer.item]);\n }\n // cleanup\n //pickBuffer.destroy();\n //pickTexture.destroy();\n //objects.values().forEach(b => b.unlock());\n });\n });\n };\n }\n _createTexture(format) {\n const { device, canvas } = this._context;\n const width = Math.min(device.limits.maxTextureDimension2D, canvas.clientWidth), height = Math.min(device.limits.maxTextureDimension2D, canvas.clientHeight);\n return device.createTexture({\n size: [width, height, 1],\n format,\n usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT\n });\n }\n _ensureBuffer() {\n const buffer = this._buffer;\n if (!Utils.isNull(buffer)) {\n return buffer;\n }\n const { device } = this._context;\n return this._buffer = device.createBuffer({\n label: LABEL_PREFIX + 'colorpick-output-buffer',\n size: NUM_PIXELS * 4,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n }\n _ensureTextures() {\n const textures = this._textures;\n if (!Utils.isNull(textures)) {\n return textures;\n }\n const renderTex = this._createTexture('r32uint'), depthTex = this._createTexture('depth24plus');\n const render = { texture: renderTex, view: renderTex.createView() };\n const depth = { texture: depthTex, view: depthTex.createView() };\n return this._textures = { render, depth };\n }\n ;\n _destroyTexture(texture) {\n if (Utils.isNull(texture)) {\n return;\n }\n texture.texture?.destroy();\n }\n destroy() {\n const textures = this._textures, buffer = this._buffer;\n if (!Utils.isNullOrEmpty(textures)) {\n const { render, depth } = textures;\n this._destroyTexture(render);\n this._destroyTexture(depth);\n this._textures = null;\n }\n if (!Utils.isNull(buffer)) {\n buffer.destroy();\n this._buffer = null;\n }\n }\n begin() {\n const { device } = this._context;\n this._encoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'colorpick-raycaster' });\n const { render, depth } = this._ensureTextures();\n const passDescriptor = {\n label: LABEL_PREFIX + 'colorpick-raycaster-pass',\n colorAttachments: [\n {\n view: render.view,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n depthStencilAttachment: {\n view: depth.view, // Assigned later\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n };\n this._pass = this._encoder.beginRenderPass(passDescriptor);\n this._objects.clear();\n }\n}\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomEventUtils, avoidHandler, Behaviors, PropertyChangeEventName } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { isCamera, StalePropertyFlag } from '../../../types';\nimport { TAG_MIDDLE_NAME } from '../../../constants';\nimport { BooleanOrNumberConverter } from '../../../converters';\n//namespace Pacem.Components.Drawing3D {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst Quaternion = Geometry.LinearAlgebra.Quaternion;\nconst Spherical = Geometry.LinearAlgebra.Spherical;\nfunction findCameraStage(element) {\n if (isCamera(element)) {\n return element.stage;\n }\n return null;\n}\nconst ROTATION_FACTOR = 1, ZOOM_FACTOR = 1, FRICTION_FACTOR = .05, EPSILON = 0.001;\nconst DEFAULT_CONFIGURATION = {\n maxAzimuth: 180, minAzimuth: -180, inertia: false, maxPolar: Infinity, minPolar: -Infinity,\n zoom: { enabled: true }, pan: { enabled: true, button: 2 }, rotation: { enabled: true, button: 0 }\n};\nexport class OrbitCameraBehavior {\n constructor(item, _config) {\n this._config = _config;\n /** State of the current configuration, obtained from the interaction inputs. */\n this._input = {\n /** Zoom/scale */\n rho: 0,\n /** Azimuth (rotation around x axis in webgpu) */\n theta: 0,\n /** Polar (rotation around y axis in webgpu) */\n phi: 0,\n /** pan/offset x*/\n x: 0,\n /** pan/offset y*/\n y: 0,\n };\n /** Sibling state of {@link _input} that comes helpful when inertia is involved. */\n this._progress = {\n rho: 0,\n theta: 0,\n phi: 0,\n x: 0,\n y: 0,\n };\n this._startHandler = (evt) => {\n const { rotation, pan } = this._config;\n const isMouse = evt.pointerType === 'mouse';\n const rotating = rotation.enabled && isMouse && evt.button === rotation.button && CustomEventUtils.matchModifiers(evt, rotation.modifiers);\n const panning = pan.enabled && isMouse && evt.button === pan.button && CustomEventUtils.matchModifiers(evt, pan.modifiers);\n if (!rotating && !panning) {\n return;\n }\n this.#rotating = rotating;\n if (this.#panning = panning) {\n // build current state from the current camera configuration\n this._currentState = OrbitCameraBehavior._buildState(this._camera);\n // reset pan offsets\n Utils.extend(this._input, Vector3D.zero());\n this._progress.x = this._progress.y = 0;\n }\n avoidHandler(evt);\n window.addEventListener('pointerup', this._endHandler, false);\n window.addEventListener('pointermove', this._moveHandler, false);\n window.addEventListener('contextmenu', this._avoidHandler, false);\n };\n this._avoidHandler = (evt) => avoidHandler(evt);\n this._endHandler = (evt) => {\n avoidHandler(evt);\n // delay the listener removals a bit (~frame)\n window.setTimeout(() => {\n window.removeEventListener('pointerup', this._endHandler);\n window.removeEventListener('pointermove', this._moveHandler);\n window.removeEventListener('contextmenu', this._avoidHandler);\n }, 20);\n };\n this._zoomHandler = (evt) => {\n const { zoom } = this._config;\n const zooming = zoom.enabled && CustomEventUtils.matchModifiers(evt, zoom.modifiers);\n if (!zooming) {\n return;\n }\n avoidHandler(evt);\n const coords = this._input;\n coords.rho -= Math.sign(evt.deltaY);\n };\n this._moveHandler = (evt) => {\n avoidHandler(evt);\n const { height, width } = this._scene.size;\n const coords = this._input;\n const size = Math.min(height, width);\n if (this.#rotating) {\n // rotation\n const f0 = -ROTATION_FACTOR * 360 / size;\n const { phi, theta } = coords;\n const { maxPolar, minPolar, maxAzimuth, minAzimuth } = this._config;\n coords.phi = (phi + evt.movementX * f0).clamp(minPolar, maxPolar);\n coords.theta = (theta + evt.movementY * f0).clamp(minAzimuth, maxAzimuth);\n }\n else if (this.#panning) {\n // pan\n const f0 = this._currentState.radius / size;\n coords.x += -evt.movementX * f0;\n coords.y += evt.movementY * f0;\n }\n };\n this._renderHandler = (_) => {\n this._update();\n };\n const scene = this._scene = (this._camera = item).stage;\n this._initialState = this._currentState = OrbitCameraBehavior._buildState(item);\n const canvas = this._canvas = scene.stage;\n canvas.addEventListener('pointerdown', this._startHandler, false);\n canvas.addEventListener('wheel', this._zoomHandler, { passive: false });\n scene.addEventListener('render', this._renderHandler, false);\n }\n static _buildState(camera) {\n const vector = Vector3D.subtract(camera.position, camera.lookAt);\n const radius = Vector3D.mag(vector);\n return { target: camera.lookAt, versor: Vector3D.unit(vector), up: camera.up, radius, position: camera.position };\n }\n /**\n * Tries to attach a new {@link OrbitCameraBehavior} to the provided element, if the element is a proper renderable and it is ready.\n * @param element\n * @returns\n */\n static tryAttach(element, config) {\n config ??= DEFAULT_CONFIGURATION;\n const canvas = findCameraStage(element)?.stage;\n if (!Utils.isNull(canvas)) {\n const { position, lookAt } = element;\n if (Utils.isNull(position) || Utils.isNull(lookAt) || Vector3D.areClose(position, lookAt)) {\n return null;\n }\n return new OrbitCameraBehavior(element, config);\n }\n else {\n return null;\n }\n }\n get configuration() {\n return this._config;\n }\n set configuration(v) {\n this._config = v;\n }\n #panning;\n #rotating;\n _getSafeAzimuth({ theta }) {\n return OrbitCameraBehavior._modAngle(theta);\n }\n _getSafePolar({ phi }) {\n return OrbitCameraBehavior._modAngle(phi);\n }\n static _modAngle(deg) {\n while (deg < 0) {\n deg += 360;\n }\n return deg % 360;\n }\n static _getViewXYZ(state) {\n const { versor, up: initUp } = state;\n const right = Vector3D.cross(versor, initUp);\n const up = Vector3D.cross(right, versor);\n Vector3D.normalize(right);\n Vector3D.normalize(up);\n return { right, up, versor };\n }\n #updating;\n _update() {\n if (this.#updating) {\n return;\n }\n this.#updating = true;\n const camera = this._camera;\n const { radius, versor, target: initTarget, up: initUp } = this._initialState;\n const { target: trackedLookAt } = this._currentState;\n const { theta, phi, rho, x, y } = this._input;\n const progress = this._progress;\n const { theta: theta_, phi: phi_, rho: rho_, x: x_, y: y_ } = progress;\n const rotated = Math.abs(phi_ - phi) > EPSILON || Math.abs(theta_ - theta) > EPSILON, zoomed = Math.abs(rho_ - rho) > EPSILON, panned = Math.abs(x - x_) > EPSILON || Math.abs(y - y_) > EPSILON;\n if (zoomed || rotated || panned) {\n const inertia = typeof this._config.inertia === 'boolean' ? (this._config.inertia ? FRICTION_FACTOR : 0) : this._config.inertia;\n const inertiaSpecified = inertia > 0 && inertia < 1;\n const { right, up } = OrbitCameraBehavior._getViewXYZ(this._initialState);\n // setup position\n let newPosition = initTarget;\n let newUp = initUp;\n let newLookAt = trackedLookAt;\n //if (zoomed) { 2\n let rho0 = rho_;\n if (inertiaSpecified) {\n rho0 += (rho - rho_) * inertia;\n }\n else {\n rho0 = rho;\n }\n progress.rho = rho0;\n const scale = Math.pow(.95, rho0 * ZOOM_FACTOR);\n const zoom = Vector3D.scale(versor, -scale * radius);\n newPosition = Vector3D.add(newPosition, zoom);\n //}\n //if (rotated) { 3\n let phi0 = phi_;\n let theta0 = theta_;\n if (inertiaSpecified) {\n phi0 += (phi - phi_) * inertia;\n theta0 += (theta - theta_) * inertia;\n }\n else {\n phi0 = phi;\n theta0 = theta;\n }\n const PHI = this._getSafePolar({ phi: progress.phi = phi0 });\n const THETA = this._getSafeAzimuth({ theta: progress.theta = theta0 });\n // pivot of the rotation matrix should be the center of the bounding sphere\n const pivot = Vector3D.negate(initTarget);\n let m = Matrix3D.translate(Matrix3D.identity(), pivot);\n const qy = Quaternion.fromAxisAngle(up, PHI);\n const qx = Quaternion.fromAxisAngle(right, THETA);\n const rot = Matrix3D.multiply(Quaternion.toRotationMatrix(qx), Quaternion.toRotationMatrix(qy));\n m = Matrix3D.multiply(m, rot);\n m = Matrix3D.translate(m, Vector3D.negate(pivot));\n newPosition = Matrix3D.transform(newPosition, m);\n newUp = Matrix3D.transform(newUp, Matrix3D.clone(m, m0 => { m0.offsetX = m0.offsetY = m0.offsetZ = 0; }));\n //}\n //if (panned){ 1\n const x1 = x_, y1 = y_;\n let x0 = x1, y0 = y1;\n if (inertiaSpecified) {\n x0 += (x - x1) * inertia;\n y0 += (y - y1) * inertia;\n }\n else {\n x0 = x;\n y0 = y;\n }\n progress.x = x0;\n progress.y = y0;\n const { right: currentRight, up: currentUp } = OrbitCameraBehavior._getViewXYZ(this._currentState);\n const r = Vector3D.scale(currentRight, x0), u = Vector3D.scale(currentUp, y0);\n const offset = Vector3D.add(r, u);\n newLookAt = Vector3D.add(trackedLookAt, offset);\n camera.lookAt = newLookAt;\n camera.position = newPosition; // Vector3D.add(newPosition, Vector3D.subtract(initTarget, newLookAt));\n camera.up = newUp;\n // notify something has changed about the target renderable\n camera.flags.push(StalePropertyFlag.Camera);\n }\n this.#updating = false;\n }\n /** Detaches and removes handlers and resources. */\n dispose() {\n const canvas = this._canvas, scene = this._scene;\n if (!Utils.isNull(canvas)) {\n canvas.removeEventListener('pointerdown', this._startHandler);\n canvas.removeEventListener('wheel', this._zoomHandler);\n }\n scene.removeEventListener('render', this._renderHandler, false);\n }\n}\nlet PacemOrbitCameraBehaviorElement = class PacemOrbitCameraBehaviorElement extends Behaviors.PacemBehavior {\n constructor() {\n super(...arguments);\n this.#map = new Map();\n this._readyHandler = (evt) => {\n if (evt.detail.propertyName === 'isReady' && evt.detail.currentValue === true) {\n const element = evt.currentTarget;\n element.removeEventListener(PropertyChangeEventName, this._readyHandler);\n this._decorateCore(element);\n }\n };\n }\n #map;\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'maxAzimuth':\n case 'minAzimuth':\n case 'inertia':\n case 'zoomControl':\n case 'panControl':\n case 'rotationControl':\n const config = this._buildConfig();\n const items = this.#map;\n for (let tr of items.values()) {\n tr.configuration = config;\n }\n break;\n }\n }\n disconnectedCallback() {\n const items = this.#map;\n for (let tr of items.values()) {\n tr.dispose();\n }\n items.clear();\n super.disconnectedCallback();\n }\n _buildConfig() {\n return Utils.extend({}, DEFAULT_CONFIGURATION, {\n maxAzimuth: this.maxAzimuth ?? Infinity,\n minAzimuth: this.minAzimuth ?? -Infinity,\n minPolar: this.minPolar ?? -Infinity,\n maxPolar: this.maxPolar ?? Infinity,\n inertia: this.inertia ?? false,\n zoom: this.zoomControl ?? DEFAULT_CONFIGURATION.zoom,\n pan: this.panControl ?? DEFAULT_CONFIGURATION.pan,\n rotation: this.rotationControl ?? DEFAULT_CONFIGURATION.rotation,\n });\n }\n _decorateCore(element) {\n const behavior = OrbitCameraBehavior.tryAttach(element, this._buildConfig());\n if (!Utils.isNull(behavior)) {\n this.#map.set(element, behavior);\n }\n }\n decorate(element) {\n if (element.isConnected) {\n this._decorateCore(element);\n }\n else {\n element.addEventListener(PropertyChangeEventName, this._readyHandler, false);\n }\n }\n undecorate(element) {\n const map = this.#map;\n if (map.has(element)) {\n map.get(element).dispose();\n map.delete(element);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"zoomControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"rotationControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"panControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: BooleanOrNumberConverter })\n], PacemOrbitCameraBehaviorElement.prototype, \"inertia\", void 0);\nPacemOrbitCameraBehaviorElement = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-orbit-camera' })\n], PacemOrbitCameraBehaviorElement);\nexport { PacemOrbitCameraBehaviorElement };\n", "export * from './types';\nexport * from './geometry';\nexport * from './decorators';\nexport * from './converters';\nexport * from './materials/material';\nexport * from './parsers/parser';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Transformer } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { MeshGeometry } from '../geometry';\nimport { Point3DConverter } from '../converters';\n//namespace Pacem.Drawing3D {\nclass OBJParser {\n static parse(content) {\n // vertices\n const vertices = [];\n const vParser = /^v((\\s+-?[\\d\\.]+){3})/gm;\n let arr = vParser.exec(content);\n while (arr && arr.length) {\n vertices.push(Point3DConverter.convert(arr[1]));\n arr = vParser.exec(content);\n }\n // uvmap\n const vt = [];\n const tParser = /^vt((\\s+-?[\\d\\.]+){2})/gm;\n arr = tParser.exec(content);\n while (arr && arr.length) {\n vt.push(Point.parse(arr[1]));\n arr = tParser.exec(content);\n }\n // normals\n const vn = [];\n const nParser = /^vn((\\s+-?[\\d\\.]+){3})/gm;\n arr = nParser.exec(content);\n while (arr && arr.length) {\n vn.push(Point3DConverter.convert(arr[1]));\n arr = nParser.exec(content);\n }\n const normals = [];\n const uv = [];\n const positions = [];\n const fParser = /^f((\\s+([\\d]+\\/[\\d]+\\/[\\d]+)){3,})/gm;\n arr = fParser.exec(content);\n while (arr && arr.length) {\n const fjParser = /([\\d]+)\\/([\\d]+)\\/([\\d]+)/g;\n const face = arr[1];\n let jArr = fjParser.exec(face);\n let jIndex = 0;\n var vIndex0, tIndex0, nIndex0;\n var vIndex, tIndex, nIndex;\n while (jArr && jArr.length) {\n if (jIndex > 2) {\n // 4+ vertex-face\n // but mesh only allows triangluar faces\n // re-add(0)\n positions.push(vIndex0);\n uv.push(vt[tIndex0]);\n normals.push(vn[nIndex0]);\n // re-add(last)\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n }\n // OBJ indexes are 1-based\n vIndex = parseInt(jArr[1]) - 1;\n tIndex = parseInt(jArr[2]) - 1;\n nIndex = parseInt(jArr[3]) - 1;\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n if (jIndex === 0) {\n vIndex0 = vIndex;\n tIndex0 = tIndex;\n nIndex0 = nIndex;\n }\n jIndex++;\n jArr = fjParser.exec(face);\n }\n // loop\n arr = fParser.exec(content);\n }\n // faces\n return new MeshGeometry(vertices, positions, uv, normals);\n }\n}\nclass Parser3D {\n static parseGeometry(content, type) {\n switch (type.toLowerCase()) {\n case 'obj':\n return OBJParser.parse(content);\n default:\n throw new Error(`Type '${type}' is not supported.`);\n }\n }\n}\n__decorate([\n Transformer('parse3D')\n], Parser3D, \"parseGeometry\", null);\n"],
5
5
  "mappings": ";;;;;;;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,SAAS,SAAAA,QAAO,sBAAAC,qBAAoB,iBAAAC,gBAAe,kBAAkB,qBAAqB,oBAAoB,eAAe,KAAAC,IAAG,SAAAC,QAAO,cAAAC,mBAAkB;AACzJ,SAAS,YAAAC,iBAAgB;;;ACPzB,SAAS,aAAa;AACtB,SAAS,6BAA6B;AACtC,SAAS,gBAAgB;AAElB,IAAM,mBAAmB;AAAA,EAC5B,SAAS,CAAC,SAAS,SAAS,cAAc,SAAS,MAAM,IAAI;AAAA,EAC7D,aAAa,CAAC,SAAS,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;AACvE;AACO,IAAM,2BAA2B;AAAA,EACpC,SAAS,CAAC,SAAS;AACf,UAAM,MAAM,sBAAsB,IAAI;AACtC,UAAM,WAAW,MAAM;AAAE,YAAM,IAAI,MAAM,iBAAiB,IAAI,wBAAwB;AAAA,IAAG;AACzF,QAAI,MAAM,cAAc,GAAG,GAAG;AAC1B,eAAS;AAAA,IACb;AACA,QAAI,IAAI,WAAW,GAAG;AAClB,aAAO,SAAS,cAAc,SAAS,KAAK,GAAG,GAAG;AAAA,IACtD;AACA,QAAI,IAAI,WAAW,GAAG;AAClB,YAAM,IAAI,IAAI,CAAC;AACf,aAAO,SAAS,cAAc,SAAS,KAAK,GAAG,GAAG,CAAC;AAAA,IACvD;AACA,aAAS;AAAA,EACb;AAAA,EACA,aAAa,CAAC,SAAS,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;AACvE;AACO,IAAM,sBAAsB;AAAA,EAC/B,SAAS,CAAC,SAAS,SAAS,cAAc,WAAW,MAAM,IAAI;AAAA,EAC/D,aAAa,CAAC,SAAS,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;AACtF;AACO,IAAM,2BAA2B;AAAA,EACpC,SAAS,CAAC,SAAS;AACf,QAAI,SAAS;AACT,aAAO;AACX,QAAI,SAAS;AACT,aAAO;AACX,WAAO,sBAAsB,IAAI,EAAE,CAAC;AAAA,EACxC;AAAA,EACA,aAAa,CAAC,SAAS,KAAK,SAAS;AACzC;;;ACjCA,SAAS,eAAe,GAAG,MAAM,UAAU,WAAW,OAAO,oBAAoB,SAAAC,QAAO,YAAY,yBAAyB,SAAS,YAAY,UAAU;;;ACNrJ,IAAM,kBAAkB;AACxB,IAAM,UAAU,KAAK,KAAK;;;ADDjC,IAAI,aAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKA,IAAI,iBAAiB,MAAMC,wBAAuB,WAAW,2BAA2B;AAAA,EACpF,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,6BAA6B,CAAC,QAAQ;AACvC,YAAM,aAAa,IAAI;AAGvB,WAAK,WACD,KAAK,QAAQ,WAAW,MAAM,UAAU;AAC5C,iBAAW,MAAM,OAAO,CAAC;AAAA,IAC7B;AACA,SAAK,gBAAgB,CAAC,QAAQ;AAC1B,UAAI,KAAK;AACT,UAAI,CAAC,GAAG,eAAeC,OAAM,OAAO,GAAG,cAAc,GAAG;AACpD;AAAA,MACJ;AACA,YAAM,OAAO,IAAI,KAAK,QAAQ,UAAU,EAAE;AAC1C,YAAM,MAAM,GAAG,gBAAgB,SAAS,IAAI,QAAQ,QAAQ,IAAI;AAChE,WAAK,cAAc,QAAQ,OAAO,MAAM,GAAG;AAAA,IAC/C;AACA,SAAK,mBAAmB,CAAC,QAAQ,QAAQ;AACrC,YAAM,KAAK;AAEX,UAAI,UAAU,GAAG,gBAAgB;AAC7B,YAAI,QAAQ,UAAU,GAAG,gBAAgB,QAAQ;AAC7C,gBAAM,MAAM,QAAQ,QAAQ,OAAO,GAAG,gBAAgB,QAAQ,KAAK,QAAQ;AAC3E,cAAI,CAACA,OAAM,OAAO,IAAI,GAAG;AACrB,iBAAK,cAAc,MAAM,IAAI,OAAO,GAAG;AAAA,UAC3C;AACA,cAAI,CAACA,OAAM,OAAO,GAAG,GAAG;AACpB,iBAAK,cAAc,KAAK,IAAI,QAAQ,GAAG;AAAA,UAC3C;AAAA,QACJ;AACA,WAAG,iBAAiB;AAAA,MACxB;AAAA,IACJ;AACA,SAAK,eAAe,CAAC,QAAQ;AACzB,UAAI,KAAK;AACT,UAAI,CAAC,GAAG,WAAW,CAAC,GAAG,aAAa;AAChC;AAAA,MACJ;AACA,YAAM,OAAO,GAAG,SAAS;AACzB,YAAM,WAAW,CAAC,MAAM,GAAG,iBAAiB,GAAG,GAAG;AAClD,YAAM,QAAQ,IAAI,SAAS,cAAc,EAAE,GAAG,IAAI,QAAQ,KAAK,MAAM,GAAG,IAAI,QAAQ,KAAK,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG;AAChH,SAAG,QAAQ,QAAQ,MAAM,OAAO,MAAM,QAAQ;AAAA,IAClD;AACA,SAAK,iBAAiB,CAAC,QAAQ;AAC3B,YAAM,UAAU,KAAK;AACrB,YAAM,OAAO,IAAI;AACjB,UAAI,CAACA,OAAM,OAAO,OAAO,KAAK,QAAQ,WAAW,KAAK,UAAU,QAAQ,UAAU,KAAK,OAAO;AAC1F;AAAA,MACJ;AACA,WAAK,QAAQ;AACb,YAAM,UAAU,KAAK;AACrB,UAAI,CAACA,OAAM,OAAO,OAAO,GAAG;AACxB,aAAK,QAAQ,eAAe,MAAM,IAAI;AACtC,aAAK,cAAc,IAAI,WAAW,YAAY,IAAI,CAAC;AAAA,MACvD;AAAA,IACJ;AAAA,EAEJ;AAAA,EACA,SAAS,MAAM;AACX,WAAO,gBAAgB;AAAA,EAC3B;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK,WAAW,KAAK,QAAQ,SAAS,IAAI;AAAA,EACrD;AAAA,EACA,SAAS,MAAM;AACX,UAAM,SAAS,MAAM,SAAS,IAAI;AAClC,QAAI,QAAQ;AACR,WAAK,KAAK,IAAI;AACd,WAAK,iBAAiB,yBAAyB,KAAK,4BAA4B,KAAK;AAAA,IACzF;AACA,WAAO;AAAA,EACX;AAAA,EACA,WAAW,MAAM;AACb,UAAM,SAAS,MAAM,WAAW,IAAI;AACpC,QAAI,QAAQ;AACR,WAAK,oBAAoB,yBAAyB,KAAK,4BAA4B,KAAK;AACxF,WAAK,OAAO,IAAI;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,MAAM,KAAK,YAAY;AACtC,SAAK,SAAS,WAAW,MAAM,MAAS;AAAA,EAC5C;AAAA,EACA,0BAA0B,MAAM,KAAK,OAAO;AACxC,QAAI,CAACA,OAAM,cAAc,GAAG,GAAG;AAC3B,WAAK,aAAa,IAAI,MAAM;AAAA,IAChC;AAAA,EACJ;AAAA,EACA,KAAK,MAAM;AACP,SAAK,WACD,KAAK,QAAQ,QAAQ,MAAM,IAAI;AAAA,EACvC;AAAA,EACA,OAAO,MAAM;AACT,SAAK,WACD,KAAK,QAAQ,WAAW,MAAM,IAAI;AAAA,EAC1C;AAAA,EACA,mBAAmB,KAAK,KAAK;AACzB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,YAAM,QAAQ,KAAK,cAAc,CAAC;AAClC,UAAI,CAACA,OAAM,OAAO,GAAG,GAAG;AACpB,cAAM,QAAQ,OAAK,IAAI,WAAW,MAAM,CAAC,CAAC;AAAA,MAC9C;AACA,UAAI,CAACA,OAAM,OAAO,KAAK,UAAU,KAAK,CAACA,OAAM,OAAO,GAAG,GAAG;AACtD,YAAI,WAAW,IAAI,EAAE,KAAK,OAAK;AAC3B,WAAC,SAAS,CAAC,GAAG,QAAQ,OAAK,KAAK,KAAK,CAAC,CAAC;AACvC,kBAAQ;AAAA,QACZ,GAAG,OAAK;AACJ,eAAK,IAAI,QAAQ,SAAS,OAAO,GAAG,SAAS,CAAC;AAC9C,iBAAO,CAAC;AAAA,QACZ,CAAC;AAAA,MACL,OACK;AACD,gBAAQ;AAAA,MACZ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA,EAEA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,OAAO;AACP;AAAA,IACJ;AACA,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,aAAK,mBAAmB,KAAK,GAAG;AAChC;AAAA,MACJ,KAAK;AACD,aAAK,0BAA0B,GAAG;AAClC;AAAA,MACJ,KAAK;AACD,aAAK,SAAS,eAAe,MAAM,KAAK,IAAI;AAC5C;AAAA,MACJ,KAAK;AACD,aAAK,mBAAmB,GAAG;AAAA,MAC/B,KAAK;AAAA,MACL,KAAK;AACD,aAAK,OAAO;AACZ;AAAA,IACR;AAAA,EACJ;AAAA,EACA,wBAAwB;AACpB,UAAM,sBAAsB;AAE5B,UAAM,YAAY,KAAK;AAEvB,UAAM,UAAU,KAAK;AACrB,YAAQ,iBAAiB,UAAU,KAAK,gBAAgB,KAAK;AAC7D,YAAQ,SAAS;AAEjB,SAAK,mBAAmB,MAAM,KAAK,OAAO,EAAE,KAAK,OAAK;AAClD,gBAAU,iBAAiB,aAAa,KAAK,cAAc,KAAK;AAChE,gBAAU,iBAAiB,SAAS,KAAK,eAAe,KAAK;AAC7D,gBAAU,iBAAiB,WAAW,KAAK,eAAe,KAAK;AAC/D,gBAAU,iBAAiB,aAAa,KAAK,eAAe,KAAK;AACjE,gBAAU,iBAAiB,YAAY,KAAK,cAAc,KAAK;AAC/D,WAAK,0BAA0B;AAC/B,WAAK,OAAO;AAAA,IAChB,CAAC;AAAA,EACL;AAAA,EACA,cAAc,QAAQ,OAAO,MAAM,QAAQ;AACvC,QAAI,CAACA,OAAM,OAAO,MAAM,GAAG;AACvB,UAAI,UAAU,eAAe;AAC7B,UAAI,kBAAkB,OAAO;AACzB,wBAAgB;AAAA,MACpB,OACK;AACD,mBAAW,EAAE,MAAM,QAAQ,OAAe;AAAA,MAC9C;AACA,UAAI,OAAO,SAAS,UAAU;AAC1B,kBAAU;AAAA,MACd,OACK;AACD,kBAAU,KAAK;AACf,wBAAgB,KAAK;AAAA,MACzB;AACA,YAAM,IAAI;AACV,YAAM,MAAM,MAAM,kBAAkB,QAAQ,IAAI,gBAAgB,SAAS,QAAQ,eAAe,CAAC,IAAI,IAAI,UAAU,SAAS,EAAE,QAAQ,UAAU,YAAY,YAAY,GAAG,kBAAkB,QAAQ,YAAY,GAAG,kBAAkB,KAAK,GAAG,eAAe,CAAC,GAAG,UAAU,kBAAkB,QAAQ,IAAI,gBAAgB,SAAS,SAAS,QAAQ,eAAe,CAAC,IAAI,IAAI,UAAU,SAAS,SAAS,EAAE,QAAQ,UAAU,YAAY,YAAY,GAAG,kBAAkB,QAAQ,YAAY,GAAG,kBAAkB,KAAK,GAAG,eAAe,CAAC;AACzgB,UAAI,UAAU;AACd,UAAI,kBAAkB,aAAa;AAC/B,cAAM,OAAO,IAAI;AACjB,eAAO,cAAc,IAAI;AACzB,kBAAU,KAAK;AAAA,MACnB;AACA,aAAO,MAAM,cAAc,OAAO;AAElC,aAAO,WAAW,QAAQ;AAAA,IAC9B;AACA,WAAO;AAAA,EACX;AAAA,EACA,uBAAuB;AACnB,SAAK,SAAS,KAAK;AACnB,UAAM,UAAU,KAAK,UAAU,YAAY,KAAK;AAChD,QAAI,CAACA,OAAM,OAAO,SAAS,GAAG;AAC1B,gBAAU,oBAAoB,SAAS,KAAK,eAAe,KAAK;AAChE,gBAAU,oBAAoB,WAAW,KAAK,eAAe,KAAK;AAClE,gBAAU,oBAAoB,aAAa,KAAK,eAAe,KAAK;AACpE,gBAAU,oBAAoB,aAAa,KAAK,cAAc,KAAK;AACnE,gBAAU,oBAAoB,YAAY,KAAK,cAAc,KAAK;AAAA,IACtE;AACA,QAAI,CAACA,OAAM,OAAO,OAAO,GAAG;AACxB,cAAQ,oBAAoB,UAAU,KAAK,gBAAgB,KAAK;AAAA,IACpE;AACA,UAAM,qBAAqB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,IAAI,OAAO;AACP,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,OAAO,MAAM,YAAY,MAAM,YAAY,IAAI,GAAG;AAC9C,QAAI,CAACA,OAAM,OAAO,IAAI,GAAG;AACrB,YAAM,UAAU,KAAK;AACrB,UAAI,CAACA,OAAM,OAAO,OAAO,GAAG;AACxB,gBAAQ,WAAW,MAAM,IAAI;AAAA,MACjC;AAAA,IACJ,OACK;AACD,WAAK,SAAS,KAAK;AACnB,WAAK,UAAU,WAAW,MAAM,IAAI,OAAK,KAAK,UAAU,CAAC;AAAA,IAE7D;AAAA,EACJ;AAAA,EACA;AAAA,EACA,YAAY;AACR,QAAI,CAAC,KAAK,YAAY,CAACA,OAAM,OAAO,KAAK,OAAO,GAAG;AAC/C,YAAM,QAAQ,KAAK,QAAQ,SAAS,IAAI;AACxC,UAAI,aAAa,IAAI,YAAY,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,KAAK,CAAC;AACrF,WAAK,cAAc,UAAU;AAC7B,UAAI,CAAC,WAAW,kBAAkB;AAC9B,aAAK,QAAQ,OAAO,IAAI;AACxB,aAAK,cAAc,IAAI,YAAY,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAAA,MACvE;AAAA,IACJ;AAAA,EACJ;AACJ;AACA,WAAW;AAAA,EACP,UAAU,IAAI,IAAI,KAAK;AAC3B,GAAG,eAAe,WAAW,cAAc,MAAM;AACjD,WAAW;AAAA,EACP,UAAU,IAAI,SAAS;AAC3B,GAAG,eAAe,WAAW,YAAY,MAAM;AAC/C,WAAW;AAAA,EACP,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,QAAQ,CAAC;AAChE,GAAG,eAAe,WAAW,eAAe,MAAM;AAClD,WAAW;AAAA,EACP,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,QAAQ,CAAC;AAChE,GAAG,eAAe,WAAW,eAAe,MAAM;AAClD,WAAW;AAAA,EACP,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,OAAO,CAAC;AAC/D,GAAG,eAAe,WAAW,cAAc,MAAM;AACjD,WAAW;AAAA,EACP,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,QAAQ,CAAC;AAChE,GAAG,eAAe,WAAW,WAAW,MAAM;AAC9C,WAAW;AAAA,EACP,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,KAAK,CAAC;AAC7D,GAAG,eAAe,WAAW,cAAc,MAAM;AACjD,WAAW;AAAA,EACP,MAAM,EAAE,MAAM,OAAO,WAAW,mBAAmB,QAAQ,CAAC;AAChE,GAAG,eAAe,WAAW,SAAS,MAAM;AAC5C,iBAAiB,WAAW;AAAA,EACxB,cAAc;AAAA,IACV,SAAS,IAAI,MAAM;AAAA,IAAiB,QAAQ,SAAS;AAAA,IAAiB,UAAU,IAAI,CAAC,mCAAmC,CAAC,uBAAuB,IAAI,eAAe,CAAC,cAAc,CAAC;AAAA,EACvL,CAAC;AACL,GAAG,cAAc;;;AFtRjB,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAMO,SAAS,QAAQ,QAAQ;AAC5B,SAAO,CAACC,OAAM,OAAO,MAAM,KAAK,YAAY,UAAU,OAAO,OAAO,QAAQ,MAAM;AACtF;AACO,SAAS,aAAa,QAAQ;AACjC,SAAO,QAAQ,QAAQ,KAAK;AAChC;AACO,SAAS,aAAa,QAAQ;AACjC,SAAO,qBAAqB,UAAU,aAAa,MAAM;AAC7D;AACO,SAAS,SAAS,QAAQ;AAC7B,SAAO,UAAU,UAAU,QAAQ,UAAU,YAAY,UAAU,aAAa,MAAM;AAC1F;AACO,SAAS,oBAAoB,QAAQ;AACxC,SAAO,SAAS,MAAM,KAAK,UAAU,UAAU,OAAO,SAAS;AACnE;AACO,SAAS,qBAAqB,QAAQ;AACzC,SAAO,SAAS,MAAM,KAAK,UAAU,UAAU,OAAO,SAAS;AACnE;AACO,SAAS,QAAQ,QAAQ;AAC5B,SAAO,UAAU,WAAW,OAAO,SAAS,aAAa,OAAO,SAAS,UAAU,OAAO,SAAS,eAAe,OAAO,QAAQ,WAAW,aAAa,MAAM;AACnK;AACO,SAAS,OAAO,QAAQ;AAC3B,SAAO,cAAc,UAAU,aAAa,MAAM;AACtD;AACO,SAAS,WAAW,QAAQ;AAC/B,SAAO,eAAe,UAAUA,OAAM,QAAQ,OAAO,SAAS;AAClE;AACO,SAAS,eAAe,QAAQ;AACnC,UAAQ,qBAAqB,UAAUA,OAAM,QAAQ,OAAO,eAAe,KACpE,aAAa,UAAUA,OAAM,QAAQ,OAAO,OAAO,KACnD,wBAAwB,UAAUA,OAAM,QAAQ,OAAO,kBAAkB,MAAM,WAAW,MAAM;AAC3G;AACO,SAAS,QAAQ,QAAQ;AAC5B,SAAO,sBAAsB,UAAUA,OAAM,QAAQ,OAAO,kBAAkB,CAAC,KAAK,aAAa,MAAM;AAC3G;AAKO,SAAS,0BAA0B,UAAU;AAChD,QAAM,UAAU,CAAC;AACjB,MAAI,CAACA,OAAM,cAAc,QAAQ,GAAG;AAChC,UAAM,UAAU,SAAS;AACzB,QAAI,QAAQ,SAAS,MAAM,GAAG;AAC1B,YAAM,IAAI,WAAW,0BAA0B,QAAQ,MAAM,wBAAwB;AAAA,IACzF;AACA,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACxC,YAAM,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC;AAC3D,YAAM,IAAI,SAAS,UAAU,CAAC,GAAG,IAAI,SAAS,UAAU,CAAC,GAAG,IAAI,SAAS,UAAU,CAAC;AACpF,YAAM,SAAS,mBAAmB,GAAG,GAAG,CAAC;AACzC,cAAQ,KAAK,QAAQ,QAAQ,MAAM;AAAA,IACvC;AAAA,EACJ;AACA,WAAS,UAAU;AACvB;AAOO,SAAS,mBAAmB,GAAG,GAAG,GAAG;AAExC,QAAM,MAAMC,UAAS,cAAc,SAAS,SAAS,GAAG,CAAC,GAAG,MAAMA,UAAS,cAAc,SAAS,SAAS,GAAG,CAAC;AAC/G,QAAM,aAAaA,UAAS,cAAc,SAAS,MAAM,KAAK,GAAG;AACjE,SAAOA,UAAS,cAAc,SAAS,KAAK,UAAU;AAC1D;AACO,IAAM,YAAN,cAAwB,cAAc;AAAA,EACzC,YAAY,MAAM,WAAW,eAAe,OAAO;AAC/C,UAAM,MAAM,WAAW,aAAa;AACpC,SAAK,SAAS;AAAA,EAClB;AAAA,EACA;AAAA;AAAA,EAEA,IAAI,QAAQ;AACR,WAAO,KAAK;AAAA,EAChB;AACJ;AACO,IAAM,YAAN,cAAwB,UAAU;AACzC;AACO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC3C,YAAY,MAAM,MAAM,eAAe,GAAG;AACtC,UAAM,MAAM,EAAE,QAAQ,MAAM,SAAS,MAAM,YAAY,KAAK,GAAG,eAAe,CAAC;AAAA,EACnF;AACJ;AACO,IAAI;AAAA,CACV,SAAUC,oBAAmB;AAC1B,EAAAA,mBAAkB,UAAU,IAAI;AAChC,EAAAA,mBAAkB,WAAW,IAAI;AACjC,EAAAA,mBAAkB,UAAU,IAAI;AAChC,EAAAA,mBAAkB,UAAU,IAAI;AAChC,EAAAA,mBAAkB,UAAU,IAAI;AAChC,EAAAA,mBAAkB,OAAO,IAAI;AAC7B,EAAAA,mBAAkB,QAAQ,IAAI;AAC9B,EAAAA,mBAAkB,YAAY,IAAI;AACtC,GAAG,sBAAsB,oBAAoB,CAAC,EAAE;AACzC,SAAS,cAAc,QAAQ;AAClC,SAAO,OAAO,WAAW,YAAY,UAAU,UAAU,OAAO,OAAO,MAAM,MAAM;AACvF;AAEA,IAAM,YAAY;AAAA,EACd,iBAAiBC,KAAI,MAAM,kBAAkB;AAAA,EAC7C,gBAAgBA,KAAI,MAAM,kBAAkB;AAAA,EAC5C,6BAA6BA,KAAI,MAAM,kBAAkB;AAAA,EACzD,uBAAuBA,KAAI,MAAM,kBAAkB;AAAA,EACnD,eAAeA,KAAI,MAAM,kBAAkB;AAAA,EAC3C,eAAeA,KAAI,MAAM,kBAAkB;AAAA,EAC3C,gBAAgBA,KAAI,MAAM,kBAAkB;AAAA,EAC5C,gBAAgB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACvC;AACO,IAAM,oBAAN,MAAM,2BAA0BC,YAAW,gCAAgC;AAAA,EAC9E,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,WAAW,UAAU;AAC1B,SAAK,cAAc,CAAC;AAAA,EACxB;AAAA,EACA,SAAS,GAAG;AAER,WAAO;AAAA,EACX;AAAA,EACA,gBAAgB;AAEZ,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK,QAAQ,IAAI,KAAK,QAAQ,KAAK,mBAAmB,mBAAmB,MAAM,cAAc;AAAA,EACxG;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK,iBAAiB,IAAI,KAAK,iBAAiB,KAAK,mBAAmB,aAAa,MAAM,OAAK,aAAa,kBAAiB;AAAA,EACzI;AAAA,EACA,uBAAuB;AACnB,WAAO,KAAK,QAAQ;AACpB,WAAO,KAAK,iBAAiB;AAC7B,UAAM,qBAAqB;AAAA,EAC/B;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,aAAK,WAAW,kBAAkB,UAAU;AAC5C;AAAA,MACJ,KAAK;AACD,aAAK,WAAW,kBAAkB,QAAQ;AAC1C;AAAA,MACJ,KAAK;AACD,aAAK,WAAW,kBAAkB,QAAQ;AAC1C;AAAA,IACR;AAAA,EACJ;AAAA,EACA;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAEA,cAAc,OAAO;AAEjB,aAAS,QAAQ,OAAO;AACpB,UAAI,CAAC,KAAK,MAAM,SAAS,IAAI,GAAG;AAC5B,aAAK,MAAM,KAAK,IAAI;AAAA,MACxB;AAAA,IACJ;AACA,SAAK,OAAO,OAAO,IAAI;AAAA,EAC3B;AACJ;AACAL,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAW,iBAAiB,CAAC;AACtD,GAAG,kBAAkB,WAAW,YAAY,MAAM;AAClDN,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,aAAa,MAAM,WAAWC,oBAAmB,OAAO,CAAC;AAClF,GAAG,kBAAkB,WAAW,OAAO,MAAM;AAC7CP,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,QAAQ,CAAC;AAChE,GAAG,kBAAkB,WAAW,SAAS,MAAM;AACxC,IAAM,cAAN,cAA0B,kBAAkB;AAAA;AAAA,EAE/C,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,aAAK,WAAW,kBAAkB,SAAS;AAC3C;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,SAAS,EAAE,GAAG,KAAK,YAAY,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW;AAC3E;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,QAAQ,EAAE,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,GAAG,KAAK,OAAO;AAC9D;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,wBAAwB;AAC7B;AAAA,IACR;AAAA,EACJ;AAAA,EACA,0BAA0B;AACtB,UAAM,QAAQL,UAAS,cAAc,UAAU,QAAQA,UAAS,cAAc,UAAU,OAAOA,UAAS,cAAc;AAEtH,UAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,GAAG,GAAG,CAAC;AAC9C,QAAI,IAAI,MAAM,MAAM,MAAM,SAAS,GAAG,KAAK;AAE3C,QAAI,CAACD,OAAM,OAAO,KAAK,MAAM,GAAG;AAC5B,YAAM,MAAM,KAAK,iBAAiB,KAAK,MAAM;AAC7C,UAAI,MAAM,SAAS,GAAG,GAAG;AAAA,IAC7B;AAEA,UAAM,SAAS,KAAK,UAAU,MAAM,KAAK,GAAG,GAAG,CAAC;AAChD,QAAI,MAAM,UAAU,GAAG,MAAM;AAC7B,SAAK,kBAAkB;AAAA,EAC3B;AACJ;AACAD,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAW,oBAAoB,CAAC;AACzD,GAAG,YAAY,WAAW,UAAU,MAAM;AAC1CN,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAW,yBAAyB,CAAC;AAC9D,GAAG,YAAY,WAAW,SAAS,MAAM;AACzCN,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAW,yBAAyB,CAAC;AAC9D,GAAG,YAAY,WAAW,UAAU,MAAM;AAC1CN,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,MAAM,CAAC;AACzB,GAAG,YAAY,WAAW,mBAAmB,MAAM;AACnDN,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,YAAY,WAAW,UAAU,MAAM;AAC1CP,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,YAAY,WAAW,UAAU,MAAM;AAC1CP,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,YAAY,WAAW,UAAU,MAAM;AAC1CP,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,YAAY,WAAW,cAAc,MAAM;AAC9CP,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,YAAY,WAAW,cAAc,MAAM;AAC9CP,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,YAAY,WAAW,cAAc,MAAM;AAC9C,IAAI,sBAAsB,MAAMC,6BAA4B,YAAY;AAAA,EACpE,SAAS,OAAO;AAEZ,WAAO,iBAAiB;AAAA,EAC5B;AAAA,EACA,YAAY,CAAC;AAAA,EACb,IAAI,mBAAmB;AACnB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AACD,aAAK,YAAa,OAAO,CAAC;AAC1B,aAAK,WAAW,kBAAkB,QAAQ;AAC1C;AAAA,IACR;AAAA,EACJ;AACJ;AACAR,YAAW;AAAA,EACPM,OAAM,EAAE,MAAM,MAAM,CAAC;AACzB,GAAG,oBAAoB,WAAW,cAAc,MAAM;AACtD,sBAAsBN,YAAW;AAAA,EAC7BS,eAAc,EAAE,SAAS,UAAU,eAAe,CAAC;AACvD,GAAG,mBAAmB;AAEtB,IAAI,qBAAqB,MAAMC,4BAA2B,YAAY;AAAA,EAClE,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,aAAK,WAAW,kBAAkB,QAAQ;AAC1C;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,kBAAkB,QAAQ;AAC1C;AAAA,IACR;AAAA,EACJ;AACJ;AACAC,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,KAAK,CAAC;AAC7D,GAAG,mBAAmB,WAAW,YAAY,MAAM;AACnDF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,KAAK,CAAC;AAC7D,GAAG,mBAAmB,WAAW,YAAY,MAAM;AACnDF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,KAAK,CAAC;AAC7D,GAAG,mBAAmB,WAAW,gBAAgB,MAAM;AACvD,qBAAqBF,YAAW;AAAA,EAC5BG,eAAc,EAAE,SAAS,UAAU,cAAc,CAAC;AACtD,GAAG,kBAAkB;AAErB,IAAI,uBAAuB,MAAMC,8BAA6B,YAAY;AAAA,EACtE,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,SAAS,aAAa,SAAS,QAAQ;AACvC,WAAK,WAAW,kBAAkB,UAAU,kBAAkB,QAAQ;AAAA,IAC1E;AAAA,EACJ;AACJ;AACAC,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,MAAM,CAAC;AACzB,GAAG,qBAAqB,WAAW,WAAW,MAAM;AACpDD,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,QAAQ,MAAM;AACjD,uBAAuBF,YAAW;AAAA,EAC9BG,eAAc,EAAE,SAAS,UAAU,gBAAgB,CAAC;AACxD,GAAG,oBAAoB;AAEvB,IAAI,sBAAsB,MAAMC,6BAA4B,kBAAkB;AAAA,EAC1E,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,YAAY;AACjB,SAAK,SAAS,UAAU;AACxB,SAAK,QAAQ;AACb,SAAK,OAAO;AAAA,EAChB;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,kBAAkB,KAAK;AACvC;AAAA,IACR;AAAA,EACJ;AACJ;AACAC,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,oBAAoB,WAAW,aAAa,MAAM;AACrDF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAW,iBAAiB,CAAC;AACtD,GAAG,oBAAoB,WAAW,UAAU,MAAM;AAClDD,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,oBAAoB,WAAW,SAAS,MAAM;AACjDF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,oBAAoB,WAAW,QAAQ,MAAM;AAChD,sBAAsBF,YAAW;AAAA,EAC7BG,eAAc,EAAE,SAAS,UAAU,eAAe,CAAC;AACvD,GAAG,mBAAmB;AAEf,IAAM,uBAAN,cAAmC,kBAAkB;AAAA,EACxD,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,KAAKC,UAAS,cAAc,SAAS,EAAE;AAC5C,SAAK,SAAS,UAAU;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,uBAAuB;AACnB,UAAM,WAAW,KAAK;AACtB,UAAM,MAAM,KAAK,UAAU,SAAS,KAAK;AACzC,UAAM,SAASC,OAAM,cAAc,GAAG,KAAKA,OAAM,cAAc,MAAM,IAAI,IACnED,UAAS,cAAc,SAAS,IAAIA,UAAS,cAAc,SAAS,SAAS,KAAK,MAAM,CAAC;AAC/F,UAAM,eAAe,KAAK,UAAU,EAAE,QAAQ,OAAO;AACrD,SAAK,cAAc,IAAI,oBAAoB,EAAE,cAAc,cAAc,kBAAkB,SAAS,CAAC,CAAC;AAAA,EAC1G;AAAA,EACA,IAAI,iBAAiB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AACD,aAAK,qBAAqB;AAAA,MAC9B,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,kBAAkB,MAAM;AACxC;AAAA,IACR;AAAA,EACJ;AACJ;AACAE,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,QAAQ,MAAM;AACjDF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,OAAO,MAAM;AAChDF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAW,iBAAiB,CAAC;AACtD,GAAG,qBAAqB,WAAW,MAAM,MAAM;AAC/CD,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAW,iBAAiB,CAAC;AACtD,GAAG,qBAAqB,WAAW,UAAU,MAAM;AACnD,IAAI,kCAAkC,MAAME,yCAAwC,qBAAqB;AAAA,EACrG,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,MAAM;AACX,SAAK,SAAS;AAAA,EAClB;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AAAA,EACA,IAAI,cAAc;AACd,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,kBAAkB,MAAM;AACxC;AAAA,IACR;AAAA,EACJ;AACJ;AACAH,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,OAAO,MAAM;AAC3DF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,UAAU,MAAM;AAC9D,kCAAkCF,YAAW;AAAA,EACzCI,eAAc,EAAE,SAAS,UAAU,4BAA4B,CAAC;AACpE,GAAG,+BAA+B;AAElC,IAAI,mCAAmC,MAAMC,0CAAyC,qBAAqB;AAAA,EACvG,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EACA,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,kBAAkB,MAAM;AACxC;AAAA,IACR;AAAA,EACJ;AACJ;AACAC,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,iCAAiC,WAAW,OAAO,MAAM;AAC5DF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,iCAAiC,WAAW,QAAQ,MAAM;AAC7DF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,iCAAiC,WAAW,UAAU,MAAM;AAC/DF,YAAW;AAAA,EACPC,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,iCAAiC,WAAW,SAAS,MAAM;AAC9D,mCAAmCF,YAAW;AAAA,EAC1CG,eAAc,EAAE,SAAS,UAAU,sBAAsB,CAAC;AAC9D,GAAG,gCAAgC;AAE5B,IAAM,wBAAN,cAAoC,iBAAiB;AAC5D;;;AI/dO,IAAM,kBAAN,MAAsB;AAAA,EACzB,cAAc;AACV,SAAK,YAAY;AAAA,MACb,WAAW;AAAA,MAAO,MAAM,CAAC;AAAA,IAC7B;AACA,QAAI,MAAM,SAAS,cAAc,QAAQ;AACzC,QAAI,eAAe,CAAC,SAAS,sBAAsB,aAAa,WAAW;AAC3E,QAAI;AACJ,QAAI,WAAW,SAAU,KAAK;AAC1B,UAAI,CAAC;AACD,eAAO;AACX,aAAO,IAAI,aAAa,GAAG;AAAA,IAC/B;AAEA,QAAI,UAAU,CAAC,SAAS,MAAM,UAAU;AACpC,UAAI,WAAW,KAAK;AACpB,UAAI,OAAO,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,OAAO,KAAK,CAAC;AAC/D,aAAO,KAAK,QAAQ,WAAW,EAAE;AACjC,aAAO,KAAK,UAAU,GAAG,CAAC,EAAE,YAAY,IAAI,KAAK,UAAU,CAAC;AAC5D,WAAK,IAAI,IAAI;AAAA,IACjB;AACA,QAAI,UAAU,UAAU,QAAQ,MAAM,KAAK,GAAG;AAC1C,UAAI;AACA,cAAM,OAAO,aAAa,EAAE,gBAAgB,KAAK,QAAQ;AAAA,MAC7D,SACO,GAAG;AAAA,MAAE;AAAA,IAChB,OACK;AACD,eAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,YAAI;AACA,gBAAM,IAAI,WAAW,aAAa,CAAC,CAAC;AACpC,cAAI,KAAK;AACL,oBAAQ,QAAQ,gBAAgB,aAAa,CAAC,CAAC;AAC/C;AAAA,UACJ;AAAA,QACJ,SACO,GAAG;AAAA,QAAE;AAAA,MAChB;AAAA,IACJ;AACA,SAAK,UAAU,YAAY,CAAC,CAAC;AAC7B,YAAQ,QAAQ,YAAY,UAAU,QAAQ;AAC9C,YAAQ,QAAQ,SAAS,UAAU,SAAS;AAC5C,QAAI,KAAK;AACL,cAAQ,QAAQ,UAAU,SAAS,IAAI,MAAM,CAAC;AAC9C,cAAQ,QAAQ,WAAW,SAAS,IAAI,OAAO,CAAC;AAChD,cAAQ,QAAQ,YAAY,SAAS,IAAI,QAAQ,CAAC;AAClD,cAAQ,QAAQ,4BAA4B,SAAS,IAAI,wBAAwB,CAAC;AAClF,cAAQ,QAAQ,aAAa,SAAS,IAAI,QAAQ,IAAI,OAAO,SAAS,IAAI,UAAU,IAAI,OAAO,SAAS,IAAI,SAAS,IAAI,OAAO,SAAS,IAAI,UAAU,CAAC;AACxJ,cAAQ,QAAQ,cAAc,SAAS,IAAI,UAAU,CAAC;AACtD,cAAQ,UAAU,sBAAsB,SAAS,IAAI,kBAAkB,CAAC;AACxE,cAAQ,UAAU,kCAAkC,SAAS,IAAI,8BAA8B,CAAC;AAChG,cAAQ,UAAU,uBAAuB,SAAS,IAAI,mBAAmB,CAAC;AAC1E,cAAQ,UAAU,uBAAuB,SAAS,IAAI,0BAA0B,CAAC;AACjF,cAAQ,OAAO,oCAAoC,SAAS,IAAI,gCAAgC,CAAC;AACjG,cAAQ,OAAO,oBAAoB,SAAS,IAAI,gBAAgB,CAAC;AACjE,cAAQ,OAAO,6BAA6B,SAAS,IAAI,yBAAyB,CAAC;AACnF,cAAQ,OAAO,mCAAmC,SAAS,IAAI,0BAA0B,CAAC;AAC1F,cAAQ,QAAQ,0BAA0B,SAAS,IAAI,qBAAqB,CAAC;AAC7E,cAAQ,QAAQ,2BAA2B,SAAS,IAAI,iBAAiB,CAAC;AAC1E,cAAQ,QAAQ,4BAA4B,SAAS,IAAI,wBAAwB,CAAC;AAClF,cAAQ,QAAQ,4BAA4B,SAAS,IAAI,wBAAwB,CAAC;AAClF,cAAQ,QAAQ,wBAAwB,IAAI,uBAAuB,KAAK,CAAC,CAAC;AAAA,IAC9E;AAAA,EACJ;AAAA,EACA,IAAI,OAAO;AACP,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EACA,IAAI,YAAY;AACZ,WAAO,KAAK,UAAU;AAAA,EAC1B;AACJ;;;AClEA,SAAS,oBAAAC,mBAAkB,SAAAC,QAAO,SAAAC,QAAO,sBAAAC,qBAAoB,QAAAC,aAAY;AACzE,SAAS,eAAe;AAPxB,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKO,IAAI;AAAA,CACV,SAAUC,cAAa;AACpB,EAAAA,aAAY,OAAO,IAAI;AACvB,EAAAA,aAAY,SAAS,IAAI;AACzB,EAAAA,aAAY,OAAO,IAAI;AACvB,EAAAA,aAAY,UAAU,IAAI;AAC1B,EAAAA,aAAY,MAAM,IAAI;AACtB,EAAAA,aAAY,QAAQ,IAAI;AAC5B,GAAG,gBAAgB,cAAc,CAAC,EAAE;AAC7B,SAAS,WAAW,KAAK;AAC5B;AAAA;AAAA,IAA6B,YAAY;AAAA;AAC7C;AACO,SAAS,gBAAgB,KAAK;AACjC,SAAO,WAAW,GAAG,KAAK,IAAI,WAAW,YAAY;AACzD;AACO,SAAS,eAAe,KAAK;AAChC,SAAO,WAAW,GAAG,KAAK,IAAI,WAAW,YAAY;AACzD;AACO,SAAS,kBAAkB,KAAK;AACnC,SAAO,WAAW,GAAG,KAAK,IAAI,WAAW,YAAY;AACzD;AACO,SAAS,gBAAgB,KAAK;AACjC,SAAO,WAAW,GAAG,KAAK,IAAI,WAAW,YAAY;AACzD;AACO,SAAS,mBAAmB,KAAK;AACpC,SAAO,WAAW,GAAG,KAAK,IAAI,WAAW,YAAY;AACzD;AACO,SAAS,iBAAiB,KAAK;AAClC,SAAO,WAAW,GAAG,KAAK,IAAI,WAAW,YAAY;AACzD;AAEO,IAAM,kBAAN,cAA8BC,kBAAiB;AAAA,EAClD,YAAY,QAAQ;AAChB,UAAM;AACN,SAAK,UAAU;AAAA,EACnB;AAAA,EACA;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,MAAM,SAAS,KAAK,MAAM,KAAK,UAAU,SAAS;AAC9C,QAAI,CAACC,OAAM,OAAO,GAAG,GAAG;AACpB,UAAI,MAAM;AAAA,IACd;AACA,QAAIA,OAAM,cAAc,GAAG,GAAG;AAC1B,aAAO;AAAA,IACX;AACA,UAAM,OAAO,MAAM,QAAQ,UAAU,GAAG;AACxC,QAAIA,OAAM,OAAO,IAAI,GAAG;AACpB,aAAO;AAAA,IACX;AACA,WAAO,MAAM,kBAAkB,IAAI;AAAA,EACvC;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,eAAK,eAAe;AACpB;AAAA,MACR;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,wBAAwB;AACpB,UAAM,sBAAsB;AAC5B,SAAK,eAAe;AAAA,EACxB;AAAA,EACA,iBAAiB;AACb,SAAK,eAAe,EAAE,KAAK,OAAK;AAC5B,WAAK,WAAWA,OAAM,OAAO,GAAG,EAAE,OAAO,CAAC,kBAAkB,QAAQ,EAAE,CAAC;AAAA,IAC3E,CAAC;AAAA,EACL;AAAA,EACA,MAAM,iBAAiB;AACnB,WAAO;AAAA,MACH,SAAS,KAAK,WAAW;AAAA,MACzB,WAAW,KAAK,aAAa;AAAA,MAC7B,OAAO,KAAK,SAASA,OAAM,IAAI,iBAAiB,KAAKC,KAAI,gBAAgB;AAAA,MACzE,SAAS,EAAE,KAAK,QAAQ;AAAA,MACxB,KAAK,KAAK;AAAA,MACV,SAAS,MAAM,KAAK,SAAS,KAAK,GAAG;AAAA,MACrC,QAAQ,KAAK;AAAA,MACb,OAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AACJ;AACAJ,YAAW;AAAA,EACPK,OAAM;AACV,GAAG,gBAAgB,WAAW,YAAY,MAAM;AAChDL,YAAW;AAAA,EACPK,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,WAAW,MAAM;AAC/CN,YAAW;AAAA,EACPK,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,QAAQ,CAAC;AAChE,GAAG,gBAAgB,WAAW,aAAa,MAAM;AACjDN,YAAW;AAAA,EACPK,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,SAAS,MAAM;AAC7CN,YAAW;AAAA,EACPK,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,QAAQ,CAAC;AAChE,GAAG,gBAAgB,WAAW,QAAQ,MAAM;AAC5CN,YAAW;AAAA,EACPK,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,OAAO,MAAM;;;AC9G3C,SAAS,iBAAAC,gBAAe,KAAAC,UAAS;AANjC,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKA,IAAI,uBAAuB,MAAMC,8BAA6B,gBAAgB;AAAA,EAC1E,cAAc;AACV,UAAM,YAAY,KAAK;AAAA,EAC3B;AACJ;AACA,uBAAuBD,YAAW;AAAA,EAC9BE,eAAc,EAAE,SAAS,GAAGC,EAAC,IAAI,eAAe,kBAAkB,CAAC;AACvE,GAAG,oBAAoB;;;ACXvB,SAAS,iBAAAC,gBAAe,KAAAC,IAAG,SAAAC,QAAO,sBAAAC,qBAAoB,SAAAC,cAAa;AANnE,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKA,IAAI,yBAAyB,MAAMC,gCAA+B,gBAAgB;AAAA,EAC9E,cAAc;AACV,UAAM,YAAY,OAAO;AAAA,EAC7B;AAAA,EACA,MAAM,iBAAiB;AACnB,WAAOC,OAAM,OAAO;AAAA,MAChB,eAAe,KAAK,iBAAiB;AAAA,MACrC,cAAc,KAAK,gBAAgB;AAAA,MACnC,iBAAiB,KAAK,mBAAmB;AAAA,IAC7C,GAAG,MAAM,MAAM,eAAe,CAAC;AAAA,EACnC;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,eAAK,eAAe;AACpB;AAAA,MACR;AAAA,IACJ;AAAA,EACJ;AACJ;AACAF,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,uBAAuB,WAAW,iBAAiB,MAAM;AAC5DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,uBAAuB,WAAW,gBAAgB,MAAM;AAC3DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,uBAAuB,WAAW,mBAAmB,MAAM;AAC9D,yBAAyBJ,YAAW;AAAA,EAChCK,eAAc,EAAE,SAAS,GAAGC,EAAC,IAAI,eAAe,oBAAoB,CAAC;AACzE,GAAG,sBAAsB;;;ACvCzB,SAAS,iBAAAC,gBAAe,KAAAC,IAAG,SAAAC,QAAO,sBAAAC,qBAAoB,SAAAC,cAAa;AANnE,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKA,IAAI,sBAAsB,MAAMC,6BAA4B,gBAAgB;AAAA,EACxE,cAAc;AACV,UAAM,YAAY,IAAI;AAAA,EAC1B;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,eAAK,eAAe;AACpB;AAAA,MACR;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,MAAM,iBAAiB;AACnB,WAAOC,OAAM,OAAO;AAAA,MAChB,WAAW,KAAK,aAAa;AAAA,MAC7B,UAAU,KAAK,YAAY;AAAA,MAC3B,SAAS,KAAK,WAAW;AAAA,MACzB,WAAW,KAAK;AAAA,IACpB,GAAG,MAAM,MAAM,eAAe,CAAC;AAAA,EACnC;AACJ;AACAF,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,oBAAoB,WAAW,aAAa,MAAM;AACrDJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,oBAAoB,WAAW,YAAY,MAAM;AACpDJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,oBAAoB,WAAW,WAAW,MAAM;AACnDJ,YAAW;AAAA,EACPG,OAAM;AAAA,IACF,MAAM;AAAA,IAAO,WAAW;AAAA,MACpB,SAAS,CAAC,SAAS,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,SAAS,CAAC,CAAC,EAAE,OAAO,OAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAAA,MACtF,aAAa,CAAC,SAAS,MAAM,KAAK,GAAG;AAAA,IACzC;AAAA,EACJ,CAAC;AACL,GAAG,oBAAoB,WAAW,aAAa,MAAM;AACrD,sBAAsBH,YAAW;AAAA,EAC7BK,eAAc,EAAE,SAAS,GAAGC,EAAC,IAAI,eAAe,iBAAiB,CAAC;AACtE,GAAG,mBAAmB;;;ACjDtB,SAAS,iBAAAC,gBAAe,KAAAC,IAAG,SAAAC,QAAO,sBAAAC,qBAAoB,SAAAC,cAAa;AANnE,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKA,IAAI,uBAAuB,MAAMC,8BAA6B,gBAAgB;AAAA,EAC1E,cAAc;AACV,UAAM,YAAY,KAAK;AAAA,EAC3B;AAAA,EACA,MAAM,iBAAiB;AACnB,WAAOC,OAAM,OAAO;AAAA,MAChB,eAAe,KAAK,iBAAiB;AAAA,MACrC,cAAc,KAAK,gBAAgB;AAAA,MACnC,iBAAiB,KAAK,mBAAmB;AAAA,MACzC,eAAe,KAAK,iBAAiB;AAAA,MACrC,WAAW,KAAK,aAAa;AAAA,MAC7B,aAAa,KAAK,eAAe;AAAA,IACrC,GAAG,MAAM,MAAM,eAAe,CAAC;AAAA,EACnC;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,eAAK,eAAe;AACpB;AAAA,MACR;AAAA,IACJ;AAAA,EACJ;AACJ;AACAF,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,iBAAiB,MAAM;AAC1DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,gBAAgB,MAAM;AACzDJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,mBAAmB,MAAM;AAC5DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,iBAAiB,MAAM;AAC1DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,aAAa,MAAM;AACtDJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,QAAQ,CAAC;AAChE,GAAG,qBAAqB,WAAW,eAAe,MAAM;AACxD,uBAAuBJ,YAAW;AAAA,EAC9BK,eAAc,EAAE,SAAS,GAAGC,EAAC,IAAI,eAAe,kBAAkB,CAAC;AACvE,GAAG,oBAAoB;;;ACtDvB,SAAS,iBAAAC,gBAAe,KAAAC,IAAG,SAAAC,QAAO,sBAAAC,qBAAoB,SAAAC,cAAa;AANnE,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAKA,IAAI,0BAA0B,MAAMC,iCAAgC,gBAAgB;AAAA,EAChF,cAAc;AACV,UAAM,YAAY,QAAQ;AAAA,EAC9B;AAAA,EACA,MAAM,iBAAiB;AACnB,WAAOC,OAAM,OAAO;AAAA,MAChB,eAAe,KAAK,iBAAiB;AAAA,MACrC,iBAAiB,KAAK,mBAAmB;AAAA,MACzC,WAAW,KAAK,aAAa;AAAA,MAC7B,WAAW,KAAK,aAAa;AAAA,MAC7B,aAAa,KAAK,eAAe;AAAA,IACrC,GAAG,MAAM,MAAM,eAAe,CAAC;AAAA,EACnC;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM;AAAA,QACV,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACD,eAAK,eAAe;AACpB;AAAA,MACR;AAAA,IACJ;AAAA,EACJ;AACJ;AACAF,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,wBAAwB,WAAW,iBAAiB,MAAM;AAC7DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,wBAAwB,WAAW,mBAAmB,MAAM;AAC/DJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,wBAAwB,WAAW,aAAa,MAAM;AACzDJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,wBAAwB,WAAW,aAAa,MAAM;AACzDJ,YAAW;AAAA,EACPG,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,QAAQ,CAAC;AAChE,GAAG,wBAAwB,WAAW,eAAe,MAAM;AAC3D,0BAA0BJ,YAAW;AAAA,EACjCK,eAAc,EAAE,SAAS,GAAGC,EAAC,IAAI,eAAe,qBAAqB,CAAC;AAC1E,GAAG,uBAAuB;;;ACjD1B,SAAS,oBAAAC,mBAAkB,SAAAC,QAAO,sBAAAC,qBAAoB,SAAAC,cAAa;AANnE,IAAIC,cAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAGO,IAAM,0BAAN,cAAsCJ,kBAAiB;AAAA,EAC1D,wBAAwB;AACpB,UAAM,sBAAsB;AAC5B,QAAIG,OAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,WAAK,WAAW,KAAK,sBAAsB;AAAA,IAC/C;AAAA,EACJ;AACJ;AACAC,YAAW;AAAA,EACPH,OAAM,EAAE,WAAWC,oBAAmB,KAAK,CAAC;AAChD,GAAG,wBAAwB,WAAW,YAAY,MAAM;;;ACXxD,SAAS,iBAAAG,gBAAe,KAAAC,IAAG,SAAAC,QAAO,sBAAAC,2BAA0B;;;ACD5D,SAAS,SAAAC,eAAa;;;ACNtB,SAAS,SAAAC,eAAa;AAEf,SAAS,aAAa,UAAU;AACnC,SAAO,CAAC,QAAQ,MAAM,eAAe;AACjC,UAAM,eAAe,IAAI,IAAI,IAAIA,QAAM,WAAW,CAAC;AACnD,aAAS,SAAS;AACd,aAAO,KAAK,YAAY;AAAA,IAC5B;AACA,aAAS,OAAO,KAAK;AACjB,UAAI,QAAQ,KAAK,YAAY,GAAG;AAC5B,cAAM,MAAM,KAAK,YAAY;AAC7B,aAAK,YAAY,IAAI;AACrB,iBAAS,KAAK,MAAM,MAAM,KAAK,GAAG;AAAA,MACtC;AAAA,IACJ;AAEA,WAAO,eAAe,QAAQ,MAAM;AAAA,MAChC,KAAK,WAAY;AACb,eAAO,OAAO,KAAK,IAAI;AAAA,MAC3B;AAAA,MACA,KAAK,SAAU,KAAK;AAChB,eAAO,KAAK,MAAM,GAAG;AAAA,MACzB;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,IAClB,CAAC;AAAA,EAEL;AACJ;;;AD5BA,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAIO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAAY,YAAY,CAAC,GAAG;AACxB,SAAK,YAAY;AAAA,EACrB;AAAA,EACA,OAAO,WAAW,WAAW;AACzB,QAAI,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC9B,QAAI,CAACC,QAAM,cAAc,SAAS,GAAG;AACjC,UAAI,QAAQ,UAAU;AACtB,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,YAAI,KAAK,UAAU,CAAC;AACpB,aAAK,KAAK,GAAG;AACb,aAAK,KAAK,GAAG;AACb,aAAK,KAAK,GAAG;AAAA,MACjB;AACA,UAAI,WAAW,IAAM;AACrB,WAAK,KAAK;AACV,WAAK,KAAK;AACV,WAAK,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,YAAY,WAAW;AAC1B,UAAM,SAAS;AAAA,MACX,MAAM;AAAA,MAAW,MAAM;AAAA,MAAW,MAAM;AAAA,MACxC,MAAM;AAAA,MAAW,MAAM;AAAA,MAAW,MAAM;AAAA,IAC5C;AACA,QAAI,CAACA,QAAM,cAAc,SAAS,GAAG;AACjC,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,YAAI,KAAK,UAAU,CAAC;AACpB,eAAO,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC;AACxC,eAAO,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC;AACxC,eAAO,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC;AACxC,eAAO,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC;AACxC,eAAO,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC;AACxC,eAAO,OAAO,KAAK,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,MAC5C;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,aAAa;AACT,mBAAe,KAAK,IAAI;AAAA,EAC5B;AACJ;AACA,SAAS,iBAAiB;AACtB,QAAM,KAAK;AACX,KAAG,QAAQ;AAAA;AAAA,IAAwD,kBAAkB;AAAA,EAAQ;AACjG;AACO,IAAM,eAAN,cAA2B,aAAa;AAC/C;AACAD,aAAW;AAAA,EACP,aAAa,cAAc;AAC/B,GAAG,aAAa,WAAW,aAAa,MAAM;AACvC,IAAM,eAAN,cAA2B,aAAa;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI,aAAa;AACb,WAAO,KAAK,gBAAgB,aAAa,WAAW,KAAK,SAAS;AAAA,EACtE;AAAA,EACA,IAAI,WAAW,OAAO;AAClB,SAAK,cAAc;AAAA,EACvB;AAAA,EACA,IAAI,cAAc;AACd,WAAO,KAAK,iBAAiB,aAAa,YAAY,KAAK,SAAS;AAAA,EACxE;AAAA,EACA,IAAI,YAAY,MAAM;AAClB,SAAK,eAAe;AAAA,EACxB;AAAA,EACA,IAAI,iBAAiB;AACjB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,eAAe,QAAQ;AACvB,SAAK,kBAAkB;AAAA,EAC3B;AAAA,EACA,YAAY,WAAW,iBAAiB,qBAAqB,CAAC,GAAG,UAAU,CAAC,GAAG;AAC3E,UAAM,SAAS;AACf,SAAK,kBAAkB;AACvB,SAAK,qBAAqB;AAC1B,SAAK,UAAU;AAAA,EACnB;AACJ;AACAA,aAAW;AAAA,EACP,aAAa,cAAc;AAC/B,GAAG,aAAa,WAAW,aAAa,MAAM;AAC9CA,aAAW;AAAA,EACP,aAAa,cAAc;AAC/B,GAAG,aAAa,WAAW,mBAAmB,MAAM;AACpDA,aAAW;AAAA,EACP,aAAa,cAAc;AAC/B,GAAG,aAAa,WAAW,sBAAsB,MAAM;AACvDA,aAAW;AAAA,EACP,aAAa,cAAc;AAC/B,GAAG,aAAa,WAAW,WAAW,MAAM;;;ADrG5C,IAAIE,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAOJ,IAAI,kBAAkB,oBAAoB,MAAMC,yBAAwB,wBAAwB;AAAA,EAC5F,OAAO,mBAAmB,OAAO,QAAQ,OAAO,eAAe,gBAAgB,eAAe;AAC1F,UAAM,IAAI,SAAS,GAAG,IAAI,UAAU,GAAG,IAAI,SAAS,GAAG,KAAK,iBAAiB,GAAG,KAAK,kBAAkB,GAAG,KAAK,iBAAiB;AAChI,UAAM,YAAY,CAAC;AACnB,UAAM,KAAK,CAAC;AACZ,UAAM,UAAU,CAAC;AAEjB,aAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC1B,UAAI,IAAI,IAAI,IAAM,KAAK,IAAM,MAAM,IAAM;AACzC,eAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC1B,YAAI,IAAI,CAAC,IAAI,IAAM,KAAK,IAAM,MAAM,IAAM;AAC1C,iBAAS,IAAI,GAAG,KAAK,IAAI,KAAK;AAC1B,cAAI,IAAI,CAAC,IAAI,IAAM,KAAK,IAAM,MAAM,IAAM;AAE1C,cAAI,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK;AACzD,sBAAU,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,cAAc,SAAUC,IAAGC,IAAGC,IAAG;AACjC,UAAI,UAAU;AACd,eAASC,KAAI,GAAGA,KAAI,UAAU,QAAQA,MAAK;AACvC,YAAI,KAAK,UAAUA,EAAC;AACpB,YAAI,KAAK,IAAI,GAAG,IAAIH,EAAC,IAAI,WAAW,KAAK,IAAI,GAAG,IAAIC,EAAC,IAAI,WAAW,KAAK,IAAI,GAAG,IAAIC,EAAC,IAAI;AACrF,iBAAOC;AAAA,MACf;AACA,aAAO;AAAA,IACX;AACA,QAAI,aAAa,SAAUC,MAAKC,MAAKC,MAAKC,MAAKC,IAAGC,IAAGC,SAAQC,SAAQ;AACjE,cAAQ,KAAKP,IAAG;AAChB,cAAQ,KAAKC,IAAG;AAChB,cAAQ,KAAKC,IAAG;AAChB,cAAQ,KAAKF,IAAG;AAChB,cAAQ,KAAKE,IAAG;AAChB,cAAQ,KAAKC,IAAG;AAChB,SAAG,KAAK,EAAE,GAAGC,IAAG,GAAGG,QAAO,CAAC;AAC3B,SAAG,KAAK,EAAE,GAAGD,SAAQ,GAAGC,QAAO,CAAC;AAChC,SAAG,KAAK,EAAE,GAAGD,SAAQ,GAAGD,GAAE,CAAC;AAC3B,SAAG,KAAK,EAAE,GAAGD,IAAG,GAAGG,QAAO,CAAC;AAC3B,SAAG,KAAK,EAAE,GAAGD,SAAQ,GAAGD,GAAE,CAAC;AAC3B,SAAG,KAAK,EAAE,GAAGD,IAAG,GAAGC,GAAE,CAAC;AAAA,IAC1B;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,IAAI;AACZ,UAAI,IAAI,CAAC,IAAI,IAAM,KAAK,IAAM,MAAM,IAAM;AAC1C,UAAI,SAAS,CAAC,IAAI,IAAM,KAAK,KAAO,IAAI,OAAO,IAAM;AACrD,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAI,IAAI,CAAC,IAAI,IAAO,IAAM,IAAK,KAAK,IAAM;AAC1C,YAAI,SAAS,CAAC,IAAI,IAAO,KAAO,IAAI,KAAM,KAAK,IAAM;AAErD,YAAI,MAAM,YAAY,GAAG,GAAG,MAAM;AAClC,YAAI,MAAM,YAAY,QAAQ,GAAG,MAAM;AACvC,YAAI,MAAM,YAAY,QAAQ,GAAG,CAAC;AAClC,YAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC7B,YAAI,SAAU,KAAO,IAAI,MAAO,IAAM;AACtC,YAAI,IAAK,IAAM,KAAM,IAAM;AAC3B,YAAI,SAAS,IAAO,KAAO,IAAI,MAAO,IAAM;AAC5C,YAAI,IAAI,IAAO,IAAM,KAAM,IAAM;AACjC,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,MACvD;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,IAAI,IAAO,IAAM,IAAK,KAAK,IAAM;AACzC,UAAI,SAAS,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAC9C,UAAI,IAAI,CAAC,IAAI;AACb,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAI,IAAI,IAAI,IAAM,IAAM,IAAI,KAAK,IAAM;AACvC,YAAI,SAAS,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAE9C,YAAI,MAAM,YAAY,GAAG,QAAQ,CAAC;AAClC,YAAI,MAAM,YAAY,QAAQ,QAAQ,CAAC;AACvC,YAAI,MAAM,YAAY,QAAQ,GAAG,CAAC;AAClC,YAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC7B,YAAI,UAAU,IAAI,MAAQ,IAAM;AAChC,YAAI,IAAK,IAAM,KAAM,IAAM;AAC3B,YAAI,SAAS,KAAO,IAAI,MAAQ,IAAM;AACtC,YAAI,IAAI,IAAM,IAAM,KAAK,IAAM;AAC/B,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,MACvD;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,IAAI,IAAO,IAAM,IAAK,KAAK,IAAM;AACzC,UAAI,SAAS,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAC9C,UAAI,IAAI,CAAC,IAAI;AACb,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAI,IAAI,CAAC,IAAI,IAAM,IAAI,KAAK,IAAM;AAClC,YAAI,SAAS,CAAC,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAE/C,YAAI,MAAM,YAAY,GAAG,QAAQ,CAAC;AAClC,YAAI,MAAM,YAAY,GAAG,QAAQ,MAAM;AACvC,YAAI,MAAM,YAAY,GAAG,GAAG,MAAM;AAClC,YAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC7B,YAAI,UAAU,IAAI,MAAQ,IAAM;AAChC,YAAI,IAAK,IAAM,KAAM,IAAM;AAC3B,YAAI,SAAS,KAAO,IAAI,MAAQ,IAAM;AACtC,YAAI,IAAI,IAAM,KAAK,IAAM;AACzB,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,MACvD;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,IAAI,IAAM,IAAI,KAAK,IAAM;AACjC,UAAI,SAAS,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAC9C,UAAI,IAAI,IAAI;AACZ,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAI,IAAI,CAAC,IAAI,IAAM,IAAI,KAAK,IAAM;AAClC,YAAI,SAAS,CAAC,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAE/C,YAAI,MAAM,YAAY,GAAG,QAAQ,CAAC;AAClC,YAAI,MAAM,YAAY,QAAQ,QAAQ,CAAC;AACvC,YAAI,MAAM,YAAY,QAAQ,GAAG,CAAC;AAClC,YAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC7B,YAAI,UAAU,IAAI,MAAQ,IAAM;AAChC,YAAI,IAAK,IAAM,KAAM,IAAM;AAC3B,YAAI,SAAS,KAAO,IAAI,MAAQ,IAAM;AACtC,YAAI,IAAI,IAAO,IAAM,KAAM,IAAM;AACjC,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,MACvD;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,IAAI,IAAM,IAAI,KAAK,IAAM;AACjC,UAAI,SAAS,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAC9C,UAAI,IAAI,IAAI;AACZ,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAI,IAAI,IAAI,IAAM,IAAI,KAAK,IAAM;AACjC,YAAI,SAAS,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAE9C,YAAI,MAAM,YAAY,GAAG,QAAQ,CAAC;AAClC,YAAI,MAAM,YAAY,GAAG,QAAQ,MAAM;AACvC,YAAI,MAAM,YAAY,GAAG,GAAG,MAAM;AAClC,YAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC7B,YAAI,UAAU,IAAI,MAAQ,IAAM;AAChC,YAAI,IAAK,IAAM,KAAM,IAAM;AAC3B,YAAI,SAAS,KAAO,IAAI,MAAQ,IAAM;AACtC,YAAI,IAAI,IAAO,IAAM,KAAM,IAAM;AACjC,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,MACvD;AAAA,IACJ;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,UAAI,IAAI,CAAC,IAAI;AACb,UAAI,IAAI,IAAI,IAAM,IAAI,KAAK,IAAM;AACjC,UAAI,SAAS,IAAI,IAAM,KAAK,IAAI,MAAQ,IAAM;AAC9C,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAI,IAAI,CAAC,IAAI,IAAM,IAAI,KAAK,IAAM;AAClC,YAAI,SAAS,CAAC,IAAI,KAAO,IAAI,KAAO,KAAK,IAAM;AAE/C,YAAI,MAAM,YAAY,GAAG,GAAG,MAAM;AAClC,YAAI,MAAM,YAAY,QAAQ,GAAG,MAAM;AACvC,YAAI,MAAM,YAAY,QAAQ,GAAG,CAAC;AAClC,YAAI,MAAM,YAAY,GAAG,GAAG,CAAC;AAC7B,YAAI,UAAU,IAAI,MAAQ,IAAM;AAChC,YAAI,IAAK,IAAM,KAAM,IAAM;AAC3B,YAAI,SAAS,KAAO,IAAI,MAAQ,IAAM;AACtC,YAAI,IAAI,IAAO,IAAM,KAAM,IAAM;AACjC,mBAAW,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,MACvD;AAAA,IACJ;AACA,UAAM,OAAO,IAAI,aAAa,WAAW,SAAS,EAAE;AACpD,SAAK,MAAM,OAAO,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,aAAa,KAAK,cAAc,KAAK,aAAa;AACjG,8BAA0B,IAAI;AAC9B,UAAM,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAClC,UAAM,KAAK,QAAQ,GAAG,KAAK,SAAS,GAAG,KAAK,QAAQ;AAEpD,SAAK,aAAa;AAClB,SAAK,cAAc,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,GAAG;AACnF,SAAK,iBAAiB,EAAE,QAAQ,QAAQ,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE;AAEvG,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,WAAO,kBAAkB,mBAAmB;AAAA,EAChD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,kBAAkB,mBAAmB,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,eAAe,KAAK,gBAAgB,KAAK,aAAa;AACrJ;AAAA,IACR;AAAA,EACJ;AACJ;AACAX,aAAW;AAAA,EACPc,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,SAAS,MAAM;AAC7Cf,aAAW;AAAA,EACPc,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,UAAU,MAAM;AAC9Cf,aAAW;AAAA,EACPc,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,SAAS,MAAM;AAC7Cf,aAAW;AAAA,EACPc,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,iBAAiB,MAAM;AACrDf,aAAW;AAAA,EACPc,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,kBAAkB,MAAM;AACtDf,aAAW;AAAA,EACPc,OAAM,EAAE,MAAM,OAAO,WAAWC,oBAAmB,OAAO,CAAC;AAC/D,GAAG,gBAAgB,WAAW,iBAAiB,MAAM;AACrD,kBAAkB,oBAAoBf,aAAW;AAAA,EAC7CgB,eAAc,EAAE,SAASC,KAAI,MAAM,kBAAkB,iBAAiB,CAAC;AAC3E,GAAG,eAAe;;;AGzNlB,SAAS,iBAAAC,gBAAe,KAAAC,IAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAP5D,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAOJ,IAAI,mBAAmB,qBAAqB,MAAMC,0BAAyB,wBAAwB;AAAA,EAC/F,OAAO,mBAAmB,SAAS,GAAG,SAAS,GAAG,QAAQ,IAAI,iBAAiB,GAAG,cAAc,GAAG;AAC/F,UAAM,IAAI;AACV,UAAM,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;AACtC,UAAM,QAAQ,WAAW,MAAQ;AACjC,UAAM,QAAQ,IAAI;AAClB,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,IAAM;AAEjB,UAAM,KAAK,EAAE,GAAG,GAAI,GAAG,QAAQ,GAAG,EAAG,CAAC;AAGtC,aAAS,IAAI,GAAG,KAAK,gBAAgB,KAAK;AACtC,YAAM,IAAI,SAAS,KAAK;AACxB,YAAM,IAAI,IAAI;AACd,YAAM,MAAM,SAAS,KAAK;AAE1B,YAAM,SAAS,IAAI;AACnB,YAAM,SAAS,SAAS;AACxB,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,cAAM,QAAQ,QAAQ;AACtB,cAAM,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI;AACvD,cAAM,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;AACtB,cAAM,QAAQ,IAAI,SAAS,IAAI,KAAK;AACpC,cAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ,IAAI,QAAQ;AACxD,cAAM,IAAI,IAAI;AACd,cAAM,SAAS,KAAK,IAAK,IAAI,KAAM,MAAM,IAAI;AAC7C,YAAI,KAAK,GAAG;AAGR,kBAAQ,KAAK,GAAG,YAAY,KAAK;AACjC,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAC3D;AAAA,QACJ;AACA,cAAM,gBAAgB,IAAI,SAAS,IAAI,KAAK;AAC5C,cAAM,qBAAqB,KAAK,IAAI,gBAAgB,QAAQ,IAAI,gBAAgB;AAEhF,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,gBAAQ,KAAK,GAAG,GAAG,CAAC;AACpB,gBAAQ,KAAK,GAAG,GAAG,CAAC;AACpB,cAAM,MAAM,EAAE,GAAG,QAAQ,GAAG,OAAO;AACnC,cAAM,MAAM,EAAE,GAAG,QAAQ,GAAG,EAAE;AAC9B,cAAM,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE;AACzB,cAAM,MAAM,EAAE,GAAG,GAAG,GAAG,OAAO;AAC9B,WAAG,KAAK,KAAK,KAAK,GAAG;AACrB,WAAG,KAAK,KAAK,KAAK,GAAG;AAAA,MACzB;AAAA,IACJ;AAEA,UAAM,gBAAgB,KAAK,iBAAiB,KAAK;AAEjD,UAAM,KAAK,EAAE,GAAG,GAAI,GAAG,GAAG,GAAG,EAAG,CAAC;AACjC,UAAM,cAAc,gBAAgB;AAEpC,aAAS,IAAI,GAAG,KAAK,aAAa,KAAK;AACnC,YAAM,UAAU,IAAI;AACpB,YAAM,KAAK,SAAS;AAEpB,YAAM,gBAAgB,IAAI,KAAK;AAC/B,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,cAAM,QAAQ,QAAQ,GAAG,MAAM,KAAK,IAAI,KAAK,GAAG,MAAM,KAAK,IAAI,KAAK;AACpE,cAAM,aAAa,QAAQ,OAAO,WAAW,KAAK,IAAI,UAAU,GAAG,WAAW,KAAK,IAAI,UAAU;AACjG,cAAM,IAAI,OAAM,IAAI,MAAM,UAAU,IAAI,OAAM,IAAI,MAAM;AACxD,cAAM,SAAS,OAAM,IAAI,WAAW,UAAU,SAAS,OAAM,IAAI,WAAW;AAC5E,YAAI,OAAO;AACX,YAAI,KAAK,aAAa;AAClB,gBAAM,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI;AACvD,gBAAM,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACzB,kBAAQ,cAAc,KAAK,IAAI,KAAK,QAAQ;AAC5C,uBAAa,KAAK,IAAI,QAAQ,QAAQ,IAAI,QAAQ;AAAA,QACtD,OACK;AACD,kBAAQ,gBAAgB;AACxB,uBAAa,KAAK,IAAI,gBAAgB,QAAQ,IAAI,QAAQ;AAAA,QAC9D;AACA,YAAI,KAAK,GAAG;AAGR,kBAAQ,KAAK,aAAa,OAAO,UAAU;AAC3C,aAAG,KAAK,EAAE,GAAG,KAAI,GAAG,IAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC;AAClE;AAAA,QACJ;AACA,cAAM,YAAY,OAAM,IAAI,MAAM,eAAe,YAAY,OAAM,IAAI,MAAM;AAC7E,cAAM,iBAAiB,OAAM,IAAI,WAAW,eAAe,iBAAiB,OAAM,IAAI,WAAW;AACjG,cAAM,gBAAgB,cAAc,KAAK,IAAI,KAAK,QAAQ;AAC1D,cAAM,qBAAqB,KAAK,IAAI,gBAAgB,QAAQ,IAAI,gBAAgB;AAEhF,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,cAAM,IAAI;AACV,gBAAQ,KAAK,GAAG,GAAG,CAAC;AACpB,gBAAQ,KAAK,GAAG,GAAG,CAAC;AACpB,cAAM,MAAM,EAAE,GAAG,gBAAgB,GAAG,eAAe;AACnD,cAAM,MAAM,EAAE,GAAG,QAAQ,GAAG,OAAO;AACnC,cAAM,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE;AACzB,cAAM,MAAM,EAAE,GAAG,WAAW,GAAG,UAAU;AACzC,WAAG,KAAK,KAAK,KAAK,GAAG;AACrB,WAAG,KAAK,KAAK,KAAK,GAAG;AAAA,MACzB;AAAA,IACJ;AAEA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,EAAE;AAChD,SAAK,MAAM,QAAQ,MAAM,IAAI,MAAM,KAAK,KAAK,KAAK,cAAc,KAAK,WAAW;AAChF,8BAA0B,IAAI;AAE9B,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,WAAO,mBAAmB,mBAAmB;AAAA,EACjD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,mBAAmB,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,KAAK,gBAAgB,KAAK,WAAW;AACjI;AAAA,IACR;AAAA,EACJ;AACJ;AACAD,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,iBAAiB,WAAW,UAAU,MAAM;AAC/CH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,iBAAiB,WAAW,UAAU,MAAM;AAC/CH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,iBAAiB,WAAW,SAAS,MAAM;AAC9CH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,iBAAiB,WAAW,kBAAkB,MAAM;AACvDH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,iBAAiB,WAAW,eAAe,MAAM;AACpD,mBAAmB,qBAAqBH,aAAW;AAAA,EAC/CI,eAAc,EAAE,SAASC,KAAI,MAAM,kBAAkB,kBAAkB,CAAC;AAC5E,GAAG,gBAAgB;;;ACtJnB,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAP5D,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAOJ,IAAI,uBAAuB,yBAAyB,MAAMC,8BAA6B,wBAAwB;AAAA,EAC3G,OAAO,mBAAmB,SAAS,GAAG,SAAS,GAAG,QAAQ,IAAI,iBAAiB,GAAG,cAAc,GAAG;AAC/F,UAAM,IAAI;AACV,UAAM,QAAQ,CAAC,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;AACtC,UAAM,QAAQ,WAAW,MAAQ;AAEjC,UAAM,KAAK,EAAE,GAAG,GAAI,GAAG,QAAQ,GAAG,EAAG,CAAC;AACtC,UAAM,KAAK,EAAE,GAAG,GAAI,GAAG,GAAI,GAAG,EAAG,CAAC;AAGlC,UAAM,YAAY,IAAI;AACtB,aAAS,IAAI,GAAG,KAAK,aAAa,KAAK;AAEnC,UAAI,MAAM,YAAY;AACtB,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,cAAM,aAAa,IAAI,IAAI,SAAS,IAAI;AACxC,cAAM,IAAI,KAAK,IAAI,aAAa,KAAK,QAAQ,KAAK,aAAa,KAAK,IAAI;AACxE,cAAM,IAAI,aAAa,IAAI;AAC3B,cAAM,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC5B,cAAM,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC;AAC7B,cAAM,SAAS,KAAK,IAAI,SAAS,IAAI,EAAI;AACzC,cAAM,SAAS,CAAC,KAAK,IAAI,SAAS,IAAI,EAAI;AAC1C,cAAMC,KAAI,MAAM;AAChB,cAAMC,KAAI,MAAM;AAChB,cAAM,WAAW,EAAE,GAAAD,IAAG,GAAG,QAAQ,GAAAC,GAAE;AACnC,cAAM,cAAc,EAAE,GAAAD,IAAG,GAAG,GAAI,GAAAC,GAAE;AAElC,cAAM,KAAK,QAAQ;AACnB,cAAM,KAAK,WAAW;AAEtB,cAAM,SAAS,MAAK,MAAM;AAC1B,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,SAAS;AACpB,cAAM,KAAK,SAAS;AACpB,YAAI,KAAK,GAAG;AACR,gBAAM,iBAAiB,CAAC,GAAmB,GAAG,CAAC;AAC/C,gBAAM,oBAAoB,CAAC,GAAsB,IAAI,GAAG,IAAI,CAAC;AAE7D,gBAAM,QAAQ;AAAA,YACV,EAAE,GAAG,KAAI,GAAG,IAAG;AAAA,YACf,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AAAA,YACzB,EAAE,GAAG,MAAM,IAAI,GAAG,MAAK,GAAG;AAAA,UAC9B;AACA,gBAAM,WAAW;AAAA,YACb,EAAE,GAAG,KAAI,GAAG,IAAG;AAAA,YACf,EAAE,GAAG,MAAM,IAAI,GAAG,MAAK,GAAG;AAAA,YAC1B,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AAAA,UAC7B;AAEA,kBAAQ,KAAK,GAAG,cAAc;AAC9B,kBAAQ,KAAK,GAAG,iBAAiB;AAEjC,mBAASC,KAAI,GAAGA,KAAI,MAAM,QAAQA;AAC9B,eAAG,KAAK,MAAMA,EAAC,CAAC;AACpB,mBAASA,KAAI,GAAGA,KAAI,SAAS,QAAQA;AACjC,eAAG,KAAK,SAASA,EAAC,CAAC;AAAA,QAC3B,OACK;AACD,gBAAM,qBAAqB,IAAI,IAAI,SAAS,IAAI;AAChD,gBAAM,IAAI,KAAK,IAAI,qBAAqB,KAAK,QAAQ,KAAK,qBAAqB,KAAK,IAAI;AACxF,gBAAM,IAAI,qBAAqB,IAAI;AAEnC,gBAAM,UAAU,QAAO,IAAI,KAAO;AAClC,gBAAM,KAAK,IAAI;AACf,gBAAM,KAAK,IAAI;AACf,gBAAM,KAAK,SAAS;AACpB,gBAAM,KAAK,SAAS;AACpB,gBAAM,MAAM,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACrC,gBAAM,MAAM,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACrC,gBAAM,MAAM,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACrC,gBAAM,MAAM,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACrC,gBAAM,OAAO,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACtC,gBAAM,OAAO,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACtC,gBAAM,OAAO,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AACtC,gBAAM,OAAO,EAAE,GAAG,MAAK,IAAI,GAAG,MAAK,GAAG;AAEtC,kBAAQ,KAAK,CAAC;AACd,kBAAQ,KAAK,CAAC;AACd,kBAAQ,KAAK,CAAC;AACd,kBAAQ,KAAK,CAAC;AACd,kBAAQ,KAAK,CAAC;AACd,kBAAQ,KAAK,CAAC;AAEd,kBAAQ,KAAK,IAAI,CAAC;AAClB,kBAAQ,KAAK,IAAI,CAAC;AAClB,kBAAQ,KAAK,IAAI,CAAC;AAClB,kBAAQ,KAAK,IAAI,CAAC;AAClB,kBAAQ,KAAK,IAAI,CAAC;AAClB,kBAAQ,KAAK,IAAI,CAAC;AAElB,aAAG,KAAK,GAAG;AACX,aAAG,KAAK,GAAG;AACX,aAAG,KAAK,GAAG;AACX,aAAG,KAAK,GAAG;AACX,aAAG,KAAK,GAAG;AACX,aAAG,KAAK,GAAG;AAEX,aAAG,KAAK,IAAI;AACZ,aAAG,KAAK,IAAI;AACZ,aAAG,KAAK,IAAI;AACZ,aAAG,KAAK,IAAI;AACZ,aAAG,KAAK,IAAI;AACZ,aAAG,KAAK,IAAI;AAAA,QAChB;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,iBAAiB,IAAI,IAAI,QAAS;AACxC,UAAM,eAAe,IAAI,IAAI,SAAS,cAAc;AACpD,UAAM,KAAK,IAAM;AACjB,UAAM,KAAK,IAAM;AACjB,aAAS,IAAI,GAAG,KAAK,gBAAgB,KAAK;AACtC,eAASA,KAAI,GAAGA,KAAI,OAAOA,MAAK;AAC5B,YAAI,KAAK,gBAAgB;AACrB,cAAI,IAAI,IAAI,KAAK,IAAI,QAAQA,EAAC;AAC9B,cAAI,IAAI,CAAC,IAAI,KAAK,IAAI,QAAQA,EAAC;AAC/B,cAAI,IAAK,SAAS,IAAK;AAEvB,gBAAM,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;AAAA,QAC1B;AACA,cAAM,SAASA,MAAK,IAAI,QAAQ,IAAIA,KAAI;AACxC,cAAM,IAAI,KAAK,IAAI,eAAe,IAAI,SAAS,IAAI,iBAAiB,SAAS,IAAI,KAAK;AACtF,cAAM,IAAI,KAAK,IAAI,eAAe,IAAIA,KAAI,IAAI,iBAAiB,SAAS,IAAI,KAAKA;AACjF,cAAM,IAAI,KAAK,iBAAiB,eAAe,IAAIA,KAAI,iBAAiB,SAAS,IAAI,KAAKA;AAC1F,cAAM,IAAI,KAAK,iBAAiB,eAAe,IAAI,SAAS,iBAAiB,SAAS,IAAI,KAAK;AAC/F,cAAM,SAAS,SAAS;AACxB,cAAM,UAAU,IAAI,KAAK;AACzB,cAAM,IAAIA,MAAK,IAAI,IAAMA,KAAI;AAC7B,cAAM,IAAI,IAAI;AACd,cAAM,MAAM,EAAE,GAAG,QAAQ,GAAG,OAAO;AACnC,cAAM,MAAM,EAAE,GAAG,GAAG,GAAG,OAAO;AAC9B,cAAM,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE;AACzB,cAAM,MAAM,EAAE,GAAG,QAAQ,GAAG,EAAE;AAC9B,gBAAQ,KAAK,CAAC;AACd,gBAAQ,KAAK,CAAC;AACd,gBAAQ,KAAK,CAAC;AACd,gBAAQ,KAAK,CAAC;AACd,gBAAQ,KAAK,CAAC;AACd,gBAAQ,KAAK,CAAC;AAEd,WAAG,KAAK,GAAG;AACX,WAAG,KAAK,GAAG;AACX,WAAG,KAAK,GAAG;AACX,WAAG,KAAK,GAAG;AACX,WAAG,KAAK,GAAG;AACX,WAAG,KAAK,GAAG;AAAA,MACf;AAAA,IACJ;AAEA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,EAAE;AAChD,SAAK,MAAM,YAAY,MAAM,IAAI,MAAM,KAAK,KAAK,KAAK,cAAc,KAAK,WAAW;AACpF,8BAA0B,IAAI;AAE9B,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,WAAO,uBAAuB,mBAAmB;AAAA,EACrD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,uBAAuB,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,KAAK,gBAAgB,KAAK,WAAW;AACrI;AAAA,IACR;AAAA,EACJ;AACJ;AACAJ,aAAW;AAAA,EACPK,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,UAAU,MAAM;AACnDN,aAAW;AAAA,EACPK,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,UAAU,MAAM;AACnDN,aAAW;AAAA,EACPK,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,SAAS,MAAM;AAClDN,aAAW;AAAA,EACPK,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,kBAAkB,MAAM;AAC3DN,aAAW;AAAA,EACPK,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,qBAAqB,WAAW,eAAe,MAAM;AACxD,uBAAuB,yBAAyBN,aAAW;AAAA,EACvDO,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,sBAAsB,CAAC;AAChF,GAAG,oBAAoB;;;ACpMvB,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAP5D,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAMJ,IAAM,eAAe,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AAChE,IAAI,mBAAmB,qBAAqB,MAAMC,0BAAyB,wBAAwB;AAAA,EAC/F,OAAO,mBAAmB,WAAW;AACjC,WAAO,IAAI,aAAa,aAAa,YAAY;AAAA,EACrD;AAAA,EACA,wBAAwB;AACpB,WAAO,mBAAmB,mBAAmB;AAAA,EACjD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,aAAK,WAAW,mBAAmB,mBAAmB,GAAG;AACzD;AAAA,IACR;AAAA,EACJ;AACJ;AACAD,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,KAAK,CAAC;AAC7D,GAAG,iBAAiB,WAAW,aAAa,MAAM;AAClD,mBAAmB,qBAAqBH,aAAW;AAAA,EAC/CI,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,kBAAkB,CAAC;AAC5E,GAAG,gBAAgB;;;AC3BnB,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAC5D,SAAS,YAAAC,iBAAgB;AARzB,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAOJ,IAAI,oBAAoB,sBAAsB,MAAMC,2BAA0B,wBAAwB;AAAA,EAClG,OAAO,mBAAmB,OAAO,QAAQ,eAAe,gBAAgB;AACpE,cAAU;AACV,eAAW;AACX,sBAAkB;AAClB,uBAAmB;AACnB,UAAM,YAAY,QAAQ,KAAI,aAAa,SAAS;AACpD,UAAM,QAAQ,CAAC;AACf,UAAM,KAAK,CAAC;AACZ,UAAM,UAAU,CAAC;AACjB,UAAM,UAAU,CAAC,GAAG,SAASC,UAAS,cAAc,SAAS,KAAK,GAAG,GAAG,CAAC;AACzE,aAAS,IAAI,GAAG,KAAK,gBAAgB,KAAK;AACtC,eAAS,IAAI,GAAG,KAAK,eAAe,KAAK;AACrC,cAAM,IAAI,CAAC,YAAY,IAAI,SAAS,IAAM;AAC1C,cAAM,IAAI;AACV,cAAM,IAAI,CAAC,aAAa,IAAI,UAAU,IAAM;AAC5C,cAAM,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;AACtB,YAAI,IAAI,kBAAkB,IAAI,eAAe;AACzC,gBAAM,YAAY,gBAAgB;AAElC,gBAAM,UAAU,IAAI,MAAQ,IAAM;AAClC,gBAAM,IAAK,IAAM,KAAM,IAAM;AAC7B,gBAAM,SAAS,KAAO,IAAI,MAAQ,IAAM;AACxC,gBAAM,IAAI,IAAO,IAAM,KAAM,IAAM;AACnC,kBAAQ,MAAM,IAAI,KAAK,YAAY,CAAC;AACpC,kBAAQ,MAAM,IAAI,KAAK,YAAY,IAAI,CAAC;AACxC,kBAAQ,KAAK,IAAI,YAAY,IAAI,CAAC;AAClC,kBAAQ,MAAM,IAAI,KAAK,YAAY,CAAC;AACpC,kBAAQ,KAAK,IAAI,YAAY,IAAI,CAAC;AAClC,kBAAQ,KAAK,IAAI,YAAY,CAAC;AAC9B,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC;AAC3B,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC;AAChC,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC;AAC3B,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACtB,kBAAQ,KAAK,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QAC/D;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,IAAI,OAAO;AACzD,SAAK,MAAM,SAAS,KAAK,IAAI,MAAM,KAAK,aAAa,KAAK,cAAc;AAExE,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,WAAO,oBAAoB,mBAAmB;AAAA,EAClD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,oBAAoB,mBAAmB,KAAK,OAAO,KAAK,QAAQ,KAAK,eAAe,KAAK,cAAc;AACvH;AAAA,IACR;AAAA,EACJ;AACJ;AACAF,aAAW;AAAA,EACPG,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,SAAS,MAAM;AAC/CJ,aAAW;AAAA,EACPG,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,UAAU,MAAM;AAChDJ,aAAW;AAAA,EACPG,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,iBAAiB,MAAM;AACvDJ,aAAW;AAAA,EACPG,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,kBAAkB,MAAM;AACxD,oBAAoB,sBAAsBJ,aAAW;AAAA,EACjDK,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,mBAAmB,CAAC;AAC7E,GAAG,iBAAiB;;;AChFpB,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAE5D,SAAS,YAAAC,iBAAgB;AATzB,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAAJ,IAA+B;AAA/B,IAAyD;AAAzD,IAAmF;AAAnF,IAA8G;AAS9G,IAAM,SAAS;AAAA,EACX,aAAa,SAAU,OAAO;AAC1B,UAAM,UAAU;AAChB,QAAI,QAAQ,QAAQ,KAAK,KAAK;AAC9B,UAAM,MAAM,CAAC;AACb,WAAO,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,CAAC;AACjB,YAAM,IAAI,WAAW,CAAC;AACtB,UAAI,KAAK,CAAC;AACV,cAAQ,MAAM,QAAQ,GAAG,EAAE;AAC3B,cAAQ,QAAQ,KAAK,KAAK;AAAA,IAC9B;AACA,WAAO;AAAA,EACX;AACJ;AACA,IAAM,UAAUC,UAAS,cAAc;AAChC,IAAM,oBAAN,cAAgC,wBAAwB;AAAA,EAC3D,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,SAAS,UAAU;AACnB,WAAK,oBAAoB,GAAG;AAAA,IAChC;AAAA,EACJ;AAAA,EACA,oBAAoB,QAAQ;AACxB,SAAK,WAAW,KAAK,mBAAmB,SAAS,IAAK,SAAS,CAAG;AAAA,EACtE;AAAA,EACA,wBAAwB;AACpB,WAAO,KAAK,mBAAmB,CAAG;AAAA,EACtC;AACJ;AACAD,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,UAAU,MAAM;AAEhD,IAAI,0BAA0B,4BAA4B,MAAMC,iCAAgC,kBAAkB;AAAA,EAC9G,OAAO,mBAAmB,QAAQ;AAC9B,eAAW;AACX,UAAM,oBAAoB;AAC1B,UAAM,eAAe,kBAAkB,MAAM,GAAG;AAChD,UAAM,QAAQ,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,YAAM,cAAc,aAAa,CAAC;AAClC,YAAM,OAAO,OAAO,YAAY,WAAW;AAC3C,YAAM,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC;AAAA,IAChF;AACA,UAAM,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACnD,UAAM,sBAAsB;AAC5B,UAAM,gBAAgB,oBAAoB,MAAM,GAAG;AACnD,UAAM,aAAa,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC;AACxD,UAAM,KAAK,CAAC;AACZ,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,YAAM,MAAM,WAAW,CAAC;AACxB,YAAM,WAAW,OAAO,YAAY,cAAc,GAAG,CAAC;AACtD,SAAG,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC;AAAA,IAC9C;AACA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,EAAE;AAChD,SAAK,MAAM,eAAe,MAAM;AAChC,8BAA0B,IAAI;AAE9B,SAAK,iBAAiB,EAAE,QAAQ,QAAQ,KAAK,GAAG,OAAO;AACvD,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,SAAS,KAAK,QAAQ;AACrC,WAAO,0BAA0B,mBAAmB,MAAM;AAAA,EAC9D;AACJ;AACA,0BAA0B,4BAA4BJ,aAAW;AAAA,EAC7DK,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,yBAAyB,CAAC;AACnF,GAAG,uBAAuB;AAI1B,IAAI,yBAAyB,2BAA2B,MAAMC,gCAA+B,kBAAkB;AAAA,EAC3G,OAAO,mBAAmB,QAAQ;AAC9B,eAAW;AAEX,UAAM,oBAAoB;AAC1B,UAAM,UAAU,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACvF,UAAM,sBAAsB;AAC5B,UAAM,aAAa,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AAExG,UAAM,eAAe,kBAAkB,MAAM,GAAG;AAChD,UAAM,QAAQ,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,YAAM,cAAc,aAAa,CAAC;AAClC,YAAM,OAAO,OAAO,YAAY,WAAW;AAC3C,YAAM,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC;AAAA,IAChF;AACA,UAAM,gBAAgB,oBAAoB,MAAM,GAAG;AACnD,UAAM,KAAK,CAAC;AACZ,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,YAAM,MAAM,WAAW,CAAC;AACxB,YAAM,WAAW,OAAO,YAAY,cAAc,GAAG,CAAC;AACtD,SAAG,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC;AAAA,IAC9C;AACA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,EAAE;AAChD,SAAK,MAAM,cAAc,MAAM;AAC/B,8BAA0B,IAAI;AAE9B,SAAK,iBAAiB,EAAE,QAAQ,QAAQ,KAAK,GAAG,OAAO;AACvD,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,SAAS,KAAK,QAAQ;AACrC,WAAO,yBAAyB,mBAAmB,MAAM;AAAA,EAC7D;AACJ;AACA,yBAAyB,2BAA2BC,aAAW;AAAA,EAC3DC,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,wBAAwB,CAAC;AAClF,GAAG,sBAAsB;AAIzB,IAAI,yBAAyB,2BAA2B,MAAMC,gCAA+B,kBAAkB;AAAA,EAC3G,OAAO,mBAAmB,QAAQ;AAC9B,eAAW;AACX,UAAM,YAAY,IAAM,KAAK,KAAK,CAAG;AACrC,UAAM,IAAI,IAAM,SAAS;AACzB,UAAM,OAAO,gBAAgB,mBAAmB,GAAG,GAAG,CAAC;AACvD,SAAK,MAAM,cAAc,MAAM;AAC/B,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,SAAS,KAAK,QAAQ;AACrC,WAAO,yBAAyB,mBAAmB,MAAM;AAAA,EAC7D;AACJ;AACA,yBAAyB,2BAA2BC,aAAW;AAAA,EAC3DC,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,wBAAwB,CAAC;AAClF,GAAG,sBAAsB;AAIzB,IAAI,0BAA0B,4BAA4B,MAAMC,iCAAgC,kBAAkB;AAAA,EAC9G,OAAO,mBAAmB,QAAQ;AAC9B,eAAW;AACX,UAAM,oBAAoB;AAC1B,UAAM,UAAU;AAAA,MAAC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACvD;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACjC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAClC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MACtC;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,IAAE;AACjC,UAAM,sBAAsB;AAe5B,UAAM,aAAa;AAAA,MAAC;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5D;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC3C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC3C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC3C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,IAAE;AAE9C,UAAM,eAAe,kBAAkB,MAAM,GAAG;AAChD,UAAM,QAAQ,CAAC;AACf,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC1C,YAAM,cAAc,aAAa,CAAC;AAClC,YAAM,OAAO,OAAO,YAAY,WAAW;AAC3C,YAAM,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,OAAO,CAAC;AAAA,IAChF;AACA,UAAM,gBAAgB,oBAAoB,MAAM,GAAG;AACnD,UAAM,KAAK,CAAC;AACZ,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,YAAM,MAAM,WAAW,CAAC;AACxB,YAAM,WAAW,OAAO,YAAY,cAAc,GAAG,CAAC;AACtD,SAAG,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC;AAAA,IAC9C;AACA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,EAAE;AAChD,SAAK,MAAM,eAAe,MAAM;AAChC,8BAA0B,IAAI;AAE9B,SAAK,iBAAiB,EAAE,QAAQ,QAAQ,KAAK,GAAG,OAAO;AACvD,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,SAAS,KAAK,QAAQ;AACrC,WAAO,0BAA0B,mBAAmB,MAAM;AAAA,EAC9D;AACJ;AACA,0BAA0B,4BAA4BC,aAAW;AAAA,EAC7DC,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,yBAAyB,CAAC;AACnF,GAAG,uBAAuB;AAI1B,IAAI,2BAA2B,6BAA6B,MAAMC,kCAAiC,kBAAkB;AAAA,EACjH,OAAO,mBAAmB,QAAQ;AAC9B,eAAW;AACX,UAAM,KAAK,QAAQ,KAAK,WAAW,QAAQ,WAAW,QAAQ,IAAI,MAAM;AACxE,UAAM,KAAK,QAAQ,KAAK,YAAY,QAAQ,WAAW,QAAQ,IAAI,MAAM;AACzE,UAAM,KAAK,QAAQ,KAAK,UAAU,QAAQ,UAAU,QAAQ,WAAW,MAAM;AAC7E,UAAM,KAAK,QAAQ,KAAK,IAAI,QAAQ,WAAW,QAAQ,YAAY,MAAM;AACzE,UAAM,KAAK,QAAQ,KAAK,WAAW,QAAQ,UAAU,QAAQ,WAAW,MAAM;AAC9E,UAAM,KAAK,QAAQ,KAAK,WAAW,QAAQ,UAAU,QAAQ,UAAU,MAAM;AAC7E,UAAM,KAAK,QAAQ,KAAK,IAAI,QAAQ,WAAW,QAAQ,WAAW,MAAM;AACxE,UAAM,KAAK,QAAQ,KAAK,UAAU,QAAQ,UAAU,QAAQ,UAAU,MAAM;AAC5E,UAAM,KAAK,QAAQ,KAAK,WAAW,QAAQ,IAAI,QAAQ,YAAY,MAAM;AACzE,UAAM,MAAM,QAAQ,KAAK,WAAW,QAAQ,IAAI,QAAQ,WAAW,MAAM;AACzE,UAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,YAAY,QAAQ,WAAW,MAAM;AAC1E,UAAM,MAAM,QAAQ,KAAK,UAAU,QAAQ,WAAW,QAAQ,UAAU,MAAM;AAC9E,UAAM,MAAM,QAAQ,KAAK,UAAU,QAAQ,WAAW,QAAQ,WAAW,MAAM;AAC/E,UAAM,MAAM,QAAQ,KAAK,WAAW,QAAQ,YAAY,QAAQ,IAAI,MAAM;AAC1E,UAAM,MAAM,QAAQ,KAAK,WAAW,QAAQ,WAAW,QAAQ,UAAU,MAAM;AAC/E,UAAM,MAAM,QAAQ,KAAK,YAAY,QAAQ,YAAY,QAAQ,IAAI,MAAM;AAC3E,UAAM,MAAM,QAAQ,KAAK,IAAI,QAAQ,YAAY,QAAQ,YAAY,MAAM;AAC3E,UAAM,MAAM,QAAQ,KAAK,WAAW,QAAQ,WAAW,QAAQ,WAAW,MAAM;AAChF,UAAM,MAAM,QAAQ,KAAK,YAAY,QAAQ,IAAI,QAAQ,WAAW,MAAM;AAC1E,UAAM,MAAM,QAAQ,KAAK,YAAY,QAAQ,IAAI,QAAQ,YAAY,MAAM;AAC3E,UAAM,YAAY;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AACA,UAAM,UAAU;AAAA,MAAC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACvD;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MACjC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MACvC;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MACzC;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAC3C;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MACzC;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MACxC;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAG;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,IAAE;AAChC,UAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8B5B,UAAM,aAAa;AAAA,MAAC;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5D;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAC1C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAC3C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAC5C;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAC7C;AAAA,MAAI;AAAA,MAAG;AAAA,MAAG;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MAAG;AAAA,MAAI;AAAA,IAAE;AAEjD,UAAM,gBAAgB,oBAAoB,MAAM,GAAG;AACnD,UAAM,KAAK,CAAC;AACZ,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AACxC,YAAM,MAAM,WAAW,CAAC;AACxB,YAAM,WAAW,OAAO,YAAY,cAAc,GAAG,CAAC;AACtD,SAAG,KAAK,EAAE,GAAG,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC;AAAA,IAC9C;AACA,UAAM,OAAO,IAAI,aAAa,WAAW,SAAS,EAAE;AACpD,SAAK,MAAM,gBAAgB,MAAM;AACjC,8BAA0B,IAAI;AAE9B,SAAK,iBAAiB,EAAE,QAAQ,QAAQ,KAAK,GAAG,OAAO;AACvD,WAAO;AAAA,EACX;AAAA,EACA,mBAAmB,SAAS,KAAK,QAAQ;AACrC,WAAO,2BAA2B,mBAAmB,MAAM;AAAA,EAC/D;AACJ;AACA,2BAA2B,6BAA6BC,aAAW;AAAA,EAC/DC,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,0BAA0B,CAAC;AACpF,GAAG,wBAAwB;;;AC1T3B,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAP5D,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAOJ,IAAI,qBAAqB,uBAAuB,MAAMC,4BAA2B,wBAAwB;AAAA,EACrG,OAAO,mBAAmB,SAAS,GAAG,OAAO,GAAG;AAE5C,UAAM,QAAQ,CAAC;AACf,UAAM,KAAK,CAAC;AACZ,UAAM,UAAU,CAAC;AAEjB,UAAM,IAAI,QAAQ,eAAe;AACjC,UAAM,QAAQ,WAAW,MAAQ;AACjC,UAAM,WAAW,eAAe,KAAK,IAAI,eAAe,KAAK,eAAe,KAAK;AAEjF,UAAM,KAAK,EAAE,GAAG,GAAI,GAAG,GAAG,GAAG,EAAG,CAAC;AACjC,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAE/B,YAAM,SAAS,QAAQ;AACvB,YAAM,aAAa,KAAK,IAAI,MAAM;AAClC,YAAM,aAAa,KAAK,IAAI,MAAM;AAClC,YAAM,IAAI,IAAM,IAAM,IAAI;AAC1B,eAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AAEnC,cAAM,SAAS,QAAQ,IAAI,KAAK,KAAK;AACrC,cAAM,aAAa,KAAK,IAAI,MAAM;AAClC,cAAM,aAAa,KAAK,IAAI,MAAM;AAClC,cAAM,IAAI,IAAI,aAAa;AAC3B,cAAM,IAAI,IAAI;AACd,cAAM,IAAI,IAAI,aAAa;AAC3B,cAAM,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;AAEtB,cAAM,SAAS,KAAK,IAAI,eAAe,IAAI,IAAI;AAC/C,cAAM,IAAI,KAAK,IAAI,IAAK,IAAM,IAAM,IAAI;AACxC,cAAM,SAAS,IAAM,IAAM,SAAS;AAEpC,YAAI,KAAK,GAAG;AACR,kBAAQ,KAAK,IAAI,CAAC;AAClB,kBAAQ,KAAK,IAAI,MAAM;AACvB,kBAAQ,KAAK,CAAC;AAEd,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACtB,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,aAAG,KAAK,EAAE,GAAG,KAAI,GAAG,EAAI,CAAC;AAAA,QAC7B,OACK;AACD,kBAAQ,MAAM,IAAI,KAAK,eAAe,IAAI,CAAC;AAC3C,kBAAQ,MAAM,IAAI,KAAK,eAAe,SAAS,CAAC;AAChD,kBAAQ,MAAM,IAAI,KAAK,eAAe,SAAS,CAAC;AAChD,kBAAQ,MAAM,IAAI,KAAK,eAAe,IAAI,CAAC;AAC3C,kBAAQ,MAAM,IAAI,KAAK,eAAe,SAAS,CAAC;AAChD,kBAAQ,MAAM,IAAI,KAAK,eAAe,IAAI,CAAC;AAE3C,gBAAM,SAAS,KAAO,IAAI,KAAO;AAEjC,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACtB,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC;AAChC,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACtB,aAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC;AAChC,aAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC;AAAA,QAC/B;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,KAAK,EAAE,GAAG,GAAI,GAAG,CAAC,GAAG,GAAG,EAAG,CAAC;AAClC,UAAM,OAAO,MAAM,SAAS;AAC5B,aAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AACnC,YAAM,IAAI,WAAW;AACrB,YAAM,SAAS,KAAK,IAAI,eAAe,IAAI,IAAI;AAC/C,YAAM,IAAI,KAAK,IAAI,IAAK,IAAM,IAAM,IAAI;AACxC,YAAM,SAAS,IAAM,IAAM,SAAS;AACpC,YAAM,IAAI,KAAO,IAAI,KAAO;AAE5B,cAAQ,KAAK,IAAI;AACjB,cAAQ,KAAK,IAAI,eAAe,IAAI,MAAM;AAC1C,cAAQ,KAAK,IAAI,eAAe,IAAI,CAAC;AACrC,SAAG,KAAK,EAAE,GAAG,KAAI,GAAG,EAAE,CAAC;AACvB,SAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,SAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAAA,IAC1B;AACA,UAAM,OAAO,IAAI,aAAa,OAAO,SAAS,EAAE;AAChD,SAAK,MAAM,UAAU,MAAM,KAAK,IAAI;AACpC,8BAA0B,IAAI;AAC9B,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,WAAO,qBAAqB,mBAAmB;AAAA,EACnD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,qBAAqB,mBAAmB,KAAK,QAAQ,KAAK,QAAQ;AAClF;AAAA,IACR;AAAA,EACJ;AACJ;AACAD,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,mBAAmB,WAAW,UAAU,MAAM;AACjDH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,mBAAmB,WAAW,YAAY,MAAM;AACnD,qBAAqB,uBAAuBH,aAAW;AAAA,EACnDI,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,oBAAoB,CAAC;AAC9E,GAAG,kBAAkB;;;AC7GrB,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,4BAA0B;AAP5D,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AACA,IAAI;AAOJ,IAAI,oBAAoB,sBAAsB,MAAMC,2BAA0B,wBAAwB;AAAA,EAClG,OAAO,mBAAmB,SAAS,GAAG,cAAc,MAAK,WAAW,IAAI,QAAQ,IAAI;AAEhF,UAAM,QAAQ,CAAC;AACf,UAAM,KAAK,CAAC;AACZ,UAAM,SAAS,CAAC;AAChB,UAAM,QAAQ,WAAW,MAAQ;AACjC,UAAM,MAAM,WAAW,MAAQ;AAC/B,UAAM,KAAK;AACX,UAAM,KAAK;AACX,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AAE/B,YAAM,SAAS,QAAQ,IAAI,KAAK,KAAK;AACrC,YAAM,aAAa,KAAK,IAAI,MAAM;AAClC,YAAM,aAAa,KAAK,IAAI,MAAM;AAClC,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAE5B,cAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,cAAM,aAAa,KAAK,IAAI,MAAM;AAClC,cAAM,IAAI,KAAK,aAAa,KAAK,aAAa;AAC9C,cAAM,IAAI,KAAK,KAAK,IAAI,MAAM;AAC9B,cAAM,IAAI,KAAK,aAAa,KAAK,aAAa;AAC9C,cAAM,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC;AACtB,cAAM,SAAS,IAAI,IAAI,IAAI,IAAI,WAAW;AAC1C,cAAM,SAAS,IAAI,IAAI,IAAI,IAAI,QAAQ;AACvC,cAAM,IAAI,KAAK,IAAI,IAAK,IAAM,IAAM,IAAI;AACxC,cAAM,IAAI,IAAI,IAAI,IAAM,IAAI,QAAQ;AACpC,cAAM,SAAS,IAAI,IAAI,KAAO,IAAI,KAAO,WAAW,IAAM;AAC1D,cAAM,SAAS,IAAI,KAAK,IAAI,KAAO,QAAQ,IAAM,IAAM;AAGvD,eAAO,KAAK,IAAI,QAAQ,MAAM;AAC9B,eAAO,KAAK,SAAS,QAAQ,MAAM;AACnC,eAAO,KAAK,SAAS,QAAQ,CAAC;AAC9B,eAAO,KAAK,IAAI,QAAQ,MAAM;AAC9B,eAAO,KAAK,SAAS,QAAQ,CAAC;AAC9B,eAAO,KAAK,IAAI,QAAQ,CAAC;AAEzB,WAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC;AAC3B,WAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC;AAChC,WAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,WAAG,KAAK,EAAE,GAAG,GAAG,GAAG,OAAO,CAAC;AAC3B,WAAG,KAAK,EAAE,GAAG,QAAQ,GAAG,EAAE,CAAC;AAC3B,WAAG,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AAAA,MAC1B;AAAA,IACJ;AACA,UAAM,OAAO,IAAI,aAAa,OAAO,QAAQ,EAAE;AAC/C,SAAK,MAAM,SAAS,MAAM,IAAI,WAAW,KAAK,QAAQ,KAAK,KAAK;AAChE,8BAA0B,IAAI;AAC9B,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,WAAO,oBAAoB,mBAAmB;AAAA,EAClD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,aAAK,WAAW,oBAAoB,mBAAmB,KAAK,QAAQ,KAAK,aAAa,KAAK,UAAU,KAAK,KAAK;AAC/G;AAAA,IACR;AAAA,EACJ;AACJ;AACAD,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,UAAU,MAAM;AAChDH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,eAAe,MAAM;AACrDH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,YAAY,MAAM;AAClDH,aAAW;AAAA,EACPE,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,kBAAkB,WAAW,SAAS,MAAM;AAC/C,oBAAoB,sBAAsBH,aAAW;AAAA,EACjDI,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,mBAAmB,CAAC;AAC7E,GAAG,iBAAiB;;;AC7FpB,SAAS,kBAAkB,SAAAC,eAAa;AACxC,SAAS,aAAa;AAEtB,SAAS,WAAW,KAAK,MAAM;AAC3B,MAAI,GAAG;AACP,MAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,QAAI,IAAI;AACR,QAAI,IAAI;AAAA,EACZ,OACK;AACD,UAAM,EAAE,KAAK,IAAI,iBAAiB,oBAAoB,GAAG;AACzD,UAAM,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,EAAE;AACnD,QAAI,EAAE;AACN,QAAI,EAAE;AAAA,EACV;AACA,QAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI;AACnC,QAAM,QAAQ,IAAI,KAAK,SAAS,KAAK;AACrC,SAAO,EAAE,GAAG,OAAO,GAAG,MAAM;AAChC;AACO,IAAM,eAAN,MAAM,cAAa;AAAA,EACtB,OAAO,eAAe,KAAK;AACvB,WAAO,eAAe,OAAOC,QAAM,QAAQ,IAAI,SAAS,KACjD,qBAAqB,OAAOA,QAAM,QAAQ,IAAI,eAAe;AAAA,EACxE;AAAA,EACA,OAAO,WAAW,KAAK;AACnB,WAAO,OAAO,OAAO,OAAO,IAAI,MAAM,YAC/B,OAAO,OAAO,OAAO,IAAI,MAAM,YAC/B,OAAO,OAAO,OAAO,IAAI,MAAM;AAAA,EAC1C;AAAA,EACA,OAAO,OAAO,KAAK;AACf,WAAO,OAAO,OAAO,OAAO,IAAI,MAAM,YAC/B,OAAO,OAAO,OAAO,IAAI,MAAM,YAC/B,OAAO,OAAO,OAAO,IAAI,MAAM;AAAA,EAC1C;AAAA,EACA,OAAO,mBAAmB,OAAO;AAC7B,UAAM,SAAS,CAAC;AAChB,aAAS,KAAK,OAAO;AACjB,UAAI,cAAa,WAAW,CAAC,GAAG;AAC5B,eAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAAA,MAC7B,WACS,cAAa,OAAO,CAAC,GAAG;AAC7B,eAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;AAAA,MACvC,OACK;AACD,eAAO,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,MACxB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,WAAW,OAAO;AACrB,YAAQ,SAAS,CAAC,GAAG,KAAK,OAAK,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI;AAAA,EACzD;AAAA,EACA,UAAU,KAAK,UAAU;AACrB,QAAI,oBAAoB,aAAa;AACjC,iBAAWA,QAAM,WAAW,QAAQ;AAAA,IACxC;AACA,WAAO,WAAW,KAAK,QAAQ;AAAA,EACnC;AACJ;;;ACpDA,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,sBAAoB,SAAAC,SAAO,sBAAAC,2BAA0B;AACvF,SAAS,cAAc;AACvB,SAAS,YAAAC,iBAAgB;AARzB,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAeA,SAAS,mBAAmB,OAAO;AAC/B,SAAO,aAAa,mBAAmB,KAAK;AAChD;AACA,IAAM,iBAAiB;AAAvB,IAAkC,yBAAyB;AAE3D,IAAM,SAAS;AAAA,EACX,SAAS;AAAA,EACT,SAAS,2BAA2B,cAAc;AAAA,EAClD,WAAW,2BAA2B,sBAAsB;AAAA,EAC5D,SAAS;AAAA;AAAA;AAAA,EAGT;AAAA,EACA,kBAAkB,WAAY;AAC1B,WAAO,IAAI,MAAM,qBAAqB,EAAE,OAAO,QAAQ,aAAa,KAAK,CAAC;AAAA,EAC9E;AACJ;AAOA,SAAS,qBAAqB,QAAQ,UAA8B,WAAW,YAAY,OAAO;AAC9F,QAAM,MAAM,IAAI,MAAM,KAAK;AAC3B,aAAW,UAAU,WAAW;AAC5B,QAAI,eAAe,MAAM;AAAA,EAC7B;AACA,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC5C,QAAM,SAAS,IAAI,UAAU,IAAI,MAAM,QAAQ,CAAC;AAChD,QAAM,UAAU,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC/C,QAAM,oBAAoB,WAAW,IAAI,KAAK,KAAK,KAAK,KAAK,OAAO,MAAM,GAAG;AAC7E,QAAM,mBAAmB,oBAAoB,OAAO;AACpD,QAAM,WAAW,YAAY,KAAK,IAAI,mBAAmB,gBAAgB;AACzE,QAAM,cAAc,CAACC,QAAM,OAAO,QAAQ;AAC1C,MAAI;AACJ,MAAI,aAAa;AACb,gBAAY,SAAS,OAAO,MAAM,EAC7B,IAAI,OAAO,QAAQ,EACnB,UAAU,EACV,eAAe,QAAQ;AAC5B,aAAS,cAAc,WAAW;AAClC,aAAS,OAAO,KAAK,MAAM;AAAA,EAC/B;AACA,SAAO,OAAO,WAAW;AACzB,SAAO,MAAM,WAAW;AACxB,SAAO,uBAAuB;AAC9B,MAAI,aAAa;AACb,WAAO,SAAS,KAAK,SAAS,MAAM,EAAE,IAAI,SAAS;AACnD,aAAS,OAAO;AAAA,EACpB;AACJ;AACA,SAAS,gBAAgB,GAAG;AACxB,SAAO;AAAA;AAAA,IAEH,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IACvB,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IACvB,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IACvB,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,IAAK,EAAE;AAAA,EAC3B;AACJ;AACA,SAAS,6BAA6B,MAAM;AACxC,QAAM,WAAW,IAAI,MAAM,eAAe;AAC1C,QAAM,WAAW,mBAAmB,KAAK,SAAS;AAClD,WAAS,aAAa,YAAY,IAAI,MAAM,uBAAuB,UAAU,CAAC,CAAC;AAC/E,MAAI,gBAAgB,cAAc;AAC9B,QAAI,CAACA,QAAM,cAAc,KAAK,eAAe,GAAG;AAC5C,eAAS,SAAS,KAAK,eAAe;AAAA,IAC1C;AACA,UAAMC,YAAW,mBAAmB,KAAK,SAAS;AAClD,aAAS,aAAa,YAAY,IAAI,MAAM,uBAAuBA,WAAU,CAAC,CAAC;AAC/E,UAAM,MAAM,mBAAmB,KAAK,kBAAkB;AACtD,aAAS,aAAa,MAAM,IAAI,MAAM,uBAAuB,KAAK,CAAC,CAAC;AACpE,QAAID,QAAM,cAAc,KAAK,OAAO,GAAG;AACnC,eAAS,qBAAqB;AAAA,IAClC,OACK;AACD,YAAM,UAAU,mBAAmB,KAAK,OAAO;AAC/C,eAAS,aAAa,UAAU,IAAI,MAAM,uBAAuB,SAAS,CAAC,CAAC;AAAA,IAChF;AAAA,EACJ;AACA,SAAO;AACX;AACA,SAAS,aAAa,MAAM;AACxB,MAAI;AACJ,UAAQ,KAAK,MAAM;AAAA,IACf,KAAK;AACD,YAAM,YAAY,IAAI,MAAM,UAAU;AACtC,gBAAU,OAAO,SAAS,IAAI,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,OAAO,CAAC;AACzE,cAAQ;AACR;AAAA,IACJ;AACI,cAAQ,IAAI,MAAM,WAAW;AAC7B;AAAA,EACR;AACA,SAAO;AACX;AACA,SAAS,mBAAmB,UAAU;AAClC,MAAIA,QAAM,OAAO,QAAQ,GAAG;AACxB,WAAO;AAAA,EACX;AACA,QAAM,WAAW;AAAA,IACb,OAAO,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ,OAAO,UAAU,SAAS,KAAK;AAAA,IAC5F,SAAS,SAAS,WAAW;AAAA,IAC7B,aAAa;AAAA,IACb,WAAW,SAAS,aAAa;AAAA,IACjC,SAAS,SAAS,WAAW;AAAA,EACjC;AACA,QAAM,OAAOA,QAAM,OAAO,CAAC,GAAG,UAAU,EAAE,WAAW,SAAS,aAAa,MAAM,CAAC;AAClF,QAAM,iBAAiB,CAAC,MAAM;AAC1B,QAAI,SAAS,KAAK;AACd,QAAE,KAAK,IAAI,IAAI,MAAM,cAAc,EAAE,KAAK,SAAS,KAAK,OAAK;AAEzD,UAAE,cAAc;AAAA,MACpB,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACX;AACA,MAAI,mBAAmB,QAAQ,GAAG;AAC9B,UAAM,MAAM,eAAe,IAAI,MAAM,qBAAqBA,QAAM,OAAO,MAAM;AAAA,MACzE,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,UAAU,SAAS;AAAA,MACnB,aAAa,SAAS;AAAA,MACtB,iBAAiB,SAAS;AAAA,IAC9B,CAAC,CAAC,CAAC;AACH,WAAO;AAAA,EACX,WACS,gBAAgB,QAAQ,GAAG;AAChC,UAAM,QAAQ,eAAe,IAAI,MAAM,kBAAkBA,QAAM,OAAO,MAAM;AAAA,MACxE,WAAW,SAAS;AAAA,MACpB,UAAU,SAAS;AAAA,MACnB,aAAa,SAAS;AAAA,MACtB,UAAU,SAAS;AAAA,MACnB,cAAc,SAAS;AAAA,MACvB,iBAAiB,SAAS;AAAA,IAC9B,CAAC,CAAC,CAAC;AACH,WAAO;AAAA,EACX,WACS,kBAAkB,QAAQ,GAAG;AAClC,UAAM,UAAU,eAAe,IAAI,MAAM,oBAAoBA,QAAM,OAAO,MAAM;AAAA,MAC5E,UAAU,SAAS;AAAA,MACnB,cAAc,SAAS;AAAA,MACvB,iBAAiB,SAAS;AAAA,IAC9B,CAAC,CAAC,CAAC;AACH,WAAO;AAAA,EACX,WACS,eAAe,QAAQ,GAAG;AAC/B,UAAM,OAAO,SAAS,aAAa,SAAS,UAAU,CAAC,KAAK,MAAM,MAAM,SAAS,aAAa,SAAS,UAAU,SAAS,KAAK,SAAS,UAAU,CAAC,KAAK;AACxJ,UAAM,iBAAiBA,QAAM,OAAO,UAAU;AAAA,MAC1C,SAAS,SAAS,WAAW;AAAA,MAC7B,UAAU,SAAS,YAAY;AAAA,MAC/B,WAAW,SAAS,aAAa;AAAA,IACrC,CAAC;AACD,WAAOA,QAAM,cAAc,SAAS,SAAS,IACzC,IAAI,MAAM,kBAAkB,cAAc,IACxC,IAAI,MAAM,mBAAmBA,QAAM,OAAO,EAAE,UAAU,MAAM,SAAS,IAAI,GAAG,cAAc,CAAC;AAAA,EACrG,WACS,WAAW,QAAQ,GAAG;AAC3B,UAAM,QAAQ,eAAe,IAAI,MAAM,kBAAkB,IAAI,CAAC;AAC9D,WAAO;AAAA,EACX,OACK;AACD,WAAO;AAAA,EACX;AACJ;AACA,SAAS,oBAAoB,eAAe,cAAc,cAAc;AAEpE,QAAM,QAAQ;AAEd,QAAM,YAAY,CAAC;AAEnB,QAAM,WAAW,mBAAmB,aAAa;AACjD,MAAI,CAACA,QAAM,OAAO,QAAQ,GAAG;AACzB,aAAS,OAAO,MAAM;AACtB,cAAU,KAAK,QAAQ;AAAA,EAC3B;AAEA,MAAI,CAACA,QAAM,OAAO,YAAY,GAAG;AAC7B,QAAI,gBAAgB,eAAe;AAC/B,eAAS,OAAO,MAAM;AAAA,IAC1B,OACK;AAED,YAAM,mBAAmB,mBAAmB,YAAY;AACxD,UAAI,CAACA,QAAM,OAAO,gBAAgB,GAAG;AACjC,yBAAiB,OAAO,MAAM;AAC9B,kBAAU,KAAK,gBAAgB;AAAA,MACnC;AAAA,IACJ;AAAA,EACJ;AACA,SAAO,SAAS,UAAU,SAAS,IAAI,YAAY;AACvD;AACA,SAAS,KAAK,MAAM;AAChB,MAAI,CAACA,QAAM,cAAc,KAAK,OAAO,GAAG;AACpC,UAAM,OAAO,KAAK,MAAM,YAAY;AACpC,YAAQ,MAAM;AAAA,MACV,KAAK;AACD,cAAM,MAAM,IAAI,MAAM,WAAW,EAAE;AACnC,eAAO,IAAI,MAAM,KAAK,OAAO;AAAA,MACjC;AACI,cAAM,SAAS,IAAI,MAAM,aAAa;AACtC,eAAO,OAAO,MAAM,KAAK,OAAO;AAAA,IACxC;AAAA,EACJ,OACK;AACD,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACtC;AACJ;AACA,SAAS,SAAS,UAAU;AACxB,SAAO,oBAAoB,eAAe,MAAM,OAAO,MAAM;AACjE;AACA,SAAS,MAAM,MAAM;AACjB,MAAIA,QAAM,cAAc,KAAK,QAAQ,GAAG;AACpC,WAAO;AAAA,EACX;AACA,QAAM,OAAO,SAAS,KAAK,QAAQ;AACnC,SAAO,IAAI,KAAK;AACpB;AACA,SAAS,mBAAmB;AACxB,SAAO,WAAW;AACtB;AACA,eAAe,sBAAsB,MAAM;AACvC,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,cAAc;AAClB,KAAG;AACC,kBAAc,iBAAiB;AAC/B,aAAS,QAAQ,MAAM;AACnB,sBAAgB,KAAK;AAAA,IACzB;AACA,QAAI,CAAC,aAAa;AACd,YAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAAA,IACzD;AAAA,EACJ,SAAS,CAAC,eAAgB,KAAK,IAAI,IAAI,QAAS;AAChD,MAAI,CAAC,aAAa;AACd,UAAM,IAAI,MAAM,sDAAsD;AAAA,EAC1E;AACJ;AACA,IAAI,6BAA6B,MAAME,oCAAmC,sBAAsB;AAAA,EAC5F,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,WAAW,oBAAI,QAAQ;AAC5B,SAAK,QAAQ,CAAC;AACd,SAAK,yBAAyB,CAAC,MAAM;AAAA,IACrC;AACA,SAAK,oBAAoB,CAAC,MAAM,UAAU,WAAW;AACjD,eAAS,mBAAmB;AAE5B,UAAI,SAAS,UAAU,CAAC,KAAK,MAAM;AAG/B,YAAI,OAAO,IAAI,GAAG;AACd,cAAI,SAAS;AACb,cAAI,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,GAAG;AACrD,mBAAO,SAAS,QAAQ;AAExB,kBAAM,UAAU,MAAM,IAAI;AAC1B,gBAAI,QAAQ,YAAY,SAAS,OAAO,YAAY,MAAM;AACtD,qBAAO,OAAO,QAAQ;AACtB,qBAAO,KAAK,MAAM,SAAS,EAAE;AAC7B,yBAAW,SAAS;AAAA,YACxB;AAEA,mBAAO,WAAW,6BAA6B,KAAK,QAAQ;AAAA,UAChE;AACA,cAAI,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,GAAG;AACrD,gBAAIF,QAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,uBAAS,KAAK,OAAO,UAAU;AAC3B,kBAAE,QAAQ;AAAA,cACd;AAAA,YACJ,OACK;AACD,qBAAO,SAAS,QAAQ;AAAA,YAC5B;AACA,mBAAO,WAAW,oBAAoB,KAAK,QAAQ,KAAK,OAAO,iBAAiB;AAAA,UACpF;AAAA,QACJ,WAES,gBAAgB,yBACjB,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,KAAK,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,IAAI;AAEjH,mBAAS,UAAU,SAAS,OAAO,OAAO,QAAQ;AAClD,qBAAW,KAAK,IAAI;AAAA,QACxB,WAES,gBAAgB,qBAAqB;AAC1C,cAAI,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,GAAG;AAErD,qBAAS,IAAI,SAAS,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AACpD,oBAAM,QAAQ,SAAS,SAAS,CAAC;AACjC,uBAAS,OAAO,KAAK;AAAA,YACzB;AAEA,qBAAS,SAAS,KAAK,OAAO;AAC1B,mBAAK,iBAAiB,OAAO,QAAQ;AAAA,YACzC;AAAA,UACJ;AAAA,QACJ,WAES,gBAAgB,qBAAqB;AAC1C,gBAAM,QAAQ;AACd,cAAI,KAAK,MAAM,QAAQ,kBAAkB,KAAK,KAAK,GAAG;AAClD,kBAAM,QAAQ,IAAI,MAAM,MAAM,KAAK,KAAK;AACxC,kBAAM,YAAY,KAAK;AAAA,UAC3B;AAAA,QACJ;AAEA,YAAI,OAAO,KAAK;AAChB,YAAI,aAAa,IAAI,KACd,CAACA,QAAM,OAAO,KAAK,eAAe,MACjC,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,KAAK,KAAK,MAAM,QAAQ,kBAAkB,SAAS,KAAK,IAAI;AAClH,gBAAM,iBAAiBG,UAAS,cAAc,SAAS,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,CAAC;AAGzH,gBAAM,kBAAkBA,UAAS,cAAc,SAAS,SAAS,KAAK,iBAAiB,cAAc;AACrG,gBAAM,QAAQ,UAAU,IAAI,MAAM,SAAS,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAEvF,WACS,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,GAAG;AAC1D,mBAAS,SAAS,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC5C,mBAAS,aAAa;AAAA,QAC1B;AAAA,MACJ;AACA,eAAS,WAAW,KAAK;AACzB,UAAIH,QAAM,OAAO,OAAO,cAAc,SAAS,EAAE,CAAC,GAAG;AACjD,eAAO,IAAI,QAAQ;AACnB,aAAK,MAAM,SAAS,EAAE,IAAI;AAAA,MAC9B;AAEA,WAAK,MAAM,OAAO,CAAC;AACnB,aAAO;AAAA,IACX;AAAA,EAEJ;AAAA,EACA,iBAAiB,OAAO;AACpB,QAAI,SAAS,KAAK,OAAO,CAACA,QAAM,OAAO,KAAK,GAAG,GAAG;AAC9C,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AAAA,EACJ;AAAA,EACA,QAAQ,OAAO;AAAA,EAEf;AAAA,EACA,SAAS,OAAO,YAAY,MAAM,SAAS;AACvC,QAAI,SAAS,KAAK,KAAK;AACnB,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC/B;AACA,UAAM,OAAO,CAACA,QAAM,cAAc,UAAU,GAAG,OAAO,SAAS,OAAO,eAAe,OAAO,cAAc,YAAY,OAAO,MAAK;AAClI,WAAO,IAAI,QAAQ,CAAC,SAAS,MAAM;AAC/B,WAAK,OAAO;AACZ,MAAAA,QAAM,gBAAgB,KAAK,QAAQ,YAAY,MAAM,WAAW,EAAE,KAAK,OAAO;AAAA,IAClF,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,OAAO,SAAS;AACpB,SAAK,iBAAiB,KAAK;AAE3B,QAAIA,QAAM,OAAO,KAAK,OAAO,KAAKA,QAAM,OAAO,KAAK,MAAM;AACtD,aAAO;AAEX,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAS,IAAI,MAAM,QAAQ,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAChE,UAAM,QAAQ,MAAM,OAAO,SAAS,MAAM;AAC1C,UAAM,YAAY,QAAQ,GAAG,aAAa,SAAS;AACnD,UAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO;AACzC,UAAM,IAAK,MAAM,IAAI,YAAa;AAClC,UAAM,IAAI,EAAE,MAAM,IAAI,cAAc;AACpC,WAAO,EAAE,GAAM,EAAK;AAAA,EACxB;AAAA,EACA,QAAQ,UAAU,OAAO;AACrB,SAAK,iBAAiB,KAAK;AAC3B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,YAAM,SAAS,KAAK;AACpB,YAAM,MAAM,KAAK;AACjB,YAAM,UAAU,MAAM,OAAO,OAAK,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,OAAK,IAAI,IAAI,CAAC,CAAC;AACjE,UAAIA,QAAM,OAAO,MAAM,KAAKA,QAAM,cAAc,OAAO,GAAG;AACtD,gBAAQ;AAAA,MACZ;AACA,2BAAqB,QAAQ,KAAK,aAAa,OAAO;AACtD,cAAQ;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EACA,SAAS,OAAO;AACZ,SAAK,iBAAiB,KAAK;AAC3B,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,QAAQ,OAAO,OAAO,MAAM,UAAU;AAClC,SAAK,iBAAiB,KAAK;AAC3B,QAAI,iBAAiB,KAAK,CAACA,QAAM,OAAO,KAAK,OAAO,GAAG;AACnD,YAAM,SAAS,KAAK;AACpB,YAAM,SAAS,IAAI,MAAM,QAAS,MAAM,IAAI,KAAK,QAAS,IAAI,GAAG,EAAE,MAAM,IAAI,KAAK,UAAU,IAAI,CAAC;AACjG,YAAM,YAAY,IAAI,MAAM,UAAU;AACtC,gBAAU,cAAc,QAAQ,MAAM;AACtC,YAAM,aAAa,UAAU,iBAAiB,KAAK,OAAO,UAAU,IAAI;AACxE,UAAI;AACJ,UAAI;AACJ,UAAI,IAAI;AACR,aAAO,WAAW,SAAS,MAAM,eAAe,WAAW,GAAG,OAAO,MAAM,aAAa,SAAS;AAC7F,cAAM,OAAO,KAAK,MAAM,IAAI,EAAE;AAC9B,YAAI,KAAK,OAAO;AACZ;AAAA,QACJ;AACA,cAAM,IAAI,aAAa,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,GAAGI,SAAQ,EAAE,GAAG,GAAG,EAAE;AAC3E,iBAAS,EAAE,QAAQ,KAAK,MAAM,IAAI,EAAE,GAAG,OAAAA,OAAM,CAAC;AAC9C;AAAA,MACJ;AAAA,IACJ;AACA,aAAS,IAAI;AAAA,EACjB;AAAA;AAAA,EAEA,MAAM,WAAW,WAAW;AACxB,QAAI,CAACJ,QAAM,OAAO,KAAK,MAAM,GAAG;AAC5B,aAAO,KAAK;AAAA,IAChB;AACA,SAAK,MAAM;AACX,UAAM,UAAU,UAAU;AAC1B,UAAM,QAAQ,KAAK,SAAS,SAAS,cAAc,QAAQ;AAC3D,YAAQ,YAAY;AACpB,YAAQ,YAAY,KAAK;AACzB,QAAI,CAAC,iBAAiB,GAAG;AACrB,YAAMK,oBAAmB,SAAS,OAAO,OAAO;AAChD,YAAM,mBAAmB;AACzB,YAAM,QAAQ,IAAI,CAACA,oBAAmB,SAAS,OAAO,SAAS,CAAC,EAC3D,OAAO,OAAO,QAAQ,IAAI,QAAMA,oBAAmB,SAAS,EAAE,CAAC,CAAC,CAAC;AAAA,IAC1E;AAEA,SAAK,SAAS,IAAI,MAAM,MAAM;AAE9B,SAAK,eAAe,SAAS;AAC7B,QAAI,IAAI,KAAK,OAAO,OAAO,IAAI,KAAK,OAAO;AAE3C,QAAI,aAAa;AAAA,MACb,QAAQ;AAAA,MAAO,WAAW;AAAA,MAAM,SAAS;AAAA,MAAO,OAAO,UAAU,eAAe;AAAA;AAAA,IACpF;AACA,SAAK,YAAY,IAAI,MAAM,cAAc,UAAU;AACnD,SAAK,UAAU,QAAQ,GAAG,CAAC;AAC3B,QAAI,UAAU,cAAc,CAAC,UAAU,aAAa;AAChD,UAAI,MAAM,UAAU;AACpB,UAAI,OAAO,QAAQ,UAAU;AACzB,cAAM,OAAO,MAAM,GAAG;AAAA,MAC1B;AACA,YAAM,YAAY,IAAI,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,WAAK,UAAU,cAAc,WAAW,IAAI,CAAC;AAAA,IACjD;AACA,SAAK,QAAQ,UAAU;AACvB,WAAO;AAAA,EACX;AAAA,EACA,WAAW,KAAK;AACZ,SAAK,UAAU;AACf,SAAK,eAAe,KAAK,GAAG;AAC5B,SAAK,sBAAsB;AAE3B,QAAI,KAAK,OAAO;AACZ,WAAK,mBAAmB;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,SAAS,SAAS;AAClB,UAAI,QAAQ;AACR,aAAK,mBAAmB;AAAA;AAExB,aAAK,sBAAsB;AAAA,IACnC;AAAA,EACJ;AAAA,EACA,qBAAqB;AACjB,UAAM,MAAM,KAAK;AACjB,QAAIL,QAAM,OAAO,KAAK,GAAG,KAAKA,QAAM,OAAO,GAAG,GAAG;AAC7C;AAAA,IACJ;AACA,UAAM,WAAW,KAAK,cAAc,IAAI,MAAM,eAAe,EAAE,KAAK,KAAK,IAAI,KAAK;AAClF,aAAS,iBAAiB,UAAU,KAAK,sBAAsB;AAAA,EACnE;AAAA,EACA,wBAAwB;AACpB,UAAM,WAAW,KAAK;AACtB,QAAIA,QAAM,OAAO,QAAQ,GAAG;AACxB;AAAA,IACJ;AACA,aAAS,oBAAoB,UAAU,KAAK,sBAAsB;AAClE,aAAS,QAAQ;AAAA,EACrB;AAAA,EACA,gBAAgB,WAAW,WAAW,KAAK,WAAW;AAClD,QAAI,CAAC,UAAU,aAAa;AACxB,UAAI,UAAU,YAAY;AACtB,YAAI,MAAM,UAAU;AACpB,YAAI,OAAO,QAAQ,UAAU;AACzB,gBAAM,OAAO,MAAM,GAAG;AAAA,QAC1B;AACA,cAAM,YAAY,IAAI,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACrD,iBAAS,cAAc,WAAW,IAAI,CAAC;AAAA,MAC3C,OACK;AACD,iBAAS,cAAc,IAAI;AAAA,MAC/B;AAAA,IACJ,OACK;AACD,eAAS,cAAc,CAAC;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,eAAe,OAAO,OAAO,MAAM,MAAM;AACrC,SAAK,iBAAiB,KAAK;AAC3B,QAAI,CAAC,iBAAiB,KAAKA,QAAM,OAAO,IAAI,GAAG;AAC3C;AAAA,IACJ;AACA,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK;AACb,SAAK,OAAO,QAAQ;AACpB,SAAK,OAAO,SAAS;AACrB,QAAI,SAAS,KAAK;AAClB,QAAI,kBAAkB,MAAM,mBAAmB;AAC3C,aAAO,SAAS,IAAI;AACpB,aAAO,uBAAuB;AAAA,IAClC;AACA,QAAI,KAAK,WAAW;AAChB,WAAK,UAAU,QAAQ,GAAG,CAAC;AAC3B,WAAK,gBAAgB,KAAK;AAAA,IAC9B;AAAA,EACJ;AAAA,EACA,WAAW,OAAO,MAAM;AACpB,SAAK,iBAAiB,KAAK;AAC3B,UAAM,MAAM,KAAK;AACjB,UAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAI,CAACA,QAAM,OAAO,KAAK,GAAG;AACtB,WAAK,OAAO,OAAO,KAAK;AACxB,aAAO,KAAK,MAAM,MAAM,EAAE;AAC1B,UAAI,OAAO,IAAI;AAAA,IACnB;AAAA,EACJ;AAAA,EACA,WAAW,OAAO,MAAM;AACpB,SAAK,iBAAiB,KAAK;AAC3B,UAAM,MAAM,KAAK;AACjB,QAAI,CAACA,QAAM,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,GAAG;AACpD,YAAM,WAAW,IAAI,IAAI,KAAK,MAAM;AACpC,WAAK,iBAAiB,MAAM,QAAQ;AAAA,IACxC,OACK;AACD,WAAK,iBAAiB,IAAI;AAAA,IAC9B;AAAA,EACJ;AAAA,EACA,QAAQ,OAAO,MAAM;AACjB,SAAK,iBAAiB,KAAK;AAC3B,SAAK,iBAAiB,IAAI;AAAA,EAC9B;AAAA,EACA,iBAAiB,MAAM,SAAS,KAAK,QAAQ;AACzC,QAAI,CAAC,iBAAiB,KAAKA,QAAM,OAAO,MAAM,GAAG;AAC7C;AAAA,IACJ;AACA,QAAI,gBAAgB,sBAAsB;AACtC,UAAI,gBAAgB,iCAAiC;AACjD,YAAI;AACJ,YAAI,KAAK,mBAAmB,MAAM,mBAAmB;AACjD,cAAI,OAAO,KAAK;AAAA,QACpB,OACK;AACD,iBAAO,IAAI,MAAM,kBAAkB;AAAA,QACvC;AACA,cAAM,eAAe,IAAI,MAAM,QAAQ,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,OAAO,CAAC;AAClF,aAAK,OAAO,YAAY;AACxB,aAAK,SAAS,IAAI,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC;AACnE,aAAK,MAAM,KAAK;AAChB,aAAK,SAAS,KAAK;AACnB,aAAK,OAAO,KAAK;AACjB,aAAK,MAAM,KAAK;AAEhB,aAAK,WAAW,IAAI;AAEpB,cAAM,QAAQ,KAAK;AACnB,YAAI,CAACA,QAAM,OAAO,KAAK,KAAK,MAAM,WAAW,MAAM;AAC/C,gBAAM,SAAS;AACf,gBAAM,OAAO;AAAA,QACjB;AAAA,MACJ,WACS,gBAAgB,kCAAkC;AAGvD,YAAI;AACJ,YAAI,KAAK,mBAAmB,MAAM,oBAAoB;AAClD,cAAI,OAAO,KAAK;AAAA,QACpB,OACK;AACD,iBAAO,IAAI,MAAM,mBAAmB;AAAA,QACxC;AACA,cAAM,eAAe,IAAI,MAAM,QAAQ,KAAK,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,OAAO,CAAC;AAClF,aAAK,OAAO,YAAY;AACxB,aAAK,SAAS,IAAI,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC;AACnE,aAAK,OAAO,KAAK;AACjB,aAAK,QAAQ,KAAK;AAClB,aAAK,MAAM,KAAK;AAChB,aAAK,SAAS,KAAK;AACnB,aAAK,OAAO,KAAK;AACjB,aAAK,MAAM,KAAK;AAEhB,aAAK,WAAW,IAAI;AAEpB,cAAM,QAAQ,KAAK;AACnB,YAAI,CAACA,QAAM,OAAO,KAAK,KAAK,MAAM,WAAW,MAAM;AAC/C,gBAAM,SAAS;AACf,gBAAM,OAAO;AAAA,QACjB;AAAA,MACJ,OACK;AAED,cAAM,IAAI,MAAM,UAAU,IAAI,iBAAiB;AAAA,MACnD;AAAA,IACJ,OACK;AACD,UAAI,CAAC,KAAK,SAAS,IAAI,IAAI,GAAG;AAE1B,cAAM,OAAO,CAAC,aAAa;AAGvB,cAAI,UAAU;AACV,uBAAW,KAAK,kBAAkB,MAAM,UAAU,MAAM;AACxD,iBAAK,SAAS,IAAI,MAAM,QAAQ;AAAA,UACpC,OACK;AAAA,UAGL;AAAA,QACJ;AAEA,YAAI,gBAAgB,sBAAsB;AACtC,gBAAM,OAAO,KAAK,IAAI;AACtB,eAAK,IAAI;AAAA,QACb,WACS,gBAAgB,oBAAoB;AAEzC,gBAAM,OAAO,MAAM,IAAI;AACvB,eAAK,IAAI;AAAA,QACb,WACS,gBAAgB,qBAAqB;AAC1C,gBAAM,QAAQ,aAAa,IAAI;AAC/B,eAAK,KAAK;AAAA,QACd,WACS,gBAAgB,qBAAqB;AAC1C,gBAAM,QAAQ,IAAI,MAAM,MAAM;AAC9B,eAAK,KAAK;AAAA,QACd;AAAA,MACJ,OACK;AAED,cAAM,MAAM,KAAK,SAAS,IAAI,IAAI;AAClC,cAAM,SAAS,KAAK,kBAAkB,MAAM,KAAK,MAAM;AACvD,YAAI,UAAU,KAAK;AACf,eAAK,SAAS,IAAI,MAAM,MAAM;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,SAAS;AACL,QAAI,KAAK,SAAS;AACd,WAAK,UAAU,OAAO,KAAK,QAAQ,KAAK,OAAO;AAAA,IACnD;AAAA,EACJ;AACJ;AACAM,aAAW;AAAA,EACPC,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,QAAQ,CAAC;AAChE,GAAG,2BAA2B,WAAW,SAAS,MAAM;AACxD,6BAA6BF,aAAW;AAAA,EACpCG,gBAAc,EAAE,SAASC,MAAI,oBAAoB,CAAC;AACtD,GAAG,0BAA0B;;;ACpqB7B,SAAS,sBAAAC,qBAAoB,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,sBAAoB,uBAAAC,sBAAqB,2BAAAC,0BAAyB,UAAU,SAAAC,SAAO,WAAAC,UAAS,cAAAC,mBAAkB;AACpK,SAAS,eAAe;;;ACPxB,SAAS,SAAAC,SAAO,KAAAC,KAAG,WAAAC,gBAAe;AAClC,SAAS,UAAAC,eAAc;AACvB,SAAS,YAAAC,iBAAgB;;;ACDlB,IAAM,eAAe;AACrB,IAAM,UAAU;AAEhB,IAAM,oCAAoC;AAC1C,IAAM,kCAAkC;AACxC,IAAM,8BAA8B;AACpC,IAAM,gCAAgC;AACtC,IAAM,gCAAgC;AACtC,IAAM,4BAA4B;AAClC,IAAM,+BAA+B;AACrC,IAAM,6BAA6B;AACnC,IAAM,kCAAkC;AACxC,IAAM,gCAAgC;AACtC,IAAM,6BAA6B;AACnC,IAAM,kCAAkC;AACxC,IAAM,2BAA2B;AACjC,IAAM,mCAAmC;AACzC,IAAM,kCAAkC;AACxC,IAAM,+BAA+B;AACrC,IAAM,oCAAoC;AAG1C,IAAM,uBAAuB;AAC7B,IAAM,+BAA+B,uBAAuB;AAC5D,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAE9B,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AAGjC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,mCAAmC;AAGzC,IAAI;AAAA,CACV,SAAUC,iBAAgB;AACvB,EAAAA,gBAAeA,gBAAe,UAAU,IAAI,CAAC,IAAI;AACjD,EAAAA,gBAAeA,gBAAe,UAAU,IAAI,CAAC,IAAI;AACjD,EAAAA,gBAAeA,gBAAe,OAAO,IAAI,EAAE,IAAI;AAC/C,EAAAA,gBAAeA,gBAAe,UAAU,IAAI,GAAG,IAAI;AACnD,EAAAA,gBAAeA,gBAAe,UAAU,IAAI,CAAC,IAAI;AACjD,EAAAA,gBAAeA,gBAAe,WAAW,IAAI,CAAC,IAAI;AAClD,EAAAA,gBAAeA,gBAAe,eAAe,IAAI,GAAG,IAAI;AACxD,EAAAA,gBAAeA,gBAAe,SAAS,IAAI,GAAG,IAAI;AAClD,EAAAA,gBAAeA,gBAAe,SAAS,IAAI,EAAE,IAAI;AACjD,EAAAA,gBAAeA,gBAAe,QAAQ,IAAI,EAAE,IAAI;AACpD,GAAG,mBAAmB,iBAAiB,CAAC,EAAE;AACnC,IAAI;AAAA,CACV,SAAUC,kBAAiB;AACxB,EAAAA,iBAAgBA,iBAAgB,UAAU,IAAI,CAAC,IAAI;AACnD,EAAAA,iBAAgBA,iBAAgB,UAAU,IAAI,CAAC,IAAI;AACnD,EAAAA,iBAAgBA,iBAAgB,mBAAmB,IAAI,EAAE,IAAI;AAC7D,EAAAA,iBAAgBA,iBAAgB,iBAAiB,IAAI,CAAC,IAAI;AAC1D,EAAAA,iBAAgBA,iBAAgB,iBAAiB,IAAI,CAAC,IAAI;AAC9D,GAAG,oBAAoB,kBAAkB,CAAC,EAAE;AACrC,IAAI;AAAA,CACV,SAAUC,iBAAgB;AACvB,EAAAA,gBAAeA,gBAAe,QAAQ,IAAI,CAAC,IAAI;AAC/C,EAAAA,gBAAeA,gBAAe,UAAU,IAAI,CAAC,IAAI;AACjD,EAAAA,gBAAeA,gBAAe,SAAS,IAAI,CAAC,IAAI;AACpD,GAAG,mBAAmB,iBAAiB,CAAC,EAAE;AACnC,IAAI;AAAA,CACV,SAAUC,aAAY;AACnB,EAAAA,YAAWA,YAAW,MAAM,IAAI,CAAC,IAAI;AACrC,EAAAA,YAAWA,YAAW,OAAO,IAAI,CAAC,IAAI;AAC1C,GAAG,eAAe,aAAa,CAAC,EAAE;;;ACtElC,SAAS,SAAAC,eAAa;;;ACAf,IAAI;AAAA,CACV,SAAUC,kBAAiB;AACxB,EAAAA,iBAAgB,MAAM,IAAI;AAC1B,EAAAA,iBAAgB,QAAQ,IAAI;AAC5B,EAAAA,iBAAgB,SAAS,IAAI;AAC7B,EAAAA,iBAAgB,OAAO,IAAI;AAC3B,EAAAA,iBAAgB,aAAa,IAAI;AACrC,GAAG,oBAAoB,kBAAkB,CAAC,EAAE;;;ACLrC,IAAM,UAAN,MAAc;AAAA,EACjB,OAAO,OAAO,QAAQ,MAAM,QAAQ,IAAI;AACpC,UAAM,SAAS,OAAO,aAAa;AAAA,MAC/B,MAAM,KAAK;AAAA,MAAY;AAAA,MACvB,OAAO,eAAe,SAAS,eAAe;AAAA,MAC9C,kBAAkB;AAAA,IACtB,CAAC;AACD,QAAI,aAAa,OAAO,eAAe,CAAC,EAAE,IAAI,IAAI;AAClD,WAAO,MAAM;AACb,WAAO;AAAA,EACX;AAAA,EACA,OAAO,cAAc,QAAQ,MAAM,QAAQ,IAAI;AAC3C,WAAO,OAAO,aAAa;AAAA,MACvB,MAAM,KAAK;AAAA,MAAY;AAAA,MACvB,OAAO,eAAe,UAAU,eAAe;AAAA,IACnD,CAAC;AAAA,EACL;AAAA,EACA,OAAO,cAAc,QAAQ,MAAM,QAAQ,IAAI;AAC3C,WAAO,OAAO,aAAa;AAAA,MACvB,MAAM,KAAK;AAAA,MAAY;AAAA,MACvB,OAAO,eAAe,UAAU,eAAe;AAAA,IACnD,CAAC;AAAA,EACL;AAAA,EACA,OAAO,cAAc,QAAQ,MAAM,QAAQ,IAAI;AAC3C,UAAM,SAAS,OAAO,aAAa;AAAA,MAC/B,MAAM,KAAK;AAAA,MAAY;AAAA,MACvB,OAAO,eAAe,QAAQ,eAAe;AAAA,MAC7C,kBAAkB;AAAA,IACtB,CAAC;AACD,QAAI,YAAY,OAAO,eAAe,CAAC,EAAE,IAAI,IAAI;AACjD,WAAO,MAAM;AACb,WAAO;AAAA,EACX;AACJ;AACO,IAAM,gBAAN,MAAoB;AAAA,EACvB,OAAO,aAAa,sBAAsB,GAAG,OAAO,MAAM,OAAO;AAC7D,UAAM,aAAa,CAAC;AACpB,QAAI,WAAW,GAAG,QAAQ;AAC1B,aAAS,MAAM,CAAC,IAAI,EAAE,OAAO,KAAK,GAAG;AACjC,iBAAW,KAAK;AAAA,QACZ,gBAAgB,sBAAsB;AAAA,QACtC,QAAQ,WAAW,aAAa;AAAA,QAChC,QAAQ,WAAW,EAAE;AAAA,MACzB,CAAC;AACD,kBAAY;AACZ;AAAA,IACJ;AACA,WAAO;AAAA,MACH,aAAa,WAAyB,aAAa;AAAA,MACnD;AAAA,MACA,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;;;ACvDA,SAAS,SAAAC,eAAa;AACtB,SAAS,UAAAC,eAAc;;;ACDvB,SAAS,SAAAC,eAAa;AAEtB,IAAM,sCAAsC;AAAA,EACxC,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,6BAA6B;AACjC;AACA,SAAS,qBAAqB,QAAQ,CAAC,GAAG;AACtC,SAAO,MAAM,KAAK,MAAM;AAC5B;AACA,SAAS,6BAA6B,QAAQ,CAAC,GAAG;AAC9C,MAAI,SAAS;AACb,WAAS,YAAY,OAAO;AACxB,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,QAAQ,SAAS,GAAG,GAAG;AACvB,gBAAW,UAAU;AAAA,IACzB,OACK;AACD,gBAAU,GAAG,sBAAsB,MAAM,OAAO;AAAA;AAAA,IACpD;AAAA,EACJ;AACA,SAAO;AACX;AACO,SAAS,6BAA6B,aAAa,CAAC,GAAG,UAAU,qCAAqC;AACzG,QAAM,OAAOC,QAAM,OAAO,CAAC,GAAG,qCAAqC,OAAO;AAC1E,QAAM,cAAc,qBAAqB,WAAW,WAAW,GAAG,WAAW,qBAAqB,WAAW,QAAQ,GAAG,YAAY,6BAA6B,WAAW,SAAS;AACrL,QAAM,QAAQ,wBAAwB,WAAW,0BAA0B,UAAU;AACrF,SAAO;AAAA;AAAA,EAET,WAAW;AAAA;AAAA;AAAA,SAGJ,KAAK,yBAAyB,cAAc,KAAK,2BAA2B;AAAA,EACnF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOM,KAAK,oBAAoB;AAAA,gBACzB,KAAK,oBAAoB;AAAA,gBACzB,KAAK,gBAAgB;AAAA,gBACrB,KAAK,yBAAyB;AAAA,gBAC9B,KAAK,sBAAsB;AAAA,gBAC3B,KAAK,2BAA2B;AAAA;AAAA,UAEtC,KAAK;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA;AAAA;AAAA,MAGZ,SAAS;AAAA;AAAA,MAET,QAAQ,oBAAoB,QAAQ,KAAK,QAAQ;AAAA,aAC1C,KAAK,MAAM,QAAQ,MAAM,OAAO;AAAA;AAE7C;;;AC9DA,SAAS,SAAAC,eAAa;AAEtB,IAAM,qCAAqC;AAAA,EACvC,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,2BAA2B,2BAA2B;AAAA,EACtD,6BAA6B;AACjC;AACA,SAASC,sBAAqB,QAAQ,CAAC,GAAG;AACtC,SAAO,MAAM,KAAK,MAAM;AAC5B;AACA,SAASC,8BAA6B,QAAQ,CAAC,GAAG;AAC9C,MAAI,SAAS;AACb,WAAS,YAAY,OAAO;AACxB,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,QAAQ,SAAS,GAAG,GAAG;AACvB,gBAAW,UAAU;AAAA,IACzB,OACK;AACD,gBAAU,YAAY,OAAO;AAAA;AAAA,IACjC;AAAA,EACJ;AACA,SAAO;AACX;AACO,SAAS,4BAA4B,aAAa,CAAC,GAAG,UAAU,oCAAoC;AACvG,QAAM,OAAOC,QAAM,OAAO,CAAC,GAAG,oCAAoC,OAAO;AACzE,QAAM,cAAcF,sBAAqB,WAAW,WAAW,GAAG,WAAWA,sBAAqB,WAAW,QAAQ,GAAG,YAAYC,8BAA6B,WAAW,SAAS;AACrL,SAAO;AAAA,EACT,WAAW;AAAA;AAAA;AAAA,SAGJ,QAAQ,yBAAyB,cAAc,QAAQ,2BAA2B;AAAA,EACzF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAUM,KAAK,2BAA2B;AAAA,gBAChC,KAAK,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKxC,SAAS;AAAA;AAAA;AAAA;AAIf;;;AF3CO,IAAM,YAAN,MAAgB;AAAA,EACnB,OAAO,OAAO,UAAU;AACpB,QAAI,gBAAgB,QAAQ,GAAG;AAC3B,aAAO,IAAI,cAAc,QAAQ;AAAA,IACrC;AACA,QAAI,eAAe,QAAQ,GAAG;AAC1B,aAAO,IAAI,aAAa,QAAQ;AAAA,IACpC;AACA,UAAM,IAAI,UAAU,kBAAkB,SAAS,MAAM,kBAAkB;AAAA,EAC3E;AACJ;AACA,IAAM,6BAA6B;AAAA;AAEnC;AACA,IAAM,eAAN,MAAmB;AAAA,EACf,YAAY,UAAU;AAClB,QAAIE,QAAM,OAAO,KAAK,YAAY,QAAQ,GAAG;AACzC,YAAM,IAAI,eAAe,yBAAyB;AAAA,IACtD;AAAA,EACJ;AAAA,EACA;AAAA,EACA,IAAI,WAAW;AAAE,WAAO,KAAK;AAAA,EAAW;AAAA,EACxC,IAAI,OAAO;AACP,WAAO;AAAA,EACX;AAAA,EACA,OAAO,EAAE,OAAO,GAAG,QAAQ,eAAe,cAAc,KAAK,SAAS,WAAW;AAC7E,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,cAAc;AAC1C,UAAM,gBAAgB,IAAI,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AACnD,WAAO,EAAE,QAAQ,QAAQ,cAAc,QAAQ,eAAe,KAAK,GAAG,OAAO,eAAe,SAAS,YAAY,IAAI,EAAE;AAAA,EAC3H;AAAA,EACA,gBAAgB;AACZ,UAAM,EAAE,SAAS,SAAS,MAAM,IAAI,KAAK;AACzC,QAAI,EAAE,WAAW,OAAO;AACpB,aAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IACpC;AACA,UAAM,SAAS,OAAO,UAAU,WAAWC,QAAO,MAAM,KAAK,IAAK,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AACpG,QAAI,WAAW,KAAK,WAAW,GAAG;AAC9B,aAAOD,QAAM,OAAO,QAAQ,EAAE,GAAG,OAAO,IAAI,QAAQ,CAAC;AAAA,IACzD;AACA,WAAO;AAAA,EACX;AACJ;AACO,IAAM,gBAAN,cAA4B,aAAa;AAAA,EAC5C,IAAI,SAAS;AACT,WAAO,YAAY;AAAA,EACvB;AAAA,EACA,YAAY,UAAU;AAClB,UAAM,QAAQ;AACd,QAAI,SAAS,UAAU,KAAK,QAAQ;AAChC,YAAM,IAAI,UAAU,0BAA0B;AAAA,IAClD;AAAA,EACJ;AAAA,EACA,QAAQ,EAAE,OAAO,GAAG,MAAM,WAAW;AACjC,UAAM,WAAW,KAAK;AACtB,QAAI,QAAQ,aAAa,CAACA,QAAM,OAAO,SAAS,OAAO,GAAG;AACtD,YAAM,SAAS,SAAS;AACxB,YAAM,UAAU,OAAO,cAAc;AAAA,QACjC,QAAQ;AAAA,QACR,OAAO,gBAAgB,kBAAkB,gBAAgB,oBAAoB,gBAAgB;AAAA,QAC7F,MAAM,CAAC,OAAO,OAAO,OAAO,MAAM;AAAA,MACtC,CAAC;AACD,aAAO,EAAE,SAAS,QAAQ,OAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO;AAAE,SAAK,WAAW;AAAA,EAA8B;AAC3D;AACO,IAAM,eAAN,cAA2B,aAAa;AAAA,EAC3C,IAAI,SAAS;AACT,WAAO,YAAY;AAAA,EACvB;AAAA,EACA,YAAY,UAAU;AAClB,UAAM,QAAQ;AACd,QAAI,SAAS,UAAU,KAAK,QAAQ;AAChC,YAAM,IAAI,UAAU,yBAAyB;AAAA,IACjD;AAAA,EACJ;AAAA,EACA,OAAO,KAAK,KAAK;AACb,YAAQ,KAAK;AAAA,MACT,KAAK;AACD,cAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,cAAM,eAAe,KAAK;AAC1B,cAAM,YAAY,IAAI,aAAa,CAAC,OAAO,aAAa,OAAO,cAAc,aAAa,YAAY,CAAC,CAAC;AACxG,eAAO,EAAE,QAAQ,QAAQ,cAAc,QAAQ,WAAW,eAAe,UAAU,KAAK,SAAS,SAAS,GAAG,OAAO,WAAW,SAAS,YAAY,IAAI,EAAE;AAAA,MAC9J;AACI,eAAO,MAAM,OAAO,GAAG;AAAA,IAC/B;AAAA,EACJ;AAAA,EACA,QAAQ,GAAG;AACP,WAAO;AAAA,EACX;AAAA,EACA,OAAO;AAAE,SAAK,WAAW;AAAA,EAA6B;AAC1D;;;AGtGA,SAAS,SAAAE,eAAa;;;ACEtB,IAAM,oCAAoC,CAAC,SAAS,MAAM;AAKnD,SAAS,4CAA4C,MAAM;AAC9D,MAAI,OAAO,SAAS,UAAU;AAC1B,WAAO,KAAK,GAAG,iCAAiC;AAAA,EACpD;AAEA,QAAM,QAAQ,IAAI,OAAO,2CAA2C,4BAA4B,IAAI,6BAA6B,wBAAwB;AACzJ,QAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,MAAI,OAAO;AACP,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,SAAO;AACxC,YAAM,MAAM,IAAI,MAAM,GAAG;AACzB,aAAO,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,IACtD,CAAC;AACD,QAAI,KAAK,WAAW,KACb,KAAK,CAAC,EAAE,SAAS,MAAM,CAAC,KACxB,KAAK,CAAC,EAAE,SAAS,kCAAkC;AACtD,YAAM,IAAI,MAAM,6DAA6D,KAAK,CAAC,GAAG,IAAI,WAAW,KAAK,CAAC,GAAG,IAAI,GAAG;AAAA,IACzH;AACA,UAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,WAAO,EAAE,MAAM,MAAM,KAAK,IAAI,OAAK,EAAE,IAAI,GAAG,KAAK;AAAA,EACrD,OACK;AACD,UAAM,IAAI,MAAM,8FAA8F,4BAA4B,IAAI,6BAA6B,WAAW,gCAAgC,QAAQ,4BAA4B,IAAI,6BAA6B,EAAE;AAAA,EACjS;AACJ;;;AD5BA,IAAM,2BAA2B;AAAA,EAC7B,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA,EACxB,gCAAgC;AAAA,EAChC,8BAA8B;AAClC;AACO,SAAS,kBAAkB,UAAU,0BAA0B;AAClE,MAAI,WAAW,0BAA0B;AACrC,cAAUC,QAAM,OAAO,CAAC,GAAG,0BAA0B,OAAO;AAAA,EAChE;AAEA,QAAM,gBAAgB,QAAQ;AAC9B,MAAI,yBAAyB,eAAe,kBAAkB;AAC9D,MAAI,CAACA,QAAM,cAAc,aAAa,GAAG;AACrC,UAAM,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,aAAa,IAAI,4CAA4C,aAAa;AAChI,6BAAyB,GAAG,YAAY;AACxC,sBAAkB,MAAM,YAAY,KAAK,IAAI,KAAK,4BAA4B,KAAK,IAAI,KAAK,gCAAgC,QAAQ,4BAA4B;AAAA,MAClK,YAAY;AAAA;AAAA,EAEd;AAEA,QAAM,iBAAiB,QAAQ;AAC/B,MAAI,0BAA0B,UAAU,mBAAmB;AAC3D,MAAI,CAACA,QAAM,cAAc,cAAc,GAAG;AACtC,UAAM,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,aAAa,IAAI,4CAA4C,cAAc;AACjI,8BAA0B,GAAG,YAAY;AACzC,uBAAmB,MAAM,YAAY,KAAK,IAAI,KAAK,4BAA4B,KAAK,IAAI,KAAK,gCAAgC,QAAQ,6BAA6B;AAAA,MACpK,YAAY;AAAA;AAAA,EAEd;AACA,QAAM,OAAOA,QAAM,OAAO,CAAC,GAAG,0BAA0B,OAAO;AAC/D,SAAO,UAAU,6BAA6B;AAAA;AAAA,gBAElC,KAAK,oBAAoB;AAAA,gBACzB,KAAK,oBAAoB;AAAA,gBACzB,KAAK,gBAAgB;AAAA,gBACrB,KAAK,yBAAyB;AAAA,gBAC9B,KAAK,iBAAiB;AAAA,gBACtB,KAAK,2BAA2B;AAAA;AAAA;AAAA,SAGvC,4BAA4B;AAAA,gBACrB,KAAK,qBAAqB;AAAA,gBAC1B,KAAK,mBAAmB;AAAA,gBACxB,KAAK,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAgB3B,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASvC,eAAe;AAAA;AAAA,EAEf,gBAAgB;AAAA;AAAA,SAET,KAAK,sBAAsB,cAAc,KAAK,wBAAwB;AAAA,SACtE,KAAK,qBAAqB,cAAc,KAAK,uBAAuB;AAAA,SACpE,KAAK,4BAA4B,cAAc,KAAK,8BAA8B,+BAA+B,gCAAgC;AAAA;AAAA,+BAE3H,4BAA4B,QAAQ,6BAA6B;AAAA,kBAC9E,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAMrB,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aASnC,uBAAuB;AAAA;AAEpC;;;AE7GA,SAAS,SAAAC,eAAa;AAEtB,IAAM,2BAA2B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,6BAA6B;AAAA,EAC7B,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,8BAA8B;AAAA,EAC9B,6BAA6B;AAAA,EAC7B,+BAA+B;AAAA,EAC/B,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EACxB,0BAA0B;AAC9B;AACA,SAAS,gCAAgC,MAAM;AAC3C,SAAO,UAAU,6BAA6B;AAAA;AAAA,gBAElC,KAAK,2BAA2B;AAAA,gBAChC,KAAK,yBAAyB;AAAA;AAE9C;AACO,SAAS,yBAAyB,UAAU,0BAA0B;AACzE,QAAM,OAAOC,QAAM,OAAO,CAAC,GAAG,0BAA0B,OAAO;AAC/D,SAAO,GAAG,gCAAgC,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAa1C,KAAK,sBAAsB,cAAc,KAAK,wBAAwB;AAAA,SACtE,KAAK,qBAAqB,cAAc,KAAK,uBAAuB;AAAA,SACpE,KAAK,0BAA0B,cAAc,KAAK,4BAA4B;AAAA;AAAA;AAAA,gDAGvC,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAUhE,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAK1C;AACO,SAAS,qBAAqB,UAAU,0BAA0B;AACrE,QAAM,OAAOA,QAAM,OAAO,CAAC,GAAG,0BAA0B,OAAO;AAC/D,SAAO,GAAG,gCAAgC,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAmB1C,KAAK,sBAAsB,cAAc,KAAK,wBAAwB;AAAA,SACtE,KAAK,qBAAqB,cAAc,KAAK,uBAAuB;AAAA,SACpE,KAAK,0BAA0B,cAAc,KAAK,4BAA4B;AAAA,SAC9E,KAAK,2BAA2B,cAAc,KAAK,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gDA0EzC,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAShE,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAM1C;;;ACtKO,SAAS,4BAA4B,aAAa,kCAAkC;AACvF,SAAO;AAAA;AAAA;AAAA;AAAA,WAIA,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOrB;;;ACjBA,SAAS,SAAAC,eAAa;AAEtB,IAAM,8BAA8B;AAAA,EAChC,IAAI;AACR;AACO,SAAS,WAAW,aAAa,6BAA6B,OAAO,UAAU,uBAAuB;AACzG,QAAM,MAAMC,QAAM,WAAW;AAC7B,QAAM,mBAAmB,WAAW,GAAG;AACvC,QAAM,eAAe,OAAO,GAAG;AAC/B,QAAM,MAAMA,QAAM,OAAO,CAAC,GAAG,6BAA6B,UAAU;AACpE,QAAM,aAAa,IAAI,YAAY,eAAe,IAAI;AACtD,MAAIA,QAAM,cAAc,UAAU,GAAG;AACjC,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACxF;AACA,QAAM,YAAY,eACd,aAAa,IAAI,CAAC,MAAM,UAAU,UAAU,IAAI,GAAG,IAAI,oBAAoB,YAAY,KAAK,gBAAgB,KAAK,IAAI,EAAE,OAAO,UAAU,MAAM,GAAG,IAAI,MAAM,aAAa,CAAC,CAAC,GAAG,IAC3K,CAAC,iBAAiB,YAAY,KAAK,gBAAgB,KAAK,IAAI,EAAE,OAAO,UAAU,EAAE;AACvF,SAAO;AAAA;AAAA;AAAA;AAAA,IAIH,UAAU;AAAA,MAAC,UAAU,KAAK,cAAc,OAAO,SAAS,gBAAgB;AAAA,MACpE,UAAU,KAAK,cAAc,UAAU,CAAC,SAAS,YAAY;AAAA,IAAoB;AAAA;AAAA,IAErF;AAAA,EACJ;AACJ;;;AC1BA,SAAS,SAAAC,eAAa;AACtB,IAAM,oCAAoC;AAAA,EACtC,QAAQ;AAAA,EAAU,YAAY;AAClC;AACO,SAAS,iBAAiB,YAAY,OAAO,SAAS;AACzD,QAAM,MAAMA,QAAM,WAAW;AAC7B,QAAM,iBAAiB,eAAe,GAAG;AACzC,QAAM,MAAMA,QAAM,OAAO,CAAC,GAAG,mCAAmC,UAAU;AAC1E,QAAM,aAAa,IAAI,YAAY,cAAc,IAAI,aAAa,SAAS,IAAI,UAAU;AACzF,MAAIA,QAAM,cAAc,UAAU,GAAG;AACjC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACrE;AACA,SAAO;AAAA;AAAA,IAEH,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA,IAIlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF;AAAA;AAAA,IAEM,UAAU,CAAC,UAAU,KAAK,cAAc,OAAO,kBAAkB,cAAc,qBAAqB;AAAA;AAAA,IAEpG,WAAW,cAAc,CAAC,GAAG,WAAW,0BAA0B,MAAM,KAAK,UAAU,KAAK,cAAc,IAAI,IAAI,CAAC,sBAAsB,MAAM,KAAK,UAAU,KAAK,cAAc,GAAG;AAAA,EACxL;AACJ;;;AC9BA,SAAS,SAAAC,eAAa;AACtB,IAAM,6BAA6B;AAAA,EAC/B,QAAQ;AAAA,EAAU,UAAU;AAAA,EAAU,KAAK;AAAA,EAAO,YAAY;AAAA,EAAS,eAAe;AAAA,EAAS,WAAW;AAC9G;AACO,SAAS,UAAU,YAAY,OAAO,SAAS;AAClD,QAAM,MAAMA,QAAM,WAAW;AAC7B,QAAM,iBAAiB,QAAQ,GAAG;AAClC,QAAM,MAAMA,QAAM,OAAO,CAAC,GAAG,4BAA4B,UAAU;AACnE,QAAM,aAAa,IAAI,YAAY,cAAc,IAAI,aAAa,SAAS,IAAI,QAAQ,MAAM,IAAI,KAAK,SAAS,IAAI,UAAU,YAAY,IAAI,WAAW,gBAAgB,IAAI;AAC5K,MAAIA,QAAM,cAAc,UAAU,GAAG;AACjC,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACrE;AACA,SAAO;AAAA;AAAA,IAEH,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA,IAIlB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcF;AAAA;AAAA,IAEM,UAAU,CAAC,UAAU,KAAK,cAAc,OAAO,kBAAkB,cAAc,cAAc;AAAA;AAAA,IAE7F,WAAW,cAAc,CAAC,GAAG,WAAW,mBAAmB,MAAM,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU,KAAK,aAAa,KAAK,SAAS,KAAK,cAAc,IAAI,IAAI,CAAC,eAAe,MAAM,KAAK,MAAM,KAAK,GAAG,KAAK,UAAU,KAAK,aAAa,KAAK,SAAS,KAAK,cAAc,GAAG;AAAA,EAChR;AACJ;;;ACtCA,SAAS,SAAAC,eAAa;AACf,SAAS,aAAa,YAAY,OAAO,SAAS;AACrD,QAAM,MAAMA,QAAM,WAAW;AAC7B,QAAM,iBAAiB,WAAW,GAAG;AACrC,QAAM,aAAa,WAAW,YAAY,cAAc,WAAW;AACnE,MAAIA,QAAM,cAAc,UAAU,KAAKA,QAAM,cAAc,WAAW,GAAG;AACrE,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACxF;AACA,SAAO;AAAA;AAAA,IAEH,aAAa,CAAC;AAAA;AAAA;AAAA,IAGlB;AAAA;AAAA,EAEF;AAAA;AAAA,IAEM,UAAU,CAAC,UAAU,KAAK,cAAc,OAAO,kBAAkB,cAAc,iBAAiB;AAAA;AAAA,IAEhG,WAAW,CAAC,GAAG,WAAW,qBAAqB,UAAU,KAAK,cAAc,IAAI;AAAA,EACpF;AACJ;;;ACrBA,SAAS,SAAAC,eAAa;AACtB,SAAS,UAAAC,eAAc;AACvB,SAAS,YAAAC,iBAAgB;;;ACFzB,SAAS,YAAAC,iBAAgB;AAGzB,IAAM,WAAWC,UAAS,cAAc;AACxC,IAAM,WAAWA,UAAS,cAAc;AACxC,IAAM,eAAe,EAAE,OAAO,GAAG,QAAQ,EAAE;AACpC,IAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,OAAO,OAAO,QAAQ;AAClB,QAAI,oBAAoB,MAAM,GAAG;AAC7B,aAAO,IAAI,kBAAkB,MAAM;AAAA,IACvC;AACA,QAAI,qBAAqB,MAAM,GAAG;AAC9B,aAAO,IAAI,mBAAmB,MAAM;AAAA,IACxC;AACA,UAAM,IAAI,UAAU,gBAAgB,OAAO,MAAM,CAAC,kBAAkB;AAAA,EACxE;AACJ;AAQA,SAAS,KAAK,KAAK,QAAQ,IAAI;AAC3B,QAAM;AAAA;AAAA,IAA2C,SAAS,SAAS,QAAQ,GAAG;AAAA;AAC9E,QAAM,IAAI,SAAS,MAAM,IAAI,CAAC;AAC9B,QAAM,IAAI,SAAS,MAAM,GAAG,CAAC;AAC7B,WAAS,UAAU,CAAC;AACpB,WAAS,UAAU,CAAC;AACpB,WAAS,UAAU,CAAC;AACpB,QAAM,UAAU,CAAC,SAAS,IAAI,GAAG,GAAG;AACpC,QAAM,UAAU,CAAC,SAAS,IAAI,GAAG,GAAG;AACpC,QAAM,UAAU,CAAC,SAAS,IAAI,GAAG,GAAG;AACpC,SAAO,SAAS,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,SAAS,SAAS,SAAS,CAAC;AAC3G;AACA,SAAS,yBAAyB,MAAM,KAAK;AACzC,MAAI,QAAQ,GAAG;AACX,UAAM,IAAI,WAAW,uCAAuC;AAAA,EAChE;AACA,MAAI,OAAO,MAAM;AACb,UAAM,IAAI,WAAW,8DAA8D;AAAA,EACvF;AACJ;AASA,SAAS,YAAY,OAAO,KAAK,cAAc,GAAG,OAAO,KAAK,MAAM,KAAM;AACtE,2BAAyB,MAAM,GAAG;AAClC,QAAM,QAAQ,KAAK,IAAI,MAAK,KAAK,MAAM,IAAI,OAAO,IAAI;AACtD,QAAM,MAAM,QAAQ;AACpB,QAAM,cAAc,OAAO,SAAS,GAAG;AACvC,QAAM,MAAM,cAAe,OAAO,OAAO,OAAQ;AACjD,QAAM,UAAU,cAAe,MAAM,QAAQ,OAAO,OAAQ,CAAC;AAC7D,SAAO,SAAS,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI,GAAG,GAAG,SAAS,CAAC;AACtF;AAUA,SAAS,aAAa,MAAM,OAAO,KAAK,QAAQ,OAAO,KAAI,MAAM,KAAM;AACnE,2BAAyB,MAAM,GAAG;AAClC,SAAO,SAAS,KAAK,KAAK,QAAQ,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG,GAAG,GAAG,KAAK,OAAO,MAAM,IAAI,OAAO,UAAU,OAAO,SAAS,MAAM,WAAW,SAAS,MAAM,QAAQ,OAAO,MAAM,CAAC;AACtM;AACO,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EAC5B,YAAY,SAAS;AACjB,SAAK,UAAU;AAAA,EACnB;AAAA,EACA,OAAO,KAAK,QAAQ;AAChB,WAAO,KAAK,OAAO,UAAU,OAAO,QAAQ,OAAO,EAAE;AAAA,EACzD;AAAA,EACA,OAAO,WAAW,QAAQ,OAAO,cAAc;AAC3C,UAAM,MAAM,OAAO,UAAU,SAAS,OAAO;AAC7C,UAAM,IAAI,SAAS,SAAS,QAAQ,GAAG;AACvC,aAAS,UAAU,CAAC;AACpB,UAAM,OAAO,SAAS,IAAI,GAAG,GAAG;AAChC,UAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAM,QAAQ,QAAQ;AACtB,UAAM,SAAS,MAAK;AACpB,UAAM,IAAI,SAAS,OAAO,IAAI;AAC9B,UAAM,MAAM,OAAO,MAAM,GAAG,SAAS,OAAO,SAAS;AACrD,UAAM,QAAQ,OAAO,QAAQ,GAAG,OAAO,OAAO,OAAO;AACrD,WAAO,aAAa,MAAM,OAAO,KAAK,QAAQ,OAAO,MAAM,OAAO,GAAG;AAAA,EACzE;AAAA,EACA,OAAO;AACH,WAAO,oBAAmB,KAAK,KAAK,OAAO;AAAA,EAC/C;AAAA,EACA,WAAW,MAAM;AACb,WAAO,oBAAmB,WAAW,KAAK,SAAS,IAAI;AAAA,EAC3D;AACJ;AACO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAC3B,YAAY,SAAS;AACjB,SAAK,UAAU;AAAA,EACnB;AAAA,EACA,OAAO,KAAK,QAAQ;AAChB,WAAO,KAAK,OAAO,UAAU,OAAO,QAAQ,OAAO,EAAE;AAAA,EACzD;AAAA,EACA,OAAO,WAAW,QAAQ,OAAO,cAAc;AAC3C,UAAM,cAAe,KAAK,QAAQ,KAAK,SAAU,OAAO;AACxD,WAAO,YAAY,OAAO,KAAK,aAAa,OAAO,MAAM,OAAO,GAAG;AAAA,EACvE;AAAA,EACA,OAAO;AACH,WAAO,mBAAkB,KAAK,KAAK,OAAO;AAAA,EAC9C;AAAA,EACA,WAAW,MAAM;AACb,WAAO,mBAAkB,WAAW,KAAK,SAAS,IAAI;AAAA,EAC1D;AACJ;;;ADhHA,IAAMC,YAAWC,UAAS,cAAc;AACxC,IAAMC,YAAWD,UAAS,cAAc;AACxC,SAAS,wBAAwB,KAAK,MAAM;AACxC,MAAI,OAAO,SAAS,YAAY;AAC5B,WAAO,KAAK;AAAA,EAChB;AACA,QAAM,IAAI,WAAW,WAAW,GAAG,uBAAuB,IAAI,GAAG;AACrE;AACA,SAAS,uBAAuB,MAAM,WAAW,MAAM;AACnD,OAAK,UAAU,QAAQ,KAAK;AAC5B,MAAI,QAAQ,IAAI,GAAG;AACf,SAAK,QAAQ,WAAWE,QAAM,WAAW;AACzC,WAAO,IAAI,sBAAsB,MAAM,QAAQ,GAAG,IAAI;AAAA,EAC1D;AACA,MAAI,OAAO,IAAI,GAAG;AACd,SAAK,QAAQ,UAAUA,QAAM,WAAW;AACxC,WAAO,IAAI,qBAAqB,MAAM,QAAQ,GAAG,IAAI;AAAA,EACzD;AACA,MAAI,SAAS,IAAI,GAAG;AAChB,SAAK,QAAQ,YAAYA,QAAM,WAAW;AAC1C,WAAO,IAAI;AAAA,MAAuB;AAAA;AAAA,IAAiB;AAAA,EACvD;AACA,MAAI,QAAQ,IAAI,GAAG;AACf,SAAK,QAAQ,WAAW,KAAK,OAAO,MAAMA,QAAM,WAAW;AAC3D,WAAO,IAAI;AAAA,MAAsB;AAAA;AAAA,IAAiB;AAAA,EACtD;AACA,QAAM,IAAI,MAAM,8BAA8B;AAClD;AACO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAAY,MAAM;AACd,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA,EAEA,IAAI,QAAQ;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,KAAK,QAAQ;AACT,UAAM,EAAE,QAAQ,SAAS,QAAQ,OAAO,IAAI,KAAK;AACjD,UAAM,SAAS,QAAQ,CAAC;AACxB,QAAI,aAAa,OAAO,aAAa;AACrC,aAAS,QAAQ,QAAQ;AACrB,UAAI,KAAK,UAAU;AACf;AAAA,MACJ;AAEA,YAAM,WAAW,OAAO,MAAM,QAAQ,MAAM;AAC5C,UAAI,CAAC,UAAU;AACX;AAAA,MACJ;AAEA,wBAAkB,WAAW,IAAI;AACjC,UAAI,CAAC,YAAY;AACb,0BAAkB,WAAW,MAAM;AACnC,qBAAa;AAAA,MACjB;AACA,UAAI,CAAC,YAAY;AACb,eAAO,QAAQ,WAAS,kBAAkB,WAAW,KAAK,CAAC;AAC3D,qBAAa;AAAA,MACjB;AAAA,IACJ;AACA,aAAS,SAAS,QAAQ;AAEtB,wBAAkB,WAAW,KAAK;AAAA,IACtC;AAAA,EACJ;AACJ;AACO,IAAM,iBAAN,MAAqB;AAAA,EACxB,OAAO,OAAO,MAAM;AAChB,QAAI,WAAW,IAAI,GAAG;AAClB,WAAK,QAAQ,cAAcA,QAAM,WAAW;AAC5C,aAAO,IAAI,eAAe,IAAI;AAAA,IAClC;AACA,QAAI,WAAW,IAAI,GAAG;AAClB,aAAO,IAAI,eAAe,IAAI;AAAA,IAClC;AACA,QAAI,cAAc,IAAI,GAAG;AACrB,aAAO,IAAI,kBAAkB,IAAI;AAAA,IACrC;AACA,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC9C;AACJ;AACO,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAC3B,OAAO,OAAO,SAAS,MAAM;AACzB,WAAO,uBAAuB,MAAM,MAAM,GAAG,IAAI;AAAA,EACrD;AAAA,EACA,OAAO,WAAW,QAAQ,gBAAgB,OAAO;AAC7C,WAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,QAAI,eAAe;AACf,YAAM,aAAa;AACnB,UAAI,CAACA,QAAM,OAAO,WAAW,MAAM,GAAG;AAClC,2BAAkB,WAAW,WAAW,QAAQ,IAAI;AAAA,MACxD;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,OAAO,SAAS,QAAQ;AACpB,UAAM,aAAa;AACnB,UAAM,mBAAmB,WAAW;AACpC,UAAM,cAAcA,QAAM,OAAO,gBAAgB,IAAI,CAAC,IAAI,mBAAkB,SAAS,gBAAgB;AACrG,WAAO,WAAW,KAAK,MAAM,MAAM,WAAW;AAAA,EAClD;AACJ;AACA,IAAM,oBAAN,MAAwB;AAAA,EACpB;AAAA,EACA,YAAY,MAAM;AACd,SAAK,QAAQ;AAAA,EACjB;AAAA,EACA,IAAI,OAAO;AACP,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AACH,SAAK,QAAQ;AAAA,EACjB;AAAA,EACA,SAAS;AACL,SAAK,QAAQ;AACb,UAAM,UAAU,KAAK;AACrB,WAAO,QAAQ,SAAS,GAAG;AACvB,YAAM,MAAM,QAAQ,MAAM;AAC1B,WAAK,eAAe,GAAG;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,eAAe,KAAK;AAChB,QAAI,aAAa,KAAK;AAClB,UAAI,QAAQ,QAAQ;AAAA,IACxB,WACS,YAAY,KAAK;AACtB,UAAI,OAAO,QAAQ;AAAA,IACvB;AAAA,EACJ;AAAA,EACA,iBAAiB,SAAS;AACtB,aAAS,OAAO,MAAM,KAAK,OAAO,EAAE,OAAO,GAAG,KAAK,SAAS,OAAO,CAAC,CAAC,GAAG;AACpE,UAAI,CAAC,KAAK;AACN;AAAA,MACJ;AACA,UAAI,KAAK,OAAO;AACZ,aAAK,SAAS,KAAK,GAAG;AAAA,MAC1B,OACK;AACD,aAAK,eAAe,GAAG;AAAA,MAC3B;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AACN,SAAK,QAAQ;AACb,SAAK,YAAY;AAAA,EACrB;AAAA,EACA,IAAI,WAAW;AACX,WAAO,KAAK;AAAA,EAChB;AACJ;AACA,IAAM,uBAAN,cAAmC,kBAAkB;AAAA,EACjD,YAAY,MAAM,cAAc;AAC5B,UAAM,IAAI;AACV,SAAK,UAAU;AACf,SAAK,SAASA,QAAM,SAAS,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,oBAAI,IAAI;AAAA,EACvB,IAAI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,KAAK;AACL,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,WAAW;AACP,UAAM,SAAS,KAAK;AAEpB,WAAO,KAAK,KAAK,MAAM,MAAM,QAAQ,SAAS,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA,EACA,4BAA4B;AACxB,QAAI,cAAcD,UAAS,SAAS;AACpC,QAAI,OAAO;AACX,WAAO,CAACC,QAAM,OAAO,KAAK,MAAM,GAAG;AAC/B,YAAM,aAAa,KAAK,OAAO;AAC/B,YAAM,mBAAmBD,UAAS,UAAU,WAAW,mBAAmBA,UAAS,SAAS,GAAG,WAAW,YAAYF,UAAS,KAAK,CAAC;AACrI,oBAAcE,UAAS,SAAS,aAAa,gBAAgB;AAC7D,aAAO,KAAK;AAAA,IAChB;AACA,WAAO;AAAA,EACX;AAAA,EACA,sBAAsB;AAClB,UAAM,aAAaA,UAAS,UAAU,KAAK,KAAK,mBAAmBA,UAAS,SAAS,GAAG,KAAK,KAAK,YAAYF,UAAS,KAAK,CAAC;AAC7H,UAAM,oBAAoB,KAAK,0BAA0B;AACzD,WAAOE,UAAS,SAAS,YAAY,iBAAiB;AAAA,EAC1D;AAAA,EACA,YAAY,oBAAI,IAAI;AAAA,EACpB,QAAQ,KAAK;AACT,WAAO,KAAK,UAAU,IAAI,GAAG,KAAK;AAAA,EACtC;AAAA,EACA,OAAO,SAAS,KAAK;AACjB,QAAI,QAAQ,SAAS;AACjB,YAAM,cAAc,KAAK;AACzB,YAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,UAAI,YAAY,IAAI,QAAQ,GAAG;AAC3B,eAAOC,QAAM,OAAO,EAAE,OAAO,MAAM,GAAG,YAAY,IAAI,QAAQ,CAAC;AAAA,MACnE;AACA,YAAM,mBAAmB,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;AAClD,YAAM,oBAAoB,QAAQ,cAAc,QAAQ,kBAAkB,eAAe,cAAc;AACvG,YAAMC,UAASD,QAAM,OAAO,EAAE,QAAQ,mBAAmB,OAAO,kBAAkB,SAAS,YAAY,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC;AAC/H,WAAK,aAAa,IAAI,UAAUC,OAAM;AACtC,aAAOA;AAAA,IACX;AACA,UAAM,SAAS,KAAK,eAAe,SAAS,GAAG;AAC/C,SAAK,UAAU,IAAI,KAAK,OAAO,OAAO;AACtC,WAAO;AAAA,EACX;AACJ;AACA,IAAM,kBAAkB,EAAE,QAAQ,YAAY,OAAO,OAAO,WAAW,OAAO,CAAC,EAAE;AAEjF,IAAM,wBAAN,cAAoC,qBAAqB;AAAA,EACrD;AAAA,EACA,YAAY,OAAO,WAAW,MAAM;AAChC,UAAM,OAAO,MAAM;AACnB,SAAK,YAAY,MAAM,iBAAiB,IAAI,OAAK,uBAAuB,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,EAC7F;AAAA,EACA,IAAI,WAAW;AACX,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,eAAe,KAAK,KAAK;AACrB,WAAO;AAAA,EACX;AAAA,EACA,QAAQ,GAAG;AACP,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EACA,UAAU;AACN,SAAK,UAAU,QAAQ,OAAK,EAAE,QAAQ,CAAC;AAAA,EAE3C;AACJ;AAGA,IAAM,yBAAN,MAAM,gCAA+B,qBAAqB;AAAA,EACtD,WAAW,oBAAI,IAAI;AAAA,EACnB;AAAA,EACA,YAAY,QAAQ;AAChB,UAAM,MAAM;AAAA,EAChB;AAAA,EACA,QAAQ,GAAG;AACP,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EACA,eAAe,SAAS,KAAK;AAEzB,QAAI,QAAQ;AACZ,QAAI,KAAK,SAAS,EAAE,SAAS,KAAKD,QAAM,OAAO,KAAK,KAAK,GAAG;AACxD,cAAQ;AACR,WAAK,SAAS,MAAM;AACpB,WAAK,iBAAiB,OAAO;AAAA,IACjC;AACA,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,CAAC,KAAK,SAAS,IAAI,QAAQ,GAAG;AAC9B,cAAQ;AACR,WAAK,SAAS,IAAI,UAAU,KAAK,KAAK;AAAA,IAC1C;AACA,sBAAkB,WAAW,IAAI;AACjC,YAAQ,KAAK;AAAA,MACT,KAAK;AACD,eAAOA,QAAM,OAAO,KAAK,OAAO,EAAE,MAAM,CAAC;AAAA,MAC7C;AACI,gCAAwB,KAAK,uBAAsB;AAAA,IAC3D;AAAA,EACJ;AAAA,EACA,iBAAiB,EAAE,QAAQ,OAAO,GAAG;AAEjC,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,QAAQ,OAAO,GAAG;AACjC,UAAM,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI;AACxB,UAAME,QAAO,OAAO,KAAK;AACzB,UAAM,aAAa,OAAO,WAAW,MAAM;AAC3C,UAAM,iBAAiBH,UAAS,SAASG,OAAM,UAAU;AACzD,UAAM,YAAY,IAAI,aAAa,KAAK,KAAK,CAAC;AAC9C,cAAU,IAAIH,UAAS,QAAQG,KAAI,GAAG,CAAC;AACvC,cAAU,IAAIH,UAAS,QAAQ,cAAc,GAAG,EAAE;AAClD,cAAU,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE;AAE3B,QAAIC,QAAM,OAAO,KAAK,KAAK,GAAG;AAC1B,YAAM,aAAa,QAAQ,cAAc,QAAQ,WAAW,eAAe,aAAa;AACxF,WAAK,QAAQ,EAAE,QAAQ,YAAY,OAAO,WAAW,SAAS,YAAY,IAAI,EAAE,SAAS,EAAE;AAAA,IAC/F,OACK;AACD,WAAK,MAAM,QAAQ;AACnB,WAAK,MAAM,UAAU,YAAY,IAAI,EAAE,SAAS;AAAA,IACpD;AAAA,EACJ;AAAA,EACA,eAAe;AACX,SAAK,SAAS,MAAM;AACpB,UAAME,QAAO,KAAK;AAClB,SAAK,QAAQ;AACb,SAAK,cAAcA,KAAI;AAAA,EAC3B;AAAA,EACA,UAAU;AACN,SAAK,aAAa;AAAA,EACtB;AACJ;AAGA,IAAM,iBAAN,MAAM,wBAAuB,kBAAkB;AAAA,EAC3C,aAAa,CAAC;AAAA,EACd,aAAa,EAAE,WAAW,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ,KAAK;AAAA,EACtE;AAAA,EACA,YAAY,UAAU;AAClB,UAAM,QAAQ;AACd,aAAS,UAAU,CAAC;AAAA,EACxB;AAAA,EACA,OAAO,SAAS,KAAK;AACjB,UAAM,QAAQ,KAAK,KAAK,SAAS,CAAC;AAClC,QAAIF,QAAM,OAAO,KAAK,gBAAgB,KAAK,MAAM,SAAS,kBAAkB,QAAQ,GAAG;AACnF,YAAM,OAAO,CAAC;AACd,WAAK;AAAA,MAAyB,CAAC;AAC/B,WAAK,wBAAwB,OAAO;AAAA,IACxC;AACA,UAAM,YAAY,KAAK;AACvB,UAAM,OAAO,KAAK;AAClB,UAAM,EAAE,SAAS,IAAI;AACrB,UAAM,MAAO,KAAK,WAAW,GAAG,MAAM,oBAAI,IAAI;AAC9C,UAAM,gBAAgB,CAAC,IAAI,IAAI,QAAQ;AACvC,UAAM,cAAc,CAAC,WAAW;AAC5B,UAAI,eAAe;AACf,YAAI,IAAI,UAAU,MAAM;AAAA,MAC5B;AACA,aAAO;AAAA,IACX;AACA,YAAQ,KAAK;AAAA,MACT,KAAK;AACD,cAAM,EAAE,UAAU,IAAI,MAAM,WAAW,UAAU;AACjD,kBAAU,YAAY;AACtB,eAAOA,QAAM,OAAO,YAAY,SAAS,GAAG,EAAE,OAAO,YAAY,cAAc,CAAC;AAAA,MACpF,KAAK;AACD,cAAM,EAAE,QAAQ,IAAI,MAAM,YAAY,UAAU;AAChD,kBAAU,UAAU;AACpB,eAAOA,QAAM,OAAO,YAAY,OAAO,GAAG,EAAE,OAAO,aAAa,cAAc,CAAC;AAAA,MACnF,KAAK;AACD,cAAM,EAAE,GAAG,IAAI,MAAM,UAAU,UAAU;AACzC,kBAAU,KAAK;AACf,eAAOA,QAAM,OAAO,EAAE,OAAO,WAAW,cAAc,GAAG,YAAY,EAAE,CAAC;AAAA,MAC5E,KAAK;AAED,cAAM,EAAE,OAAO,IAAI,MAAM,YAAY,UAAU;AAC/C,kBAAU,SAAS;AACnB,eAAOA,QAAM,OAAO,YAAY,MAAM,GAAG,EAAE,OAAO,aAAa,cAAc,CAAC;AAAA,MAClF;AACI,gCAAwB,KAAK,eAAc;AAAA,IACnD;AAAA,EACJ;AAAA,EACA,QAAQ,GAAG;AACP,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EACA,wBAAwB,EAAE,OAAO,GAAG;AAChC,SAAK,gBAAgB;AACrB,UAAM,UAAU,YAAY,IAAI;AAChC,UAAM,WAAW,KAAK,MAAM,MAAM,SAAS;AAC3C,QAAI,eAAe,QAAQ,GAAG;AAC1B,YAAM,eAAe;AAErB,YAAM,qBAAqB,CAACA,QAAM,cAAc,aAAa,eAAe;AAC5E,YAAM,gBAAgB,qBAClB,aAAa,gBAAgB,IAAI,WAAS,aAAa,UAAU,KAAK,CAAC,IACrE,aAAa;AACnB,YAAM,UAAU,cAAc,SAAS,GAAG,UAAU,UAAU,cAAc;AAC5E,YAAM,iBAAiB,IAAI,aAAa,OAAO;AAC/C,YAAM,eAAe,IAAI,aAAa,OAAO;AAC7C,YAAM,UAAU,IAAI,aAAa,OAAO;AACxC,YAAM,YAAY,IAAI,aAAa,IAAI,UAAU,OAAO;AACxD,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC3C,cAAM,UAAU,IAAI;AACpB,cAAM,UAAU,IAAI;AACpB,cAAM,EAAE,GAAG,GAAG,EAAE,IAAI,cAAc,CAAC;AACnC,cAAM,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,aAAa,QAAQ,CAAC;AACtD,cAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,aAAa,mBAAmB,CAAC;AACxD,uBAAe,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,OAAO;AACrC,qBAAa,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,OAAO;AACtC,gBAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO;AAC3B,kBAAU,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,GAAG,UAAU,IAAI,OAAO;AAAA,MACpE;AACA,YAAM,YAAY,QAAQ,OAAO,QAAQ,gBAAgB,eAAe,kBAAkB,MAAM,mBAAmB;AACnH,YAAM,UAAU,QAAQ,OAAO,QAAQ,cAAc,eAAe,kBAAkB,MAAM,iBAAiB;AAC7G,YAAM,KAAK,QAAQ,OAAO,QAAQ,SAAS,eAAe,kBAAkB,MAAM,eAAe;AACjG,YAAM,OAAO,QAAQ,OAAO,QAAQ,WAAW,eAAe,kBAAkB,MAAM,SAAS;AAC/F,WAAK,mBAAmB;AAAA,QACpB,QAAQ,EAAE,QAAQ,MAAM,OAAO,WAAW,QAAQ;AAAA,QAClD,WAAW,EAAE,QAAQ,WAAW,OAAO,gBAAgB,QAAQ;AAAA,QAC/D,SAAS,EAAE,QAAQ,SAAS,OAAO,cAAc,QAAQ;AAAA,QACzD,IAAI,EAAE,QAAQ,IAAI,OAAO,SAAS,QAAQ;AAAA,MAC9C;AACA,WAAK,aAAa,EAAE,WAAW,MAAM,SAAS,MAAM,IAAI,MAAM,QAAQ,KAAK;AAAA,IAC/E,OACK;AACD,YAAM,iBAAiB,IAAI,aAAa,aAAa,mBAAmB,SAAS,SAAS,CAAC;AAC3F,YAAM,YAAY,QAAQ,cAAc,QAAQ,gBAAgB,eAAe,kBAAkB,MAAM,mBAAmB;AAC1H,WAAK,mBAAmB;AAAA,QACpB,WAAW,EAAE,QAAQ,WAAW,OAAO,gBAAgB,QAAQ;AAAA,QAC/D,QAAQ,EAAE,QAAQ,WAAW,OAAO,gBAAgB,QAAQ;AAAA,MAChE;AACA,WAAK,aAAa,EAAE,WAAW,MAAM,QAAQ,KAAK;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,kBAAkB;AACd,SAAK,aAAa,CAAC;AACnB,UAAM,WAAW,KAAK;AACtB,QAAI,CAACA,QAAM,OAAO,QAAQ,GAAG;AACzB,WAAK,cAAc,SAAS,WAAW,SAAS,SAAS,SAAS,EAAE;AAAA,IACxE;AAAA,EACJ;AAAA,EACA,UAAU;AACN,SAAK,gBAAgB;AAAA,EACzB;AACJ;AAGA,IAAM,iBAAN,MAAM,wBAAuB,kBAAkB;AAAA,EAC3C,aAAa,CAAC;AAAA,EACd,cAAc,CAAC;AAAA,EACf;AAAA,EACA,WAAW,oBAAI,IAAI;AAAA,EACnB,YAAY,oBAAI,IAAI;AAAA,EACpB,YAAY,UAAU;AAClB,UAAM,QAAQ;AACd,aAAS,UAAU,CAAC;AACpB,QAAI,SAAS,MAAM,QAAQ,kBAAkB,QAAQ,MAAM,IAAI;AAC3D,eAAS,MAAM,KAAK,kBAAkB,QAAQ;AAAA,IAClD;AAAA,EACJ;AAAA,EACA,OAAO,SAAS,KAAK;AACjB,UAAM,QAAQ,KAAK,KAAK,SAAS,CAAC;AAClC,QAAI,QAAQA,QAAM,OAAO,KAAK,aAAa;AAC3C,QAAI,MAAM,SAAS,kBAAkB,QAAQ,GAAG;AAC5C,WAAK;AAAA,MAAyB,CAAC;AAC/B,YAAM,OAAO,CAAC;AACd,cAAQ;AACR,WAAK,UAAU,MAAM;AACrB,WAAK,sBAAsB;AAAA,IAC/B;AACA,UAAM,EAAE,SAAS,IAAI;AACrB,UAAM,MAAO,KAAK,WAAW,GAAG,MAAM,oBAAI,IAAI;AAC9C,YAAQ,KAAK;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACD,cAAM,SAAS,KAAK,sBAAsB,SAAS,GAAG;AACtD,YAAI,QAAQ;AACR,cAAI,CAAC,IAAI,IAAI,QAAQ,GAAG;AACpB,oBAAQ;AACR,gBAAI,IAAI,UAAU,MAAM;AAAA,UAC5B;AACA,iBAAOA,QAAM,OAAO,QAAQ,EAAE,MAAM,CAAC;AAAA,QACzC;AACA,eAAO;AAAA,MACX;AACI,gCAAwB,KAAK,eAAc;AAAA,IACnD;AAAA,EACJ;AAAA,EACA,sBAAsB,KAAK,MAAM,YAAY;AACzC,UAAM,MAAM,KAAK;AACjB,QAAI,SAAS,IAAI,IAAI,GAAG;AACxB,QAAI,QAAQ;AACR,aAAO;AAAA,IACX;AACA,QAAI,IAAI,IAAI,GAAG,GAAG;AACd,aAAO;AAAA,IACX;AACA,aAAS,KAAK,eAAe,OAAO,KAAK,GAAG;AAC5C,QAAI,QAAQ;AACR,UAAI,IAAI,KAAK,MAAM;AAAA,IACvB;AACA,WAAO;AAAA,EACX;AAAA,EACA,wBAAwB;AACpB,SAAK,gBAAgB,UAAU,OAAO,KAAK,IAAI;AAC/C,SAAK,gBAAgB;AAAA,EACzB;AAAA,EACA,QAAQ,KAAK,MAAM,WAAW;AAC1B,UAAM,MAAM,KAAK;AACjB,QAAI,SAAS,IAAI,IAAI,GAAG,GAAG,QAAQ;AACnC,QAAI,CAAC,QAAQ;AACT,eAAS,KAAK,eAAe,QAAQ,KAAK,GAAG;AAC7C,UAAI,CAAC,QAAQ;AACT,eAAO;AAAA,MACX;AACA,UAAI,IAAI,KAAK,MAAM;AACnB,cAAQ;AAER,WAAK;AAAA,MAA0B,CAAC;AAAA,IACpC;AACA,UAAM,EAAE,SAAS,IAAI;AACrB,UAAM,MAAO,KAAK,YAAY,GAAG,MAAM,oBAAI,IAAI;AAC/C,QAAI,CAAC,IAAI,IAAI,QAAQ,GAAG;AACpB,cAAQ;AACR,UAAI,IAAI,UAAU,MAAM;AAAA,IAC5B;AACA,WAAOA,QAAM,OAAO,QAAQ,EAAE,MAAM,CAAC;AAAA,EACzC;AAAA,EACA,UAAU;AACN,SAAK,gBAAgB;AAAA,EACzB;AAAA,EACA,kBAAkB;AAEd,SAAK,aAAa,CAAC;AACnB,SAAK,cAAc,CAAC;AAEpB,UAAM,UAAU,KAAK,SAAS,OAAO;AACrC,SAAK,SAAS,MAAM;AACpB,SAAK,cAAc,GAAG,OAAO;AAE7B,UAAM,WAAW,KAAK,UAAU,OAAO;AACvC,SAAK,UAAU,MAAM;AACrB,aAAS,QAAQ,OAAK,EAAE,QAAQ,QAAQ,CAAC;AAAA,EAC7C;AACJ;AAGA,IAAM,oBAAN,MAAM,2BAA0B,kBAAkB;AAAA,EAC9C,UAAU;AAAA,IACN,MAAM;AAAA,IAAG,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,IAAG,YAAY,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,EACvE;AAAA,EACA;AAAA,EACA,aAAa,oBAAI,IAAI;AAAA,EACrB,YAAY,MAAM;AACd,UAAM,IAAI;AACV,IAAAA,QAAM,OAAO,KAAK,SAAS,IAAI;AAAA,EACnC;AAAA,EACA,OAAO,SAAS,KAAK;AACjB,YAAQ,KAAK;AAAA;AAAA,MAET,KAAK;AACD,eAAO,KAAK,yBAAyB,OAAO;AAAA,MAChD;AACI,gCAAwB,KAAK,kBAAiB;AAAA,IACtD;AAAA,EACJ;AAAA,EACA,QAAQ,GAAG;AACP,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EACA,yBAAyB,KAAK,MAAM,eAAe;AAC/C,UAAM,SAAS,KAAK,SAAS,OAAO,KAAK;AACzC,QAAI,QAAS,CAAC,KAAK,WACZ,KAAK,SAAS,OAAO,QACrB,KAAK,YAAY,UAAU,OAAO,WAAW,SAC7C,KAAK,YAAY,WAAW,OAAO,WAAW;AACrD,QAAI,CAAC,SAAS,CAACA,QAAM,OAAO,KAAK,MAAM,GAAG;AACtC,cAAQ,KAAK,OAAO,MAAM,OAAO,OAAO,KACjC,KAAK,OAAO,MAAM,OAAO,OAAO;AAAA,IAC3C;AACA,QAAI,OAAO;AAEP,YAAM,QAAQ,IAAI,aAAa;AAAA,QAAC,KAAK,QAAQ,KAAK;AAAA,QAAG,KAAK,QAAQ,KAAK;AAAA,QAAG,KAAK,WAAW;AAAA,QAAO,KAAK,WAAW;AAAA,QAAQ,KAAK;AAAA;AAAA,QAAoB;AAAA,MAAE,CAAC;AACrJ,YAAM,SAAS,QAAQ,cAAc,IAAI,QAAQ,OAAO,eAAe,oBAAoB;AAC3F,WAAK,UAAU,EAAE,QAAQ,OAAO,SAAS,YAAY,IAAI,EAAE;AAC3D,WAAK,WAAW,MAAM;AAAA,IAC1B;AACA,UAAM,EAAE,SAAS,IAAI;AACrB,UAAM,MAAM,KAAK;AACjB,QAAI,CAAC,IAAI,IAAI,QAAQ,GAAG;AACpB,cAAQ;AACR,UAAI,IAAI,UAAU,KAAK,OAAO;AAAA,IAClC;AACA,WAAOA,QAAM,OAAO,KAAK,SAAS,EAAE,MAAM,CAAC;AAAA,EAC/C;AAAA,EACA,kBAAkB;AAEd,SAAK,WAAW,MAAM;AAEtB,UAAM,WAAW,KAAK;AACtB,QAAI,CAACA,QAAM,OAAO,QAAQ,GAAG;AACzB,WAAK,cAAc,QAAQ;AAAA,IAC/B;AAAA,EACJ;AAAA,EACA,UAAU;AACN,SAAK,gBAAgB;AAAA,EACzB;AACJ;AAGA,IAAM,uBAAN,MAAM,8BAA6B,qBAAqB;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,IACT,UAAU;AAAA,IAAM,UAAU;AAAA,IAAM,WAAW;AAAA,EAC/C;AAAA,EACA,2BAA2B,oBAAI,IAAI;AAAA,EACnC,YAAY,MAAM,QAAQ,YAAY,WAAW;AAC7C,UAAM,MAAM,MAAM;AAClB,SAAK,UAAU,CAAC;AAChB,QAAI,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,MAAM,IAAI;AACvD,WAAK,MAAM,KAAK,kBAAkB,QAAQ;AAAA,IAC9C;AACA,QAAI,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,MAAM,IAAI;AACvD,WAAK,MAAM,KAAK,kBAAkB,QAAQ;AAAA,IAC9C;AACA,QAAI,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,MAAM,MAAM,KAAK,MAAM,QAAQ,kBAAkB,SAAS,MAAM,IAAI;AACjH,WAAK,MAAM,KAAK,kBAAkB,SAAS;AAAA,IAC/C;AACA,SAAK,mBAAmB;AACxB,SAAK,mBAAmB;AAAA,EAC5B;AAAA,EACA,QAAQ,KAAK,KAAK;AACd,UAAM,WAAW,KAAK;AACtB,WAAO,UAAU,QAAQ,KAAK,GAAG;AAAA,EACrC;AAAA,EACA,eAAe,SAAS,KAAK;AACzB,UAAM,YAAY,KAAK;AACvB,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAIA,QAAM,OAAO,KAAK,eAAe,KAAK,MAAM,SAAS,kBAAkB,QAAQ,KAAK,MAAM,SAAS,kBAAkB,SAAS,GAAG;AACjI,WAAK,yBAAyB,MAAM;AAEpC,gBAAU,YAAY;AACtB,WAAK,sBAAsB,OAAO;AAAA,IACtC;AACA,QAAIA,QAAM,OAAO,KAAK,eAAe,KAAK,MAAM,SAAS,kBAAkB,QAAQ,GAAG;AAElF,gBAAU,WAAW;AACrB,WAAK,sBAAsB;AAAA,IAC/B;AACA,QAAIA,QAAM,OAAO,KAAK,eAAe,KAAK,MAAM,SAAS,kBAAkB,QAAQ,GAAG;AAClF,gBAAU,WAAW;AACrB,WAAK,sBAAsB;AAAA,IAC/B;AACA,sBAAkB,WAAW,IAAI;AACjC,UAAM,OAAO,KAAK;AAClB,UAAM,QAAQ,KAAK;AACnB,YAAQ,KAAK;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,OAAO,SAAS,GAAG;AAAA,MACnC,KAAK;AAAA,MACL,KAAK;AACD,eAAO,MAAM,OAAO,SAAS,GAAG;AAAA,MACpC,KAAK;AACD,cAAM,MAAM,KAAK,iBAAiB,SAAS,UAAU;AACrD,kBAAU,YAAY;AACtB,cAAM,MAAM,KAAK,0BAA0B,EAAE,SAAS,IAAI;AAC1D,cAAM,gBAAgB,CAAC,IAAI,IAAI,QAAQ;AACvC,YAAI,eAAe;AACf,cAAI,IAAI,UAAU,GAAG;AAAA,QACzB;AACA,eAAOA,QAAM,OAAO,KAAK,EAAE,OAAO,UAAU,cAAc,CAAC;AAAA,MAC/D;AACI,gCAAwB,KAAK,qBAAoB;AAAA,IACzD;AAAA,EACJ;AAAA,EACA,wBAAwB;AACpB,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,KAAK;AAElB,QAAIA,QAAM,OAAO,KAAK,GAAG;AACrB,eAAS,QAAQ;AACjB,WAAK,kBAAkB,IAAI,eAAe,IAAI;AAAA,IAClD,OACK;AACD,UAAI,SAAS,OAAO,IAAI,IAAI;AAC5B,UAAI,QAAQ,aAAa,OAAO;AAC5B,iBAAS,IAAI,eAAe,IAAI;AAChC,cAAM,IAAI,MAAM,MAAM;AAAA,MAC1B;AACA,WAAK,kBAAkB;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,wBAAwB;AACpB,UAAM,UAAU,KAAK;AACrB,UAAM,QAAQ,KAAK;AACnB,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK,YAAY;AAElC,QAAIA,QAAM,OAAO,KAAK,GAAG;AACrB,eAAS,QAAQ;AACjB,WAAK,kBAAkB,IAAI,eAAe,QAAQ;AAAA,IACtD,OACK;AACD,UAAI,SAAS,OAAO,IAAI,QAAQ;AAChC,UAAI,QAAQ,aAAa,OAAO;AAC5B,iBAAS,IAAI,eAAe,QAAQ;AACpC,cAAM,IAAI,UAAU,MAAM;AAAA,MAC9B;AACA,WAAK,kBAAkB;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,sBAAsB,EAAE,OAAO,GAAG;AAE9B,UAAM,OAAO,KAAK;AAClB,UAAM,SAAS,KAAK,oBAAoB;AACxC,UAAM,SAASD,UAAS,UAAUA,UAAS,OAAO,MAAM,CAAC;AACzD,UAAM,QAAQ,IAAI,aAAa,EAAE;AACjC,UAAM,IAAIA,UAAS,QAAQ,MAAM,GAAG,CAAC;AACrC,UAAM,IAAI,CAAC,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,GAAG,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,GAAG,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC,GAAG,EAAE;AAGnI,QAAIC,QAAM,OAAO,KAAK,eAAe,GAAG;AACpC,YAAM,SAAS,QAAQ,cAAc,QAAQ,OAAO,eAAe,UAAU,KAAK,MAAM,qBAAqB;AAC7G,WAAK,kBAAkB,EAAE,QAAQ,OAAO,SAAS,YAAY,IAAI,EAAE,SAAS,EAAE;AAAA,IAClF,OACK;AACD,WAAK,gBAAgB,QAAQ;AAC7B,WAAK,gBAAgB,UAAU,YAAY,IAAI,EAAE,SAAS;AAAA,IAC9D;AAAA,EAIJ;AAAA,EACA,UAAU;AAEN,SAAK,yBAAyB,MAAM;AACpC,UAAM,QAAQ,KAAK;AACnB,SAAK,kBAAkB;AACvB,SAAK,cAAc,KAAK;AACxB,UAAM,WAAW,KAAK;AACtB,SAAK,kBAAkB;AACvB,cAAU,QAAQ;AAClB,UAAM,WAAW,KAAK;AACtB,SAAK,kBAAkB;AACvB,cAAU,QAAQ;AAAA,EACtB;AACJ;AAGA,IAAM,wBAAN,MAAM,+BAA8B,qBAAqB;AAAA,EACrD;AAAA,EACA,aAAa,oBAAI,IAAI;AAAA,EACrB,YAAY,OAAO;AACf,UAAM,KAAK;AACX,UAAM,MAAM,KAAK,kBAAkB,KAAK;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,2BAA2B,EAAE,OAAO,GAAG;AACnC,UAAM,QAAQ,KAAK;AAEnB,UAAM,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,kBAAkB;AACvE,UAAM,UAAU;AAChB,UAAM,SAAS,IAAI,aAAa,OAAO;AAEvC,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAIG,QAAO,MAAM,MAAM,SAAS,MAAM;AACzD,WAAO,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW;AAEpC,WAAO,IAAI,CAAC,MAAM,SAAS,GAAG,eAAe;AAC7C,SAAK,UAAU,EAAE,OAAO,QAAQ,QAAQ,QAAQ,cAAc,QAAQ,QAAQ,eAAe,sBAAsB,GAAG,SAAS,YAAY,IAAI,EAAE;AAAA,EACrJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,+BAA+B,EAAE,OAAO,GAAG;AACvC,UAAM,QAAQ,KAAK;AAEnB,UAAM,cAAc,GAAG,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,kBAAkB,GACxF,kBAAkB;AAClB,UAAM,UAAU,kBAAkB;AAClC,UAAM,SAAS,IAAI,aAAa,OAAO;AAEvC,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAIA,QAAO,MAAM,MAAM,SAAS,MAAM;AACzD,WAAO,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW;AAEpC,WAAO,IAAI,CAAC,MAAM,SAAS,GAAG,eAAe;AAE7C,UAAM,YAAYN,UAAS,SAAS,MAAM,UAAU,MAAM,MAAM;AAChE,WAAO,IAAI,CAAC,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG,eAAe;AACnE,SAAK,UAAU,EAAE,OAAO,QAAQ,QAAQ,QAAQ,cAAc,QAAQ,QAAQ,eAAe,0BAA0B,GAAG,SAAS,YAAY,IAAI,EAAE;AAAA,EACzJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,EAAE,OAAO,GAAG;AAChC,UAAM,QAAQ,KAAK;AAEnB,UAAM,cAAc,GAAG,UAAU,GAAG,aAAa,GAAG,cAAc,GAAG,iBAAiB,GACtF,kBAAkB;AAClB,UAAM,UAAU,kBAAkB;AAClC,UAAM,SAAS,IAAI,aAAa,OAAO;AAEvC,UAAM,EAAE,GAAG,GAAG,GAAG,EAAE,IAAIM,QAAO,MAAM,MAAM,SAAS,MAAM;AACzD,WAAO,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,WAAW;AAEpC,WAAO,IAAI,CAAC,MAAM,SAAS,GAAG,eAAe;AAE7C,WAAO,IAAI,CAAC,MAAM,SAAS,GAAG,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,cAAc;AACjF,SAAK,UAAU,EAAE,OAAO,QAAQ,QAAQ,QAAQ,cAAc,QAAQ,QAAQ,eAAe,mBAAmB,GAAG,SAAS,YAAY,IAAI,EAAE;AAAA,EAClJ;AAAA,EACA,cAAc,SAAS;AACnB,SAAK,cAAc,KAAK,OAAO;AAC/B,UAAM,QAAQ,KAAK;AACnB,YAAQ,MAAM,MAAM;AAAA,MAChB,KAAK;AACD,aAAK,+BAA+B,OAAO;AAC3C;AAAA,MACJ,KAAK;AACD,aAAK,wBAAwB,OAAO;AACpC;AAAA,MACJ,KAAK;AACD,aAAK,2BAA2B,OAAO;AACvC;AAAA,MACJ;AACI,cAAM,IAAI,MAAM,UAAU,MAAM,IAAI,qBAAqB;AAAA,IACjE;AAAA,EACJ;AAAA,EACA,QAAQ,GAAG;AACP,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC7C;AAAA,EACA,eAAe,SAAS,KAAK;AACzB,UAAM,MAAM,KAAK;AACjB,QAAI,QAAQH,QAAM,OAAO,KAAK,OAAO,KAAK,KAAK,SAAS,EAAE,SAAS;AACnE,QAAI,OAAO;AACP,UAAI,MAAM;AACV,WAAK,cAAc,OAAO;AAAA,IAC9B;AACA,sBAAkB,WAAW,IAAI;AACjC,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,CAAC,IAAI,IAAI,QAAQ,GAAG;AACpB,cAAQ;AACR,UAAI,IAAI,UAAU,KAAK,OAAO;AAAA,IAClC;AACA,QAAI,QAAQ,SAAS;AACjB,aAAOA,QAAM,OAAO,KAAK,SAAS,EAAE,MAAM,CAAC;AAAA,IAC/C;AACA,4BAAwB,KAAK,sBAAqB;AAAA,EACtD;AAAA,EACA,UAAU;AACN,SAAK,WAAW,MAAM;AACtB,UAAM,SAAS,KAAK;AACpB,SAAK,UAAU;AACf,SAAK,cAAc,MAAM;AAAA,EAC7B;AACJ;;;AdxzBA,IAAM,cAAc;AACpB,IAAM,yBAAyB;AAAA,EAC3B,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,WAAW;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,EACd;AACJ;AACA,IAAM,sBAAsB,CAAC,MAAM;AAAE;AAC9B,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EACzB,OAAO;AAAE,SAAK,YAAY,oBAAI,QAAQ;AAAA,EAAG;AAAA,EACzC,OAAO,QAAQ,KAAK;AAChB,UAAM,WAAW,KAAK;AACtB,UAAM,QAAQ,SAAS,IAAI,GAAG;AAC9B,QAAI,CAACI,QAAM,OAAO,KAAK,GAAG;AACtB,YAAM,MAAM;AACZ,eAAS,OAAO,GAAG;AAAA,IACvB;AAAA,EACJ;AAAA,EACA,OAAO,mBAAmB,KAAK,OAAO;AAClC,UAAM,iBAAiB,iBAAgB,OAAO,KAAK,KAAK;AACxD,QAAI,0BAA0B,2BACvB,0BAA0B,yBAAyB;AACtD,aAAO;AAAA,QACH,OAAO,eAAe;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,OAAO,KAAK,CAAC,MAAM,QAAQ,GAAG,MAAM,GAAG,iBAAiB;AAC3D,UAAM,WAAW,iBAAgB;AACjC,QAAI,QAAQ,SAAS,IAAI,GAAG;AAC5B,QAAIA,QAAM,OAAO,KAAK,GAAG;AACrB,eAAS,IAAI,KAAK,QAAQ,oBAAI,IAAI,CAAC;AAAA,IACvC;AAKA,QAAI,CAACA,QAAM,OAAO,IAAI,GAAG;AACrB,UAAI,OAAO,KAAK,IAAI,GAAG;AACnB,cAAMC,UAAS,eAAe,KAAK,KAAK,QAAQ;AAChD,cAAM,SAAS,CAACA,WAAU,eAAe,KAAK,KAAK,QAAQ;AAC3D,YAAI,CAACA,WAAU,CAAC,QAAQ;AACpB,gBAAM,IAAI,MAAM,6DAA6D;AAAA,QACjF;AACA,cAAM,UAAUA,UAAS,IAAI,gBAAgB,MAAM,QAAQ,GAAG,MAAM,IAC9D,IAAI,gBAAgB,MAAM,MAAM;AAEtC,cAAM,MAAM,QAAQ,OAAO,iBAAiB,WAAW,WAAW;AAClE,cAAM,QAAQ,MAAM,IAAI,GAAG;AAC3B,YAAI,OAAO;AACP,iBAAO;AAAA,QACX;AACA,cAAM,WAAWA,UAAS,IAAI,wBAAwB,KAAK,OAAO,IAC5D,IAAI,wBAAwB,KAAK,OAAO;AAE9C,iBAAS,MAAM,eAAe;AAC9B,cAAM,SAAS;AACf,QAAAD,QAAM,OAAO,QAAQ;AAAA,UACjB,IAAI,MAAM,MAAM,IAAI,OAAO,QAAQ,MAAM,IAAI,OAAO,SAAS,MAAMA,QAAM,MAAM,IAAI,EAAE,YAAY;AAAA,QACrG,CAAC;AACD,cAAM,IAAI,KAAK,MAAM;AACrB,eAAO;AAAA,MACX,OACK;AACD,cAAM,IAAI,eAAe,wEAAwE;AAAA,MACrG;AAAA,IACJ,OACK;AACD,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC7E;AAAA,EACJ;AACJ;AACA,IAAM,sBAAN,MAA0B;AAAA,EACtB,cAAc;AACV,SAAK,SAAS,oBAAI,IAAI;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,gBAAgB,EAAE,OAAO,GAAG,MAAM,SAAS,SAAS,QAAQ,OAAO,WAAW,MAAM;AAAA,EAAE,GAAG;AACrF,UAAM,QAAQ,KAAK;AACnB,UAAM,MAAM,OAAO,SAAS,WAAW,OAAO,KAAK;AACnD,QAAI,MAAM,MAAM,IAAI,GAAG;AACvB,QAAIA,QAAM,OAAO,GAAG,GAAG;AACnB,YAAM,IAAI,KAAK,MAAM,oBAAI,IAAI,CAAC;AAAA,IAClC;AACA,QAAI,WAAW,CAAC,IAAI,IAAI,KAAK,GAAG;AAC5B,YAAM,UAAU,QAAQ,IAAI,CAACE,OAAM,UAAU;AACzC,cAAM,QAAQ;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,YACN,QAAQA;AAAA,UACZ;AAAA,QACJ;AACA,eAAO;AAAA,MACX,CAAC;AACD,YAAM,aAAa;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,eAAS,UAAU;AACnB,YAAM,SAAS,OAAO,gBAAgB,UAAU;AAChD,UAAI,IAAI,OAAO,MAAM;AACrB,aAAO;AAAA,IACX,OACK;AACD,aAAO,IAAI,IAAI,KAAK;AAAA,IACxB;AAAA,EACJ;AACJ;AACA,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB,UAAU,CAAC;AAAA,EACX;AAAA,EACA;AAAA,EACA,cAAc,oBAAI,IAAI;AAAA,EACtB,OAAO,EAAE,QAAQ,SAAS,QAAQ,GAAG;AAAA,EACrC,eAAe,SAAS;AACpB,SAAK,IAAI,GAAG,OAAO;AAAA,EACvB;AAAA,EACA,QAAQ;AACJ,SAAK,QAAQ,OAAO,CAAC;AACrB,SAAK,QAAQ;AACb,SAAK,YAAY,MAAM;AACvB,SAAK,OAAO,EAAE,QAAQ,SAAS,QAAQ,GAAG;AAAA,EAC9C;AAAA,EACA,OAAO,SAAS;AACZ,aAAS,OAAO,WAAW,CAAC,GAAG;AAC3B,UAAI,OAAO,IAAI,IAAI,GAAG;AAClB,YAAIF,QAAM,OAAO,KAAK,KAAK,GAAG;AAC1B,eAAK,QAAQ;AACb,gBAAM,WAAW,IAAI,KAAK,YAAY,EAAE,QAAQ,YAAY,MAAM;AAClE,eAAK,KAAK,SAAS,SAAS,SAAS,OAAO,SAAS,MAAM,QAAQ;AAAA,QACvE,OACK;AACD,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACzC;AAAA,MACJ,WACS,QAAQ,IAAI,IAAI,GAAG;AACxB,cAAM,SAAS,KAAK;AACpB,eAAO,KAAK,GAAG;AACf,aAAK,KAAK,UAAW,MAAM,IAAI,KAAK;AAAA,MACxC,WACS,SAAS,IAAI,IAAI,GAAG;AACzB,aAAK,YAAY;AAAA,MACrB,OACK;AACD,cAAM,IAAI,MAAM,sBAAsB;AAAA,MAC1C;AAAA,IACJ;AAAA,EAEJ;AAAA,EACA,MAAM,WAAW;AACb,UAAM,OAAO,KAAK,kBAAkB;AACpC,UAAM,MAAM,KAAK,KAAK,SAAS,KAAK,OAAO,EAAE,eAAe,WAAW,aAAa,gBAAgB,WAAW,aAAa,CAAC,GAAG,WAAW,KAAK,SAAS,MAAM,EAAE,UAAU,WAAW,SAAS,CAAC,GAAG,WAAW,IAAI,SAAS,iBAAgB,UAAU,UAAU,MAAM,MAAM,IAAI;AAC/Q,UAAM,WAAW;AAAA,MACb,YAAY,KAAK,QAAQ;AAAA,MACzB,UAAU,KAAK,MAAM,KAAK,UAAU,MAAM,IAAI;AAAA,IAClD;AACA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,IAAI,MAAM;AACN,UAAM,EAAE,QAAQ,OAAO,IAAI,KAAK;AAEhC,WAAO,UAAU,SAAS;AAAA,EAE9B;AAAA,EACA,UAAU,MAAM,KAAK,OAAO;AACxB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,IAAI,IAAI,IAAI;AACxB,QAAIA,QAAM,OAAO,GAAG,GAAG;AACnB,aAAO;AAAA,IACX;AACA,QAAIA,QAAM,cAAc,GAAG,GAAG;AAC1B,aAAO;AAAA,IACX;AACA,UAAM,cAAc,IAAI,OAAO,OAAK,EAAE,QAAQ,GAAG;AACjD,QAAI,MAAM,KAAK,GAAG;AACd,aAAO;AAAA,IACX;AACA,QAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ;AAClC,aAAO,YAAY,KAAK;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,SAAS;AACZ,WAAO,kBAAkB,OAAO;AAAA,EACpC;AAAA,EACA,oBAAoB;AAChB,UAAM,OAAO,KAAK,MAAM,MAAM,SAAS,KAAK,SAAS,WAAW,KAAK,UAAU,aAAa,CAACA,QAAM,OAAO,UAAU,OAAO,GAAG,cAAc,CAACA,QAAM,cAAc,MAAM;AACvK,UAAM,SAASA,QAAM,OAAO,IAAI,IAAI,YAAY,QAAS,KAAK,UAAU,UAAU,YAAY;AAC9F,UAAM,yBAAyB,sBAAsB,yBAAyB;AAC9E,WAAO;AAAA,MACH;AAAA,MAAY;AAAA,MAAa;AAAA,MACzB;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,gCAAgC,OAAO,KAAK,kBAAkB,GAAG;AAC7D,UAAM,EAAE,YAAY,wBAAwB,uBAAuB,IAAI;AACvE,UAAM,aAAa,KAAK,aAAa,SAAS,KAAK;AAGnD,UAAM,iBAAiB,EAAE,KAAK,wBAAwB,OAAO,+BAA+B,SAAS,iCAAiC,MAAM,SAAS;AACrJ,UAAM,WAAW,EAAE,KAAK,YAAY,OAAO,wBAAwB,SAAS,wBAAwB,MAAM,SAAS;AACnH,QAAI,YAAY;AACZ,iBAAW,IAAI,gBAAgB,MAAM,CAAC,gBAAgB,UAAU,EAAE,KAAK,WAAW,OAAO,wBAAwB,MAAM,UAAU,CAAC,CAAC;AAAA,IACvI,OACK;AACD,iBAAW,IAAI,gBAAgB,MAAM,CAAC,gBAAgB,QAAQ,CAAC;AAAA,IACnE;AAEA,eAAW,IAAI,gBAAgB,QAAQ;AAAA,MACnC,EAAE,KAAK,uBAAuB,OAAO,4BAA4B,SAAS,8BAA8B,MAAM,SAAS;AAAA,IAC3H,CAAC;AAED,UAAM,OAAO,OAAO,IAAI,CAAC,GAAG,QAAQ;AAChC,aAAO,EAAE,KAAK,SAAS,OAAO,wBAAwB,SAAS,KAAK,MAAM,SAAS;AAAA,IACvF,CAAC;AACD,SAAK,KAAK,GAAG,IAAI;AAEjB,eAAW,IAAI,gBAAgB,aAAa,CAAC,EAAE,KAAK,eAAe,OAAO,iCAAiC,MAAM,UAAU,SAAS,kCAAkC,CAAC,CAAC;AAAA,EAC5K;AAAA,EACA,SAAS,OAAO,KAAK,kBAAkB,GAAG,SAAS;AAC/C,SAAK,gCAAgC,IAAI;AACzC,UAAM,QAAQ;AAAA,MACV,aAAa,CAAC;AAAA,MAAG,UAAU,CAAC;AAAA,MAAG,WAAW,CAAC;AAAA,IAC/C;AACA,UAAM,QAAQ,CAAC,MAAM;AACjB,eAAS,cAAc,EAAE,eAAe,CAAC,GAAG;AACxC,YAAI,MAAM,YAAY,QAAQ,UAAU,MAAM,IAAI;AAC9C,gBAAM,YAAY,KAAK,UAAU;AAAA,QACrC;AAAA,MACJ;AACA,UAAI,CAACA,QAAM,cAAc,EAAE,QAAQ,GAAG;AAClC,cAAM,SAAS,KAAK,GAAG,EAAE,QAAQ;AAAA,MACrC;AACA,UAAI,CAACA,QAAM,cAAc,EAAE,SAAS,GAAG;AACnC,cAAM,UAAU,KAAK,GAAG,EAAE,SAAS;AAAA,MACvC;AAAA,IACJ;AAEA,YAAQ,KAAK,QAAQ;AAAA,MACjB,KAAK,YAAY;AAEb,YAAI,KAAK,YAAY;AACjB,gBAAM,qBAAqB,KAAK;AAChC,gBAAM,UAAU,WAAW,EAAE,YAAY,wBAAwB,cAAc,CAAC,sBAAsB,GAAG,IAAI,KAAK,GAAG,kBAAkB;AACvI,gBAAM,OAAO;AAAA,QACjB;AAEA,YAAI,aAAa;AACjB,cAAM,SAAS,KAAK;AACpB,iBAAS,eAAe,QAAQ;AAC5B,gBAAM,QAAQ,YAAY;AAC1B,kBAAQ,MAAM,MAAM;AAAA,YAChB,KAAK;AACD,oBAAM,gBAAgB,iBAAiB,EAAE,aAAa,0BAA0B,QAAQ,SAAS,GAAG,KAAK,wBAAwB,UAAU;AAC3I,oBAAM,aAAa;AACnB;AAAA,YACJ,KAAK;AACD,oBAAM,iBAAiB,UAAU;AAAA,gBAAE,aAAa;AAAA,gBAA0B,QAAQ;AAAA,gBAAU,UAAU;AAAA;AAAA,cAAiH,GAAG,KAAK,wBAAwB,UAAU;AACjQ,oBAAM,cAAc;AACpB;AAAA,YACJ,KAAK;AACD,oBAAM,gBAAgB,aAAa,EAAE,YAAY,wBAAwB,aAAa,wBAAwB,GAAG,KAAK,wBAAwB,UAAU;AACxJ,oBAAM,aAAa;AACnB;AAAA,UACR;AACA;AAAA,QACJ;AACA,eAAO,cAAc,SAAS,OAAO,OAAO;AAAA,IACpD;AAAA,EACJ;AACJ;AACA,IAAM,gBAAgB;AAAA,EAClB,0BAA0B,CAAC,QAAQ,WAAW;AAC1C,QAAI,CAAC,OAAO,OAAO;AACf;AAAA,IACJ;AACA,WAAO,MAAM,YAAY,OAAO,QAAQ,GAAG,OAAO,KAAK;AAAA,EAC3D;AACJ;AACA,IAAM,0BAAN,MAA8B;AAAA,EAC1B,YAAY,UAAU,UAAU,SAAS,IAAI,oBAAoB,GAAG;AAChE,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,SAAS;AAEd,SAAK,wBAAwB,CAAC,MAAM,QAAQ,YAAY;AACpD,aAAO,KAAK,OAAO,gBAAgB,KAAK,UAAU,MAAM,CAAC,MAAM,GAAG,SAAS,KAAK,sBAAsB,cAAc,2BAA2B;AAAA,IACnJ;AACA,SAAK,2BAA2B,CAAC,MAAM,QAAQ,SAAS,SAAS,cAAc,yBAAyB;AACpG,YAAM,SAAS,KAAK,kBAAkB,WAAW,GAAG,QAAQ,cAAc;AAC1E,UAAI,OAAO,UAAW,cAAc,8BAA+B;AAC/D,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC/C;AACA,aAAO,KAAK,OAAO,gBAAgB,KAAK,UAAU,MAAM,CAAC,MAAM,GAAG,SAAS,QAAQ,OAAO,CAAC,eAAe;AACtG,cAAM,EAAE,OAAO,IAAI,KAAK;AACxB,cAAM,UAAU,WAAW;AAC3B,YAAI,SAAS;AACT,kBAAQ,KAAK;AAAA,YACT,SAAS;AAAA,YAAuB,UAAU,OAAO,cAAc;AAAA,cAC3D,cAAc;AAAA,cACd,cAAc;AAAA,cACd,WAAW;AAAA,cACX,WAAW;AAAA,YACf,CAAC;AAAA,UACL,GAAG;AAAA,YACC,SAAS;AAAA,YAAuB,UAAU,QAAQ,WAAW;AAAA,UACjE,CAAC;AAAA,QACL;AAAA,MACJ,CAAC;AAAA,IACL;AACA,SAAK,iCAAiC,CAAC,MAAM,QAAQ,SAAS,cAAc,+BAA+B,aAAa,UAAU;AAC9H,YAAM,SAAS,KAAK,kBAAkB,WAAW;AACjD,UAAI,OAAO,UAAW,cAAc,qCAAsC;AACtE,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC/C;AACA,YAAM,MAAM,KAAK,MAAM,OAAO,aAAa,IAAI;AAC/C,YAAM,QAAQ,GAAG,WAAW,GAAG,aAAa,cAAc,MAAM;AAChE,aAAO,KAAK,OAAO,gBAAgB,KAAK,UAAU,KAAK,CAAC,MAAM,GAAG,SAAS,QAAQ,KAAK;AAAA,IAC3F;AACA,SAAK,qDAAqD,CAAC,MAAM,YAAY,mBAAmB,SAAS,cAAc,4BAA4B,aAAa,UAAU;AACtK,YAAM,SAAS,KAAK,kBAAkB,WAAW;AACjD,YAAM,MAAM,KAAK,MAAM,OAAO,aAAa,IAAI;AAC/C,YAAM,QAAQ,GAAG,WAAW,GAAG,aAAa,cAAc,MAAM;AAChE,aAAO,KAAK,OAAO,gBAAgB,KAAK,UAAU,KAAK,CAAC,YAAY,iBAAiB,GAAG,SAAS,QAAQ,KAAK;AAAA,IAClH;AACA,SAAK,2BAA2B,CAAC,QAAQ,SAAS,cAAc,iCAAiC;AAC7F,YAAM,SAAS,KAAK,kBAAkB,WAAW;AACjD,YAAM,MAAM,OAAO,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,GAAG;AAC1C,YAAM,UAAU,OAAO,IAAI,OAAK,EAAE,OAAO,MAAM;AAC/C,aAAO,KAAK,OAAO,gBAAgB,KAAK,UAAU,KAAK,SAAS,SAAS,QAAQ,cAAc,0BAA0B;AAAA,IAC7H;AACA,SAAK,oBAAoB,CAAC;AAC1B,SAAK,cAAc;AACnB,SAAK,cAAc;AACnB,SAAK,sBAAsB;AAC3B,SAAK,6BAA6B;AAClC,SAAK,0CAA0C;AAC/C,SAAK,iDAAiD;AACtD,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AAGrB,SAAK,MAAM,CAAC,SAAS;AACjB,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,SAAK,OAAO,CAAC,SAAS,YAAY;AAC9B,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,SAAK,OAAO,CAAC,SAAS,YAAY;AAC9B,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,SAAK,QAAQ,CAAC,MAAM,mBAAmB,YAAY,iBAAiB,iBAAiB;AAEjF,WAAK,YAAY,KAAK,SAAS;AAC/B,UAAI;AAEA,aAAK,YAAY,MAAM,UAAU;AACjC,aAAK,oBAAoB,MAAM,UAAU;AACzC,aAAK,cAAc,MAAM,UAAU;AACnC,aAAK,wCAAwC,MAAM,cAAc,iBAAiB;AAClF,aAAK,cAAc,MAAM,GAAG,YAAY;AAExC,cAAM,OAAO,WAAW,MAAM,WAAW,KAAK;AAC9C,aAAK,KAAK,SAAS,iBAAiB,UAAU,SAAS,UAAU,MAAM;AAAA,MAC3E,SACO,GAAG;AACN,gBAAQ,MAAM,kCAAkC,CAAC;AAAA,MACrD;AAAA,IACJ;AACA,SAAK,UAAU,CAAC,MAAM,mBAAmB,YAAY,iBAAiB;AAElE,WAAK,YAAY,KAAK,aAAa;AACnC,UAAI;AAEA,aAAK,YAAY,MAAM,UAAU;AACjC,aAAK,2BAA2B,MAAM,UAAU;AAChD,aAAK,+CAA+C,MAAM,cAAc,iBAAiB;AACzF,aAAK,YAAY,MAAM,UAAU;AAEjC,cAAM,OAAO,WAAW,MAAM,WAAW,KAAK;AAC9C,aAAK,KAAK,SAAS,gBAAgB,MAAM;AAAA,MAC7C,SACO,GAAG;AAAA,MAAE;AAAA,IAChB;AACA,SAAK,OAAO,SAAS;AAAA,EACzB;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,MAAM;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,MAAM,iBAAiB;AACnB,UAAM,UAAUA,QAAM,OAAO,CAAC,GAAG,wBAAwB,mBAAmB,CAAC,CAAC;AAC9E,UAAM,UAAU,KAAK,UAAU,OAAO,QAAQ,MAAM,QAAQ,SAAS;AACrE,UAAM,MAAMA,QAAM,OAAO,EAAE,UAAU,KAAK,GAAG,KAAK,QAAQ;AAC1D,UAAM,SAAS,IAAI;AAGnB,UAAM,SAAS;AAAA,MACX,QAAQ,OAAO,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC;AAAA,MACvD,SAAS,QAAQ,iBACb;AAAA;AAAA,QAEI,cAAc,aAAa,mCAAmC,GAAG,GAAG,CAAC;AAAA,MACzE,IACE;AAAA;AAAA,QAEE,cAAc,aAAa,mCAAmC,CAAC;AAAA;AAAA,QAE/D,cAAc,aAAa,iCAAiC,CAAC;AAAA;AAAA,QAE7D,cAAc,aAAa,6BAA6B,CAAC;AAAA,MAC7D;AAAA,IACR;AAEA,UAAM,sBAAsB,OAAO,sBAAsB;AAAA,MACrD,SAAS;AAAA;AAAA,QAEL;AAAA,UACI,SAAS;AAAA,UACT,YAAY,eAAe,SAAS,eAAe;AAAA,UACnD,QAAQ;AAAA,YACJ,MAAM;AAAA,UACV;AAAA,QACJ;AAAA;AAAA,QAEA;AAAA,UACI,SAAS;AAAA,UACT,YAAY,eAAe,SAAS,eAAe;AAAA,UACnD,QAAQ;AAAA,YACJ,MAAM;AAAA,UACV;AAAA,QACJ;AAAA,MACJ;AAAA,MAAG,OAAO,cAAc;AAAA,IAC5B,CAAC;AACD,UAAM,uBAAuB,OAAO,sBAAsB;AAAA,MACtD,SAAS;AAAA,QACL;AAAA;AAAA,UAEI,SAAS;AAAA,UACT,YAAY,eAAe;AAAA,UAC3B,QAAQ;AAAA,YACJ,MAAM;AAAA,UACV;AAAA,QACJ;AAAA,MACJ;AAAA,MAAG,OAAO,cAAc;AAAA,IAC5B,CAAC;AACD,UAAM,mBAAmB,CAAC,qBAAqB,oBAAoB;AAMnE,UAAM,WAAW;AAAA,MACb,QAAQ,OAAO,mBAAmB;AAAA,QAC9B,MAAM,KAAK;AAAA,MACf,CAAC;AAAA,MAAG,SAAS;AAAA,QACT;AAAA,UACI,QAAQ,IAAI;AAAA,UACZ,OAAO;AAAA,YACH,OAAO;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,YACf;AAAA,YACA,OAAO,CAAC;AAAA,UACZ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,qBAAqB,iBAAiB;AAC5C,UAAM,2CAA2C,CAAC;AAAA;AAAA,MAE1C,SAAS;AAAA,MACT,YAAY,eAAe;AAAA,MAC3B,QAAQ;AAAA,QACJ,MAAM;AAAA,MACV;AAAA,IACJ,CAAC;AAEL,UAAM,EAAE,SAAS,IAAI,KAAK,UAAU,SAAS,WAAW;AACxD,QAAI,QAAQ;AACR,+CAAyC,KAAK,EAAE,YAAY,eAAe,UAAU,SAAS,uBAAuB,SAAS,CAAC,EAAE,GAAG,GAAG,MAAM,QAAQ,EAAE,KAAK,EAAE,IAAI,WAAS;AAAE,eAAO,EAAE,YAAY,eAAe,UAAU,SAAS,wBAAwB,IAAI,OAAO,SAAS,CAAC,EAAE;AAAA,MAAG,CAAC,CAAC;AAAA,IAC5R,OACK;AAAA,IACL;AACA,UAAM,oCAAoC;AAAA,MACtC,OAAO,cAAc;AAAA,MACrB,SAAS;AAAA,IACb;AACA,UAAM,0BAA0B,OAAO,sBAAsB,iCAAiC;AAC9F,qBAAiB,KAAK,uBAAuB;AAE7C,UAAM,qBAAqB,iBAAiB;AAC5C,UAAM,EAAE,WAAW,IAAI,KAAK,UAAU,cAAc,aAAa;AACjE,QAAI,aAAa;AACb,YAAM,0BAA0B,OAAO,sBAAsB;AAAA,QACzD,SAAS,CAAC,GAAG,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU;AACrD,iBAAO;AAAA,YACH,YAAY,eAAe;AAAA,YAAU,SAAS;AAAA,YAAO,QAAQ;AAAA,cACzD,MAAM;AAAA,YACV;AAAA,UACJ;AAAA,QACJ,CAAC;AAAA,QACD,OAAO,cAAc;AAAA,MACzB,CAAC;AACD,uBAAiB,KAAK,uBAAuB;AAAA,IACjD;AAIA,UAAM,aAAa;AAAA,MACf,OAAO,cAAc;AAAA,MACrB;AAAA,MACA;AAAA;AAAA,MAEA,QAAQ,OAAO,qBAAqB;AAAA,QAChC,OAAO,cAAc;AAAA,QACrB,kBAAmB,KAAK,oBAAoB;AAAA,MAChD,CAAC;AAAA,MACD,WAAW,QAAQ;AAAA,IACvB;AACA,QAAI,QAAQ,aAAa;AACrB,iBAAW,cAAc,EAAE,OAAO,EAAE;AACpC,iBAAW,eAAe;AAAA,QACtB,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,mBAAmB;AAAA,MACvB;AAAA,IACJ;AACA,SAAK,YAAY,OAAO,qBAAqB,UAAU;AAEvD,UAAM,sBAAsB,KAAK,uBAAuB,OAAO,sBAAsB;AAAA,MACjF,OAAO,cAAc;AAAA,MACrB,SAAS;AAAA,QACL;AAAA,UACI,YAAY,eAAe;AAAA,UAC3B,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM,UAAU;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,UAAM,iBAAiB;AAAA,MACnB,OAAO,cAAc;AAAA,MACrB;AAAA,MACA,UAAU;AAAA,QACN,QAAQ,OAAO,mBAAmB;AAAA,UAC9B,MAAM,4BAA4B,gCAAgC;AAAA,QACtE,CAAC;AAAA,QAAG,SAAS;AAAA,UACT,EAAE,QAAQ,UAAU;AAAA,QACxB;AAAA,MACJ;AAAA,MACA,QAAQ,OAAO,qBAAqB;AAAA,QAChC,OAAO,cAAc;AAAA,QACrB,kBAAkB,CAAC,qBAAqB,sBAAsB,mBAAmB;AAAA,MACrF,CAAC;AAAA,MACD,WAAW,QAAQ;AAAA,MACnB,cAAc;AAAA,QACV,mBAAmB;AAAA,QACnB,cAAc;AAAA,QACd,QAAQ;AAAA,MACZ;AAAA,IACJ;AACA,SAAK,gBAAgB,OAAO,qBAAqB,cAAc;AAG/D,UAAM,kBAAkB,CAAC,SAAS,YAAY;AAC1C,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,wCAAwC;AAAA,MACnG;AACA,YAAM,EAAE,QAAQ,UAAU,IAAI,WAAW,OAAO,KAAK,mBAAmB;AACxE,YAAM,EAAE,QAAQ,QAAQ,IAAI,WAAW,OAAO,KAAK,iBAAiB;AACpE,YAAM,EAAE,QAAQ,GAAG,IAAI,WAAW,OAAO,KAAK,mBAAmB;AACjE,WAAK,gBAAgB,mCAAmC,SAAS;AACjE,WAAK,gBAAgB,iCAAiC,OAAO;AAC7D,WAAK,gBAAgB,6BAA6B,EAAE;AAAA,IACxD;AACA,UAAM,mBAAmB,CAAC,SAAS,YAAY;AAC3C,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,wCAAwC;AAAA,MACnG;AACA,YAAM,EAAE,OAAO,IAAI,WAAW,OAAO,KAAK,UAAU;AACpD,WAAK,gBAAgB,mCAAmC,MAAM;AAAA,IAClE;AACA,SAAK,cAAc,QAAQ,iBAAiB,mBAAmB;AAE/D,UAAM,qBAAqB,CAAC,MAAM,YAAY,eAAe;AACzD,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,gDAAgD;AAAA,MAC3G;AACA,YAAM,iBAAiB,WAAW,OAAO,KAAK,sBAAsB,GAAG,uBAAuB,eAAe;AAE7G,oBAAc,yBAAyB,QAAQ,cAAc;AAC7D,YAAM,EAAE,MAAM,IAAI,KAAK,SAAS,gBAAgB,MAAM,wBAAwB,CAAC;AAC/E,YAAM,YAAY,KAAK,+BAA+B,WAAW,MAAM,sBAAsB,eAAe,OAA2E,OAAO,UAAU;AACxM,WAAK,aAAa,OAAO,SAAS;AAAA,IACtC;AACA,SAAK,sBAAsB,CAAC,SAAS,YAAY;AAC7C,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,yBAAmB,MAAM,YAAY,KAAK;AAAA,IAC9C;AACA,SAAK,6BAA6B,CAAC,SAAS,YAAY;AACpD,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,yBAAmB,MAAM,YAAY,IAAI;AAAA,IAC7C;AAEA,UAAM,yCAAyC,CAAC,MAAM,cAAc,mBAAmB,eAAe;AAClG,UAAIA,QAAM,OAAO,YAAY,GAAG;AAC5B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,iDAAiD;AAAA,MAC5G;AAEA,YAAM,sBAAsB,aAAa,OAAO,KAAK,qBAAqB,GAAG,4BAA4B,oBAAoB;AAE7H,oBAAc,yBAAyB,QAAQ,mBAAmB;AAElE,UAAIA,QAAM,OAAO,iBAAiB,GAAG;AACjC,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,6CAA6C;AAAA,MACxG;AACA,YAAM,wBAAwB,kBAAkB,OAAO,KAAK,aAAa,GAAG,8BAA8B,sBAAsB;AAEhI,oBAAc,yBAAyB,QAAQ,qBAAqB;AACpE,YAAM,EAAE,MAAM,IAAI,KAAK,SAAS,gBAAgB,QAAQ,uBAAuB,CAAC;AAChF,YAAM,EAAE,OAAO,iBAAiB,IAAI,KAAK,SAAS,gBAAgB,aAAa,eAAe,CAAC;AAC/F,UAAI,UAAU,kBAAkB;AAC5B,cAAM,IAAI,eAAe,+BAA+B,KAAK,OAAO,gBAAgB,GAAG;AAAA,MAC3F;AACA,YAAM,YAAY,KAAK;AAAA,QAAmD,aAAa;AAAA,QAAM;AAAA,QAA2B;AAAA;AAAA;AAAA;AAAA,QAIxH,oBAAoB,SAAS,sBAAsB;AAAA,QAAO;AAAA,QAAO;AAAA,MAAU;AAC3E,WAAK,aAAa,OAAO,SAAS;AAAA,IACtC;AACA,SAAK,0CAA0C,CAAC,SAAS,YAAY;AACjE,YAAM,eAAe,QAAQ,GAAG,CAAC;AACjC,YAAM,oBAAoB,QAAQ,GAAG,CAAC;AACtC,6CAAuC,MAAM,cAAc,mBAAmB,KAAK;AAAA,IACvF;AACA,SAAK,iDAAiD,CAAC,SAAS,YAAY;AACxE,YAAM,eAAe,QAAQ,GAAG,CAAC;AACjC,YAAM,oBAAoB,QAAQ,GAAG,CAAC;AACtC,6CAAuC,MAAM,cAAc,mBAAmB,IAAI;AAAA,IACtF;AAEA,SAAK,gBAAgB,CAAC,SAAS,YAAY;AACvC,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,uCAAuC;AAAA,MAClG;AACA,YAAM,qBAAqB,WAAW,OAAO,KAAK,UAAU,GAAG,2BAA2B,mBAAmB;AAE7G,oBAAc,yBAAyB,QAAQ,kBAAkB;AACjE,UAAI,MAAM,WAAW,QAAQ,GAAG;AAChC,YAAM,SAAS,KAAK;AACpB,YAAM,YAAY,KAAK,yBAAyB,WAAW,MAAM,0BAA0B,QAAQ,mBAAmB,OAAO,kBAAkB;AAC/I,WAAK,aAAa,oBAAoB,SAAS;AAC/C,UAAI,QAAQ;AACR,eAAO,MAAM,2BAA2B,EAAE,QAAQ,IAAI,QAAQ,OAAO,KAAK,GAAG,EAAE,SAAS,OAAO,GAAG,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;AAAA,MACpJ;AAAA,IACJ;AAEA,SAAK,gBAAgB,CAAC,SAAS,YAAY;AACvC,UAAI,aAAa;AACb,cAAM,aAAa,MAAM,KAAK,OAAO;AACrC,cAAM,eAAe,WAAW,IAAI,OAAK;AAAE,iBAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,GAAG,IAAI,EAAE,KAAK,IAAI;AAAA,QAAG,CAAC;AACvG,cAAM,UAAU,aAAa,KAAK,OAAK,EAAE,OAAO,KAAK;AACrD,cAAM,YAAY,KAAK,yBAAyB,cAAc,SAAS,kBAAkB;AACzF,iBAAS,eAAe,cAAc;AAElC,wBAAc,yBAAyB,QAAQ,YAAY,MAAM;AAAA,QACrE;AACA,aAAK,aAAa,oBAAoB,SAAS;AAAA,MACnD;AAAA,IACJ;AAEA,SAAK,cAAc,CAAC,SAAS,YAAY;AACrC,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,gDAAgD;AAAA,MAC3G;AACA,YAAM,QAAQ,WAAW,OAAO,KAAK,OAAO,GAAG,cAAc,MAAM;AAEnE,oBAAc,yBAAyB,QAAQ,KAAK;AACpD,YAAM,QAAQ;AACd,YAAM,UAAU,MAAM;AACtB,YAAM,YAAY,KAAK;AAAA,QAAsB,WAAW;AAAA,QAAM;AAAA,QAAa;AAAA;AAAA,MAA8B;AACzG,WAAK,aAAa,OAAO,SAAS;AAAA,IACtC;AAAA,EACJ;AACJ;AACA,IAAM,kBAAN,MAAM,iBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,cAAc,oBAAI,IAAI;AAAA,EACtB,eAAe,SAAS;AACpB,SAAK,IAAI,GAAG,OAAO;AAAA,EACvB;AAAA,EACA,QAAQ;AACJ,SAAK,QAAQ;AACb,SAAK,YAAY,MAAM;AAAA,EAC3B;AAAA,EACA,OAAO,SAAS;AACZ,aAAS,OAAO,WAAW,CAAC,GAAG;AAC3B,UAAI,OAAO,IAAI,IAAI,GAAG;AAClB,YAAIA,QAAM,OAAO,KAAK,KAAK,GAAG;AAC1B,eAAK,QAAQ;AAAA,QACjB,OACK;AACD,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACzC;AAAA,MACJ,WACS,SAAS,IAAI,IAAI,GAAG;AACzB,aAAK,YAAY;AAAA,MACrB,WACS,QAAQ,IAAI,IAAI,GAAG;AAAA,MAE5B,OACK;AACD,cAAM,IAAI,MAAM,sBAAsB;AAAA,MAC1C;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,QAAQ;AACJ,UAAM,OAAO,KAAK,kBAAkB;AACpC,UAAM,MAAM,KAAK,KAAK,SAAS,KAAK,OAAO,IAAI,GAAG,WAAW,KAAK,SAAS,IAAI,GAAG,WAAW,IAAI,SAAS,iBAAgB,UAAU,UAAU,MAAM,MAAM,IAAI;AAC9J,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,EAAE,WAAW,KAAK,WAAW,aAAa,KAAK,YAAY;AAAA,IACzE;AAAA,EACJ;AAAA,EACA,IAAI,MAAM;AACN,UAAM,OAAO,KAAK,OAAO,MAAM,UAAU,YAAY;AACrD,WAAO,YAAY,QAAQ,MAAM,SAAS;AAAA,EAC9C;AAAA,EACA,UAAU,MAAM,KAAK,OAAO;AACxB,UAAM,MAAM,KAAK;AACjB,UAAM,MAAM,IAAI,IAAI,IAAI;AACxB,QAAIA,QAAM,OAAO,GAAG,GAAG;AACnB,aAAO;AAAA,IACX;AACA,QAAIA,QAAM,cAAc,GAAG,GAAG;AAC1B,aAAO;AAAA,IACX;AACA,UAAM,cAAc,IAAI,OAAO,OAAK,EAAE,QAAQ,GAAG;AACjD,QAAI,MAAM,KAAK,GAAG;AACd,aAAO;AAAA,IACX;AACA,QAAI,SAAS,KAAK,QAAQ,IAAI,QAAQ;AAClC,aAAO,YAAY,KAAK;AAAA,IAC5B;AACA,WAAO;AAAA,EACX;AAAA,EACA,OAAO,OAAO,KAAK,kBAAkB,GAAG;AACpC,WAAO,KAAK,YAAY,IAAI,qBAAqB,IAAI,yBAAyB;AAAA,EAClF;AAAA,EACA,oBAAoB;AAChB,UAAM,OAAO,KAAK,MAAM;AACxB,UAAM,SAASA,QAAM,OAAO,IAAI,IAAI,YAAY,OAAQ,KAAK,UAAU,UAAU,YAAY;AAC7F,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,UAAU,aAAa;AACzC,UAAM,cAAc,UAAU;AAC9B,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MAAW;AAAA,IACf;AAAA,EACJ;AAAA,EACA,gCAAgC,OAAO,KAAK,kBAAkB,GAAG;AAC7D,UAAM,aAAa,KAAK;AAGxB,UAAM,iBAAiB,EAAE,KAAK,wBAAwB,OAAO,+BAA+B,SAAS,iCAAiC,MAAM,SAAS;AACrJ,UAAM,WAAW,EAAE,KAAK,YAAY,OAAO,2BAA2B,GAAG,SAAS,wBAAwB,MAAM,SAAS;AACzH,UAAM,oBAAoB,EAAE,KAAK,qBAAqB,OAAO,0BAA0B,SAAS,GAAG,MAAM,SAAS;AAClH,UAAM,OAAO,EAAE,KAAK,QAAQ,OAAO,0BAA0B,SAAS,GAAG,MAAM,SAAS;AACxF,eAAW,IAAI,gBAAgB,MAAM,CAAC,gBAAgB,UAAU,mBAAmB,IAAI,CAAC;AAExF,eAAW,IAAI,gBAAgB,QAAQ;AAAA,MACnC,EAAE,KAAK,uBAAuB,OAAO,4BAA4B,SAAS,8BAA8B,MAAM,SAAS;AAAA,IAC3H,CAAC;AAAA,EACL;AAAA,EACA,SAAS,OAAO,KAAK,kBAAkB,GAAG;AACtC,SAAK,gCAAgC,IAAI;AACzC,UAAM,QAAQ;AAAA,MACV,aAAa,CAAC;AAAA,MAAG,UAAU,CAAC;AAAA,MAAG,WAAW,CAAC;AAAA,IAC/C;AACA,YAAQ,KAAK,QAAQ;AAAA,MACjB,KAAK,YAAY;AACb,eAAO,aAAa,SAAS,KAAK;AAAA,IAC1C;AAAA,EACJ;AACJ;AACA,IAAM,0BAAN,MAA8B;AAAA,EAC1B;AAAA,EACA,YAAY,SAAS,cAAc,SAAS,IAAI,oBAAoB,GAAG;AACnE,SAAK,eAAe;AACpB,SAAK,SAAS;AAEd,SAAK,4BAA4B,CAAC,MAAM,QAAQ,YAAY;AACxD,YAAM,MAAM,KAAK;AACjB,aAAO,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC,MAAM,GAAG,SAAS,KAAK,0BAA0B,cAAc,2BAA2B;AAAA,IAC7I;AACA,SAAK,+BAA+B,CAAC,MAAM,QAAQ,SAAS,cAAc,yBAAyB;AAC/F,YAAM,SAAS,KAAK,sBAAsB,WAAW;AACrD,UAAI,OAAO,UAAW,cAAc,mCAAoC;AACpE,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC/C;AACA,YAAM,MAAM,KAAK;AACjB,aAAO,KAAK,OAAO,gBAAgB,KAAK,MAAM,CAAC,MAAM,GAAG,SAAS,QAAQ,cAAc,0BAA0B;AAAA,IACrH;AACA,SAAK,gCAAgC,CAAC,MAAM,SAAS,SAAS,gBAAgB;AAC1E,YAAM,SAAS,KAAK,sBAAsB,WAAW;AACrD,UAAI,OAAO,UAAW,cAAc,oCAAqC;AACrE,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC/C;AACA,YAAM,MAAM,KAAK;AACjB,aAAO,KAAK,OAAO,gBAAgB,KAAK,MAAM,SAAS,SAAS,QAAQ,cAAc,2BAA2B;AAAA,IACrH;AACA,SAAK,qCAAqC,CAAC,MAAM,QAAQ,SAAS,cAAc,+BAA+B,aAAa,UAAU;AAClI,YAAM,SAAS,KAAK,sBAAsB,WAAW;AACrD,UAAI,OAAO,UAAW,cAAc,qCAAsC;AACtE,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC/C;AACA,YAAM,MAAM,KAAK,MAAM,YAAY,aAAa,IAAI;AACpD,YAAM,QAAQ,GAAG,WAAW,GAAG,aAAa,cAAc,EAAE;AAC5D,YAAM,MAAM,KAAK;AACjB,aAAO,KAAK,OAAO,gBAAgB,KAAK,KAAK,CAAC,MAAM,GAAG,SAAS,QAAQ,KAAK;AAAA,IACjF;AACA,SAAK,uCAAuC,CAAC,MAAM,YAAY,SAAS,cAAc,4BAA4B,aAAa,UAAU;AACrI,YAAM,SAAS,KAAK,sBAAsB,WAAW;AACrD,YAAM,MAAM,KAAK,MAAM,YAAY,aAAa,IAAI;AACpD,YAAM,QAAQ,GAAG,WAAW,GAAG,aAAa,cAAc,EAAE;AAC5D,YAAM,MAAM,KAAK;AACjB,aAAO,KAAK,OAAO,gBAAgB,KAAK,KAAK,CAAC,UAAU,GAAG,SAAS,QAAQ,KAAK;AAAA,IACrF;AACA,SAAK,wBAAwB,CAAC;AAC9B,SAAK,qBAAqB;AAC1B,SAAK,kBAAkB;AACvB,SAAK,0BAA0B;AAC/B,SAAK,iCAAiC;AACtC,SAAK,4BAA4B;AACjC,SAAK,mCAAmC;AACxC,SAAK,oBAAoB;AACzB,SAAK,YAAY;AAGjB,SAAK,MAAM,CAAC,SAAS;AACjB,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,SAAK,OAAO,CAAC,SAAS,YAAY;AAC9B,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,SAAK,OAAO,CAAC,SAAS,YAAY;AAC9B,YAAM,IAAI,MAAM,aAAa;AAAA,IACjC;AACA,SAAK,QAAQ,CAAC,MAAM,YAAY,iBAAiB;AAE7C,WAAK,YAAY,KAAK,aAAa;AACnC,UAAI;AAEA,aAAK,wBAAwB,MAAM,UAAU;AAC7C,aAAK,0BAA0B,MAAM,YAAY;AACjD,aAAK,mBAAmB,MAAM,UAAU;AACxC,aAAK,kBAAkB,MAAM,UAAU;AAEvC,aAAK,UAAU,MAAM,UAAU;AAAA,MACnC,SACO,GAAG;AACN,gBAAQ,MAAM,kCAAkC,CAAC;AAAA,MACrD;AAAA,IACJ;AACA,SAAK,UAAU,CAAC,MAAM,YAAY,iBAAiB;AAE/C,WAAK,YAAY,KAAK,iBAAiB;AACvC,UAAI;AAEA,aAAK,+BAA+B,MAAM,UAAU;AACpD,aAAK,iCAAiC,MAAM,YAAY;AACxD,aAAK,mBAAmB,MAAM,UAAU;AACxC,aAAK,gBAAgB,MAAM,UAAU;AAErC,aAAK,UAAU,MAAM,UAAU;AAAA,MACnC,SACO,GAAG;AAAA,MAAE;AAAA,IAChB;AACA,SAAK,WAAW;AAChB,SAAK,WAAW,aAAa;AAAA,EACjC;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,MAAM;AACN,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,MAAM,iBAAiB;AACnB,UAAM,UAAUA,QAAM,OAAO,CAAC,GAAG,wBAAwB,mBAAmB,CAAC,CAAC;AAC9E,UAAM,UAAU,KAAK,cAAc,OAAO,QAAQ,MAAM;AACxD,UAAM,MAAMA,QAAM,OAAO,EAAE,UAAU,KAAK,GAAG,KAAK,QAAQ;AAC1D,UAAM,SAAS,IAAI;AAEnB,UAAM,WAAW,KAAK,SAAS,YAAY;AAG3C,UAAM,SAAS;AAAA,MACX,QAAQ,OAAO,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC;AAAA,MACvD,SAAS,CAAC;AAAA,IACd;AAEA,UAAM,uBAAuB,OAAO,sBAAsB;AAAA,MACtD,SAAS;AAAA,QACL;AAAA;AAAA,UAEI,SAAS;AAAA,UACT,YAAY,eAAe;AAAA,UAC3B,QAAQ;AAAA,YACJ,MAAM;AAAA,UACV;AAAA,QACJ;AAAA,MACJ;AAAA,MAAG,OAAO,cAAc;AAAA,IAC5B,CAAC;AACD,UAAM,sBAAsB,OAAO,sBAAsB;AAAA,MACrD,SAAS;AAAA;AAAA,QAEL;AAAA,UACI,SAAS;AAAA,UACT,YAAY,eAAe;AAAA,UAC3B,QAAQ;AAAA,YACJ,MAAM;AAAA,UACV;AAAA,QACJ;AAAA,MACJ;AAAA,MAAG,OAAO,cAAc;AAAA,IAC5B,CAAC;AACD,UAAM,cAAc;AAAA;AAAA,MAEhB;AAAA,QACI,SAAS;AAAA,QACT,YAAY,eAAe;AAAA,QAC3B,QAAQ;AAAA,UACJ,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACJ;AACA,QAAI,UAAU;AACV,kBAAY;AAAA;AAAA,QAEZ;AAAA,UACI,SAAS;AAAA,UACT,YAAY,eAAe;AAAA,UAC3B,QAAQ;AAAA,YACJ,MAAM;AAAA,UACV;AAAA,QACJ;AAAA,MAAC;AAAA,IACL;AACA,UAAM,sBAAsB,OAAO,sBAAsB;AAAA,MACrD,SAAS;AAAA,MAAa,OAAO,cAAc;AAAA,IAC/C,CAAC;AACD,UAAM,yBAAyB,CAAC,sBAAsB,qBAAqB,mBAAmB;AAC9F,UAAM,qBAAqB,uBAAuB;AAClD,UAAM,mBAAmB,uBAAuB,MAAM;AAGtD,UAAM,WAAW;AAAA,MACb,QAAQ,OAAO,mBAAmB;AAAA,QAC9B,MAAM,KAAK;AAAA,MACf,CAAC;AAAA,MAAG,SAAS;AAAA,QACT;AAAA,UACI,QAAQ,IAAI;AAAA,UACZ,OAAO;AAAA,YACH,OAAO;AAAA,cACH,WAAW;AAAA,cACX,WAAW;AAAA,YACf;AAAA,YACA,OAAO,CAAC;AAAA,UACZ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,UAAM,qBAAqB,iBAAiB;AAC5C,UAAM,2CAA2C,CAAC;AAAA;AAAA,MAE1C,SAAS;AAAA,MACT,YAAY,eAAe;AAAA,MAC3B,QAAQ;AAAA,QACJ,MAAM;AAAA,MACV;AAAA,IACJ,CAAC;AACL,UAAM,oCAAoC;AAAA,MACtC,OAAO,cAAc;AAAA,MACrB,SAAS;AAAA,IACb;AACA,UAAM,0BAA0B,OAAO,sBAAsB,iCAAiC;AAC9F,qBAAiB,KAAK,uBAAuB;AAG7C,UAAM,WAAW,WAAW,QAAQ,UAAU,WAAW;AAEzD,UAAM,aAAa;AAAA,MACf,OAAO,cAAc;AAAA,MACrB;AAAA,MACA;AAAA;AAAA,MAEA,QAAQ,OAAO,qBAAqB;AAAA,QAChC,OAAO,cAAc;AAAA,QACrB,kBAAmB,KAAK,wBAAwB;AAAA,MACpD,CAAC;AAAA,MACD,WAAWA,QAAM,OAAO,CAAC,GAAG,QAAQ,WAAW,EAAE,SAAS,CAAC;AAAA,IAC/D;AACA,QAAI,QAAQ,aAAa;AACrB,iBAAW,cAAc,EAAE,OAAO,EAAE;AACpC,iBAAW,eAAe;AAAA,QACtB,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,mBAAmB;AAAA,MACvB;AAAA,IACJ;AACA,SAAK,gBAAgB,OAAO,qBAAqB,UAAU;AAE3D,UAAM,sBAAsB,KAAK,2BAA2B,OAAO,sBAAsB;AAAA,MACrF,OAAO,cAAc;AAAA,MACrB,SAAS;AAAA,QACL;AAAA,UACI,YAAY,eAAe;AAAA,UAC3B,SAAS;AAAA,UACT,QAAQ,EAAE,MAAM,UAAU;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ,CAAC;AACD,UAAM,iBAAiB;AAAA,MACnB,OAAO,cAAc;AAAA,MACrB;AAAA,MACA,UAAU;AAAA,QACN,QAAQ,OAAO,mBAAmB;AAAA,UAC9B,MAAM,4BAA4B,kBAAkB;AAAA,QACxD,CAAC;AAAA,QAAG,SAAS;AAAA,UACT,EAAE,QAAQ,UAAU;AAAA,QACxB;AAAA,MACJ;AAAA,MACA,QAAQ,OAAO,qBAAqB;AAAA,QAChC,OAAO,cAAc;AAAA,QACrB,kBAAkB,uBAAuB,OAAO,mBAAmB;AAAA,MACvE,CAAC;AAAA,MACD,WAAWA,QAAM,OAAO,CAAC,GAAG,QAAQ,WAAW,EAAE,SAAS,CAAC;AAAA,MAC3D,cAAc;AAAA,QACV,mBAAmB;AAAA,QACnB,cAAc;AAAA,QACd,QAAQ;AAAA,MACZ;AAAA,IACJ;AACA,SAAK,oBAAoB,OAAO,qBAAqB,cAAc;AAGnE,UAAM,yBAAyB,CAAC,MAAM,YAAY,eAAe;AAC7D,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,gDAAgD;AAAA,MAC3G;AACA,YAAM,iBAAiB,WAAW,OAAO,KAAK,sBAAsB,GAAG,uBAAuB,eAAe;AAE7G,oBAAc,yBAAyB,QAAQ,cAAc;AAC7D,YAAM,EAAE,MAAM,IAAI,KAAK,SAAS,gBAAgB,MAAM,wBAAwB,CAAC;AAC/E,YAAM,YAAY,KAAK;AAAA,QAAmC,WAAW;AAAA,QAAM;AAAA;AAAA,QAClD;AAAA,QAAiE;AAAA,QAAO;AAAA,MAAU;AAC3G,WAAK,aAAa,OAAO,SAAS;AAAA,IACtC;AACA,SAAK,0BAA0B,CAAC,SAAS,YAAY;AACjD,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,6BAAuB,MAAM,YAAY,KAAK;AAAA,IAClD;AACA,SAAK,iCAAiC,CAAC,SAAS,YAAY;AACxD,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,6BAAuB,MAAM,YAAY,IAAI;AAAA,IACjD;AAEA,UAAM,2BAA2B,CAAC,MAAM,cAAc,eAAe;AACjE,UAAIA,QAAM,OAAO,YAAY,GAAG;AAC5B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,iDAAiD;AAAA,MAC5G;AACA,YAAM,sBAAsB,aAAa,OAAO,KAAK,qBAAqB,GAAG,4BAA4B,oBAAoB;AAE7H,oBAAc,yBAAyB,QAAQ,mBAAmB;AAClE,YAAM,EAAE,MAAM,IAAI,KAAK,SAAS,gBAAgB,QAAQ,uBAAuB,CAAC;AAChF,YAAM,YAAY,KAAK;AAAA,QAAqC,aAAa;AAAA,QAAM;AAAA;AAAA,QACjD;AAAA,QAAO;AAAA,QAAO;AAAA,MAAU;AACtD,WAAK,aAAa,OAAO,SAAS;AAAA,IACtC;AACA,SAAK,4BAA4B,CAAC,SAAS,YAAY;AACnD,YAAM,eAAe,QAAQ,GAAG,CAAC;AACjC,+BAAyB,MAAM,cAAc,KAAK;AAAA,IACtD;AACA,SAAK,mCAAmC,CAAC,SAAS,YAAY;AAC1D,YAAM,eAAe,QAAQ,GAAG,CAAC;AACjC,+BAAyB,MAAM,cAAc,IAAI;AAAA,IACrD;AAEA,SAAK,qBAAqB,CAAC,SAAS,YAAY;AAC5C,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,mDAAmD;AAAA,MAC9G;AAEA,YAAM;AAAA;AAAA,QAA0D,WAAW,OAAO,KAAK,mBAAmB;AAAA,SAAG,wBAAwB,gBAAgB;AACrJ,UAAI,UAAU,gBAAgB;AAC9B,YAAM,eAAe,CAAC,qBAAqB;AAE3C,oBAAc,yBAAyB,QAAQ,eAAe;AAC9D,UAAI,UAAU;AACV,cAAM,aAAa,WAAW,OAAO,KAAK,MAAM,GAAG,mBAAmB,WAAW;AACjF,oBAAY,WAAW;AACvB,qBAAa,KAAK,gBAAgB;AAElC,sBAAc,yBAAyB,QAAQ,UAAU;AAAA,MAC7D;AACA,YAAM,EAAE,OAAO,WAAW,IAAI,KAAK,SAAS,gBAAgB,MAAM,QAAqC,CAAC;AACxG,YAAM,YAAY,KAAK,8BAA8B,WAAW,MAAM,cAAc,SAAS,UAAU;AACvG,WAAK,aAAa,YAAY,SAAS;AAAA,IAC3C;AAEA,SAAK,oBAAoB,CAAC,SAAS,YAAY;AAC3C,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,uCAAuC;AAAA,MAClG;AACA,YAAM,qBAAqB,WAAW,OAAO,KAAK,UAAU,GAAG,2BAA2B,mBAAmB;AAE7G,oBAAc,yBAAyB,QAAQ,kBAAkB;AACjE,YAAM,YAAY,KAAK,6BAA6B,WAAW,MAAM,0BAA0B,mBAAmB,OAAO,kBAAkB;AAC3I,WAAK,aAAa,oBAAoB,SAAS;AAAA,IACnD;AAEA,SAAK,kBAAkB,CAAC,SAAS,YAAY;AACzC,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,UAAIA,QAAM,OAAO,UAAU,GAAG;AAC1B,cAAM,IAAI,eAAe,QAAQ,kBAAkB,IAAI,gDAAgD;AAAA,MAC3G;AACA,YAAM,QAAQ,WAAW,OAAO,KAAK,OAAO,GAAG,cAAc,MAAM,QAAQ,aAAa,MAAM;AAE9F,oBAAc,yBAAyB,QAAQ,KAAK;AACpD,YAAM,YAAY,KAAK;AAAA,QAA0B,WAAW;AAAA,QAAM;AAAA;AAAA,QAAyB;AAAA;AAAA,MAAqB;AAChH,WAAK,aAAa,oBAAoB,SAAS;AAAA,IACnD;AACA,SAAK,YAAY,CAAC,SAAS,YAAY;AACnC,YAAM,aAAa,QAAQ,GAAG,CAAC;AAC/B,YAAM,OAAO,WAAW,MAAM,WAAW,KAAK;AAC9C,UAAI,UAAU;AACV,aAAK,KAAK,GAAG,SAAS,UAAU,SAAS,GAAG,GAAG,CAAC;AAAA,MACpD,OACK;AACD,aAAK,KAAK,SAAS,UAAU,MAAM;AAAA,MACvC;AAAA,IACJ;AAAA,EACJ;AACJ;;;AgBpqCA,SAAS,SAAAG,eAAa;AAIf,IAAM,aAAN,MAAiB;AAAA,EAMpB,OAAO;AAAE,SAAK,YAAY,oBAAI,QAAQ;AAAA,EAAG;AAAA,EACzC,OAAO,QAAQ,KAAK;AAChB,UAAM,WAAW,KAAK;AACtB,QAAI,SAAS,IAAI,GAAG,GAAG;AACnB,YAAM,QAAQ,SAAS,IAAI,GAAG;AAC9B,eAAS,aAAa,MAAM,OAAO,GAAG;AAClC,kBAAU,QAAQ;AAAA,MACtB;AACA,YAAM,MAAM;AACZ,eAAS,OAAO,GAAG;AAAA,IACvB;AAAA,EACJ;AAAA;AAAA,EAEA,OAAO,mBAAmB,KAAK;AAC3B,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACpB,eAAS,IAAI,KAAK,oBAAI,IAAI,CAAC;AAAA,IAC/B;AACA,UAAM,QAAQ,SAAS,IAAI,GAAG;AAC9B,UAAM,MAAM;AACZ,QAAI,MAAM,IAAI,GAAG,GAAG;AAChB,aAAO,MAAM,IAAI,GAAG;AAAA,IACxB;AACA,UAAM,SAAS,IAAI,sBAAsB,GAAG;AAC5C,UAAM,IAAI,KAAK,MAAM;AACrB,WAAO;AAAA,EACX;AACJ;AACA,IAAM,aAAa;AACnB,IAAM,wBAAN,MAA4B;AAAA,EACxB,YAAY,UAAU;AAClB,SAAK,WAAW;AAChB,SAAK,WAAW,oBAAI,IAAI;AACxB,SAAK,QAAQ,CAAC,gBAAgB,YAAY;AACtC,UAAIC,QAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,cAAM,IAAI,MAAM,kEAAoE;AAAA,MACxF;AACA,YAAM,UAAU,MAAM,KAAK,OAAO;AAClC,YAAM,WAAW,gBAAgB,mBAAmB,KAAK,UAAU,OAAO;AAC1E,gBAAU,MAAM,KAAK,OAAO,aAAa,GAAG,OAAO;AACnD,eAAS,UAAU,SAAS;AACxB,cAAM,OAAO,OAAO;AACpB,YAAI,KAAK,OAAO;AACZ;AAAA,QACJ;AAEA,aAAK,SAAS,IAAI,OAAO,IAAI,MAAM;AAAA,MACvC;AAAA,IACJ;AACA,SAAK,MAAM,CAAC,UAAU;AAClB,UAAI,CAACA,QAAM,OAAO,KAAK,OAAO,GAAG;AAC7B,eAAO,KAAK;AAAA,MAChB;AACA,YAAM,OAAO,KAAK;AAClB,YAAM,iBAAiB,KAAK;AAC5B,YAAM,EAAE,OAAO,IAAI,KAAK;AACxB,YAAM,EAAE,OAAO,IAAI,KAAK;AACxB,YAAM,cAAc,OAAO;AAC3B,YAAM,aAAa,KAAK,cAAc;AACtC,WAAK,IAAI;AACT,qBAAe,oBAAoB;AAAA,QAC/B,SAAS;AAAA;AAAA,QAET,QAAQ;AAAA,UACJ,GAAG,MAAM;AAAA,UACT,GAAG,MAAM;AAAA,QACb;AAAA,MACJ,GAAG;AAAA,QACC,QAAQ;AAAA,QACR,cAAe,aAAa,IAAI,MAAO,KAAK;AAAA,QAC5C,cAAc;AAAA,MAClB,GAAG;AAAA,QACC,OAAO;AAAA;AAAA;AAAA,MAGX,CAAC;AACD,aAAO,MAAM,OAAO,CAAC,eAAe,OAAO,CAAC,CAAC;AAE7C,WAAK,WAAW;AAChB,YAAM,QAAQ;AACd,YAAM,UAAU,MAAM;AACtB,YAAM,cAAc,MAAM;AACtB,cAAM,UAAU;AAAA,MACpB;AACA,aAAO,KAAK,UAAU,IAAI,QAAQ,CAAC,SAAS,MAAM;AAC9C,mBAAW,SAAS,WAAW,MAAM,GAAG,IAAI,UAAU,EAAE,KAAK,CAAAC,OAAK;AAC9D,gBAAM,MAAM,IAAI,YAAY,WAAW,eAAe,GAAG,IAAI,UAAU,CAAC;AACxE,gBAAM,KAAK,IAAI,CAAC;AAChB,qBAAW,MAAM;AAEjB,sBAAY;AACZ,gBAAM,SAAS,QAAQ,IAAI,EAAE;AAC7B,cAAI,CAAC,QAAQ;AACT,oBAAQ,CAAC,CAAC;AAAA,UACd,OACK;AACD,oBAAQ,CAAC,OAAO,IAAI,CAAC;AAAA,UACzB;AAAA,QAKJ,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,eAAe,QAAQ;AACnB,UAAM,EAAE,QAAQ,OAAO,IAAI,KAAK;AAChC,UAAM,QAAQ,KAAK,IAAI,OAAO,OAAO,uBAAuB,OAAO,WAAW,GAAG,SAAS,KAAK,IAAI,OAAO,OAAO,uBAAuB,OAAO,YAAY;AAC3J,WAAO,OAAO,cAAc;AAAA,MACxB,MAAM,CAAC,OAAO,QAAQ,CAAC;AAAA,MACvB;AAAA,MACA,OAAO,gBAAgB,WAAW,gBAAgB;AAAA,IACtD,CAAC;AAAA,EACL;AAAA,EACA,gBAAgB;AACZ,UAAM,SAAS,KAAK;AACpB,QAAI,CAACD,QAAM,OAAO,MAAM,GAAG;AACvB,aAAO;AAAA,IACX;AACA,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,WAAO,KAAK,UAAU,OAAO,aAAa;AAAA,MACtC,OAAO,eAAe;AAAA,MACtB,MAAM,aAAa;AAAA,MACnB,OAAO,eAAe,WAAW,eAAe;AAAA,IACpD,CAAC;AAAA,EACL;AAAA,EACA,kBAAkB;AACd,UAAM,WAAW,KAAK;AACtB,QAAI,CAACA,QAAM,OAAO,QAAQ,GAAG;AACzB,aAAO;AAAA,IACX;AACA,UAAM,YAAY,KAAK,eAAe,SAAS,GAAG,WAAW,KAAK,eAAe,aAAa;AAC9F,UAAM,SAAS,EAAE,SAAS,WAAW,MAAM,UAAU,WAAW,EAAE;AAClE,UAAM,QAAQ,EAAE,SAAS,UAAU,MAAM,SAAS,WAAW,EAAE;AAC/D,WAAO,KAAK,YAAY,EAAE,QAAQ,MAAM;AAAA,EAC5C;AAAA,EAEA,gBAAgB,SAAS;AACrB,QAAIA,QAAM,OAAO,OAAO,GAAG;AACvB;AAAA,IACJ;AACA,YAAQ,SAAS,QAAQ;AAAA,EAC7B;AAAA,EACA,UAAU;AACN,UAAM,WAAW,KAAK,WAAW,SAAS,KAAK;AAC/C,QAAI,CAACA,QAAM,cAAc,QAAQ,GAAG;AAChC,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,WAAK,gBAAgB,MAAM;AAC3B,WAAK,gBAAgB,KAAK;AAC1B,WAAK,YAAY;AAAA,IACrB;AACA,QAAI,CAACA,QAAM,OAAO,MAAM,GAAG;AACvB,aAAO,QAAQ;AACf,WAAK,UAAU;AAAA,IACnB;AAAA,EACJ;AAAA,EACA,QAAQ;AACJ,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,SAAK,WAAW,OAAO,qBAAqB,EAAE,OAAO,eAAe,sBAAsB,CAAC;AAC3F,UAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,gBAAgB;AAC/C,UAAM,iBAAiB;AAAA,MACnB,OAAO,eAAe;AAAA,MACtB,kBAAkB;AAAA,QACd;AAAA,UACI,MAAM,OAAO;AAAA,UACb,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,UACrC,QAAQ;AAAA,UACR,SAAS;AAAA,QACb;AAAA,MACJ;AAAA,MACA,wBAAwB;AAAA,QACpB,MAAM,MAAM;AAAA;AAAA,QACZ,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,cAAc;AAAA,MAClB;AAAA,IACJ;AACA,SAAK,QAAQ,KAAK,SAAS,gBAAgB,cAAc;AACzD,SAAK,SAAS,MAAM;AAAA,EACxB;AACJ;;;AlBrLA,IAAME,YAAWC,UAAS,cAAc;AACjC,IAAI;AAAA,CACV,SAAUC,mBAAkB;AACzB,EAAAA,kBAAiBA,kBAAiB,cAAc,IAAI,CAAC,IAAI;AACzD,EAAAA,kBAAiBA,kBAAiB,UAAU,IAAI,CAAC,IAAI;AACzD,GAAG,qBAAqB,mBAAmB,CAAC,EAAE;AACvC,IAAM,YAAN,MAAgB;AAAA,EACnB,OAAO,OAAO,OAAO,QAAQ;AACzB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACpC,UAAI,CAAC,UAAU,KAAK;AAChB,cAAM,UAAU;AAChB,cAAM,QAAQ,EAAE,SAAS,OAAO,iBAAiB,aAAa;AAC9D,eAAO,KAAK;AAAA,MAChB,OACK;AACD,cAAM,SAAS,IAAI,cAAc,KAAK;AACtC,eAAO,KAAK,MAAM,EAAE,KAAK,OAAK,QAAQ,MAAM,GAAG,WAAS;AACpD,gBAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,MAAM;AAC1D,gBAAM,QAAQ,EAAE,SAAS,OAAO,iBAAiB,SAAS;AAC1D,iBAAO,KAAK;AAAA,QAChB,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AACA,SAAS,iBAAiB,OAAO;AAC7B,SAAO;AAAA,IACH,QAAQ;AAAA,IAAI,KAAK;AAAA,IAAG,MAAM;AAAA,IAAI,OAAO;AAAA,IAAG,MAAM;AAAA,IAAI,KAAK;AAAA,IAAK,QAAQF,UAAS,KAAK,GAAG,GAAG,CAAC;AAAA,IAAG,IAAIA,UAAS,EAAE;AAAA,IAAG,UAAUA,UAAS,KAAK,GAAG,GAAG,CAAC;AAAA,IAAG,MAAM;AAAA,IACtJ,OAAO,CAAC;AAAA,IAAG;AAAA,EACf;AACJ;AACA,SAAS,mBAAmB,UAAU;AAClC,WAAS,OAAO,YAAY,CAAC,GAAG;AAC5B,SAAK,QAAQ;AAAA,EACjB;AACJ;AACA,IAAM,gBAAN,MAAoB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA,YAAY,OAAO;AACf,SAAK,eAAe,oBAAI,QAAQ;AAChC,SAAK,cAAc,oBAAI,QAAQ;AAC/B,SAAK,aAAa,oBAAI,QAAQ;AAC9B,SAAK,UAAU,EAAE,kBAAkB,MAAM;AACzC,SAAK,YAAY;AACjB,SAAK,YAAY,CAAC,QAAQ;AACtB,YAAMG,SAAQ,KAAK,QAAQ,SAASA,OAAM;AAC1C,UAAI,CAACC,QAAM,OAAO,MAAM,GAAG;AACvB,cAAM,QAAQ,WAAW,MAAM,IAAI,QAAQ;AAC3C,eAAO,IAAIC,SAAQ,SAAS,OAAO,MAAM,SAAS,QAAQ;AAAA,MAC9D;AAAA,IACJ;AACA,SAAK,qBAAqB;AAI1B,SAAK,gBAAgB;AACrB,UAAM,WAAW,KAAK,SAAS,OAAO;AACtC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,KAAKC,MAAI,eAAeF,QAAM,WAAW;AAEhD,YAAQ,YAAY;AACpB,YAAQ,YAAY,KAAK,UAAU,MAAM;AAEzC,SAAK,qBAAqB,eAAe,OAAO,KAAK,eAAe;AAAA,MAChE,MAAM,YAAY,IAAI;AAAA,MAAG,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,MAAG,YAAY,EAAE,OAAO,GAAG,QAAQ,EAAE;AAAA,IACvF,CAAC;AAAA,EACL;AAAA,EACA,qBAAqB,EAAE,aAAa,OAAO,GAAG;AAC1C,UAAM,EAAE,SAAS,OAAO,IAAI,KAAK;AACjC,UAAM,gBAAgB,QAAQ,kBAAkB;AAChD,QAAI,WAAW,KAAK;AACpB,QAAIA,QAAM,OAAO,QAAQ,GAAG;AACxB,iBAAW,CAAC;AACZ,UAAI,aAAa;AACb,cAAM,YAAY,OAAO,cAAc;AAAA,UACnC,OAAO,eAAe;AAAA,UACtB,QAAQ,UAAU,cAAc;AAAA,UAChC,OAAO,gBAAgB;AAAA,UACvB,MAAM,CAAC,cAAc,OAAO,cAAc,MAAM;AAAA,UAChD,aAAa;AAAA,QACjB,CAAC;AACD,iBAAS,SAAS;AAAA,UACd,SAAS;AAAA,UAAW,MAAM,UAAU,WAAW,EAAE,OAAO,eAAe,sBAAsB,CAAC;AAAA,QAClG;AACA,cAAM,WAAW,OAAO,cAAc;AAAA,UAClC,OAAO,eAAe;AAAA,UACtB,QAAQ;AAAA,UACR,OAAO,gBAAgB;AAAA,UACvB,MAAM,CAAC,cAAc,OAAO,cAAc,MAAM;AAAA,UAChD,aAAa;AAAA,QACjB,CAAC;AACD,iBAAS,QAAQ;AAAA,UACb,SAAS;AAAA,UAAU,MAAM,SAAS,WAAW,EAAE,OAAO,eAAe,qBAAqB,CAAC;AAAA,QAC/F;AAAA,MACJ;AACA,WAAK,YAAY;AAAA,IACrB;AACA,UAAM,EAAE,aAAa,WAAW,IAAI,KAAK;AACzC,UAAM,YAAY,cAAc,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,aAAc,OAAO,eAAe,WAAWG,QAAO,MAAM,UAAU,IAAI,aAAc,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAC9K,UAAM,UAAU,aAAa,mBAAmB,CAAC,SAAS,CAAC;AAC3D,UAAM,gBAAgB,cAAc,WAAW,EAAE,OAAO,eAAe,sBAAsB,CAAC;AAC9F,UAAM,kBAAkB;AAAA,MACpB,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,SAAS;AAAA,IACb;AACA,UAAM,iBAAiB;AAAA,MACnB,kBAAkB,CAAC,eAAe;AAAA,IACtC;AACA,QAAI,aAAa;AACb,YAAM,gBAAgB,SAAS,OAAO;AACtC,YAAM,eAAe,SAAS,MAAM;AACpC,qBAAe,yBAAyB;AAAA,QACpC,MAAM;AAAA,QACN,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,cAAc;AAAA,QACd,mBAAmB;AAAA,QACnB,iBAAiB;AAAA,MACrB;AAEA,sBAAgB,OAAO;AACvB,sBAAgB,gBAAgB;AAAA,IACpC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAc,SAAS,KAAK,SAAS,OAAO,KAAK,OAAO,MAAM;AAC1D,aAAS;AACT,QAAI,IAAI,KAAK;AACb,QAAI,IAAI,KAAK;AACb,UAAM,mBAAmB;AACzB,WAAO,QAAQ,IAAI;AACnB,WAAO,SAAS,IAAI;AACpB,UAAM,UAAU,OAAO,WAAW,QAAQ;AAC1C,UAAM,gBAAgB,UAAU,IAAI,yBAAyB;AAC7D,WAAO,EAAE,SAAS,cAAc;AAAA,EACpC;AAAA,EACA,gBAAgB,QAAQ,SAAS,SAAS,QAAQ;AAC9C,UAAM,EAAE,YAAY,IAAI,KAAK;AAC7B,YAAQ,UAAU;AAAA,MACd,WAAW,cAAc,kBAAkB;AAAA,MAC3C;AAAA,MACA;AAAA,IACJ,CAAC;AACD,SAAK,WAAW,EAAE,QAAQ,SAAS,QAAQ,KAAK,SAAS,SAAS,OAAO;AACzE,SAAK,qBAAqB;AAAA,EAC9B;AAAA,EACA,MAAM,KAAK,QAAQ;AACf,SAAK,UAAU;AACf,UAAM,UAAU,MAAM,UAAU,IAAI,eAAe;AACnD,QAAIH,QAAM,OAAO,OAAO,GAAG;AACvB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC5D;AACA,UAAM,SAAS,MAAM,QAAQ,cAAc;AAC3C,QAAIA,QAAM,OAAO,OAAO,GAAG;AACvB,YAAM,IAAI,MAAM,uCAAuC;AAAA,IAC3D;AACA,WAAO,iBAAiB,mBAAmB,KAAK,SAAS;AAEzD,SAAK,gBAAgB,CAACA,QAAM,OAAO,OAAO,WAAW,OAAO,KAAK,CAACA,QAAM,OAAO,OAAO,SAAS,MACvF,CAACA,QAAM,OAAO,OAAO,UAAU,WAAW,KAAK,CAACA,QAAM,OAAO,OAAO,UAAU,YAAY,KAAK,CAACA,QAAM,OAAO,OAAO,UAAU,QAAQ;AAC9I,UAAM,EAAE,SAAS,eAAe,OAAO,IAAI,KAAK,cAAc;AAC9D,SAAK,gBAAgB,QAAQ,SAAS,SAAS,MAAM;AAAA,EACzD;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,aAAa;AAChB,QAAI,KAAK,sBAAsBA,QAAM,OAAO,KAAK,OAAO,KAAK,EAAE,KAAK,QAAQ,QAAQ,MAAM,EAAE,KAAK,QAAQ,SAAS,IAAI;AAClH;AAAA,IACJ;AACA,UAAM,UAAU,KAAK,UAAU,SAAS,QAAQ,QAEhD,SAAS,KAAK;AAEd,UAAM,kBAAkB,KAAK,SAAS,oBAAoB;AAC1D,QAAI,KAAK,eAAe;AAEpB,MAAAA,QAAM,OAAO,KAAK,cAAc,WAAW;AAAA,IAC/C;AACA,UAAM,cAAc;AACpB,UAAM,iBAAiB,KAAK,qBAAqB,EAAE,YAAY,CAAC;AAEhE,UAAM,iBAAiB,OAAO,qBAAqB,EAAE,OAAO,eAAe,WAAW,CAAC;AACvF,UAAM,OAAO,eAAe,gBAAgB,cAAc;AAE1D,WAAO,KAAK,CAAC,MAAM,QAAQ,WAAW;AAClC,UAAI,KAAK,KAAK,MAAM;AAGhB,eAAO;AAAA,MACX;AACA,UAAI,iBAAiB;AACjB,eAAO,eAAe,YAAY;AAAA,MACtC;AACA,YAAM,cAAc,CAAC,MAAM,QAAQ,GAAG,MAAM;AAE5C,YAAM,WAAW,gBAAgB,OAAO,SAAS,aAAa,EAAE,aAAa,MAAM,WAAW,KAAK,QAAQ,UAAU,CAAC;AAEtH,eAAS,MAAM,MAAM,KAAK,oBAAoB,GAAG,WAAW;AAC5D,UAAI,iBAAiB;AACjB,eAAO,cAAc,EAAE,KAAK,WAAS;AACjC,cAAI,OAAO;AACP,iBAAK,UAAU,KAAK;AAAA,UACxB;AAAA,QACJ,CAAC;AAAA,MACL;AACA,aAAO;AAAA,IACX,CAAC;AACD,SAAK,IAAI;AACT,WAAO,MAAM,OAAO,CAAC,eAAe,OAAO,CAAC,CAAC;AAAA,EACjD;AAAA,EACA,IAAI,SAAS,GAAG;AACZ,SAAK,YAAY;AAAA,EACrB;AAAA,EACA,IAAI,WAAW;AACX,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,QAAQ,OAAO;AACX,QAAI,KAAK,sBAAsBA,QAAM,OAAO,KAAK,OAAO,GAAG;AACvD,aAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAC7B;AACA,UAAM,UAAU,KAAK,UAAU,SAAS,QAAQ,QAAQ,SAAS,KAAK;AAEtE,UAAM,kBAAkB,KAAK,SAAS,oBAAoB;AAE1D,UAAM,YAAY,WAAW,mBAAmB,OAAO;AACvD,cAAU,MAAM;AAEhB,WAAO,KAAK,CAAC,MAAM,WAAW;AAC1B,UAAI,KAAK,KAAK,MAAM;AAGhB,eAAO;AAAA,MACX;AACA,UAAI,iBAAiB;AACjB,eAAO,eAAe,YAAY;AAAA,MACtC;AACA,gBAAU,MAAM,KAAK,oBAAoB,MAAM,MAAM;AACrD,UAAI,iBAAiB;AACjB,eAAO,cAAc,EAAE,KAAK,WAAS;AACjC,cAAI,OAAO;AACP,iBAAK,UAAU,KAAK;AAAA,UACxB;AAAA,QACJ,CAAC;AAAA,MACL;AACA,aAAO;AAAA,IACX,CAAC;AACD,WAAO,UAAU,IAAI,KAAK;AAAA,EAC9B;AAAA,EACA,6BAA6B,MAAM;AAC/B,UAAM,QAAQ,KAAK;AACnB,QAAI,MAAM,IAAI,IAAI,GAAG;AACjB,YAAM,IAAI,IAAI,GAAG,QAAQ;AACzB,YAAM,OAAO,IAAI;AAAA,IACrB;AAAA,EACJ;AAAA,EACA,yBAAyB,MAAM,aAAa,KAAK,aAAa,YAAY,KAAK,YAAY;AACvF,SAAK,UAAU,KAAK;AACpB,UAAM,QAAQ,KAAK;AACnB,QAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,QAAIA,QAAM,OAAO,KAAK,GAAG;AACrB,YAAM,IAAI,MAAM,QAAQ,kBAAkB,OAAO,MAAM,UAAU,CAAC;AAAA,IACtE;AACA,WAAO;AAAA,EACX;AAAA,EACA,uBAAuB,MAAM;AACzB,UAAM,QAAQ,KAAK;AACnB,QAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,QAAIA,QAAM,OAAO,KAAK,GAAG;AACrB,YAAM,IAAI,MAAM,QAAQ,eAAe,OAAO,IAAI,CAAC;AAAA,IACvD;AACA,WAAO;AAAA,EACX;AAAA,EACA,uBAAuB,MAAM;AACzB,UAAM,QAAQ,KAAK;AACnB,QAAI,QAAQ,MAAM,IAAI,IAAI;AAC1B,QAAIA,QAAM,OAAO,KAAK,GAAG;AACrB,YAAM,IAAI,MAAM,QAAQ,eAAe,OAAO,IAAI,CAAC;AAAA,IACvD;AACA,WAAO;AAAA,EACX;AAAA,EACA,eAAe,KAAK,aAAa;AAC7B,oBAAgB,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAClE,aAAS,cAAc,IAAI,UAAU;AACjC,iBAAW,KAAK,UAAU,KAAK;AAC/B,UAAI,OAAO,WAAW,IAAI,GAAG;AACzB,oBAAY,OAAO,KAAK,UAAU;AAAA,MACtC;AACA,UAAI,SAAS,WAAW,IAAI,GAAG;AAC3B,oBAAY,QAAQ,KAAK,UAAU;AAAA,MACvC;AACA,UAAI,QAAQ,WAAW,IAAI,GAAG;AAC1B,oBAAY,OAAO,KAAK,UAAU;AAAA,MACtC;AACA,UAAI,QAAQ,WAAW,IAAI,GAAG;AAC1B,oBAAY,OAAO,KAAK,UAAU;AAClC,aAAK,eAAe,YAAY,WAAW;AAAA,MAC/C;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,OAAO;AACX,UAAM,eAAe,CAAC;AACtB,UAAM,cAAc,CAAC;AACrB,UAAM,eAAe,CAAC;AACtB,UAAM,UAAU,OAAK,KAAK,yBAAyB,CAAC;AACpD,QAAI;AACJ,aAAS,QAAQ,OAAO;AACpB,UAAI,KAAK,MAAM;AAEX,aAAK,6BAA6B,IAAI;AACtC;AAAA,MACJ;AAEA,WAAK,UAAU,KAAK;AAEpB,UAAI,QAAQ,IAAI,GAAG;AACf,cAAM,IAAI;AACV,YAAI,EAAE,MAAM,SAAS,kBAAkB,QAAQ,GAAG;AAC9C,eAAK,aAAa,OAAO,CAAC;AAAA,QAC9B;AACA,qBAAa,KAAK,QAAQ,CAAC,CAAC;AAAA,MAChC;AAEA,UAAI,OAAO,IAAI,KAAK,KAAK,UAAU;AAE/B,aAAK,uBAAuB,KAAK,QAAQ;AACzC,YAAI,CAACA,QAAM,OAAO,KAAK,QAAQ,GAAG;AAC9B,eAAK,uBAAuB,KAAK,QAAQ;AAAA,QAC7C;AACA,oBAAY,KAAK,QAAQ,IAAI,CAAC;AAAA,MAClC;AAEA,UAAI,QAAQ,IAAI,GAAG;AACf,qBAAa,KAAK,QAAQ,IAAI,CAAC;AAAA,MACnC;AACA,UAAI,SAAS,IAAI,GAAG;AAEhB,mBAAW;AAAA,MACf;AAAA,IACJ;AAEA,eAAW,iBAAiB,KAAK,MAAM;AACvC,UAAM,eAAe,QAAQ,MAAM;AACnC,QAAI,cAAc;AAAA,MACd,QAAQ;AAAA,MAAa,QAAQ;AAAA,MAAc,SAAS,CAAC,YAAY;AAAA,MAAG,QAAQ;AAAA,IAChF;AACA,aAAS,eAAe,cAAc;AAClC,oBAAc,KAAK,eAAe,aAAa,WAAW;AAAA,IAC9D;AAEA,SAAK,SAAS,MAAM,OAAO,QAAQ,YAAU;AACzC,UAAI,CAAC,YAAY,SAAS,MAAM,GAAG;AAC/B,eAAO,QAAQ;AAAA,MACnB;AAAA,IACJ,CAAC;AACD,SAAK,UAAU,IAAI,aAAa,WAAW;AAAA,EAC/C;AAAA,EACA,UAAU,OAAO;AACb,SAAK,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,EAClC;AAAA,EACA,UAAU;AACN,SAAK,UAAU;AACf,QAAI,KAAK,gBAAgB,GAAG;AACxB,YAAM,EAAE,OAAO,IAAI,KAAK;AACxB,aAAO,oBAAoB,mBAAmB,KAAK,SAAS;AAC5D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EACA,kBAAkB;AACd,UAAM,MAAM,KAAK;AACjB,QAAIA,QAAM,OAAO,GAAG,GAAG;AACnB,aAAO;AAAA,IACX;AAEA,eAAW,QAAQ,GAAG;AAEtB,oBAAgB,QAAQ,GAAG;AAE3B,UAAM,WAAW,KAAK;AACtB,SAAK,YAAY;AACjB,QAAI,CAACA,QAAM,OAAO,QAAQ,GAAG;AACzB,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,sBAAgB,QAAQ,SAAS,OAAO,OAAO;AAAA,IACnD;AAEA,QAAI,QAAQ,YAAY;AACxB,WAAO;AAAA,EACX;AAAA,EACA,OAAO,MAAM;AACT,SAAK,qBAAqB;AAC1B,QAAI,KAAK,gBAAgB,GAAG;AACxB,YAAM,EAAE,QAAQ,QAAQ,IAAI,KAAK;AACjC,YAAM,EAAE,SAAS,eAAe,OAAO,IAAI,KAAK,cAAc,KAAK,QAAQ,IAAI;AAC/E,WAAK,gBAAgB,QAAQ,SAAS,SAAS,MAAM;AAErD,UAAI,KAAK,eAAe;AACpB,QAAAA,QAAM,OAAO,KAAK,cAAc,EAAE,YAAY,KAAK,CAAC;AAAA,MACxD;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AACJ;;;ADpbA,IAAII,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAMA,IAAM,+BAA+B;AACrC,IAAM,4BAA4B;AAClC,IAAM,SAASC,oBAAmB;AAAlC,IAA4D,SAASA,oBAAmB;AAAxF,IAAkH,SAASA,oBAAmB;AAC9I,IAAI,2BAA2B,MAAMC,kCAAiCC,YAAW,iBAAiB;AAAA,EAC9F,gBAAgB;AACZ,WAAOF,oBAAmB,aAAa,MAAM,OAAK,aAAa,2BAA2B;AAAA,EAC9F;AAAA,EACA,WAAW;AAAA,EACX,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,YAAY,IAAI,iBAAiB,MAAM;AACnC,SAAK,OAAO,KAAK;AAAA,EACrB,CAAC;AAAA,EACD,wBAAwB;AACpB,UAAM,sBAAsB;AAC5B,SAAK,OAAO,KAAK;AACjB,SAAK,UAAU,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACxD;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,SAAS,QAAQ;AACjB,WAAK,gBAAgB,GAAG;AAAA,IAC5B;AAAA,EACJ;AAAA,EACA,gBAAgB,OAAO,KAAK,MAAM;AAC9B,YAAQ,KAAK,IAAI,EAAE,KAAK,OAAK;AACzB,UAAI,MAAM,KAAK,UAAU;AACrB,cAAM,MAAM,KAAK;AACjB,cAAM,MAAM;AACZ,aAAK,WAAW;AAChB,cAAM,MAAM,IAAIG,qBAAoB,EAAE,cAAc,WAAW,UAAU,KAAK,cAAc,KAAK,aAAaC,QAAM,cAAc,GAAG,EAAE,CAAC;AACxI,aAAK,cAAc,GAAG;AAAA,MAC1B;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,uBAAuB;AACnB,SAAK,UAAU,WAAW;AAC1B,UAAM,qBAAqB;AAAA,EAC/B;AACJ;AACAL,aAAW;AAAA,EACPM,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,yBAAyB,WAAW,QAAQ,MAAM;AACrDP,aAAW;AAAA,EACPM,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,yBAAyB,WAAW,QAAQ,MAAM;AACrD,2BAA2BP,aAAW;AAAA,EAClCQ,gBAAc,EAAE,SAASC,MAAI,kBAAkB,CAAC;AACpD,GAAG,wBAAwB;AAE3B,IAAI,8BAA8B,MAAMC,qCAAoC,sBAAsB;AAAA,EAC9F,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,SAAS,CAAC;AACf,SAAK,8BAA8B,CAAC,QAAQ;AACxC,YAAM,EAAE,cAAc,KAAK,IAAI,IAAI;AACnC,UAAI,SAAS,WAAW;AACpB,aAAK,oBAAoB,IAAI,OAAO,YAAY;AAAA,MACpD;AAAA,IACJ;AACA,SAAK,UAAU,oBAAI,IAAI;AACvB,SAAK,aAAa,oBAAI,IAAI;AAC1B,SAAK,aAAa;AAClB,SAAK,UAAU;AACf,SAAK,iBAAiB,oBAAI,QAAQ;AAAA,EACtC;AAAA,EACA,eAAe,OAAO,OAAO,MAAM,MAAM;AACrC,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAC3C,cAAU,OAAO,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,SAAS,MAAM;AACX,UAAM,QAAQ,KAAK;AACnB,QAAI,gBAAgB,4BAA4B,CAAC,MAAM,SAAS,IAAI,GAAG;AACnE,WAAK,iBAAiBC,0BAAyB,KAAK,6BAA6B,KAAK;AACtF,YAAM,KAAK,IAAI;AACf,WAAK,oBAAoB,KAAK,WAAW,OAAO;AAChD,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EACA,WAAW,MAAM;AACb,UAAM,QAAQ,KAAK;AACnB,UAAM,MAAM,MAAM,QAAQ,IAAI;AAC9B,QAAI,OAAO,GAAG;AACV,WAAK,oBAAoBA,0BAAyB,KAAK,6BAA6B,KAAK;AACzF,YAAM,OAAO,KAAK,CAAC;AACnB,WAAK,oBAAoB,KAAK,WAAW,OAAO;AAChD,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,IAAI,YAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,oBAAoB,OAAO;AACvB,QAAI,KAAK,cAAc,MAAM,UAAU,iBAAiB,cAAc;AAClE,WAAK,aAAa;AAClB,WAAK,cAAc,IAAIC,qBAAoB,EAAE,cAAc,aAAa,UAAU,MAAM,cAAc,MAAM,CAAC,CAAC;AAAA,IAClH;AACA,QAAI,KAAK,SAAS;AACd,WAAK,UAAU;AACf,WAAK,cAAc,IAAIA,qBAAoB,EAAE,cAAc,UAAU,UAAU,MAAM,cAAc,MAAM,CAAC,CAAC;AAAA,IAC/G;AAAA,EACJ;AAAA,EACA,WAAW,OAAO;AACd,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAO,IAAI,KAAK,GAAG;AACpB,aAAO,IAAI,KAAK;AAAA,IACpB;AACA,WAAO,UAAU,OAAO,OAAO,EAAE,kBAAkB,KAAK,oBAAoB,OAAO,WAAW,KAAK,UAAU,CAAC,EACzG,KAAK,cAAY;AAClB,UAAI,IAAI,KAAK,GAAG;AAAA;AAAA,MAAmB;AAEnC,UAAI,IAAI,OAAO,QAAQ;AAEvB,WAAK,gBAAgB,KAAK;AAC1B,aAAO,SAAS;AAAA,IACpB,GAAG,CAAC,UAAU;AACV,WAAK,IAAIC,SAAQ,SAAS,OAAO,MAAM,OAAO;AAC9C,WAAK,oBAAoB,KAAK;AAC9B,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,oBAAoB,KAAK;AACrB,UAAM,UAAU,KAAK,QAAQ,uBAAuB,QAAQ,KAAK,OAAK,EAAE,QAAQ,cAAc,GAAG,qBAAqB,QAAQ,KAAK,OAAK,EAAE,QAAQ,eAAe,GAAG,iBAAiB,QAAQ,KAAK,OAAK,EAAE,QAAQ,UAAU;AAC3N,UAAM,cAAc,sBAAsB,MAAM,eAAe,oBAAoB,MAAM,WAAW,gBAAgB;AACpH,SAAK,YAAY,EAAE,aAAa,cAAc,UAAU,SAAS,IAAI;AAAA,EACzE;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,QAAI,OAAO;AACP;AAAA,IACJ;AACA,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAED,aAAK,cAAc;AACnB;AAAA,IACR;AAAA,EACJ;AAAA,EACA,uBAAuB;AACnB,UAAM,MAAM,KAAK;AACjB,aAAS,CAAC,GAAG,QAAQ,KAAK,KAAK;AAC3B,gBAAU,QAAQ;AAAA,IACtB;AACA,QAAI,MAAM;AACV,SAAK,QAAQ,MAAM;AACnB,UAAM,qBAAqB;AAAA,EAC/B;AAAA,EACA,QAAQ,OAAO;AACX,UAAM,YAAY,KAAK,YAAY,SAAS,KAAK;AACjD;AACA,QAAI,UAAU,IAAI,KAAK,GAAG;AACtB,gBAAU,IAAI,KAAK,GAAG,QAAQ;AAC9B,gBAAU,OAAO,KAAK;AAAA,IAC1B;AACA,QAAI,OAAO,IAAI,KAAK,GAAG;AACnB,aAAO,OAAO,KAAK;AAAA,IACvB;AAAA,EACJ;AAAA,EACA,gBAAgB;AACZ,aAAS,SAAS,KAAK,QAAQ,OAAO,GAAG;AAErC,WAAK,WAAW,KAAK;AAAA,IACzB;AAAA,EACJ;AAAA,EACA,gBAAgB,OAAO;AACnB,UAAM,MAAM,KAAK;AACjB,WAAO,IAAI,IAAI,KAAK;AAAA,EACxB;AAAA,EACA,gBAAgB,OAAO;AACnB,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAC3C,cAAU,OAAO,GAAG,MAAM,UAAU;AAAA,EACxC;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO;AAEV,UAAM,QAAQ,MAAM,MAAM,OAAO,SAAS,MAAM,MAAM;AACtD,QAAI,EAAE,QAAQ,MAAM,EAAE,SAAS,IAAI;AAC/B;AAAA,IACJ;AAEA,UAAM,WAAW,KAAK,gBAAgB,KAAK;AAC3C,QAAIC,QAAM,OAAO,QAAQ,GAAG;AACxB;AAAA,IACJ;AACA,QAAI,KAAK,eAAe,IAAI,KAAK,GAAG;AAChC,WAAK,eAAe,OAAO,KAAK;AAChC,WAAK,kBAAkB,KAAK;AAAA,IAChC;AAEA,UAAM,QAAQ,OAAO,OAAO,yBAAyB;AACrD,aAAS,OAAO,EAAE,QAAQ,OAAO,MAAM,YAAY,IAAI,GAAG,YAAY,EAAE,OAAO,OAAO,EAAE,CAAC;AAEzF,QAAI,CAAC,MAAM,aAAa;AACpB;AAAA,IACJ;AACA,UAAM,WAAW,OAAO,OAAO,4BAA4B;AAC3D,QAAIA,QAAM,cAAc,QAAQ,GAAG;AAC/B;AAAA,IACJ;AACA,QAAIA,QAAM,cAAc,KAAK,GAAG;AAC5B,eAAS,IAAI;AACb;AAAA,IACJ;AAEA,aAAS,QAAQ,KAAK,EAAE,KAAK,WAAS;AAClC,UAAIA,QAAM,cAAc,KAAK,GAAG;AAC5B,iBAAS,IAAI;AAAA,MACjB,OACK;AACD,cAAM,SAAS;AAAA,UACX,QAAQ,MAAM,CAAC;AAAA,UAAG,OAAO;AAAA,QAC7B;AACA,iBAAS,MAAM;AAAA,MACnB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,SAAS,OAAO,YAAY,MAAM,SAAS;AACvC,UAAM,YAAY,KAAK;AACvB,QAAI,CAAC,UAAU,IAAI,KAAK,GAAG;AACvB,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC/B;AACA,UAAM,EAAE,OAAO,IAAI,UAAU,IAAI,KAAK;AACtC,UAAM,OAAO,CAACA,QAAM,cAAc,UAAU,GAAG,OAAO,SAAS,OAAO,eAAe,OAAO,cAAc,YAAY,OAAO,MAAK;AAClI,WAAO,IAAI,QAAQ,CAAC,SAAS,MAAM;AAC/B,WAAK,OAAO,KAAK;AACjB,MAAAA,QAAM,gBAAgB,QAAQ,YAAY,MAAM,WAAW,EAAE,KAAK,OAAO;AAAA,IAC7E,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,OAAO,OAAO,MAAM,UAAU;AAClC,WAAO,OAAO,8BAA8B,QAAQ;AACpD,QAAI,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,QAAQ;AAC/E,aAAO,OAAO,yBAAyB;AAAA,IAC3C,OACK;AACD,aAAO,OAAO,2BAA2B,KAAK;AAAA,IAClD;AAAA,EACJ;AAAA,EACA,kBAAkB,OAAO;AACrB,SAAK,gBAAgB,KAAK;AAAA,EAC9B;AAAA,EACA,cAAc,OAAO,GAAG;AACpB,SAAK,eAAe,IAAI,OAAO,IAAI;AAAA,EACvC;AAAA,EACA,QAAQ,OAAO,MAAM;AACjB,SAAK,cAAc,OAAO,IAAI;AAAA,EAClC;AAAA,EACA,WAAW,OAAO,MAAM;AACpB,SAAK,cAAc,OAAO,IAAI;AAAA,EAClC;AAAA,EACA,WAAW,OAAO,MAAM;AAGpB,QAAIA,QAAM,OAAO,IAAI,KACd,KAAK,MAAM,QAAQ,kBAAkB,UAAU,KAAK,KACpD,KAAK,MAAM,QAAQ,kBAAkB,QAAQ,KAAK,GAAG;AACxD,WAAK,cAAc,OAAO,IAAI;AAAA,IAClC;AAAA,EACJ;AAAA,EACA,QAAQ,UAAU,OAAO;AAErB,WAAO,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EACA,QAAQ,OAAO,SAAS;AAEpB,WAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACxB;AAAA,EACA,SAAS,OAAO;AAEZ,WAAO;AAAA,EACX;AACJ;AACAC,aAAW;AAAA,EACP,SAAS,GAAG;AAChB,GAAG,4BAA4B,WAAW,uBAAuB,IAAI;AACrEA,aAAW;AAAA,EACPC,QAAM,EAAE,MAAM,MAAM,CAAC;AACzB,GAAG,4BAA4B,WAAW,aAAa,MAAM;AAC7DD,aAAW;AAAA,EACPC,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,QAAQ,CAAC;AAChE,GAAG,4BAA4B,WAAW,oBAAoB,MAAM;AACpE,8BAA8BF,aAAW;AAAA,EACrCG,gBAAc,EAAE,SAASC,MAAI,qBAAqB,CAAC;AACvD,GAAG,2BAA2B;;;AoBnT9B,SAAS,iBAAAC,iBAAe,KAAAC,KAAG,SAAAC,SAAO,sBAAAC,sBAAoB,SAAAC,SAAO,oBAAAC,mBAAkB,cAAc,WAAW,2BAAAC,gCAA+B;AACvI,SAAS,YAAAC,iBAAgB;AAPzB,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAOA,IAAMC,YAAWC,UAAS,cAAc;AACxC,IAAMC,YAAWD,UAAS,cAAc;AACxC,IAAM,aAAaA,UAAS,cAAc;AAC1C,IAAM,YAAYA,UAAS,cAAc;AACzC,SAAS,gBAAgB,SAAS;AAC9B,MAAI,SAAS,OAAO,GAAG;AACnB,WAAO,QAAQ;AAAA,EACnB;AACA,SAAO;AACX;AACA,IAAM,kBAAkB;AAAxB,IAA2B,cAAc;AAAzC,IAA4C,kBAAkB;AAA9D,IAAmE,UAAU;AAC7E,IAAM,wBAAwB;AAAA,EAC1B,YAAY;AAAA,EAAK,YAAY;AAAA,EAAM,SAAS;AAAA,EAAO,UAAU;AAAA,EAAU,UAAU;AAAA,EACjF,MAAM,EAAE,SAAS,KAAK;AAAA,EAAG,KAAK,EAAE,SAAS,MAAM,QAAQ,EAAE;AAAA,EAAG,UAAU,EAAE,SAAS,MAAM,QAAQ,EAAE;AACrG;AACO,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EAC7B,YAAY,MAAM,SAAS;AACvB,SAAK,UAAU;AAEf,SAAK,SAAS;AAAA;AAAA,MAEV,KAAK;AAAA;AAAA,MAEL,OAAO;AAAA;AAAA,MAEP,KAAK;AAAA;AAAA,MAEL,GAAG;AAAA;AAAA,MAEH,GAAG;AAAA,IACP;AAEA,SAAK,YAAY;AAAA,MACb,KAAK;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACP;AACA,SAAK,gBAAgB,CAAC,QAAQ;AAC1B,YAAM,EAAE,UAAU,IAAI,IAAI,KAAK;AAC/B,YAAM,UAAU,IAAI,gBAAgB;AACpC,YAAM,WAAW,SAAS,WAAW,WAAW,IAAI,WAAW,SAAS,UAAUE,kBAAiB,eAAe,KAAK,SAAS,SAAS;AACzI,YAAM,UAAU,IAAI,WAAW,WAAW,IAAI,WAAW,IAAI,UAAUA,kBAAiB,eAAe,KAAK,IAAI,SAAS;AACzH,UAAI,CAAC,YAAY,CAAC,SAAS;AACvB;AAAA,MACJ;AACA,WAAK,YAAY;AACjB,UAAI,KAAK,WAAW,SAAS;AAEzB,aAAK,gBAAgB,qBAAoB,YAAY,KAAK,OAAO;AAEjE,QAAAC,QAAM,OAAO,KAAK,QAAQJ,UAAS,KAAK,CAAC;AACzC,aAAK,UAAU,IAAI,KAAK,UAAU,IAAI;AAAA,MAC1C;AACA,mBAAa,GAAG;AAChB,aAAO,iBAAiB,aAAa,KAAK,aAAa,KAAK;AAC5D,aAAO,iBAAiB,eAAe,KAAK,cAAc,KAAK;AAC/D,aAAO,iBAAiB,eAAe,KAAK,eAAe,KAAK;AAAA,IACpE;AACA,SAAK,gBAAgB,CAAC,QAAQ,aAAa,GAAG;AAC9C,SAAK,cAAc,CAAC,QAAQ;AACxB,mBAAa,GAAG;AAEhB,aAAO,WAAW,MAAM;AACpB,eAAO,oBAAoB,aAAa,KAAK,WAAW;AACxD,eAAO,oBAAoB,eAAe,KAAK,YAAY;AAC3D,eAAO,oBAAoB,eAAe,KAAK,aAAa;AAAA,MAChE,GAAG,EAAE;AAAA,IACT;AACA,SAAK,eAAe,CAAC,QAAQ;AACzB,YAAM,EAAE,KAAK,IAAI,KAAK;AACtB,YAAM,UAAU,KAAK,WAAWG,kBAAiB,eAAe,KAAK,KAAK,SAAS;AACnF,UAAI,CAAC,SAAS;AACV;AAAA,MACJ;AACA,mBAAa,GAAG;AAChB,YAAM,SAAS,KAAK;AACpB,aAAO,OAAO,KAAK,KAAK,IAAI,MAAM;AAAA,IACtC;AACA,SAAK,eAAe,CAAC,QAAQ;AACzB,mBAAa,GAAG;AAChB,YAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,OAAO;AACtC,YAAM,SAAS,KAAK;AACpB,YAAM,OAAO,KAAK,IAAI,QAAQ,KAAK;AACnC,UAAI,KAAK,WAAW;AAEhB,cAAM,KAAK,CAAC,kBAAkB,MAAM;AACpC,cAAM,EAAE,KAAK,MAAM,IAAI;AACvB,cAAM,EAAE,UAAU,UAAU,YAAY,WAAW,IAAI,KAAK;AAC5D,eAAO,OAAO,MAAM,IAAI,YAAY,IAAI,MAAM,UAAU,QAAQ;AAChE,eAAO,SAAS,QAAQ,IAAI,YAAY,IAAI,MAAM,YAAY,UAAU;AAAA,MAC5E,WACS,KAAK,UAAU;AAEpB,cAAM,KAAK,KAAK,cAAc,SAAS;AACvC,eAAO,KAAK,CAAC,IAAI,YAAY;AAC7B,eAAO,KAAK,IAAI,YAAY;AAAA,MAChC;AAAA,IACJ;AACA,SAAK,iBAAiB,CAAC,MAAM;AACzB,WAAK,QAAQ;AAAA,IACjB;AACA,UAAM,QAAQ,KAAK,UAAU,KAAK,UAAU,MAAM;AAClD,SAAK,gBAAgB,KAAK,gBAAgB,qBAAoB,YAAY,IAAI;AAC9E,UAAM,SAAS,KAAK,UAAU,MAAM;AACpC,WAAO,iBAAiB,eAAe,KAAK,eAAe,KAAK;AAChE,WAAO,iBAAiB,SAAS,KAAK,cAAc,EAAE,SAAS,MAAM,CAAC;AACtE,UAAM,iBAAiB,UAAU,KAAK,gBAAgB,KAAK;AAAA,EAC/D;AAAA,EACA,OAAO,YAAY,QAAQ;AACvB,UAAM,SAASH,UAAS,SAAS,OAAO,UAAU,OAAO,MAAM;AAC/D,UAAM,SAASA,UAAS,IAAI,MAAM;AAClC,WAAO,EAAE,QAAQ,OAAO,QAAQ,QAAQA,UAAS,KAAK,MAAM,GAAG,IAAI,OAAO,IAAI,QAAQ,UAAU,OAAO,SAAS;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAAU,SAAS,QAAQ;AAC9B,eAAW;AACX,UAAM,SAAS,gBAAgB,OAAO,GAAG;AACzC,QAAI,CAACI,QAAM,OAAO,MAAM,GAAG;AACvB,YAAM,EAAE,UAAU,OAAO,IAAI;AAC7B,UAAIA,QAAM,OAAO,QAAQ,KAAKA,QAAM,OAAO,MAAM,KAAKJ,UAAS,SAAS,UAAU,MAAM,GAAG;AACvF,eAAO;AAAA,MACX;AACA,aAAO,IAAI,qBAAoB,SAAS,MAAM;AAAA,IAClD,OACK;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EACA,IAAI,gBAAgB;AAChB,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,cAAc,GAAG;AACjB,SAAK,UAAU;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,EAAE,MAAM,GAAG;AACvB,WAAO,qBAAoB,UAAU,KAAK;AAAA,EAC9C;AAAA,EACA,cAAc,EAAE,IAAI,GAAG;AACnB,WAAO,qBAAoB,UAAU,GAAG;AAAA,EAC5C;AAAA,EACA,OAAO,UAAU,KAAK;AAClB,WAAO,MAAM,GAAG;AACZ,aAAO;AAAA,IACX;AACA,WAAO,MAAM;AAAA,EACjB;AAAA,EACA,OAAO,YAAY,OAAO;AACtB,UAAM,EAAE,QAAQ,IAAI,OAAO,IAAI;AAC/B,UAAM,QAAQA,UAAS,MAAM,QAAQ,MAAM;AAC3C,UAAM,KAAKA,UAAS,MAAM,OAAO,MAAM;AACvC,IAAAA,UAAS,UAAU,KAAK;AACxB,IAAAA,UAAS,UAAU,EAAE;AACrB,WAAO,EAAE,OAAO,IAAI,OAAO;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,UAAU;AACN,QAAI,KAAK,WAAW;AAChB;AAAA,IACJ;AACA,SAAK,YAAY;AACjB,UAAM,SAAS,KAAK;AACpB,UAAM,EAAE,QAAQ,QAAQ,QAAQ,YAAY,IAAI,OAAO,IAAI,KAAK;AAChE,UAAM,EAAE,QAAQ,cAAc,IAAI,KAAK;AACvC,UAAM,EAAE,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,KAAK;AACvC,UAAM,WAAW,KAAK;AACtB,UAAM,EAAE,OAAO,QAAQ,KAAK,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,IAAI;AAC9D,UAAM,UAAU,KAAK,IAAI,OAAO,GAAG,IAAI,WAAW,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,SAAS,KAAK,IAAI,OAAO,GAAG,IAAI,SAAS,SAAS,KAAK,IAAI,IAAI,EAAE,IAAI,WAAW,KAAK,IAAI,IAAI,EAAE,IAAI;AACzL,QAAI,UAAU,WAAW,QAAQ;AAC7B,YAAM,UAAU,OAAO,KAAK,QAAQ,YAAY,YAAa,KAAK,QAAQ,UAAU,kBAAkB,IAAK,KAAK,QAAQ;AACxH,YAAM,mBAAmB,UAAU,KAAK,UAAU;AAClD,YAAM,EAAE,OAAO,GAAG,IAAI,qBAAoB,YAAY,KAAK,aAAa;AAExE,UAAI,cAAc;AAClB,UAAI,QAAQ;AACZ,UAAI,YAAY;AAEhB,UAAI,OAAO;AACX,UAAI,kBAAkB;AAClB,iBAAS,MAAM,QAAQ;AAAA,MAC3B,OACK;AACD,eAAO;AAAA,MACX;AACA,eAAS,MAAM;AACf,YAAM,QAAQ,KAAK,IAAI,MAAK,OAAO,WAAW;AAC9C,YAAM,OAAOA,UAAS,MAAM,QAAQ,CAAC,QAAQ,MAAM;AACnD,oBAAcA,UAAS,IAAI,aAAa,IAAI;AAG5C,UAAI,OAAO;AACX,UAAI,SAAS;AACb,UAAI,kBAAkB;AAClB,iBAAS,MAAM,QAAQ;AACvB,mBAAW,QAAQ,UAAU;AAAA,MACjC,OACK;AACD,eAAO;AACP,iBAAS;AAAA,MACb;AACA,YAAM,MAAM,KAAK,cAAc,EAAE,KAAK,SAAS,MAAM,KAAK,CAAC;AAC3D,YAAM,QAAQ,KAAK,gBAAgB,EAAE,OAAO,SAAS,QAAQ,OAAO,CAAC;AAErE,YAAM,QAAQA,UAAS,OAAO,UAAU;AACxC,UAAI,IAAIE,UAAS,UAAUA,UAAS,SAAS,GAAG,KAAK;AACrD,YAAM,KAAK,WAAW,cAAc,IAAI,GAAG;AAC3C,YAAM,KAAK,WAAW,cAAc,OAAO,KAAK;AAChD,YAAM,MAAMA,UAAS,SAAS,WAAW,iBAAiB,EAAE,GAAG,WAAW,iBAAiB,EAAE,CAAC;AAC9F,UAAIA,UAAS,SAAS,GAAG,GAAG;AAC5B,UAAIA,UAAS,UAAU,GAAGF,UAAS,OAAO,KAAK,CAAC;AAChD,oBAAcE,UAAS,UAAU,aAAa,CAAC;AAC/C,cAAQA,UAAS,UAAU,OAAOA,UAAS,MAAM,GAAG,QAAM;AAAE,WAAG,UAAU,GAAG,UAAU,GAAG,UAAU;AAAA,MAAG,CAAC,CAAC;AAGxG,YAAM,KAAK,IAAI,KAAK;AACpB,UAAI,KAAK,IAAI,KAAK;AAClB,UAAI,kBAAkB;AAClB,eAAO,IAAI,MAAM;AACjB,eAAO,IAAI,MAAM;AAAA,MACrB,OACK;AACD,aAAK;AACL,aAAK;AAAA,MACT;AACA,eAAS,IAAI;AACb,eAAS,IAAI;AACb,YAAM,EAAE,OAAO,cAAc,IAAI,UAAU,IAAI,qBAAoB,YAAY,KAAK,aAAa;AACjG,YAAM,IAAIF,UAAS,MAAM,cAAc,EAAE,GAAG,IAAIA,UAAS,MAAM,WAAW,EAAE;AAC5E,YAAM,SAASA,UAAS,IAAI,GAAG,CAAC;AAChC,kBAAYA,UAAS,IAAI,eAAe,MAAM;AAC9C,aAAO,SAAS;AAChB,aAAO,WAAW;AAClB,aAAO,KAAK;AAEZ,aAAO,MAAM,KAAK,kBAAkB,MAAM;AAAA,IAC9C;AACA,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA,EAEA,UAAU;AACN,UAAM,SAAS,KAAK,SAAS,QAAQ,KAAK;AAC1C,QAAI,CAACI,QAAM,OAAO,MAAM,GAAG;AACvB,aAAO,oBAAoB,eAAe,KAAK,aAAa;AAC5D,aAAO,oBAAoB,SAAS,KAAK,YAAY;AAAA,IACzD;AACA,UAAM,oBAAoB,UAAU,KAAK,gBAAgB,KAAK;AAAA,EAClE;AACJ;AACA,IAAI,kCAAkC,MAAMC,yCAAwC,UAAU,cAAc;AAAA,EACxG,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,OAAO,oBAAI,IAAI;AACpB,SAAK,gBAAgB,CAAC,QAAQ;AAC1B,UAAI,IAAI,OAAO,iBAAiB,aAAa,IAAI,OAAO,iBAAiB,MAAM;AAC3E,cAAM,UAAU,IAAI;AACpB,gBAAQ,oBAAoBC,0BAAyB,KAAK,aAAa;AACvE,aAAK,cAAc,OAAO;AAAA,MAC9B;AAAA,IACJ;AAAA,EACJ;AAAA,EACA;AAAA,EACA,wBAAwB,MAAM,KAAK,KAAK,OAAO;AAC3C,UAAM,wBAAwB,MAAM,KAAK,KAAK,KAAK;AACnD,YAAQ,MAAM;AAAA,MACV,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,cAAM,SAAS,KAAK,aAAa;AACjC,cAAM,QAAQ,KAAK;AACnB,iBAAS,MAAM,MAAM,OAAO,GAAG;AAC3B,aAAG,gBAAgB;AAAA,QACvB;AACA;AAAA,IACR;AAAA,EACJ;AAAA,EACA,uBAAuB;AACnB,UAAM,QAAQ,KAAK;AACnB,aAAS,MAAM,MAAM,OAAO,GAAG;AAC3B,SAAG,QAAQ;AAAA,IACf;AACA,UAAM,MAAM;AACZ,UAAM,qBAAqB;AAAA,EAC/B;AAAA,EACA,eAAe;AACX,WAAOF,QAAM,OAAO,CAAC,GAAG,uBAAuB;AAAA,MAC3C,YAAY,KAAK,cAAc;AAAA,MAC/B,YAAY,KAAK,cAAc;AAAA,MAC/B,UAAU,KAAK,YAAY;AAAA,MAC3B,UAAU,KAAK,YAAY;AAAA,MAC3B,SAAS,KAAK,WAAW;AAAA,MACzB,MAAM,KAAK,eAAe,sBAAsB;AAAA,MAChD,KAAK,KAAK,cAAc,sBAAsB;AAAA,MAC9C,UAAU,KAAK,mBAAmB,sBAAsB;AAAA,IAC5D,CAAC;AAAA,EACL;AAAA,EACA,cAAc,SAAS;AACnB,UAAM,WAAW,oBAAoB,UAAU,SAAS,KAAK,aAAa,CAAC;AAC3E,QAAI,CAACA,QAAM,OAAO,QAAQ,GAAG;AACzB,WAAK,KAAK,IAAI,SAAS,QAAQ;AAAA,IACnC;AAAA,EACJ;AAAA,EACA,SAAS,SAAS;AACd,QAAI,QAAQ,aAAa;AACrB,WAAK,cAAc,OAAO;AAAA,IAC9B,OACK;AACD,cAAQ,iBAAiBE,0BAAyB,KAAK,eAAe,KAAK;AAAA,IAC/E;AAAA,EACJ;AAAA,EACA,WAAW,SAAS;AAChB,UAAM,MAAM,KAAK;AACjB,QAAI,IAAI,IAAI,OAAO,GAAG;AAClB,UAAI,IAAI,OAAO,EAAE,QAAQ;AACzB,UAAI,OAAO,OAAO;AAAA,IACtB;AAAA,EACJ;AACJ;AACAP,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,cAAc,MAAM;AAClET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,YAAY,MAAM;AAChET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,cAAc,MAAM;AAClET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,YAAY,MAAM;AAChET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,eAAe,MAAM;AACnET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,mBAAmB,MAAM;AACvET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAWC,qBAAmB,OAAO,CAAC;AAC/D,GAAG,gCAAgC,WAAW,cAAc,MAAM;AAClET,aAAW;AAAA,EACPQ,QAAM,EAAE,MAAM,OAAO,WAAW,yBAAyB,CAAC;AAC9D,GAAG,gCAAgC,WAAW,WAAW,MAAM;AAC/D,kCAAkCR,aAAW;AAAA,EACzCU,gBAAc,EAAE,SAASC,MAAI,MAAM,kBAAkB,gBAAgB,CAAC;AAC1E,GAAG,+BAA+B;;;AC7WlC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,SAAS,mBAAmB;AAC5B,SAAS,SAAAC,cAAa;AAPtB,IAAIC,eAA0C,SAAU,YAAY,QAAQ,KAAK,MAAM;AACnF,MAAI,IAAI,UAAU,QAAQ,IAAI,IAAI,IAAI,SAAS,SAAS,OAAO,OAAO,OAAO,yBAAyB,QAAQ,GAAG,IAAI,MAAM;AAC3H,MAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,aAAa,WAAY,KAAI,QAAQ,SAAS,YAAY,QAAQ,KAAK,IAAI;AAAA,MACxH,UAAS,IAAI,WAAW,SAAS,GAAG,KAAK,GAAG,IAAK,KAAI,IAAI,WAAW,CAAC,EAAG,MAAK,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM;AAChJ,SAAO,IAAI,KAAK,KAAK,OAAO,eAAe,QAAQ,KAAK,CAAC,GAAG;AAChE;AAMA,IAAM,YAAN,MAAgB;AAAA,EACZ,OAAO,MAAM,SAAS;AAElB,UAAM,WAAW,CAAC;AAClB,UAAM,UAAU;AAChB,QAAI,MAAM,QAAQ,KAAK,OAAO;AAC9B,WAAO,OAAO,IAAI,QAAQ;AACtB,eAAS,KAAK,iBAAiB,QAAQ,IAAI,CAAC,CAAC,CAAC;AAC9C,YAAM,QAAQ,KAAK,OAAO;AAAA,IAC9B;AAEA,UAAM,KAAK,CAAC;AACZ,UAAM,UAAU;AAChB,UAAM,QAAQ,KAAK,OAAO;AAC1B,WAAO,OAAO,IAAI,QAAQ;AACtB,SAAG,KAAKC,OAAM,MAAM,IAAI,CAAC,CAAC,CAAC;AAC3B,YAAM,QAAQ,KAAK,OAAO;AAAA,IAC9B;AAEA,UAAM,KAAK,CAAC;AACZ,UAAM,UAAU;AAChB,UAAM,QAAQ,KAAK,OAAO;AAC1B,WAAO,OAAO,IAAI,QAAQ;AACtB,SAAG,KAAK,iBAAiB,QAAQ,IAAI,CAAC,CAAC,CAAC;AACxC,YAAM,QAAQ,KAAK,OAAO;AAAA,IAC9B;AACA,UAAM,UAAU,CAAC;AACjB,UAAM,KAAK,CAAC;AACZ,UAAM,YAAY,CAAC;AACnB,UAAM,UAAU;AAChB,UAAM,QAAQ,KAAK,OAAO;AAC1B,WAAO,OAAO,IAAI,QAAQ;AACtB,YAAM,WAAW;AACjB,YAAM,OAAO,IAAI,CAAC;AAClB,UAAI,OAAO,SAAS,KAAK,IAAI;AAC7B,UAAI,SAAS;AACb,UAAI,SAAS,SAAS;AACtB,UAAI,QAAQ,QAAQ;AACpB,aAAO,QAAQ,KAAK,QAAQ;AACxB,YAAI,SAAS,GAAG;AAIZ,oBAAU,KAAK,OAAO;AACtB,aAAG,KAAK,GAAG,OAAO,CAAC;AACnB,kBAAQ,KAAK,GAAG,OAAO,CAAC;AAExB,oBAAU,KAAK,MAAM;AACrB,aAAG,KAAK,GAAG,MAAM,CAAC;AAClB,kBAAQ,KAAK,GAAG,MAAM,CAAC;AAAA,QAC3B;AAEA,iBAAS,SAAS,KAAK,CAAC,CAAC,IAAI;AAC7B,iBAAS,SAAS,KAAK,CAAC,CAAC,IAAI;AAC7B,iBAAS,SAAS,KAAK,CAAC,CAAC,IAAI;AAC7B,kBAAU,KAAK,MAAM;AACrB,WAAG,KAAK,GAAG,MAAM,CAAC;AAClB,gBAAQ,KAAK,GAAG,MAAM,CAAC;AACvB,YAAI,WAAW,GAAG;AACd,oBAAU;AACV,oBAAU;AACV,oBAAU;AAAA,QACd;AACA;AACA,eAAO,SAAS,KAAK,IAAI;AAAA,MAC7B;AAEA,YAAM,QAAQ,KAAK,OAAO;AAAA,IAC9B;AAEA,WAAO,IAAI,aAAa,UAAU,WAAW,IAAI,OAAO;AAAA,EAC5D;AACJ;AACA,IAAM,WAAN,MAAe;AAAA,EACX,OAAO,cAAc,SAAS,MAAM;AAChC,YAAQ,KAAK,YAAY,GAAG;AAAA,MACxB,KAAK;AACD,eAAO,UAAU,MAAM,OAAO;AAAA,MAClC;AACI,cAAM,IAAI,MAAM,SAAS,IAAI,qBAAqB;AAAA,IAC1D;AAAA,EACJ;AACJ;AACAD,aAAW;AAAA,EACP,YAAY,SAAS;AACzB,GAAG,UAAU,iBAAiB,IAAI;",
6
6
  "names": ["Watch", "PropertyConverters", "CustomElement", "P", "Utils", "Components", "Geometry", "Utils", "Pacem3DElement", "Utils", "__decorate", "Utils", "Geometry", "StalePropertyFlag", "P", "Components", "Watch", "PropertyConverters", "Pacem3DGroupElement", "CustomElement", "Pacem3DMeshElement", "__decorate", "Watch", "PropertyConverters", "CustomElement", "Pacem3DObjectElement", "__decorate", "Watch", "PropertyConverters", "CustomElement", "Pacem3DLightElement", "__decorate", "Watch", "PropertyConverters", "CustomElement", "Geometry", "Utils", "__decorate", "Watch", "PropertyConverters", "Pacem3DPerspectiveCameraElement", "CustomElement", "Pacem3DOrthographicCameraElement", "__decorate", "Watch", "PropertyConverters", "CustomElement", "PacemEventTarget", "Utils", "Watch", "PropertyConverters", "PCSS", "__decorate", "KnownShader", "PacemEventTarget", "Utils", "PCSS", "Watch", "PropertyConverters", "CustomElement", "P", "__decorate", "BasicMaterialElement", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "__decorate", "LambertMaterialElement", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "__decorate", "LineMaterialElement", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "__decorate", "PhongMaterialElement", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "__decorate", "StandardMaterialElement", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "PacemEventTarget", "Watch", "PropertyConverters", "Utils", "__decorate", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "Utils", "__decorate", "Utils", "__decorate", "PacemBoxElement", "x", "y", "z", "i", "c_1", "c_2", "c_3", "c_4", "u", "v", "u_next", "v_next", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "__decorate", "PacemConeElement", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "__decorate", "PacemCylinderElement", "x", "z", "i", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "__decorate", "PacemLineElement", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Geometry", "__decorate", "PacemPlaneElement", "Geometry", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Geometry", "__decorate", "Geometry", "Watch", "PropertyConverters", "PacemTetrahedronElement", "CustomElement", "P", "PacemOctahedronElement", "__decorate", "CustomElement", "P", "PacemHexahedronElement", "__decorate", "CustomElement", "P", "PacemIcosahedronElement", "__decorate", "CustomElement", "P", "PacemDodecahedronElement", "__decorate", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "__decorate", "PacemSphereElement", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "__decorate", "PacemTorusElement", "Watch", "PropertyConverters", "CustomElement", "P", "Utils", "Utils", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "CustomElementUtils", "Geometry", "__decorate", "Utils", "vertices", "Pacem3DThreeAdapterElement", "Geometry", "point", "CustomElementUtils", "__decorate", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElementUtils", "CustomElement", "P", "Watch", "PropertyConverters", "PropertyChangeEvent", "PropertyChangeEventName", "Utils", "Logging", "Components", "Utils", "P", "Logging", "Colors", "Geometry", "GPUBufferUsage", "GPUTextureUsage", "GPUShaderStage", "GPUMapMode", "Utils", "WGSLBindingType", "Utils", "Colors", "Utils", "Utils", "Utils", "adaptWGSLStringArray", "adaptWGSLModifierStringArray", "Utils", "Utils", "Colors", "Utils", "Utils", "Utils", "Utils", "Utils", "Utils", "Utils", "Utils", "Utils", "Utils", "Colors", "Geometry", "Geometry", "Geometry", "Vector3D", "Geometry", "Matrix3D", "Utils", "retval", "view", "Colors", "Utils", "isMesh", "item", "Utils", "Utils", "_", "Vector3D", "Geometry", "WebGPUIssueCause", "stage", "Utils", "Logging", "P", "Colors", "__decorate", "CustomElementUtils", "Pacem3DWgslScriptElement", "Components", "PropertyChangeEvent", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "Pacem3DWebgpuAdapterElement", "PropertyChangeEventName", "PropertyChangeEvent", "Logging", "Utils", "__decorate", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "P", "Watch", "PropertyConverters", "Utils", "CustomEventUtils", "PropertyChangeEventName", "Geometry", "__decorate", "Vector3D", "Geometry", "Matrix3D", "CustomEventUtils", "Utils", "PacemOrbitCameraBehaviorElement", "PropertyChangeEventName", "Watch", "PropertyConverters", "CustomElement", "P", "Point", "__decorate", "Point"]
7
7
  }