@sdkgen/node-runtime 2.3.2 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/api-config.js +19 -0
  2. package/dist/{src/context.d.ts → context.d.ts} +1 -0
  3. package/dist/context.js +3 -0
  4. package/dist/encode-decode.js +344 -0
  5. package/dist/error.js +33 -0
  6. package/dist/execute.js +57 -0
  7. package/dist/http-client.js +107 -0
  8. package/dist/{src/http-server.d.ts → http-server.d.ts} +1 -0
  9. package/dist/http-server.js +941 -0
  10. package/dist/{src/index.js → index.js} +1 -0
  11. package/dist/swagger.js +454 -0
  12. package/dist/test-wrapper.js +58 -0
  13. package/dist/utils.js +8 -0
  14. package/package.json +50 -34
  15. package/.eslintignore +0 -1
  16. package/.eslintrc.json +0 -3
  17. package/.prettierrc +0 -12
  18. package/.vscode/settings.json +0 -14
  19. package/dist/spec/error.spec.d.ts +0 -1
  20. package/dist/spec/error.spec.js +0 -15
  21. package/dist/spec/rest/rest.spec.d.ts +0 -1
  22. package/dist/spec/rest/rest.spec.js +0 -353
  23. package/dist/spec/runtime/errors.spec.d.ts +0 -1
  24. package/dist/spec/runtime/errors.spec.js +0 -43
  25. package/dist/spec/runtime/middleware.spec.d.ts +0 -1
  26. package/dist/spec/runtime/middleware.spec.js +0 -100
  27. package/dist/spec/simple/legacyNodeClient.d.ts +0 -17
  28. package/dist/spec/simple/legacyNodeClient.js +0 -128
  29. package/dist/spec/simple/simple.spec.d.ts +0 -1
  30. package/dist/spec/simple/simple.spec.js +0 -113
  31. package/dist/spec/types.d.ts +0 -1
  32. package/dist/spec/types.js +0 -60
  33. package/dist/spec/types.spec.d.ts +0 -1
  34. package/dist/spec/types.spec.js +0 -128
  35. package/dist/src/api-config.js +0 -19
  36. package/dist/src/context.js +0 -2
  37. package/dist/src/encode-decode.js +0 -376
  38. package/dist/src/error.js +0 -32
  39. package/dist/src/execute.js +0 -56
  40. package/dist/src/http-client.js +0 -105
  41. package/dist/src/http-server.js +0 -941
  42. package/dist/src/swagger.js +0 -439
  43. package/dist/src/test-wrapper.js +0 -52
  44. package/dist/src/utils.js +0 -7
  45. package/dist/tsconfig.tsbuildinfo +0 -1
  46. /package/dist/{src/api-config.d.ts → api-config.d.ts} +0 -0
  47. /package/dist/{src/encode-decode.d.ts → encode-decode.d.ts} +0 -0
  48. /package/dist/{src/error.d.ts → error.d.ts} +0 -0
  49. /package/dist/{src/execute.d.ts → execute.d.ts} +0 -0
  50. /package/dist/{src/http-client.d.ts → http-client.d.ts} +0 -0
  51. /package/dist/{src/index.d.ts → index.d.ts} +0 -0
  52. /package/dist/{src/swagger.d.ts → swagger.d.ts} +0 -0
  53. /package/dist/{src/test-wrapper.d.ts → test-wrapper.d.ts} +0 -0
  54. /package/dist/{src/utils.d.ts → utils.d.ts} +0 -0
@@ -16,3 +16,4 @@ var http_server_1 = require("./http-server");
16
16
  Object.defineProperty(exports, "SdkgenHttpServer", { enumerable: true, get: function () { return http_server_1.SdkgenHttpServer; } });
17
17
  var test_wrapper_1 = require("./test-wrapper");
18
18
  Object.defineProperty(exports, "apiTestWrapper", { enumerable: true, get: function () { return test_wrapper_1.apiTestWrapper; } });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQTZDO0FBQXBDLDJHQUFBLGFBQWEsT0FBQTtBQUV0QixpREFBMkU7QUFBbEUsdUdBQUEsTUFBTSxPQUFBO0FBQUUsdUdBQUEsTUFBTSxPQUFBO0FBQ3ZCLGlDQUFrRTtBQUF6RCw4RkFBQSxLQUFLLE9BQUE7QUFBRSxvR0FBQSxXQUFXLE9BQUE7QUFBRSw0R0FBQSxtQkFBbUIsT0FBQTtBQUNoRCw2Q0FBaUQ7QUFBeEMsK0dBQUEsZ0JBQWdCLE9BQUE7QUFDekIsNkNBQWlEO0FBQXhDLCtHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLCtDQUFnRDtBQUF2Qyw4R0FBQSxjQUFjLE9BQUEifQ==
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupSwagger = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const parser_1 = require("@sdkgen/parser");
6
+ const serve_handler_1 = tslib_1.__importDefault(require("serve-handler"));
7
+ const swagger_ui_dist_1 = require("swagger-ui-dist");
8
+ const swaggerUiAssetPath = (0, swagger_ui_dist_1.getAbsoluteFSPath)();
9
+ function objectFromEntries(entries) {
10
+ return Object.assign({}, ...Array.from(entries, ([k, v]) => ({ [k]: v })));
11
+ }
12
+ function typeToSchema(definitions, type) {
13
+ if (type instanceof parser_1.EnumType) {
14
+ return {
15
+ enum: type.values.map(x => x.value),
16
+ type: "string",
17
+ };
18
+ }
19
+ else if (type instanceof parser_1.StructType) {
20
+ return {
21
+ properties: objectFromEntries(type.fields.map(field => [
22
+ field.name,
23
+ {
24
+ description: field.annotations
25
+ .filter(x => x instanceof parser_1.DescriptionAnnotation)
26
+ .map(x => x.text)
27
+ .join(" ") || undefined,
28
+ ...typeToSchema(definitions, field.type),
29
+ },
30
+ ])),
31
+ required: type.fields.filter(f => !(f.type instanceof parser_1.OptionalType)).map(f => f.name),
32
+ type: "object",
33
+ additionalProperties: false,
34
+ };
35
+ }
36
+ else if (type instanceof parser_1.StringPrimitiveType ||
37
+ type instanceof parser_1.UuidPrimitiveType ||
38
+ type instanceof parser_1.HexPrimitiveType ||
39
+ type instanceof parser_1.HtmlPrimitiveType ||
40
+ type instanceof parser_1.Base64PrimitiveType) {
41
+ return {
42
+ type: "string",
43
+ };
44
+ }
45
+ else if (type instanceof parser_1.UrlPrimitiveType) {
46
+ return {
47
+ format: "uri",
48
+ type: "string",
49
+ };
50
+ }
51
+ else if (type instanceof parser_1.DatePrimitiveType) {
52
+ return {
53
+ format: "date",
54
+ type: "string",
55
+ };
56
+ }
57
+ else if (type instanceof parser_1.DateTimePrimitiveType) {
58
+ return {
59
+ format: "date-time",
60
+ type: "string",
61
+ };
62
+ }
63
+ else if (type instanceof parser_1.CpfPrimitiveType) {
64
+ return {
65
+ type: "string",
66
+ };
67
+ }
68
+ else if (type instanceof parser_1.CnpjPrimitiveType) {
69
+ return {
70
+ type: "string",
71
+ };
72
+ }
73
+ else if (type instanceof parser_1.BoolPrimitiveType) {
74
+ return {
75
+ type: "boolean",
76
+ };
77
+ }
78
+ else if (type instanceof parser_1.BytesPrimitiveType) {
79
+ return {
80
+ format: "byte",
81
+ type: "string",
82
+ };
83
+ }
84
+ else if (type instanceof parser_1.IntPrimitiveType) {
85
+ return {
86
+ format: "int32",
87
+ type: "integer",
88
+ };
89
+ }
90
+ else if (type instanceof parser_1.UIntPrimitiveType) {
91
+ return {
92
+ format: "int32",
93
+ minimum: 0,
94
+ type: "integer",
95
+ };
96
+ }
97
+ else if (type instanceof parser_1.MoneyPrimitiveType) {
98
+ return {
99
+ format: "int64",
100
+ type: "integer",
101
+ };
102
+ }
103
+ else if (type instanceof parser_1.FloatPrimitiveType) {
104
+ return {
105
+ type: "number",
106
+ };
107
+ }
108
+ else if (type instanceof parser_1.EmailPrimitiveType) {
109
+ return {
110
+ type: "string",
111
+ };
112
+ }
113
+ else if (type instanceof parser_1.BigIntPrimitiveType) {
114
+ return {
115
+ type: "string",
116
+ };
117
+ }
118
+ else if (type instanceof parser_1.DecimalPrimitiveType) {
119
+ return {
120
+ type: "string",
121
+ };
122
+ }
123
+ else if (type instanceof parser_1.JsonPrimitiveType) {
124
+ return {};
125
+ }
126
+ else if (type instanceof parser_1.OptionalType) {
127
+ return {
128
+ oneOf: [typeToSchema(definitions, type.base), { type: "null" }],
129
+ };
130
+ }
131
+ else if (type instanceof parser_1.ArrayType) {
132
+ return {
133
+ items: typeToSchema(definitions, type.base),
134
+ type: "array",
135
+ };
136
+ }
137
+ else if (type instanceof parser_1.TypeReference) {
138
+ if (!definitions[type.name]) {
139
+ definitions[type.name] = typeToSchema(definitions, type.type);
140
+ }
141
+ return { $ref: `#/components/schemas/${type.name}` };
142
+ }
143
+ throw new Error(`Unhandled type ${type.constructor.name}`);
144
+ }
145
+ function getSwaggerJson(apiConfig) {
146
+ const schemas = {};
147
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
148
+ const paths = {};
149
+ for (const op of apiConfig.ast.operations) {
150
+ const tagAnnotations = op.annotations.filter(ann => ann instanceof parser_1.TagAnnotation);
151
+ const throwAnnotations = op.annotations.filter(ann => ann instanceof parser_1.ThrowsAnnotation);
152
+ let possibleErrors = throwAnnotations.map(ann => apiConfig.ast.errors.find(err => err.name === ann.error)).filter(x => x);
153
+ if (possibleErrors.length === 0) {
154
+ possibleErrors = apiConfig.ast.errors;
155
+ }
156
+ const errorsByStatus = new Map();
157
+ for (const error of possibleErrors) {
158
+ const statusAnnotation = error.annotations.find(ann => ann instanceof parser_1.StatusCodeAnnotation);
159
+ const statusCode = statusAnnotation ? statusAnnotation.statusCode : error.name === "Fatal" ? 500 : 400;
160
+ const errorList = errorsByStatus.get(statusCode) ?? [];
161
+ errorList.push(error);
162
+ errorsByStatus.set(statusCode, errorList);
163
+ }
164
+ const errorResponses = Object.fromEntries([...errorsByStatus.entries()].map(([status, errors]) => [
165
+ status,
166
+ {
167
+ description: errors
168
+ .map(error => error.name)
169
+ .sort((a, b) => a.localeCompare(b))
170
+ .join("<br>"),
171
+ content: {
172
+ "application/json": {
173
+ schema: {
174
+ anyOf: errors.map(error => ({
175
+ properties: {
176
+ message: {
177
+ type: "string",
178
+ },
179
+ type: {
180
+ enum: [error.name],
181
+ type: "string",
182
+ },
183
+ ...(error.dataType instanceof parser_1.VoidPrimitiveType
184
+ ? {}
185
+ : {
186
+ data: typeToSchema(schemas, error.dataType),
187
+ }),
188
+ },
189
+ required: ["type", "message", ...(error.dataType instanceof parser_1.VoidPrimitiveType ? [] : ["data"])],
190
+ type: "object",
191
+ additionalProperties: false,
192
+ })),
193
+ },
194
+ },
195
+ },
196
+ },
197
+ ]));
198
+ for (const ann of op.annotations) {
199
+ if (ann instanceof parser_1.RestAnnotation) {
200
+ if (!paths[ann.path]) {
201
+ paths[ann.path] = {};
202
+ }
203
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
204
+ paths[ann.path][ann.method.toLowerCase()] = {
205
+ operationId: op.name,
206
+ parameters: [
207
+ ...ann.pathVariables.map(name => ({
208
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
209
+ arg: op.args.find(arg => arg.name === name),
210
+ location: "path",
211
+ name,
212
+ })),
213
+ ...ann.queryVariables.map(name => ({
214
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
215
+ arg: op.args.find(arg => arg.name === name),
216
+ location: "query",
217
+ name,
218
+ })),
219
+ ...[...ann.headers.entries()].map(([header, name]) => ({
220
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
221
+ arg: op.args.find(arg => arg.name === name),
222
+ location: "header",
223
+ name: header,
224
+ })),
225
+ ].map(({ name, location, arg }) => ({
226
+ description: arg.annotations
227
+ .filter(x => x instanceof parser_1.DescriptionAnnotation)
228
+ .map(x => x.text)
229
+ .join(" ") || undefined,
230
+ in: location,
231
+ name,
232
+ required: !(arg.type instanceof parser_1.OptionalType),
233
+ schema: typeToSchema(schemas, arg.type),
234
+ })),
235
+ requestBody: ann.bodyVariable
236
+ ? {
237
+ content: {
238
+ ...(() => {
239
+ const bodyType = op.args.find(arg => arg.name === ann.bodyVariable)?.type;
240
+ return bodyType instanceof parser_1.BoolPrimitiveType ||
241
+ bodyType instanceof parser_1.IntPrimitiveType ||
242
+ bodyType instanceof parser_1.UIntPrimitiveType ||
243
+ bodyType instanceof parser_1.FloatPrimitiveType ||
244
+ bodyType instanceof parser_1.StringPrimitiveType ||
245
+ bodyType instanceof parser_1.DatePrimitiveType ||
246
+ bodyType instanceof parser_1.DateTimePrimitiveType ||
247
+ bodyType instanceof parser_1.MoneyPrimitiveType ||
248
+ bodyType instanceof parser_1.CpfPrimitiveType ||
249
+ bodyType instanceof parser_1.CnpjPrimitiveType ||
250
+ bodyType instanceof parser_1.EmailPrimitiveType ||
251
+ bodyType instanceof parser_1.HtmlPrimitiveType ||
252
+ bodyType instanceof parser_1.UuidPrimitiveType ||
253
+ bodyType instanceof parser_1.HexPrimitiveType ||
254
+ bodyType instanceof parser_1.BytesPrimitiveType ||
255
+ bodyType instanceof parser_1.Base64PrimitiveType
256
+ ? {
257
+ [bodyType instanceof parser_1.HtmlPrimitiveType ? "text/html" : "text/plain"]: {
258
+ schema: typeToSchema(schemas, bodyType),
259
+ },
260
+ }
261
+ : {};
262
+ })(),
263
+ "application/json": {
264
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
265
+ schema: typeToSchema(schemas, op.args.find(arg => arg.name === ann.bodyVariable).type),
266
+ },
267
+ },
268
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
269
+ required: !(op.args.find(arg => arg.name === ann.bodyVariable).type instanceof parser_1.OptionalType),
270
+ }
271
+ : undefined,
272
+ responses: {
273
+ ...(op.returnType instanceof parser_1.OptionalType || op.returnType instanceof parser_1.VoidPrimitiveType
274
+ ? { [ann.method === "GET" ? "404" : "204"]: {} }
275
+ : {}),
276
+ ...(op.returnType instanceof parser_1.VoidPrimitiveType
277
+ ? {}
278
+ : {
279
+ 200: {
280
+ description: "",
281
+ content: {
282
+ ...(() => {
283
+ return op.returnType instanceof parser_1.BoolPrimitiveType ||
284
+ op.returnType instanceof parser_1.IntPrimitiveType ||
285
+ op.returnType instanceof parser_1.UIntPrimitiveType ||
286
+ op.returnType instanceof parser_1.FloatPrimitiveType ||
287
+ op.returnType instanceof parser_1.StringPrimitiveType ||
288
+ op.returnType instanceof parser_1.DatePrimitiveType ||
289
+ op.returnType instanceof parser_1.DateTimePrimitiveType ||
290
+ op.returnType instanceof parser_1.MoneyPrimitiveType ||
291
+ op.returnType instanceof parser_1.CpfPrimitiveType ||
292
+ op.returnType instanceof parser_1.CnpjPrimitiveType ||
293
+ op.returnType instanceof parser_1.EmailPrimitiveType ||
294
+ op.returnType instanceof parser_1.UuidPrimitiveType ||
295
+ op.returnType instanceof parser_1.HexPrimitiveType ||
296
+ op.returnType instanceof parser_1.BytesPrimitiveType ||
297
+ op.returnType instanceof parser_1.Base64PrimitiveType
298
+ ? {
299
+ "text/plain": {
300
+ schema: typeToSchema(schemas, op.returnType),
301
+ },
302
+ }
303
+ : {};
304
+ })(),
305
+ "application/json": {
306
+ schema: typeToSchema(schemas, op.returnType),
307
+ },
308
+ },
309
+ },
310
+ }),
311
+ ...errorResponses,
312
+ },
313
+ summary: op.annotations
314
+ .filter(x => x instanceof parser_1.DescriptionAnnotation)
315
+ .map(x => x.text)
316
+ .join(" ") || undefined,
317
+ tags: tagAnnotations.length > 0 ? tagAnnotations.map(tag => tag.tag) : [ann.path.split("/")[1]],
318
+ };
319
+ }
320
+ }
321
+ }
322
+ const securitySchemes = {
323
+ bearerAuth: {
324
+ type: "http",
325
+ scheme: "bearer",
326
+ },
327
+ };
328
+ const security = [
329
+ {
330
+ bearerAuth: [],
331
+ },
332
+ ];
333
+ return {
334
+ openapi: "3.0.0",
335
+ info: {
336
+ title: "",
337
+ version: "",
338
+ },
339
+ paths,
340
+ components: {
341
+ schemas,
342
+ securitySchemes,
343
+ },
344
+ security,
345
+ };
346
+ }
347
+ function setupSwagger(server) {
348
+ server.addHttpHandler("GET", "/swagger", (req, res) => {
349
+ if (!server.introspection) {
350
+ res.statusCode = 404;
351
+ res.end();
352
+ return;
353
+ }
354
+ res.setHeader("content-type", "text/html");
355
+ res.write(`
356
+ <!DOCTYPE html>
357
+ <html lang="en">
358
+ <head>
359
+ <meta charset="UTF-8">
360
+ <title>Swagger UI</title>
361
+ <link rel="stylesheet" type="text/css" href="/swagger/swagger-ui.css" >
362
+ <link rel="icon" type="image/png" href="/swagger/favicon-32x32.png" sizes="32x32" />
363
+ <link rel="icon" type="image/png" href="/swagger/favicon-16x16.png" sizes="16x16" />
364
+ <style>
365
+ html {
366
+ box-sizing: border-box;
367
+ overflow: -moz-scrollbars-vertical;
368
+ overflow-y: scroll;
369
+ }
370
+
371
+ *, *:before, *:after {
372
+ box-sizing: inherit;
373
+ }
374
+
375
+ body {
376
+ margin: 0;
377
+ background: #fafafa;
378
+ }
379
+
380
+ .topbar {
381
+ display: none !important;
382
+ }
383
+ </style>
384
+ </head>
385
+
386
+ <body>
387
+ <div id="swagger-ui"></div>
388
+ <script src="swagger/swagger-ui-bundle.js"> </script>
389
+ <script src="swagger/swagger-ui-standalone-preset.js"> </script>
390
+ <script>
391
+ window.onload = function() {
392
+ window.ui = SwaggerUIBundle({
393
+ spec: {
394
+ ...${JSON.stringify(getSwaggerJson(server.apiConfig))},
395
+ servers: [{ url: location.origin + location.pathname.replace(/\\/swagger$/, "") }]
396
+ },
397
+ dom_id: '#swagger-ui',
398
+ deepLinking: true,
399
+ presets: [
400
+ SwaggerUIBundle.presets.apis,
401
+ SwaggerUIStandalonePreset,
402
+ ],
403
+ plugins: [
404
+ SwaggerUIBundle.plugins.DownloadUrl,
405
+ ],
406
+ layout: "StandaloneLayout"
407
+ });
408
+ }
409
+ </script>
410
+ </body>
411
+ </html>
412
+ `);
413
+ res.end();
414
+ });
415
+ server.addHttpHandler("GET", /^\/swagger.*/u, (req, res) => {
416
+ if (!server.introspection) {
417
+ res.statusCode = 404;
418
+ res.end();
419
+ return;
420
+ }
421
+ if (req.url) {
422
+ req.url = req.url.replace(/\/swagger/u, "");
423
+ }
424
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
425
+ (0, serve_handler_1.default)(req, res, {
426
+ cleanUrls: false,
427
+ directoryListing: false,
428
+ etag: true,
429
+ public: swaggerUiAssetPath,
430
+ }).catch(e => {
431
+ console.error(e);
432
+ res.statusCode = 500;
433
+ res.write(`${e}`);
434
+ res.end();
435
+ });
436
+ });
437
+ server.addHttpHandler("GET", "/swagger.json", (req, res) => {
438
+ if (!server.introspection) {
439
+ res.statusCode = 404;
440
+ res.end();
441
+ return;
442
+ }
443
+ try {
444
+ res.write(JSON.stringify(getSwaggerJson(server.apiConfig)));
445
+ }
446
+ catch (error) {
447
+ console.error(error);
448
+ res.statusCode = 500;
449
+ }
450
+ res.end();
451
+ });
452
+ }
453
+ exports.setupSwagger = setupSwagger;
454
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zd2FnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSwyQ0FnQ3dCO0FBR3hCLDBFQUErQztBQUMvQyxxREFBNkU7QUFLN0UsTUFBTSxrQkFBa0IsR0FBRyxJQUFBLG1DQUFxQixHQUFFLENBQUM7QUFFbkQsU0FBUyxpQkFBaUIsQ0FBSSxPQUEyQjtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFzQixDQUFDO0FBQ2xHLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxXQUFtRCxFQUFFLElBQVU7SUFDbkYsSUFBSSxJQUFJLFlBQVksaUJBQVEsRUFBRTtRQUM1QixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNuQyxJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLG1CQUFVLEVBQUU7UUFDckMsT0FBTztZQUNMLFVBQVUsRUFBRSxpQkFBaUIsQ0FDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLElBQUk7Z0JBQ1Y7b0JBQ0UsV0FBVyxFQUNULEtBQUssQ0FBQyxXQUFXO3lCQUNkLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSw4QkFBcUIsQ0FBQzt5QkFDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBMkIsQ0FBQyxJQUFJLENBQUM7eUJBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTO29CQUMzQixHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztpQkFDekM7YUFDRixDQUFDLENBQ0g7WUFDRCxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxxQkFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3JGLElBQUksRUFBRSxRQUFRO1lBQ2Qsb0JBQW9CLEVBQUUsS0FBSztTQUM1QixDQUFDO0tBQ0g7U0FBTSxJQUNMLElBQUksWUFBWSw0QkFBbUI7UUFDbkMsSUFBSSxZQUFZLDBCQUFpQjtRQUNqQyxJQUFJLFlBQVkseUJBQWdCO1FBQ2hDLElBQUksWUFBWSwwQkFBaUI7UUFDakMsSUFBSSxZQUFZLDRCQUFtQixFQUNuQztRQUNBLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLHlCQUFnQixFQUFFO1FBQzNDLE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSztZQUNiLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksMEJBQWlCLEVBQUU7UUFDNUMsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSw4QkFBcUIsRUFBRTtRQUNoRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLFdBQVc7WUFDbkIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSx5QkFBZ0IsRUFBRTtRQUMzQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSwwQkFBaUIsRUFBRTtRQUM1QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSwwQkFBaUIsRUFBRTtRQUM1QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksMkJBQWtCLEVBQUU7UUFDN0MsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFlO1lBQ3ZCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVkseUJBQWdCLEVBQUU7UUFDM0MsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFnQjtZQUN4QixJQUFJLEVBQUUsU0FBUztTQUNoQixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSwwQkFBaUIsRUFBRTtRQUM1QyxPQUFPO1lBQ0wsTUFBTSxFQUFFLE9BQWdCO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksMkJBQWtCLEVBQUU7UUFDN0MsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFnQjtZQUN4QixJQUFJLEVBQUUsU0FBUztTQUNoQixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSwyQkFBa0IsRUFBRTtRQUM3QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSwyQkFBa0IsRUFBRTtRQUM3QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSw0QkFBbUIsRUFBRTtRQUM5QyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSw2QkFBb0IsRUFBRTtRQUMvQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSwwQkFBaUIsRUFBRTtRQUM1QyxPQUFPLEVBQUUsQ0FBQztLQUNYO1NBQU0sSUFBSSxJQUFJLFlBQVkscUJBQVksRUFBRTtRQUN2QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDaEUsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksa0JBQVMsRUFBRTtRQUNwQyxPQUFPO1lBQ0wsS0FBSyxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztZQUMzQyxJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLHNCQUFhLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvRDtRQUVELE9BQU8sRUFBRSxJQUFJLEVBQUUsd0JBQXdCLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO0tBQ3REO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBZ0IsU0FBdUM7SUFDNUUsTUFBTSxPQUFPLEdBQTJDLEVBQUUsQ0FBQztJQUMzRCw4REFBOEQ7SUFDOUQsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQztJQUV0QyxLQUFLLE1BQU0sRUFBRSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQ3pDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLHNCQUFhLENBQW9CLENBQUM7UUFDckcsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSx5QkFBZ0IsQ0FBdUIsQ0FBQztRQUM3RyxJQUFJLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBZ0IsQ0FBQztRQUV6SSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQy9CLGNBQWMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztTQUN2QztRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBRXRELEtBQUssTUFBTSxLQUFLLElBQUksY0FBYyxFQUFFO1lBQ2xDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksNkJBQW9CLENBQXFDLENBQUM7WUFDaEksTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBRXZHLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRXZELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDM0M7UUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUN2QyxDQUFDLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RELE1BQU07WUFDTjtnQkFDRSxXQUFXLEVBQUUsTUFBTTtxQkFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDZixPQUFPLEVBQUU7b0JBQ1Asa0JBQWtCLEVBQUU7d0JBQ2xCLE1BQU0sRUFBRTs0QkFDTixLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQzFCLFVBQVUsRUFBRTtvQ0FDVixPQUFPLEVBQUU7d0NBQ1AsSUFBSSxFQUFFLFFBQVE7cUNBQ2Y7b0NBQ0QsSUFBSSxFQUFFO3dDQUNKLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7d0NBQ2xCLElBQUksRUFBRSxRQUFRO3FDQUNmO29DQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxZQUFZLDBCQUFpQjt3Q0FDN0MsQ0FBQyxDQUFDLEVBQUU7d0NBQ0osQ0FBQyxDQUFDOzRDQUNFLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUM7eUNBQzVDLENBQUM7aUNBQ1A7Z0NBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsWUFBWSwwQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0NBQy9GLElBQUksRUFBRSxRQUFRO2dDQUNkLG9CQUFvQixFQUFFLEtBQUs7NkJBQzVCLENBQUMsQ0FBQzt5QkFDSjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUNILENBQUM7UUFFRixLQUFLLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEMsSUFBSSxHQUFHLFlBQVksdUJBQWMsRUFBRTtnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3BCLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2lCQUN0QjtnQkFFRCxzRUFBc0U7Z0JBQ3RFLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHO29CQUMxQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUk7b0JBQ3BCLFVBQVUsRUFBRTt3QkFDVixHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDaEMsb0VBQW9FOzRCQUNwRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBRTs0QkFDNUMsUUFBUSxFQUFFLE1BQU07NEJBQ2hCLElBQUk7eUJBQ0wsQ0FBQyxDQUFDO3dCQUNILEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNqQyxvRUFBb0U7NEJBQ3BFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFFOzRCQUM1QyxRQUFRLEVBQUUsT0FBTzs0QkFDakIsSUFBSTt5QkFDTCxDQUFDLENBQUM7d0JBQ0gsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDOzRCQUNyRCxvRUFBb0U7NEJBQ3BFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFFOzRCQUM1QyxRQUFRLEVBQUUsUUFBUTs0QkFDbEIsSUFBSSxFQUFFLE1BQU07eUJBQ2IsQ0FBQyxDQUFDO3FCQUNKLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNsQyxXQUFXLEVBQ1QsR0FBRyxDQUFDLFdBQVc7NkJBQ1osTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLDhCQUFxQixDQUFDOzZCQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUEyQixDQUFDLElBQUksQ0FBQzs2QkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVM7d0JBQzNCLEVBQUUsRUFBRSxRQUFRO3dCQUNaLElBQUk7d0JBQ0osUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLHFCQUFZLENBQUM7d0JBQzdDLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUM7cUJBQ3hDLENBQUMsQ0FBQztvQkFDSCxXQUFXLEVBQUUsR0FBRyxDQUFDLFlBQVk7d0JBQzNCLENBQUMsQ0FBQzs0QkFDRSxPQUFPLEVBQUU7Z0NBQ1AsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQ0FDUCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQztvQ0FFMUUsT0FBTyxRQUFRLFlBQVksMEJBQWlCO3dDQUMxQyxRQUFRLFlBQVkseUJBQWdCO3dDQUNwQyxRQUFRLFlBQVksMEJBQWlCO3dDQUNyQyxRQUFRLFlBQVksMkJBQWtCO3dDQUN0QyxRQUFRLFlBQVksNEJBQW1CO3dDQUN2QyxRQUFRLFlBQVksMEJBQWlCO3dDQUNyQyxRQUFRLFlBQVksOEJBQXFCO3dDQUN6QyxRQUFRLFlBQVksMkJBQWtCO3dDQUN0QyxRQUFRLFlBQVkseUJBQWdCO3dDQUNwQyxRQUFRLFlBQVksMEJBQWlCO3dDQUNyQyxRQUFRLFlBQVksMkJBQWtCO3dDQUN0QyxRQUFRLFlBQVksMEJBQWlCO3dDQUNyQyxRQUFRLFlBQVksMEJBQWlCO3dDQUNyQyxRQUFRLFlBQVkseUJBQWdCO3dDQUNwQyxRQUFRLFlBQVksMkJBQWtCO3dDQUN0QyxRQUFRLFlBQVksNEJBQW1CO3dDQUN2QyxDQUFDLENBQUM7NENBQ0UsQ0FBQyxRQUFRLFlBQVksMEJBQWlCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0RBQ3BFLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQzs2Q0FDeEM7eUNBQ0Y7d0NBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQ0FDVCxDQUFDLENBQUMsRUFBRTtnQ0FDSixrQkFBa0IsRUFBRTtvQ0FDbEIsb0VBQW9FO29DQUNwRSxNQUFNLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLFlBQVksQ0FBRSxDQUFDLElBQUksQ0FBQztpQ0FDeEY7NkJBQ0Y7NEJBQ0Qsb0VBQW9FOzRCQUNwRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsWUFBWSxDQUFFLENBQUMsSUFBSSxZQUFZLHFCQUFZLENBQUM7eUJBQzlGO3dCQUNILENBQUMsQ0FBQyxTQUFTO29CQUNiLFNBQVMsRUFBRTt3QkFDVCxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsWUFBWSxxQkFBWSxJQUFJLEVBQUUsQ0FBQyxVQUFVLFlBQVksMEJBQWlCOzRCQUNyRixDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRTs0QkFDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDUCxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsWUFBWSwwQkFBaUI7NEJBQzVDLENBQUMsQ0FBQyxFQUFFOzRCQUNKLENBQUMsQ0FBQztnQ0FDRSxHQUFHLEVBQUU7b0NBQ0gsV0FBVyxFQUFFLEVBQUU7b0NBQ2YsT0FBTyxFQUFFO3dDQUNQLEdBQUcsQ0FBQyxHQUFHLEVBQUU7NENBQ1AsT0FBTyxFQUFFLENBQUMsVUFBVSxZQUFZLDBCQUFpQjtnREFDL0MsRUFBRSxDQUFDLFVBQVUsWUFBWSx5QkFBZ0I7Z0RBQ3pDLEVBQUUsQ0FBQyxVQUFVLFlBQVksMEJBQWlCO2dEQUMxQyxFQUFFLENBQUMsVUFBVSxZQUFZLDJCQUFrQjtnREFDM0MsRUFBRSxDQUFDLFVBQVUsWUFBWSw0QkFBbUI7Z0RBQzVDLEVBQUUsQ0FBQyxVQUFVLFlBQVksMEJBQWlCO2dEQUMxQyxFQUFFLENBQUMsVUFBVSxZQUFZLDhCQUFxQjtnREFDOUMsRUFBRSxDQUFDLFVBQVUsWUFBWSwyQkFBa0I7Z0RBQzNDLEVBQUUsQ0FBQyxVQUFVLFlBQVkseUJBQWdCO2dEQUN6QyxFQUFFLENBQUMsVUFBVSxZQUFZLDBCQUFpQjtnREFDMUMsRUFBRSxDQUFDLFVBQVUsWUFBWSwyQkFBa0I7Z0RBQzNDLEVBQUUsQ0FBQyxVQUFVLFlBQVksMEJBQWlCO2dEQUMxQyxFQUFFLENBQUMsVUFBVSxZQUFZLHlCQUFnQjtnREFDekMsRUFBRSxDQUFDLFVBQVUsWUFBWSwyQkFBa0I7Z0RBQzNDLEVBQUUsQ0FBQyxVQUFVLFlBQVksNEJBQW1CO2dEQUM1QyxDQUFDLENBQUM7b0RBQ0UsWUFBWSxFQUFFO3dEQUNaLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUM7cURBQzdDO2lEQUNGO2dEQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7d0NBQ1QsQ0FBQyxDQUFDLEVBQUU7d0NBQ0osa0JBQWtCLEVBQUU7NENBQ2xCLE1BQU0sRUFBRSxZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUM7eUNBQzdDO3FDQUNGO2lDQUNGOzZCQUNGLENBQUM7d0JBQ04sR0FBRyxjQUFjO3FCQUNsQjtvQkFDRCxPQUFPLEVBQ0wsRUFBRSxDQUFDLFdBQVc7eUJBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLDhCQUFxQixDQUFDO3lCQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUEyQixDQUFDLElBQUksQ0FBQzt5QkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVM7b0JBQzNCLElBQUksRUFBRSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEcsQ0FBQzthQUNIO1NBQ0Y7S0FDRjtJQUVELE1BQU0sZUFBZSxHQUFHO1FBQ3RCLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRSxNQUFNO1lBQ1osTUFBTSxFQUFFLFFBQVE7U0FDakI7S0FDRixDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUc7UUFDZjtZQUNFLFVBQVUsRUFBRSxFQUFFO1NBQ2Y7S0FDRixDQUFDO0lBRUYsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLElBQUksRUFBRTtZQUNKLEtBQUssRUFBRSxFQUFFO1lBQ1QsT0FBTyxFQUFFLEVBQUU7U0FDWjtRQUNELEtBQUs7UUFDTCxVQUFVLEVBQUU7WUFDVixPQUFPO1lBQ1AsZUFBZTtTQUNoQjtRQUNELFFBQVE7S0FDVCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBZ0IsTUFBdUM7SUFDakYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO1lBQ3pCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE9BQU87U0FDUjtRQUVELEdBQUcsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsrQkF1Q2lCLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBa0J0RSxDQUFDLENBQUM7UUFDUCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN6QixHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNyQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1NBQ1I7UUFFRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDWCxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM3QztRQUVELHlHQUF5RztRQUN6RyxJQUFBLHVCQUFrQixFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7WUFDM0IsU0FBUyxFQUFFLEtBQUs7WUFDaEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxrQkFBa0I7U0FDM0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDckIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN6QixHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNyQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1NBQ1I7UUFFRCxJQUFJO1lBQ0YsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1NBQ3RCO1FBRUQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBL0dELG9DQStHQyJ9
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiTestWrapper = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ /* eslint-disable @typescript-eslint/no-unused-vars */
6
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
7
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
8
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
9
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
10
+ const crypto_1 = require("crypto");
11
+ const encode_decode_1 = require("./encode-decode");
12
+ const execute_1 = require("./execute");
13
+ function apiTestWrapper(api, extraContext = {}) {
14
+ const wrappedApi = new api.constructor();
15
+ for (const functionName of Object.keys(api.astJson.functionTable)) {
16
+ wrappedApi.fn[functionName] = async (partialCtx, args) => {
17
+ const encodedArgs = (0, encode_decode_1.encode)(api.astJson.typeTable, `fn.${functionName}.args`, api.astJson.functionTable[functionName].args, args);
18
+ const ctx = {
19
+ ...extraContext,
20
+ ...partialCtx,
21
+ request: {
22
+ args: encodedArgs,
23
+ deviceInfo: partialCtx.request?.deviceInfo ?? {
24
+ fingerprint: null,
25
+ id: (0, crypto_1.randomBytes)(16).toString("hex"),
26
+ language: null,
27
+ platform: null,
28
+ timezone: null,
29
+ type: "test",
30
+ version: null,
31
+ },
32
+ extra: partialCtx.request?.extra ?? {},
33
+ files: partialCtx.request?.files ?? [],
34
+ headers: partialCtx.request?.headers ?? {},
35
+ id: partialCtx.request?.id ?? (0, crypto_1.randomBytes)(16).toString("hex"),
36
+ ip: partialCtx.request?.ip ?? "0.0.0.0",
37
+ name: functionName,
38
+ version: 3,
39
+ query: null,
40
+ },
41
+ response: {
42
+ headers: new Map(),
43
+ },
44
+ };
45
+ const reply = await (0, execute_1.executeRequest)(ctx, api);
46
+ if (reply.error) {
47
+ throw reply.error;
48
+ }
49
+ else {
50
+ const decodedRet = (0, encode_decode_1.decode)(api.astJson.typeTable, `fn.${functionName}.ret`, api.astJson.functionTable[functionName].ret, JSON.parse(JSON.stringify(reply.result)));
51
+ return decodedRet;
52
+ }
53
+ };
54
+ }
55
+ return wrappedApi;
56
+ }
57
+ exports.apiTestWrapper = apiTestWrapper;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3Qtd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBdUQ7QUFDdkQsc0RBQXNEO0FBQ3RELDREQUE0RDtBQUM1RCxzREFBc0Q7QUFDdEQsK0RBQStEO0FBQy9ELHdEQUF3RDtBQUN4RCxtQ0FBcUM7QUFJckMsbURBQWlEO0FBQ2pELHVDQUEyQztBQUUzQyxTQUFnQixjQUFjLENBQTJELEdBQVMsRUFBRSxlQUF1QyxFQUFFO0lBQzNJLE1BQU0sVUFBVSxHQUFTLElBQUssR0FBRyxDQUFDLFdBQW1CLEVBQUUsQ0FBQztJQUV4RCxLQUFLLE1BQU0sWUFBWSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRTtRQUNqRSxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssRUFBRSxVQUE0QixFQUFFLElBQVMsRUFBRSxFQUFFO1lBQzlFLE1BQU0sV0FBVyxHQUFHLElBQUEsc0JBQU0sRUFBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLFlBQVksT0FBTyxFQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFMUksTUFBTSxHQUFHLEdBQVk7Z0JBQ25CLEdBQUcsWUFBWTtnQkFDZixHQUFHLFVBQVU7Z0JBQ2IsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxXQUFzQztvQkFDNUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJO3dCQUM1QyxXQUFXLEVBQUUsSUFBSTt3QkFDakIsRUFBRSxFQUFFLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO3dCQUNuQyxRQUFRLEVBQUUsSUFBSTt3QkFDZCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxJQUFJLEVBQUUsTUFBTTt3QkFDWixPQUFPLEVBQUUsSUFBSTtxQkFDZDtvQkFDRCxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDdEMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ3RDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLE9BQU8sSUFBSSxFQUFFO29CQUMxQyxFQUFFLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQzdELEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxTQUFTO29CQUN2QyxJQUFJLEVBQUUsWUFBWTtvQkFDbEIsT0FBTyxFQUFFLENBQUM7b0JBQ1YsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRTtpQkFDbkI7YUFDRixDQUFDO1lBRUYsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLHdCQUFjLEVBQUMsR0FBOEIsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUV4RSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ25CO2lCQUFNO2dCQUNMLE1BQU0sVUFBVSxHQUFHLElBQUEsc0JBQU0sRUFDdkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQ3JCLE1BQU0sWUFBWSxNQUFNLEVBQ3ZCLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDekMsQ0FBQztnQkFFRixPQUFPLFVBQVUsQ0FBQzthQUNuQjtRQUNILENBQUMsQ0FBQztLQUNIO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQXJERCx3Q0FxREMifQ==
package/dist/utils.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.has = void 0;
4
+ function has(target, property) {
5
+ return property in target;
6
+ }
7
+ exports.has = has;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBY0EsU0FBZ0IsR0FBRyxDQUF3QixNQUFjLEVBQUUsUUFBVztJQUNwRSxPQUFPLFFBQVEsSUFBSSxNQUFNLENBQUM7QUFDNUIsQ0FBQztBQUZELGtCQUVDIn0=