{"version":3,"file":"Upload.mjs","sources":["../../src/upload/Upload.tsx"],"sourcesContent":["import { Plus as PlusIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport { Component } from 'react';\nimport { injectIntl, WrappedComponentProps } from 'react-intl';\n\nimport { Size, Typography } from '../common';\nimport Title from '../title';\n\nimport messages from './Upload.messages';\nimport { UploadImageStep, ProcessingStep, CompleteStep } from './steps';\nimport { postData, asyncFileRead, isSizeValid, isTypeValid, getFileType } from './utils';\nimport { PostDataFetcher, PostDataHTTPOptions, ResponseError } from './utils/postData/postData';\n\nexport const MAX_SIZE_DEFAULT = 5000000;\n\nexport enum UploadStep {\n  UPLOAD_IMAGE_STEP = 'uploadImageStep',\n}\n\nexport interface UploadProps extends WrappedComponentProps {\n  /** @default 300 */\n  animationDelay?: number;\n  csButtonText?: string;\n  csFailureText?: string;\n  csSuccessText?: string;\n  csTooLargeMessage?: string;\n  csWrongTypeMessage?: string;\n  httpOptions?: PostDataHTTPOptions & {\n    fileInputName?: string;\n    data?: Record<string, string | Blob>;\n  };\n  /**\n   * You can provide a fetcher function with the same interface as the global fetch function, which is used by default.\n   * `function fetcher(input: RequestInfo, init?: RequestInit): Promise<Response>`\n   */\n  fetcher?: PostDataFetcher;\n  /**\n   * Filesize expressed in B.<br />If set to `null`, no size limit will be applied.\n   * @default 5000000 (5 MB)\n   */\n  maxSize?: number | null;\n  psButtonText?: string;\n  /** @default false */\n  psButtonDisabled?: boolean;\n  psProcessingText?: string;\n  /** @default 'md' */\n  size?: `${Size.SMALL | Size.MEDIUM | Size.LARGE}`;\n  /**\n   * You can provide multiple rules separated by comma, e.g.: \"application/pdf,image/*\".\n   * Using \"*\" will allow every file type to be uploaded.\n   * @default 'image/*'\n   */\n  usAccept?: string;\n  usButtonText?: string;\n  usButtonRetryText?: string;\n  /** @default false */\n  usDisabled?: boolean;\n  usDropMessage?: string;\n  usHelpImage?: React.ReactNode;\n  /** @default '' */\n  usLabel?: string;\n  usPlaceholder?: string;\n  /**\n   * Override for the [InlinePrompt icon's default, accessible name](/?path=/docs/other-statusicon-accessibility--docs)\n   * announced by the screen readers\n   * */\n  errorIconLabel?: string;\n  /** @deprecated Only a single variant exists, please remove this prop. */\n  uploadStep?: `${UploadStep}`;\n  onCancel?: () => void;\n  onFailure?: (error: unknown) => void;\n  onStart?: (file: File) => void;\n  onSuccess?: (response: string | Response, fileName: string) => void;\n}\n\ninterface UploadState {\n  fileName: string;\n  isDroppable: boolean;\n  isComplete: boolean;\n  isError: boolean;\n  isImage: boolean;\n  isProcessing: boolean;\n  isSuccess: boolean;\n  response: unknown;\n  uploadedImage: string | undefined;\n}\n\nexport class Upload extends Component<UploadProps, UploadState> {\n  declare props: UploadProps & Required<Pick<UploadProps, keyof typeof Upload.defaultProps>>;\n\n  static defaultProps = {\n    animationDelay: 300,\n    maxSize: MAX_SIZE_DEFAULT,\n    psButtonDisabled: false,\n    size: 'md',\n    usAccept: 'image/*',\n    usDisabled: false,\n    usLabel: '',\n  } satisfies Partial<UploadProps>;\n\n  dragCounter = 0;\n  timeouts = 0;\n\n  constructor(props: UploadProps) {\n    super(props);\n\n    this.state = {\n      fileName: '',\n      isDroppable: false,\n      isComplete: false,\n      isError: false,\n      isImage: false,\n      isProcessing: false,\n      isSuccess: false,\n      response: undefined,\n      uploadedImage: undefined,\n    };\n  }\n\n  getErrorMessage(status?: number) {\n    const { csFailureText, csTooLargeMessage, csWrongTypeMessage, maxSize, intl } = this.props;\n    switch (status) {\n      case 413:\n        return (\n          csTooLargeMessage ||\n          (typeof maxSize === 'number'\n            ? intl.formatMessage(messages.csTooLargeMessage, { maxSize: roundFileSize(maxSize) })\n            : intl.formatMessage(messages.csTooLargeNoLimitMessage))\n        );\n      case 415:\n        return csWrongTypeMessage || intl.formatMessage(messages.csWrongTypeMessage);\n      default:\n        return csFailureText || intl.formatMessage(messages.csFailureText);\n    }\n  }\n\n  onDragLeave(event: React.DragEvent<HTMLDivElement>) {\n    event.preventDefault();\n    this.dragCounter -= 1;\n    if (this.dragCounter === 0) {\n      this.setState({ isDroppable: false });\n    }\n  }\n\n  onDragEnter(event: React.DragEvent<HTMLDivElement>) {\n    event.preventDefault();\n    this.dragCounter += 1;\n    const { usDisabled } = this.props;\n    const { isProcessing } = this.state;\n    if (this.dragCounter === 1 && !usDisabled && !isProcessing) {\n      this.setState({ isDroppable: true });\n    }\n  }\n\n  async onDrop(event: React.DragEvent<HTMLDivElement>) {\n    const { isProcessing } = this.state;\n    event.preventDefault();\n    if (!isProcessing) {\n      this.reset();\n    }\n\n    if (event.dataTransfer?.files?.[0]) {\n      await this.fileDropped(event.dataTransfer.files[0]);\n    }\n  }\n\n  asyncPost = async (file: File) => {\n    const { httpOptions, fetcher } = this.props;\n    if (httpOptions == null) {\n      throw new Error('Cannot find HTTP options');\n    }\n\n    const { fileInputName = file.name, data = {} } = httpOptions;\n\n    const formData = new FormData();\n    formData.append(fileInputName, file);\n    Object.keys(data).forEach((key) => formData.append(key, data[key]));\n    return postData(httpOptions, formData, fetcher);\n  };\n\n  handleUploadComplete = (type: 'success' | 'error', response: unknown) => {\n    const { animationDelay, onSuccess, onFailure } = this.props;\n    const { fileName } = this.state;\n\n    window.clearTimeout(this.timeouts);\n    this.timeouts = window.setTimeout(() => {\n      this.setState(\n        {\n          isProcessing: false,\n          isComplete: true,\n        },\n        () => {\n          if (type === 'success') {\n            onSuccess?.(response as string | Response, fileName);\n          } else {\n            onFailure?.(response);\n          }\n        },\n      );\n    }, animationDelay);\n  };\n\n  asyncResponse = (response: unknown, type: 'success' | 'error') => {\n    this.setState(\n      {\n        response,\n        isError: type === 'error',\n        isSuccess: type === 'success',\n      },\n      () => this.handleUploadComplete(type, response),\n    );\n  };\n\n  handleOnClear: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n    event.preventDefault();\n    const { onCancel } = this.props;\n    onCancel?.();\n\n    this.reset();\n  };\n\n  reset = () => {\n    this.dragCounter = 0;\n    window.clearTimeout(this.timeouts);\n    this.setState({\n      isComplete: false,\n      isError: false,\n      isProcessing: false,\n      isSuccess: false,\n    });\n  };\n\n  showDataImage = (dataUrl: string) => {\n    const { isImage } = this.state;\n    if (isImage) {\n      this.setState({\n        uploadedImage: dataUrl,\n      });\n    }\n  };\n\n  fileDropped = async (file: File) => {\n    const { httpOptions, maxSize, onStart, usDisabled, usAccept } = this.props;\n    const { isProcessing } = this.state;\n\n    if (usDisabled || isProcessing) {\n      return false;\n    }\n\n    if (!file) {\n      throw new Error('Could not retrieve file');\n    }\n\n    this.setState({\n      fileName: file.name,\n      isDroppable: false,\n      isProcessing: true,\n    });\n\n    onStart?.(file);\n\n    let file64 = null;\n\n    try {\n      file64 = await asyncFileRead(file);\n    } catch (error) {\n      this.asyncResponse(error, 'error');\n    }\n\n    if (!file64) {\n      return false;\n    }\n\n    this.setState({\n      isImage: getFileType(file, file64).includes('image'),\n    });\n\n    if (!isTypeValid(file, usAccept, file64)) {\n      this.asyncResponse(\n        new ResponseError(\n          new Response(null, {\n            status: 415,\n            statusText: 'Unsupported Media Type',\n          }),\n        ),\n        'error',\n      );\n      return false;\n    }\n\n    if (typeof maxSize === 'number' && !isSizeValid(file, maxSize)) {\n      this.asyncResponse(\n        new ResponseError(\n          new Response(null, {\n            status: 413,\n            statusText: 'Request Entity Too Large',\n          }),\n        ),\n        'error',\n      );\n      return false;\n    }\n\n    if (httpOptions) {\n      // Post the file to provided endpoint\n      let response;\n      try {\n        response = await this.asyncPost(file);\n      } catch (error) {\n        this.asyncResponse(error, 'error');\n        return false;\n      }\n      this.asyncResponse(response, 'success');\n      this.showDataImage(file64);\n      return true;\n    }\n    // Post on form submit. And return the encoded image.\n    this.showDataImage(file64);\n    this.asyncResponse(file64, 'success');\n    return true;\n  };\n\n  render() {\n    const {\n      maxSize,\n      usDropMessage,\n      usAccept,\n      usButtonText,\n      usButtonRetryText,\n      usDisabled,\n      usHelpImage,\n      usLabel,\n      usPlaceholder,\n      psButtonText,\n      psProcessingText,\n      psButtonDisabled,\n      csButtonText,\n      csSuccessText,\n      size,\n      intl,\n      errorIconLabel,\n    } = this.props;\n\n    const {\n      response,\n      fileName,\n      isComplete,\n      isDroppable,\n      isError,\n      isImage,\n      isProcessing,\n      isSuccess,\n      uploadedImage,\n    } = this.state;\n\n    const placeholder = ((): string => {\n      if (usPlaceholder) {\n        return usPlaceholder;\n      }\n\n      if (typeof maxSize === 'number') {\n        return intl.formatMessage(messages.usPlaceholder, { maxSize: roundFileSize(maxSize) });\n      }\n\n      return intl.formatMessage(messages.usPlaceholderNoLimit);\n    })();\n\n    return (\n      <div\n        className={clsx('droppable-area', {\n          droppable: true,\n          'tw-droppable-sm droppable-sm': size === 'sm',\n          'tw-droppable-md droppable-md': size === 'md' || !size,\n          'tw-droppable-lg droppable-lg': size === 'lg',\n          'droppable-dropping': isDroppable,\n          'droppable-processing': isProcessing,\n          'droppable-complete': isComplete && !isError,\n          'droppable-negative': isError && !isProcessing,\n        })}\n        onDragEnter={(event) => this.onDragEnter(event)}\n        onDragLeave={(event) => this.onDragLeave(event)}\n        onDrop={async (event) => this.onDrop(event)}\n        onDragOver={(event) => event.preventDefault()}\n      >\n        {!isProcessing && !isComplete && (\n          <UploadImageStep\n            fileDropped={async (file) => this.fileDropped(file)}\n            isComplete={isComplete}\n            usAccept={usAccept}\n            usButtonText={usButtonText || intl.formatMessage(messages.usButtonText)}\n            usDisabled={usDisabled}\n            usHelpImage={usHelpImage}\n            usLabel={usLabel}\n            usPlaceholder={placeholder}\n          />\n        )}\n\n        {(isSuccess || isComplete) && !isError && (\n          <CompleteStep\n            fileName={fileName}\n            isComplete={isComplete}\n            isImage={isImage}\n            csButtonText={csButtonText || intl.formatMessage(messages.csButtonText)}\n            csSuccessText={csSuccessText || intl.formatMessage(messages.csSuccessText)}\n            uploadedImage={uploadedImage}\n            onClear={(event) => this.handleOnClear(event)}\n          />\n        )}\n        {isError && !isProcessing && (\n          <UploadImageStep\n            fileDropped={async (file) => {\n              this.reset();\n              await this.fileDropped(file);\n            }}\n            isComplete={!isError}\n            usAccept={usAccept}\n            usButtonText={usButtonRetryText || intl.formatMessage(messages.retry)}\n            usDisabled={usDisabled}\n            usHelpImage={null}\n            usLabel={usLabel}\n            usPlaceholder={placeholder}\n            errorMessage={this.getErrorMessage(\n              response != null &&\n                typeof response === 'object' &&\n                'status' in response &&\n                typeof response.status === 'number'\n                ? response.status\n                : undefined,\n            )}\n            errorIconLabel={errorIconLabel}\n          />\n        )}\n        {isProcessing && (\n          <ProcessingStep\n            isComplete={isComplete}\n            isError={isError}\n            isSuccess={isSuccess}\n            psButtonText={psButtonText || intl.formatMessage(messages.psButtonText)}\n            psProcessingText={psProcessingText || intl.formatMessage(messages.psProcessingText)}\n            psButtonDisabled={psButtonDisabled}\n            onClear={(event) => this.handleOnClear(event)}\n          />\n        )}\n        {!isProcessing && (\n          <div className=\"droppable-dropping-card droppable-card\" aria-live=\"polite\">\n            <div className=\"droppable-card-content\">\n              <div className=\"circle circle-sm text-primary\">\n                <PlusIcon size=\"16\" />\n              </div>\n              <Title type={Typography.TITLE_BODY} className=\"m-t-3\">\n                {usDropMessage || intl.formatMessage(messages.usDropMessage)}\n              </Title>\n            </div>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default injectIntl(Upload);\n\nconst roundFileSize = (bytes: number) => {\n  const megabytes = bytes / 1000000;\n  if (megabytes >= 0.1) {\n    const isRound = Math.floor(megabytes) === megabytes;\n    return isRound ? `${megabytes}` : megabytes.toFixed(1);\n  }\n  if (megabytes >= 0.01) {\n    return megabytes.toFixed(2);\n  }\n  return megabytes.toFixed(3);\n};\n"],"names":["MAX_SIZE_DEFAULT","UploadStep","Upload","Component","defaultProps","animationDelay","maxSize","psButtonDisabled","size","usAccept","usDisabled","usLabel","dragCounter","timeouts","constructor","props","state","fileName","isDroppable","isComplete","isError","isImage","isProcessing","isSuccess","response","undefined","uploadedImage","getErrorMessage","status","csFailureText","csTooLargeMessage","csWrongTypeMessage","intl","formatMessage","messages","roundFileSize","csTooLargeNoLimitMessage","onDragLeave","event","preventDefault","setState","onDragEnter","onDrop","reset","dataTransfer","files","fileDropped","asyncPost","file","httpOptions","fetcher","Error","fileInputName","name","data","formData","FormData","append","Object","keys","forEach","key","postData","handleUploadComplete","type","onSuccess","onFailure","window","clearTimeout","setTimeout","asyncResponse","handleOnClear","onCancel","showDataImage","dataUrl","onStart","file64","asyncFileRead","error","getFileType","includes","isTypeValid","ResponseError","Response","statusText","isSizeValid","render","usDropMessage","usButtonText","usButtonRetryText","usHelpImage","usPlaceholder","psButtonText","psProcessingText","csButtonText","csSuccessText","errorIconLabel","placeholder","usPlaceholderNoLimit","_jsxs","className","clsx","droppable","onDragOver","children","_jsx","UploadImageStep","CompleteStep","onClear","retry","errorMessage","ProcessingStep","PlusIcon","Title","Typography","TITLE_BODY","injectIntl","bytes","megabytes","isRound","Math","floor","toFixed"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,MAAMA,gBAAgB,GAAG;IAEpBC;AAAZ,CAAA,UAAYA,UAAU,EAAA;AACpBA,EAAAA,UAAA,CAAA,mBAAA,CAAA,GAAA,iBAAqC;AACvC,CAAC,EAFWA,UAAU,KAAVA,UAAU,GAAA,EAAA,CAAA,CAAA;AAwEhB,MAAOC,MAAO,SAAQC,SAAmC,CAAA;AAG7D,EAAA,OAAOC,YAAY,GAAG;AACpBC,IAAAA,cAAc,EAAE,GAAG;AACnBC,IAAAA,OAAO,EAAEN,gBAAgB;AACzBO,IAAAA,gBAAgB,EAAE,KAAK;AACvBC,IAAAA,IAAI,EAAE,IAAI;AACVC,IAAAA,QAAQ,EAAE,SAAS;AACnBC,IAAAA,UAAU,EAAE,KAAK;AACjBC,IAAAA,OAAO,EAAE;GACqB;AAEhCC,EAAAA,WAAW,GAAG,CAAC;AACfC,EAAAA,QAAQ,GAAG,CAAC;EAEZC,WAAAA,CAAYC,KAAkB,EAAA;IAC5B,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,KAAK,GAAG;AACXC,MAAAA,QAAQ,EAAE,EAAE;AACZC,MAAAA,WAAW,EAAE,KAAK;AAClBC,MAAAA,UAAU,EAAE,KAAK;AACjBC,MAAAA,OAAO,EAAE,KAAK;AACdC,MAAAA,OAAO,EAAE,KAAK;AACdC,MAAAA,YAAY,EAAE,KAAK;AACnBC,MAAAA,SAAS,EAAE,KAAK;AAChBC,MAAAA,QAAQ,EAAEC,SAAS;AACnBC,MAAAA,aAAa,EAAED;KAChB;AACH,EAAA;EAEAE,eAAeA,CAACC,MAAe,EAAA;IAC7B,MAAM;MAAEC,aAAa;MAAEC,iBAAiB;MAAEC,kBAAkB;MAAEzB,OAAO;AAAE0B,MAAAA;KAAM,GAAG,IAAI,CAACjB,KAAK;AAC1F,IAAA,QAAQa,MAAM;AACZ,MAAA,KAAK,GAAG;AACN,QAAA,OACEE,iBAAiB,KAChB,OAAOxB,OAAO,KAAK,QAAQ,GACxB0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACJ,iBAAiB,EAAE;UAAExB,OAAO,EAAE6B,aAAa,CAAC7B,OAAO;SAAG,CAAC,GACnF0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACE,wBAAwB,CAAC,CAAC;AAE9D,MAAA,KAAK,GAAG;QACN,OAAOL,kBAAkB,IAAIC,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACH,kBAAkB,CAAC;AAC9E,MAAA;QACE,OAAOF,aAAa,IAAIG,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACL,aAAa,CAAC;AACtE;AACF,EAAA;EAEAQ,WAAWA,CAACC,KAAsC,EAAA;IAChDA,KAAK,CAACC,cAAc,EAAE;IACtB,IAAI,CAAC3B,WAAW,IAAI,CAAC;AACrB,IAAA,IAAI,IAAI,CAACA,WAAW,KAAK,CAAC,EAAE;MAC1B,IAAI,CAAC4B,QAAQ,CAAC;AAAEtB,QAAAA,WAAW,EAAE;AAAK,OAAE,CAAC;AACvC,IAAA;AACF,EAAA;EAEAuB,WAAWA,CAACH,KAAsC,EAAA;IAChDA,KAAK,CAACC,cAAc,EAAE;IACtB,IAAI,CAAC3B,WAAW,IAAI,CAAC;IACrB,MAAM;AAAEF,MAAAA;KAAY,GAAG,IAAI,CAACK,KAAK;IACjC,MAAM;AAAEO,MAAAA;KAAc,GAAG,IAAI,CAACN,KAAK;IACnC,IAAI,IAAI,CAACJ,WAAW,KAAK,CAAC,IAAI,CAACF,UAAU,IAAI,CAACY,YAAY,EAAE;MAC1D,IAAI,CAACkB,QAAQ,CAAC;AAAEtB,QAAAA,WAAW,EAAE;AAAI,OAAE,CAAC;AACtC,IAAA;AACF,EAAA;EAEA,MAAMwB,MAAMA,CAACJ,KAAsC,EAAA;IACjD,MAAM;AAAEhB,MAAAA;KAAc,GAAG,IAAI,CAACN,KAAK;IACnCsB,KAAK,CAACC,cAAc,EAAE;IACtB,IAAI,CAACjB,YAAY,EAAE;MACjB,IAAI,CAACqB,KAAK,EAAE;AACd,IAAA;IAEA,IAAIL,KAAK,CAACM,YAAY,EAAEC,KAAK,GAAG,CAAC,CAAC,EAAE;AAClC,MAAA,MAAM,IAAI,CAACC,WAAW,CAACR,KAAK,CAACM,YAAY,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrD,IAAA;AACF,EAAA;EAEAE,SAAS,GAAG,MAAOC,IAAU,IAAI;IAC/B,MAAM;MAAEC,WAAW;AAAEC,MAAAA;KAAS,GAAG,IAAI,CAACnC,KAAK;IAC3C,IAAIkC,WAAW,IAAI,IAAI,EAAE;AACvB,MAAA,MAAM,IAAIE,KAAK,CAAC,0BAA0B,CAAC;AAC7C,IAAA;IAEA,MAAM;MAAEC,aAAa,GAAGJ,IAAI,CAACK,IAAI;AAAEC,MAAAA,IAAI,GAAG;AAAE,KAAE,GAAGL,WAAW;AAE5D,IAAA,MAAMM,QAAQ,GAAG,IAAIC,QAAQ,EAAE;AAC/BD,IAAAA,QAAQ,CAACE,MAAM,CAACL,aAAa,EAAEJ,IAAI,CAAC;IACpCU,MAAM,CAACC,IAAI,CAACL,IAAI,CAAC,CAACM,OAAO,CAAEC,GAAG,IAAKN,QAAQ,CAACE,MAAM,CAACI,GAAG,EAAEP,IAAI,CAACO,GAAG,CAAC,CAAC,CAAC;AACnE,IAAA,OAAOC,QAAQ,CAACb,WAAW,EAAEM,QAAQ,EAAEL,OAAO,CAAC;EACjD,CAAC;AAEDa,EAAAA,oBAAoB,GAAGA,CAACC,IAAyB,EAAExC,QAAiB,KAAI;IACtE,MAAM;MAAEnB,cAAc;MAAE4D,SAAS;AAAEC,MAAAA;KAAW,GAAG,IAAI,CAACnD,KAAK;IAC3D,MAAM;AAAEE,MAAAA;KAAU,GAAG,IAAI,CAACD,KAAK;AAE/BmD,IAAAA,MAAM,CAACC,YAAY,CAAC,IAAI,CAACvD,QAAQ,CAAC;AAClC,IAAA,IAAI,CAACA,QAAQ,GAAGsD,MAAM,CAACE,UAAU,CAAC,MAAK;MACrC,IAAI,CAAC7B,QAAQ,CACX;AACElB,QAAAA,YAAY,EAAE,KAAK;AACnBH,QAAAA,UAAU,EAAE;AACb,OAAA,EACD,MAAK;QACH,IAAI6C,IAAI,KAAK,SAAS,EAAE;AACtBC,UAAAA,SAAS,GAAGzC,QAA6B,EAAEP,QAAQ,CAAC;AACtD,QAAA,CAAC,MAAM;UACLiD,SAAS,GAAG1C,QAAQ,CAAC;AACvB,QAAA;AACF,MAAA,CAAC,CACF;IACH,CAAC,EAAEnB,cAAc,CAAC;EACpB,CAAC;AAEDiE,EAAAA,aAAa,GAAGA,CAAC9C,QAAiB,EAAEwC,IAAyB,KAAI;IAC/D,IAAI,CAACxB,QAAQ,CACX;MACEhB,QAAQ;MACRJ,OAAO,EAAE4C,IAAI,KAAK,OAAO;MACzBzC,SAAS,EAAEyC,IAAI,KAAK;KACrB,EACD,MAAM,IAAI,CAACD,oBAAoB,CAACC,IAAI,EAAExC,QAAQ,CAAC,CAChD;EACH,CAAC;EAED+C,aAAa,GAAgDjC,KAAK,IAAI;IACpEA,KAAK,CAACC,cAAc,EAAE;IACtB,MAAM;AAAEiC,MAAAA;KAAU,GAAG,IAAI,CAACzD,KAAK;AAC/ByD,IAAAA,QAAQ,IAAI;IAEZ,IAAI,CAAC7B,KAAK,EAAE;EACd,CAAC;EAEDA,KAAK,GAAGA,MAAK;IACX,IAAI,CAAC/B,WAAW,GAAG,CAAC;AACpBuD,IAAAA,MAAM,CAACC,YAAY,CAAC,IAAI,CAACvD,QAAQ,CAAC;IAClC,IAAI,CAAC2B,QAAQ,CAAC;AACZrB,MAAAA,UAAU,EAAE,KAAK;AACjBC,MAAAA,OAAO,EAAE,KAAK;AACdE,MAAAA,YAAY,EAAE,KAAK;AACnBC,MAAAA,SAAS,EAAE;AACZ,KAAA,CAAC;EACJ,CAAC;EAEDkD,aAAa,GAAIC,OAAe,IAAI;IAClC,MAAM;AAAErD,MAAAA;KAAS,GAAG,IAAI,CAACL,KAAK;AAC9B,IAAA,IAAIK,OAAO,EAAE;MACX,IAAI,CAACmB,QAAQ,CAAC;AACZd,QAAAA,aAAa,EAAEgD;AAChB,OAAA,CAAC;AACJ,IAAA;EACF,CAAC;EAED5B,WAAW,GAAG,MAAOE,IAAU,IAAI;IACjC,MAAM;MAAEC,WAAW;MAAE3C,OAAO;MAAEqE,OAAO;MAAEjE,UAAU;AAAED,MAAAA;KAAU,GAAG,IAAI,CAACM,KAAK;IAC1E,MAAM;AAAEO,MAAAA;KAAc,GAAG,IAAI,CAACN,KAAK;IAEnC,IAAIN,UAAU,IAAIY,YAAY,EAAE;AAC9B,MAAA,OAAO,KAAK;AACd,IAAA;IAEA,IAAI,CAAC0B,IAAI,EAAE;AACT,MAAA,MAAM,IAAIG,KAAK,CAAC,yBAAyB,CAAC;AAC5C,IAAA;IAEA,IAAI,CAACX,QAAQ,CAAC;MACZvB,QAAQ,EAAE+B,IAAI,CAACK,IAAI;AACnBnC,MAAAA,WAAW,EAAE,KAAK;AAClBI,MAAAA,YAAY,EAAE;AACf,KAAA,CAAC;IAEFqD,OAAO,GAAG3B,IAAI,CAAC;IAEf,IAAI4B,MAAM,GAAG,IAAI;IAEjB,IAAI;AACFA,MAAAA,MAAM,GAAG,MAAMC,aAAa,CAAC7B,IAAI,CAAC;IACpC,CAAC,CAAC,OAAO8B,KAAK,EAAE;AACd,MAAA,IAAI,CAACR,aAAa,CAACQ,KAAK,EAAE,OAAO,CAAC;AACpC,IAAA;IAEA,IAAI,CAACF,MAAM,EAAE;AACX,MAAA,OAAO,KAAK;AACd,IAAA;IAEA,IAAI,CAACpC,QAAQ,CAAC;MACZnB,OAAO,EAAE0D,WAAW,CAAC/B,IAAI,EAAE4B,MAAM,CAAC,CAACI,QAAQ,CAAC,OAAO;AACpD,KAAA,CAAC;IAEF,IAAI,CAACC,WAAW,CAACjC,IAAI,EAAEvC,QAAQ,EAAEmE,MAAM,CAAC,EAAE;MACxC,IAAI,CAACN,aAAa,CAChB,IAAIY,aAAa,CACf,IAAIC,QAAQ,CAAC,IAAI,EAAE;AACjBvD,QAAAA,MAAM,EAAE,GAAG;AACXwD,QAAAA,UAAU,EAAE;AACb,OAAA,CAAC,CACH,EACD,OAAO,CACR;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AAEA,IAAA,IAAI,OAAO9E,OAAO,KAAK,QAAQ,IAAI,CAAC+E,WAAW,CAACrC,IAAI,EAAE1C,OAAO,CAAC,EAAE;MAC9D,IAAI,CAACgE,aAAa,CAChB,IAAIY,aAAa,CACf,IAAIC,QAAQ,CAAC,IAAI,EAAE;AACjBvD,QAAAA,MAAM,EAAE,GAAG;AACXwD,QAAAA,UAAU,EAAE;AACb,OAAA,CAAC,CACH,EACD,OAAO,CACR;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AAEA,IAAA,IAAInC,WAAW,EAAE;AACf;AACA,MAAA,IAAIzB,QAAQ;MACZ,IAAI;AACFA,QAAAA,QAAQ,GAAG,MAAM,IAAI,CAACuB,SAAS,CAACC,IAAI,CAAC;MACvC,CAAC,CAAC,OAAO8B,KAAK,EAAE;AACd,QAAA,IAAI,CAACR,aAAa,CAACQ,KAAK,EAAE,OAAO,CAAC;AAClC,QAAA,OAAO,KAAK;AACd,MAAA;AACA,MAAA,IAAI,CAACR,aAAa,CAAC9C,QAAQ,EAAE,SAAS,CAAC;AACvC,MAAA,IAAI,CAACiD,aAAa,CAACG,MAAM,CAAC;AAC1B,MAAA,OAAO,IAAI;AACb,IAAA;AACA;AACA,IAAA,IAAI,CAACH,aAAa,CAACG,MAAM,CAAC;AAC1B,IAAA,IAAI,CAACN,aAAa,CAACM,MAAM,EAAE,SAAS,CAAC;AACrC,IAAA,OAAO,IAAI;EACb,CAAC;AAEDU,EAAAA,MAAMA,GAAA;IACJ,MAAM;MACJhF,OAAO;MACPiF,aAAa;MACb9E,QAAQ;MACR+E,YAAY;MACZC,iBAAiB;MACjB/E,UAAU;MACVgF,WAAW;MACX/E,OAAO;MACPgF,aAAa;MACbC,YAAY;MACZC,gBAAgB;MAChBtF,gBAAgB;MAChBuF,YAAY;MACZC,aAAa;MACbvF,IAAI;MACJwB,IAAI;AACJgE,MAAAA;KACD,GAAG,IAAI,CAACjF,KAAK;IAEd,MAAM;MACJS,QAAQ;MACRP,QAAQ;MACRE,UAAU;MACVD,WAAW;MACXE,OAAO;MACPC,OAAO;MACPC,YAAY;MACZC,SAAS;AACTG,MAAAA;KACD,GAAG,IAAI,CAACV,KAAK;IAEd,MAAMiF,WAAW,GAAG,CAAC,MAAa;AAChC,MAAA,IAAIN,aAAa,EAAE;AACjB,QAAA,OAAOA,aAAa;AACtB,MAAA;AAEA,MAAA,IAAI,OAAOrF,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACyD,aAAa,EAAE;UAAErF,OAAO,EAAE6B,aAAa,CAAC7B,OAAO;AAAC,SAAE,CAAC;AACxF,MAAA;AAEA,MAAA,OAAO0B,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACgE,oBAAoB,CAAC;AAC1D,IAAA,CAAC,GAAG;AAEJ,IAAA,oBACEC,IAAA,CAAA,KAAA,EAAA;AACEC,MAAAA,SAAS,EAAEC,IAAI,CAAC,gBAAgB,EAAE;AAChCC,QAAAA,SAAS,EAAE,IAAI;QACf,8BAA8B,EAAE9F,IAAI,KAAK,IAAI;AAC7C,QAAA,8BAA8B,EAAEA,IAAI,KAAK,IAAI,IAAI,CAACA,IAAI;QACtD,8BAA8B,EAAEA,IAAI,KAAK,IAAI;AAC7C,QAAA,oBAAoB,EAAEU,WAAW;AACjC,QAAA,sBAAsB,EAAEI,YAAY;AACpC,QAAA,oBAAoB,EAAEH,UAAU,IAAI,CAACC,OAAO;QAC5C,oBAAoB,EAAEA,OAAO,IAAI,CAACE;AACnC,OAAA,CAAE;MACHmB,WAAW,EAAGH,KAAK,IAAK,IAAI,CAACG,WAAW,CAACH,KAAK,CAAE;MAChDD,WAAW,EAAGC,KAAK,IAAK,IAAI,CAACD,WAAW,CAACC,KAAK,CAAE;MAChDI,MAAM,EAAE,MAAOJ,KAAK,IAAK,IAAI,CAACI,MAAM,CAACJ,KAAK,CAAE;AAC5CiE,MAAAA,UAAU,EAAGjE,KAAK,IAAKA,KAAK,CAACC,cAAc,EAAG;MAAAiE,QAAA,EAAA,CAE7C,CAAClF,YAAY,IAAI,CAACH,UAAU,iBAC3BsF,GAAA,CAACC,eAAe,EAAA;QACd5D,WAAW,EAAE,MAAOE,IAAI,IAAK,IAAI,CAACF,WAAW,CAACE,IAAI,CAAE;AACpD7B,QAAAA,UAAU,EAAEA,UAAW;AACvBV,QAAAA,QAAQ,EAAEA,QAAS;QACnB+E,YAAY,EAAEA,YAAY,IAAIxD,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACsD,YAAY,CAAE;AACxE9E,QAAAA,UAAU,EAAEA,UAAW;AACvBgF,QAAAA,WAAW,EAAEA,WAAY;AACzB/E,QAAAA,OAAO,EAAEA,OAAQ;AACjBgF,QAAAA,aAAa,EAAEM;AAAY,OAAA,CAE9B,EAEA,CAAC1E,SAAS,IAAIJ,UAAU,KAAK,CAACC,OAAO,iBACpCqF,GAAA,CAACE,YAAY,EAAA;AACX1F,QAAAA,QAAQ,EAAEA,QAAS;AACnBE,QAAAA,UAAU,EAAEA,UAAW;AACvBE,QAAAA,OAAO,EAAEA,OAAQ;QACjByE,YAAY,EAAEA,YAAY,IAAI9D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC4D,YAAY,CAAE;QACxEC,aAAa,EAAEA,aAAa,IAAI/D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC6D,aAAa,CAAE;AAC3ErE,QAAAA,aAAa,EAAEA,aAAc;AAC7BkF,QAAAA,OAAO,EAAGtE,KAAK,IAAK,IAAI,CAACiC,aAAa,CAACjC,KAAK;OAAE,CAEjD,EACAlB,OAAO,IAAI,CAACE,YAAY,iBACvBmF,GAAA,CAACC,eAAe,EAAA;QACd5D,WAAW,EAAE,MAAOE,IAAI,IAAI;UAC1B,IAAI,CAACL,KAAK,EAAE;AACZ,UAAA,MAAM,IAAI,CAACG,WAAW,CAACE,IAAI,CAAC;QAC9B,CAAE;QACF7B,UAAU,EAAE,CAACC,OAAQ;AACrBX,QAAAA,QAAQ,EAAEA,QAAS;QACnB+E,YAAY,EAAEC,iBAAiB,IAAIzD,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC2E,KAAK,CAAE;AACtEnG,QAAAA,UAAU,EAAEA,UAAW;AACvBgF,QAAAA,WAAW,EAAE,IAAK;AAClB/E,QAAAA,OAAO,EAAEA,OAAQ;AACjBgF,QAAAA,aAAa,EAAEM,WAAY;AAC3Ba,QAAAA,YAAY,EAAE,IAAI,CAACnF,eAAe,CAChCH,QAAQ,IAAI,IAAI,IACd,OAAOA,QAAQ,KAAK,QAAQ,IAC5B,QAAQ,IAAIA,QAAQ,IACpB,OAAOA,QAAQ,CAACI,MAAM,KAAK,QAAQ,GACjCJ,QAAQ,CAACI,MAAM,GACfH,SAAS,CACb;AACFuE,QAAAA,cAAc,EAAEA;AAAe,OAAA,CAElC,EACA1E,YAAY,iBACXmF,GAAA,CAACM,cAAc,EAAA;AACb5F,QAAAA,UAAU,EAAEA,UAAW;AACvBC,QAAAA,OAAO,EAAEA,OAAQ;AACjBG,QAAAA,SAAS,EAAEA,SAAU;QACrBqE,YAAY,EAAEA,YAAY,IAAI5D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC0D,YAAY,CAAE;QACxEC,gBAAgB,EAAEA,gBAAgB,IAAI7D,IAAI,CAACC,aAAa,CAACC,QAAQ,CAAC2D,gBAAgB,CAAE;AACpFtF,QAAAA,gBAAgB,EAAEA,gBAAiB;AACnCqG,QAAAA,OAAO,EAAGtE,KAAK,IAAK,IAAI,CAACiC,aAAa,CAACjC,KAAK;AAAE,OAAA,CAEjD,EACA,CAAChB,YAAY,iBACZmF,GAAA,CAAA,KAAA,EAAA;AAAKL,QAAAA,SAAS,EAAC,wCAAwC;AAAC,QAAA,WAAA,EAAU,QAAQ;AAAAI,QAAAA,QAAA,eACxEL,IAAA,CAAA,KAAA,EAAA;AAAKC,UAAAA,SAAS,EAAC,wBAAwB;AAAAI,UAAAA,QAAA,gBACrCC,GAAA,CAAA,KAAA,EAAA;AAAKL,YAAAA,SAAS,EAAC,+BAA+B;YAAAI,QAAA,eAC5CC,GAAA,CAACO,IAAQ,EAAA;AAACxG,cAAAA,IAAI,EAAC;aAAI;AACrB,WAAK,CACL,eAAAiG,GAAA,CAACQ,KAAK,EAAA;YAACjD,IAAI,EAAEkD,UAAU,CAACC,UAAW;AAACf,YAAAA,SAAS,EAAC,OAAO;YAAAI,QAAA,EAClDjB,aAAa,IAAIvD,IAAI,CAACC,aAAa,CAACC,QAAQ,CAACqD,aAAa;AAAC,WACvD,CACT;SAAK;AACP,OAAK,CACN;AAAA,KACE,CAAC;AAEV,EAAA;;AAGF,qBAAe6B,UAAU,CAAClH,MAAM,CAAC;AAEjC,MAAMiC,aAAa,GAAIkF,KAAa,IAAI;AACtC,EAAA,MAAMC,SAAS,GAAGD,KAAK,GAAG,OAAO;EACjC,IAAIC,SAAS,IAAI,GAAG,EAAE;IACpB,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,SAAS,CAAC,KAAKA,SAAS;IACnD,OAAOC,OAAO,GAAG,CAAA,EAAGD,SAAS,CAAA,CAAE,GAAGA,SAAS,CAACI,OAAO,CAAC,CAAC,CAAC;AACxD,EAAA;EACA,IAAIJ,SAAS,IAAI,IAAI,EAAE;AACrB,IAAA,OAAOA,SAAS,CAACI,OAAO,CAAC,CAAC,CAAC;AAC7B,EAAA;AACA,EAAA,OAAOJ,SAAS,CAACI,OAAO,CAAC,CAAC,CAAC;AAC7B,CAAC;;;;"}