{"version":3,"file":"shape.cjs","names":["pgGeometry","Column","SQL","Subquery","Table"],"sources":["../../src/postgres/shape.ts"],"sourcesContent":["import {\n\tCollect,\n\tCollectNullable,\n\ttype CustomMarker,\n\tJson,\n\tJsonArray,\n\ttype JsonMarker,\n\ttype JsonSpec,\n\tNullable,\n\ttype ShapeEntries,\n\ttype ShapeSpec,\n\ttype ShapeValue,\n\ttype TableShape,\n\tTransform,\n\ttype TransformMarker,\n\ttype TypeSpec,\n} from '@drizzle-team/minipg';\nimport { geometry as pgGeometry } from '@drizzle-team/minipg/geometry';\nimport { getOriginalColumnFromAlias } from '~/alias.ts';\nimport { Column } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport type { SelectedFieldsOrdered } from '~/operations.ts';\nimport type { PostgresType } from '~/pg-core/codecs.ts';\nimport type { PgColumn } from '~/pg-core/columns/common.ts';\nimport type { PreparedQuerySelection } from '~/pg-core/dialect.ts';\nimport { type DriverValueDecoder, SQL, type SQLWrapper, type View } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { getColumnFromDecoder, getColumns, orderSelectedFields } from '~/utils.ts';\n\ntype ShapeType = [element: string, as?: string];\n\ntype WireSpec = TypeSpec | CustomMarker;\n\nconst SHAPE_TYPES: Partial<Record<PostgresType, ShapeType>> = {\n\tsmallint: ['int2'],\n\tsmallserial: ['int2'],\n\tint: ['int4'],\n\tserial: ['int4'],\n\tbigint: ['int8', 'bigint'],\n\t'bigint:number': ['int8', 'number'],\n\t'bigint:string': ['int8', 'string'],\n\tbigserial: ['int8', 'bigint'],\n\t'bigserial:number': ['int8', 'number'],\n\tnumeric: ['numeric'],\n\t'numeric:number': ['numeric', 'number'],\n\t'numeric:bigint': ['numeric', 'bigint'],\n\tfloat4: ['float4'],\n\tfloat8: ['float8'],\n\tmoney: ['money'],\n\tchar: ['bpchar'],\n\tvarchar: ['varchar'],\n\ttext: ['text'],\n\tbytea: ['bytea'],\n\tdate: ['date', 'date'],\n\t'date:string': ['date', 'string'],\n\ttime: ['time'],\n\ttimestamp: ['timestamp', 'date'],\n\t'timestamp:string': ['timestamp', 'string'],\n\ttimestamptz: ['timestamptz', 'date'],\n\t'timestamptz:string': ['timestamptz', 'string'],\n\tinterval: ['interval'],\n\t'interval:tuple': ['interval'],\n\tbool: ['bool'],\n\tuuid: ['uuid'],\n\tjson: ['json'],\n\tjsonb: ['jsonb'],\n\toid: ['oid'],\n\tpoint: ['point', 'xy'],\n\t'point:tuple': ['point', 'tuple'],\n\tline: ['line', 'abc'],\n\t'line:tuple': ['line', 'tuple'],\n\tvector: ['vector', 'array'],\n\thalfvec: ['halfvec', 'array'],\n\tsparsevec: ['sparsevec', 'string'],\n};\n\n/** Types minipg decodes only through a registry marker, which carries no spec string to name it by. */\nconst CUSTOM_MARKERS: Partial<Record<PostgresType, { scalar: CustomMarker; array: CustomMarker }>> = {\n\t'geometry(point)': {\n\t\tscalar: pgGeometry('xy'),\n\t\tarray: pgGeometry.array('xy'),\n\t},\n\t'geometry(point):tuple': {\n\t\tscalar: pgGeometry('tuple'),\n\t\tarray: pgGeometry.array('tuple'),\n\t},\n};\n\nconst TEXT: ShapeType = ['text'];\n\n/** The spec a codec type declares by name, at `dimensions` array depth. Anything unmapped reads as text. */\nfunction namedSpecFor(codecType: PostgresType, dimensions: number | undefined): TypeSpec {\n\tconst [element, as] = SHAPE_TYPES[codecType] ?? TEXT;\n\tconst pg = dimensions ? `${element}[]` : element;\n\treturn (as ? `${pg}:${as}` : pg) as TypeSpec;\n}\n\n/** What a codec type declares on the wire, at `dimensions` array depth. Includes Markers not supported in JSON shape. */\nfunction wireSpecFor(codecType: PostgresType, dimensions: number | undefined): WireSpec {\n\tconst custom = CUSTOM_MARKERS[codecType];\n\tif (custom) return dimensions ? custom.array : custom.scalar;\n\n\treturn namedSpecFor(codecType, dimensions);\n}\n\ntype RelationalSelection = Extract<PreparedQuerySelection, { type: 'relational' }>['fields'];\ntype RelationalItem = RelationalSelection[number];\ntype RelationalItemDecodedField = Exclude<RelationalItem['field'], Table | View>;\n\nfunction getDecoder(field: SelectedFieldsOrdered<Column>[number]['field']): DriverValueDecoder<any, any> {\n\tif (is(field, Column)) return field;\n\tif (is(field, SQL)) return field.decoder;\n\tif (is(field, Subquery)) return field._.sql.decoder;\n\treturn field.sql.decoder;\n}\n\nfunction getRqbDecoder(field: RelationalItemDecodedField): DriverValueDecoder<any, any> {\n\tif (is(field, Column)) return field;\n\treturn field.getSQL().decoder;\n}\n\nfunction getRqbColumn(field: RelationalItemDecodedField): Column | undefined {\n\treturn is(field, Column) ? field : getColumnFromDecoder(field as SQL | SQL.Aliased | SQLWrapper);\n}\n\nconst transformCache = new WeakMap<object, Map<string, { codec: unknown; marker: TransformMarker }>>();\n\nconst markerKeys = new WeakMap<CustomMarker, string>();\nlet nextMarkerKey = 0;\n\n/** Marker can't be stringified directly to acquire key */\nfunction specKey(spec: WireSpec): string {\n\tif (typeof spec === 'string') return spec;\n\n\tlet key = markerKeys.get(spec);\n\tif (!key) markerKeys.set(spec, key = `marker:${++nextMarkerKey}`);\n\treturn key;\n}\n\nfunction memoizedTransform(\n\tdecoderKey: object,\n\tspec: WireSpec,\n\tcodec: unknown,\n\tdimensions: number | undefined,\n\tbuild: () => TransformMarker,\n): TransformMarker {\n\tlet byKey = transformCache.get(decoderKey);\n\tif (!byKey) transformCache.set(decoderKey, byKey = new Map());\n\n\tconst cacheKey = `${specKey(spec)}\\u0000${dimensions ?? 0}`;\n\tconst cached = byKey.get(cacheKey);\n\tif (cached && cached.codec === codec) return cached.marker;\n\n\tconst marker = build();\n\tbyKey.set(cacheKey, { codec, marker });\n\treturn marker;\n}\n\nfunction leafFor(\n\tdecoder: DriverValueDecoder<any, any>,\n\tspec: WireSpec,\n\tdimensions: number | undefined,\n): WireSpec | TransformMarker {\n\tif (decoder.mapFromDriverValue.isNoop) return spec;\n\n\tconst key = is(decoder, Column) ? getOriginalColumnFromAlias(decoder) : decoder.mapFromDriverValue;\n\tconst decode = decoder.mapFromDriverValue.bind(decoder);\n\n\treturn memoizedTransform(key, spec, undefined, dimensions, () => Transform(spec as TypeSpec, decode));\n}\n\nfunction wireLeaf(\n\tdecoder: DriverValueDecoder<any, any>,\n\tcolumn: Column | undefined,\n\tcodecOverride: string | undefined,\n\tarrayDimensions: number | undefined,\n): WireSpec | TransformMarker {\n\tconst codecType = column ? (codecOverride ?? column.codec) as PostgresType | undefined : undefined;\n\tconst spec: WireSpec = codecType ? wireSpecFor(codecType, arrayDimensions) : 'unknown';\n\n\treturn leafFor(decoder, spec, arrayDimensions);\n}\n\ntype ShapeEntry = ShapeValue;\n\ninterface PlainLeaf {\n\tpath: readonly string[];\n\tleaf: WireSpec | TransformMarker;\n}\n\nfunction assembleGroupBody(\n\tleaves: PlainLeaf[],\n\tdepth: number,\n\tnullableLeaves: boolean,\n): ShapeEntries {\n\tconst order: string[] = [];\n\tconst directLeaves = new Map<string, ShapeEntry>();\n\tconst groups = new Map<string, PlainLeaf[]>();\n\n\tfor (const leaf of leaves) {\n\t\tconst key = leaf.path[depth]!;\n\t\tif (leaf.path.length === depth + 1) {\n\t\t\tif (!directLeaves.has(key)) order.push(key);\n\t\t\tdirectLeaves.set(key, nullableLeaves ? Nullable(leaf.leaf) : leaf.leaf);\n\t\t\tcontinue;\n\t\t}\n\t\tlet nested = groups.get(key);\n\t\tif (!nested) {\n\t\t\tgroups.set(key, nested = []);\n\t\t\torder.push(key);\n\t\t}\n\t\tnested.push(leaf);\n\t}\n\n\tconst spec: [string, ShapeEntry][] = [];\n\tfor (const key of order) {\n\t\tconst nested = groups.get(key);\n\t\tif (!nested) {\n\t\t\tspec.push([key, directLeaves.get(key)!]);\n\t\t\tcontinue;\n\t\t}\n\t\tspec.push([key, Collect(assembleGroupBody(nested, depth + 1, nullableLeaves))]);\n\t}\n\treturn spec;\n}\n\nconst JSON_LEAF: TypeSpec = 'unknown';\n\nfunction jsonSpecForField(field: RelationalItemDecodedField, arrayDimensions: number | undefined): TypeSpec {\n\tconst codecType = getRqbColumn(field)?.codec as PostgresType | undefined;\n\n\tif (!codecType) return JSON_LEAF;\n\t// Parse jsons of unknown shape as 'unknown' type\n\tif (codecType === 'json' || codecType === 'jsonb') return JSON_LEAF;\n\n\treturn namedSpecFor(codecType, arrayDimensions);\n}\n\nfunction jsonLeafFor(item: RelationalItem): TypeSpec | TransformMarker {\n\tconst { field, codec, arrayDimensions } = item;\n\n\tconst mapFromJsonValue = (<{ mapFromJsonValue?: (value: unknown) => unknown }> field).mapFromJsonValue;\n\tconst decoder = getRqbDecoder(field as RelationalItemDecodedField);\n\tconst isNoop = decoder.mapFromDriverValue.isNoop;\n\n\tif (!mapFromJsonValue && !codec && isNoop) {\n\t\treturn jsonSpecForField(field as RelationalItemDecodedField, arrayDimensions);\n\t}\n\n\tconst spec = codec ? JSON_LEAF : jsonSpecForField(field as RelationalItemDecodedField, arrayDimensions);\n\tconst key = is(field, Column) ? getOriginalColumnFromAlias(field) : (mapFromJsonValue ?? decoder.mapFromDriverValue);\n\treturn memoizedTransform(key, spec, mapFromJsonValue ?? codec, arrayDimensions, () => {\n\t\tconst fn = mapFromJsonValue\n\t\t\t? (value: any) => mapFromJsonValue(value)\n\t\t\t: isNoop\n\t\t\t? (value: any) => codec!(value, arrayDimensions!)\n\t\t\t: codec\n\t\t\t? (value: any) => decoder.mapFromDriverValue(codec(value, arrayDimensions!))\n\t\t\t: (value: any) => decoder.mapFromDriverValue(value);\n\n\t\treturn Transform(spec, fn);\n\t});\n}\n\nfunction jsonSpecFor(selection: RelationalSelection): JsonSpec {\n\tconst spec: [string, TypeSpec | JsonMarker | TransformMarker][] = [];\n\n\tfor (const item of selection) {\n\t\tspec.push([item.key, item.selection ? jsonMarkerFor(item) : jsonLeafFor(item)]);\n\t}\n\n\treturn spec;\n}\n\nfunction jsonMarkerFor(item: RelationalItem): JsonMarker {\n\tconst spec = jsonSpecFor(item.selection!);\n\treturn item.isArray ? JsonArray(spec) : Json(spec);\n}\n\nfunction relationalShape(selection: RelationalSelection): ShapeEntries {\n\tconst root: [string, ShapeEntry][] = [];\n\n\tfor (const item of selection) {\n\t\tif (item.selection) {\n\t\t\troot.push([item.key, jsonMarkerFor(item)]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst field = item.field as RelationalItemDecodedField;\n\t\troot.push([\n\t\t\titem.key,\n\t\t\twireLeaf(\n\t\t\t\tgetRqbDecoder(field),\n\t\t\t\tgetRqbColumn(field),\n\t\t\t\tundefined,\n\t\t\t\titem.arrayDimensions,\n\t\t\t),\n\t\t]);\n\t}\n\n\treturn root;\n}\n\nexport function buildShape(\n\tselection: PreparedQuerySelection,\n\tnullableObjectPaths?: string[],\n): ShapeSpec {\n\tif (selection.type === 'relational') return relationalShape(selection.fields);\n\n\tconst { fields } = selection;\n\tconst nullableKeys = new Set(nullableObjectPaths ?? []);\n\n\tconst order: string[] = [];\n\tconst rootLeaves = new Map<string, ShapeEntry>();\n\tconst groups = new Map<string, PlainLeaf[]>();\n\n\tfor (let i = 0; i < fields.length; ++i) {\n\t\tconst { path, field, column, codecOverride, arrayDimensions } = fields[i]!;\n\t\tconst leaf = wireLeaf(getDecoder(field), column, codecOverride, arrayDimensions);\n\n\t\tconst key = path[0]!;\n\t\tif (path.length === 1) {\n\t\t\tif (!rootLeaves.has(key)) order.push(key);\n\t\t\trootLeaves.set(key, leaf);\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet group = groups.get(key);\n\t\tif (!group) {\n\t\t\tgroups.set(key, group = []);\n\t\t\torder.push(key);\n\t\t}\n\t\tgroup.push({ path, leaf });\n\t}\n\n\tconst root: [string, ShapeEntry][] = [];\n\tfor (const key of order) {\n\t\tconst group = groups.get(key);\n\t\tif (!group) {\n\t\t\troot.push([key, rootLeaves.get(key)!]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst nullable = nullableKeys.has(key);\n\t\tconst body = assembleGroupBody(group, 1, nullable);\n\t\troot.push([key, nullable ? CollectNullable(body) : Collect(body)]);\n\t}\n\n\treturn root;\n}\n\nexport namespace buildShape {\n\texport function fromTableOrView(source: Table): TableShape;\n\texport function fromTableOrView(source: View): TableShape;\n\texport function fromTableOrView(\n\t\tsource: Table | View,\n\t): TableShape {\n\t\tconst columns = getColumns(source);\n\t\tconst fields = orderSelectedFields<PgColumn>(columns);\n\t\tconst jsDbNameMap = is(source, Table)\n\t\t\t? Object.fromEntries(\n\t\t\t\tObject.entries(columns as Record<string, Column>).reduce<[string, string][]>((p, [k, c]) => {\n\t\t\t\t\tconst { name } = c;\n\t\t\t\t\tif (k === name) return p;\n\n\t\t\t\t\tp.push([k, name]);\n\t\t\t\t\treturn p;\n\t\t\t\t}, []),\n\t\t\t)\n\t\t\t: undefined;\n\n\t\treturn {\n\t\t\tshape: buildShape({ type: 'plain', fields }) as TableShape['shape'],\n\t\t\tschema: source[Table.Symbol.Schema],\n\t\t\ttable: source[Table.Symbol.OriginalName],\n\t\t\tcolumns: jsDbNameMap,\n\t\t};\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AAkCA,MAAM,cAAwD;CAC7D,UAAU,CAAC,OAAO;CAClB,aAAa,CAAC,OAAO;CACrB,KAAK,CAAC,OAAO;CACb,QAAQ,CAAC,OAAO;CAChB,QAAQ,CAAC,QAAQ,SAAS;CAC1B,iBAAiB,CAAC,QAAQ,SAAS;CACnC,iBAAiB,CAAC,QAAQ,SAAS;CACnC,WAAW,CAAC,QAAQ,SAAS;CAC7B,oBAAoB,CAAC,QAAQ,SAAS;CACtC,SAAS,CAAC,UAAU;CACpB,kBAAkB,CAAC,WAAW,SAAS;CACvC,kBAAkB,CAAC,WAAW,SAAS;CACvC,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,SAAS;CAClB,OAAO,CAAC,QAAQ;CAChB,MAAM,CAAC,SAAS;CAChB,SAAS,CAAC,UAAU;CACpB,MAAM,CAAC,OAAO;CACd,OAAO,CAAC,QAAQ;CAChB,MAAM,CAAC,QAAQ,OAAO;CACtB,eAAe,CAAC,QAAQ,SAAS;CACjC,MAAM,CAAC,OAAO;CACd,WAAW,CAAC,aAAa,OAAO;CAChC,oBAAoB,CAAC,aAAa,SAAS;CAC3C,aAAa,CAAC,eAAe,OAAO;CACpC,sBAAsB,CAAC,eAAe,SAAS;CAC/C,UAAU,CAAC,WAAW;CACtB,kBAAkB,CAAC,WAAW;CAC9B,MAAM,CAAC,OAAO;CACd,MAAM,CAAC,OAAO;CACd,MAAM,CAAC,OAAO;CACd,OAAO,CAAC,QAAQ;CAChB,KAAK,CAAC,MAAM;CACZ,OAAO,CAAC,SAAS,KAAK;CACtB,eAAe,CAAC,SAAS,QAAQ;CACjC,MAAM,CAAC,QAAQ,MAAM;CACrB,cAAc,CAAC,QAAQ,QAAQ;CAC/B,QAAQ,CAAC,UAAU,QAAQ;CAC3B,SAAS,CAAC,WAAW,QAAQ;CAC7B,WAAW,CAAC,aAAa,SAAS;CAClC;;AAGD,MAAM,iBAA+F;CACpG,mBAAmB;EAClB,oDAAmB,KAAK;EACxB,OAAOA,uCAAW,MAAM,KAAK;EAC7B;CACD,yBAAyB;EACxB,oDAAmB,QAAQ;EAC3B,OAAOA,uCAAW,MAAM,QAAQ;EAChC;CACD;AAED,MAAM,OAAkB,CAAC,OAAO;;AAGhC,SAAS,aAAa,WAAyB,YAA0C;CACxF,MAAM,CAAC,SAAS,MAAM,YAAY,cAAc;CAChD,MAAM,KAAK,aAAa,GAAG,QAAQ,MAAM;AACzC,QAAQ,KAAK,GAAG,GAAG,GAAG,OAAO;;;AAI9B,SAAS,YAAY,WAAyB,YAA0C;CACvF,MAAM,SAAS,eAAe;AAC9B,KAAI,OAAQ,QAAO,aAAa,OAAO,QAAQ,OAAO;AAEtD,QAAO,aAAa,WAAW,WAAW;;AAO3C,SAAS,WAAW,OAAqF;AACxG,yBAAO,OAAOC,mBAAO,CAAE,QAAO;AAC9B,yBAAO,OAAOC,iBAAI,CAAE,QAAO,MAAM;AACjC,yBAAO,OAAOC,uBAAS,CAAE,QAAO,MAAM,EAAE,IAAI;AAC5C,QAAO,MAAM,IAAI;;AAGlB,SAAS,cAAc,OAAiE;AACvF,yBAAO,OAAOF,mBAAO,CAAE,QAAO;AAC9B,QAAO,MAAM,QAAQ,CAAC;;AAGvB,SAAS,aAAa,OAAuD;AAC5E,4BAAU,OAAOA,mBAAO,GAAG,6CAA6B,MAAwC;;AAGjG,MAAM,iCAAiB,IAAI,SAA2E;AAEtG,MAAM,6BAAa,IAAI,SAA+B;AACtD,IAAI,gBAAgB;;AAGpB,SAAS,QAAQ,MAAwB;AACxC,KAAI,OAAO,SAAS,SAAU,QAAO;CAErC,IAAI,MAAM,WAAW,IAAI,KAAK;AAC9B,KAAI,CAAC,IAAK,YAAW,IAAI,MAAM,MAAM,UAAU,EAAE,gBAAgB;AACjE,QAAO;;AAGR,SAAS,kBACR,YACA,MACA,OACA,YACA,OACkB;CAClB,IAAI,QAAQ,eAAe,IAAI,WAAW;AAC1C,KAAI,CAAC,MAAO,gBAAe,IAAI,YAAY,wBAAQ,IAAI,KAAK,CAAC;CAE7D,MAAM,WAAW,GAAG,QAAQ,KAAK,CAAC,QAAQ,cAAc;CACxD,MAAM,SAAS,MAAM,IAAI,SAAS;AAClC,KAAI,UAAU,OAAO,UAAU,MAAO,QAAO,OAAO;CAEpD,MAAM,SAAS,OAAO;AACtB,OAAM,IAAI,UAAU;EAAE;EAAO;EAAQ,CAAC;AACtC,QAAO;;AAGR,SAAS,QACR,SACA,MACA,YAC6B;AAC7B,KAAI,QAAQ,mBAAmB,OAAQ,QAAO;CAE9C,MAAM,0BAAS,SAASA,mBAAO,8CAA8B,QAAQ,GAAG,QAAQ;CAChF,MAAM,SAAS,QAAQ,mBAAmB,KAAK,QAAQ;AAEvD,QAAO,kBAAkB,KAAK,MAAM,QAAW,sDAA4B,MAAkB,OAAO,CAAC;;AAGtG,SAAS,SACR,SACA,QACA,eACA,iBAC6B;CAC7B,MAAM,YAAY,SAAU,iBAAiB,OAAO,QAAqC;AAGzF,QAAO,QAAQ,SAFQ,YAAY,YAAY,WAAW,gBAAgB,GAAG,WAE/C,gBAAgB;;AAU/C,SAAS,kBACR,QACA,OACA,gBACe;CACf,MAAM,QAAkB,EAAE;CAC1B,MAAM,+BAAe,IAAI,KAAyB;CAClD,MAAM,yBAAS,IAAI,KAA0B;AAE7C,MAAK,MAAM,QAAQ,QAAQ;EAC1B,MAAM,MAAM,KAAK,KAAK;AACtB,MAAI,KAAK,KAAK,WAAW,QAAQ,GAAG;AACnC,OAAI,CAAC,aAAa,IAAI,IAAI,CAAE,OAAM,KAAK,IAAI;AAC3C,gBAAa,IAAI,KAAK,oDAA0B,KAAK,KAAK,GAAG,KAAK,KAAK;AACvE;;EAED,IAAI,SAAS,OAAO,IAAI,IAAI;AAC5B,MAAI,CAAC,QAAQ;AACZ,UAAO,IAAI,KAAK,SAAS,EAAE,CAAC;AAC5B,SAAM,KAAK,IAAI;;AAEhB,SAAO,KAAK,KAAK;;CAGlB,MAAM,OAA+B,EAAE;AACvC,MAAK,MAAM,OAAO,OAAO;EACxB,MAAM,SAAS,OAAO,IAAI,IAAI;AAC9B,MAAI,CAAC,QAAQ;AACZ,QAAK,KAAK,CAAC,KAAK,aAAa,IAAI,IAAI,CAAE,CAAC;AACxC;;AAED,OAAK,KAAK,CAAC,uCAAa,kBAAkB,QAAQ,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC;;AAEhF,QAAO;;AAGR,MAAM,YAAsB;AAE5B,SAAS,iBAAiB,OAAmC,iBAA+C;CAC3G,MAAM,YAAY,aAAa,MAAM,EAAE;AAEvC,KAAI,CAAC,UAAW,QAAO;AAEvB,KAAI,cAAc,UAAU,cAAc,QAAS,QAAO;AAE1D,QAAO,aAAa,WAAW,gBAAgB;;AAGhD,SAAS,YAAY,MAAkD;CACtE,MAAM,EAAE,OAAO,OAAO,oBAAoB;CAE1C,MAAM,mBAAyE,MAAO;CACtF,MAAM,UAAU,cAAc,MAAoC;CAClE,MAAM,SAAS,QAAQ,mBAAmB;AAE1C,KAAI,CAAC,oBAAoB,CAAC,SAAS,OAClC,QAAO,iBAAiB,OAAqC,gBAAgB;CAG9E,MAAM,OAAO,QAAQ,YAAY,iBAAiB,OAAqC,gBAAgB;AAEvG,QAAO,sCADQ,OAAOA,mBAAO,8CAA8B,MAAM,GAAI,oBAAoB,QAAQ,oBACnE,MAAM,oBAAoB,OAAO,uBAAuB;AASrF,6CAAiB,MARN,oBACP,UAAe,iBAAiB,MAAM,GACvC,UACC,UAAe,MAAO,OAAO,gBAAiB,GAC/C,SACC,UAAe,QAAQ,mBAAmB,MAAM,OAAO,gBAAiB,CAAC,IACzE,UAAe,QAAQ,mBAAmB,MAAM,CAE1B;GACzB;;AAGH,SAAS,YAAY,WAA0C;CAC9D,MAAM,OAA4D,EAAE;AAEpE,MAAK,MAAM,QAAQ,UAClB,MAAK,KAAK,CAAC,KAAK,KAAK,KAAK,YAAY,cAAc,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC;AAGhF,QAAO;;AAGR,SAAS,cAAc,MAAkC;CACxD,MAAM,OAAO,YAAY,KAAK,UAAW;AACzC,QAAO,KAAK,8CAAoB,KAAK,kCAAQ,KAAK;;AAGnD,SAAS,gBAAgB,WAA8C;CACtE,MAAM,OAA+B,EAAE;AAEvC,MAAK,MAAM,QAAQ,WAAW;AAC7B,MAAI,KAAK,WAAW;AACnB,QAAK,KAAK,CAAC,KAAK,KAAK,cAAc,KAAK,CAAC,CAAC;AAC1C;;EAGD,MAAM,QAAQ,KAAK;AACnB,OAAK,KAAK,CACT,KAAK,KACL,SACC,cAAc,MAAM,EACpB,aAAa,MAAM,EACnB,QACA,KAAK,gBACL,CACD,CAAC;;AAGH,QAAO;;AAGR,SAAgB,WACf,WACA,qBACY;AACZ,KAAI,UAAU,SAAS,aAAc,QAAO,gBAAgB,UAAU,OAAO;CAE7E,MAAM,EAAE,WAAW;CACnB,MAAM,eAAe,IAAI,IAAI,uBAAuB,EAAE,CAAC;CAEvD,MAAM,QAAkB,EAAE;CAC1B,MAAM,6BAAa,IAAI,KAAyB;CAChD,MAAM,yBAAS,IAAI,KAA0B;AAE7C,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;EACvC,MAAM,EAAE,MAAM,OAAO,QAAQ,eAAe,oBAAoB,OAAO;EACvE,MAAM,OAAO,SAAS,WAAW,MAAM,EAAE,QAAQ,eAAe,gBAAgB;EAEhF,MAAM,MAAM,KAAK;AACjB,MAAI,KAAK,WAAW,GAAG;AACtB,OAAI,CAAC,WAAW,IAAI,IAAI,CAAE,OAAM,KAAK,IAAI;AACzC,cAAW,IAAI,KAAK,KAAK;AACzB;;EAGD,IAAI,QAAQ,OAAO,IAAI,IAAI;AAC3B,MAAI,CAAC,OAAO;AACX,UAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;AAC3B,SAAM,KAAK,IAAI;;AAEhB,QAAM,KAAK;GAAE;GAAM;GAAM,CAAC;;CAG3B,MAAM,OAA+B,EAAE;AACvC,MAAK,MAAM,OAAO,OAAO;EACxB,MAAM,QAAQ,OAAO,IAAI,IAAI;AAC7B,MAAI,CAAC,OAAO;AACX,QAAK,KAAK,CAAC,KAAK,WAAW,IAAI,IAAI,CAAE,CAAC;AACtC;;EAGD,MAAM,WAAW,aAAa,IAAI,IAAI;EACtC,MAAM,OAAO,kBAAkB,OAAO,GAAG,SAAS;AAClD,OAAK,KAAK,CAAC,KAAK,qDAA2B,KAAK,qCAAW,KAAK,CAAC,CAAC;;AAGnE,QAAO;;;CAMA,SAAS,gBACf,QACa;EACb,MAAM,qCAAqB,OAAO;EAClC,MAAM,6CAAuC,QAAQ;EACrD,MAAM,kCAAiB,QAAQG,iBAAM,GAClC,OAAO,YACR,OAAO,QAAQ,QAAkC,CAAC,QAA4B,GAAG,CAAC,GAAG,OAAO;GAC3F,MAAM,EAAE,SAAS;AACjB,OAAI,MAAM,KAAM,QAAO;AAEvB,KAAE,KAAK,CAAC,GAAG,KAAK,CAAC;AACjB,UAAO;KACL,EAAE,CAAC,CACN,GACC;AAEH,SAAO;GACN,OAAO,WAAW;IAAE,MAAM;IAAS;IAAQ,CAAC;GAC5C,QAAQ,OAAOA,iBAAM,OAAO;GAC5B,OAAO,OAAOA,iBAAM,OAAO;GAC3B,SAAS;GACT"}