ehbp 0.0.3 → 0.0.4

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 (69) hide show
  1. package/dist/cjs/client.d.ts +51 -0
  2. package/dist/cjs/client.d.ts.map +1 -0
  3. package/dist/cjs/client.js +160 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/identity.d.ts +52 -0
  6. package/dist/cjs/identity.d.ts.map +1 -0
  7. package/dist/cjs/identity.js +274 -0
  8. package/dist/cjs/identity.js.map +1 -0
  9. package/{src/index.ts → dist/cjs/index.d.ts} +2 -4
  10. package/dist/cjs/index.d.ts.map +1 -0
  11. package/dist/cjs/index.js +19 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/package.json +1 -0
  14. package/dist/cjs/protocol.d.ts +19 -0
  15. package/dist/cjs/protocol.d.ts.map +1 -0
  16. package/dist/cjs/protocol.js +22 -0
  17. package/dist/cjs/protocol.js.map +1 -0
  18. package/dist/esm/client.d.ts +51 -0
  19. package/dist/esm/client.d.ts.map +1 -0
  20. package/dist/esm/client.js +155 -0
  21. package/dist/esm/client.js.map +1 -0
  22. package/dist/esm/example.d.ts +6 -0
  23. package/dist/esm/example.d.ts.map +1 -0
  24. package/dist/esm/example.js +115 -0
  25. package/dist/esm/example.js.map +1 -0
  26. package/dist/esm/identity.d.ts +52 -0
  27. package/dist/esm/identity.d.ts.map +1 -0
  28. package/dist/esm/identity.js +270 -0
  29. package/dist/esm/identity.js.map +1 -0
  30. package/dist/esm/index.d.ts +12 -0
  31. package/dist/esm/index.d.ts.map +1 -0
  32. package/dist/esm/index.js +11 -0
  33. package/dist/esm/index.js.map +1 -0
  34. package/dist/esm/package.json +1 -0
  35. package/dist/esm/protocol.d.ts +19 -0
  36. package/dist/esm/protocol.d.ts.map +1 -0
  37. package/dist/esm/protocol.js +19 -0
  38. package/dist/esm/protocol.js.map +1 -0
  39. package/dist/esm/streaming-test.d.ts +3 -0
  40. package/dist/esm/streaming-test.d.ts.map +1 -0
  41. package/dist/esm/streaming-test.js +102 -0
  42. package/dist/esm/streaming-test.js.map +1 -0
  43. package/dist/esm/test/client.test.d.ts +2 -0
  44. package/dist/esm/test/client.test.d.ts.map +1 -0
  45. package/dist/esm/test/client.test.js +71 -0
  46. package/dist/esm/test/client.test.js.map +1 -0
  47. package/dist/esm/test/identity.test.d.ts +2 -0
  48. package/dist/esm/test/identity.test.d.ts.map +1 -0
  49. package/dist/esm/test/identity.test.js +39 -0
  50. package/dist/esm/test/identity.test.js.map +1 -0
  51. package/dist/esm/test/streaming.test.d.ts +2 -0
  52. package/dist/esm/test/streaming.test.d.ts.map +1 -0
  53. package/dist/esm/test/streaming.test.js +71 -0
  54. package/dist/esm/test/streaming.test.js.map +1 -0
  55. package/package.json +7 -2
  56. package/build-browser.js +0 -54
  57. package/chat.html +0 -285
  58. package/src/client.ts +0 -181
  59. package/src/example.ts +0 -126
  60. package/src/identity.ts +0 -339
  61. package/src/protocol.ts +0 -19
  62. package/src/streaming-test.ts +0 -118
  63. package/src/test/client.test.ts +0 -93
  64. package/src/test/identity.test.ts +0 -46
  65. package/src/test/streaming.test.ts +0 -85
  66. package/test.html +0 -271
  67. package/tsconfig.cjs.json +0 -8
  68. package/tsconfig.esm.json +0 -7
  69. package/tsconfig.json +0 -19
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HPKE_CONFIG = exports.PROTOCOL = void 0;
4
+ /**
5
+ * Protocol constants for EHBP (Encrypted HTTP Body Protocol)
6
+ */
7
+ exports.PROTOCOL = {
8
+ ENCAPSULATED_KEY_HEADER: 'Ehbp-Encapsulated-Key',
9
+ CLIENT_PUBLIC_KEY_HEADER: 'Ehbp-Client-Public-Key',
10
+ KEYS_MEDIA_TYPE: 'application/ohttp-keys',
11
+ KEYS_PATH: '/.well-known/hpke-keys',
12
+ FALLBACK_HEADER: 'Ehbp-Fallback'
13
+ };
14
+ /**
15
+ * HPKE suite configuration matching the Go implementation
16
+ */
17
+ exports.HPKE_CONFIG = {
18
+ KEM: 0x0020, // X25519 HKDF SHA256
19
+ KDF: 0x0001, // HKDF SHA256
20
+ AEAD: 0x0002 // AES-256-GCM
21
+ };
22
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,QAAQ,GAAG;IACtB,uBAAuB,EAAE,uBAAuB;IAChD,wBAAwB,EAAE,wBAAwB;IAClD,eAAe,EAAE,wBAAwB;IACzC,SAAS,EAAE,wBAAwB;IACnC,eAAe,EAAE,eAAe;CACxB,CAAC;AAEX;;GAEG;AACU,QAAA,WAAW,GAAG;IACzB,GAAG,EAAE,MAAM,EAAE,qBAAqB;IAClC,GAAG,EAAE,MAAM,EAAE,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC,cAAc;CACnB,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { Identity } from './identity.js';
2
+ /**
3
+ * HTTP transport for EHBP
4
+ */
5
+ export declare class Transport {
6
+ private clientIdentity;
7
+ private serverHost;
8
+ private serverPublicKey;
9
+ constructor(clientIdentity: Identity, serverHost: string, serverPublicKey: CryptoKey);
10
+ /**
11
+ * Create a new transport by fetching server public key
12
+ */
13
+ static create(serverURL: string, clientIdentity: Identity): Promise<Transport>;
14
+ /**
15
+ * Get the server public key
16
+ */
17
+ getServerPublicKey(): CryptoKey;
18
+ /**
19
+ * Get the server public key as hex string
20
+ */
21
+ getServerPublicKeyHex(): Promise<string>;
22
+ /**
23
+ * Get the client public key
24
+ */
25
+ getClientPublicKey(): CryptoKey;
26
+ /**
27
+ * Make an encrypted HTTP request
28
+ */
29
+ request(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
30
+ /**
31
+ * Convenience method for GET requests
32
+ */
33
+ get(url: string | URL, init?: RequestInit): Promise<Response>;
34
+ /**
35
+ * Convenience method for POST requests
36
+ */
37
+ post(url: string | URL, body?: BodyInit, init?: RequestInit): Promise<Response>;
38
+ /**
39
+ * Convenience method for PUT requests
40
+ */
41
+ put(url: string | URL, body?: BodyInit, init?: RequestInit): Promise<Response>;
42
+ /**
43
+ * Convenience method for DELETE requests
44
+ */
45
+ delete(url: string | URL, init?: RequestInit): Promise<Response>;
46
+ }
47
+ /**
48
+ * Create a new transport instance
49
+ */
50
+ export declare function createTransport(serverURL: string, clientIdentity: Identity): Promise<Transport>;
51
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAY;gBAEvB,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS;IAMpF;;OAEG;WACU,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;IAwBpF;;OAEG;IACH,kBAAkB,IAAI,SAAS;IAI/B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ9C;;OAEG;IACH,kBAAkB,IAAI,SAAS;IAI/B;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0E9E;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInE;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIrF;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIpF;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAGvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAErG"}
@@ -0,0 +1,155 @@
1
+ import { Identity } from './identity.js';
2
+ import { PROTOCOL } from './protocol.js';
3
+ /**
4
+ * HTTP transport for EHBP
5
+ */
6
+ export class Transport {
7
+ clientIdentity;
8
+ serverHost;
9
+ serverPublicKey;
10
+ constructor(clientIdentity, serverHost, serverPublicKey) {
11
+ this.clientIdentity = clientIdentity;
12
+ this.serverHost = serverHost;
13
+ this.serverPublicKey = serverPublicKey;
14
+ }
15
+ /**
16
+ * Create a new transport by fetching server public key
17
+ */
18
+ static async create(serverURL, clientIdentity) {
19
+ const url = new URL(serverURL);
20
+ const serverHost = url.host;
21
+ // Fetch server public key
22
+ const keysURL = new URL(PROTOCOL.KEYS_PATH, serverURL);
23
+ const response = await fetch(keysURL.toString());
24
+ if (!response.ok) {
25
+ throw new Error(`Failed to get server public key: ${response.status}`);
26
+ }
27
+ const contentType = response.headers.get('content-type');
28
+ if (contentType !== PROTOCOL.KEYS_MEDIA_TYPE) {
29
+ throw new Error(`Invalid content type: ${contentType}`);
30
+ }
31
+ const keysData = new Uint8Array(await response.arrayBuffer());
32
+ const serverIdentity = await Identity.unmarshalPublicConfig(keysData);
33
+ const serverPublicKey = serverIdentity.getPublicKey();
34
+ return new Transport(clientIdentity, serverHost, serverPublicKey);
35
+ }
36
+ /**
37
+ * Get the server public key
38
+ */
39
+ getServerPublicKey() {
40
+ return this.serverPublicKey;
41
+ }
42
+ /**
43
+ * Get the server public key as hex string
44
+ */
45
+ async getServerPublicKeyHex() {
46
+ const exported = await crypto.subtle.exportKey('raw', this.serverPublicKey);
47
+ const keyBytes = new Uint8Array(exported);
48
+ return Array.from(keyBytes)
49
+ .map(b => b.toString(16).padStart(2, '0'))
50
+ .join('');
51
+ }
52
+ /**
53
+ * Get the client public key
54
+ */
55
+ getClientPublicKey() {
56
+ return this.clientIdentity.getPublicKey();
57
+ }
58
+ /**
59
+ * Make an encrypted HTTP request
60
+ */
61
+ async request(input, init) {
62
+ // Extract body from init or original request before creating Request object
63
+ let requestBody = null;
64
+ if (input instanceof Request) {
65
+ // If input is a Request, extract its body
66
+ if (input.body) {
67
+ requestBody = await input.arrayBuffer();
68
+ }
69
+ }
70
+ else {
71
+ // If input is URL/string, get body from init
72
+ requestBody = init?.body || null;
73
+ }
74
+ // Create the URL with correct host
75
+ let url;
76
+ let method;
77
+ let headers;
78
+ if (input instanceof Request) {
79
+ url = new URL(input.url);
80
+ method = input.method;
81
+ headers = input.headers;
82
+ }
83
+ else {
84
+ url = new URL(input);
85
+ method = init?.method || 'GET';
86
+ headers = init?.headers || {};
87
+ }
88
+ url.host = this.serverHost;
89
+ let request = new Request(url.toString(), {
90
+ method,
91
+ headers,
92
+ body: requestBody,
93
+ duplex: 'half'
94
+ });
95
+ // Encrypt request body if present (check the original requestBody, not request.body)
96
+ if (requestBody !== null && requestBody !== undefined) {
97
+ request = await this.clientIdentity.encryptRequest(request, this.serverPublicKey);
98
+ }
99
+ else {
100
+ // No body, just set client public key header
101
+ const headers = new Headers(request.headers);
102
+ headers.set(PROTOCOL.CLIENT_PUBLIC_KEY_HEADER, await this.clientIdentity.getPublicKeyHex());
103
+ request = new Request(request.url, {
104
+ method: request.method,
105
+ headers,
106
+ body: null
107
+ });
108
+ }
109
+ // Make the request
110
+ const response = await fetch(request);
111
+ if (!response.ok) {
112
+ console.warn(`Server returned non-OK status: ${response.status}`);
113
+ }
114
+ // Check for encapsulated key header
115
+ const encapKeyHeader = response.headers.get(PROTOCOL.ENCAPSULATED_KEY_HEADER);
116
+ if (!encapKeyHeader) {
117
+ throw new Error(`Missing ${PROTOCOL.ENCAPSULATED_KEY_HEADER} encapsulated key header`);
118
+ }
119
+ // Decode encapsulated key
120
+ const serverEncapKey = new Uint8Array(encapKeyHeader.match(/.{2}/g).map(byte => parseInt(byte, 16)));
121
+ // Decrypt response
122
+ return await this.clientIdentity.decryptResponse(response, serverEncapKey);
123
+ }
124
+ /**
125
+ * Convenience method for GET requests
126
+ */
127
+ async get(url, init) {
128
+ return this.request(url, { ...init, method: 'GET' });
129
+ }
130
+ /**
131
+ * Convenience method for POST requests
132
+ */
133
+ async post(url, body, init) {
134
+ return this.request(url, { ...init, method: 'POST', body });
135
+ }
136
+ /**
137
+ * Convenience method for PUT requests
138
+ */
139
+ async put(url, body, init) {
140
+ return this.request(url, { ...init, method: 'PUT', body });
141
+ }
142
+ /**
143
+ * Convenience method for DELETE requests
144
+ */
145
+ async delete(url, init) {
146
+ return this.request(url, { ...init, method: 'DELETE' });
147
+ }
148
+ }
149
+ /**
150
+ * Create a new transport instance
151
+ */
152
+ export async function createTransport(serverURL, clientIdentity) {
153
+ return Transport.create(serverURL, clientIdentity);
154
+ }
155
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Example usage of the EHBP JavaScript client
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","sourceRoot":"","sources":["../../src/example.ts"],"names":[],"mappings":";AAEA;;GAEG"}
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Example usage of the EHBP JavaScript client
4
+ */
5
+ import { Identity, createTransport } from './index.js';
6
+ async function main() {
7
+ console.log('EHBP JavaScript Client Example');
8
+ console.log('==============================');
9
+ try {
10
+ // Create client identity
11
+ console.log('Creating client identity...');
12
+ const clientIdentity = await Identity.generate();
13
+ console.log('Client public key:', await clientIdentity.getPublicKeyHex());
14
+ // Create transport (this will fetch server public key)
15
+ console.log('Creating transport...');
16
+ const serverURL = 'http://localhost:8080'; // Adjust as needed
17
+ const transport = await createTransport(serverURL, clientIdentity);
18
+ console.log('Transport created successfully');
19
+ // Example 1: GET request to secure endpoint
20
+ console.log('\n--- GET Request ---');
21
+ try {
22
+ const getResponse = await transport.get(`${serverURL}/secure`);
23
+ console.log('GET Response status:', getResponse.status);
24
+ if (getResponse.ok) {
25
+ const getData = await getResponse.text();
26
+ console.log('GET Response:', getData);
27
+ }
28
+ else {
29
+ console.log('GET Request failed with status:', getResponse.status);
30
+ }
31
+ }
32
+ catch (error) {
33
+ console.log('GET Request failed:', error instanceof Error ? error.message : String(error));
34
+ }
35
+ // Example 2: POST request with JSON data
36
+ console.log('\n--- POST Request ---');
37
+ try {
38
+ const postData = { message: 'Hello from JavaScript client!', timestamp: new Date().toISOString() };
39
+ const postResponse = await transport.post(`${serverURL}/secure`, JSON.stringify(postData), { headers: { 'Content-Type': 'application/json' } });
40
+ console.log('POST Response status:', postResponse.status);
41
+ if (postResponse.ok) {
42
+ const responseData = await postResponse.text();
43
+ console.log('POST Response:', responseData);
44
+ }
45
+ else {
46
+ console.log('POST Request failed with status:', postResponse.status);
47
+ }
48
+ }
49
+ catch (error) {
50
+ console.log('POST Request failed:', error instanceof Error ? error.message : String(error));
51
+ }
52
+ // Example 3: PUT request
53
+ console.log('\n--- PUT Request ---');
54
+ try {
55
+ const putData = { id: 1, name: 'Updated Item' };
56
+ const putResponse = await transport.put(`${serverURL}/secure`, JSON.stringify(putData), { headers: { 'Content-Type': 'application/json' } });
57
+ console.log('PUT Response status:', putResponse.status);
58
+ if (putResponse.ok) {
59
+ const putResponseData = await putResponse.text();
60
+ console.log('PUT Response:', putResponseData);
61
+ }
62
+ else {
63
+ console.log('PUT Request failed with status:', putResponse.status);
64
+ }
65
+ }
66
+ catch (error) {
67
+ console.log('PUT Request failed:', error instanceof Error ? error.message : String(error));
68
+ }
69
+ // Example 4: Streaming request
70
+ console.log('\n--- Streaming Request ---');
71
+ try {
72
+ const streamResponse = await transport.get(`${serverURL}/stream`);
73
+ console.log('Stream Response status:', streamResponse.status);
74
+ if (streamResponse.ok) {
75
+ console.log('Streaming response (should show numbers 1-20):');
76
+ const reader = streamResponse.body?.getReader();
77
+ if (reader) {
78
+ const decoder = new TextDecoder();
79
+ let chunkCount = 0;
80
+ while (true) {
81
+ const { done, value } = await reader.read();
82
+ if (done)
83
+ break;
84
+ const text = decoder.decode(value, { stream: true });
85
+ process.stdout.write(text);
86
+ chunkCount++;
87
+ }
88
+ console.log(`\nStream completed with ${chunkCount} chunks`);
89
+ }
90
+ else {
91
+ console.log('No readable stream available');
92
+ }
93
+ }
94
+ else {
95
+ console.log('Stream Request failed with status:', streamResponse.status);
96
+ }
97
+ }
98
+ catch (error) {
99
+ console.log('Stream Request failed:', error instanceof Error ? error.message : String(error));
100
+ }
101
+ console.log('\nExample completed successfully!');
102
+ console.log('\nTo test with a real server:');
103
+ console.log('1. Start the Go server: go run pkg/server/main.go');
104
+ console.log('2. Run this example: npm run example');
105
+ }
106
+ catch (error) {
107
+ console.error('Error:', error);
108
+ process.exit(1);
109
+ }
110
+ }
111
+ // Run the example
112
+ if (import.meta.url === `file://${process.argv[1]}`) {
113
+ main().catch(console.error);
114
+ }
115
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","sourceRoot":"","sources":["../../src/example.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { CipherSuite } from '@hpke/core';
2
+ /**
3
+ * Identity class for managing HPKE key pairs and encryption/decryption
4
+ */
5
+ export declare class Identity {
6
+ private suite;
7
+ private publicKey;
8
+ private privateKey;
9
+ constructor(suite: CipherSuite, publicKey: CryptoKey, privateKey: CryptoKey);
10
+ /**
11
+ * Generate a new identity with X25519 key pair
12
+ */
13
+ static generate(): Promise<Identity>;
14
+ /**
15
+ * Create identity from JSON string
16
+ */
17
+ static fromJSON(json: string): Promise<Identity>;
18
+ /**
19
+ * Convert identity to JSON string
20
+ */
21
+ toJSON(): Promise<string>;
22
+ /**
23
+ * Get public key as CryptoKey
24
+ */
25
+ getPublicKey(): CryptoKey;
26
+ /**
27
+ * Get public key as hex string
28
+ */
29
+ getPublicKeyHex(): Promise<string>;
30
+ /**
31
+ * Get private key as CryptoKey
32
+ */
33
+ getPrivateKey(): CryptoKey;
34
+ /**
35
+ * Marshal public key configuration for server key distribution
36
+ * Implements RFC 9458 format
37
+ */
38
+ marshalConfig(): Promise<Uint8Array>;
39
+ /**
40
+ * Unmarshal public configuration from server
41
+ */
42
+ static unmarshalPublicConfig(data: Uint8Array): Promise<Identity>;
43
+ /**
44
+ * Encrypt request body and set appropriate headers
45
+ */
46
+ encryptRequest(request: Request, serverPublicKey: CryptoKey): Promise<Request>;
47
+ /**
48
+ * Decrypt response body
49
+ */
50
+ decryptResponse(response: Response, serverEncapKey: Uint8Array): Promise<Response>;
51
+ }
52
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgD,MAAM,YAAY,CAAC;AAGvF;;GAEG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAY;gBAElB,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS;IAM3E;;OAEG;WACU,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAsB1C;;OAEG;WACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwBtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAY/B;;OAEG;IACH,YAAY,IAAI,SAAS;IAIzB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAOxC;;OAEG;IACH,aAAa,IAAI,SAAS;IAI1B;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC;IA0C1C;;OAEG;WACU,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwCvE;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAgDpF;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;CAuFzF"}