@scalekit-sdk/node 2.1.7 → 2.1.8
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/buf.gen.yaml +1 -0
- package/lib/auth.d.ts +41 -9
- package/lib/auth.js +44 -12
- package/lib/auth.js.map +1 -1
- package/lib/connection.d.ts +195 -21
- package/lib/connection.js +197 -23
- package/lib/connection.js.map +1 -1
- package/lib/core.d.ts +2 -2
- package/lib/core.js +13 -12
- package/lib/core.js.map +1 -1
- package/lib/directory.d.ts +293 -40
- package/lib/directory.js +308 -44
- package/lib/directory.js.map +1 -1
- package/lib/domain.d.ts +166 -18
- package/lib/domain.js +178 -29
- package/lib/domain.js.map +1 -1
- package/lib/organization.d.ts +404 -44
- package/lib/organization.js +419 -54
- package/lib/organization.js.map +1 -1
- package/lib/permission.d.ts +179 -35
- package/lib/permission.js +190 -38
- package/lib/permission.js.map +1 -1
- package/lib/pkg/grpc/scalekit/v1/auth/auth_connect.d.ts +3 -3
- package/lib/pkg/grpc/scalekit/v1/auth/auth_connect.js +2 -2
- package/lib/pkg/grpc/scalekit/v1/auth/auth_connect.js.map +1 -1
- package/lib/pkg/grpc/scalekit/v1/auth/auth_pb.d.ts +16 -16
- package/lib/pkg/grpc/scalekit/v1/auth/auth_pb.js +21 -21
- package/lib/pkg/grpc/scalekit/v1/auth/auth_pb.js.map +1 -1
- package/lib/pkg/grpc/scalekit/v1/auth/webauthn_connect.d.ts +82 -0
- package/lib/pkg/grpc/scalekit/v1/auth/webauthn_connect.js +90 -0
- package/lib/pkg/grpc/scalekit/v1/auth/webauthn_connect.js.map +1 -0
- package/lib/pkg/grpc/scalekit/v1/auth/webauthn_pb.d.ts +647 -0
- package/lib/pkg/grpc/scalekit/v1/auth/webauthn_pb.js +993 -0
- package/lib/pkg/grpc/scalekit/v1/auth/webauthn_pb.js.map +1 -0
- package/lib/pkg/grpc/scalekit/v1/commons/commons_pb.d.ts +142 -0
- package/lib/pkg/grpc/scalekit/v1/commons/commons_pb.js +165 -1
- package/lib/pkg/grpc/scalekit/v1/commons/commons_pb.js.map +1 -1
- package/lib/pkg/grpc/scalekit/v1/connections/connections_connect.d.ts +1 -10
- package/lib/pkg/grpc/scalekit/v1/connections/connections_connect.js +0 -9
- package/lib/pkg/grpc/scalekit/v1/connections/connections_connect.js.map +1 -1
- package/lib/pkg/grpc/scalekit/v1/connections/connections_pb.d.ts +28 -63
- package/lib/pkg/grpc/scalekit/v1/connections/connections_pb.js +9 -90
- package/lib/pkg/grpc/scalekit/v1/connections/connections_pb.js.map +1 -1
- package/lib/pkg/grpc/scalekit/v1/users/users_pb.d.ts +2 -2
- package/lib/pkg/grpc/scalekit/v1/users/users_pb.js +1 -1
- package/lib/pkg/grpc/scalekit/v1/users/users_pb.js.map +1 -1
- package/lib/role.d.ts +252 -56
- package/lib/role.js +262 -62
- package/lib/role.js.map +1 -1
- package/lib/scalekit.d.ts +323 -54
- package/lib/scalekit.js +354 -76
- package/lib/scalekit.js.map +1 -1
- package/lib/session.d.ts +235 -22
- package/lib/session.js +237 -24
- package/lib/session.js.map +1 -1
- package/lib/user.d.ts +571 -53
- package/lib/user.js +598 -89
- package/lib/user.js.map +1 -1
- package/lib/webauthn.d.ts +33 -0
- package/lib/webauthn.js +80 -0
- package/lib/webauthn.js.map +1 -0
- package/package.json +2 -2
- package/src/auth.ts +53 -19
- package/src/connection.ts +237 -62
- package/src/core.ts +39 -33
- package/src/directory.ts +356 -98
- package/src/domain.ts +215 -68
- package/src/organization.ts +490 -112
- package/src/permission.ts +234 -88
- package/src/pkg/grpc/scalekit/v1/auth/auth_connect.ts +3 -3
- package/src/pkg/grpc/scalekit/v1/auth/auth_pb.ts +24 -24
- package/src/pkg/grpc/scalekit/v1/auth/webauthn_connect.ts +89 -0
- package/src/pkg/grpc/scalekit/v1/auth/webauthn_pb.ts +1263 -0
- package/src/pkg/grpc/scalekit/v1/commons/commons_pb.ts +217 -0
- package/src/pkg/grpc/scalekit/v1/connections/connections_connect.ts +1 -10
- package/src/pkg/grpc/scalekit/v1/connections/connections_pb.ts +42 -129
- package/src/pkg/grpc/scalekit/v1/users/users_pb.ts +3 -3
- package/src/role.ts +336 -136
- package/src/scalekit.ts +478 -149
- package/src/session.ts +266 -63
- package/src/user.ts +675 -168
- package/src/webauthn.ts +98 -0
package/lib/domain.js
CHANGED
|
@@ -11,6 +11,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const domains_connect_1 = require("./pkg/grpc/scalekit/v1/domains/domains_connect");
|
|
13
13
|
const domains_pb_1 = require("./pkg/grpc/scalekit/v1/domains/domains_pb");
|
|
14
|
+
/**
|
|
15
|
+
* Client for managing domains for organizations.
|
|
16
|
+
*
|
|
17
|
+
* Domains enable automatic organization identification during SSO flows based on user email addresses.
|
|
18
|
+
* You can configure domains as ORGANIZATION_DOMAIN (for SSO routing) or ALLOWED_EMAIL_DOMAIN
|
|
19
|
+
* (for restricting which email domains can automatically join an organization).
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const scalekitClient = new ScalekitClient(envUrl, clientId, clientSecret);
|
|
23
|
+
* const domainClient = scalekitClient.domain;
|
|
24
|
+
*
|
|
25
|
+
* @see {@link https://docs.scalekit.com/apis/#tag/domains | Domain API Documentation}
|
|
26
|
+
*/
|
|
14
27
|
class DomainClient {
|
|
15
28
|
constructor(grpcConncet, coreClient) {
|
|
16
29
|
this.grpcConncet = grpcConncet;
|
|
@@ -18,21 +31,71 @@ class DomainClient {
|
|
|
18
31
|
this.client = this.grpcConncet.createClient(domains_connect_1.DomainService);
|
|
19
32
|
}
|
|
20
33
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
|
|
34
|
+
* Adds a new domain configuration to an organization for SSO routing or user suggestions.
|
|
35
|
+
*
|
|
36
|
+
* Domains serve two purposes based on their type:
|
|
37
|
+
* - **ORGANIZATION_DOMAIN**: Used to identify the SSO connection for the organization. When users
|
|
38
|
+
* authenticate with email addresses from this domain, they're automatically routed to the
|
|
39
|
+
* organization's SSO provider.
|
|
40
|
+
* - **ALLOWED_EMAIL_DOMAIN**: Enables users to join the organization with automatic suggestions
|
|
41
|
+
* in the organization switcher during signup/login.
|
|
42
|
+
*
|
|
43
|
+
* Note: Public disposable domains (gmail.com, outlook.com, etc.) are automatically blocked for security.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} organizationId - The organization ID (format: "org_...")
|
|
46
|
+
* @param {string} name - The domain name (e.g., "acme.com", "example.org")
|
|
47
|
+
* @param {object} [options] - Optional domain configuration
|
|
48
|
+
* @param {DomainType | string} [options.domainType] - Domain type: 'ALLOWED_EMAIL_DOMAIN' or 'ORGANIZATION_DOMAIN'
|
|
49
|
+
*
|
|
50
|
+
* @returns {Promise<CreateDomainResponse>} The created domain with ID and verification status
|
|
51
|
+
*
|
|
52
|
+
* @throws {Error} If domain type is invalid
|
|
53
|
+
* @throws {Error} If domain is a blocked public domain (gmail.com, etc.)
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* // Add SSO routing domain
|
|
57
|
+
* const response = await scalekitClient.domain.createDomain(
|
|
58
|
+
* 'org_123456',
|
|
59
|
+
* 'acme.com',
|
|
60
|
+
* { domainType: 'ORGANIZATION_DOMAIN' }
|
|
61
|
+
* );
|
|
62
|
+
* console.log('Domain created:', response.domain.id);
|
|
63
|
+
* console.log('Verification required:', response.domain.verificationStatus);
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // Add allowed email domain for user suggestions
|
|
67
|
+
* await scalekitClient.domain.createDomain(
|
|
68
|
+
* 'org_123456',
|
|
69
|
+
* 'acme.io',
|
|
70
|
+
* { domainType: 'ALLOWED_EMAIL_DOMAIN' }
|
|
71
|
+
* );
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* // Create domain with default type
|
|
75
|
+
* await scalekitClient.domain.createDomain('org_123456', 'company.com');
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* // Configure multiple domains for an organization
|
|
79
|
+
* const domains = ['acme.com', 'acme.io', 'acme.net'];
|
|
80
|
+
* for (const domain of domains) {
|
|
81
|
+
* await scalekitClient.domain.createDomain('org_123456', domain, {
|
|
82
|
+
* domainType: 'ORGANIZATION_DOMAIN'
|
|
83
|
+
* });
|
|
84
|
+
* }
|
|
85
|
+
*
|
|
86
|
+
* @see {@link https://docs.scalekit.com/apis/#tag/domains | Create Domain API}
|
|
87
|
+
* @see {@link listDomains} - List all domains for an organization
|
|
88
|
+
* @see {@link deleteDomain} - Remove a domain
|
|
89
|
+
*/
|
|
28
90
|
createDomain(organizationId, name, options) {
|
|
29
91
|
return __awaiter(this, void 0, void 0, function* () {
|
|
30
92
|
let domainTypeValue;
|
|
31
93
|
if (options === null || options === void 0 ? void 0 : options.domainType) {
|
|
32
|
-
if (typeof options.domainType ===
|
|
33
|
-
domainTypeValue =
|
|
94
|
+
if (typeof options.domainType === "string") {
|
|
95
|
+
domainTypeValue =
|
|
96
|
+
domains_pb_1.DomainType[options.domainType];
|
|
34
97
|
if (domainTypeValue === undefined) {
|
|
35
|
-
throw new Error(
|
|
98
|
+
throw new Error("Invalid domain type");
|
|
36
99
|
}
|
|
37
100
|
}
|
|
38
101
|
else {
|
|
@@ -41,53 +104,139 @@ class DomainClient {
|
|
|
41
104
|
}
|
|
42
105
|
return this.coreClient.connectExec(this.client.createDomain, {
|
|
43
106
|
identities: {
|
|
44
|
-
case:
|
|
45
|
-
value: organizationId
|
|
107
|
+
case: "organizationId",
|
|
108
|
+
value: organizationId,
|
|
46
109
|
},
|
|
47
|
-
domain: Object.assign({ domain: name }, (domainTypeValue && { domainType: domainTypeValue }))
|
|
110
|
+
domain: Object.assign({ domain: name }, (domainTypeValue && { domainType: domainTypeValue })),
|
|
48
111
|
});
|
|
49
112
|
});
|
|
50
113
|
}
|
|
51
114
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
115
|
+
* Retrieves detailed information about a specific domain configuration.
|
|
116
|
+
*
|
|
117
|
+
* Returns complete domain details including the domain name, type (ORGANIZATION_DOMAIN or
|
|
118
|
+
* ALLOWED_EMAIL_DOMAIN), verification status, and when it was created/updated. Use this to
|
|
119
|
+
* check domain configuration status or verification requirements.
|
|
120
|
+
*
|
|
121
|
+
* @param {string} organizationId - The organization ID (format: "org_...")
|
|
122
|
+
* @param {string} domainId - The domain ID (format: "domain_...")
|
|
123
|
+
*
|
|
124
|
+
* @returns {Promise<GetDomainResponse>} Complete domain configuration and status
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* // Check domain verification status
|
|
128
|
+
* const response = await scalekitClient.domain.getDomain(
|
|
129
|
+
* 'org_123456',
|
|
130
|
+
* 'domain_abc123'
|
|
131
|
+
* );
|
|
132
|
+
* console.log('Domain:', response.domain.domain);
|
|
133
|
+
* console.log('Type:', response.domain.domainType);
|
|
134
|
+
* console.log('Verified:', response.domain.verificationStatus);
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* // Verify domain configuration after creation
|
|
138
|
+
* const created = await scalekitClient.domain.createDomain(
|
|
139
|
+
* 'org_123456',
|
|
140
|
+
* 'acme.com',
|
|
141
|
+
* { domainType: 'ORGANIZATION_DOMAIN' }
|
|
142
|
+
* );
|
|
143
|
+
*
|
|
144
|
+
* // Later, check if domain has been verified
|
|
145
|
+
* const domain = await scalekitClient.domain.getDomain(
|
|
146
|
+
* 'org_123456',
|
|
147
|
+
* created.domain.id
|
|
148
|
+
* );
|
|
149
|
+
* if (domain.domain.verificationStatus === 'VERIFIED') {
|
|
150
|
+
* console.log('Domain is ready for SSO routing');
|
|
151
|
+
* }
|
|
152
|
+
*
|
|
153
|
+
* @see {@link https://docs.scalekit.com/apis/#tag/domains | Get Domain API}
|
|
154
|
+
* @see {@link createDomain} - Add a new domain
|
|
155
|
+
* @see {@link listDomains} - List all domains for an organization
|
|
56
156
|
*/
|
|
57
157
|
getDomain(organizationId, domainId) {
|
|
58
158
|
return __awaiter(this, void 0, void 0, function* () {
|
|
59
159
|
return this.coreClient.connectExec(this.client.getDomain, {
|
|
60
160
|
id: domainId,
|
|
61
161
|
identities: {
|
|
62
|
-
case:
|
|
63
|
-
value: organizationId
|
|
64
|
-
}
|
|
162
|
+
case: "organizationId",
|
|
163
|
+
value: organizationId,
|
|
164
|
+
},
|
|
65
165
|
});
|
|
66
166
|
});
|
|
67
167
|
}
|
|
68
168
|
/**
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
169
|
+
* Retrieves all domain configurations for an organization.
|
|
170
|
+
*
|
|
171
|
+
* Returns a complete list of domains configured for the organization, including both
|
|
172
|
+
* ORGANIZATION_DOMAIN (for SSO routing) and ALLOWED_EMAIL_DOMAIN (for user suggestions).
|
|
173
|
+
* Each domain includes its verification status, type, and configuration details.
|
|
174
|
+
*
|
|
175
|
+
* Use this to audit domain configuration, check which domains are verified, or display
|
|
176
|
+
* domain settings in an admin dashboard.
|
|
177
|
+
*
|
|
178
|
+
* @param {string} organizationId - The organization ID (format: "org_...")
|
|
179
|
+
*
|
|
180
|
+
* @returns {Promise<ListDomainResponse>} List of all domains with their configurations
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* // List all domains for an organization
|
|
184
|
+
* const response = await scalekitClient.domain.listDomains('org_123456');
|
|
185
|
+
* console.log(`Found ${response.domains.length} domains`);
|
|
186
|
+
* response.domains.forEach(domain => {
|
|
187
|
+
* console.log(`- ${domain.domain} (${domain.domainType}): ${domain.verificationStatus}`);
|
|
188
|
+
* });
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* // Check which domains are verified for SSO
|
|
192
|
+
* const response = await scalekitClient.domain.listDomains('org_123456');
|
|
193
|
+
* const verifiedSSODomains = response.domains.filter(
|
|
194
|
+
* d => d.domainType === 'ORGANIZATION_DOMAIN' && d.verificationStatus === 'VERIFIED'
|
|
195
|
+
* );
|
|
196
|
+
* console.log('Verified SSO domains:', verifiedSSODomains.map(d => d.domain));
|
|
197
|
+
* @see {@link https://docs.scalekit.com/apis/#tag/domains | List Domains API}
|
|
198
|
+
* @see {@link createDomain} - Add a new domain
|
|
199
|
+
* @see {@link getDomain} - Get details for a specific domain
|
|
200
|
+
* @see {@link deleteDomain} - Remove a domain
|
|
72
201
|
*/
|
|
73
202
|
listDomains(organizationId) {
|
|
74
203
|
return __awaiter(this, void 0, void 0, function* () {
|
|
75
204
|
return this.coreClient.connectExec(this.client.listDomains, {
|
|
76
205
|
identities: {
|
|
77
|
-
case:
|
|
78
|
-
value: organizationId
|
|
79
|
-
}
|
|
206
|
+
case: "organizationId",
|
|
207
|
+
value: organizationId,
|
|
208
|
+
},
|
|
80
209
|
});
|
|
81
210
|
});
|
|
82
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* Deletes a domain from an organization.
|
|
214
|
+
*
|
|
215
|
+
* Removes the domain configuration from the organization. Users with email addresses from
|
|
216
|
+
* this domain will no longer be automatically routed to this organization's SSO connection.
|
|
217
|
+
*
|
|
218
|
+
* @param {string} organizationId - The organization ID
|
|
219
|
+
* @param {string} domainId - The domain ID to delete
|
|
220
|
+
*
|
|
221
|
+
* @returns {Promise<Empty>} Empty response on successful deletion
|
|
222
|
+
*
|
|
223
|
+
* @example
|
|
224
|
+
* // Remove a domain from an organization
|
|
225
|
+
* await scalekitClient.domain.deleteDomain('org_123456', 'domain_abc123');
|
|
226
|
+
* console.log('Domain deleted successfully');
|
|
227
|
+
*
|
|
228
|
+
* @see {@link https://docs.scalekit.com/apis/#tag/domains | Delete Domain API}
|
|
229
|
+
* @see {@link createDomain} - Add a new domain
|
|
230
|
+
* @see {@link listDomains} - List all domains for an organization
|
|
231
|
+
*/
|
|
83
232
|
deleteDomain(organizationId, domainId) {
|
|
84
233
|
return __awaiter(this, void 0, void 0, function* () {
|
|
85
234
|
return this.coreClient.connectExec(this.client.deleteDomain, {
|
|
86
235
|
id: domainId,
|
|
87
236
|
identities: {
|
|
88
|
-
case:
|
|
89
|
-
value: organizationId
|
|
90
|
-
}
|
|
237
|
+
case: "organizationId",
|
|
238
|
+
value: organizationId,
|
|
239
|
+
},
|
|
91
240
|
});
|
|
92
241
|
});
|
|
93
242
|
}
|
package/lib/domain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,oFAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../src/domain.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,oFAA+E;AAC/E,0EAKmD;AAGnD;;;;;;;;;;;;GAYG;AACH,MAAqB,YAAY;IAE/B,YACmB,WAAwB,EACxB,UAAsB;QADtB,gBAAW,GAAX,WAAW,CAAa;QACxB,eAAU,GAAV,UAAU,CAAY;QAEvC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,+BAAa,CAAC,CAAC;IAC7D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwDG;IACG,YAAY,CAChB,cAAsB,EACtB,IAAY,EACZ,OAA8C;;YAE9C,IAAI,eAAuC,CAAC;YAC5C,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,EAAE,CAAC;gBACxB,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;oBAC3C,eAAe;wBACb,uBAAU,CAAC,OAAO,CAAC,UAAqC,CAAC,CAAC;oBAC5D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;wBAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC3D,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;gBACD,MAAM,kBACJ,MAAM,EAAE,IAAI,IACT,CAAC,eAAe,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CACxD;aACF,CAAC,CAAC;QACL,CAAC;KAAA;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CG;IACG,SAAS,CACb,cAAsB,EACtB,QAAgB;;YAEhB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;gBACxD,EAAE,EAAE,QAAQ;gBACZ,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;KAAA;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACG,WAAW,CAAC,cAAsB;;YACtC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBAC1D,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;KAAA;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACG,YAAY,CAAC,cAAsB,EAAE,QAAgB;;YACzD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;gBAC3D,EAAE,EAAE,QAAQ;gBACZ,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAhOD,+BAgOC"}
|