@local901/validator 0.2.9 → 0.2.11

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.
@@ -19,7 +19,7 @@ class ValidationError extends Error {
19
19
  let fields;
20
20
  if (this.fields) {
21
21
  if (Array.isArray(this.fields)) {
22
- fields = this.fields.map((error) => error?.toJson());
22
+ fields = this.fields.map((error) => error?.toJson() ?? null);
23
23
  }
24
24
  else {
25
25
  fields = Object.fromEntries(Object.entries(this.fields).map(([key, error]) => [key, error.toJson()]));
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationError.js","sourceRoot":"","sources":["../../src/errors/ValidationError.ts"],"names":[],"mappings":";;;AAyCA,MAAa,eAEX,SAAQ,KAAK;IACM,QAAQ,CAAS;IAClB,IAAI,CAAS;IACb,KAAK,CAAa;IAClB,MAAM,CAAiB;IAEvC,YAAmB,IAAY,EAAE,KAAiB,EAAE,OAAe,EAAE,MAAuB;QACxF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAEM,MAAM;QACT,IAAI,MAAsC,CAAC;QAE3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1G,CAAC;QACL,CAAC;QAED,OAAO;YACH,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM;SACT,CAAA;IACL,CAAC;CACJ;AApCD,0CAoCC"}
1
+ {"version":3,"file":"ValidationError.js","sourceRoot":"","sources":["../../src/errors/ValidationError.ts"],"names":[],"mappings":";;;AAyCA,MAAa,eAEX,SAAQ,KAAK;IACM,QAAQ,CAAS;IAClB,IAAI,CAAS;IACb,KAAK,CAAa;IAClB,MAAM,CAAiB;IAEvC,YAAmB,IAAY,EAAE,KAAiB,EAAE,OAAe,EAAE,MAAuB;QACxF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAEM,MAAM;QACT,IAAI,MAAsC,CAAC;QAE3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1G,CAAC;QACL,CAAC;QAED,OAAO;YACH,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM;SACT,CAAA;IACL,CAAC;CACJ;AApCD,0CAoCC"}
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type IntValidationOptions } from "./types/number/IntValidator";
2
2
  import { type NumberValidationOptions } from "./types/number/NumberValidator";
3
- import { type FieldValidators } from "./types/object/ObjectValidator";
3
+ import { type FieldValidators, type ObjectValidationOptions } from "./types/object/ObjectValidator";
4
4
  import { type StringValidationOptions } from "./types/string/StringValidator";
5
5
  import { Validator } from "./Validator";
6
6
  import { type OrValidators } from "./types/util/OrValidator";
@@ -18,7 +18,7 @@ export declare class v {
18
18
  static number(options?: NumberValidationOptions): Validator<number>;
19
19
  static array<T>(item: Validator<T>, options?: ArrayValidatorOptions): Validator<T[]>;
20
20
  static enum<T extends EnumLike>(enumInstance: T): Validator<T[keyof T]>;
21
- static object<T extends object>(fields: FieldValidators<T>): Validator<T>;
21
+ static object<T extends object>(fields: FieldValidators<T>, options?: ObjectValidationOptions): Validator<T>;
22
22
  static record<T extends RecordType>(field: RecordTypeValidator<T>): Validator<T>;
23
23
  static tuple<T extends [...unknown[]]>(validators: TupleValidators<T>): Validator<T>;
24
24
  static string<T extends string = string>(options?: StringValidationOptions): Validator<T>;
package/index.js CHANGED
@@ -39,8 +39,8 @@ class v {
39
39
  static enum(enumInstance) {
40
40
  return new EnumValidator_1.EnumValidator(enumInstance);
41
41
  }
42
- static object(fields) {
43
- return new ObjectValidator_1.ObjectValidator(fields);
42
+ static object(fields, options) {
43
+ return new ObjectValidator_1.ObjectValidator(fields, options);
44
44
  }
45
45
  static record(field) {
46
46
  return new RecordValidator_1.RecordValidator(field);
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oEAAiE;AACjE,8DAAsF;AACtF,oEAA+F;AAC/F,oEAAuF;AACvF,sEAAmE;AACnE,oEAA+F;AAE/F,4DAAyD;AACzD,0DAA0E;AAC1E,kEAA2F;AAC3F,gEAA4E;AAC5E,kEAAqF;AACrF,0EAA+H;AAC/H,oEAA4G;AAE5G,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,gDAAgE;AAAvD,sGAAA,SAAS,OAAA;AAClB,4DAA6E;AAApE,kHAAA,eAAe,OAAA;AAExB,MAAa,CAAC;IACV,UAAU;IACH,MAAM,CAAC,OAAO;QACjB,OAAO,IAAI,mCAAgB,EAAE,CAAC;IAClC,CAAC;IAED,UAAU;IACH,MAAM,CAAC,GAAG,CAAC,OAA8B;QAC5C,OAAO,IAAI,2BAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,OAAiC;QAClD,OAAO,IAAI,iCAAe,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,UAAU;IACH,MAAM,CAAC,KAAK,CAAI,IAAkB,EAAE,OAA+B;QACtE,OAAO,IAAI,+BAAc,CAAI,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACM,MAAM,CAAC,IAAI,CAAqB,YAAe;QAClD,OAAO,IAAI,6BAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IACM,MAAM,CAAC,MAAM,CAAmB,MAA0B;QAC7D,OAAO,IAAI,iCAAe,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACM,MAAM,CAAC,MAAM,CAAuB,KAA6B;QACpE,OAAO,IAAI,iCAAe,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACM,MAAM,CAAC,KAAK,CAA2B,UAA8B;QACxE,OAAO,IAAI,+BAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU;IACH,MAAM,CAAC,MAAM,CAA4B,OAAiC;QAC7E,OAAO,IAAI,iCAAe,CAAI,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU;IACH,MAAM,CAAC,GAAG;QACb,OAAO,IAAI,2BAAY,EAAK,CAAC;IACjC,CAAC;IACM,MAAM,CAAC,UAAU,CAAI,QAA4B,EAAE,OAAwC;QAC9F,OAAO,IAAI,yCAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAIM,MAAM,CAAC,QAAQ,CAAI,GAA4C,EAAE,IAA2B;QAC/F,OAAO,IAAI,qCAAiB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACM,MAAM,CAAC,EAAE,CAAI,UAA2B;QAC3C,OAAO,IAAI,yBAAW,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;CACJ;AApDD,cAoDC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oEAAiE;AACjE,8DAAsF;AACtF,oEAA+F;AAC/F,oEAAqH;AACrH,sEAAmE;AACnE,oEAA+F;AAE/F,4DAAyD;AACzD,0DAA0E;AAC1E,kEAA2F;AAC3F,gEAA4E;AAC5E,kEAAqF;AACrF,0EAA+H;AAC/H,oEAA4G;AAE5G,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,gDAAgE;AAAvD,sGAAA,SAAS,OAAA;AAClB,4DAA6E;AAApE,kHAAA,eAAe,OAAA;AAExB,MAAa,CAAC;IACV,UAAU;IACH,MAAM,CAAC,OAAO;QACjB,OAAO,IAAI,mCAAgB,EAAE,CAAC;IAClC,CAAC;IAED,UAAU;IACH,MAAM,CAAC,GAAG,CAAC,OAA8B;QAC5C,OAAO,IAAI,2BAAY,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,OAAiC;QAClD,OAAO,IAAI,iCAAe,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,UAAU;IACH,MAAM,CAAC,KAAK,CAAI,IAAkB,EAAE,OAA+B;QACtE,OAAO,IAAI,+BAAc,CAAI,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACM,MAAM,CAAC,IAAI,CAAqB,YAAe;QAClD,OAAO,IAAI,6BAAa,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IACM,MAAM,CAAC,MAAM,CAAmB,MAA0B,EAAE,OAAiC;QAChG,OAAO,IAAI,iCAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACM,MAAM,CAAC,MAAM,CAAuB,KAA6B;QACpE,OAAO,IAAI,iCAAe,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACM,MAAM,CAAC,KAAK,CAA2B,UAA8B;QACxE,OAAO,IAAI,+BAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU;IACH,MAAM,CAAC,MAAM,CAA4B,OAAiC;QAC7E,OAAO,IAAI,iCAAe,CAAI,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU;IACH,MAAM,CAAC,GAAG;QACb,OAAO,IAAI,2BAAY,EAAK,CAAC;IACjC,CAAC;IACM,MAAM,CAAC,UAAU,CAAI,QAA4B,EAAE,OAAwC;QAC9F,OAAO,IAAI,yCAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAIM,MAAM,CAAC,QAAQ,CAAI,GAA4C,EAAE,IAA2B;QAC/F,OAAO,IAAI,qCAAiB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACM,MAAM,CAAC,EAAE,CAAI,UAA2B;QAC3C,OAAO,IAAI,yBAAW,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;CACJ;AApDD,cAoDC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@local901/validator",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "description": "Type validator for javascript and typescript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -3,10 +3,19 @@ import { Validator } from "../../Validator";
3
3
  export type FieldValidators<T extends object> = {
4
4
  [K in keyof T]-?: Validator<T[K]>;
5
5
  };
6
+ export type ObjectValidationOptions = {
7
+ /**
8
+ * Are additional properties allowed
9
+ *
10
+ * @default false
11
+ */
12
+ additionalProperties?: boolean;
13
+ };
6
14
  export declare class ObjectValidator<T extends object> extends Validator<T> {
7
15
  readonly fields: FieldValidators<T>;
16
+ private readonly options;
8
17
  type: string;
9
- constructor(fields: FieldValidators<T>);
18
+ constructor(fields: FieldValidators<T>, options?: ObjectValidationOptions);
10
19
  /** @inheritdoc */
11
20
  validateReturn(input: unknown): ValidationError<T> | null;
12
21
  }
@@ -5,10 +5,12 @@ const ErrorType_1 = require("../../errors/ErrorType");
5
5
  const Validator_1 = require("../../Validator");
6
6
  class ObjectValidator extends Validator_1.Validator {
7
7
  fields;
8
+ options;
8
9
  type = "object";
9
- constructor(fields) {
10
+ constructor(fields, options = {}) {
10
11
  super();
11
12
  this.fields = fields;
13
+ this.options = options;
12
14
  }
13
15
  /** @inheritdoc */
14
16
  validateReturn(input) {
@@ -16,10 +18,6 @@ class ObjectValidator extends Validator_1.Validator {
16
18
  if (typeof input !== "object" || input === null) {
17
19
  return this.createError(ErrorType_1.ErrorType.INCORRECT_TYPE, "Has to be an object.");
18
20
  }
19
- // Check for excess keys.
20
- const fieldKeys = Object.keys(this.fields);
21
- const inputKeys = Object.keys(input);
22
- const extraKeys = inputKeys.filter((k) => !fieldKeys.includes(k));
23
21
  // Check field types
24
22
  let hasError = false;
25
23
  const fields = Object.fromEntries(Object.entries(this.fields).map(([key, validator]) => {
@@ -29,12 +27,18 @@ class ObjectValidator extends Validator_1.Validator {
29
27
  }
30
28
  return [key, result ?? undefined];
31
29
  }).filter(([, error]) => !!error));
32
- if (hasError || extraKeys.length) {
30
+ // Check for excess keys.
31
+ if (!this.options.additionalProperties) {
32
+ const fieldKeys = Object.keys(this.fields);
33
+ const inputKeys = Object.keys(input);
34
+ const extraKeys = inputKeys.filter((k) => !fieldKeys.includes(k));
33
35
  if (extraKeys.length) {
34
36
  return this.createError(ErrorType_1.ErrorType.UNKNOWN_FIELD, `No extra keys allowed. Found [${extraKeys.join(", ")}].`, hasError
35
37
  ? fields
36
38
  : undefined);
37
39
  }
40
+ }
41
+ if (hasError) {
38
42
  return this.createError(ErrorType_1.ErrorType.INCORRECT_TYPE, "One or more fields are incorrect.", fields);
39
43
  }
40
44
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectValidator.js","sourceRoot":"","sources":["../../../src/types/object/ObjectValidator.ts"],"names":[],"mappings":";;;AAAA,sDAAmD;AAEnD,+CAA4C;AAM5C,MAAa,eAAkC,SAAQ,qBAAY;IAG5B;IAFnB,IAAI,GAAG,QAAQ,CAAC;IAEhC,YAAmC,MAA0B;QACzD,KAAK,EAAE,CAAC;QADuB,WAAM,GAAN,MAAM,CAAoB;IAE7D,CAAC;IAED,kBAAkB;IACF,cAAc,CAAC,KAAc;QACzC,aAAa;QACb,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAS,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;QAC9E,CAAC;QAED,yBAAyB;QACzB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAElE,oBAAoB;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE;YACnF,MAAM,MAAM,GAAI,SAAuB,CAAC,cAAc,CAAE,KAAmD,CAAC,GAAG,CAAC,CAAC,CAAC;YAClH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,QAAQ,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAmB,CAAC;QAErD,IAAI,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC,WAAW,CACnB,qBAAS,CAAC,aAAa,EACvB,iCAAiC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACzD,QAAQ;oBACJ,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,SAAS,CAClB,CAAC;YACN,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAS,CAAC,cAAc,EAAE,mCAAmC,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA3CD,0CA2CC"}
1
+ {"version":3,"file":"ObjectValidator.js","sourceRoot":"","sources":["../../../src/types/object/ObjectValidator.ts"],"names":[],"mappings":";;;AAAA,sDAAmD;AAEnD,+CAA4C;AAe5C,MAAa,eAAkC,SAAQ,qBAAY;IAG5B;IAA6C;IAFhE,IAAI,GAAG,QAAQ,CAAC;IAEhC,YAAmC,MAA0B,EAAmB,UAAmC,EAAE;QACjH,KAAK,EAAE,CAAC;QADuB,WAAM,GAAN,MAAM,CAAoB;QAAmB,YAAO,GAAP,OAAO,CAA8B;IAErH,CAAC;IAED,kBAAkB;IACF,cAAc,CAAC,KAAc;QACzC,aAAa;QACb,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAS,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;QAC9E,CAAC;QAED,oBAAoB;QACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE;YACnF,MAAM,MAAM,GAAI,SAAuB,CAAC,cAAc,CAAE,KAAmD,CAAC,GAAG,CAAC,CAAC,CAAC;YAClH,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClB,QAAQ,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAmB,CAAC;QAErD,yBAAyB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAElE,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC,WAAW,CACnB,qBAAS,CAAC,aAAa,EACvB,iCAAiC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EACzD,QAAQ;oBACJ,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,SAAS,CAClB,CAAC;YACN,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAS,CAAC,cAAc,EAAE,mCAAmC,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA9CD,0CA8CC"}