@dcl/content-validator 2.1.0 → 2.1.1-20220622185224.commit-163289a

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 (99) hide show
  1. package/dist/content-validator.api.json +38 -180
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/the-graph-client/the-graph-client.d.ts.map +1 -1
  5. package/dist/the-graph-client/the-graph-client.js +4 -13
  6. package/dist/the-graph-client/the-graph-client.js.map +1 -1
  7. package/dist/types.d.ts +0 -4
  8. package/dist/types.d.ts.map +1 -1
  9. package/dist/types.js +1 -16
  10. package/dist/types.js.map +1 -1
  11. package/dist/validations/ADR51.d.ts +3 -5
  12. package/dist/validations/ADR51.d.ts.map +1 -1
  13. package/dist/validations/ADR51.js +4 -0
  14. package/dist/validations/ADR51.js.map +1 -1
  15. package/dist/validations/access-checker/access.d.ts.map +1 -1
  16. package/dist/validations/access-checker/access.js +7 -7
  17. package/dist/validations/access-checker/access.js.map +1 -1
  18. package/dist/validations/access-checker/emotes.d.ts +3 -0
  19. package/dist/validations/access-checker/emotes.d.ts.map +1 -0
  20. package/dist/validations/access-checker/emotes.js +13 -0
  21. package/dist/validations/access-checker/emotes.js.map +1 -0
  22. package/dist/validations/access-checker/items/collection-asset.d.ts +15 -0
  23. package/dist/validations/access-checker/items/collection-asset.d.ts.map +1 -0
  24. package/dist/validations/access-checker/items/collection-asset.js +133 -0
  25. package/dist/validations/access-checker/items/collection-asset.js.map +1 -0
  26. package/dist/validations/access-checker/items/items.d.ts +13 -0
  27. package/dist/validations/access-checker/items/items.d.ts.map +1 -0
  28. package/dist/validations/access-checker/items/items.js +68 -0
  29. package/dist/validations/access-checker/items/items.js.map +1 -0
  30. package/dist/validations/access-checker/items/off-chain-asset.d.ts +3 -0
  31. package/dist/validations/access-checker/items/off-chain-asset.d.ts.map +1 -0
  32. package/dist/validations/access-checker/items/off-chain-asset.js +17 -0
  33. package/dist/validations/access-checker/items/off-chain-asset.js.map +1 -0
  34. package/dist/validations/access-checker/items/third-party-asset.d.ts +3 -0
  35. package/dist/validations/access-checker/items/third-party-asset.d.ts.map +1 -0
  36. package/dist/validations/access-checker/items/third-party-asset.js +107 -0
  37. package/dist/validations/access-checker/items/third-party-asset.js.map +1 -0
  38. package/dist/validations/access-checker/profiles.d.ts.map +1 -1
  39. package/dist/validations/access-checker/profiles.js +3 -3
  40. package/dist/validations/access-checker/profiles.js.map +1 -1
  41. package/dist/validations/access-checker/scenes.d.ts.map +1 -1
  42. package/dist/validations/access-checker/scenes.js +3 -10
  43. package/dist/validations/access-checker/scenes.js.map +1 -1
  44. package/dist/validations/access-checker/stores.d.ts.map +1 -1
  45. package/dist/validations/access-checker/stores.js.map +1 -1
  46. package/dist/validations/access-checker/wearables.d.ts +0 -18
  47. package/dist/validations/access-checker/wearables.d.ts.map +1 -1
  48. package/dist/validations/access-checker/wearables.js +9 -322
  49. package/dist/validations/access-checker/wearables.js.map +1 -1
  50. package/dist/validations/content.d.ts +3 -0
  51. package/dist/validations/content.d.ts.map +1 -1
  52. package/dist/validations/content.js +30 -17
  53. package/dist/validations/content.js.map +1 -1
  54. package/dist/validations/entity-structure.d.ts.map +1 -1
  55. package/dist/validations/entity-structure.js.map +1 -1
  56. package/dist/validations/index.d.ts +4 -23
  57. package/dist/validations/index.d.ts.map +1 -1
  58. package/dist/validations/index.js +6 -51
  59. package/dist/validations/index.js.map +1 -1
  60. package/dist/validations/ipfs-hashing.d.ts.map +1 -1
  61. package/dist/validations/ipfs-hashing.js +3 -6
  62. package/dist/validations/ipfs-hashing.js.map +1 -1
  63. package/dist/validations/items/emotes.d.ts +5 -0
  64. package/dist/validations/items/emotes.d.ts.map +1 -0
  65. package/dist/validations/items/emotes.js +35 -0
  66. package/dist/validations/items/emotes.js.map +1 -0
  67. package/dist/validations/items/items.d.ts +10 -0
  68. package/dist/validations/items/items.d.ts.map +1 -0
  69. package/dist/validations/items/items.js +79 -0
  70. package/dist/validations/items/items.js.map +1 -0
  71. package/dist/validations/{wearable.d.ts → items/wearables.d.ts} +2 -5
  72. package/dist/validations/items/wearables.d.ts.map +1 -0
  73. package/dist/validations/items/wearables.js +32 -0
  74. package/dist/validations/items/wearables.js.map +1 -0
  75. package/dist/validations/metadata-schema.d.ts +2 -5
  76. package/dist/validations/metadata-schema.d.ts.map +1 -1
  77. package/dist/validations/metadata-schema.js +37 -7
  78. package/dist/validations/metadata-schema.js.map +1 -1
  79. package/dist/validations/profile.d.ts.map +1 -1
  80. package/dist/validations/profile.js +9 -20
  81. package/dist/validations/profile.js.map +1 -1
  82. package/dist/validations/signature.d.ts.map +1 -1
  83. package/dist/validations/signature.js +1 -3
  84. package/dist/validations/signature.js.map +1 -1
  85. package/dist/validations/size.d.ts.map +1 -1
  86. package/dist/validations/size.js +4 -3
  87. package/dist/validations/size.js.map +1 -1
  88. package/dist/validations/timestamps.d.ts +21 -0
  89. package/dist/validations/timestamps.d.ts.map +1 -0
  90. package/dist/validations/timestamps.js +24 -0
  91. package/dist/validations/timestamps.js.map +1 -0
  92. package/dist/validations/validations.d.ts +9 -0
  93. package/dist/validations/validations.d.ts.map +1 -0
  94. package/dist/validations/validations.js +47 -0
  95. package/dist/validations/validations.js.map +1 -0
  96. package/package.json +4 -4
  97. package/dist/validations/wearable.d.ts.map +0 -1
  98. package/dist/validations/wearable.js +0 -110
  99. package/dist/validations/wearable.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validations.js","sourceRoot":"","sources":["../../src/validations/validations.ts"],"names":[],"mappings":";;;AACA,oCAA+G;AAC/G,6CAAmF;AAEnF,SAAgB,eAAe,CAAC,GAAG,WAAyB;IAC1D,OAAO;QACL,KAAK,CAAC,QAAQ,CACZ,UAAsC,EACtC,UAAgC;YAEhC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;gBACpC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;gBAClE,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAAE,OAAO,QAAQ,CAAA;aAClC;YACD,OAAO,UAAE,CAAA;QACX,CAAC;KACF,CAAA;AACH,CAAC;AAbD,0CAaC;AAED,SAAgB,qBAAqB,CACnC,SAA2E,EAC3E,UAAsB;IAEtB,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,UAAsC,EAAE,UAAgC;YACrF,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,CAAA;YAClD,IAAI,cAAc,EAAE;gBAClB,OAAO,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;aACnD;YACD,OAAO,UAAE,CAAA;QACX,CAAC;KACF,CAAA;AACH,CAAC;AAbD,sDAaC;AAED,SAAgB,oBAAoB,CAAC,UAAsB;IACzD,OAAO,qBAAqB,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,6BAAgB,EAAE,UAAU,CAAC,CAAA;AAC3G,CAAC;AAFD,oDAEC;AAED,SAAgB,oBAAoB,CAAC,UAAsB;IACzD,OAAO,qBAAqB,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,6BAAgB,EAAE,UAAU,CAAC,CAAA;AAC3G,CAAC;AAFD,oDAEC;AAED,SAAgB,oBAAoB,CAAC,UAAsB;IACzD,OAAO,qBAAqB,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,IAAI,6BAAgB,EAAE,UAAU,CAAC,CAAA;AAC3G,CAAC;AAFD,oDAEC;AAED,SAAgB,iBAAiB,CAAC,UAAsB,EAAE,UAAsB;IAC9E,OAAO,qBAAqB,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,UAAU,CAAC,CAAA;AACjG,CAAC;AAFD,8CAEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/content-validator",
3
- "version": "2.1.0",
3
+ "version": "2.1.1-20220622185224.commit-163289a",
4
4
  "description": "Catalyst content validations",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -31,7 +31,7 @@
31
31
  },
32
32
  "homepage": "https://github.com/decentraland/content-validator#readme",
33
33
  "devDependencies": {
34
- "@dcl/eslint-config": "1.0.3",
34
+ "@dcl/eslint-config": "1.0.5",
35
35
  "@microsoft/api-extractor": "^7.24.2",
36
36
  "@types/jest": "^28.1.1",
37
37
  "@types/ms": "0.7.31",
@@ -50,7 +50,7 @@
50
50
  "dependencies": {
51
51
  "@dcl/content-hash-tree": "^1.1.3",
52
52
  "@dcl/hashing": "1.1.0",
53
- "@dcl/schemas": "^4.14.0",
53
+ "@dcl/schemas": "^5.0.3",
54
54
  "@dcl/urn-resolver": "1.3.1",
55
55
  "@well-known-components/interfaces": "1.1.1",
56
56
  "ms": "2.1.3",
@@ -59,5 +59,5 @@
59
59
  "files": [
60
60
  "dist"
61
61
  ],
62
- "commit": "ef47fea4635fe429aae20445e4adb1c351a9df36"
62
+ "commit": "163289a97efcd6c09681971b25b55a992ead3b77"
63
63
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"wearable.d.ts","sourceRoot":"","sources":["../../src/validations/wearable.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,UAAU,EAEX,MAAM,UAAU,CAAA;AAIjB,sEAAsE;AACtE,eAAO,MAAM,6BAA6B,EAAE,UAwB3C,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,YAAY,EAAE,UAgC1B,CAAA;AAID,eAAO,MAAM,iBAAiB,EAAE,UAqD/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,UAWtB,CAAA"}
@@ -1,110 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.wearable = exports.wearableThumbnail = exports.wearableSize = exports.wearableRepresentationContent = void 0;
7
- const schemas_1 = require("@dcl/schemas");
8
- const ADR51_1 = require("./ADR51");
9
- const sharp_1 = __importDefault(require("sharp"));
10
- const _1 = require(".");
11
- const types_1 = require("../types");
12
- const wearableSizeLimitInMB = 2;
13
- /** Validate wearable representations are referencing valid content */
14
- exports.wearableRepresentationContent = {
15
- validate: async (components, deployment) => {
16
- const { entity } = deployment;
17
- const wearableMetadata = entity.metadata;
18
- const representations = wearableMetadata?.data?.representations;
19
- if (!representations)
20
- return (0, types_1.validationFailed)('No wearable representations found');
21
- if (!entity.content)
22
- return (0, types_1.validationFailed)('No content found');
23
- for (const representation of representations) {
24
- for (const representationContent of representation.contents) {
25
- if (!entity.content.find((content) => content.file === representationContent)) {
26
- return (0, types_1.validationFailed)(`Representation content: '${representationContent}' is not one of the content files`);
27
- }
28
- }
29
- }
30
- return types_1.OK;
31
- }
32
- };
33
- /** Validate wearable files size, excluding thumbnail, is less than expected */
34
- exports.wearableSize = {
35
- validate: async ({ externalCalls }, deployment) => {
36
- const entity = deployment.entity;
37
- if (entity.timestamp < _1.ADR_45_TIMESTAMP)
38
- return types_1.OK;
39
- const maxSizeInMB = ADR51_1.entityParameters[schemas_1.EntityType.WEARABLE]?.maxSizeInMB;
40
- if (!maxSizeInMB)
41
- return (0, types_1.validationFailed)(`Type ${schemas_1.EntityType.WEARABLE} is not supported yet`);
42
- const modelSizeInMB = wearableSizeLimitInMB;
43
- const metadata = entity.metadata;
44
- const thumbnailHash = entity.content?.find(({ file }) => file === metadata.thumbnail)?.hash;
45
- if (!thumbnailHash)
46
- return (0, types_1.validationFailed)("Couldn't find the thumbnail hash");
47
- const result = await (0, _1.calculateDeploymentSize)(deployment, externalCalls);
48
- if (typeof result === 'string')
49
- return (0, types_1.validationFailed)(result);
50
- const totalDeploymentSize = result;
51
- const thumbnailSize = deployment.files.get(thumbnailHash)?.byteLength ?? 0;
52
- const modelSize = totalDeploymentSize - thumbnailSize;
53
- if (modelSize > modelSizeInMB * 1024 * 1024)
54
- return (0, types_1.validationFailed)(`The deployment is too big. The maximum allowed size for wearable model files is ${modelSizeInMB} MB. You can upload up to ${modelSizeInMB * 1024 * 1024} bytes but you tried to upload ${modelSize}.`);
55
- return types_1.OK;
56
- }
57
- };
58
- /** Validate that given wearable deployment includes a thumbnail with valid format and size */
59
- const maxThumbnailSize = 1024;
60
- exports.wearableThumbnail = {
61
- validate: async ({ externalCalls, logs }, deployment) => {
62
- const logger = logs.getLogger('wearable validator');
63
- if (deployment.entity.timestamp < _1.ADR_45_TIMESTAMP)
64
- return types_1.OK;
65
- // read thumbnail field from metadata
66
- const metadata = deployment.entity.metadata;
67
- const hash = deployment.entity.content?.find(({ file }) => file === metadata.thumbnail)?.hash;
68
- if (!hash)
69
- return (0, types_1.validationFailed)(`Couldn't find hash for thumbnail file with name: ${metadata.thumbnail}`);
70
- const errors = [];
71
- // check size
72
- const thumbnailBuffer = deployment.files.get(hash);
73
- if (!thumbnailBuffer) {
74
- const isHashStored = (await externalCalls.isContentStoredAlready([hash])).get(hash) ?? false;
75
- if (!isHashStored) {
76
- return (0, types_1.validationFailed)(`Couldn't find thumbnail file with hash: ${hash}`);
77
- }
78
- // otherwise, thumbnail was already uploaded and won't be validated again
79
- logger.debug(`Thumbnail file with hash: ${hash} is not in the deployment, but it is already stored`);
80
- return types_1.OK;
81
- }
82
- try {
83
- const { width, height, format } = await (0, sharp_1.default)(thumbnailBuffer).metadata();
84
- if (!format || format !== 'png')
85
- errors.push(`Invalid or unknown image format. Only 'PNG' format is accepted.`);
86
- if (!width || !height) {
87
- errors.push(`Couldn't validate thumbnail size for file ${metadata.thumbnail}`);
88
- }
89
- else if (width > maxThumbnailSize || height > maxThumbnailSize) {
90
- errors.push(`Invalid thumbnail image size (width = ${width} / height = ${height})`);
91
- }
92
- }
93
- catch (e) {
94
- errors.push(`Couldn't parse thumbnail, please check image format.`);
95
- }
96
- return errors.length > 0 ? (0, types_1.validationFailed)(...errors) : types_1.OK;
97
- }
98
- };
99
- /**
100
- * Validate that given wearable deployment includes the thumbnail and doesn't exceed file sizes
101
- * * @public
102
- */
103
- exports.wearable = {
104
- validate: async (components, deployment) => {
105
- if (deployment.entity.type !== schemas_1.EntityType.WEARABLE)
106
- return types_1.OK;
107
- return (0, _1.validateInRow)(components, deployment, exports.wearableRepresentationContent, exports.wearableThumbnail, exports.wearableSize);
108
- }
109
- };
110
- //# sourceMappingURL=wearable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wearable.js","sourceRoot":"","sources":["../../src/validations/wearable.ts"],"names":[],"mappings":";;;;;;AAAA,0CAAmD;AACnD,mCAA0C;AAC1C,kDAAyB;AACzB,wBAA4E;AAC5E,oCAKiB;AAEjB,MAAM,qBAAqB,GAAG,CAAC,CAAA;AAE/B,sEAAsE;AACzD,QAAA,6BAA6B,GAAe;IACvD,QAAQ,EAAE,KAAK,EAAE,UAAsC,EAAE,UAAU,EAAE,EAAE;QACrE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;QAC7B,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAoB,CAAA;QACpD,MAAM,eAAe,GAAG,gBAAgB,EAAE,IAAI,EAAE,eAAe,CAAA;QAC/D,IAAI,CAAC,eAAe;YAClB,OAAO,IAAA,wBAAgB,EAAC,mCAAmC,CAAC,CAAA;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAA,wBAAgB,EAAC,kBAAkB,CAAC,CAAA;QAEhE,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE;YAC5C,KAAK,MAAM,qBAAqB,IAAI,cAAc,CAAC,QAAQ,EAAE;gBAC3D,IACE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAClB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,qBAAqB,CACpD,EACD;oBACA,OAAO,IAAA,wBAAgB,EACrB,4BAA4B,qBAAqB,mCAAmC,CACrF,CAAA;iBACF;aACF;SACF;QACD,OAAO,UAAE,CAAA;IACX,CAAC;CACF,CAAA;AAED,+EAA+E;AAClE,QAAA,YAAY,GAAe;IACtC,QAAQ,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAChC,IAAI,MAAM,CAAC,SAAS,GAAG,mBAAgB;YAAE,OAAO,UAAE,CAAA;QAClD,MAAM,WAAW,GAAG,wBAAgB,CAAC,oBAAU,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAA;QACtE,IAAI,CAAC,WAAW;YACd,OAAO,IAAA,wBAAgB,EACrB,QAAQ,oBAAU,CAAC,QAAQ,uBAAuB,CACnD,CAAA;QAEH,MAAM,aAAa,GAAG,qBAAqB,CAAA;QAE3C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAoB,CAAA;QAC5C,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CACxC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS,CAC1C,EAAE,IAAI,CAAA;QACP,IAAI,CAAC,aAAa;YAChB,OAAO,IAAA,wBAAgB,EAAC,kCAAkC,CAAC,CAAA;QAE7D,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAuB,EAAC,UAAU,EAAE,aAAa,CAAC,CAAA;QACvE,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAA,wBAAgB,EAAC,MAAM,CAAC,CAAA;QAC/D,MAAM,mBAAmB,GAAG,MAAM,CAAA;QAClC,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,IAAI,CAAC,CAAA;QAC1E,MAAM,SAAS,GAAG,mBAAmB,GAAG,aAAa,CAAA;QACrD,IAAI,SAAS,GAAG,aAAa,GAAG,IAAI,GAAG,IAAI;YACzC,OAAO,IAAA,wBAAgB,EACrB,mFAAmF,aAAa,6BAC9F,aAAa,GAAG,IAAI,GAAG,IACzB,kCAAkC,SAAS,GAAG,CAC/C,CAAA;QACH,OAAO,UAAE,CAAA;IACX,CAAC;CACF,CAAA;AAED,8FAA8F;AAC9F,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAChB,QAAA,iBAAiB,GAAe;IAC3C,QAAQ,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;QAEnD,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,GAAG,mBAAgB;YAAE,OAAO,UAAE,CAAA;QAC7D,qCAAqC;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,QAAoB,CAAA;QAEvD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAC1C,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS,CAC1C,EAAE,IAAI,CAAA;QACP,IAAI,CAAC,IAAI;YACP,OAAO,IAAA,wBAAgB,EACrB,oDAAoD,QAAQ,CAAC,SAAS,EAAE,CACzE,CAAA;QAEH,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,aAAa;QACb,MAAM,eAAe,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,CAAC,eAAe,EAAE;YACpB,MAAM,YAAY,GAChB,CAAC,MAAM,aAAa,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAA;YACzE,IAAI,CAAC,YAAY,EAAE;gBACjB,OAAO,IAAA,wBAAgB,EACrB,2CAA2C,IAAI,EAAE,CAClD,CAAA;aACF;YACD,yEAAyE;YACzE,MAAM,CAAC,KAAK,CACV,6BAA6B,IAAI,qDAAqD,CACvF,CAAA;YACD,OAAO,UAAE,CAAA;SACV;QACD,IAAI;YACF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,eAAK,EAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAA;YACzE,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,KAAK;gBAC7B,MAAM,CAAC,IAAI,CACT,iEAAiE,CAClE,CAAA;YACH,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE;gBACrB,MAAM,CAAC,IAAI,CACT,6CAA6C,QAAQ,CAAC,SAAS,EAAE,CAClE,CAAA;aACF;iBAAM,IAAI,KAAK,GAAG,gBAAgB,IAAI,MAAM,GAAG,gBAAgB,EAAE;gBAChE,MAAM,CAAC,IAAI,CACT,yCAAyC,KAAK,eAAe,MAAM,GAAG,CACvE,CAAA;aACF;SACF;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;SACpE;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,wBAAgB,EAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAE,CAAA;IAC7D,CAAC;CACF,CAAA;AAED;;;GAGG;AACU,QAAA,QAAQ,GAAe;IAClC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE;QACzC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,oBAAU,CAAC,QAAQ;YAAE,OAAO,UAAE,CAAA;QAC7D,OAAO,IAAA,gBAAa,EAClB,UAAU,EACV,UAAU,EACV,qCAA6B,EAC7B,yBAAiB,EACjB,oBAAY,CACb,CAAA;IACH,CAAC;CACF,CAAA"}