UNPKG

26.6 kBSource Map (JSON)View Raw
1{"version":3,"file":"react-responsive-modal.cjs.development.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: { element: HTMLDivElement; blockScroll: boolean }[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (newModal: HTMLDivElement, blockScroll: boolean) => {\n if (modals.findIndex((modal) => modal.element === newModal) === -1) {\n modals.push({ element: newModal, blockScroll });\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (oldModal: HTMLDivElement) => {\n const index = modals.findIndex((modal) => modal.element === oldModal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1]?.element === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n // We filter the modals that are not affecting the scroll\n const modals = modalManager.modals().filter((modal) => modal.blockScroll);\n if (modals.length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\nexport interface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!, blockScroll);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classes","classNames","styles","id","closeIcon","onClickCloseIcon","React","className","cx","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","add","newModal","blockScroll","findIndex","modal","element","push","remove","oldModal","index","splice","isTopModal","length","isBrowser","window","blockNoScroll","noScroll","on","unblockNoScroll","modalManager","filter","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","tabTrappingKey","event","key","contains","process","console","warn","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","current","document","addEventListener","selector","activeElement","matches","removeEventListener","overlay","modalCenter","animationIn","animationOut","Modal","open","center","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","body","appendChild","handleKeydown","handleClose","removeChild","keyCode","handleClickOverlay","handleModalEvent","handleClickCloseIcon","handleAnimationEnd","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,IAAMA,SAAS,GAAG,SAAZA,SAAY;AAAA,MAChBC,OADgB,QAChBA,OADgB;AAAA,MAEhBC,UAFgB,QAEhBA,UAFgB;AAAA,MAGhBC,MAHgB,QAGhBA,MAHgB;AAAA,MAIhBC,EAJgB,QAIhBA,EAJgB;AAAA,MAKhBC,SALgB,QAKhBA,SALgB;AAAA,MAMhBC,gBANgB,QAMhBA,gBANgB;AAAA,SAQhBC,4BAAA,SAAA;AACEH,IAAAA,EAAE,EAAEA;AACJI,IAAAA,SAAS,EAAEC,EAAE,CAACR,OAAO,CAACS,WAAT,EAAsBR,UAAtB,aAAsBA,UAAtB,uBAAsBA,UAAU,CAAEQ,WAAlC;AACbC,IAAAA,KAAK,EAAER,MAAF,aAAEA,MAAF,uBAAEA,MAAM,CAAEO;AACfE,IAAAA,OAAO,EAAEN;mBACG;GALd,EAOGD,SAAS,GACRA,SADQ,GAGRE,4BAAA,MAAA;AACEC,IAAAA,SAAS,EAAEN,UAAF,aAAEA,UAAF,uBAAEA,UAAU,CAAEG;AACvBM,IAAAA,KAAK,EAAER,MAAF,aAAEA,MAAF,uBAAEA,MAAM,CAAEE;AACfQ,IAAAA,KAAK,EAAC;AACNC,IAAAA,KAAK,EAAE;AACPC,IAAAA,MAAM,EAAE;AACRC,IAAAA,OAAO,EAAC;mBACI;GAPd,EASET,4BAAA,OAAA;AAAMU,IAAAA,CAAC,EAAC;GAAR,CATF,CAVJ,CARgB;AAAA,CAAlB;;ACpBA,IAAMC,OAAM,GAAwD,EAApE;AAEA;;;;;AAIA,mBAAe;AACb;;;AAGAA,EAAAA,MAAM,EAAE;AAAA,WAAMA,OAAN;AAAA,GAJK;;AAMb;;;AAGAC,EAAAA,GAAG,EAAE,aAACC,QAAD,EAA2BC,WAA3B;AACH,QAAIH,OAAM,CAACI,SAAP,CAAiB,UAACC,KAAD;AAAA,aAAWA,KAAK,CAACC,OAAN,KAAkBJ,QAA7B;AAAA,KAAjB,MAA4D,CAAC,CAAjE,EAAoE;AAClEF,MAAAA,OAAM,CAACO,IAAP,CAAY;AAAED,QAAAA,OAAO,EAAEJ,QAAX;AAAqBC,QAAAA,WAAW,EAAXA;AAArB,OAAZ;AACD;AACF,GAbY;;AAeb;;;AAGAK,EAAAA,MAAM,EAAE,gBAACC,QAAD;AACN,QAAMC,KAAK,GAAGV,OAAM,CAACI,SAAP,CAAiB,UAACC,KAAD;AAAA,aAAWA,KAAK,CAACC,OAAN,KAAkBG,QAA7B;AAAA,KAAjB,CAAd;;AACA,QAAIC,KAAK,KAAK,CAAC,CAAf,EAAkB;AAChBV,MAAAA,OAAM,CAACW,MAAP,CAAcD,KAAd,EAAqB,CAArB;AACD;AACF,GAvBY;;AAyBb;;;AAGAE,EAAAA,UAAU,EAAE,oBAACP,KAAD;AAAA;;AAAA,WACV,CAAC,CAACL,OAAM,CAACa,MAAT,IAAmB,aAAAb,OAAM,CAACA,OAAM,CAACa,MAAP,GAAgB,CAAjB,CAAN,sDAA2BP,OAA3B,MAAuCD,KADhD;AAAA;AA5BC,CAAf;;ACHO,IAAMS,SAAS,GAAG,OAAOC,MAAP,KAAkB,WAApC;AAEP,AAAO,IAAMC,aAAa,GAAG,SAAhBA,aAAgB;AAC3BC,EAAAA,QAAQ,CAACC,EAAT;AACD,CAFM;AAIP,AAAO,IAAMC,eAAe,GAAG,SAAlBA,eAAkB;AAC7B;AACA;AACA,MAAMnB,MAAM,GAAGoB,YAAY,CAACpB,MAAb,GAAsBqB,MAAtB,CAA6B,UAAChB,KAAD;AAAA,WAAWA,KAAK,CAACF,WAAjB;AAAA,GAA7B,CAAf;;AACA,MAAIH,MAAM,CAACa,MAAP,KAAkB,CAAtB,EAAyB;AACvBI,IAAAA,QAAQ,CAACK,GAAT;AACD;AACF,CAPM;;ACTP;AAEA,AAAO,IAAMC,kBAAkB,GAAG,CAChC,OADgC,EAEhC,QAFgC,EAGhC,UAHgC,EAIhC,SAJgC,EAKhC,QALgC,EAMhC,YANgC,EAOhC,iBAPgC,EAQhC,iBARgC,EAShC,kDATgC,CAA3B;;AAYP,SAASC,QAAT,CAAkBC,IAAlB;AACE;AACA;AACA,SACEA,IAAI,CAACC,YAAL,KAAsB,IAAtB,IAA8BC,gBAAgB,CAACF,IAAD,CAAhB,CAAuBG,UAAvB,KAAsC,QADtE;AAGD;;AAED,SAAgBC,sBAAsBC;AACpC,MAAIC,aAAa,GAAGD,UAAU,CAACE,gBAAX,CAA4BT,kBAAkB,CAACU,IAAnB,CAAwB,GAAxB,CAA5B,CAApB;AACA,MAAIC,YAAY,GAAG,EAAnB;;AACA,OAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,aAAa,CAAClB,MAAlC,EAA0CsB,CAAC,EAA3C,EAA+C;AAC7C,QAAIV,IAAI,GAAGM,aAAa,CAACI,CAAD,CAAxB;;AACA,QAAI,CAACV,IAAI,CAACW,QAAN,IAAkBC,WAAW,CAACZ,IAAD,CAAX,GAAoB,CAAC,CAAvC,IAA4C,CAACD,QAAQ,CAACC,IAAD,CAAzD,EAAiE;AAC/DS,MAAAA,YAAY,CAAC3B,IAAb,CAAkBkB,IAAlB;AACD;AACF;;AACD,SAAOS,YAAP;AACD;AAED,SAAgBI,eAAeC,OAAYT;AACzC;AACA,MAAI,CAACS,KAAD,IAAUA,KAAK,CAACC,GAAN,KAAc,KAA5B,EAAmC;;AAEnC,MAAI,CAACV,UAAD,IAAe,CAACA,UAAU,CAACW,QAA/B,EAAyC;AACvC,QAAIC,OAAO,IAAIA,aAAA,KAAyB,aAAxC,EAAuD;AACrDC,MAAAA,OAAO,CAACC,IAAR,CAAa,8CAAb;AACD;;AACD,WAAO,KAAP;AACD;;AAED,MAAI,CAACd,UAAU,CAACW,QAAX,CAAoBF,KAAK,CAACM,MAA1B,CAAL,EAAwC;AACtC,WAAO,KAAP;AACD;;AAED,MAAIC,kBAAkB,GAAGjB,qBAAqB,CAACC,UAAD,CAA9C;AACA,MAAIiB,qBAAqB,GAAGD,kBAAkB,CAAC,CAAD,CAA9C;AACA,MAAIE,oBAAoB,GAAGF,kBAAkB,CAACA,kBAAkB,CAACjC,MAAnB,GAA4B,CAA7B,CAA7C;;AAEA,MAAI0B,KAAK,CAACU,QAAN,IAAkBV,KAAK,CAACM,MAAN,KAAiBE,qBAAvC,EAA8D;AAC5DC,IAAAA,oBAAoB,CAACE,KAArB;AACAX,IAAAA,KAAK,CAACY,cAAN;AACA,WAAO,IAAP;AACD,GAJD,MAIO,IAAI,CAACZ,KAAK,CAACU,QAAP,IAAmBV,KAAK,CAACM,MAAN,KAAiBG,oBAAxC,EAA8D;AACnED,IAAAA,qBAAqB,CAACG,KAAtB;AACAX,IAAAA,KAAK,CAACY,cAAN;AACA,WAAO,IAAP;AACD;;AACD,SAAO,KAAP;AACD;;AAED,SAASd,WAAT,CAAqBZ,IAArB;AACE,MAAI2B,YAAY,GAAGC,QAAQ,CAAC5B,IAAI,CAAC6B,YAAL,CAAkB,UAAlB,CAAD,EAAgC,EAAhC,CAA3B;AAEA,MAAI,CAACC,KAAK,CAACH,YAAD,CAAV,EAA0B,OAAOA,YAAP;AAE1B;;AAEA,MAAII,iBAAiB,CAAC/B,IAAD,CAArB,EAA6B,OAAO,CAAP;AAC7B,SAAOA,IAAI,CAACgC,QAAZ;AACD;;AAED,SAASD,iBAAT,CAA2B/B,IAA3B;AACE,SAAOA,IAAI,CAAC6B,YAAL,CAAkB,iBAAlB,CAAP;AACD;;AClEM,IAAMI,SAAS,GAAG,SAAZA,SAAY;MAAGC,iBAAAA;AAC1B,MAAMC,YAAY,GAAGC,YAAM,EAA3B;AACA;;;;AAGAC,EAAAA,eAAS,CAAC;AACR,QAAMC,cAAc,GAAG,SAAjBA,cAAiB,CAACxB,KAAD;AACrB,UAAIoB,SAAJ,aAAIA,SAAJ,uBAAIA,SAAS,CAAEK,OAAf,EAAwB;AACtB1B,QAAAA,cAAc,CAACC,KAAD,EAAQoB,SAAS,CAACK,OAAlB,CAAd;AACD;AACF,KAJD;;AAMA,QAAIlD,SAAJ,EAAe;AACbmD,MAAAA,QAAQ,CAACC,gBAAT,CAA0B,SAA1B,EAAqCH,cAArC;AACD;;;AAED,QAAIjD,SAAS,KAAI6C,SAAJ,aAAIA,SAAJ,uBAAIA,SAAS,CAAEK,OAAf,CAAb,EAAqC;AACnC,UAAMlB,kBAAkB,GAAGjB,qBAAqB,CAAC8B,SAAS,CAACK,OAAX,CAAhD;;AACA,UAAIlB,kBAAkB,CAAC,CAAD,CAAtB,EAA2B;AACzB;AACA;AACA,YACEvB,kBAAkB,CAACnB,SAAnB,CAA6B,UAAC+D,QAAD;AAAA;;AAAA,0CAC3BF,QAAQ,CAACG,aADkB,0DAC3B,sBAAwBC,OAAxB,CAAgCF,QAAhC,CAD2B;AAAA,SAA7B,MAEM,CAAC,CAHT,EAIE;AACAP,UAAAA,YAAY,CAACI,OAAb,GAAuBC,QAAQ,CAACG,aAAhC;AACD;;AACDtB,QAAAA,kBAAkB,CAAC,CAAD,CAAlB,CAAsBI,KAAtB;AACD;AACF;;AACD,WAAO;AACL,UAAIpC,SAAJ,EAAe;AAAA;;AACbmD,QAAAA,QAAQ,CAACK,mBAAT,CAA6B,SAA7B,EAAwCP,cAAxC,EADa;;AAGb,iCAAAH,YAAY,CAACI,OAAb,gFAAsBd,KAAtB;AACD;AACF,KAND;AAOD,GAjCQ,EAiCN,CAACS,SAAD,CAjCM,CAAT;AAmCA,SAAO,IAAP;AACD,CAzCM;;ACJP,IAAM5E,OAAO,GAAG;AACdwF,EAAAA,OAAO,EAAE,gCADK;AAEdlE,EAAAA,KAAK,EAAE,8BAFO;AAGdmE,EAAAA,WAAW,EAAE,oCAHC;AAIdhF,EAAAA,WAAW,EAAE,oCAJC;AAKdiF,EAAAA,WAAW,EAAE,+BALC;AAMdC,EAAAA,YAAY,EAAE;AANA,CAAhB;AA+HA,IAAaC,KAAK,GAAG,SAARA,KAAQ;;;MACnBC,YAAAA;MACAC,cAAAA;8BACA1E;MAAAA,4CAAc;6BACd2E;MAAAA,0CAAa;mCACbC;MAAAA,yDAAsB;MACtBpB,iBAAAA;gCACAqB;MAAAA,gDAAgB;MAChBC,mBAAAA;MACA9F,iBAAAA;+BACA+F;MAAAA,8CAAe;mCACfC;MAAAA,uDAAoB;MACpBnG,kBAAAA;MACAC,cAAAA;uBACAmG;MAAAA,8BAAO;MACPC,uBAAAA;MACAC,sBAAAA;MACAC,eAAAA;MACAC,eAAAA;MACAC,oBAAAA;MACAC,sBAAAA;MACAC,sBAAAA;MACAC,gBAAAA;AAEA,MAAMC,QAAQ,GAAGhC,YAAM,CAAiB,IAAjB,CAAvB;AACA,MAAMiC,cAAc,GAAGjC,YAAM,CAAiB,IAAjB,CAA7B;AACA,MAAMkC,YAAY,GAAGlC,YAAM,CAAwB,IAAxB,CAA3B;AAEA;;AACA,MAAIkC,YAAY,CAAC/B,OAAb,KAAyB,IAAzB,IAAiClD,SAArC,EAAgD;AAC9CiF,IAAAA,YAAY,CAAC/B,OAAb,GAAuBC,QAAQ,CAAC+B,aAAT,CAAuB,KAAvB,CAAvB;AACD;;kBAEmCC,cAAQ,CAACrB,IAAD;MAArCsB;MAAYC;;AAEnB,MAAMC,UAAU,GAAG,SAAbA,UAAa;AACjBhF,IAAAA,YAAY,CAACnB,GAAb,CAAiB8F,YAAY,CAAC/B,OAA9B,EAAwC7D,WAAxC;;AACA,QAAIA,WAAJ,EAAiB;AACfa,MAAAA,aAAa;AACd;;AACD,QACE+E,YAAY,CAAC/B,OAAb,IACA,CAACL,SADD,IAEA,CAACM,QAAQ,CAACoC,IAAT,CAAc5D,QAAd,CAAuBsD,YAAY,CAAC/B,OAApC,CAHH,EAIE;AACAC,MAAAA,QAAQ,CAACoC,IAAT,CAAcC,WAAd,CAA0BP,YAAY,CAAC/B,OAAvC;AACD;;AACDC,IAAAA,QAAQ,CAACC,gBAAT,CAA0B,SAA1B,EAAqCqC,aAArC;AACD,GAbD;;AAeA,MAAMC,WAAW,GAAG,SAAdA,WAAc;AAClBpF,IAAAA,YAAY,CAACZ,MAAb,CAAoBuF,YAAY,CAAC/B,OAAjC;;AACA,QAAI7D,WAAJ,EAAiB;AACfgB,MAAAA,eAAe;AAChB;;AACD,QACE4E,YAAY,CAAC/B,OAAb,IACA,CAACL,SADD,IAEAM,QAAQ,CAACoC,IAAT,CAAc5D,QAAd,CAAuBsD,YAAY,CAAC/B,OAApC,CAHF,EAIE;AACAC,MAAAA,QAAQ,CAACoC,IAAT,CAAcI,WAAd,CAA0BV,YAAY,CAAC/B,OAAvC;AACD;;AACDC,IAAAA,QAAQ,CAACK,mBAAT,CAA6B,SAA7B,EAAwCiC,aAAxC;AACD,GAbD;;AAeA,MAAMA,aAAa,GAAG,SAAhBA,aAAgB,CAAChE,KAAD;AACpB;AACA,QACEA,KAAK,CAACmE,OAAN,KAAkB,EAAlB,IACA,CAACtF,YAAY,CAACR,UAAb,CAAwBmF,YAAY,CAAC/B,OAArC,CAFH,EAGE;AACA;AACD;;AAED,QAAIyB,YAAJ,EAAkB;AAChBA,MAAAA,YAAY,CAAClD,KAAD,CAAZ;AACD;;AAED,QAAIuC,UAAJ,EAAgB;AACdU,MAAAA,OAAO;AACR;AACF,GAhBD;;AAkBA1B,EAAAA,eAAS,CAAC;AACR;AACA,QAAIc,IAAJ,EAAU;AACRwB,MAAAA,UAAU;AACX;;AACD,WAAO;AACL;AACA,UAAIF,UAAJ,EAAgB;AACdM,QAAAA,WAAW;AACZ;AACF,KALD;AAMD,GAXQ,EAWN,EAXM,CAAT;AAaA1C,EAAAA,eAAS,CAAC;AACR;AACA,QAAIc,IAAI,IAAI,CAACsB,UAAb,EAAyB;AACvBC,MAAAA,aAAa,CAAC,IAAD,CAAb;AACAC,MAAAA,UAAU;AACX;AACF,GANQ,EAMN,CAACxB,IAAD,CANM,CAAT;;AAQA,MAAM+B,kBAAkB,GAAG,SAArBA,kBAAqB,CACzBpE,KADyB;AAGzB,QAAIuD,cAAc,CAAC9B,OAAf,KAA2B,IAA/B,EAAqC;AACnC8B,MAAAA,cAAc,CAAC9B,OAAf,GAAyB,IAAzB;AACD;;AAED,QAAI,CAAC8B,cAAc,CAAC9B,OAApB,EAA6B;AAC3B8B,MAAAA,cAAc,CAAC9B,OAAf,GAAyB,IAAzB;AACA;AACD;;AAED,QAAI0B,cAAJ,EAAoB;AAClBA,MAAAA,cAAc,CAACnD,KAAD,CAAd;AACD;;AAED,QAAIwC,mBAAJ,EAAyB;AACvBS,MAAAA,OAAO;AACR;;AAEDM,IAAAA,cAAc,CAAC9B,OAAf,GAAyB,IAAzB;AACD,GArBD;;AAuBA,MAAM4C,gBAAgB,GAAG,SAAnBA,gBAAmB;AACvBd,IAAAA,cAAc,CAAC9B,OAAf,GAAyB,KAAzB;AACD,GAFD;;AAIA,MAAM6C,oBAAoB,GAAG,SAAvBA,oBAAuB;AAC3BrB,IAAAA,OAAO;AACR,GAFD;;AAIA,MAAMsB,kBAAkB,GAAG,SAArBA,kBAAqB;AACzB,QAAI,CAAClC,IAAL,EAAW;AACTuB,MAAAA,aAAa,CAAC,KAAD,CAAb;AACAK,MAAAA,WAAW;AACZ;;AAED,QAAIrG,WAAJ,EAAiB;AACfgB,MAAAA,eAAe;AAChB;;AAED,QAAIwE,cAAJ,EAAoB;AAClBA,MAAAA,cAAc;AACf;AACF,GAbD;;AAeA,SAAOO,UAAU,GACba,QAAQ,CAACC,YAAT,CACE3H,4BAAA,MAAA;AACEI,IAAAA,KAAK;AACHwH,MAAAA,SAAS,GACPrC,IAAI,4BACA5F,UADA,aACAA,UADA,uBACAA,UAAU,CAAEyF,WADZ,yEAC2B1F,OAAO,CAAC0F,WADnC,6BAEAzF,UAFA,aAEAA,UAFA,uBAEAA,UAAU,CAAE0F,YAFZ,2EAE4B3F,OAAO,CAAC2F,YAHjC,UAILS,iBAJK;AADN,OAMAlG,MANA,aAMAA,MANA,uBAMAA,MAAM,CAAEsF,OANR;AAQLjF,IAAAA,SAAS,EAAEC,EAAE,CAACR,OAAO,CAACwF,OAAT,EAAkBvF,UAAlB,aAAkBA,UAAlB,uBAAkBA,UAAU,CAAEuF,OAA9B;AACb7E,IAAAA,OAAO,EAAEiH;AACThB,IAAAA,cAAc,EAAEmB;mBACJ;GAZd,EAcEzH,4BAAA,MAAA;AACE6H,IAAAA,GAAG,EAAErB;AACLvG,IAAAA,SAAS,EAAEC,EAAE,CACXR,OAAO,CAACsB,KADG,EAEXwE,MAAM,IAAI9F,OAAO,CAACyF,WAFP,EAGXxF,UAHW,aAGXA,UAHW,uBAGXA,UAAU,CAAEqB,KAHD;AAKbZ,IAAAA,KAAK,EAAER,MAAF,aAAEA,MAAF,uBAAEA,MAAM,CAAEoB;AACf8G,IAAAA,WAAW,EAAEP;AACbQ,IAAAA,SAAS,EAAER;AACXlH,IAAAA,OAAO,EAAEkH;AACT1H,IAAAA,EAAE,EAAEqG;AACJH,IAAAA,IAAI,EAAEA;kBACK;uBACME;wBACCD;mBACN;GAhBd,EAkBGH,YAAY,IAAI7F,4BAAA,CAACqE,SAAD;AAAWC,IAAAA,SAAS,EAAEkC;GAAtB,CAlBnB,EAmBGD,QAnBH,EAoBGZ,aAAa,IACZ3F,4BAAA,CAACP,SAAD;AACEC,IAAAA,OAAO,EAAEA;AACTC,IAAAA,UAAU,EAAEA;AACZC,IAAAA,MAAM,EAAEA;AACRE,IAAAA,SAAS,EAAEA;AACXC,IAAAA,gBAAgB,EAAEyH;AAClB3H,IAAAA,EAAE,EAAE+F;GANN,CArBJ,CAdF,CADF,EA+CEtB,SAAS,IAAIoC,YAAY,CAAC/B,OA/C5B,CADa,GAkDb,IAlDJ;AAmDD,CAzMM;;;;;"}
\No newline at end of file