{
  "version": 3,
  "sources": ["../../src/modules/form-group/context/Context.ts", "../../src/modules/form-group/context/Provider.tsx", "../../src/modules/form-group/FormGroup.ts", "../../src/modules/form-group/control/AbstractControl.ts", "../../src/modules/form-group/control/accessor/ControlValueAccessorBase.ts", "../../src/modules/form-group/control/accessor/FormControlStatus.ts", "../../src/modules/form-group/control/FormControlBase.ts", "../../src/modules/form-group/context/use.ts", "../../src/modules/form-group/storage/ArchivistFormGroupStorage.ts"],
  "sourcesContent": ["import { createContextEx } from '@ariestools/sdk-react/shared'\n\nimport type { FormGroupContextWithPayloadState } from './State.ts'\n\n/** React context holding the active {@link FormGroup} for payload-backed forms. */\nexport const FormGroupBaseContext = createContextEx<FormGroupContextWithPayloadState>()\n", "import type { Payload } from '@xyo-network/sdk'\nimport type { PropsWithChildren } from 'react'\nimport React, { useMemo } from 'react'\n\nimport type { FormGroupParams } from '../FormGroup.ts'\nimport { FormGroup } from '../FormGroup.ts'\nimport { FormGroupBaseContext } from './Context.ts'\nimport type { FormGroupContextWithPayloadState } from './State.ts'\n\n/** Props for {@link FormGroupPayloadProvider}. */\nexport interface FormGroupPayloadProviderProps<TStorage extends Payload = Payload> extends PropsWithChildren {\n  params?: FormGroupParams<TStorage>\n}\n\n/**\n * Provides a FormGroup to child components.\n */\nexport const FormGroupPayloadProvider = ({\n  children, params, ...props\n}: FormGroupPayloadProviderProps) => {\n  const formGroup = useMemo(() => {\n    const formGroup = new FormGroup<Payload, Payload>(params)\n    return formGroup\n  }, [params])\n\n  const value: FormGroupContextWithPayloadState = useMemo(() => ({ formGroup, provided: true }), [formGroup])\n\n  return (\n\n    <FormGroupBaseContext\n      value={value}\n      {...props}\n    >\n      {children}\n    </FormGroupBaseContext>\n  )\n}\n", "import type { EventListener } from '@ariestools/sdk'\nimport { forget } from '@ariestools/sdk'\nimport type { Payload } from '@xyo-network/sdk'\n\nimport type { ControlValueAccessorBaseEvents } from './control/index.ts'\nimport { AbstractControl } from './control/index.ts'\nimport type { ErrorSummary } from './InputError.ts'\nimport type { FormGroupStorage } from './storage/index.ts'\n\n/** Payload that may include a `timestamp` used for storage TTL checks. */\nexport type PayloadWithTimestamp = Payload<{ timestamp?: number }>\n\n/** String-key subset of `keyof T`, or `never` when keys are not strings. */\nexport type KeyOfString<T> = keyof T extends string ? keyof T : never\n\ntype FormGroupErrors<TValue> = Record<KeyOfString<TValue>, string>\n\n/** Construction options for {@link FormGroup}, including optional persistence. */\nexport interface FormGroupParams<TStorageValue extends Payload = Payload> {\n  serialize?: boolean\n  storage?: {\n    sensitive?: FormGroupStorage<TStorageValue>\n    storage?: FormGroupStorage<TStorageValue>\n  }\n  ttlStorage?: number\n}\n\ntype ValueChangeEventListener = EventListener<ControlValueAccessorBaseEvents['valueChanged']>\n\n/**\n * Organize form controls in a group.\n *\n * NOTE: This is a work in progress and only supports top level controls.  Nested controls are not supported.\n */\nexport class FormGroup<\n  TValue extends PayloadWithTimestamp = PayloadWithTimestamp,\n  TStorageValue extends PayloadWithTimestamp = PayloadWithTimestamp,\n> extends AbstractControl {\n  private _controls = {} as Record<KeyOfString<TValue>, AbstractControl>\n\n  private fgParams?: FormGroupParams<TStorageValue>\n\n  private serializeListeners: Record<string, ValueChangeEventListener> = {}\n\n  private serializedSensitiveState = {} as Record<KeyOfString<TStorageValue>, string>\n  private serializedState = {} as Record<KeyOfString<TStorageValue>, string>\n\n  constructor(fgParams?: FormGroupParams<TStorageValue>) {\n    super()\n    this.fgParams = fgParams\n  }\n\n  get errorSummary() {\n    const errorSummary: ErrorSummary = {\n      errorMessage: '',\n      invalidFields: [],\n    }\n    for (const [key, value] of Object.entries(this.errors)) {\n      if (value) {\n        errorSummary.errorMessage = `${errorSummary.errorMessage}, ${value}`\n        errorSummary.invalidFields.push(key)\n      }\n    }\n\n    return errorSummary\n  }\n\n  get errors(): FormGroupErrors<TValue> {\n    const value = {} as FormGroupErrors<TValue>\n    for (const key in this._controls) {\n      const castKey = key as KeyOfString<TValue>\n      value[castKey] = this._controls[castKey].error\n    }\n    return value\n  }\n\n  get nonSensitiveStorage() {\n    return this.fgParams?.storage?.storage\n  }\n\n  get sensitiveStorage() {\n    return this.fgParams?.storage?.sensitive\n  }\n\n  override get touched() {\n    return Object.values<AbstractControl>(this._controls).some(control => control.touched)\n  }\n\n  override get valid() {\n    return Object.values<AbstractControl>(this._controls).every(control => control.valid)\n  }\n\n  get values(): TValue {\n    const value = {} as TValue\n    for (const key in this._controls) {\n      const castKey = key as KeyOfString<TValue>\n      value[castKey] = this._controls[castKey].rawValue as TValue[KeyOfString<TValue>]\n    }\n    return value\n  }\n\n  getControl(name: string) {\n    return this._controls[name as KeyOfString<TValue>]\n  }\n\n  async getSerializedValue(name: string, sensitive = false): Promise<string | undefined> {\n    const storage = sensitive ? this.sensitiveStorage : this.nonSensitiveStorage\n    if (storage) {\n      const savedState = await storage.get()\n      if (savedState && name in savedState) {\n        const savedValue = savedState[name as keyof typeof savedState] as string\n\n        // casting to PayloadWithTimestamp to check for timestamp\n        const savedStateWithTimestamp = savedState as unknown as PayloadWithTimestamp\n        if (savedStateWithTimestamp.timestamp && this.fgParams?.ttlStorage) {\n          const expirationDate = savedStateWithTimestamp.timestamp + (this.fgParams?.ttlStorage ?? 0)\n          const now = Date.now()\n          return now > expirationDate ? undefined : savedValue\n        }\n        return savedValue\n      }\n    } else {\n      console.warn(`Cannot return value for ${name}. No storage set`)\n    }\n  }\n\n  registerControl(name: string, control: AbstractControl) {\n    if (this._controls[name as KeyOfString<TValue>]) console.error(`Replacing Control with name ${name} since it already exists!`)\n    this._controls[name as KeyOfString<TValue>] = control\n    this.serializeControlValue(name, control)\n  }\n\n  resetControls() {\n    for (const key in this._controls) {\n      this.unregisterControl(key)\n    }\n  }\n\n  resetValues() {\n    for (const control of Object.values<AbstractControl>(this._controls)) {\n      control.setValue('')\n    }\n  }\n\n  unregisterControl(name: string) {\n    const control = this._controls[name as KeyOfString<TValue>]\n\n    if (control) {\n      const listener = this.serializeListeners[name]\n      control.on('valueChanged', listener)\n      delete this.serializeListeners[name]\n      delete this._controls[name as KeyOfString<TValue>]\n    }\n  }\n\n  validateFields(requiredFields?: string[]) {\n    const castRequiredFields = requiredFields as KeyOfString<TValue>[]\n    for (const key in this._controls) {\n      const castKey = key as KeyOfString<TValue>\n      if (castRequiredFields === undefined || castRequiredFields.includes(castKey)) {\n        const control = this._controls[castKey]\n        control.validate()\n      }\n    }\n  }\n\n  private serializeControlValue(name: string, control: AbstractControl) {\n    const shouldSerialize = this.fgParams?.serialize\n    const sensitiveStorage = this.sensitiveStorage\n    const storage = this.nonSensitiveStorage\n\n    if (!shouldSerialize && (storage || sensitiveStorage)) console.warn('storage medium set but serialize is not enabled')\n\n    if (shouldSerialize && control.serializeSettings.serializable) {\n      this.setStateValueFromStorage(name, control)\n\n      const listener: ValueChangeEventListener = ({ value }) => {\n        // detect if control wants to be serialized\n        if (control.serializeSettings.serializable) {\n          // detect control's preferred storage\n          const targetStorage = control.serializeSettings.sensitive ? sensitiveStorage : storage\n\n          // detect control's preferred state\n          const targetState = control.serializeSettings.sensitive ? this.serializedSensitiveState : this.serializedState\n\n          // set the value\n          targetState[name as KeyOfString<TStorageValue>] = value ?? ''\n\n          // add a timestamp\n          const payloadWithTimestamp = targetState as PayloadWithTimestamp\n          payloadWithTimestamp.timestamp = Date.now()\n\n          // serialize the value\n          this.serializeValues(targetStorage, targetState as TStorageValue)\n        }\n      }\n\n      // listen for value changes\n      control.on('valueChanged', listener)\n\n      // store the listener for later removal\n      this.serializeListeners[name] = listener\n    }\n  }\n\n  private serializeValues(storage?: FormGroupStorage<TStorageValue>, values?: TStorageValue) {\n    if (storage && values) {\n      const write = async () => await storage.insert(values)\n      const clear = async () => await storage.clear()\n\n      forget(clear())\n      forget(write())\n    }\n  }\n\n  private setStateValueFromStorage(name: string, control: AbstractControl) {\n    const read = async () => {\n      const savedValue = await this.getSerializedValue(name, control.serializeSettings.sensitive)\n\n      if (savedValue) {\n        const targetState = control.serializeSettings.sensitive ? this.serializedSensitiveState : this.serializedState\n        targetState[name as KeyOfString<TStorageValue>] = savedValue\n\n        control.setValue(savedValue, { disableEmit: true })\n      }\n    }\n\n    forget(read())\n  }\n}\n", "import { forget } from '@ariestools/sdk'\n\nimport type {\n  ControlValueAccessorBaseEvents,\n  FormControlStatus,\n  ValidControlValue,\n} from './accessor/index.ts'\nimport {\n  ControlValueAccessorBase,\n  DISABLED,\n  INVALID,\n  PENDING,\n  VALID,\n} from './accessor/index.ts'\n\n/** Events emitted by {@link AbstractControl}, including status changes. */\nexport type AbstractControlEvents<TValue> = ControlValueAccessorBaseEvents<TValue> & {\n  statusChanged: { status: FormControlStatus }\n}\n\n/**\n * This is the base class for `Control` classes (i.e. FormControl),\n *\n * It provides some of the shared behavior that all controls and groups of controls have, like\n * running validators, calculating status, and resetting state. It also defines the properties\n * that are shared between all sub-classes, like `value`, `valid`, and `dirty`. It shouldn't be\n * instantiated directly.\n *\n * NOTE: Heavily borrowed from Angular's AbstractControl:\n * https://github.com/angular/angular/blob/5dcdbfcba934a930468aec140a7183b034466bdf/packages/forms/src/model/abstract_model.ts\n */\nexport class AbstractControl<TValue extends ValidControlValue = ValidControlValue> extends ControlValueAccessorBase<\n  TValue,\n  AbstractControlEvents<TValue>\n> {\n  private _status: FormControlStatus | undefined = undefined\n\n  constructor() {\n    super({})\n  }\n\n  /**\n   * A control is `disabled` when its `status` is `DISABLED`.\n   *\n   * Disabled controls are exempt from validation checks and\n   * are not included in the aggregate value of their ancestor\n   * controls.\n   *\n   * @returns True if the control is disabled, false otherwise.\n   */\n  /** @deprecated - disabled functionality not implemented */\n  get disabled(): boolean {\n    return this.status === DISABLED\n  }\n\n  /**\n   * A control is `enabled` as long as its `status` is not `DISABLED`.\n   *\n   * @returns True if the control has any status other than 'DISABLED',\n   * false if the status is 'DISABLED'.\n   */\n  get enabled(): boolean {\n    return this.status !== DISABLED\n  }\n\n  /**\n   * A control is `invalid` when its `status` is `INVALID`.\n\n   *\n   * @returns True if this control has failed one or more of its validation checks,\n   * false otherwise.\n   */\n  get invalid(): boolean {\n    return this.status === INVALID\n  }\n\n  /**\n   * A control is `pending` when its `status` is `PENDING`.\n   *\n   * @returns True if this control is in the process of conducting a validation check,\n   * false otherwise.\n   */\n  get pending(): boolean {\n    return this.status == PENDING\n  }\n\n  /**\n   * The raw value of the control.\n   */\n  get rawValue(): TValue {\n    return this.value\n  }\n\n  /**\n   * The current status of the control.\n   */\n  get status() {\n    return this._status\n  }\n\n  /**\n   * A control is `valid` when its `status` is `VALID`.\n   *\n   * @returns True if the control has passed all of its validation tests,\n   * false otherwise.\n   */\n  get valid(): boolean {\n    return this.status === VALID\n  }\n\n  setErrorAndValidity(error: string, status: FormControlStatus) {\n    this.setError(error)\n    this.setStatus(status)\n  }\n\n  setStatus(status: FormControlStatus) {\n    if (this._status === status) return\n\n    this._status = status\n\n    const emit = async () => await this.emit('statusChanged', { status })\n    forget(emit())\n  }\n\n  validate(): boolean {\n    return true\n  }\n}\n", "import type { BaseParams } from '@ariestools/sdk'\nimport { forget } from '@ariestools/sdk'\nimport { ModuleBaseEmitter } from '@xyo-network/sdk'\n\nimport type {\n  ControlSerializeSettings, ControlValueAccessor, SetOptions,\n} from './ControlValueAccessor.ts'\nimport type { ValidControlValue } from './ValidControlValue.ts'\n\n/** Configuration for {@link ControlValueAccessorBase} event emission. */\nexport interface ControlValueAccessorBaseConfig {\n  disableEvents?: boolean\n}\n\n/** Default options used when setting a control value. */\nexport const DefaultSetOptions: SetOptions = { disableEmit: false }\n\n/** Events emitted when a control value, error, or touched state changes. */\nexport interface ControlValueAccessorBaseEvents<TValue = ValidControlValue> {\n  [key: PropertyKey]: string | number | object\n  errorChanged: { error: string }\n  touchChanged: { touched: boolean }\n  valueChanged: { value: TValue }\n}\n\n/**\n * The base class for control value accessors interface\n */\nexport class ControlValueAccessorBase<\n  TValue = ValidControlValue,\n  TEventData extends ControlValueAccessorBaseEvents<TValue> = ControlValueAccessorBaseEvents<TValue>,\n>\n  extends ModuleBaseEmitter<BaseParams, TEventData>\n  implements ControlValueAccessor<TValue> {\n  private _error = ''\n\n  private _previousValue = undefined as TValue\n\n  private _serializeSettings: ControlSerializeSettings = { sensitive: false, serializable: false }\n\n  private _touched = false\n\n  private _value = undefined as TValue\n\n  private config: ControlValueAccessorBaseConfig\n\n  constructor(config: ControlValueAccessorBaseConfig) {\n    super({})\n    this.config = config\n  }\n\n  /**\n   * The error message for the control.\n   */\n  get error() {\n    return this._error\n  }\n\n  /**\n   * The \"previous value\" of the input element.\n   */\n  get previousValue() {\n    return this._previousValue\n  }\n\n  /**\n   * The serialize settings of the input element.\n   */\n  get serializeSettings() {\n    return this._serializeSettings\n  }\n\n  /**\n   * The \"touched\" state of the input element.\n   */\n  get touched() {\n    return this._touched\n  }\n\n  /**\n   * The current value of the input element.\n   */\n  get value() {\n    return this._value\n  }\n\n  /**\n   * The registered callback function called when a change or input event occurs on the input\n   * element.\n   */\n  onChange = (_: TValue) => { /* noop default */ }\n\n  /**\n   * Registers a function called when the control error changes.\n   */\n  onErrorChange: (error: string) => void = () => { /* noop default */ }\n\n  /**\n   * The registered callback function called when a blur event occurs on the input element.\n   */\n  onTouched = (_isTouched: boolean) => { /* noop default */ }\n\n  /**\n   * Registers a function called when the control value changes.\n   * @param  {(_value:ValidControlValue)=>void} fn\n   * @returns void\n   */\n  registerOnChange(fn: (_value: TValue) => void): void {\n    this.onChange = fn\n  }\n\n  /**\n   * Registers a function called when the control error changes.\n   * @param  {(error:string)=>void} fn\n   */\n  registerOnErrorChange(fn: (error: string) => void) {\n    this.onErrorChange = fn\n  }\n\n  /**\n   * Registers a function called when the control is touched.\n   * @param  {(isTouched:boolean)=>void} fn\n   * @returns void\n   */\n  registerOnTouched(fn: (isTouched: boolean) => void): void {\n    this.onTouched = fn\n  }\n\n  /**\n   * Sets the \"touched\" state of the input element.\n   * @param  {boolean} isTouched\n   */\n  setTouched(isTouched: boolean) {\n    if (this.touched !== isTouched) {\n      this._touched = isTouched\n      this.onTouched(isTouched)\n\n      if (this.config.disableEvents) return\n      const emit = async () => await this.emit('touchChanged', { touched: isTouched })\n      forget(emit())\n    }\n  }\n\n  /**\n   * Sets the \"value\" property on the input element.\n   * @param  {ValidControlValue} value\n   * @returns void\n   */\n  setValue(value: TValue, options = DefaultSetOptions): void {\n    this._previousValue = this._value\n\n    const normalizedValue = value ?? ('' as TValue)\n\n    if (this.value !== normalizedValue) {\n      this._value = normalizedValue\n      this.onChange(normalizedValue)\n\n      if (this.config.disableEvents || options.disableEmit) return\n      const emit = async () => await this.emit('valueChanged', { value: normalizedValue })\n      forget(emit())\n    }\n  }\n\n  /**\n   * Set the error message for the control.\n   * @param  {string} error\n   */\n  protected setError(error: string) {\n    if (this.error !== error) {\n      this._error = error\n      this.onErrorChange(error)\n\n      if (this.config.disableEvents) return\n      const emit = async () => await this.emit('errorChanged', { error })\n      forget(emit())\n    }\n  }\n\n  /**\n   * Sets the \"previous value\" of the input element.\n   * @param  {ValidControlValue} value\n   * @returns void\n   */\n  protected setPreviousValue(value: TValue): void {\n    this._previousValue = value\n  }\n\n  /**\n   * Sets the serialize settings  of the input element.\n   * @param  {ControlSerializeSettings} settings\n   */\n  protected setSerializeSettings(settings: ControlSerializeSettings) {\n    this._serializeSettings = settings\n  }\n}\n", "/**\n * Reports that a control is valid, meaning that no errors exist in the input value.\n */\nexport const VALID = 'VALID' as const\n\n/**\n * Reports that a control is invalid, meaning that an error exists in the input value.\n */\nexport const INVALID = 'INVALID' as const\n\n/**\n * Reports that a control is pending, meaning that async validation is occurring and\n * errors are not yet available for the input value.\n */\nexport const PENDING = 'PENDING' as const\n\n/**\n * Reports that a control is disabled, meaning that the control is exempt from ancestor\n * calculations of validity or value.\n */\nexport const DISABLED = 'DISABLED' as const\n\n/**\n * A control can have several different statuses. Each\n * possible status is returned as a string literal.\n *\n * * **VALID**: Reports that a control is valid, meaning that no errors exist in the input\n * value.\n * * **INVALID**: Reports that a control is invalid, meaning that an error exists in the input\n * value.\n * * **PENDING**: Reports that a control is pending, meaning that async validation is\n * occurring and errors are not yet available for the input value.\n * * **DISABLED**: Reports that a control is\n * disabled, meaning that the control is exempt from ancestor calculations of validity or value.\n */\nexport type FormControlStatus = typeof VALID | typeof INVALID | typeof PENDING | typeof DISABLED\n", "import type { EmptyObject } from '@ariestools/sdk'\n\nimport { AbstractControl } from './AbstractControl.ts'\nimport type { SetOptions } from './accessor/index.ts'\nimport type { CursorPosition, FormControl } from './FormControl.ts'\n\nconst AllowAllRegex = /^.*$/s\n\n/**\n * A base class for form controls and their validation.\n */\nexport abstract class FormControlBase<TProps extends EmptyObject = EmptyObject> extends AbstractControl implements FormControl {\n  /**\n   * The current and previous cursor position of the input element.\n   */\n  cursorPosition: CursorPosition = { current: undefined, previous: undefined }\n\n  invalidMessage = 'Invalid input'\n  pattern = AllowAllRegex\n  patternStrict = AllowAllRegex\n  props = {} as TProps\n  required = false\n\n  private _name: string | undefined = undefined\n\n  constructor() {\n    super()\n  }\n\n  get name() {\n    return this._name\n  }\n\n  override get rawValue() {\n    return this.unmask && this.value ? this.unmask(this.value) : this.value\n  }\n\n  blurError?(value: string): void | undefined\n  changeError?(value: string): void\n  getCursorPosition?(): number | undefined\n  mask?(value: string): string\n  onCursorChange: (cursor: number | undefined) => void = () => { /* noop default */ }\n\n  override setValue(value = '', setOptions: SetOptions) {\n    // check for pattern validation\n    if (this.unmask && this.pattern) {\n      const unmasked = this.unmask(value)\n      const match = RegExp(this.pattern).exec(unmasked)\n      // set the new value before checking for errors\n      super.setValue(this.mask ? this.mask(unmasked) : unmasked, setOptions)\n      if (match) {\n        // if the value matches the pattern, update the cursor position\n        if (this.getCursorPosition) {\n          const newCursor = this.getCursorPosition()\n          this.onCursorChange(newCursor)\n        }\n      } else {\n        // if no match, set the error and return to the previous value\n        this.setValue(this.previousValue, setOptions)\n        this.onCursorChange?.(this.cursorPosition.previous)\n      }\n    } else {\n      // if no mask or pattern, just set the value\n      super.setValue(value, setOptions)\n    }\n    // check for changeError validation after pattern validation\n    this.changeError?.(value)\n  }\n\n  unmask?(value: string): string\n\n  // For FormControls, validate is the same as running one of the error checking functions\n  override validate(): boolean {\n    const normalizedValue = this.value ?? ''\n    // prefer the blurError function since validation assumes the user is done typing\n    // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n    this.blurError ? this.blurError(normalizedValue) : this.changeError?.(normalizedValue)\n    return !this.error\n  }\n\n  protected setName(name: string | undefined) {\n    this._name = name\n  }\n}\n", "import { useContextEx } from '@ariestools/sdk-react/shared'\n\nimport { FormGroupBaseContext } from './Context.ts'\n\n/** Hook that returns the nearest {@link FormGroupBaseContext} value. */\nexport const useFormGroup = (required = false) => useContextEx(FormGroupBaseContext, 'FormGroup', required)\n", "import type { ArchivistInstance, Payload } from '@xyo-network/sdk'\n\nimport type { FormGroupStorage } from './FormGroupStorage.ts'\n\n/** {@link FormGroupStorage} backed by an XYO archivist for get/insert/clear. */\nexport class ArchivistFormGroupStorage implements FormGroupStorage {\n  private archivist: ArchivistInstance\n\n  constructor(archivist: ArchivistInstance) {\n    this.archivist = archivist\n  }\n\n  async clear() {\n    await this.archivist.clear?.()\n  }\n\n  async get(): Promise<Payload | undefined> {\n    const all = await this.archivist.all?.()\n    return all.at(-1)\n  }\n\n  async insert(value: Payload) {\n    await this.archivist.insert?.([value])\n  }\n}\n"],
  "mappings": ";AAAA,SAAS,uBAAuB;AAKzB,IAAM,uBAAuB,gBAAkD;;;ACHtF,SAAgB,eAAe;;;ACD/B,SAAS,UAAAA,eAAc;;;ACDvB,SAAS,UAAAC,eAAc;;;ACCvB,SAAS,cAAc;AACvB,SAAS,yBAAyB;AAa3B,IAAM,oBAAgC,EAAE,aAAa,MAAM;AAa3D,IAAM,2BAAN,cAIG,kBACgC;AAAA,EAChC,SAAS;AAAA,EAET,iBAAiB;AAAA,EAEjB,qBAA+C,EAAE,WAAW,OAAO,cAAc,MAAM;AAAA,EAEvF,WAAW;AAAA,EAEX,SAAS;AAAA,EAET;AAAA,EAER,YAAY,QAAwC;AAClD,UAAM,CAAC,CAAC;AACR,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,gBAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,oBAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACZ,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,CAAC,MAAc;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAK/C,gBAAyC,MAAM;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA,EAKpE,YAAY,CAAC,eAAwB;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1D,iBAAiB,IAAoC;AACnD,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,IAA6B;AACjD,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,IAAwC;AACxD,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,WAAoB;AAC7B,QAAI,KAAK,YAAY,WAAW;AAC9B,WAAK,WAAW;AAChB,WAAK,UAAU,SAAS;AAExB,UAAI,KAAK,OAAO,cAAe;AAC/B,YAAM,OAAO,YAAY,MAAM,KAAK,KAAK,gBAAgB,EAAE,SAAS,UAAU,CAAC;AAC/E,aAAO,KAAK,CAAC;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,OAAe,UAAU,mBAAyB;AACzD,SAAK,iBAAiB,KAAK;AAE3B,UAAM,kBAAkB,SAAU;AAElC,QAAI,KAAK,UAAU,iBAAiB;AAClC,WAAK,SAAS;AACd,WAAK,SAAS,eAAe;AAE7B,UAAI,KAAK,OAAO,iBAAiB,QAAQ,YAAa;AACtD,YAAM,OAAO,YAAY,MAAM,KAAK,KAAK,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;AACnF,aAAO,KAAK,CAAC;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,SAAS,OAAe;AAChC,QAAI,KAAK,UAAU,OAAO;AACxB,WAAK,SAAS;AACd,WAAK,cAAc,KAAK;AAExB,UAAI,KAAK,OAAO,cAAe;AAC/B,YAAM,OAAO,YAAY,MAAM,KAAK,KAAK,gBAAgB,EAAE,MAAM,CAAC;AAClE,aAAO,KAAK,CAAC;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,iBAAiB,OAAqB;AAC9C,SAAK,iBAAiB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,qBAAqB,UAAoC;AACjE,SAAK,qBAAqB;AAAA,EAC5B;AACF;;;AC/LO,IAAM,QAAQ;AAKd,IAAM,UAAU;AAMhB,IAAM,UAAU;AAMhB,IAAM,WAAW;;;AFWjB,IAAM,kBAAN,cAAoF,yBAGzF;AAAA,EACQ,UAAyC;AAAA,EAEjD,cAAc;AACZ,UAAM,CAAC,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,WAAoB;AACtB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,UAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAmB;AACrB,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAmB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,oBAAoB,OAAe,QAA2B;AAC5D,SAAK,SAAS,KAAK;AACnB,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,UAAU,QAA2B;AACnC,QAAI,KAAK,YAAY,OAAQ;AAE7B,SAAK,UAAU;AAEf,UAAM,OAAO,YAAY,MAAM,KAAK,KAAK,iBAAiB,EAAE,OAAO,CAAC;AACpE,IAAAC,QAAO,KAAK,CAAC;AAAA,EACf;AAAA,EAEA,WAAoB;AAClB,WAAO;AAAA,EACT;AACF;;;AGzHA,IAAM,gBAAgB;AAKf,IAAe,kBAAf,cAAiF,gBAAuC;AAAA;AAAA;AAAA;AAAA,EAI7H,iBAAiC,EAAE,SAAS,QAAW,UAAU,OAAU;AAAA,EAE3E,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,QAAQ,CAAC;AAAA,EACT,WAAW;AAAA,EAEH,QAA4B;AAAA,EAEpC,cAAc;AACZ,UAAM;AAAA,EACR;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAa,WAAW;AACtB,WAAO,KAAK,UAAU,KAAK,QAAQ,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,EACpE;AAAA,EAMA,iBAAuD,MAAM;AAAA,EAAqB;AAAA,EAEzE,SAAS,QAAQ,IAAI,YAAwB;AAEpD,QAAI,KAAK,UAAU,KAAK,SAAS;AAC/B,YAAM,WAAW,KAAK,OAAO,KAAK;AAClC,YAAM,QAAQ,OAAO,KAAK,OAAO,EAAE,KAAK,QAAQ;AAEhD,YAAM,SAAS,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,UAAU;AACrE,UAAI,OAAO;AAET,YAAI,KAAK,mBAAmB;AAC1B,gBAAM,YAAY,KAAK,kBAAkB;AACzC,eAAK,eAAe,SAAS;AAAA,QAC/B;AAAA,MACF,OAAO;AAEL,aAAK,SAAS,KAAK,eAAe,UAAU;AAC5C,aAAK,iBAAiB,KAAK,eAAe,QAAQ;AAAA,MACpD;AAAA,IACF,OAAO;AAEL,YAAM,SAAS,OAAO,UAAU;AAAA,IAClC;AAEA,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA;AAAA,EAKS,WAAoB;AAC3B,UAAM,kBAAkB,KAAK,SAAS;AAGtC,SAAK,YAAY,KAAK,UAAU,eAAe,IAAI,KAAK,cAAc,eAAe;AACrF,WAAO,CAAC,KAAK;AAAA,EACf;AAAA,EAEU,QAAQ,MAA0B;AAC1C,SAAK,QAAQ;AAAA,EACf;AACF;;;AJjDO,IAAM,YAAN,cAGG,gBAAgB;AAAA,EAChB,YAAY,CAAC;AAAA,EAEb;AAAA,EAEA,qBAA+D,CAAC;AAAA,EAEhE,2BAA2B,CAAC;AAAA,EAC5B,kBAAkB,CAAC;AAAA,EAE3B,YAAY,UAA2C;AACrD,UAAM;AACN,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,eAAe;AACjB,UAAM,eAA6B;AAAA,MACjC,cAAc;AAAA,MACd,eAAe,CAAC;AAAA,IAClB;AACA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACtD,UAAI,OAAO;AACT,qBAAa,eAAe,GAAG,aAAa,YAAY,KAAK,KAAK;AAClE,qBAAa,cAAc,KAAK,GAAG;AAAA,MACrC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAkC;AACpC,UAAM,QAAQ,CAAC;AACf,eAAW,OAAO,KAAK,WAAW;AAChC,YAAM,UAAU;AAChB,YAAM,OAAO,IAAI,KAAK,UAAU,OAAO,EAAE;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,sBAAsB;AACxB,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA,EAEA,IAAI,mBAAmB;AACrB,WAAO,KAAK,UAAU,SAAS;AAAA,EACjC;AAAA,EAEA,IAAa,UAAU;AACrB,WAAO,OAAO,OAAwB,KAAK,SAAS,EAAE,KAAK,aAAW,QAAQ,OAAO;AAAA,EACvF;AAAA,EAEA,IAAa,QAAQ;AACnB,WAAO,OAAO,OAAwB,KAAK,SAAS,EAAE,MAAM,aAAW,QAAQ,KAAK;AAAA,EACtF;AAAA,EAEA,IAAI,SAAiB;AACnB,UAAM,QAAQ,CAAC;AACf,eAAW,OAAO,KAAK,WAAW;AAChC,YAAM,UAAU;AAChB,YAAM,OAAO,IAAI,KAAK,UAAU,OAAO,EAAE;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAAc;AACvB,WAAO,KAAK,UAAU,IAA2B;AAAA,EACnD;AAAA,EAEA,MAAM,mBAAmB,MAAc,YAAY,OAAoC;AACrF,UAAM,UAAU,YAAY,KAAK,mBAAmB,KAAK;AACzD,QAAI,SAAS;AACX,YAAM,aAAa,MAAM,QAAQ,IAAI;AACrC,UAAI,cAAc,QAAQ,YAAY;AACpC,cAAM,aAAa,WAAW,IAA+B;AAG7D,cAAM,0BAA0B;AAChC,YAAI,wBAAwB,aAAa,KAAK,UAAU,YAAY;AAClE,gBAAM,iBAAiB,wBAAwB,aAAa,KAAK,UAAU,cAAc;AACzF,gBAAM,MAAM,KAAK,IAAI;AACrB,iBAAO,MAAM,iBAAiB,SAAY;AAAA,QAC5C;AACA,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,2BAA2B,IAAI,kBAAkB;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,gBAAgB,MAAc,SAA0B;AACtD,QAAI,KAAK,UAAU,IAA2B,EAAG,SAAQ,MAAM,+BAA+B,IAAI,2BAA2B;AAC7H,SAAK,UAAU,IAA2B,IAAI;AAC9C,SAAK,sBAAsB,MAAM,OAAO;AAAA,EAC1C;AAAA,EAEA,gBAAgB;AACd,eAAW,OAAO,KAAK,WAAW;AAChC,WAAK,kBAAkB,GAAG;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,eAAW,WAAW,OAAO,OAAwB,KAAK,SAAS,GAAG;AACpE,cAAQ,SAAS,EAAE;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,kBAAkB,MAAc;AAC9B,UAAM,UAAU,KAAK,UAAU,IAA2B;AAE1D,QAAI,SAAS;AACX,YAAM,WAAW,KAAK,mBAAmB,IAAI;AAC7C,cAAQ,GAAG,gBAAgB,QAAQ;AACnC,aAAO,KAAK,mBAAmB,IAAI;AACnC,aAAO,KAAK,UAAU,IAA2B;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,eAAe,gBAA2B;AACxC,UAAM,qBAAqB;AAC3B,eAAW,OAAO,KAAK,WAAW;AAChC,YAAM,UAAU;AAChB,UAAI,uBAAuB,UAAa,mBAAmB,SAAS,OAAO,GAAG;AAC5E,cAAM,UAAU,KAAK,UAAU,OAAO;AACtC,gBAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,MAAc,SAA0B;AACpE,UAAM,kBAAkB,KAAK,UAAU;AACvC,UAAM,mBAAmB,KAAK;AAC9B,UAAM,UAAU,KAAK;AAErB,QAAI,CAAC,oBAAoB,WAAW,kBAAmB,SAAQ,KAAK,iDAAiD;AAErH,QAAI,mBAAmB,QAAQ,kBAAkB,cAAc;AAC7D,WAAK,yBAAyB,MAAM,OAAO;AAE3C,YAAM,WAAqC,CAAC,EAAE,MAAM,MAAM;AAExD,YAAI,QAAQ,kBAAkB,cAAc;AAE1C,gBAAM,gBAAgB,QAAQ,kBAAkB,YAAY,mBAAmB;AAG/E,gBAAM,cAAc,QAAQ,kBAAkB,YAAY,KAAK,2BAA2B,KAAK;AAG/F,sBAAY,IAAkC,IAAI,SAAS;AAG3D,gBAAM,uBAAuB;AAC7B,+BAAqB,YAAY,KAAK,IAAI;AAG1C,eAAK,gBAAgB,eAAe,WAA4B;AAAA,QAClE;AAAA,MACF;AAGA,cAAQ,GAAG,gBAAgB,QAAQ;AAGnC,WAAK,mBAAmB,IAAI,IAAI;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,gBAAgB,SAA2C,QAAwB;AACzF,QAAI,WAAW,QAAQ;AACrB,YAAM,QAAQ,YAAY,MAAM,QAAQ,OAAO,MAAM;AACrD,YAAM,QAAQ,YAAY,MAAM,QAAQ,MAAM;AAE9C,MAAAC,QAAO,MAAM,CAAC;AACd,MAAAA,QAAO,MAAM,CAAC;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,yBAAyB,MAAc,SAA0B;AACvE,UAAM,OAAO,YAAY;AACvB,YAAM,aAAa,MAAM,KAAK,mBAAmB,MAAM,QAAQ,kBAAkB,SAAS;AAE1F,UAAI,YAAY;AACd,cAAM,cAAc,QAAQ,kBAAkB,YAAY,KAAK,2BAA2B,KAAK;AAC/F,oBAAY,IAAkC,IAAI;AAElD,gBAAQ,SAAS,YAAY,EAAE,aAAa,KAAK,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,IAAAA,QAAO,KAAK,CAAC;AAAA,EACf;AACF;;;ADxMI;AAZG,IAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EAAU;AAAA,EAAQ,GAAG;AACvB,MAAqC;AACnC,QAAM,YAAY,QAAQ,MAAM;AAC9B,UAAMC,aAAY,IAAI,UAA4B,MAAM;AACxD,WAAOA;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,QAA0C,QAAQ,OAAO,EAAE,WAAW,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC;AAE1G,SAEE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AMpCA,SAAS,oBAAoB;AAKtB,IAAM,eAAe,CAAC,WAAW,UAAU,aAAa,sBAAsB,aAAa,QAAQ;;;ACAnG,IAAM,4BAAN,MAA4D;AAAA,EACzD;AAAA,EAER,YAAY,WAA8B;AACxC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,KAAK,UAAU,QAAQ;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAoC;AACxC,UAAM,MAAM,MAAM,KAAK,UAAU,MAAM;AACvC,WAAO,IAAI,GAAG,EAAE;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,OAAgB;AAC3B,UAAM,KAAK,UAAU,SAAS,CAAC,KAAK,CAAC;AAAA,EACvC;AACF;",
  "names": ["forget", "forget", "forget", "forget", "formGroup"]
}
