@numerum-tech/yeriasdk 1.0.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/README.md +864 -0
- package/dist/core/action-grid-view.d.ts +57 -0
- package/dist/core/action-grid-view.d.ts.map +1 -0
- package/dist/core/action-grid-view.js +112 -0
- package/dist/core/action-grid-view.js.map +1 -0
- package/dist/core/action-list-view.d.ts +39 -0
- package/dist/core/action-list-view.d.ts.map +1 -0
- package/dist/core/action-list-view.js +77 -0
- package/dist/core/action-list-view.js.map +1 -0
- package/dist/core/base/base-action-view.d.ts +82 -0
- package/dist/core/base/base-action-view.d.ts.map +1 -0
- package/dist/core/base/base-action-view.js +143 -0
- package/dist/core/base/base-action-view.js.map +1 -0
- package/dist/core/base-view.d.ts +105 -0
- package/dist/core/base-view.d.ts.map +1 -0
- package/dist/core/base-view.js +426 -0
- package/dist/core/base-view.js.map +1 -0
- package/dist/core/card-view.d.ts +24 -0
- package/dist/core/card-view.d.ts.map +1 -0
- package/dist/core/card-view.js +127 -0
- package/dist/core/card-view.js.map +1 -0
- package/dist/core/carousel-view.d.ts +22 -0
- package/dist/core/carousel-view.d.ts.map +1 -0
- package/dist/core/carousel-view.js +99 -0
- package/dist/core/carousel-view.js.map +1 -0
- package/dist/core/form-view.d.ts +165 -0
- package/dist/core/form-view.d.ts.map +1 -0
- package/dist/core/form-view.js +365 -0
- package/dist/core/form-view.js.map +1 -0
- package/dist/core/jsonapp.d.ts +263 -0
- package/dist/core/jsonapp.d.ts.map +1 -0
- package/dist/core/jsonapp.js +528 -0
- package/dist/core/jsonapp.js.map +1 -0
- package/dist/core/key-store.d.ts +51 -0
- package/dist/core/key-store.d.ts.map +1 -0
- package/dist/core/key-store.js +138 -0
- package/dist/core/key-store.js.map +1 -0
- package/dist/core/map-view.d.ts +45 -0
- package/dist/core/map-view.d.ts.map +1 -0
- package/dist/core/map-view.js +318 -0
- package/dist/core/map-view.js.map +1 -0
- package/dist/core/media-view.d.ts +20 -0
- package/dist/core/media-view.d.ts.map +1 -0
- package/dist/core/media-view.js +75 -0
- package/dist/core/media-view.js.map +1 -0
- package/dist/core/message-view.d.ts +53 -0
- package/dist/core/message-view.d.ts.map +1 -0
- package/dist/core/message-view.js +109 -0
- package/dist/core/message-view.js.map +1 -0
- package/dist/core/notification.d.ts +17 -0
- package/dist/core/notification.d.ts.map +1 -0
- package/dist/core/notification.js +33 -0
- package/dist/core/notification.js.map +1 -0
- package/dist/core/qr-display-view.d.ts +32 -0
- package/dist/core/qr-display-view.d.ts.map +1 -0
- package/dist/core/qr-display-view.js +66 -0
- package/dist/core/qr-display-view.js.map +1 -0
- package/dist/core/qr-scan-view.d.ts +148 -0
- package/dist/core/qr-scan-view.d.ts.map +1 -0
- package/dist/core/qr-scan-view.js +259 -0
- package/dist/core/qr-scan-view.js.map +1 -0
- package/dist/core/reader-view.d.ts +73 -0
- package/dist/core/reader-view.d.ts.map +1 -0
- package/dist/core/reader-view.js +285 -0
- package/dist/core/reader-view.js.map +1 -0
- package/dist/core/timeline-view.d.ts +16 -0
- package/dist/core/timeline-view.d.ts.map +1 -0
- package/dist/core/timeline-view.js +68 -0
- package/dist/core/timeline-view.js.map +1 -0
- package/dist/errors/index.d.ts +276 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +431 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +103 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +576 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +48 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fileFormats.d.ts +52 -0
- package/dist/utils/fileFormats.d.ts.map +1 -0
- package/dist/utils/fileFormats.js +198 -0
- package/dist/utils/fileFormats.js.map +1 -0
- package/dist/utils/logger.d.ts +38 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +109 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validators.d.ts +48 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +445 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// YeriaKeyStore — provider-side helper for resolving the JWT `kid` header
|
|
3
|
+
// of inbound Yeria-issued user tokens.
|
|
4
|
+
//
|
|
5
|
+
// The store fetches keys from `GET /api/v1/public/registry/public-keys/{kid}`
|
|
6
|
+
// on demand, caches the result in memory, and only ever returns a PEM
|
|
7
|
+
// when the key is still trusted (state ∈ {active, rotating}). Expired /
|
|
8
|
+
// unknown keys are negatively cached so a flood of bad tokens does not
|
|
9
|
+
// hammer Yeria.
|
|
10
|
+
//
|
|
11
|
+
// Providers wire it into their own auth middleware:
|
|
12
|
+
//
|
|
13
|
+
// import { JsonApp, YeriaKeyStore } from '@numerum-tech/yeriasdk';
|
|
14
|
+
//
|
|
15
|
+
// const keys = new YeriaKeyStore({ baseUrl: process.env.YERIA_BASE_URL });
|
|
16
|
+
//
|
|
17
|
+
// const claims = await JsonApp.verifyUserTokenWithResolver(
|
|
18
|
+
// bearer,
|
|
19
|
+
// (kid) => keys.getByKid(kid),
|
|
20
|
+
// MY_SERVICE_ID
|
|
21
|
+
// );
|
|
22
|
+
//
|
|
23
|
+
// The SDK never reaches out to Yeria on its own — every network call
|
|
24
|
+
// flows through a fetch implementation the caller can swap (tests,
|
|
25
|
+
// non-Node runtimes).
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.YeriaKeyStore = void 0;
|
|
28
|
+
const DEFAULT_TTL_MS = 10 * 60 * 1000;
|
|
29
|
+
class YeriaKeyStore {
|
|
30
|
+
constructor(opts) {
|
|
31
|
+
this.cache = new Map();
|
|
32
|
+
if (!opts || !opts.baseUrl) {
|
|
33
|
+
throw new Error('YeriaKeyStore: baseUrl is required');
|
|
34
|
+
}
|
|
35
|
+
this.baseUrl = opts.baseUrl.replace(/\/+$/, '');
|
|
36
|
+
this.ttlMs = opts.ttlMs ?? DEFAULT_TTL_MS;
|
|
37
|
+
const f = opts.fetch ?? globalThis.fetch;
|
|
38
|
+
if (typeof f !== 'function') {
|
|
39
|
+
throw new Error('YeriaKeyStore: no fetch available — pass opts.fetch on Node < 18 or non-browser runtimes');
|
|
40
|
+
}
|
|
41
|
+
this.fetchImpl = f.bind(globalThis);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a kid to a PEM. Returns null when the key is expired or
|
|
45
|
+
* unknown — the caller should reject the inbound token in that case.
|
|
46
|
+
*/
|
|
47
|
+
async getByKid(kid) {
|
|
48
|
+
const lookup = await this.lookup(kid);
|
|
49
|
+
return lookup.publicKey;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolve a kid to its full trust state. Same network/cache behaviour
|
|
53
|
+
* as `getByKid` — exposed for callers that want to log / branch on
|
|
54
|
+
* the state.
|
|
55
|
+
*/
|
|
56
|
+
async getState(kid) {
|
|
57
|
+
const lookup = await this.lookup(kid);
|
|
58
|
+
return lookup.state;
|
|
59
|
+
}
|
|
60
|
+
/** Drop a single cache entry. Use after a verify failure to force a
|
|
61
|
+
* refetch on the retry — covers the case where Yeria rotated a key
|
|
62
|
+
* out from under our cache. */
|
|
63
|
+
invalidate(kid) {
|
|
64
|
+
this.cache.delete(kid);
|
|
65
|
+
}
|
|
66
|
+
/** Drop the entire cache. */
|
|
67
|
+
invalidateAll() {
|
|
68
|
+
this.cache.clear();
|
|
69
|
+
}
|
|
70
|
+
async lookup(kid) {
|
|
71
|
+
if (typeof kid !== 'string' || kid.length === 0) {
|
|
72
|
+
return { state: 'unknown', publicKey: null, expiresAt: null };
|
|
73
|
+
}
|
|
74
|
+
const now = Date.now();
|
|
75
|
+
const cached = this.cache.get(kid);
|
|
76
|
+
if (cached && cached.expiresAt > now) {
|
|
77
|
+
return cached.lookup;
|
|
78
|
+
}
|
|
79
|
+
const lookup = await this.fetchFromYeria(kid);
|
|
80
|
+
this.cache.set(kid, { lookup, expiresAt: now + this.ttlMs });
|
|
81
|
+
return lookup;
|
|
82
|
+
}
|
|
83
|
+
async fetchFromYeria(kid) {
|
|
84
|
+
const url = `${this.baseUrl}/api/v1/public/registry/public-keys/${encodeURIComponent(kid)}`;
|
|
85
|
+
let res;
|
|
86
|
+
try {
|
|
87
|
+
res = await this.fetchImpl(url, { method: 'GET' });
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
// Network failure — surface as `unknown` so the caller rejects
|
|
91
|
+
// the inbound token without caching the result for long.
|
|
92
|
+
// We still cache briefly (the TTL) to avoid hot-looping.
|
|
93
|
+
return { state: 'unknown', publicKey: null, expiresAt: null };
|
|
94
|
+
}
|
|
95
|
+
// Yeria returns 404 for unknown kid + 200 with state otherwise.
|
|
96
|
+
// The body shape is the same on success and on the 404 case
|
|
97
|
+
// (`{state, key_id, [public_key, ...]}`) wrapped in
|
|
98
|
+
// `{success, message, result}` by the platform's jsonSuccess /
|
|
99
|
+
// jsonFail helpers.
|
|
100
|
+
let body;
|
|
101
|
+
try {
|
|
102
|
+
body = await res.json();
|
|
103
|
+
}
|
|
104
|
+
catch (_e) {
|
|
105
|
+
return { state: 'unknown', publicKey: null, expiresAt: null };
|
|
106
|
+
}
|
|
107
|
+
const result = extractResult(body);
|
|
108
|
+
if (!result) {
|
|
109
|
+
return { state: 'unknown', publicKey: null, expiresAt: null };
|
|
110
|
+
}
|
|
111
|
+
const state = result['state'] || 'unknown';
|
|
112
|
+
if (state === 'active' || state === 'rotating') {
|
|
113
|
+
return {
|
|
114
|
+
state,
|
|
115
|
+
publicKey: typeof result['public_key'] === 'string' ? result['public_key'] : null,
|
|
116
|
+
expiresAt: typeof result['expires_at'] === 'string' ? result['expires_at'] : null,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { state, publicKey: null, expiresAt: null };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.YeriaKeyStore = YeriaKeyStore;
|
|
123
|
+
/** Extract `result` from a `{success, message, result}` envelope, or fall
|
|
124
|
+
* back to the top-level object when the platform returned a state-only
|
|
125
|
+
* body without the wrapper. */
|
|
126
|
+
function extractResult(body) {
|
|
127
|
+
if (!body || typeof body !== 'object')
|
|
128
|
+
return null;
|
|
129
|
+
const b = body;
|
|
130
|
+
if (b['result'] && typeof b['result'] === 'object') {
|
|
131
|
+
return b['result'];
|
|
132
|
+
}
|
|
133
|
+
// Some jsonFail paths return the result fields at the top level.
|
|
134
|
+
if (typeof b['state'] === 'string')
|
|
135
|
+
return b;
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=key-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key-store.js","sourceRoot":"","sources":["../../src/core/key-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BaseView } from './base-view';
|
|
2
|
+
import { GeoPoint, MapBasemap, MapContent, MapControls, MapLayer, MapMarker, MapPickConfig, MapShape, MapShapeStyle, MapViewport } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* MapView (v2) — see specs/map-view.md
|
|
5
|
+
*
|
|
6
|
+
* Wire format: a single data path, `content.layers[]`. Even one-marker views
|
|
7
|
+
* are described as `[{ type: 'markers', markers: [...] }]`.
|
|
8
|
+
*
|
|
9
|
+
* SDK ergonomics: `addMarker / addPolygon / addCircle / ...` are convenience
|
|
10
|
+
* methods that target either an implicit default layer (`_default_markers` or
|
|
11
|
+
* `_default_shapes`, auto-created on first call) or a named layer (passed as
|
|
12
|
+
* the optional final `layerId` argument). Named layers must be declared up
|
|
13
|
+
* front via `addLayer({...})`.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MapView extends BaseView {
|
|
16
|
+
static readonly DEFAULT_MARKERS_LAYER_ID = "_default_markers";
|
|
17
|
+
static readonly DEFAULT_SHAPES_LAYER_ID = "_default_shapes";
|
|
18
|
+
constructor(viewId: string, title: string, processId?: string);
|
|
19
|
+
setIntro(intro: string): this;
|
|
20
|
+
setBasemap(name: MapBasemap): this;
|
|
21
|
+
setViewport(viewport: MapViewport): this;
|
|
22
|
+
setControls(controls: MapControls): this;
|
|
23
|
+
setEmptyMessage(text: string): this;
|
|
24
|
+
setPickMode(config: MapPickConfig): this;
|
|
25
|
+
addLayer(layer: MapLayer): this;
|
|
26
|
+
setLayers(layers: MapLayer[]): this;
|
|
27
|
+
clearLayers(): this;
|
|
28
|
+
getLayer(id: string): MapLayer | undefined;
|
|
29
|
+
addMarker(marker: MapMarker, layerId?: string): this;
|
|
30
|
+
addMarkers(markers: MapMarker[], layerId?: string): this;
|
|
31
|
+
clearMarkers(layerId?: string): this;
|
|
32
|
+
addShape(shape: MapShape, layerId?: string): this;
|
|
33
|
+
addPolygon(id: string, points: GeoPoint[], config?: MapShapeStyle, layerId?: string): this;
|
|
34
|
+
addCircle(id: string, center: GeoPoint, radius: number, config?: MapShapeStyle, layerId?: string): this;
|
|
35
|
+
addPolyline(id: string, points: GeoPoint[], config?: MapShapeStyle, layerId?: string): this;
|
|
36
|
+
addRectangle(id: string, sw: GeoPoint, ne: GeoPoint, config?: MapShapeStyle, layerId?: string): this;
|
|
37
|
+
clearShapes(layerId?: string): this;
|
|
38
|
+
getContent(): MapContent;
|
|
39
|
+
private resolveOrCreateMarkersLayer;
|
|
40
|
+
private resolveOrCreateShapesLayer;
|
|
41
|
+
private validateGeoPoint;
|
|
42
|
+
private validateShape;
|
|
43
|
+
private validateViewport;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=map-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-view.d.ts","sourceRoot":"","sources":["../../src/core/map-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACH,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,aAAa,EACb,QAAQ,EACR,aAAa,EACb,WAAW,EAGd,MAAM,UAAU,CAAC;AAWlB;;;;;;;;;;;GAWG;AACH,qBAAa,OAAQ,SAAQ,QAAQ;IACjC,gBAAuB,wBAAwB,sBAAsB;IACrE,gBAAuB,uBAAuB,qBAAsB;gBAExD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAoB7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKlC,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMxC,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAKxC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKnC,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAmBxC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAiB/B,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI;IASnC,WAAW,IAAI,IAAI;IAKnB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAM1C,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBpD,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAQxD,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAapC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAcjD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1F,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvG,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3F,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAIpG,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAWnC,UAAU,IAAI,UAAU;IAMxB,OAAO,CAAC,2BAA2B;IA2BnC,OAAO,CAAC,0BAA0B;IA2BlC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,aAAa;IA2CrB,OAAO,CAAC,gBAAgB;CA4B3B"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MapView = void 0;
|
|
4
|
+
const base_view_1 = require("./base-view");
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
/**
|
|
7
|
+
* MapView (v2) — see specs/map-view.md
|
|
8
|
+
*
|
|
9
|
+
* Wire format: a single data path, `content.layers[]`. Even one-marker views
|
|
10
|
+
* are described as `[{ type: 'markers', markers: [...] }]`.
|
|
11
|
+
*
|
|
12
|
+
* SDK ergonomics: `addMarker / addPolygon / addCircle / ...` are convenience
|
|
13
|
+
* methods that target either an implicit default layer (`_default_markers` or
|
|
14
|
+
* `_default_shapes`, auto-created on first call) or a named layer (passed as
|
|
15
|
+
* the optional final `layerId` argument). Named layers must be declared up
|
|
16
|
+
* front via `addLayer({...})`.
|
|
17
|
+
*/
|
|
18
|
+
class MapView extends base_view_1.BaseView {
|
|
19
|
+
constructor(viewId, title, processId) {
|
|
20
|
+
super({
|
|
21
|
+
id: viewId,
|
|
22
|
+
type: 'Map',
|
|
23
|
+
processId,
|
|
24
|
+
metadata: {
|
|
25
|
+
version: '2.0.0',
|
|
26
|
+
createdAt: new Date()
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
this.content = {
|
|
30
|
+
title,
|
|
31
|
+
layers: [],
|
|
32
|
+
controls: { zoom: true, compass: true, userLocation: false }
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ─── view-level setters ─────────────────────────────────────────────
|
|
36
|
+
setIntro(intro) {
|
|
37
|
+
return this.setIntroText('intro', intro);
|
|
38
|
+
}
|
|
39
|
+
setBasemap(name) {
|
|
40
|
+
this.content.basemap = name;
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
setViewport(viewport) {
|
|
44
|
+
this.validateViewport(viewport);
|
|
45
|
+
this.content.viewport = { ...viewport };
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
setControls(controls) {
|
|
49
|
+
this.content.controls = { ...controls };
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
setEmptyMessage(text) {
|
|
53
|
+
this.content.emptyMessage = text;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
setPickMode(config) {
|
|
57
|
+
if (!config || typeof config.submitUrl !== 'string' || !config.submitUrl.trim()) {
|
|
58
|
+
throw new errors_1.MissingRequiredParameterError('pick.submitUrl');
|
|
59
|
+
}
|
|
60
|
+
if (config.initialLocation) {
|
|
61
|
+
this.validateGeoPoint(config.initialLocation, 'pick.initialLocation');
|
|
62
|
+
}
|
|
63
|
+
if (config.bounds) {
|
|
64
|
+
this.validateGeoPoint(config.bounds.sw, 'pick.bounds.sw');
|
|
65
|
+
this.validateGeoPoint(config.bounds.ne, 'pick.bounds.ne');
|
|
66
|
+
}
|
|
67
|
+
const content = this.content;
|
|
68
|
+
content.mode = 'pick';
|
|
69
|
+
content.pick = { ...config };
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
// ─── layer management ───────────────────────────────────────────────
|
|
73
|
+
addLayer(layer) {
|
|
74
|
+
if (!layer || typeof layer !== 'object') {
|
|
75
|
+
throw new errors_1.MissingRequiredParameterError('layer');
|
|
76
|
+
}
|
|
77
|
+
if (typeof layer.id !== 'string' || !layer.id.trim()) {
|
|
78
|
+
throw new errors_1.MissingRequiredParameterError('layer.id');
|
|
79
|
+
}
|
|
80
|
+
const content = this.content;
|
|
81
|
+
if (content.layers.some(l => l.id === layer.id)) {
|
|
82
|
+
throw new errors_1.DuplicateLayerIdError(layer.id);
|
|
83
|
+
}
|
|
84
|
+
// Shallow copy so callers can't mutate the layer payload after the fact.
|
|
85
|
+
const copy = { ...layer };
|
|
86
|
+
content.layers.push(copy);
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
setLayers(layers) {
|
|
90
|
+
if (!Array.isArray(layers)) {
|
|
91
|
+
throw new errors_1.InvalidParameterError('layers', layers, 'must be an array');
|
|
92
|
+
}
|
|
93
|
+
this.content.layers = [];
|
|
94
|
+
for (const l of layers)
|
|
95
|
+
this.addLayer(l);
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
clearLayers() {
|
|
99
|
+
this.content.layers = [];
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
getLayer(id) {
|
|
103
|
+
return this.content.layers.find(l => l.id === id);
|
|
104
|
+
}
|
|
105
|
+
// ─── markers (default layer or named target) ────────────────────────
|
|
106
|
+
addMarker(marker, layerId) {
|
|
107
|
+
if (!marker || typeof marker !== 'object') {
|
|
108
|
+
throw new errors_1.MissingRequiredParameterError('marker');
|
|
109
|
+
}
|
|
110
|
+
if (typeof marker.id !== 'string' || !marker.id.trim()) {
|
|
111
|
+
throw new errors_1.MissingRequiredParameterError('marker.id');
|
|
112
|
+
}
|
|
113
|
+
this.validateGeoPoint(marker.location, `marker "${marker.id}".location`);
|
|
114
|
+
const layer = this.resolveOrCreateMarkersLayer(layerId);
|
|
115
|
+
layer.markers.push({
|
|
116
|
+
...marker,
|
|
117
|
+
id: marker.id.trim(),
|
|
118
|
+
title: marker.title?.trim(),
|
|
119
|
+
description: marker.description?.trim()
|
|
120
|
+
});
|
|
121
|
+
return this;
|
|
122
|
+
}
|
|
123
|
+
addMarkers(markers, layerId) {
|
|
124
|
+
if (!Array.isArray(markers)) {
|
|
125
|
+
throw new errors_1.InvalidParameterError('markers', markers, 'must be an array');
|
|
126
|
+
}
|
|
127
|
+
for (const m of markers)
|
|
128
|
+
this.addMarker(m, layerId);
|
|
129
|
+
return this;
|
|
130
|
+
}
|
|
131
|
+
clearMarkers(layerId) {
|
|
132
|
+
const target = layerId ?? MapView.DEFAULT_MARKERS_LAYER_ID;
|
|
133
|
+
const layer = this.getLayer(target);
|
|
134
|
+
if (!layer)
|
|
135
|
+
return this;
|
|
136
|
+
if (layer.type !== 'markers') {
|
|
137
|
+
throw new errors_1.LayerTypeMismatchError(target, 'markers', layer.type);
|
|
138
|
+
}
|
|
139
|
+
layer.markers = [];
|
|
140
|
+
return this;
|
|
141
|
+
}
|
|
142
|
+
// ─── shapes (default layer or named target) ─────────────────────────
|
|
143
|
+
addShape(shape, layerId) {
|
|
144
|
+
if (!shape || typeof shape !== 'object') {
|
|
145
|
+
throw new errors_1.MissingRequiredParameterError('shape');
|
|
146
|
+
}
|
|
147
|
+
if (typeof shape.id !== 'string' || !shape.id.trim()) {
|
|
148
|
+
throw new errors_1.MissingRequiredParameterError('shape.id');
|
|
149
|
+
}
|
|
150
|
+
this.validateShape(shape);
|
|
151
|
+
const layer = this.resolveOrCreateShapesLayer(layerId);
|
|
152
|
+
layer.shapes.push({ ...shape, id: shape.id.trim() });
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
addPolygon(id, points, config, layerId) {
|
|
156
|
+
return this.addShape({ id, type: 'Polygon', points, config }, layerId);
|
|
157
|
+
}
|
|
158
|
+
addCircle(id, center, radius, config, layerId) {
|
|
159
|
+
return this.addShape({ id, type: 'Circle', center, radius, config }, layerId);
|
|
160
|
+
}
|
|
161
|
+
addPolyline(id, points, config, layerId) {
|
|
162
|
+
return this.addShape({ id, type: 'Polyline', points, config }, layerId);
|
|
163
|
+
}
|
|
164
|
+
addRectangle(id, sw, ne, config, layerId) {
|
|
165
|
+
return this.addShape({ id, type: 'Rectangle', sw, ne, config }, layerId);
|
|
166
|
+
}
|
|
167
|
+
clearShapes(layerId) {
|
|
168
|
+
const target = layerId ?? MapView.DEFAULT_SHAPES_LAYER_ID;
|
|
169
|
+
const layer = this.getLayer(target);
|
|
170
|
+
if (!layer)
|
|
171
|
+
return this;
|
|
172
|
+
if (layer.type !== 'shapes') {
|
|
173
|
+
throw new errors_1.LayerTypeMismatchError(target, 'shapes', layer.type);
|
|
174
|
+
}
|
|
175
|
+
layer.shapes = [];
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
getContent() {
|
|
179
|
+
return this.content;
|
|
180
|
+
}
|
|
181
|
+
// ─── private helpers ────────────────────────────────────────────────
|
|
182
|
+
resolveOrCreateMarkersLayer(layerId) {
|
|
183
|
+
const content = this.content;
|
|
184
|
+
if (layerId) {
|
|
185
|
+
const layer = content.layers.find(l => l.id === layerId);
|
|
186
|
+
if (!layer)
|
|
187
|
+
throw new errors_1.LayerNotFoundError(layerId);
|
|
188
|
+
if (layer.type !== 'markers') {
|
|
189
|
+
throw new errors_1.LayerTypeMismatchError(layerId, 'markers', layer.type);
|
|
190
|
+
}
|
|
191
|
+
return layer;
|
|
192
|
+
}
|
|
193
|
+
let def = content.layers.find(l => l.id === MapView.DEFAULT_MARKERS_LAYER_ID);
|
|
194
|
+
if (!def) {
|
|
195
|
+
const created = {
|
|
196
|
+
id: MapView.DEFAULT_MARKERS_LAYER_ID,
|
|
197
|
+
type: 'markers',
|
|
198
|
+
markers: [],
|
|
199
|
+
toggleable: false
|
|
200
|
+
};
|
|
201
|
+
content.layers.push(created);
|
|
202
|
+
return created;
|
|
203
|
+
}
|
|
204
|
+
if (def.type !== 'markers') {
|
|
205
|
+
throw new errors_1.LayerTypeMismatchError(def.id, 'markers', def.type);
|
|
206
|
+
}
|
|
207
|
+
return def;
|
|
208
|
+
}
|
|
209
|
+
resolveOrCreateShapesLayer(layerId) {
|
|
210
|
+
const content = this.content;
|
|
211
|
+
if (layerId) {
|
|
212
|
+
const layer = content.layers.find(l => l.id === layerId);
|
|
213
|
+
if (!layer)
|
|
214
|
+
throw new errors_1.LayerNotFoundError(layerId);
|
|
215
|
+
if (layer.type !== 'shapes') {
|
|
216
|
+
throw new errors_1.LayerTypeMismatchError(layerId, 'shapes', layer.type);
|
|
217
|
+
}
|
|
218
|
+
return layer;
|
|
219
|
+
}
|
|
220
|
+
let def = content.layers.find(l => l.id === MapView.DEFAULT_SHAPES_LAYER_ID);
|
|
221
|
+
if (!def) {
|
|
222
|
+
const created = {
|
|
223
|
+
id: MapView.DEFAULT_SHAPES_LAYER_ID,
|
|
224
|
+
type: 'shapes',
|
|
225
|
+
shapes: [],
|
|
226
|
+
toggleable: false
|
|
227
|
+
};
|
|
228
|
+
content.layers.push(created);
|
|
229
|
+
return created;
|
|
230
|
+
}
|
|
231
|
+
if (def.type !== 'shapes') {
|
|
232
|
+
throw new errors_1.LayerTypeMismatchError(def.id, 'shapes', def.type);
|
|
233
|
+
}
|
|
234
|
+
return def;
|
|
235
|
+
}
|
|
236
|
+
validateGeoPoint(p, ctx) {
|
|
237
|
+
if (!p || typeof p !== 'object') {
|
|
238
|
+
throw new errors_1.InvalidGeoPointError(p, `${ctx}: location is required`);
|
|
239
|
+
}
|
|
240
|
+
if (typeof p.lat !== 'number' || p.lat < -90 || p.lat > 90) {
|
|
241
|
+
throw new errors_1.InvalidGeoPointError(p, `${ctx}: lat must be a number in [-90, 90]`);
|
|
242
|
+
}
|
|
243
|
+
if (typeof p.lon !== 'number' || p.lon < -180 || p.lon > 180) {
|
|
244
|
+
throw new errors_1.InvalidGeoPointError(p, `${ctx}: lon must be a number in [-180, 180]`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
validateShape(s) {
|
|
248
|
+
switch (s.type) {
|
|
249
|
+
case 'Polygon': {
|
|
250
|
+
if (!Array.isArray(s.points) || s.points.length < 3) {
|
|
251
|
+
throw new errors_1.InvalidParameterError('points', s.points, 'Polygon requires at least 3 points');
|
|
252
|
+
}
|
|
253
|
+
s.points.forEach((p, i) => this.validateGeoPoint(p, `Polygon "${s.id}" points[${i}]`));
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
case 'Polyline': {
|
|
257
|
+
if (!Array.isArray(s.points) || s.points.length < 2) {
|
|
258
|
+
throw new errors_1.InvalidParameterError('points', s.points, 'Polyline requires at least 2 points');
|
|
259
|
+
}
|
|
260
|
+
s.points.forEach((p, i) => this.validateGeoPoint(p, `Polyline "${s.id}" points[${i}]`));
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
case 'Circle': {
|
|
264
|
+
this.validateGeoPoint(s.center, `Circle "${s.id}" center`);
|
|
265
|
+
if (typeof s.radius !== 'number' || s.radius <= 0) {
|
|
266
|
+
throw new errors_1.InvalidParameterError('radius', s.radius, 'Circle radius must be > 0 (meters)');
|
|
267
|
+
}
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
case 'Rectangle': {
|
|
271
|
+
this.validateGeoPoint(s.sw, `Rectangle "${s.id}" sw`);
|
|
272
|
+
this.validateGeoPoint(s.ne, `Rectangle "${s.id}" ne`);
|
|
273
|
+
if (s.sw.lat > s.ne.lat || s.sw.lon > s.ne.lon) {
|
|
274
|
+
throw new errors_1.InvalidParameterError('sw,ne', { sw: s.sw, ne: s.ne }, 'Rectangle sw must be south-west of ne (sw.lat <= ne.lat and sw.lon <= ne.lon)');
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
default: {
|
|
279
|
+
// exhaustiveness guard — TypeScript will flag if a new shape type is added
|
|
280
|
+
const _exhaustive = s;
|
|
281
|
+
throw new errors_1.InvalidParameterError('shape.type', _exhaustive.type, 'unknown shape type');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
validateViewport(v) {
|
|
286
|
+
if (v.center)
|
|
287
|
+
this.validateGeoPoint(v.center, 'viewport.center');
|
|
288
|
+
if (v.bounds) {
|
|
289
|
+
this.validateGeoPoint(v.bounds.sw, 'viewport.bounds.sw');
|
|
290
|
+
this.validateGeoPoint(v.bounds.ne, 'viewport.bounds.ne');
|
|
291
|
+
if (v.bounds.sw.lat > v.bounds.ne.lat || v.bounds.sw.lon > v.bounds.ne.lon) {
|
|
292
|
+
throw new errors_1.InvalidViewportError('viewport.bounds.sw must be south-west of bounds.ne');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (v.zoom !== undefined && (v.zoom < 0 || v.zoom > 22)) {
|
|
296
|
+
throw new errors_1.InvalidViewportError('zoom must be in [0, 22]');
|
|
297
|
+
}
|
|
298
|
+
if (v.minZoom !== undefined && (v.minZoom < 0 || v.minZoom > 22)) {
|
|
299
|
+
throw new errors_1.InvalidViewportError('minZoom must be in [0, 22]');
|
|
300
|
+
}
|
|
301
|
+
if (v.maxZoom !== undefined && (v.maxZoom < 0 || v.maxZoom > 22)) {
|
|
302
|
+
throw new errors_1.InvalidViewportError('maxZoom must be in [0, 22]');
|
|
303
|
+
}
|
|
304
|
+
if (v.minZoom !== undefined && v.maxZoom !== undefined && v.minZoom > v.maxZoom) {
|
|
305
|
+
throw new errors_1.InvalidViewportError('minZoom must be <= maxZoom');
|
|
306
|
+
}
|
|
307
|
+
if (v.bearing !== undefined && (v.bearing < 0 || v.bearing >= 360)) {
|
|
308
|
+
throw new errors_1.InvalidViewportError('bearing must be in [0, 360)');
|
|
309
|
+
}
|
|
310
|
+
if (v.pitch !== undefined && (v.pitch < 0 || v.pitch > 60)) {
|
|
311
|
+
throw new errors_1.InvalidViewportError('pitch must be in [0, 60]');
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
exports.MapView = MapView;
|
|
316
|
+
MapView.DEFAULT_MARKERS_LAYER_ID = '_default_markers';
|
|
317
|
+
MapView.DEFAULT_SHAPES_LAYER_ID = '_default_shapes';
|
|
318
|
+
//# sourceMappingURL=map-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-view.js","sourceRoot":"","sources":["../../src/core/map-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseView } from './base-view';
|
|
2
|
+
import { MediaContent, MediaItem, MediaKind } from '../types';
|
|
3
|
+
export declare class MediaView extends BaseView {
|
|
4
|
+
constructor(viewId: string, title: string, processId?: string);
|
|
5
|
+
setIntro(intro: string): this;
|
|
6
|
+
addMediaItem(item: MediaItem): this;
|
|
7
|
+
createMedia(id: string, kind: MediaKind, src: string, options?: {
|
|
8
|
+
type?: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
poster?: string;
|
|
12
|
+
autoplay?: boolean;
|
|
13
|
+
loop?: boolean;
|
|
14
|
+
controls?: boolean;
|
|
15
|
+
}): MediaItem;
|
|
16
|
+
clearItems(): this;
|
|
17
|
+
getContent(): MediaContent;
|
|
18
|
+
private normalizeSource;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=media-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-view.d.ts","sourceRoot":"","sources":["../../src/core/media-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAe,MAAM,UAAU,CAAC;AAI3E,qBAAa,SAAU,SAAQ,QAAQ;gBACvB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAmB7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAgBnC,WAAW,CACP,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAC/I,SAAS;IAgBZ,UAAU,IAAI,IAAI;IAMlB,UAAU,IAAI,YAAY;IAI1B,OAAO,CAAC,eAAe;CAW1B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MediaView = void 0;
|
|
4
|
+
const base_view_1 = require("./base-view");
|
|
5
|
+
// MediaView groups audio and video resources in a consistent playlist for mobile playback.
|
|
6
|
+
class MediaView extends base_view_1.BaseView {
|
|
7
|
+
constructor(viewId, title, processId) {
|
|
8
|
+
super({
|
|
9
|
+
id: viewId,
|
|
10
|
+
type: 'Media',
|
|
11
|
+
processId,
|
|
12
|
+
metadata: {
|
|
13
|
+
version: '1.0.0',
|
|
14
|
+
createdAt: new Date()
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
this.content = {
|
|
18
|
+
title,
|
|
19
|
+
intro: '',
|
|
20
|
+
items: []
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Optional lead text for the media playlist section.
|
|
24
|
+
setIntro(intro) {
|
|
25
|
+
return this.setIntroText('intro', intro);
|
|
26
|
+
}
|
|
27
|
+
// Registers a ready-to-play media entry.
|
|
28
|
+
addMediaItem(item) {
|
|
29
|
+
if (!item.id || !item.kind || !item.sources || item.sources.length === 0) {
|
|
30
|
+
throw new Error('Media item requires an id, type, and at least one source');
|
|
31
|
+
}
|
|
32
|
+
this.content.items.push({
|
|
33
|
+
...item,
|
|
34
|
+
id: item.id.trim(),
|
|
35
|
+
title: item.title?.trim(),
|
|
36
|
+
description: item.description?.trim(),
|
|
37
|
+
sources: item.sources.map(source => this.normalizeSource(source))
|
|
38
|
+
});
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
createMedia(id, kind, src, options = {}) {
|
|
42
|
+
const primarySource = this.normalizeSource({ src, type: options.type });
|
|
43
|
+
return {
|
|
44
|
+
id: id.trim(),
|
|
45
|
+
kind,
|
|
46
|
+
title: options.title?.trim(),
|
|
47
|
+
description: options.description?.trim(),
|
|
48
|
+
poster: options.poster?.trim(),
|
|
49
|
+
autoplay: options.autoplay,
|
|
50
|
+
loop: options.loop,
|
|
51
|
+
controls: options.controls ?? true,
|
|
52
|
+
sources: [primarySource]
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
clearItems() {
|
|
56
|
+
this.content.items = [];
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
// Helper to inspect the assembled playlist.
|
|
60
|
+
getContent() {
|
|
61
|
+
return this.content;
|
|
62
|
+
}
|
|
63
|
+
normalizeSource(source) {
|
|
64
|
+
const trimmedSrc = source.src.trim();
|
|
65
|
+
if (!trimmedSrc) {
|
|
66
|
+
throw new Error('Media source src cannot be empty');
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
src: trimmedSrc,
|
|
70
|
+
type: source.type?.trim()
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.MediaView = MediaView;
|
|
75
|
+
//# sourceMappingURL=media-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-view.js","sourceRoot":"","sources":["../../src/core/media-view.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AAGvC,2FAA2F;AAE3F,MAAa,SAAU,SAAQ,oBAAQ;IACnC,YAAY,MAAc,EAAE,KAAa,EAAE,SAAkB;QACzD,KAAK,CAAC;YACF,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,OAAO;YACb,SAAS;YACT,QAAQ,EAAE;gBACN,OAAO,EAAE,OAAO;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE;aACxB;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG;YACX,KAAK;YACL,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACI,CAAC;IACtB,CAAC;IAED,qDAAqD;IACrD,QAAQ,CAAC,KAAa;QAClB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,yCAAyC;IACzC,YAAY,CAAC,IAAe;QACxB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAChF,CAAC;QAEA,IAAI,CAAC,OAAwB,CAAC,KAAK,CAAC,IAAI,CAAC;YACtC,GAAG,IAAI;YACP,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;SACpE,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,WAAW,CACP,EAAU,EACV,IAAe,EACf,GAAW,EACX,UAA4I,EAAE;QAE9I,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAExE,OAAO;YACH,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE;YACb,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE;YACxC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE;YAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;YAClC,OAAO,EAAE,CAAC,aAAa,CAAC;SAC3B,CAAC;IACN,CAAC;IAED,UAAU;QACL,IAAI,CAAC,OAAwB,CAAC,KAAK,GAAG,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,4CAA4C;IAC5C,UAAU;QACN,OAAO,IAAI,CAAC,OAAuB,CAAC;IACxC,CAAC;IAEO,eAAe,CAAC,MAAmB;QACvC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO;YACH,GAAG,EAAE,UAAU;YACf,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE;SAC5B,CAAC;IACN,CAAC;CACJ;AAnFD,8BAmFC"}
|