{"version":3,"file":"ngx-forms-validator.mjs","sources":["../../../projects/ngx-forms-validator/src/lib/assets/i18n/es_ES.ts","../../../projects/ngx-forms-validator/src/lib/assets/i18n/en_US.ts","../../../projects/ngx-forms-validator/src/lib/assets/i18n/eo_EO.ts","../../../projects/ngx-forms-validator/src/lib/services/translate.service.ts","../../../projects/ngx-forms-validator/src/lib/services/formValidator.service.ts","../../../projects/ngx-forms-validator/src/lib/validators/custom-validator.component.ts","../../../projects/ngx-forms-validator/src/ngx-forms-validator.ts"],"sourcesContent":["export const translationEsEs = {\r\n  requiredGraterThan0: 'Debe ser mayor que 0',\r\n  withoutMessage: '',\r\n  malformedField: 'Campo no válido',\r\n  required: 'Campo obligatorio',\r\n  email: 'Correo no válido',\r\n  pattern: 'Formato no válido',\r\n  whiteSpaceLine: 'No se permiten espacios en blanco',\r\n  leadingWhiteSpaceLine: 'No se permiten espacios al inicio',\r\n  trailingWhiteSpaceLine: 'No se permiten espacios al final',\r\n  maxlength: 'Demasiados caracteres',\r\n  minlength: 'Demasiado corto',\r\n  invalid: 'Entrada no válida',\r\n  maxLengthWarning: 'Límite alcanzado',\r\n  valueNoExist: 'Valor no está en la lista',\r\n  introducedValueNoExist: 'Elemento no encontrado',\r\n  number: 'Debe ser un número'\r\n};\r\n","export const translationEnUs = {\r\n  requiredGraterThan0: 'Must be greater than 0',\r\n  withoutMessage: '',\r\n  malformedField: 'Invalid field',\r\n  required: 'Required field',\r\n  email: 'Invalid email',\r\n  pattern: 'Invalid format',\r\n  whiteSpaceLine: 'No white spaces',\r\n  leadingWhiteSpaceLine: 'No leading spaces',\r\n  trailingWhiteSpaceLine: 'No trailing spaces',\r\n  maxlength: 'Too many characters',\r\n  minlength: 'Too short',\r\n  invalid: 'Invalid input',\r\n  maxLengthWarning: 'Limit reached',\r\n  valueNoExist: 'Value not in list',\r\n  introducedValueNoExist: 'Item not found',\r\n  number: 'Must be a number'\r\n};\r\n","export const translationEoEo = {\r\n  requiredGraterThan0: 'Devas esti pli granda ol 0',\r\n  withoutMessage: '',\r\n  malformedField: 'Nevalida kampo',\r\n  required: 'Deviga kampo',\r\n  email: 'Nevalida retpoŝto',\r\n  pattern: 'Nevalida formato',\r\n  whiteSpaceLine: 'Neniuj blankspacoj permesitaj',\r\n  leadingWhiteSpaceLine: 'Neniuj komencaj blankspacoj',\r\n  trailingWhiteSpaceLine: 'Neniuj finaj blankspacoj',\r\n  maxlength: 'Tro da signoj',\r\n  minlength: 'Tro mallonga',\r\n  invalid: 'Nevalida enigo',\r\n  maxLengthWarning: 'Limo atingita',\r\n  valueNoExist: 'Valoro ne en la listo',\r\n  introducedValueNoExist: 'Elemento ne trovita',\r\n  number: 'Devas esti nombro'\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { translationEsEs } from '../assets/i18n/es_ES';\r\nimport { translationEnUs } from '../assets/i18n/en_US';\r\nimport { translationEoEo } from '../assets/i18n/eo_EO';\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class TranslateService {\r\n\r\n  private translations: any | undefined = translationEnUs;\r\n  private customTranslations: Record<string, Record<string, string>> | undefined;\r\n  \r\n  public setCustomTranslations(translations: any) {\r\n    this.customTranslations = translations;\r\n  }\r\n\r\n  public setTranslationLanguaje(lang: string) {\r\n    switch (lang) {\r\n      case \"es_ES\":\r\n        this.translations = translationEsEs;\r\n        break;\r\n    \r\n      case \"en_US\":\r\n        this.translations = translationEnUs;\r\n        break;\r\n\r\n      case \"eo_EO\":\r\n        this.translations = translationEoEo;\r\n        break;\r\n    \r\n      default:\r\n        this.translations = translationEnUs;\r\n        break;\r\n    }\r\n  }\r\n\r\n  public getTranslation() {\r\n    return { ...this.translations, ...this.customTranslations };\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TranslateService } from './translate.service';\r\n\r\n/**\r\n * Configuration options for form validation\r\n */\r\ninterface ValidationOptions {\r\n  /**\r\n   * When true, displays a warning message when an input reaches its maximum length.\r\n   * This helps users know they've reached the character limit for a field.\r\n   * Default: false\r\n   */\r\n  showMaxLengthWarning?: boolean;\r\n  \r\n  /**\r\n   * When true, immediately marks all form controls as \"dirty\", causing validation\r\n   * errors to display right away without waiting for user interaction.\r\n   * Use this when you want to show all validation errors at once, such as after\r\n   * a form submission attempt.\r\n   * Default: false\r\n   */\r\n  markFieldsAsDirty?: boolean;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root',\r\n})\r\nexport class FormValidatorService {\r\n  private translations: Record<string, string>;\r\n\r\n  constructor(private translationService: TranslateService) {\r\n    this.translations = this.translationService.getTranslation();\r\n  }\r\n\r\n /**\r\n   * Sets up form validation with visual feedback for all controls in the form\r\n   * \r\n   * @param form The Angular FormGroup to validate\r\n   * @param options Configuration options:\r\n   *   - markFieldsAsDirty: When true, immediately shows all validation errors without waiting for user interaction\r\n   *   - showMaxLengthWarning: When true, shows a warning when an input field reaches its maximum character length\r\n   */\r\n  public validateForm(form: FormGroup, options: ValidationOptions = {}): void {\r\n    const { showMaxLengthWarning = false, markFieldsAsDirty = false } = options;\r\n\r\n    Object.keys(form.value).forEach((controlName) => {\r\n      const control = form.get(controlName);\r\n      if (!control) return;\r\n\r\n      setTimeout(() => {\r\n        if (markFieldsAsDirty) {\r\n          control.markAsDirty();\r\n        }\r\n        this.validateField(controlName, form);\r\n      });\r\n\r\n      if (!markFieldsAsDirty) {\r\n        control.valueChanges.subscribe(() => {\r\n          setTimeout(() => {\r\n            this.validateField(controlName, form, showMaxLengthWarning);\r\n          });\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Validates a single form field and updates UI accordingly\r\n   * @param controlName Form control name\r\n   * @param form The form containing the control\r\n   * @param showMaxLengthWarning Whether to show warning when max length is reached\r\n   */\r\n  public validateField(controlName: string, form: FormGroup, showMaxLengthWarning = false): void {\r\n    const control = form.get(controlName);\r\n    if (!control) return;\r\n\r\n    const parentElement = document.getElementById(controlName)?.parentElement || null;\r\n    const inputElement = document.getElementById(controlName) as HTMLInputElement | null;\r\n    \r\n    if (!inputElement || inputElement.nodeName === 'TABLE' || inputElement.nodeName === 'DIV') {\r\n      return;\r\n    }\r\n\r\n    // Remove existing validation messages\r\n    this.removeExistingMessages(controlName);\r\n\r\n    // Create new message elements\r\n    const errorElement = this.createMessageElement(controlName, 'error-field-message');\r\n    const warningElement = this.createMessageElement(controlName, 'warning-field', 'warning');\r\n\r\n    // Process validation based on control state\r\n    if (control.errors) {\r\n      this.handleErrorState(errorElement, controlName, inputElement, form, parentElement);\r\n    } else {\r\n      this.handleValidState(errorElement, inputElement, warningElement, parentElement, controlName, form, showMaxLengthWarning);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Creates a message element for validation feedback\r\n   */\r\n  private createMessageElement(controlName: string, className: string, type = 'error'): HTMLSpanElement {\r\n    const element = document.createElement('span');\r\n    element.classList.add(className);\r\n    element.setAttribute('id', `${type}-field-message-${controlName}`);\r\n    return element;\r\n  }\r\n\r\n  /**\r\n   * Removes existing validation messages for a control\r\n   */\r\n  private removeExistingMessages(controlName: string): void {\r\n    const errorMessage = document.getElementById(`error-field-message-${controlName}`);\r\n    const warningMessage = document.getElementById(`warning-field-message-${controlName}`);\r\n    \r\n    if (errorMessage) errorMessage.remove();\r\n    if (warningMessage) warningMessage.remove();\r\n  }\r\n\r\n  /**\r\n   * Handles the display of validation errors\r\n   */\r\n  public handleErrorState(errorElement: HTMLSpanElement, controlName: string, inputElement: HTMLInputElement, \r\n                         form: FormGroup, parentElement: HTMLElement | null): void {\r\n    const control = form.get(controlName);\r\n    if (!control || !control.errors) return;\r\n\r\n    errorElement.innerHTML = this.getErrorMessage(Object.keys(control.errors));\r\n\r\n    if (control.dirty) {\r\n      if (parentElement) parentElement.append(errorElement);\r\n      \r\n      if (inputElement) {\r\n        inputElement.classList.add('ng-dirty', 'ng-touched', 'error-field');\r\n        inputElement.classList.remove('ok-field');\r\n      }\r\n    } else if (inputElement) {\r\n      inputElement.classList.remove('ng-dirty', 'ok-field', 'ng-valid');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handles the display of valid state and max length warnings\r\n   */\r\n  public handleValidState(errorElement: HTMLSpanElement, inputElement: HTMLInputElement, warningElement: HTMLSpanElement,\r\n                         parentElement: HTMLElement | null, controlName: string, form: FormGroup, \r\n                         showMaxLengthWarning = false): void {\r\n    errorElement.innerHTML = this.translations['required'];\r\n\r\n    // Show max length warning if enabled and condition is met\r\n    if (showMaxLengthWarning && this.isMaxLengthReached(inputElement)) {\r\n      this.displayMaxLengthWarning(warningElement, parentElement, controlName);\r\n    }\r\n\r\n    if (inputElement) {\r\n      inputElement.classList.add('ok-field', 'ng-valid', 'ng-touched');\r\n      inputElement.classList.remove('error-field');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Checks if input has reached its maximum length\r\n   */\r\n  private isMaxLengthReached(inputElement: HTMLInputElement | null): boolean {\r\n    return !!(\r\n      inputElement && \r\n      inputElement.maxLength && \r\n      inputElement.value && \r\n      inputElement.maxLength === inputElement.value.length && \r\n      inputElement.classList.contains('ng-touched')\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Displays max length warning message\r\n   */\r\n  public displayMaxLengthWarning(warningElement: HTMLSpanElement, parentElement: HTMLElement | null, controlName: string): void {\r\n    warningElement.innerHTML = this.translations['maxLengthWarning'];\r\n    if (parentElement) parentElement.append(warningElement);\r\n  }\r\n\r\n  /**\r\n   * Prioritizes and returns the appropriate error message\r\n   */\r\n  public getErrorMessage(errors: string[]): string {\r\n    if (errors.includes('required')) {\r\n      return this.translations['required'];\r\n    } else if (errors.includes('whiteSpaceLine')) {\r\n      return this.translations['whiteSpaceLine'];\r\n    }\r\n    return this.translations[errors[0]] || 'Invalid value';\r\n  }\r\n}","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class CustomValidators {\r\n  /**\r\n   * Validates that the control value contains only numeric characters (0-9).\r\n   * Empty values are considered valid.\r\n   * \r\n   * @param control The form control to validate\r\n   * @returns ValidationErrors with {number: true} if invalid, null if valid\r\n   * @example\r\n   * this.formGroup = this.fb.group({\r\n   *   age: ['', [Validators.required, CustomValidators.onlyNumber]]\r\n   * });\r\n   */\r\n  public static onlyNumber(control: AbstractControl): ValidationErrors | null {\r\n    if (!control.value && control.value !== 0)  return null;\r\n    \r\n    const value = String(control.value);\r\n    return /^[0-9]*$/.test(value) ? null : { number: true };\r\n  }\r\n\r\n  /**\r\n   * Validates that the control value is not composed of only whitespace characters.\r\n   * Empty values are considered valid.\r\n   * \r\n   * @param control The form control to validate\r\n   * @returns ValidationErrors with {whiteSpaceLine: true} if invalid, null if valid\r\n   * @example\r\n   * this.formGroup = this.fb.group({\r\n   *   description: ['', [Validators.required, CustomValidators.hasWhiteSpaceLine]]\r\n   * });\r\n   */\r\n  public static hasWhiteSpaceLine(control: AbstractControl): ValidationErrors | null {\r\n    return /^\\s*$/.test(control.value as string) && control.value.length > 0\r\n      ? { whiteSpaceLine: true }\r\n      : null;\r\n  }\r\n\r\n  /**\r\n   * Validates that the control value exists within a provided list of valid values.\r\n   * Empty values are considered valid.\r\n   * \r\n   * @param datalist Array of valid values to check against\r\n   * @param customError Optional custom error key to return instead of the default that is 'valueNoExist'\r\n   *                    If set to 'none', no error message will be returned.\r\n   * @returns A validator function that returns an error object if invalid, empty object if valid\r\n   * @example\r\n   * const allowedCities = ['New York', 'London', 'Tokyo'];\r\n   * this.formGroup = this.fb.group({\r\n   *   city: ['', [Validators.required, CustomValidators.introducedValueExists(allowedCities)]]\r\n   * });\r\n   */\r\n  public static introducedValueExists(datalist: any[], customError?: string): ValidatorFn {\r\n    return (control: AbstractControl): {} => {\r\n      if (!control.value || datalist.find((val: any) => val === control.value)) {\r\n        return {};\r\n      }\r\n\r\n      if (customError) {\r\n        return customError === 'none' ? { withoutMessage: true } : { [customError]: true };\r\n      }\r\n\r\n      return { valueNoExist: true };\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Validates that the control value does not start with a whitespace character.\r\n   * \r\n   * @param control The form control to validate\r\n   * @returns ValidationErrors with {leadingWhiteSpaceLine: true} if invalid, null if valid\r\n   * @example\r\n   * this.formGroup = this.fb.group({\r\n   *   username: ['', [Validators.required, CustomValidators.hasLeadingWhiteSpace]]\r\n   * });\r\n   */\r\n  public static hasLeadingWhiteSpace(control: AbstractControl): ValidationErrors | null {\r\n    if (control.value?.toString().charAt(0) === ' ') {\r\n      return { leadingWhiteSpaceLine: true };\r\n    } else {\r\n      return null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Validates that the control value does not end with a whitespace character.\r\n   * \r\n   * @param control The form control to validate\r\n   * @returns ValidationErrors with {trailingWhiteSpaceLine: true} if invalid, null if valid\r\n   * @example\r\n   * this.formGroup = this.fb.group({\r\n   *   password: ['', [Validators.required, CustomValidators.hasTrailingWhiteSpace]]\r\n   * });\r\n   */\r\n  public static hasTrailingWhiteSpace(control: AbstractControl): ValidationErrors | null {\r\n    if (control.value?.toString().charAt(control.value.toString().length - 1) === ' ') {\r\n      return { trailingWhiteSpaceLine: true };\r\n    } else {\r\n      return null;\r\n    }\r\n  }\r\n  \r\n  /**\r\n   * Validates that the size of the control value in bytes does not exceed the specified maximum.\r\n   * Useful for validating file sizes or input lengths in bytes rather than characters.\r\n   * \r\n   * @param maxLength Maximum allowed size in bytes\r\n   * @returns A validator function that returns {maxlength: true} if size exceeds limit\r\n   * @example\r\n   * // Validate that a file input doesn't exceed 5MB\r\n   * this.formGroup = this.fb.group({\r\n   *   fileUpload: ['', [Validators.required, CustomValidators.maxByte(1024)]]\r\n   * });\r\n   */\r\n  public static maxByte(maxLength: number): ValidatorFn {\r\n    return (control: { value: BlobPart }): ValidationErrors | null => {\r\n      const size = new Blob([control.value]).size;\r\n      return size >= maxLength + 1 ? { maxlength: true } : null;\r\n    };\r\n  }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TranslateService"],"mappings":";;;AAAO,MAAM,eAAe,GAAG;AAC7B,IAAA,mBAAmB,EAAE,sBAAsB;AAC3C,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,cAAc,EAAE,iBAAiB;AACjC,IAAA,QAAQ,EAAE,mBAAmB;AAC7B,IAAA,KAAK,EAAE,kBAAkB;AACzB,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,cAAc,EAAE,mCAAmC;AACnD,IAAA,qBAAqB,EAAE,mCAAmC;AAC1D,IAAA,sBAAsB,EAAE,kCAAkC;AAC1D,IAAA,SAAS,EAAE,uBAAuB;AAClC,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,OAAO,EAAE,mBAAmB;AAC5B,IAAA,gBAAgB,EAAE,kBAAkB;AACpC,IAAA,YAAY,EAAE,2BAA2B;AACzC,IAAA,sBAAsB,EAAE,wBAAwB;AAChD,IAAA,MAAM,EAAE,oBAAoB;CAC7B;;ACjBM,MAAM,eAAe,GAAG;AAC7B,IAAA,mBAAmB,EAAE,wBAAwB;AAC7C,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,cAAc,EAAE,eAAe;AAC/B,IAAA,QAAQ,EAAE,gBAAgB;AAC1B,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,cAAc,EAAE,iBAAiB;AACjC,IAAA,qBAAqB,EAAE,mBAAmB;AAC1C,IAAA,sBAAsB,EAAE,oBAAoB;AAC5C,IAAA,SAAS,EAAE,qBAAqB;AAChC,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,OAAO,EAAE,eAAe;AACxB,IAAA,gBAAgB,EAAE,eAAe;AACjC,IAAA,YAAY,EAAE,mBAAmB;AACjC,IAAA,sBAAsB,EAAE,gBAAgB;AACxC,IAAA,MAAM,EAAE,kBAAkB;CAC3B;;ACjBM,MAAM,eAAe,GAAG;AAC7B,IAAA,mBAAmB,EAAE,4BAA4B;AACjD,IAAA,cAAc,EAAE,EAAE;AAClB,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,QAAQ,EAAE,cAAc;AACxB,IAAA,KAAK,EAAE,mBAAmB;AAC1B,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,cAAc,EAAE,+BAA+B;AAC/C,IAAA,qBAAqB,EAAE,6BAA6B;AACpD,IAAA,sBAAsB,EAAE,0BAA0B;AAClD,IAAA,SAAS,EAAE,eAAe;AAC1B,IAAA,SAAS,EAAE,cAAc;AACzB,IAAA,OAAO,EAAE,gBAAgB;AACzB,IAAA,gBAAgB,EAAE,eAAe;AACjC,IAAA,YAAY,EAAE,uBAAuB;AACrC,IAAA,sBAAsB,EAAE,qBAAqB;AAC7C,IAAA,MAAM,EAAE,mBAAmB;CAC5B;;ACZD,MAGa,gBAAgB,CAAA;AAH7B,IAAA,WAAA,GAAA;QAKU,IAAY,CAAA,YAAA,GAAoB,eAAe,CAAC;AA8BzD,KAAA;AA3BQ,IAAA,qBAAqB,CAAC,YAAiB,EAAA;AAC5C,QAAA,IAAI,CAAC,kBAAkB,GAAG,YAAY,CAAC;KACxC;AAEM,IAAA,sBAAsB,CAAC,IAAY,EAAA;AACxC,QAAA,QAAQ,IAAI;AACV,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;gBACpC,MAAM;AAER,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;gBACpC,MAAM;AAER,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;gBACpC,MAAM;AAER,YAAA;AACE,gBAAA,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;gBACpC,MAAM;AACT,SAAA;KACF;IAEM,cAAc,GAAA;QACnB,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;KAC7D;+GA/BU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACkBD,MAGa,oBAAoB,CAAA;AAG/B,IAAA,WAAA,CAAoB,kBAAoC,EAAA;QAApC,IAAkB,CAAA,kBAAA,GAAlB,kBAAkB,CAAkB;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;KAC9D;AAEF;;;;;;;AAOI;AACI,IAAA,YAAY,CAAC,IAAe,EAAE,OAAA,GAA6B,EAAE,EAAA;QAClE,MAAM,EAAE,oBAAoB,GAAG,KAAK,EAAE,iBAAiB,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;AAE5E,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACtC,YAAA,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,iBAAiB,EAAE;oBACrB,OAAO,CAAC,WAAW,EAAE,CAAC;AACvB,iBAAA;AACD,gBAAA,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACxC,aAAC,CAAC,CAAC;YAEH,IAAI,CAAC,iBAAiB,EAAE;AACtB,gBAAA,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;oBAClC,UAAU,CAAC,MAAK;wBACd,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAC9D,qBAAC,CAAC,CAAC;AACL,iBAAC,CAAC,CAAC;AACJ,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACI,IAAA,aAAa,CAAC,WAAmB,EAAE,IAAe,EAAE,oBAAoB,GAAG,KAAK,EAAA;QACrF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,OAAO;YAAE,OAAO;AAErB,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,aAAa,IAAI,IAAI,CAAC;QAClF,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,WAAW,CAA4B,CAAC;AAErF,QAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,QAAQ,KAAK,OAAO,IAAI,YAAY,CAAC,QAAQ,KAAK,KAAK,EAAE;YACzF,OAAO;AACR,SAAA;;AAGD,QAAA,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;;QAGzC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;AACnF,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;;QAG1F,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;AACrF,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;AAC3H,SAAA;KACF;AAED;;AAEG;AACK,IAAA,oBAAoB,CAAC,WAAmB,EAAE,SAAiB,EAAE,IAAI,GAAG,OAAO,EAAA;QACjF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/C,QAAA,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAG,EAAA,IAAI,CAAkB,eAAA,EAAA,WAAW,CAAE,CAAA,CAAC,CAAC;AACnE,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;AAEG;AACK,IAAA,sBAAsB,CAAC,WAAmB,EAAA;QAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAuB,oBAAA,EAAA,WAAW,CAAE,CAAA,CAAC,CAAC;QACnF,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAyB,sBAAA,EAAA,WAAW,CAAE,CAAA,CAAC,CAAC;AAEvF,QAAA,IAAI,YAAY;YAAE,YAAY,CAAC,MAAM,EAAE,CAAC;AACxC,QAAA,IAAI,cAAc;YAAE,cAAc,CAAC,MAAM,EAAE,CAAC;KAC7C;AAED;;AAEG;IACI,gBAAgB,CAAC,YAA6B,EAAE,WAAmB,EAAE,YAA8B,EACnF,IAAe,EAAE,aAAiC,EAAA;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACtC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;AAExC,QAAA,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAE3E,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,YAAA,IAAI,aAAa;AAAE,gBAAA,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAEtD,YAAA,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AACpE,gBAAA,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3C,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,YAAY,EAAE;YACvB,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACnE,SAAA;KACF;AAED;;AAEG;AACI,IAAA,gBAAgB,CAAC,YAA6B,EAAE,YAA8B,EAAE,cAA+B,EAC/F,aAAiC,EAAE,WAAmB,EAAE,IAAe,EACvE,oBAAoB,GAAG,KAAK,EAAA;QACjD,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;;QAGvD,IAAI,oBAAoB,IAAI,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE;YACjE,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAC1E,SAAA;AAED,QAAA,IAAI,YAAY,EAAE;YAChB,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AACjE,YAAA,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAC9C,SAAA;KACF;AAED;;AAEG;AACK,IAAA,kBAAkB,CAAC,YAAqC,EAAA;QAC9D,OAAO,CAAC,EACN,YAAY;AACZ,YAAA,YAAY,CAAC,SAAS;AACtB,YAAA,YAAY,CAAC,KAAK;AAClB,YAAA,YAAY,CAAC,SAAS,KAAK,YAAY,CAAC,KAAK,CAAC,MAAM;YACpD,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC9C,CAAC;KACH;AAED;;AAEG;AACI,IAAA,uBAAuB,CAAC,cAA+B,EAAE,aAAiC,EAAE,WAAmB,EAAA;QACpH,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;AACjE,QAAA,IAAI,aAAa;AAAE,YAAA,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;KACzD;AAED;;AAEG;AACI,IAAA,eAAe,CAAC,MAAgB,EAAA;AACrC,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;AAC/B,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AACtC,SAAA;AAAM,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;AAC5C,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAC5C,SAAA;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC;KACxD;+GApKU,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA,CAAA,EAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCzBY,gBAAgB,CAAA;AAC3B;;;;;;;;;;AAUG;IACI,OAAO,UAAU,CAAC,OAAwB,EAAA;QAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC;AAAG,YAAA,OAAO,IAAI,CAAC;QAExD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACpC,QAAA,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KACzD;AAED;;;;;;;;;;AAUG;IACI,OAAO,iBAAiB,CAAC,OAAwB,EAAA;AACtD,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAe,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AACtE,cAAE,EAAE,cAAc,EAAE,IAAI,EAAE;cACxB,IAAI,CAAC;KACV;AAED;;;;;;;;;;;;;AAaG;AACI,IAAA,OAAO,qBAAqB,CAAC,QAAe,EAAE,WAAoB,EAAA;QACvE,OAAO,CAAC,OAAwB,KAAQ;YACtC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAQ,KAAK,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE;AACxE,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;AAED,YAAA,IAAI,WAAW,EAAE;gBACf,OAAO,WAAW,KAAK,MAAM,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC;AACpF,aAAA;AAED,YAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAChC,SAAC,CAAC;KACH;AAED;;;;;;;;;AASG;IACI,OAAO,oBAAoB,CAAC,OAAwB,EAAA;AACzD,QAAA,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAC/C,YAAA,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;AACxC,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;KACF;AAED;;;;;;;;;AASG;IACI,OAAO,qBAAqB,CAAC,OAAwB,EAAA;QAC1D,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;AACjF,YAAA,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC;AACzC,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;KACF;AAED;;;;;;;;;;;AAWG;IACI,OAAO,OAAO,CAAC,SAAiB,EAAA;QACrC,OAAO,CAAC,OAA4B,KAA6B;AAC/D,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,YAAA,OAAO,IAAI,IAAI,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAC5D,SAAC,CAAC;KACH;AACF;;ACxHD;;AAEG;;;;"}