@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.
Files changed (82) hide show
  1. package/buf.gen.yaml +1 -0
  2. package/lib/auth.d.ts +41 -9
  3. package/lib/auth.js +44 -12
  4. package/lib/auth.js.map +1 -1
  5. package/lib/connection.d.ts +195 -21
  6. package/lib/connection.js +197 -23
  7. package/lib/connection.js.map +1 -1
  8. package/lib/core.d.ts +2 -2
  9. package/lib/core.js +13 -12
  10. package/lib/core.js.map +1 -1
  11. package/lib/directory.d.ts +293 -40
  12. package/lib/directory.js +308 -44
  13. package/lib/directory.js.map +1 -1
  14. package/lib/domain.d.ts +166 -18
  15. package/lib/domain.js +178 -29
  16. package/lib/domain.js.map +1 -1
  17. package/lib/organization.d.ts +404 -44
  18. package/lib/organization.js +419 -54
  19. package/lib/organization.js.map +1 -1
  20. package/lib/permission.d.ts +179 -35
  21. package/lib/permission.js +190 -38
  22. package/lib/permission.js.map +1 -1
  23. package/lib/pkg/grpc/scalekit/v1/auth/auth_connect.d.ts +3 -3
  24. package/lib/pkg/grpc/scalekit/v1/auth/auth_connect.js +2 -2
  25. package/lib/pkg/grpc/scalekit/v1/auth/auth_connect.js.map +1 -1
  26. package/lib/pkg/grpc/scalekit/v1/auth/auth_pb.d.ts +16 -16
  27. package/lib/pkg/grpc/scalekit/v1/auth/auth_pb.js +21 -21
  28. package/lib/pkg/grpc/scalekit/v1/auth/auth_pb.js.map +1 -1
  29. package/lib/pkg/grpc/scalekit/v1/auth/webauthn_connect.d.ts +82 -0
  30. package/lib/pkg/grpc/scalekit/v1/auth/webauthn_connect.js +90 -0
  31. package/lib/pkg/grpc/scalekit/v1/auth/webauthn_connect.js.map +1 -0
  32. package/lib/pkg/grpc/scalekit/v1/auth/webauthn_pb.d.ts +647 -0
  33. package/lib/pkg/grpc/scalekit/v1/auth/webauthn_pb.js +993 -0
  34. package/lib/pkg/grpc/scalekit/v1/auth/webauthn_pb.js.map +1 -0
  35. package/lib/pkg/grpc/scalekit/v1/commons/commons_pb.d.ts +142 -0
  36. package/lib/pkg/grpc/scalekit/v1/commons/commons_pb.js +165 -1
  37. package/lib/pkg/grpc/scalekit/v1/commons/commons_pb.js.map +1 -1
  38. package/lib/pkg/grpc/scalekit/v1/connections/connections_connect.d.ts +1 -10
  39. package/lib/pkg/grpc/scalekit/v1/connections/connections_connect.js +0 -9
  40. package/lib/pkg/grpc/scalekit/v1/connections/connections_connect.js.map +1 -1
  41. package/lib/pkg/grpc/scalekit/v1/connections/connections_pb.d.ts +28 -63
  42. package/lib/pkg/grpc/scalekit/v1/connections/connections_pb.js +9 -90
  43. package/lib/pkg/grpc/scalekit/v1/connections/connections_pb.js.map +1 -1
  44. package/lib/pkg/grpc/scalekit/v1/users/users_pb.d.ts +2 -2
  45. package/lib/pkg/grpc/scalekit/v1/users/users_pb.js +1 -1
  46. package/lib/pkg/grpc/scalekit/v1/users/users_pb.js.map +1 -1
  47. package/lib/role.d.ts +252 -56
  48. package/lib/role.js +262 -62
  49. package/lib/role.js.map +1 -1
  50. package/lib/scalekit.d.ts +323 -54
  51. package/lib/scalekit.js +354 -76
  52. package/lib/scalekit.js.map +1 -1
  53. package/lib/session.d.ts +235 -22
  54. package/lib/session.js +237 -24
  55. package/lib/session.js.map +1 -1
  56. package/lib/user.d.ts +571 -53
  57. package/lib/user.js +598 -89
  58. package/lib/user.js.map +1 -1
  59. package/lib/webauthn.d.ts +33 -0
  60. package/lib/webauthn.js +80 -0
  61. package/lib/webauthn.js.map +1 -0
  62. package/package.json +2 -2
  63. package/src/auth.ts +53 -19
  64. package/src/connection.ts +237 -62
  65. package/src/core.ts +39 -33
  66. package/src/directory.ts +356 -98
  67. package/src/domain.ts +215 -68
  68. package/src/organization.ts +490 -112
  69. package/src/permission.ts +234 -88
  70. package/src/pkg/grpc/scalekit/v1/auth/auth_connect.ts +3 -3
  71. package/src/pkg/grpc/scalekit/v1/auth/auth_pb.ts +24 -24
  72. package/src/pkg/grpc/scalekit/v1/auth/webauthn_connect.ts +89 -0
  73. package/src/pkg/grpc/scalekit/v1/auth/webauthn_pb.ts +1263 -0
  74. package/src/pkg/grpc/scalekit/v1/commons/commons_pb.ts +217 -0
  75. package/src/pkg/grpc/scalekit/v1/connections/connections_connect.ts +1 -10
  76. package/src/pkg/grpc/scalekit/v1/connections/connections_pb.ts +42 -129
  77. package/src/pkg/grpc/scalekit/v1/users/users_pb.ts +3 -3
  78. package/src/role.ts +336 -136
  79. package/src/scalekit.ts +478 -149
  80. package/src/session.ts +266 -63
  81. package/src/user.ts +675 -168
  82. 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
- * Create a domain for an organization with the given name. Optionally, you can provide an external id.
22
- * @param {string} organizationId The organization id
23
- * @param {string} name The domain name
24
- * @param {object} options The options to create a domain
25
- * @param {DomainType | string} options.domainType The type of domain (ALLOWED_EMAIL_DOMAIN or ORGANIZATION_DOMAIN)
26
- * @returns {Promise<CreateDomainResponse>} The created domain
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 === 'string') {
33
- domainTypeValue = domains_pb_1.DomainType[options.domainType];
94
+ if (typeof options.domainType === "string") {
95
+ domainTypeValue =
96
+ domains_pb_1.DomainType[options.domainType];
34
97
  if (domainTypeValue === undefined) {
35
- throw new Error('Invalid domain type');
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: 'organizationId',
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
- * Get a specific domain by ID for an organization
53
- * @param organizationId The organization id
54
- * @param domainId The domain id
55
- * @returns {Promise<GetDomainResponse>} The domain details
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: 'organizationId',
63
- value: organizationId
64
- }
162
+ case: "organizationId",
163
+ value: organizationId,
164
+ },
65
165
  });
66
166
  });
67
167
  }
68
168
  /**
69
- * List domains for an organization
70
- * @param organizationId The organization id
71
- * @returns {Promise<ListDomainResponse>} The list of domains for the organization
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: 'organizationId',
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: 'organizationId',
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,0EAAoI;AAGpI,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;;;;;;;MAOE;IACI,YAAY,CAAC,cAAsB,EAAE,IAAY,EAAE,OAA8C;;YACrG,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,GAAG,uBAAU,CAAC,OAAO,CAAC,UAAqC,CAAC,CAAC;oBAC5E,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,CAChC,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB;gBACE,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,CACF,CAAA;QACH,CAAC;KAAA;IAED;;;;;OAKG;IACG,SAAS,CAAC,cAAsB,EAAE,QAAgB;;YACtD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB;gBACE,EAAE,EAAE,QAAQ;gBACZ,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;aACF,CACF,CAAC;QACJ,CAAC;KAAA;IAED;;;;OAIG;IACG,WAAW,CAAC,cAAsB;;YACtC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,IAAI,CAAC,MAAM,CAAC,WAAW,EACvB;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;aACF,CACF,CAAC;QACJ,CAAC;KAAA;IAEK,YAAY,CAAC,cAAsB,EAAE,QAAgB;;YACzD,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAChC,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB;gBACE,EAAE,EAAE,QAAQ;gBACZ,UAAU,EAAE;oBACV,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,cAAc;iBACtB;aACF,CACF,CAAC;QACJ,CAAC;KAAA;CAEF;AA9FD,+BA8FC"}
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"}