smartcomply-web-sdk 1.0.3 → 1.0.5
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 +43 -0
- package/dist/esm/camera/ActionDetector.d.ts +26 -0
- package/dist/esm/camera/ActionDetector.d.ts.map +1 -0
- package/dist/esm/camera/ActionDetector.js +110 -0
- package/dist/esm/camera/ActionDetector.js.map +1 -0
- package/dist/esm/camera/CameraManager.d.ts +7 -0
- package/dist/esm/camera/CameraManager.d.ts.map +1 -0
- package/dist/esm/camera/CameraManager.js +27 -0
- package/dist/esm/camera/CameraManager.js.map +1 -0
- package/dist/esm/camera/FaceDetector.d.ts +12 -0
- package/dist/esm/camera/FaceDetector.d.ts.map +1 -0
- package/dist/esm/camera/FaceDetector.js +51 -0
- package/dist/esm/camera/FaceDetector.js.map +1 -0
- package/dist/esm/camera/Permission.d.ts +42 -0
- package/dist/esm/camera/Permission.d.ts.map +1 -0
- package/dist/esm/camera/Permission.js +101 -0
- package/dist/esm/camera/Permission.js.map +1 -0
- package/dist/esm/camera/VideoRecorder.d.ts +12 -0
- package/dist/esm/camera/VideoRecorder.d.ts.map +1 -0
- package/dist/esm/camera/VideoRecorder.js +47 -0
- package/dist/esm/camera/VideoRecorder.js.map +1 -0
- package/dist/esm/client/Config.d.ts +9 -0
- package/dist/esm/client/Config.d.ts.map +1 -0
- package/dist/esm/client/Config.js +5 -0
- package/dist/esm/client/Config.js.map +1 -0
- package/dist/esm/client/HttpClient.d.ts +44 -0
- package/dist/esm/client/HttpClient.d.ts.map +1 -0
- package/dist/esm/client/HttpClient.js +145 -0
- package/dist/esm/client/HttpClient.js.map +1 -0
- package/dist/esm/client/Smartcomply.d.ts +50 -0
- package/dist/esm/client/Smartcomply.d.ts.map +1 -0
- package/dist/esm/client/Smartcomply.js +73 -0
- package/dist/esm/client/Smartcomply.js.map +1 -0
- package/dist/esm/components/CameraView.d.ts +59 -0
- package/dist/esm/components/CameraView.d.ts.map +1 -0
- package/dist/esm/components/CameraView.js +238 -0
- package/dist/esm/components/CameraView.js.map +1 -0
- package/dist/esm/components/DocumentUpload.d.ts +21 -0
- package/dist/esm/components/DocumentUpload.d.ts.map +1 -0
- package/dist/esm/components/DocumentUpload.js +216 -0
- package/dist/esm/components/DocumentUpload.js.map +1 -0
- package/dist/esm/errors/AuthError.d.ts +8 -0
- package/dist/esm/errors/AuthError.d.ts.map +1 -0
- package/dist/esm/errors/AuthError.js +11 -0
- package/dist/esm/errors/AuthError.js.map +1 -0
- package/dist/esm/errors/NetworkError.d.ts +8 -0
- package/dist/esm/errors/NetworkError.d.ts.map +1 -0
- package/dist/esm/errors/NetworkError.js +11 -0
- package/dist/esm/errors/NetworkError.js.map +1 -0
- package/dist/esm/errors/SDKError.d.ts +7 -0
- package/dist/esm/errors/SDKError.d.ts.map +1 -0
- package/dist/esm/errors/SDKError.js +10 -0
- package/dist/esm/errors/SDKError.js.map +1 -0
- package/dist/esm/flow/DocumentCapture.d.ts +54 -0
- package/dist/esm/flow/DocumentCapture.d.ts.map +1 -0
- package/dist/esm/flow/DocumentCapture.js +797 -0
- package/dist/esm/flow/DocumentCapture.js.map +1 -0
- package/dist/esm/flow/SmartComplyFlow.d.ts +104 -0
- package/dist/esm/flow/SmartComplyFlow.d.ts.map +1 -0
- package/dist/esm/flow/SmartComplyFlow.js +1722 -0
- package/dist/esm/flow/SmartComplyFlow.js.map +1 -0
- package/dist/esm/flow/theme.d.ts +30 -0
- package/dist/esm/flow/theme.d.ts.map +1 -0
- package/dist/esm/flow/theme.js +99 -0
- package/dist/esm/flow/theme.js.map +1 -0
- package/dist/esm/index.d.ts +20 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/modules/liveness/LivenessUI.d.ts +46 -0
- package/dist/esm/modules/liveness/LivenessUI.d.ts.map +1 -0
- package/dist/esm/modules/liveness/LivenessUI.js +605 -0
- package/dist/esm/modules/liveness/LivenessUI.js.map +1 -0
- package/dist/esm/modules/liveness/index.d.ts +5 -0
- package/dist/esm/modules/liveness/index.d.ts.map +1 -0
- package/dist/esm/modules/liveness/index.js +4 -0
- package/dist/esm/modules/liveness/index.js.map +1 -0
- package/dist/esm/modules/liveness/liveness.d.ts +85 -0
- package/dist/esm/modules/liveness/liveness.d.ts.map +1 -0
- package/dist/esm/modules/liveness/liveness.js +421 -0
- package/dist/esm/modules/liveness/liveness.js.map +1 -0
- package/dist/esm/modules/liveness/uploader.d.ts +34 -0
- package/dist/esm/modules/liveness/uploader.d.ts.map +1 -0
- package/dist/esm/modules/liveness/uploader.js +102 -0
- package/dist/esm/modules/liveness/uploader.js.map +1 -0
- package/dist/esm/modules/onboarding/index.d.ts +2 -0
- package/dist/esm/modules/onboarding/index.d.ts.map +1 -0
- package/dist/esm/modules/onboarding/index.js +2 -0
- package/dist/esm/modules/onboarding/index.js.map +1 -0
- package/dist/esm/modules/onboarding/onboarding.d.ts +25 -0
- package/dist/esm/modules/onboarding/onboarding.d.ts.map +1 -0
- package/dist/esm/modules/onboarding/onboarding.js +29 -0
- package/dist/esm/modules/onboarding/onboarding.js.map +1 -0
- package/dist/esm/types/common.d.ts +27 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/common.js +2 -0
- package/dist/esm/types/common.js.map +1 -0
- package/dist/esm/types/liveness.d.ts +142 -0
- package/dist/esm/types/liveness.d.ts.map +1 -0
- package/dist/esm/types/liveness.js +2 -0
- package/dist/esm/types/liveness.js.map +1 -0
- package/dist/esm/types/onboarding.d.ts +53 -0
- package/dist/esm/types/onboarding.d.ts.map +1 -0
- package/dist/esm/types/onboarding.js +2 -0
- package/dist/esm/types/onboarding.js.map +1 -0
- package/dist/esm/types/quality.d.ts +23 -0
- package/dist/esm/types/quality.d.ts.map +1 -0
- package/dist/esm/types/quality.js +5 -0
- package/dist/esm/types/quality.js.map +1 -0
- package/dist/esm/utils/ImageQuality.d.ts +48 -0
- package/dist/esm/utils/ImageQuality.d.ts.map +1 -0
- package/dist/esm/utils/ImageQuality.js +177 -0
- package/dist/esm/utils/ImageQuality.js.map +1 -0
- package/dist/esm/utils/constants.d.ts +59 -0
- package/dist/esm/utils/constants.d.ts.map +1 -0
- package/dist/esm/utils/constants.js +67 -0
- package/dist/esm/utils/constants.js.map +1 -0
- package/dist/esm/utils/device.d.ts +14 -0
- package/dist/esm/utils/device.d.ts.map +1 -0
- package/dist/esm/utils/device.js +52 -0
- package/dist/esm/utils/device.js.map +1 -0
- package/dist/esm/utils/logger.d.ts +28 -0
- package/dist/esm/utils/logger.d.ts.map +1 -0
- package/dist/esm/utils/logger.js +64 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/esm/utils/validator.d.ts +35 -0
- package/dist/esm/utils/validator.d.ts.map +1 -0
- package/dist/esm/utils/validator.js +102 -0
- package/dist/esm/utils/validator.js.map +1 -0
- package/package.json +13 -5
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { BASE_URLS } from "./Config";
|
|
2
|
+
import { SDKError } from "../errors/SDKError";
|
|
3
|
+
import { AuthError } from "../errors/AuthError";
|
|
4
|
+
import { NetworkError } from "../errors/NetworkError";
|
|
5
|
+
/**
|
|
6
|
+
* HTTP client aligned with Adhere backend contract.
|
|
7
|
+
*
|
|
8
|
+
* Two auth modes:
|
|
9
|
+
* - request() → Authorization: Bearer <apiKey> (session creation)
|
|
10
|
+
* - sessionRequest() → x-access-token: <sessionToken> (all other endpoints)
|
|
11
|
+
* - uploadWithSession() → multipart + x-access-token (file uploads)
|
|
12
|
+
*/
|
|
13
|
+
export class HttpClient {
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.sessionToken = null;
|
|
16
|
+
this.baseUrl = BASE_URLS[config.environment || "sandbox"];
|
|
17
|
+
this.apiKey = config.apiKey;
|
|
18
|
+
this.timeout = config.timeout || 30000;
|
|
19
|
+
}
|
|
20
|
+
setSessionToken(token) {
|
|
21
|
+
this.sessionToken = token;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* API-key authenticated request (used for session creation only).
|
|
25
|
+
* Header: Authorization: Bearer <apiKey>
|
|
26
|
+
*/
|
|
27
|
+
async request(method, path, body) {
|
|
28
|
+
return this._fetch(path, {
|
|
29
|
+
method,
|
|
30
|
+
headers: {
|
|
31
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
32
|
+
"Content-Type": "application/json",
|
|
33
|
+
},
|
|
34
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Session-token authenticated request (used for all endpoints after session creation).
|
|
39
|
+
* Header: x-access-token: <sessionToken>
|
|
40
|
+
*/
|
|
41
|
+
async sessionRequest(method, path, body) {
|
|
42
|
+
this.requireToken();
|
|
43
|
+
return this._fetch(path, {
|
|
44
|
+
method,
|
|
45
|
+
headers: {
|
|
46
|
+
"x-access-token": this.sessionToken,
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
},
|
|
49
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Multipart file upload with session-token auth.
|
|
54
|
+
* Header: x-access-token: <sessionToken>
|
|
55
|
+
* NOTE: Do NOT set Content-Type — browser sets it with boundary automatically.
|
|
56
|
+
*/
|
|
57
|
+
async uploadWithSession(path, formData) {
|
|
58
|
+
this.requireToken();
|
|
59
|
+
return this._fetch(path, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: {
|
|
62
|
+
"x-access-token": this.sessionToken,
|
|
63
|
+
},
|
|
64
|
+
body: formData,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Unauthenticated GET — used for public endpoints (e.g. status polling after session revoke).
|
|
69
|
+
*/
|
|
70
|
+
async publicGet(path) {
|
|
71
|
+
return this._fetch(path, {
|
|
72
|
+
method: "GET",
|
|
73
|
+
headers: { "Content-Type": "application/json" },
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Legacy upload with API key (kept for backward compatibility if needed).
|
|
78
|
+
*/
|
|
79
|
+
async upload(path, formData) {
|
|
80
|
+
return this._fetch(path, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: {
|
|
83
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
84
|
+
},
|
|
85
|
+
body: formData,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// ---- Internal ----
|
|
89
|
+
requireToken() {
|
|
90
|
+
if (!this.sessionToken) {
|
|
91
|
+
throw new AuthError("No session token set. Call sdk.createSession() first.", "NO_SESSION_TOKEN");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async _fetch(path, init, retries = 2) {
|
|
95
|
+
const controller = new AbortController();
|
|
96
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
97
|
+
try {
|
|
98
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
99
|
+
...init,
|
|
100
|
+
signal: controller.signal,
|
|
101
|
+
});
|
|
102
|
+
const contentType = response.headers.get("content-type") || "";
|
|
103
|
+
if (!contentType.includes("application/json")) {
|
|
104
|
+
throw new SDKError(`Unexpected response from ${path} (${response.status})`, response.status);
|
|
105
|
+
}
|
|
106
|
+
// Parse the backend's standard response envelope
|
|
107
|
+
const envelope = await response.json();
|
|
108
|
+
if (!response.ok || envelope.status === "error") {
|
|
109
|
+
const statusCode = response.status;
|
|
110
|
+
// Map specific HTTP statuses to error types
|
|
111
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
112
|
+
throw new AuthError(envelope.message || "Authentication failed", envelope.code);
|
|
113
|
+
}
|
|
114
|
+
throw new SDKError(envelope.message || `Request to ${path} failed`, statusCode, envelope.code, envelope.data);
|
|
115
|
+
}
|
|
116
|
+
// Return the full envelope for verify responses (so SDK can check status)
|
|
117
|
+
// For other endpoints, return unwrapped data
|
|
118
|
+
if (path.includes("/verify/")) {
|
|
119
|
+
return envelope;
|
|
120
|
+
}
|
|
121
|
+
return envelope.data;
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
if (err instanceof SDKError || err instanceof AuthError)
|
|
125
|
+
throw err;
|
|
126
|
+
// C5: Retry on network errors (not auth/validation errors)
|
|
127
|
+
if (retries > 0 && (err.name === "AbortError" || err.name === "TypeError")) {
|
|
128
|
+
clearTimeout(timer);
|
|
129
|
+
await new Promise((r) => setTimeout(r, 1000)); // wait 1s before retry
|
|
130
|
+
return this._fetch(path, init, retries - 1);
|
|
131
|
+
}
|
|
132
|
+
if (err.name === "AbortError") {
|
|
133
|
+
throw new NetworkError("Request timeout. Please check your connection and try again.");
|
|
134
|
+
}
|
|
135
|
+
if (err.name === "TypeError" && err.message?.includes("fetch")) {
|
|
136
|
+
throw new NetworkError(`Network error: ${err.message}`);
|
|
137
|
+
}
|
|
138
|
+
throw new SDKError(err.message || "Unknown error", 0, "UNKNOWN_ERROR");
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
clearTimeout(timer);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=HttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../../src/client/HttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { SDKConfig } from "./Config";
|
|
2
|
+
import { OnboardingModule } from "../modules/onboarding/onboarding";
|
|
3
|
+
import { LivenessModule } from "../modules/liveness/liveness";
|
|
4
|
+
import { SessionResponse, SDKInitConfig } from "../types/onboarding";
|
|
5
|
+
/**
|
|
6
|
+
* SmartComply SDK — main entry point.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const sdk = new SmartComply({ apiKey: "pk_...", clientId: "uuid-...", environment: "sandbox" });
|
|
10
|
+
* const session = await sdk.createSession();
|
|
11
|
+
* const config = await sdk.initializeConfig();
|
|
12
|
+
* // ... use sdk.onboarding and sdk.liveness modules
|
|
13
|
+
*/
|
|
14
|
+
export declare class SmartComply {
|
|
15
|
+
private http;
|
|
16
|
+
private clientId;
|
|
17
|
+
private _sessionToken;
|
|
18
|
+
private _sessionExpiresAt;
|
|
19
|
+
private _sdkConfig;
|
|
20
|
+
onboarding: OnboardingModule;
|
|
21
|
+
liveness: LivenessModule;
|
|
22
|
+
constructor(config: SDKConfig);
|
|
23
|
+
/** Current session token (null if not created yet) */
|
|
24
|
+
get sessionToken(): string | null;
|
|
25
|
+
/** Session expiration ISO timestamp */
|
|
26
|
+
get sessionExpiresAt(): string | null;
|
|
27
|
+
/** SDK config fetched from backend (null until initializeConfig() is called) */
|
|
28
|
+
get sdkConfig(): SDKInitConfig | null;
|
|
29
|
+
/**
|
|
30
|
+
* Create a new SDK session.
|
|
31
|
+
*
|
|
32
|
+
* POST /v1/sdk/session/create/
|
|
33
|
+
* Auth: Authorization: Bearer <apiKey>
|
|
34
|
+
* Body: { client_id: "<uuid>" }
|
|
35
|
+
*
|
|
36
|
+
* Returns: { token: "...", expires_at: "..." }
|
|
37
|
+
*/
|
|
38
|
+
createSession(): Promise<SessionResponse>;
|
|
39
|
+
/**
|
|
40
|
+
* Fetch SDK configuration from the backend.
|
|
41
|
+
* Must be called after createSession().
|
|
42
|
+
*
|
|
43
|
+
* GET /v1/sdk/initialize/
|
|
44
|
+
* Auth: x-access-token: <sessionToken>
|
|
45
|
+
*
|
|
46
|
+
* Returns: { brand_name, theme, verification_type, channels, redirect_url, ... }
|
|
47
|
+
*/
|
|
48
|
+
initializeConfig(): Promise<SDKInitConfig>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=Smartcomply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Smartcomply.d.ts","sourceRoot":"","sources":["../../../src/client/Smartcomply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,UAAU,CAA8B;IAEzC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,cAAc,CAAC;gBAEpB,MAAM,EAAE,SAAS;IAe7B,sDAAsD;IACtD,IAAI,YAAY,IAAI,MAAM,GAAG,IAAI,CAEhC;IAED,uCAAuC;IACvC,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;IAED,gFAAgF;IAChF,IAAI,SAAS,IAAI,aAAa,GAAG,IAAI,CAEpC;IAED;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAgB/C;;;;;;;;OAQG;IACG,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;CASjD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { HttpClient } from "./HttpClient";
|
|
2
|
+
import { OnboardingModule } from "../modules/onboarding/onboarding";
|
|
3
|
+
import { LivenessModule } from "../modules/liveness/liveness";
|
|
4
|
+
/**
|
|
5
|
+
* SmartComply SDK — main entry point.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* const sdk = new SmartComply({ apiKey: "pk_...", clientId: "uuid-...", environment: "sandbox" });
|
|
9
|
+
* const session = await sdk.createSession();
|
|
10
|
+
* const config = await sdk.initializeConfig();
|
|
11
|
+
* // ... use sdk.onboarding and sdk.liveness modules
|
|
12
|
+
*/
|
|
13
|
+
export class SmartComply {
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this._sessionToken = null;
|
|
16
|
+
this._sessionExpiresAt = null;
|
|
17
|
+
this._sdkConfig = null;
|
|
18
|
+
if (!config.apiKey) {
|
|
19
|
+
throw new Error("SmartComply: apiKey is required");
|
|
20
|
+
}
|
|
21
|
+
if (!config.clientId) {
|
|
22
|
+
throw new Error("SmartComply: clientId is required (UUID from your SDK config)");
|
|
23
|
+
}
|
|
24
|
+
this.clientId = config.clientId;
|
|
25
|
+
this.http = new HttpClient(config);
|
|
26
|
+
this.onboarding = new OnboardingModule(this.http);
|
|
27
|
+
this.liveness = new LivenessModule(this.http);
|
|
28
|
+
}
|
|
29
|
+
/** Current session token (null if not created yet) */
|
|
30
|
+
get sessionToken() {
|
|
31
|
+
return this._sessionToken;
|
|
32
|
+
}
|
|
33
|
+
/** Session expiration ISO timestamp */
|
|
34
|
+
get sessionExpiresAt() {
|
|
35
|
+
return this._sessionExpiresAt;
|
|
36
|
+
}
|
|
37
|
+
/** SDK config fetched from backend (null until initializeConfig() is called) */
|
|
38
|
+
get sdkConfig() {
|
|
39
|
+
return this._sdkConfig;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a new SDK session.
|
|
43
|
+
*
|
|
44
|
+
* POST /v1/sdk/session/create/
|
|
45
|
+
* Auth: Authorization: Bearer <apiKey>
|
|
46
|
+
* Body: { client_id: "<uuid>" }
|
|
47
|
+
*
|
|
48
|
+
* Returns: { token: "...", expires_at: "..." }
|
|
49
|
+
*/
|
|
50
|
+
async createSession() {
|
|
51
|
+
const response = await this.http.request("POST", "/v1/sdk/session/create/", { client_id: this.clientId });
|
|
52
|
+
this._sessionToken = response.token;
|
|
53
|
+
this._sessionExpiresAt = response.expires_at;
|
|
54
|
+
// Set the session token on the HTTP client for subsequent requests
|
|
55
|
+
this.http.setSessionToken(response.token);
|
|
56
|
+
return response;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Fetch SDK configuration from the backend.
|
|
60
|
+
* Must be called after createSession().
|
|
61
|
+
*
|
|
62
|
+
* GET /v1/sdk/initialize/
|
|
63
|
+
* Auth: x-access-token: <sessionToken>
|
|
64
|
+
*
|
|
65
|
+
* Returns: { brand_name, theme, verification_type, channels, redirect_url, ... }
|
|
66
|
+
*/
|
|
67
|
+
async initializeConfig() {
|
|
68
|
+
const config = await this.http.sessionRequest("GET", "/v1/sdk/initialize/");
|
|
69
|
+
this._sdkConfig = config;
|
|
70
|
+
return config;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=Smartcomply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Smartcomply.js","sourceRoot":"","sources":["../../../src/client/Smartcomply.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAM9D;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAW;IAUtB,YAAY,MAAiB;QAPrB,kBAAa,GAAkB,IAAI,CAAC;QACpC,sBAAiB,GAAkB,IAAI,CAAC;QACxC,eAAU,GAAyB,IAAI,CAAC;QAM9C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,sDAAsD;IACtD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,uCAAuC;IACvC,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,gFAAgF;IAChF,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CACtC,MAAM,EACN,yBAAyB,EACzB,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC7B,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC,UAAU,CAAC;QAE7C,mEAAmE;QACnE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB;QACpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAC3C,KAAK,EACL,qBAAqB,CACtB,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Camera View with Real-time Quality Feedback
|
|
3
|
+
* Shows live quality indicators before capture
|
|
4
|
+
*/
|
|
5
|
+
import { QualityFeedback } from "../utils/ImageQuality";
|
|
6
|
+
export interface CameraOptions {
|
|
7
|
+
width?: number;
|
|
8
|
+
height?: number;
|
|
9
|
+
facingMode?: "user" | "environment";
|
|
10
|
+
isDocumentCapture?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface CaptureResult {
|
|
13
|
+
blob: Blob;
|
|
14
|
+
quality: QualityFeedback;
|
|
15
|
+
selectedFrom: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class CameraView {
|
|
18
|
+
private container;
|
|
19
|
+
private video;
|
|
20
|
+
private canvas;
|
|
21
|
+
private stream;
|
|
22
|
+
private qualityOverlay;
|
|
23
|
+
private feedbackText;
|
|
24
|
+
private isAnalyzing;
|
|
25
|
+
private qualityCheckInterval;
|
|
26
|
+
onQualityUpdate?: (feedback: QualityFeedback) => void;
|
|
27
|
+
onCapture?: (result: CaptureResult) => void;
|
|
28
|
+
onError?: (error: Error) => void;
|
|
29
|
+
constructor(container: HTMLElement);
|
|
30
|
+
/**
|
|
31
|
+
* Initialize camera
|
|
32
|
+
*/
|
|
33
|
+
initialize(options?: CameraOptions): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Create camera UI with quality overlay
|
|
36
|
+
*/
|
|
37
|
+
private createUI;
|
|
38
|
+
/**
|
|
39
|
+
* Start real-time quality monitoring
|
|
40
|
+
*/
|
|
41
|
+
private startQualityMonitoring;
|
|
42
|
+
/**
|
|
43
|
+
* Update quality overlay UI
|
|
44
|
+
*/
|
|
45
|
+
private updateQualityUI;
|
|
46
|
+
/**
|
|
47
|
+
* Capture multiple frames and select best
|
|
48
|
+
*/
|
|
49
|
+
captureMultipleFrames(count?: number): Promise<CaptureResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Single capture (for manual mode)
|
|
52
|
+
*/
|
|
53
|
+
captureSingle(): Promise<CaptureResult>;
|
|
54
|
+
/**
|
|
55
|
+
* Stop camera and cleanup
|
|
56
|
+
*/
|
|
57
|
+
stop(): void;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=CameraView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraView.d.ts","sourceRoot":"","sources":["../../../src/components/CameraView.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIL,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,UAAU;IAcT,OAAO,CAAC,SAAS;IAb7B,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,oBAAoB,CAAuB;IAGnD,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;IACtD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;gBAEb,SAAS,EAAE,WAAW;IAE1C;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyD5D;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiDhB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACG,qBAAqB,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,CAAC;IAkDtE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC;IAI7C;;OAEG;IACH,IAAI,IAAI,IAAI;CAuBb"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Camera View with Real-time Quality Feedback
|
|
3
|
+
* Shows live quality indicators before capture
|
|
4
|
+
*/
|
|
5
|
+
import { assessQuality, getQualityColor, getQualityMessage } from "../utils/ImageQuality";
|
|
6
|
+
export class CameraView {
|
|
7
|
+
constructor(container) {
|
|
8
|
+
this.container = container;
|
|
9
|
+
this.video = null;
|
|
10
|
+
this.canvas = null;
|
|
11
|
+
this.stream = null;
|
|
12
|
+
this.qualityOverlay = null;
|
|
13
|
+
this.feedbackText = null;
|
|
14
|
+
this.isAnalyzing = false;
|
|
15
|
+
this.qualityCheckInterval = null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Initialize camera
|
|
19
|
+
*/
|
|
20
|
+
async initialize(options = {}) {
|
|
21
|
+
try {
|
|
22
|
+
const { isDocumentCapture = false, facingMode = "environment" } = options;
|
|
23
|
+
// Use landscape dimensions for documents (1920x1080), portrait for selfie (1280x720)
|
|
24
|
+
const width = isDocumentCapture ? 1920 : 1280;
|
|
25
|
+
const height = isDocumentCapture ? 1080 : 720;
|
|
26
|
+
// Get camera stream with landscape constraints for documents
|
|
27
|
+
const videoConstraints = {
|
|
28
|
+
width: { ideal: width },
|
|
29
|
+
height: { ideal: height },
|
|
30
|
+
facingMode: { ideal: facingMode },
|
|
31
|
+
};
|
|
32
|
+
// For documents, force aspect ratio to landscape
|
|
33
|
+
if (isDocumentCapture) {
|
|
34
|
+
videoConstraints.aspectRatio = { ideal: 1.77 }; // 16:9 landscape
|
|
35
|
+
}
|
|
36
|
+
this.stream = await navigator.mediaDevices.getUserMedia({
|
|
37
|
+
video: videoConstraints,
|
|
38
|
+
audio: false,
|
|
39
|
+
});
|
|
40
|
+
// Create video element
|
|
41
|
+
this.video = document.createElement("video");
|
|
42
|
+
this.video.srcObject = this.stream;
|
|
43
|
+
this.video.autoplay = true;
|
|
44
|
+
this.video.playsInline = true;
|
|
45
|
+
// Create canvas for analysis
|
|
46
|
+
this.canvas = document.createElement("canvas");
|
|
47
|
+
this.canvas.width = width;
|
|
48
|
+
this.canvas.height = height;
|
|
49
|
+
// Create UI
|
|
50
|
+
this.createUI();
|
|
51
|
+
// Wait for video to be ready
|
|
52
|
+
await new Promise((resolve) => {
|
|
53
|
+
this.video.onloadedmetadata = () => {
|
|
54
|
+
this.video.play();
|
|
55
|
+
resolve(null);
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
// Start quality monitoring
|
|
59
|
+
this.startQualityMonitoring();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error("Camera initialization failed:", error);
|
|
63
|
+
this.onError?.(error);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create camera UI with quality overlay
|
|
69
|
+
*/
|
|
70
|
+
createUI() {
|
|
71
|
+
if (!this.container || !this.video)
|
|
72
|
+
return;
|
|
73
|
+
// Clear container
|
|
74
|
+
this.container.innerHTML = "";
|
|
75
|
+
this.container.style.position = "relative";
|
|
76
|
+
this.container.style.overflow = "hidden";
|
|
77
|
+
this.container.style.borderRadius = "12px";
|
|
78
|
+
// Add video
|
|
79
|
+
this.video.style.width = "100%";
|
|
80
|
+
this.video.style.height = "100%";
|
|
81
|
+
this.video.style.objectFit = "cover";
|
|
82
|
+
this.container.appendChild(this.video);
|
|
83
|
+
// Create quality overlay
|
|
84
|
+
this.qualityOverlay = document.createElement("div");
|
|
85
|
+
this.qualityOverlay.style.cssText = `
|
|
86
|
+
position: absolute;
|
|
87
|
+
top: 0;
|
|
88
|
+
left: 0;
|
|
89
|
+
right: 0;
|
|
90
|
+
bottom: 0;
|
|
91
|
+
border: 4px solid transparent;
|
|
92
|
+
border-radius: 12px;
|
|
93
|
+
transition: border-color 0.3s ease;
|
|
94
|
+
pointer-events: none;
|
|
95
|
+
`;
|
|
96
|
+
this.container.appendChild(this.qualityOverlay);
|
|
97
|
+
// Create feedback text
|
|
98
|
+
this.feedbackText = document.createElement("div");
|
|
99
|
+
this.feedbackText.style.cssText = `
|
|
100
|
+
position: absolute;
|
|
101
|
+
bottom: 20px;
|
|
102
|
+
left: 50%;
|
|
103
|
+
transform: translateX(-50%);
|
|
104
|
+
background: rgba(0, 0, 0, 0.7);
|
|
105
|
+
color: white;
|
|
106
|
+
padding: 8px 16px;
|
|
107
|
+
border-radius: 20px;
|
|
108
|
+
font-size: 14px;
|
|
109
|
+
font-weight: 500;
|
|
110
|
+
white-space: nowrap;
|
|
111
|
+
transition: all 0.3s ease;
|
|
112
|
+
`;
|
|
113
|
+
this.container.appendChild(this.feedbackText);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Start real-time quality monitoring
|
|
117
|
+
*/
|
|
118
|
+
startQualityMonitoring() {
|
|
119
|
+
if (!this.video || !this.canvas)
|
|
120
|
+
return;
|
|
121
|
+
const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
|
|
122
|
+
if (!ctx)
|
|
123
|
+
return;
|
|
124
|
+
const canvas = this.canvas; // Local reference for closure
|
|
125
|
+
this.qualityCheckInterval = window.setInterval(() => {
|
|
126
|
+
if (this.isAnalyzing || !this.video || this.video.paused || !this.canvas)
|
|
127
|
+
return;
|
|
128
|
+
this.isAnalyzing = true;
|
|
129
|
+
try {
|
|
130
|
+
// Draw video frame to canvas
|
|
131
|
+
ctx.drawImage(this.video, 0, 0, canvas.width, canvas.height);
|
|
132
|
+
// Get image data
|
|
133
|
+
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
|
|
134
|
+
// Assess quality
|
|
135
|
+
const feedback = assessQuality(imageData);
|
|
136
|
+
// Update UI
|
|
137
|
+
this.updateQualityUI(feedback);
|
|
138
|
+
// Notify callback
|
|
139
|
+
this.onQualityUpdate?.(feedback);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
console.error("Quality analysis error:", error);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
this.isAnalyzing = false;
|
|
146
|
+
}
|
|
147
|
+
}, 500); // Check every 500ms
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Update quality overlay UI
|
|
151
|
+
*/
|
|
152
|
+
updateQualityUI(feedback) {
|
|
153
|
+
if (!this.qualityOverlay || !this.feedbackText || !this.video)
|
|
154
|
+
return;
|
|
155
|
+
const color = getQualityColor(feedback.quality.overallScore);
|
|
156
|
+
const message = getQualityMessage(feedback.quality.overallScore);
|
|
157
|
+
// Update border color
|
|
158
|
+
this.qualityOverlay.style.borderColor = color;
|
|
159
|
+
this.qualityOverlay.style.boxShadow = `0 0 20px ${color}40`;
|
|
160
|
+
// Update text
|
|
161
|
+
this.feedbackText.textContent = message;
|
|
162
|
+
this.feedbackText.style.background = feedback.isValid
|
|
163
|
+
? "rgba(34, 197, 94, 0.8)" // Green
|
|
164
|
+
: "rgba(239, 68, 68, 0.8)"; // Red
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Capture multiple frames and select best
|
|
168
|
+
*/
|
|
169
|
+
async captureMultipleFrames(count = 3) {
|
|
170
|
+
if (!this.video || !this.canvas) {
|
|
171
|
+
throw new Error("Camera not initialized");
|
|
172
|
+
}
|
|
173
|
+
const ctx = this.canvas.getContext("2d");
|
|
174
|
+
if (!ctx)
|
|
175
|
+
throw new Error("Canvas context not available");
|
|
176
|
+
const frames = [];
|
|
177
|
+
// Capture multiple frames rapidly
|
|
178
|
+
for (let i = 0; i < count; i++) {
|
|
179
|
+
// Draw current frame
|
|
180
|
+
ctx.drawImage(this.video, 0, 0, this.canvas.width, this.canvas.height);
|
|
181
|
+
// Get image data for quality check
|
|
182
|
+
const imageData = ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
|
|
183
|
+
const quality = assessQuality(imageData);
|
|
184
|
+
// Convert to blob
|
|
185
|
+
const blob = await new Promise((resolve) => {
|
|
186
|
+
this.canvas.toBlob((b) => resolve(b), "image/jpeg", 0.95);
|
|
187
|
+
});
|
|
188
|
+
frames.push({
|
|
189
|
+
blob,
|
|
190
|
+
quality,
|
|
191
|
+
timestamp: Date.now(),
|
|
192
|
+
});
|
|
193
|
+
// Small delay between captures
|
|
194
|
+
if (i < count - 1) {
|
|
195
|
+
await new Promise(r => setTimeout(r, 200));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Select best frame by quality score
|
|
199
|
+
const best = frames.reduce((prev, current) => current.quality.quality.overallScore > prev.quality.quality.overallScore
|
|
200
|
+
? current
|
|
201
|
+
: prev);
|
|
202
|
+
return {
|
|
203
|
+
blob: best.blob,
|
|
204
|
+
quality: best.quality,
|
|
205
|
+
selectedFrom: count,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Single capture (for manual mode)
|
|
210
|
+
*/
|
|
211
|
+
async captureSingle() {
|
|
212
|
+
return this.captureMultipleFrames(1);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Stop camera and cleanup
|
|
216
|
+
*/
|
|
217
|
+
stop() {
|
|
218
|
+
// Stop quality monitoring
|
|
219
|
+
if (this.qualityCheckInterval) {
|
|
220
|
+
clearInterval(this.qualityCheckInterval);
|
|
221
|
+
this.qualityCheckInterval = null;
|
|
222
|
+
}
|
|
223
|
+
// Stop video stream
|
|
224
|
+
if (this.stream) {
|
|
225
|
+
this.stream.getTracks().forEach(track => track.stop());
|
|
226
|
+
this.stream = null;
|
|
227
|
+
}
|
|
228
|
+
// Stop video element
|
|
229
|
+
if (this.video) {
|
|
230
|
+
this.video.pause();
|
|
231
|
+
this.video.srcObject = null;
|
|
232
|
+
this.video = null;
|
|
233
|
+
}
|
|
234
|
+
// Clear container
|
|
235
|
+
this.container.innerHTML = "";
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=CameraView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CameraView.js","sourceRoot":"","sources":["../../../src/components/CameraView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple document upload component
|
|
3
|
+
* Shows file input immediately without camera permission
|
|
4
|
+
*/
|
|
5
|
+
export interface UploadOptions {
|
|
6
|
+
onFileSelect?: (file: File) => void;
|
|
7
|
+
onError?: (error: string) => void;
|
|
8
|
+
onUseCamera?: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class DocumentUpload {
|
|
11
|
+
private container;
|
|
12
|
+
private options;
|
|
13
|
+
private previewImage;
|
|
14
|
+
constructor(container: HTMLElement, options?: UploadOptions);
|
|
15
|
+
render(theme: any): void;
|
|
16
|
+
private handleFile;
|
|
17
|
+
private showPreview;
|
|
18
|
+
private getTheme;
|
|
19
|
+
destroy(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=DocumentUpload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentUpload.d.ts","sourceRoot":"","sources":["../../../src/components/DocumentUpload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAiC;gBAEzC,SAAS,EAAE,WAAW,EAAE,OAAO,GAAE,aAAkB;IAK/D,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAgJxB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,QAAQ;IAWhB,OAAO,IAAI,IAAI;CAGhB"}
|