@mappedin/react-native-sdk 6.0.0-alpha.9 → 6.0.0-beta.1

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.
Files changed (46) hide show
  1. package/LICENSE.txt +104 -0
  2. package/README.md +162 -164
  3. package/lib/components/label.d.ts +45 -0
  4. package/lib/components/label.d.ts.map +1 -0
  5. package/lib/components/marker.d.ts +54 -0
  6. package/lib/components/marker.d.ts.map +1 -0
  7. package/lib/components/model.d.ts +45 -0
  8. package/lib/components/model.d.ts.map +1 -0
  9. package/lib/components/path.d.ts +42 -0
  10. package/lib/components/path.d.ts.map +1 -0
  11. package/lib/components/shape.d.ts +54 -0
  12. package/lib/components/shape.d.ts.map +1 -0
  13. package/lib/controls/event-control.d.ts +89 -0
  14. package/lib/controls/event-control.d.ts.map +1 -0
  15. package/lib/controls/map-view-control.d.ts +360 -0
  16. package/lib/controls/map-view-control.d.ts.map +1 -0
  17. package/lib/errors.d.ts +4 -0
  18. package/lib/errors.d.ts.map +1 -0
  19. package/lib/extension-registry.d.ts +29 -0
  20. package/lib/extension-registry.d.ts.map +1 -0
  21. package/lib/hooks/extensions/use-register-extension.d.ts +92 -0
  22. package/lib/hooks/extensions/use-register-extension.d.ts.map +1 -0
  23. package/lib/hooks/use-bridge.d.ts +18 -0
  24. package/lib/hooks/use-bridge.d.ts.map +1 -0
  25. package/lib/hooks/use-event-callback.d.ts +24 -0
  26. package/lib/hooks/use-event-callback.d.ts.map +1 -0
  27. package/lib/hooks/use-map-view-event.d.ts +27 -0
  28. package/lib/hooks/use-map-view-event.d.ts.map +1 -0
  29. package/lib/hooks/use-map.d.ts +72 -0
  30. package/lib/hooks/use-map.d.ts.map +1 -0
  31. package/lib/index.d.ts +30 -0
  32. package/lib/index.d.ts.map +1 -0
  33. package/lib/index.js +44496 -0
  34. package/lib/index.js.map +7 -0
  35. package/lib/map-view.d.ts +51 -0
  36. package/lib/map-view.d.ts.map +1 -0
  37. package/lib/types.d.ts +3 -0
  38. package/lib/types.d.ts.map +1 -0
  39. package/lib/utils/extension-event-scripts.d.ts +29 -0
  40. package/lib/utils/extension-event-scripts.d.ts.map +1 -0
  41. package/lib/utils.d.ts +28 -0
  42. package/lib/utils.d.ts.map +1 -0
  43. package/package.json +52 -29
  44. package/dist/commonjs/index.js +0 -3628
  45. package/dist/esm/index.js +0 -3628
  46. package/dist/index.d.ts +0 -6863
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Registration state for extension registration lifecycle
3
+ */
4
+ export type RegistrationState = 'unregistered' | 'registering' | 'registered';
5
+ /**
6
+ * Creates a registration control system to prevent race conditions between multiple hook instances.
7
+ * Uses closure to encapsulate state and provide controlled access.
8
+ *
9
+ * CRITICAL: Must use module-level closure approach for race prevention. Context-based coordination
10
+ * fails because React context updates are async/batched, creating race windows where multiple
11
+ * components can read identical state and all proceed with registration simultaneously.
12
+ * Only synchronous, module-level state can provide atomic coordination across component instances.
13
+ *
14
+ * @param extensionName - The name of the extension being registered
15
+ * @returns Registration control interface with methods to manage concurrent registrations
16
+ */
17
+ declare function createRegistrationControl(): {
18
+ /**
19
+ * Checks if a registration is currently in progress
20
+ * @returns True if registration is active, false otherwise
21
+ */
22
+ isCurrentlyRegistering(): boolean;
23
+ /**
24
+ * Starts a registration process, ensuring only one can run at a time
25
+ * @param registrationFn - The async function to execute for registration
26
+ * @returns Promise that resolves when registration completes
27
+ */
28
+ startRegistration(registrationFn: () => Promise<void>): Promise<void>;
29
+ /**
30
+ * Resets the registration state (useful when bridge becomes unavailable)
31
+ */
32
+ reset(): void;
33
+ };
34
+ /**
35
+ * Gets or creates a registration control for a specific extension
36
+ * @param extensionName - The name of the extension
37
+ * @returns Registration control instance for the extension
38
+ */
39
+ declare function getRegistrationControl(extensionName: string): ReturnType<typeof createRegistrationControl>;
40
+ export { createRegistrationControl, getRegistrationControl };
41
+ /**
42
+ * Configuration for the extension registration hook
43
+ */
44
+ export interface UseRegisterExtensionConfig {
45
+ /**
46
+ * The name of the extension to register (e.g., 'blue-dot', 'dynamic-focus')
47
+ */
48
+ extensionName: string;
49
+ /**
50
+ * Function that returns the registration script for the extension
51
+ */
52
+ getRegistrationScript: () => string;
53
+ /**
54
+ * Optional logger for debugging
55
+ */
56
+ logger?: {
57
+ log: (...messages: string[]) => void;
58
+ error: (message: string, error?: unknown) => void;
59
+ };
60
+ }
61
+ /**
62
+ * React hook for registering extensions with the WebView bridge
63
+ *
64
+ * This hook handles the complete extension registration lifecycle:
65
+ * - Monitors bridge readiness state
66
+ * - Checks if extension is already registered to avoid duplicates
67
+ * - Injects registration script when needed
68
+ * - Updates extension state in shared context
69
+ * - Handles all registration errors gracefully
70
+ *
71
+ * Multiple hooks can use this safely - the registration logic is idempotent
72
+ * and will only register the extension once per bridge lifecycle.
73
+ *
74
+ * @param config - Configuration for the extension registration
75
+ * @returns void - Hook performs registration as side effect only
76
+ *
77
+ * @example
78
+ * ```tsx
79
+ * function MyExtensionHook() {
80
+ * useRegisterExtension({
81
+ * extensionName: 'my-extension',
82
+ * getRegistrationScript: () => 'extension script here'
83
+ * });
84
+ *
85
+ * // Read isReady from context extensions
86
+ * const { extensions } = useContext(MappedinContext);
87
+ * const isReady = extensions?.['my-extension']?.isReady || false;
88
+ * }
89
+ * ```
90
+ */
91
+ export declare function useRegisterExtension(config: UseRegisterExtensionConfig): void;
92
+ //# sourceMappingURL=use-register-extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-register-extension.d.ts","sourceRoot":"","sources":["../../../src/hooks/extensions/use-register-extension.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,iBAAS,yBAAyB;IAKhC;;;OAGG;8BACuB,OAAO;IAIjC;;;;OAIG;sCACqC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAe3E;;OAEG;aACM,IAAI;EAKd;AAOD;;;;GAIG;AACH,iBAAS,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAKnG;AAGD,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAC1C;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,qBAAqB,EAAE,MAAM,MAAM,CAAC;IAEpC;;OAEG;IACH,MAAM,CAAC,EAAE;QACR,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;QACrC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;KAClD,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAyH7E"}
@@ -0,0 +1,18 @@
1
+ import type { WebView, WebViewMessageEvent } from 'react-native-webview';
2
+ import type { Instruction } from '@mappedin/webview-bridge';
3
+ /**
4
+ * React hook for communicating with a WebView or iframe using a bridge pattern.
5
+ * Automatically detects platform and uses appropriate communication method.
6
+ *
7
+ * @param container - The WebView instance (React Native) or HTMLIFrameElement (web) - can be null
8
+ * @returns An object containing the instruct function, handleMessage callback, cleanup function, and isReady state
9
+ */
10
+ export declare function useBridge(container: WebView | HTMLIFrameElement | null): {
11
+ instruct: <T = any>(instruction: Instruction) => Promise<T>;
12
+ handleMessage: (event: WebViewMessageEvent | MessageEvent) => void;
13
+ destroy: () => void;
14
+ isReady: boolean;
15
+ injectJavaScript: (src: string) => Promise<void>;
16
+ };
17
+ export type UseBridgeHook = ReturnType<typeof useBridge>;
18
+ //# sourceMappingURL=use-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-bridge.d.ts","sourceRoot":"","sources":["../../src/hooks/use-bridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAmE5D;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI;eA0CpE,CAAC,qBAAqB,WAAW,KAAG,OAAO,CAAC,CAAC,CAAC;2BA9BN,mBAAmB,GAAG,YAAY;;;4BAkGrE,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAiE7B;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @internal curently this is marked as internal. Until we want to promote customer to build their own extensions.
3
+ */
4
+ export interface UseEventCallbackOptions<T = any> {
5
+ eventKey: string;
6
+ callback: (payload: T) => void;
7
+ setupScript: () => string;
8
+ cleanupScript: () => string;
9
+ shouldInject?: boolean;
10
+ }
11
+ /**
12
+ * Shared hook for managing event callbacks with reference counting
13
+ *
14
+ * This hook handles the common pattern of:
15
+ * - Registering callbacks with React Native event control
16
+ * - Reference counting to avoid duplicate WebView listeners
17
+ * - JavaScript injection for setup/cleanup only when needed
18
+ * - Stable callback handling that survives callback updates
19
+ *
20
+ * @param options Configuration for the event callback
21
+ * @internal curently this is marked as internal. Until we want to promote customer to build their own extensions.
22
+ */
23
+ export declare function useEventCallback<T = any>({ eventKey, callback, setupScript, cleanupScript, shouldInject, }: UseEventCallbackOptions<T>): void;
24
+ //# sourceMappingURL=use-event-callback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-event-callback.d.ts","sourceRoot":"","sources":["../../src/hooks/use-event-callback.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,uBAAuB,CAAC,CAAC,GAAG,GAAG;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,GAAG,EAAE,EACzC,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAmB,GACnB,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAAG,IAAI,CAsDnC"}
@@ -0,0 +1,27 @@
1
+ import type { TEvents } from '@mappedin/mappedin-js';
2
+ type TEventPayload<EventName extends keyof TEvents> = TEvents[EventName] extends {
3
+ data: null;
4
+ } ? TEvents[EventName]['data'] : TEvents[EventName];
5
+ /**
6
+ * Hook to subscribe to an event on the MapView in React Native.
7
+ *
8
+ * This hook uses the MapView's .on() and .off() methods to subscribe to events
9
+ * on the MapView instance running in the WebView.
10
+ *
11
+ * @param event - The event to listen for.
12
+ * @param callback - The callback to call when the event is triggered.
13
+ *
14
+ * @category Hooks
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * useMapViewEvent('click', event => {
19
+ * const { coordinate } = event;
20
+ * const { latitude, longitude } = coordinate;
21
+ * console.log(`Map was clicked at ${latitude}, ${longitude}`);
22
+ * });
23
+ * ```
24
+ */
25
+ export declare function useMapViewEvent<T extends keyof TEvents>(event: T, callback: (payload: TEventPayload<T>) => void): void;
26
+ export {};
27
+ //# sourceMappingURL=use-map-view-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-map-view-event.d.ts","sourceRoot":"","sources":["../../src/hooks/use-map-view-event.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,KAAK,aAAa,CAAC,SAAS,SAAS,MAAM,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAC5F,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC;AAEtB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,QAwC/G"}
@@ -0,0 +1,72 @@
1
+ import type { WebView, WebViewMessageEvent } from 'react-native-webview';
2
+ import type { Mappedin } from '../types';
3
+ import type { MapViewControl } from '../controls/map-view-control';
4
+ import type { EventControl } from '../controls/event-control';
5
+ import type { PubSub } from '@mappedin/mappedin-js';
6
+ import type { BaseExtensionState, ExtensionRegistry, ExtensionsObject } from '../extension-registry';
7
+ import type { useBridge } from './use-bridge';
8
+ interface WebViewMessageEventPayload {
9
+ 'webview-message-received': WebViewMessageEvent;
10
+ }
11
+ export declare const MappedinContext: import("react").Context<{
12
+ mapData?: Mappedin.MapData;
13
+ mapView?: MapViewControl;
14
+ /**
15
+ * Event control system for managing event callbacks.
16
+ * @internal
17
+ */
18
+ _events?: EventControl;
19
+ /**
20
+ * Container instance for bridge communication (WebView on native, HTMLIFrameElement on web).
21
+ * @internal
22
+ */
23
+ _webView?: WebView | HTMLIFrameElement | null;
24
+ /**
25
+ * PubSub instance for WebView message events.
26
+ * @internal
27
+ */
28
+ _webViewMessagePubSub?: PubSub<WebViewMessageEventPayload>;
29
+ bridge?: ReturnType<typeof useBridge>;
30
+ /**
31
+ * Extension state storage for various extensions.
32
+ * Each extension can store its own state here.
33
+ */
34
+ extensions: ExtensionsObject;
35
+ /**
36
+ * Function to update extension state.
37
+ * @param name - The extension name (must be a registered extension)
38
+ * @param stateOrUpdater - Either the new state directly, or a callback function that receives the previous state and returns the new state
39
+ */
40
+ updateExtensionState: keyof ExtensionRegistry extends never ? (name: string, stateOrUpdater: BaseExtensionState | ((prevState: BaseExtensionState) => BaseExtensionState)) => void : <K extends keyof ExtensionRegistry>(name: K, stateOrUpdater: Partial<ExtensionRegistry[K]> | ((prevState: ExtensionRegistry[K]) => Partial<ExtensionRegistry[K]>)) => void;
41
+ }>;
42
+ /**
43
+ * Hook to get the MapData and MapView instances from the MapView context.
44
+ *
45
+ * This hook provides access to the mapData and mapView instances that are
46
+ * created and managed by the MapView component. It ensures that the hook
47
+ * is used within a MapView component context.
48
+ *
49
+ * @throws {MapViewNullError} When used outside of a MapView component or when mapData/mapView are not yet initialized
50
+ *
51
+ * @returns Object containing mapData and mapView instances
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * function MyMapComponent() {
56
+ * const { mapData, mapView } = useMap();
57
+ *
58
+ * useEffect(() => {
59
+ * // Use mapView to interact with the map
60
+ * mapView.Camera.animateTo({ center: mapData.getByType('space')[0] });
61
+ * }, [mapData, mapView]);
62
+ *
63
+ * return <Text>Map is ready!</Text>;
64
+ * }
65
+ * ```
66
+ */
67
+ export declare function useMap(): {
68
+ mapData: Mappedin.MapData;
69
+ mapView: MapViewControl;
70
+ };
71
+ export {};
72
+ //# sourceMappingURL=use-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-map.d.ts","sourceRoot":"","sources":["../../src/hooks/use-map.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,UAAU,0BAA0B;IACnC,0BAA0B,EAAE,mBAAmB,CAAC;CAChD;AAGD,eAAO,MAAM,eAAe;cACjB,QAAQ,CAAC,OAAO;cAChB,cAAc;IACxB;;;OAGG;cACO,YAAY;IACtB;;;OAGG;eACQ,OAAO,GAAG,iBAAiB,GAAG,IAAI;IAC7C;;;OAGG;4BACqB,MAAM,CAAC,0BAA0B,CAAC;aACjD,UAAU,CAAC,OAAO,SAAS,CAAC;IACrC;;;OAGG;gBACS,gBAAgB;IAC5B;;;;OAIG;0BACmB,MAAM,iBAAiB,SAAS,KAAK,GACxD,CACA,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,kBAAkB,GAAG,CAAC,CAAC,SAAS,EAAE,kBAAkB,KAAK,kBAAkB,CAAC,KACvF,IAAI,GACT,CAAC,CAAC,SAAS,MAAM,iBAAiB,EAClC,IAAI,EAAE,CAAC,EACP,cAAc,EACX,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAC7B,CAAC,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,KAClE,IAAI;EAYX,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,MAAM,IAAI;IACzB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;CACxB,CAQA"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ export { MapView } from './map-view';
2
+ export type { MapViewProps } from './map-view';
3
+ export { useMap, MappedinContext } from './hooks/use-map';
4
+ export type { MapViewControl, Promisify, PromisifiedUpdateState } from './controls/map-view-control';
5
+ export type { ExtensionRegistry } from './extension-registry';
6
+ export { useMapViewEvent } from './hooks/use-map-view-event';
7
+ export { useEventCallback } from './hooks/use-event-callback';
8
+ export type { UseEventCallbackOptions } from './hooks/use-event-callback';
9
+ export { Marker } from './components/marker';
10
+ export type { MarkerProps } from './components/marker';
11
+ export { Label } from './components/label';
12
+ export type { LabelProps } from './components/label';
13
+ export { Path } from './components/path';
14
+ export type { PathProps } from './components/path';
15
+ export { Shape } from './components/shape';
16
+ export type { ShapeProps } from './components/shape';
17
+ export type { Navigation } from './controls/map-view-control';
18
+ export { Model } from './components/model';
19
+ export type { ModelProps } from './components/model';
20
+ export { setLoggerLevel } from './utils';
21
+ export { createEventSetupScript, createEventCleanupScript } from './utils/extension-event-scripts';
22
+ export type { EventScriptOptions } from './utils/extension-event-scripts';
23
+ import type { hydrateMapData as HydrateMapData, unzipAndParseMVFv2 as UnzipAndParseMVFv2 } from '@mappedin/mappedin-js';
24
+ export type { BaseExtensionState } from './extension-registry';
25
+ export { useBridge } from './hooks/use-bridge';
26
+ export { useRegisterExtension } from './hooks/extensions/use-register-extension';
27
+ export type { UseRegisterExtensionConfig, RegistrationState } from './hooks/extensions/use-register-extension';
28
+ export declare const hydrateMapData: typeof HydrateMapData;
29
+ export declare const unzipAndParseMVFv2: typeof UnzipAndParseMVFv2;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrG,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AACnG,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAM1E,OAAO,KAAK,EAAE,cAAc,IAAI,cAAc,EAAE,kBAAkB,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACxH,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,YAAY,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,2CAA2C,CAAC;AAE/G,eAAO,MAAM,cAAc,EAAE,OAAO,cAAgC,CAAC;AACrE,eAAO,MAAM,kBAAkB,EAAE,OAAO,kBAAwC,CAAC"}