@rotu/structview 0.8.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/core.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Tools for declaring a binary struct as a class with properties
3
+ * @module
4
+ */
5
+ import type { AnyStruct, MixinFromProps, StructConstructor, StructPropertyDescriptor, SubclassWithProperties } from "./types.js";
6
+ export declare const dataViewSymbol: unique symbol;
7
+ /**
8
+ * Get the underlying DataView of a struct
9
+ * @param struct
10
+ * @returns
11
+ */
12
+ export declare function structDataView(struct: AnyStruct): DataView;
13
+ /**
14
+ * Helper method to create a view of a contiguous subregion of a Struct's memory
15
+ * @param struct
16
+ * @param start byte offset to start
17
+ * @param end byte offset of the end of the subrange
18
+ * @returns region of the given struct.
19
+ */
20
+ export declare function structBytes(struct: AnyStruct, start?: number, end?: number): Uint8Array;
21
+ /**
22
+ * Define a descriptor based on a dataview of the struct
23
+ * @param fieldGetter function which, given a dataview, returns
24
+ * @returns
25
+ */
26
+ export declare function fromDataView<Fn extends (dv: DataView) => unknown>(fieldGetter: Fn): StructPropertyDescriptor<ReturnType<Fn>>;
27
+ /**
28
+ * Base class for a structured binary object
29
+ * Note there are no predeclared string-keyed properties - all property names are reserved for user-defined fields
30
+ */
31
+ export declare class Struct {
32
+ [dataViewSymbol]: DataView;
33
+ get [Symbol.toStringTag](): string;
34
+ static toDataView(o: Struct): DataView;
35
+ /**
36
+ * Create a new Struct
37
+ * @param arg options for creating the struct.
38
+ * If options has a `.buffer` property, we will use that as the backing memory (e.g. any TypedArray or DataView).
39
+ * If options has no `.buffer` property but has a `.byteLength`, we will allocate a new buffer for the object.
40
+ */
41
+ constructor(arg: {
42
+ readonly buffer: ArrayBufferLike;
43
+ readonly byteOffset?: number;
44
+ readonly byteLength?: number;
45
+ } | {
46
+ readonly buffer?: undefined;
47
+ readonly byteOffset?: number;
48
+ readonly byteLength: number;
49
+ });
50
+ }
51
+ /**
52
+ * Subclass struct by adding the given property descriptors
53
+ * @param propertyDescriptors properties to add to subclass instances
54
+ * @returns A new class, inheriting from `Struct`, with the new property descriptors added
55
+ */
56
+ export declare function defineStruct<const Props extends PropertyDescriptorMap>(propertyDescriptors: Props): SubclassWithProperties<typeof Struct, MixinFromProps<Props>>;
57
+ /**
58
+ * Create a new struct subclass for an array of structs
59
+ * @param arrayOptions
60
+ * @returns A new class, inheriting from `Struct` whose elements are statically typed structs
61
+ */
62
+ export declare function defineArray<Item extends object>(arrayOptions: {
63
+ /** Constructor for an object view of each item */
64
+ readonly struct: StructConstructor<Item>;
65
+ /** Number of bytes between the start of consecutive items */
66
+ readonly byteStride: number;
67
+ /** Total number of items in the array (not bytes). If omitted, the array length will depend on the size of its underlying buffer */
68
+ readonly length?: number;
69
+ }): StructConstructor<{
70
+ readonly length: number;
71
+ element(i: number): Item;
72
+ } & Iterable<Item>>;
73
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,SAAS,EAET,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,cAAc,eAAgC,CAAA;AAE3D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAM1D;AACD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,SAAS,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,CAAC,EAAE,MAAM,GACX,UAAU,CAOZ;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,EAC/D,WAAW,EAAE,EAAE,GACd,wBAAwB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAQ1C;AAED;;;GAGG;AACH,qBAAa,MAAM;IACjB,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;IACD,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,QAAQ;IAItC;;;;;OAKG;gBAED,GAAG,EACC;QACA,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;QAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;QAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAC7B,GACC;QACA,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;QAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;QAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAC5B;CAyBN;AAsBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,CAAC,KAAK,SAAS,qBAAqB,EACpE,mBAAmB,EAAE,KAAK,GACzB,sBAAsB,CAAC,OAAO,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,SAAS,MAAM,EAC7C,YAAY,EAAE;IACZ,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,oIAAoI;IACpI,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB,GACA,iBAAiB,CAClB;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,GAAG,QAAQ,CAAC,IAAI,CAAC,CACnB,CA+CA"}
package/esm/core.js ADDED
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Tools for declaring a binary struct as a class with properties
3
+ * @module
4
+ */
5
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
6
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
7
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
8
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
9
+ };
10
+ var _a;
11
+ export const dataViewSymbol = Symbol.for("Struct.dataview");
12
+ /**
13
+ * Get the underlying DataView of a struct
14
+ * @param struct
15
+ * @returns
16
+ */
17
+ export function structDataView(struct) {
18
+ const result = struct[dataViewSymbol];
19
+ if (!(result instanceof DataView)) {
20
+ throw new TypeError("not a struct");
21
+ }
22
+ return struct[dataViewSymbol];
23
+ }
24
+ /**
25
+ * Helper method to create a view of a contiguous subregion of a Struct's memory
26
+ * @param struct
27
+ * @param start byte offset to start
28
+ * @param end byte offset of the end of the subrange
29
+ * @returns region of the given struct.
30
+ */
31
+ export function structBytes(struct, start, end) {
32
+ const dv = structDataView(struct);
33
+ start ??= 0;
34
+ end ??= dv.byteLength;
35
+ console.assert(start <= end);
36
+ console.assert(end <= dv.byteLength);
37
+ return new Uint8Array(dv.buffer, dv.byteOffset + start, end - start);
38
+ }
39
+ /**
40
+ * Define a descriptor based on a dataview of the struct
41
+ * @param fieldGetter function which, given a dataview, returns
42
+ * @returns
43
+ */
44
+ export function fromDataView(fieldGetter) {
45
+ return {
46
+ enumerable: true,
47
+ get() {
48
+ const dv = this[dataViewSymbol];
49
+ return fieldGetter(dv);
50
+ },
51
+ };
52
+ }
53
+ /**
54
+ * Base class for a structured binary object
55
+ * Note there are no predeclared string-keyed properties - all property names are reserved for user-defined fields
56
+ */
57
+ export class Struct {
58
+ get [(_a = dataViewSymbol, Symbol.toStringTag)]() {
59
+ return Struct.name;
60
+ }
61
+ static toDataView(o) {
62
+ return o[dataViewSymbol];
63
+ }
64
+ /**
65
+ * Create a new Struct
66
+ * @param arg options for creating the struct.
67
+ * If options has a `.buffer` property, we will use that as the backing memory (e.g. any TypedArray or DataView).
68
+ * If options has no `.buffer` property but has a `.byteLength`, we will allocate a new buffer for the object.
69
+ */
70
+ constructor(arg) {
71
+ Object.defineProperty(this, _a, {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: void 0
76
+ });
77
+ if (typeof arg !== "object" || arg === null) {
78
+ throw new TypeError("Expected argument to be an object");
79
+ }
80
+ Object.preventExtensions(this);
81
+ if (arg.buffer) {
82
+ this[dataViewSymbol] = new DataView(arg.buffer, arg.byteOffset, arg.byteLength);
83
+ }
84
+ else if (typeof arg.byteLength === "number") {
85
+ this[dataViewSymbol] = new DataView(new ArrayBuffer(arg.byteLength + (arg.byteOffset ?? 0)), arg.byteOffset, arg.byteLength);
86
+ }
87
+ else {
88
+ throw new TypeError("Must provide either {buffer} or {byteLength}");
89
+ }
90
+ }
91
+ }
92
+ /**
93
+ * Subclass a type by adding the given property descriptors
94
+ * @param ctor constructor for the base class
95
+ * @param propertyDescriptors properties to add to subclass instances
96
+ * @returns A new class, inheriting from the base class, with the new property descriptors added
97
+ */
98
+ function subclassWithProperties(ctor, propertyDescriptors) {
99
+ var _b;
100
+ return (_b = class extends ctor {
101
+ },
102
+ (() => {
103
+ Object.defineProperties(_b.prototype, propertyDescriptors);
104
+ })(),
105
+ _b);
106
+ }
107
+ /**
108
+ * Subclass struct by adding the given property descriptors
109
+ * @param propertyDescriptors properties to add to subclass instances
110
+ * @returns A new class, inheriting from `Struct`, with the new property descriptors added
111
+ */
112
+ export function defineStruct(propertyDescriptors) {
113
+ return subclassWithProperties(Struct, propertyDescriptors);
114
+ }
115
+ /**
116
+ * Create a new struct subclass for an array of structs
117
+ * @param arrayOptions
118
+ * @returns A new class, inheriting from `Struct` whose elements are statically typed structs
119
+ */
120
+ export function defineArray(arrayOptions) {
121
+ var _StructArray_struct, _StructArray_length, _StructArray_byteStride;
122
+ const { struct, byteStride, length } = arrayOptions;
123
+ class StructArray extends Struct {
124
+ constructor() {
125
+ super(...arguments);
126
+ _StructArray_struct.set(this, struct);
127
+ _StructArray_length.set(this, length);
128
+ _StructArray_byteStride.set(this, byteStride
129
+ /**
130
+ * Number of items in the array
131
+ */
132
+ );
133
+ }
134
+ /**
135
+ * Number of items in the array
136
+ */
137
+ get length() {
138
+ if (typeof __classPrivateFieldGet(this, _StructArray_length, "f") === "number") {
139
+ return __classPrivateFieldGet(this, _StructArray_length, "f");
140
+ }
141
+ return structDataView(this).byteLength / __classPrivateFieldGet(this, _StructArray_byteStride, "f");
142
+ }
143
+ /**
144
+ * A view of the item at the given index
145
+ * @param index
146
+ * @returns a new struct instance viewing the item at the given index
147
+ */
148
+ item(index) {
149
+ const ctor = __classPrivateFieldGet(this, _StructArray_struct, "f");
150
+ return new ctor(structBytes(this, __classPrivateFieldGet(this, _StructArray_byteStride, "f") * index, __classPrivateFieldGet(this, _StructArray_byteStride, "f") * (index + 1)));
151
+ }
152
+ /** @deprecated use item() instead */
153
+ element(index) {
154
+ return this.item(index);
155
+ }
156
+ /**
157
+ * Iterate over the items in the array
158
+ */
159
+ *[(_StructArray_struct = new WeakMap(), _StructArray_length = new WeakMap(), _StructArray_byteStride = new WeakMap(), Symbol.iterator)]() {
160
+ for (let i = 0; i < this.length; ++i) {
161
+ yield this.item(i);
162
+ }
163
+ }
164
+ }
165
+ return StructArray;
166
+ }
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Factories for property descriptors representing fields in a binary struct
3
+ * @module
4
+ */
5
+ import type { StructConstructor, StructPropertyDescriptor, TypedArraySpecies } from "./types.js";
6
+ /**
7
+ * Field for a 8-bit unsigned integer
8
+ */
9
+ export declare function u8(fieldOffset: number): StructPropertyDescriptor<number>;
10
+ /**
11
+ * Field for a little-endian 16-bit unsigned integer
12
+ */
13
+ export declare function u16(fieldOffset: number): StructPropertyDescriptor<number>;
14
+ /**
15
+ * Field for a little-endian 32-bit unsigned integer
16
+ */
17
+ export declare function u32(fieldOffset: number): StructPropertyDescriptor<number>;
18
+ /**
19
+ * Field for a little-endian 64-bit unsigned integer
20
+ */
21
+ export declare function u64(fieldOffset: number): StructPropertyDescriptor<bigint>;
22
+ /**
23
+ * Field for a little-endian 8-bit signed integer
24
+ */
25
+ export declare function i8(fieldOffset: number): StructPropertyDescriptor<number>;
26
+ /**
27
+ * Field for a little-endian 16-bit signed integer
28
+ */
29
+ export declare function i16(fieldOffset: number): StructPropertyDescriptor<number>;
30
+ /**
31
+ * Field for a little-endian 32-bit signed integer
32
+ */
33
+ export declare function i32(fieldOffset: number): StructPropertyDescriptor<number>;
34
+ /**
35
+ * Field for a little-endian 64-bit signed integer
36
+ */
37
+ export declare function i64(fieldOffset: number): StructPropertyDescriptor<bigint>;
38
+ /**
39
+ * Field for a little-endian unsigned integer of arbitrary byte length
40
+ */
41
+ export declare function biguintle(fieldOffset: number, { byteLength }: {
42
+ byteLength: number;
43
+ }): StructPropertyDescriptor<bigint>;
44
+ /**
45
+ * Field for a little-endian signed integer of arbitrary byte length
46
+ */
47
+ export declare function bigintle(offset: number, options: {
48
+ byteLength: number;
49
+ }): StructPropertyDescriptor<bigint>;
50
+ /**
51
+ * Field for a little-endian 16-bit binary float (float16_t)
52
+ */
53
+ export declare function f16(fieldOffset: number): StructPropertyDescriptor<number>;
54
+ /**
55
+ * Field for a little-endian 32-bit binary float (float32_t)
56
+ */
57
+ export declare function f32(fieldOffset: number): StructPropertyDescriptor<number>;
58
+ /**
59
+ * Field for a little-endian 64-bit binary float (float64_t)
60
+ */
61
+ export declare function f64(fieldOffset: number): StructPropertyDescriptor<number>;
62
+ /**
63
+ * Field for a UTF-8 fixed-length string
64
+ */
65
+ export declare function string(fieldOffset: number, byteLength: number): StructPropertyDescriptor<string>;
66
+ /**
67
+ * Field for a boolean stored in a byte (0 = false, nonzero = true)
68
+ * True will be stored as 1
69
+ */
70
+ export declare function bool(fieldOffset: number): StructPropertyDescriptor<boolean>;
71
+ /**
72
+ * Field for an embedded struct
73
+ * @param ctor constructor for the inner struct
74
+ * @param byteOffset where the inner struct starts relative to the outer struct
75
+ * @param bytelength the length in bytes of the inner struct
76
+ * @returns property descriptor for a struct
77
+ */
78
+ export declare function substruct<T extends object>(ctor: StructConstructor<T>, byteOffset?: number, bytelength?: number): StructPropertyDescriptor<T>;
79
+ /**
80
+ * Field for a typed array
81
+ *
82
+ * @remarks
83
+ *
84
+ * I'm not totally happy with this.
85
+ * - TypedArray does not support endianness.
86
+ * - Changing the length property of the parent struct will not change the length of the returned value. `a=x.ar; x.arlength=2;` will not change a's length (though a will still be a live view of the underlying buffer).
87
+ *
88
+ * @param fieldOffset where the array starts relative to the parent struct
89
+ */
90
+ export declare function typedArray<T>(fieldOffset: number, kwargs: {
91
+ /** length or property name for the length of the array */
92
+ readonly length: number | string | undefined;
93
+ /** TypedArray constructor */
94
+ readonly species: TypedArraySpecies<T>;
95
+ }): StructPropertyDescriptor<T>;
96
+ /**
97
+ * Field for a big-endian 16-bit unsigned integer
98
+ */
99
+ export declare function u16be(fieldOffset: number): StructPropertyDescriptor<number>;
100
+ /**
101
+ * Field for a big-endian 32-bit unsigned integer
102
+ */
103
+ export declare function u32be(fieldOffset: number): StructPropertyDescriptor<number>;
104
+ /**
105
+ * Field for a big-endian 64-bit unsigned integer
106
+ */
107
+ export declare function u64be(fieldOffset: number): StructPropertyDescriptor<bigint>;
108
+ /**
109
+ * Field for a big-endian 16-bit signed integer
110
+ */
111
+ export declare function i16be(fieldOffset: number): StructPropertyDescriptor<number>;
112
+ /**
113
+ * Field for a big-endian 32-bit signed integer
114
+ */
115
+ export declare function i32be(fieldOffset: number): StructPropertyDescriptor<number>;
116
+ /**
117
+ * Field for a big-endian 64-bit signed integer
118
+ */
119
+ export declare function i64be(fieldOffset: number): StructPropertyDescriptor<bigint>;
120
+ /**
121
+ * Field for a big-endian 16-bit binary float (float16_t)
122
+ */
123
+ export declare function f16be(fieldOffset: number): StructPropertyDescriptor<number>;
124
+ /**
125
+ * Field for a big-endian 32-bit binary float (float32_t)
126
+ */
127
+ export declare function f32be(fieldOffset: number): StructPropertyDescriptor<number>;
128
+ /**
129
+ * Field for a big-endian 64-bit binary float (float64_t)
130
+ */
131
+ export declare function f64be(fieldOffset: number): StructPropertyDescriptor<number>;
132
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../src/fields.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,wBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUxE;AACD;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AACD;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AACD;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AACD;;GAEG;AACH,wBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUxE;AACD;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AACD;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AACD;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GACrC,wBAAwB,CAAC,MAAM,CAAC,CA0BlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC9B,wBAAwB,CAAC,MAAM,CAAC,CAqBlC;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAgBzE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAUzE;AAED;;GAEG;AACH,wBAAgB,MAAM,CACpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,wBAAwB,CAAC,MAAM,CAAC,CAsBlC;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAU3E;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,EAEhB,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC1B,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,wBAAwB,CAAC,CAAC,CAAC,CAY7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE;IACN,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC5C,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAA;CACvC,GACA,wBAAwB,CAAC,CAAC,CAAC,CAuB7B;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AACD;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AACD;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AACD;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AACD;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AACD;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAgB3E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAU3E"}