@stackoverflow/backstage-plugin-stack-overflow-teams 1.6.1 → 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/api/StackOverflowAPI.esm.js +125 -0
  2. package/dist/api/StackOverflowAPI.esm.js.map +1 -0
  3. package/dist/components/StackOverflow/StackOverflowMe.esm.js +125 -0
  4. package/dist/components/StackOverflow/StackOverflowMe.esm.js.map +1 -0
  5. package/dist/components/StackOverflow/StackOverflowPostQuestionModal.esm.js +803 -0
  6. package/dist/components/StackOverflow/StackOverflowPostQuestionModal.esm.js.map +1 -0
  7. package/dist/components/StackOverflow/StackOverflowPosts.esm.js +444 -0
  8. package/dist/components/StackOverflow/StackOverflowPosts.esm.js.map +1 -0
  9. package/dist/components/StackOverflow/StackOverflowSearchResultListItem.esm.js +175 -0
  10. package/dist/components/StackOverflow/StackOverflowSearchResultListItem.esm.js.map +1 -0
  11. package/dist/components/StackOverflow/StackOverflowTags.esm.js +127 -0
  12. package/dist/components/StackOverflow/StackOverflowTags.esm.js.map +1 -0
  13. package/dist/components/StackOverflow/StackOverflowUsers.esm.js +226 -0
  14. package/dist/components/StackOverflow/StackOverflowUsers.esm.js.map +1 -0
  15. package/dist/components/StackOverflow/TiptapEditor.esm.js +312 -0
  16. package/dist/components/StackOverflow/TiptapEditor.esm.js.map +1 -0
  17. package/dist/components/StackOverflow/hooks/useStackOverflowData.esm.js +128 -0
  18. package/dist/components/StackOverflow/hooks/useStackOverflowData.esm.js.map +1 -0
  19. package/dist/components/StackOverflow/hooks/useStackOverflowSearch.esm.js +53 -0
  20. package/dist/components/StackOverflow/hooks/useStackOverflowSearch.esm.js.map +1 -0
  21. package/dist/components/StackOverflow/hooks/useStackOverflowStyles.esm.js +39 -0
  22. package/dist/components/StackOverflow/hooks/useStackOverflowStyles.esm.js.map +1 -0
  23. package/dist/components/StackOverflowAuth/StackAuthCallback.esm.js +48 -0
  24. package/dist/components/StackOverflowAuth/StackAuthCallback.esm.js.map +1 -0
  25. package/dist/components/StackOverflowAuth/StackAuthFailed.esm.js +38 -0
  26. package/dist/components/StackOverflowAuth/StackAuthFailed.esm.js.map +1 -0
  27. package/dist/components/StackOverflowAuth/StackAuthLoading.esm.js +22 -0
  28. package/dist/components/StackOverflowAuth/StackAuthLoading.esm.js.map +1 -0
  29. package/dist/components/StackOverflowAuth/StackAuthStart.esm.js +238 -0
  30. package/dist/components/StackOverflowAuth/StackAuthStart.esm.js.map +1 -0
  31. package/dist/components/StackOverflowAuth/StackAuthSuccess.esm.js +40 -0
  32. package/dist/components/StackOverflowAuth/StackAuthSuccess.esm.js.map +1 -0
  33. package/dist/icons/LogoutIcon.esm.js +24 -0
  34. package/dist/icons/LogoutIcon.esm.js.map +1 -0
  35. package/dist/icons/StackOverflowIcon.esm.js +27 -0
  36. package/dist/icons/StackOverflowIcon.esm.js.map +1 -0
  37. package/dist/index.d.ts +47 -0
  38. package/dist/index.esm.js +19 -0
  39. package/dist/index.esm.js.map +1 -0
  40. package/dist/package.json.esm.js +6 -0
  41. package/dist/package.json.esm.js.map +1 -0
  42. package/dist/pages/StackOverflowHub.esm.js +138 -0
  43. package/dist/pages/StackOverflowHub.esm.js.map +1 -0
  44. package/dist/pages/StackOverflowTeamsPage.esm.js +43 -0
  45. package/dist/pages/StackOverflowTeamsPage.esm.js.map +1 -0
  46. package/dist/pages/index.esm.js +3 -0
  47. package/dist/pages/index.esm.js.map +1 -0
  48. package/dist/plugin.esm.js +27 -0
  49. package/dist/plugin.esm.js.map +1 -0
  50. package/dist/routes.esm.js +8 -0
  51. package/dist/routes.esm.js.map +1 -0
  52. package/dist/utils/decodeHtml.esm.js +8 -0
  53. package/dist/utils/decodeHtml.esm.js.map +1 -0
  54. package/dist/utils/getTimeAgo.esm.js +30 -0
  55. package/dist/utils/getTimeAgo.esm.js.map +1 -0
  56. package/package.json +13 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackOverflowPostQuestionModal.esm.js","sources":["../../../src/components/StackOverflow/StackOverflowPostQuestionModal.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport Chip from '@mui/material/Chip';\nimport { stackoverflowteamsApiRef } from '../../api';\nimport Modal from '@mui/material/Modal';\nimport Box from '@mui/material/Box';\nimport TextField from '@mui/material/TextField';\nimport Button from '@mui/material/Button';\nimport Typography from '@mui/material/Typography';\nimport Link from '@mui/material/Link';\nimport Paper from '@mui/material/Paper';\nimport Alert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\nimport Grid from '@mui/material/Grid';\nimport Card from '@mui/material/Card';\nimport CardContent from '@mui/material/CardContent';\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\nimport InfoIcon from '@mui/icons-material/Info';\nimport LightbulbIcon from '@mui/icons-material/Lightbulb';\nimport CodeIcon from '@mui/icons-material/Code';\nimport TitleIcon from '@mui/icons-material/Title';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport LocalOfferIcon from '@mui/icons-material/LocalOffer';\nimport GroupIcon from '@mui/icons-material/Group';\nimport PersonIcon from '@mui/icons-material/Person';\nimport CloseIcon from '@mui/icons-material/Close';\nimport IconButton from '@mui/material/IconButton';\nimport { useStackOverflowStyles } from './hooks';\nimport { TiptapEditor } from './TiptapEditor';\nimport type { Tag } from '../../types'\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { debounce } from '@material-ui/core';\nimport Divider from '@mui/material/Divider';\n\n// Utility function to detect Mac\nconst isMac = () => {\n return typeof navigator !== 'undefined' && navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n};\n\n// Apple keyboards are... different :)\nconst getModifierKey = () => {\n const isApple = isMac();\n return {\n symbol: isApple ? '⌘' : 'Ctrl',\n text: isApple ? 'Cmd' : 'Ctrl'\n };\n};\n\nexport const StackOverflowPostQuestionModal = () => {\n const stackOverflowApi = useApi(stackoverflowteamsApiRef);\n const [title, setTitle] = useState('');\n const [body, setBody] = useState('');\n const [tags, setTags] = useState<string[]>([]);\n const [tagInput, setTagInput] = useState('');\n const [focusedField, setFocusedField] = useState<string | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState(false);\n const [open, setOpen] = useState(false);\n const [titleValidation, setTitleValidation] = useState('');\n const [bodyValidation, setBodyValidation] = useState('');\n const [tagsValidation, setTagsValidation] = useState('');\n const classes = useStackOverflowStyles();\n const [titleStarted, setTitleStarted] = useState(false);\n const [bodyStarted, setBodyStarted] = useState(false);\n const [tagsStarted, setTagsStarted] = useState(false);\n \n const [popularTags, setPopularTags] = useState<Tag[]>([])\n const [loadingTags, setLoadingTags] = useState(false)\n const [tagError, setTagError] = useState<string | null>(null)\n \n const [tagSearchResults, setTagSearchResults] = useState<Tag[]>([]);\n const [searchingTags, setSearchingTags] = useState(false);\n const [showCreateTagOption, setShowCreateTagOption] = useState(false);\n \n const fetchPopularTags = useCallback(async function fetchPopularTags() {\n if (!isAuthenticated) return;\n setLoadingTags(true);\n setTagError(null);\n try {\n const response = await stackOverflowApi.getTags();\n const topTags = response.items?.slice(0, 10) || [];\n setPopularTags(topTags);\n } catch (err) {\n setTagError('Failed to load tags.')\n setPopularTags([])\n } finally {\n setLoadingTags(false);\n }\n }, [stackOverflowApi, isAuthenticated])\n \n const searchTags = useMemo(\n () => debounce(async (searchTerm: string) => {\n if (!searchTerm.trim() || !isAuthenticated) {\n setTagSearchResults([]);\n setShowCreateTagOption(false);\n return;\n }\n setSearchingTags(true);\n try {\n const response = await stackOverflowApi.getTags(searchTerm.trim());\n const results = response.items || [];\n setTagSearchResults(results);\n setShowCreateTagOption(results.length === 0);\n } catch (err) {\n setTagSearchResults([]);\n setShowCreateTagOption(true);\n } finally {\n setSearchingTags(false);\n }\n }, 500),\n [stackOverflowApi, isAuthenticated]\n );\n \n const modifierKey = getModifierKey();\n \n function validateTitle(value: string) {\n if (titleStarted && value.trim().length < 15) {\n setTitleValidation('Title should be at least 15 characters for clarity.');\n } else {\n setTitleValidation('');\n }\n }\n \n const validateBody = useCallback(function validateBody(value: string) {\n const textContent = value.replace(/<[^>]*>/g, '');\n if (bodyStarted && textContent.trim().length < 30) {\n setBodyValidation('Please provide more detail (minimum 30 characters).');\n } else {\n setBodyValidation('');\n }\n }, [bodyStarted])\n \n const validateTags = useCallback(function validateTags() {\n if (tagsStarted && tags.length === 0) {\n setTagsValidation('At least one tag is required.');\n } else {\n setTagsValidation('');\n }\n }, [tagsStarted, tags])\n \n useEffect(() => {\n const openModal = async () => {\n const authStatus = await stackOverflowApi.getAuthStatus();\n setIsAuthenticated(authStatus);\n setSuccess(false);\n setOpen(true);\n };\n window.addEventListener('openAskQuestionModal', openModal);\n return () => {\n window.removeEventListener('openAskQuestionModal', openModal);\n };\n }, [stackOverflowApi]);\n \n useEffect(() => {\n if (open && isAuthenticated && popularTags.length === 0) {\n fetchPopularTags();\n }\n }, [open, isAuthenticated, fetchPopularTags, popularTags.length]);\n \n useEffect(() => {\n validateTags();\n }, [tags, tagsStarted, validateTags]);\n \n useEffect(() => {\n validateBody(body);\n }, [body, bodyStarted, validateBody]);\n \n const handleSubmit = async () => {\n validateTitle(title);\n validateBody(body);\n validateTags();\n \n if (titleValidation || bodyValidation || tagsValidation) {\n return;\n }\n \n const textContent = body.replace(/<[^>]*>/g, '').trim();\n if (!title || !textContent || tags.length === 0) {\n setError('Title, body, and at least one tag are required.');\n return;\n }\n \n setLoading(true);\n setError(null);\n \n try {\n const response = await stackOverflowApi.postQuestion(title, body, tags);\n setSuccess(true);\n \n setTitle('');\n setBody('');\n setTags([]);\n setTagInput('');\n \n if (response.webUrl) {\n window.open(`${response.webUrl}?r=Backstage_Plugin`, '_blank');\n }\n } catch (err) {\n if (err instanceof Error) {\n setError(err.message);\n } else {\n setError('An unexpected error occurred.');\n }\n } finally {\n setLoading(false);\n }\n };\n \n const handleTagAdd = () => {\n const newTags = tagInput\n .split(/[\\s,]+/)\n .map(tag => tag.trim())\n .filter(tag => tag.length > 0 && !tags.includes(tag));\n \n if (newTags.length > 0 && tags.length + newTags.length <= 5) {\n setTags([...tags, ...newTags]);\n if (!tagsStarted) setTagsStarted(true);\n }\n setTagInput('');\n setTagSearchResults([]);\n };\n \n const handleLoginRedirect = () => {\n setOpen(false);\n window.location.href = '/stack-overflow-teams';\n };\n \n const handleBodyChange = (value: string) => {\n if (!bodyStarted) setBodyStarted(true);\n setBody(value);\n };\n \n const handleBodyFocus = () => {\n setFocusedField('body');\n };\n \n const renderTitleTips = () => (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <TitleIcon color=\"primary\" />\n <Typography variant=\"h6\" fontWeight={600}>\n Writing a Good Title\n </Typography>\n </Box>\n \n <Card elevation={0} sx={{ mb: 2, border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1.5, color: 'success.main' }}>\n ✓ Good Examples\n </Typography>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Paper elevation={0} sx={{ p: 1.5, bgcolor: 'success.50', border: '1px solid', borderColor: 'success.200' }}>\n <Typography variant=\"body2\">\n \"How to handle async errors in React useEffect hook?\"\n </Typography>\n </Paper>\n <Paper elevation={0} sx={{ p: 1.5, bgcolor: 'success.50', border: '1px solid', borderColor: 'success.200' }}>\n <Typography variant=\"body2\">\n \"Why does my Docker container fail to connect to PostgreSQL?\"\n </Typography>\n </Paper>\n </Box>\n \n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mt: 2, mb: 1.5, color: 'error.main' }}>\n ✗ Avoid\n </Typography>\n <Paper elevation={0} sx={{ p: 1.5, bgcolor: 'error.50', border: '1px solid', borderColor: 'error.200' }}>\n <Typography variant=\"body2\">\n \"Help! My code doesn't work!\"\n </Typography>\n </Paper>\n </CardContent>\n </Card>\n \n <Card elevation={0} sx={{ border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1 }}>\n Tips for Success\n </Typography>\n <List dense disablePadding>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Be specific about your problem\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Include relevant technologies\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Avoid vague terms like 'doesn't work'\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderBodyTips = () => (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <DescriptionIcon color=\"primary\" />\n <Typography variant=\"h6\" fontWeight={600}>\n Detailed Explanation\n </Typography>\n </Box>\n \n <Card elevation={0} sx={{ mb: 2, border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <CodeIcon color=\"info\" fontSize=\"small\" />\n <Typography variant=\"subtitle2\" fontWeight={600}>\n Rich Text Formatting\n </Typography>\n </Box>\n <Typography variant=\"body2\" color=\"text.secondary\">\n Use the toolbar for bold, italic, code blocks, and lists. Shortcuts: {modifierKey.text}+B (bold), {modifierKey.text}+I (italic), {modifierKey.text}+U (underline), {modifierKey.text}+E (code).\n </Typography>\n </CardContent>\n </Card>\n \n <Card elevation={0} sx={{ border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1 }}>\n Structure Your Question\n </Typography>\n <List dense disablePadding>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"What you're trying to achieve\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"What you've tried so far\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Expected vs actual results\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Error messages (if any)\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderTagsTips = () => (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <LocalOfferIcon color=\"primary\" />\n <Typography variant=\"h6\" fontWeight={600}>\n Choosing Tags\n </Typography>\n </Box>\n \n {(loadingTags || popularTags.length > 0 || tagError) && (\n <Card elevation={0} sx={{ mb: 2, border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1.5 }}>\n Popular Tags\n </Typography>\n \n {loadingTags && (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', py: 2 }}>\n <CircularProgress size={20} />\n <Typography variant=\"body2\" sx={{ ml: 1 }} color=\"text.secondary\">\n Loading...\n </Typography>\n </Box>\n )}\n \n {!loadingTags && tagError && (\n <Typography variant=\"body2\" color=\"error\">\n {tagError}\n </Typography>\n )}\n \n {!loadingTags && !tagError && popularTags.length > 0 && (\n <>\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.75 }}>\n {popularTags.map(tag => (\n <Chip\n key={tag.name}\n label={tag.name}\n size=\"small\"\n variant=\"outlined\"\n onClick={() => !tags.includes(tag.name) && tags.length < 5 && setTags([...tags, tag.name])}\n disabled={tags.includes(tag.name) || tags.length >= 5}\n sx={{ \n cursor: tags.includes(tag.name) || tags.length >= 5 ? 'default' : 'pointer',\n '&:hover': {\n bgcolor: tags.includes(tag.name) || tags.length >= 5 ? 'transparent' : 'action.hover'\n }\n }}\n />\n ))}\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mt: 1.5, display: 'block' }}>\n Click to add popular tags quickly\n </Typography>\n </>\n )}\n </CardContent>\n </Card>\n )}\n \n <Card elevation={0} sx={{ border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1 }}>\n Tag Guidelines\n </Typography>\n <List dense disablePadding>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Use 1-5 tags that describe your question\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Try to use existing tags\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Add relevant tools and platforms\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderMentionTips = () => (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <GroupIcon color=\"primary\" />\n <Typography variant=\"h6\" fontWeight={600}>\n Asking Team Members\n </Typography>\n </Box>\n \n <Card elevation={0} sx={{ mb: 2, border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 1 }}>\n <PersonIcon color=\"info\" fontSize=\"small\" />\n <Typography variant=\"subtitle2\" fontWeight={600}>\n When to Mention Someone\n </Typography>\n </Box>\n <List dense disablePadding>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"They're an expert in the relevant area\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"They've worked on similar problems\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"They're the owner of the code in question\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n \n <Card elevation={0} sx={{ border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1 }}>\n Mention Guidelines\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1 }}>\n Type usernames or group names. You can mention:\n </Typography>\n <List dense disablePadding>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Individual team members (@john.doe)\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <InfoIcon color=\"info\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Team groups (@frontend-team)\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderDefaultTips = () => (\n <Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1, mb: 2 }}>\n <LightbulbIcon color=\"primary\" />\n <Typography variant=\"h6\" fontWeight={600}>\n Writing a Good Question\n </Typography>\n </Box>\n \n <Card elevation={0} sx={{ border: '1px solid', borderColor: 'divider' }}>\n <CardContent sx={{ '&:last-child': { pb: 2 } }}>\n <Typography variant=\"subtitle2\" fontWeight={600} sx={{ mb: 1.5 }}>\n Quick Tips\n </Typography>\n <List dense disablePadding>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Be specific and clear in your title\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Include relevant code and error messages\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n <ListItem sx={{ py: 0.5, px: 0 }}>\n <ListItemIcon sx={{ minWidth: 32 }}>\n <CheckCircleIcon color=\"success\" fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText \n primary=\"Tag your question appropriately\"\n primaryTypographyProps={{ variant: 'body2' }}\n />\n </ListItem>\n </List>\n </CardContent>\n </Card>\n </Box>\n );\n \n const renderRightPanel = () => {\n switch (focusedField) {\n case 'title':\n return renderTitleTips();\n case 'body':\n return renderBodyTips();\n case 'tags':\n return renderTagsTips();\n case 'mentions':\n return renderMentionTips();\n default:\n return renderDefaultTips();\n }\n };\n \n const renderQuestionForm = () => (\n <Box sx={{ m: 4 }}>\n <Box sx={{ mb: 3 }}>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ mb: 0.5 }}>\n Title\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n Be specific and imagine you're asking a question to another person.\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n value={title}\n onChange={e => {\n if (!titleStarted) setTitleStarted(true);\n setTitle(e.target.value);\n validateTitle(e.target.value);\n }}\n onFocus={() => setFocusedField('title')}\n error={titleStarted && !!titleValidation}\n helperText={titleStarted ? titleValidation : ''}\n placeholder=\"e.g., How to handle authentication in React components?\"\n size=\"small\"\n />\n </Box>\n \n <Box sx={{ mb: 3 }}>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ mb: 0.5 }}>\n What are the details of your problem?\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n Introduce the problem and expand on what you put in the title.\n </Typography>\n <TiptapEditor\n content={body}\n onUpdate={handleBodyChange}\n onFocus={handleBodyFocus}\n placeholder=\"Describe your problem in detail. Include any error messages, code snippets, and what you've tried so far...\"\n error={bodyStarted && !!bodyValidation}\n modifierKey={modifierKey}\n />\n {bodyStarted && bodyValidation && (\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 1, display: 'block' }}>\n {bodyValidation}\n </Typography>\n )}\n </Box>\n \n <Box sx={{ mb: 3, position: 'relative' }}>\n <Typography variant=\"subtitle1\" fontWeight={600} sx={{ mb: 0.5 }}>\n Tags\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 1.5 }}>\n At least one tag is required.\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n value={tagInput}\n onChange={e => {\n const value = e.target.value;\n setTagInput(value);\n setShowCreateTagOption(false);\n \n const lastTag = value.split(/[\\s,]/).pop()?.trim() || '';\n if (lastTag.length >= 2) {\n searchTags(lastTag);\n } else {\n setTagSearchResults([]);\n }\n \n if (value.includes(',') || value.includes(' ')) {\n handleTagAdd();\n }\n }}\n onFocus={() => setFocusedField('tags')}\n onKeyDown={e => e.key === 'Enter' && handleTagAdd()}\n placeholder=\"e.g., react, javascript, authentication\"\n error={!!tagsValidation}\n size=\"small\"\n />\n \n {(tagSearchResults.length > 0 || searchingTags || (tagInput.trim() && tagSearchResults.length === 0 && !searchingTags)) && (\n <Paper \n elevation={3} \n sx={{ \n position: 'absolute', \n zIndex: 1000, \n width: '100%', \n maxHeight: 200, \n overflow: 'auto',\n mt: 0.5\n }}\n >\n {searchingTags && (\n <Box sx={{ p: 2, display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={16} />\n <Typography variant=\"body2\" color=\"text.secondary\">Searching tags...</Typography>\n </Box>\n )}\n {tagSearchResults.map(tag => (\n <ListItem \n key={tag.name}\n onClick={() => {\n if (!tags.includes(tag.name) && tags.length < 5) {\n setTags([...tags, tag.name]);\n if (!tagsStarted) setTagsStarted(true);\n }\n setTagInput('');\n setTagSearchResults([]);\n }}\n sx={{ \n cursor: 'pointer',\n py: 1,\n '&:hover': { backgroundColor: 'action.hover' }\n }}\n >\n <ListItemText \n primary={tag.name}\n secondary={`${tag.postCount} posts`}\n primaryTypographyProps={{ variant: 'body2' }}\n secondaryTypographyProps={{ variant: 'caption' }}\n />\n </ListItem>\n ))}\n {tagInput.trim() && showCreateTagOption && (\n <ListItem\n onClick={() => {\n const trimmedTag = tagInput.trim();\n if (trimmedTag && !tags.includes(trimmedTag) && tags.length < 5) {\n setTags([...tags, trimmedTag]);\n if (!tagsStarted) setTagsStarted(true);\n setShowCreateTagOption(false);\n }\n setTagInput('');\n setTagSearchResults([]);\n }}\n sx={{ \n cursor: 'pointer',\n py: 1,\n '&:hover': { backgroundColor: 'action.hover' },\n borderTop: tagSearchResults.length > 0 ? '1px solid' : 'none',\n borderColor: 'divider'\n }}\n >\n <ListItemText \n primary={\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"body2\">Create \"{tagInput.trim()}\"</Typography>\n <Chip size=\"small\" label=\"New\" color=\"primary\" variant=\"outlined\" />\n </Box>\n }\n secondary=\"This will create a new tag\"\n secondaryTypographyProps={{ variant: 'caption' }}\n />\n </ListItem>\n )}\n </Paper>\n )}\n \n {tags.length > 0 && (\n <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 0.75, mt: 1.5 }}>\n {tags.map((tag, index) => (\n <Chip\n key={index}\n label={tag}\n onDelete={() => setTags(tags.filter(t => t !== tag))}\n size=\"small\"\n variant=\"outlined\"\n color=\"primary\"\n />\n ))}\n </Box>\n )}\n \n {tagsValidation && (\n <Typography variant=\"caption\" color=\"error\" sx={{ mt: 0.5, display: 'block' }}>\n {tagsValidation}\n </Typography>\n )}\n </Box>\n \n {error && (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n )}\n \n <Divider sx={{ my: 3 }} />\n \n <Box sx={{ display: 'flex', gap: 2 }}>\n <Button\n variant=\"contained\"\n className={classes.button}\n size=\"medium\"\n onClick={handleSubmit}\n disabled={loading || !isAuthenticated}\n sx={{ minWidth: 140 }}\n >\n {loading ? 'Posting...' : 'Post Question'}\n </Button>\n <Button \n onClick={() => setOpen(false)} \n variant=\"outlined\" \n size=\"medium\"\n >\n Cancel\n </Button>\n </Box>\n </Box>\n );\n \n const renderContent = () => {\n if (!isAuthenticated) {\n return (\n <Box sx={{ textAlign: 'center', py: 6 }}>\n <Typography variant=\"h6\" color=\"text.primary\" sx={{ mb: 1 }}>\n Authentication Required\n </Typography>\n <Typography color=\"text.secondary\" sx={{ mb: 3 }}>\n Please{' '}\n <Link component=\"button\" onClick={handleLoginRedirect} sx={{ cursor: 'pointer' }}>\n log in\n </Link>{' '}\n to post questions.\n </Typography>\n </Box>\n );\n }\n \n if (success) {\n return (\n <Box sx={{ py: 4 }}>\n <Alert severity=\"success\">\n <AlertTitle>Question Posted Successfully!</AlertTitle>\n Your question has been posted and will open in a new tab.\n </Alert>\n </Box>\n );\n }\n \n return (\n <Grid container spacing={3}>\n <Grid item xs={12} md={8}>\n <Box sx={{ pr: { md: 2 } }}>\n {renderQuestionForm()}\n </Box>\n </Grid>\n <Grid item xs={12} md={4}>\n <Box \n sx={{ \n position: { md: 'sticky' },\n top: { md: 24 },\n pl: { md: 2 },\n borderLeft: { md: '1px solid' },\n borderColor: { md: 'divider' }\n }}\n >\n {renderRightPanel()}\n </Box>\n </Grid>\n </Grid>\n );\n };\n \n return (\n <Modal open={open} onClose={() => setOpen(false)}>\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: success \n ? { xs: '90vw', sm: '500px' }\n : { xs: '95vw', sm: '90vw', md: '85vw', lg: '80vw', xl: '75vw' },\n maxWidth: success ? '500px' : '1400px',\n maxHeight: '90vh',\n bgcolor: 'background.paper',\n boxShadow: 24,\n borderRadius: 2,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column'\n }}\n >\n <Box \n sx={{ \n p: 2.5, \n borderBottom: '1px solid', \n borderColor: 'divider',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n }}\n >\n <Typography variant=\"h6\" fontWeight={600}>\n Ask a Question\n </Typography>\n <IconButton \n onClick={() => setOpen(false)} \n size=\"small\"\n sx={{ ml: 2 }}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n \n <Box sx={{ p: 3, overflow: 'auto', flexGrow: 1 }}>\n {renderContent()}\n </Box>\n </Box>\n </Modal>\n );\n};"],"names":["fetchPopularTags","validateBody","validateTags"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAM,QAAQ,MAAM;AAClB,EAAA,OAAO,OAAO,cAAc,WAAA,IAAe,SAAA,CAAU,SAAS,WAAA,EAAY,CAAE,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AAChG,CAAA;AAGA,MAAM,iBAAiB,MAAM;AAC3B,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,UAAU,QAAA,GAAM,MAAA;AAAA,IACxB,IAAA,EAAM,UAAU,KAAA,GAAQ;AAAA,GAC1B;AACF,CAAA;AAEO,MAAM,iCAAiC,MAAM;AAClD,EAAA,MAAM,gBAAA,GAAmB,OAAO,wBAAwB,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,EAAE,CAAA;AACvD,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAgB,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAE5D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA,CAAgB,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpE,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,eAAeA,iBAAAA,GAAmB;AACrE,IAAA,IAAI,CAAC,eAAA,EAAiB;AACtB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,OAAA,EAAQ;AAChD,MAAA,MAAM,UAAU,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA,EAAG,EAAE,KAAK,EAAC;AACjD,MAAA,cAAA,CAAe,OAAO,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,WAAA,CAAY,sBAAsB,CAAA;AAClC,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,eAAe,CAAC,CAAA;AAEtC,EAAA,MAAM,UAAA,GAAa,OAAA;AAAA,IACjB,MAAM,QAAA,CAAS,OAAO,UAAA,KAAuB;AAC3C,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,IAAK,CAAC,eAAA,EAAiB;AAC1C,QAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,QAAA,sBAAA,CAAuB,KAAK,CAAA;AAC5B,QAAA;AAAA,MACF;AACA,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,gBAAA,CAAiB,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AACjE,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,IAAS,EAAC;AACnC,QAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,QAAA,sBAAA,CAAuB,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,MAC7C,SAAS,GAAA,EAAK;AACZ,QAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,QAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,MAC7B,CAAA,SAAE;AACA,QAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,MACxB;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,IACN,CAAC,kBAAkB,eAAe;AAAA,GACpC;AAEA,EAAA,MAAM,cAAc,cAAA,EAAe;AAEnC,EAAA,SAAS,cAAc,KAAA,EAAe;AACpC,IAAA,IAAI,YAAA,IAAgB,KAAA,CAAM,IAAA,EAAK,CAAE,SAAS,EAAA,EAAI;AAC5C,MAAA,kBAAA,CAAmB,qDAAqD,CAAA;AAAA,IAC1E,CAAA,MAAO;AACL,MAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,SAASC,aAAAA,CAAa,KAAA,EAAe;AACpE,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAChD,IAAA,IAAI,WAAA,IAAe,WAAA,CAAY,IAAA,EAAK,CAAE,SAAS,EAAA,EAAI;AACjD,MAAA,iBAAA,CAAkB,qDAAqD,CAAA;AAAA,IACzE,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,EAAE,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,SAASC,aAAAA,GAAe;AACvD,IAAA,IAAI,WAAA,IAAe,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,iBAAA,CAAkB,+BAA+B,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,EAAE,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,IAAI,CAAC,CAAA;AAEtB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAY;AAC5B,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,aAAA,EAAc;AACxD,MAAA,kBAAA,CAAmB,UAAU,CAAA;AAC7B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,wBAAwB,SAAS,CAAA;AACzD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,wBAAwB,SAAS,CAAA;AAAA,IAC9D,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,IAAQ,eAAA,IAAmB,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACvD,MAAA,gBAAA,EAAiB;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,iBAAiB,gBAAA,EAAkB,WAAA,CAAY,MAAM,CAAC,CAAA;AAEhE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,IAAA,EAAM,WAAA,EAAa,YAAY,CAAC,CAAA;AAEpC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,IAAA,EAAM,WAAA,EAAa,YAAY,CAAC,CAAA;AAEpC,EAAA,MAAM,eAAe,YAAY;AAC/B,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,EAAa;AAEb,IAAA,IAAI,eAAA,IAAmB,kBAAkB,cAAA,EAAgB;AACvD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,EAAE,EAAE,IAAA,EAAK;AACtD,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,WAAA,IAAe,IAAA,CAAK,WAAW,CAAA,EAAG;AAC/C,MAAA,QAAA,CAAS,iDAAiD,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,gBAAA,CAAiB,YAAA,CAAa,KAAA,EAAO,MAAM,IAAI,CAAA;AACtE,MAAA,UAAA,CAAW,IAAI,CAAA;AAEf,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,WAAA,CAAY,EAAE,CAAA;AAEd,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,QAAA,CAAS,MAAM,uBAAuB,QAAQ,CAAA;AAAA,MAC/D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,eAAe,KAAA,EAAO;AACxB,QAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,+BAA+B,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,MAAM,OAAA,GAAU,SACb,KAAA,CAAM,QAAQ,EACd,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,IAAA,EAAM,EACrB,MAAA,CAAO,CAAA,GAAA,KAAO,IAAI,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AAEtD,IAAA,IAAI,QAAQ,MAAA,GAAS,CAAA,IAAK,KAAK,MAAA,GAAS,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC3D,MAAA,OAAA,CAAQ,CAAC,GAAG,IAAA,EAAM,GAAG,OAAO,CAAC,CAAA;AAC7B,MAAA,IAAI,CAAC,WAAA,EAAa,cAAA,CAAe,IAAI,CAAA;AAAA,IACvC;AACA,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,sBAAsB,MAAM;AAChC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,MAAA,CAAO,SAAS,IAAA,GAAO,uBAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAkB;AAC1C,IAAA,IAAI,CAAC,WAAA,EAAa,cAAA,CAAe,IAAI,CAAA;AACrC,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,eAAA,CAAgB,MAAM,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,sBACtB,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,OAAM,SAAA,EAAU,CAAA;AAAA,0BAC1B,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,KAAK,QAAA,EAAA,sBAAA,EAE1C;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,WAAU,EAC3E,QAAA,kBAAA,IAAA,CAAC,eAAY,EAAA,EAAI,EAAE,gBAAgB,EAAE,EAAA,EAAI,CAAA,EAAE,EAAE,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,cAAA,EAAe,EAAG,QAAA,EAAA,sBAAA,EAEzF,CAAA;AAAA,sBACA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC1D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAM,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,CAAA,EAAG,KAAK,OAAA,EAAS,YAAA,EAAc,QAAQ,WAAA,EAAa,WAAA,EAAa,eAAc,EACxG,QAAA,kBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,mEAE5B,CAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,SAAM,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,CAAA,EAAG,KAAK,OAAA,EAAS,YAAA,EAAc,QAAQ,WAAA,EAAa,WAAA,EAAa,eAAc,EACxG,QAAA,kBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,2EAE5B,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBAEA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,YAAY,GAAA,EAAK,EAAA,EAAI,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,YAAA,IAAgB,QAAA,EAAA,cAAA,EAE9F,CAAA;AAAA,sBACA,GAAA,CAAC,SAAM,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,CAAA,EAAG,KAAK,OAAA,EAAS,UAAA,EAAY,QAAQ,WAAA,EAAa,WAAA,EAAa,aAAY,EACpG,QAAA,kBAAA,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,2CAE5B,CAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,MAAA,EAAQ,aAAa,WAAA,EAAa,SAAA,IAC1D,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAI,EAAE,cAAA,EAAgB,EAAE,EAAA,EAAI,CAAA,IAAI,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,kBAAA,EAEhE,CAAA;AAAA,sBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EAAC,gBAAc,IAAA,EACxB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,gCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,+BAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,uCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,cAAA,GAAiB,sBACrB,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,OAAM,SAAA,EAAU,CAAA;AAAA,0BAChC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,KAAK,QAAA,EAAA,sBAAA,EAE1C;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,WAAU,EAC3E,QAAA,kBAAA,IAAA,CAAC,eAAY,EAAA,EAAI,EAAE,gBAAgB,EAAE,EAAA,EAAI,CAAA,EAAE,EAAE,EAC3C,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA;AAAA,4BACvC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,KAAK,QAAA,EAAA,sBAAA,EAEjD;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,gBAAA,EAAiB,QAAA,EAAA;AAAA,QAAA,uEAAA;AAAA,QACqB,WAAA,CAAY,IAAA;AAAA,QAAK,aAAA;AAAA,QAAY,WAAA,CAAY,IAAA;AAAA,QAAK,eAAA;AAAA,QAAc,WAAA,CAAY,IAAA;AAAA,QAAK,kBAAA;AAAA,QAAiB,WAAA,CAAY,IAAA;AAAA,QAAK;AAAA,OAAA,EACvL;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,MAAA,EAAQ,aAAa,WAAA,EAAa,SAAA,IAC1D,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAI,EAAE,cAAA,EAAgB,EAAE,EAAA,EAAI,CAAA,IAAI,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,yBAAA,EAEhE,CAAA;AAAA,sBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EAAC,gBAAc,IAAA,EACxB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,+BAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,0BAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,4BAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,yBAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,cAAA,GAAiB,sBACrB,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAM,SAAA,EAAU,CAAA;AAAA,0BAC/B,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,KAAK,QAAA,EAAA,eAAA,EAE1C;AAAA,KAAA,EACF,CAAA;AAAA,IAAA,CAEE,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,QAAA,qBACzC,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,CAAA,EAAG,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,SAAA,EAAU,EAC3E,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,EAAA,EAAI,EAAE,cAAA,EAAgB,EAAE,EAAA,EAAI,CAAA,EAAE,EAAE,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,cAAA,EAElE,CAAA;AAAA,MAEC,WAAA,oBACC,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,EAAA,EAAI,GAAE,EAChF,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAM,EAAA,EAAI,CAAA;AAAA,wBAC5B,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,KAAA,EAAM,gBAAA,EAAiB,QAAA,EAAA,YAAA,EAElE;AAAA,OAAA,EACF,CAAA;AAAA,MAGD,CAAC,eAAe,QAAA,oBACf,GAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,OAAA,EAC/B,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,MAGD,CAAC,WAAA,IAAe,CAAC,YAAY,WAAA,CAAY,MAAA,GAAS,qBACjD,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAK,EACrD,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAA,GAAA,qBACf,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,OAAO,GAAA,CAAI,IAAA;AAAA,YACX,IAAA,EAAK,OAAA;AAAA,YACL,OAAA,EAAQ,UAAA;AAAA,YACR,SAAS,MAAM,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,KAAK,OAAA,CAAQ,CAAC,GAAG,IAAA,EAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,YACzF,UAAU,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,CAAA,IAAK,KAAK,MAAA,IAAU,CAAA;AAAA,YACpD,EAAA,EAAI;AAAA,cACF,MAAA,EAAQ,KAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,IAAU,CAAA,GAAI,SAAA,GAAY,SAAA;AAAA,cAClE,SAAA,EAAW;AAAA,gBACT,OAAA,EAAS,KAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,IAAU,CAAA,GAAI,aAAA,GAAgB;AAAA;AACzE;AACF,WAAA;AAAA,UAXK,GAAA,CAAI;AAAA,SAaZ,CAAA,EACH,CAAA;AAAA,wBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,OAAA,IAAW,QAAA,EAAA,mCAAA,EAExF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,oBAGF,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,MAAA,EAAQ,aAAa,WAAA,EAAa,SAAA,IAC1D,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAI,EAAE,cAAA,EAAgB,EAAE,EAAA,EAAI,CAAA,IAAI,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,gBAAA,EAEhE,CAAA;AAAA,sBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EAAC,gBAAc,IAAA,EACxB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,0CAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,0BAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,kCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,iBAAA,GAAoB,sBACxB,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,OAAM,SAAA,EAAU,CAAA;AAAA,0BAC1B,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,KAAK,QAAA,EAAA,qBAAA,EAE1C;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAa,WAAU,EAC3E,QAAA,kBAAA,IAAA,CAAC,eAAY,EAAA,EAAI,EAAE,gBAAgB,EAAE,EAAA,EAAI,CAAA,EAAE,EAAE,EAC3C,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA;AAAA,4BACzC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,KAAK,QAAA,EAAA,yBAAA,EAEjD;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EAAC,gBAAc,IAAA,EACxB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,wCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,oCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,2CAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,MAAA,EAAQ,aAAa,WAAA,EAAa,SAAA,IAC1D,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAI,EAAE,cAAA,EAAgB,EAAE,EAAA,EAAI,CAAA,IAAI,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,oBAAA,EAEhE,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,iDAAA,EAElE,CAAA;AAAA,sBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EAAC,gBAAc,IAAA,EACxB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,qCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAA,EAAS,OAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,8BAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,iBAAA,GAAoB,sBACxB,IAAA,CAAC,GAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAC9D,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,OAAM,SAAA,EAAU,CAAA;AAAA,0BAC9B,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,KAAK,QAAA,EAAA,yBAAA,EAE1C;AAAA,KAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAK,SAAA,EAAW,CAAA,EAAG,IAAI,EAAE,MAAA,EAAQ,aAAa,WAAA,EAAa,SAAA,IAC1D,QAAA,kBAAA,IAAA,CAAC,WAAA,EAAA,EAAY,IAAI,EAAE,cAAA,EAAgB,EAAE,EAAA,EAAI,CAAA,IAAI,EAC3C,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,YAAA,EAElE,CAAA;AAAA,sBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EAAC,gBAAc,IAAA,EACxB,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,qCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,0CAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF,CAAA;AAAA,wBACA,IAAA,CAAC,YAAS,EAAA,EAAI,EAAE,IAAI,GAAA,EAAK,EAAA,EAAI,GAAE,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC/B,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,SAAA,EAAU,QAAA,EAAS,OAAA,EAAQ,CAAA,EACpD,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,iCAAA;AAAA,cACR,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA;AAC7C,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,QAAQ,YAAA;AAAc,MACpB,KAAK,OAAA;AACH,QAAA,OAAO,eAAA,EAAgB;AAAA,MACzB,KAAK,MAAA;AACH,QAAA,OAAO,cAAA,EAAe;AAAA,MACxB,KAAK,MAAA;AACH,QAAA,OAAO,cAAA,EAAe;AAAA,MACxB,KAAK,UAAA;AACH,QAAA,OAAO,iBAAA,EAAkB;AAAA,MAC3B;AACE,QAAA,OAAO,iBAAA,EAAkB;AAAA;AAC7B,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,sBACzB,IAAA,CAAC,GAAA,EAAA,EAAI,IAAI,EAAE,CAAA,EAAG,GAAE,EACd,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,OAAA,EAElE,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,qEAAA,EAEpE,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAA,CAAA,KAAK;AACb,YAAA,IAAI,CAAC,YAAA,EAAc,eAAA,CAAgB,IAAI,CAAA;AACvC,YAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AACvB,YAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC9B,CAAA;AAAA,UACA,OAAA,EAAS,MAAM,eAAA,CAAgB,OAAO,CAAA;AAAA,UACtC,KAAA,EAAO,YAAA,IAAgB,CAAC,CAAC,eAAA;AAAA,UACzB,UAAA,EAAY,eAAe,eAAA,GAAkB,EAAA;AAAA,UAC7C,WAAA,EAAY,yDAAA;AAAA,UACZ,IAAA,EAAK;AAAA;AAAA;AACP,KAAA,EACF,CAAA;AAAA,yBAEC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,uCAAA,EAElE,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,gEAAA,EAEpE,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,gBAAA;AAAA,UACV,OAAA,EAAS,eAAA;AAAA,UACT,WAAA,EAAY,6GAAA;AAAA,UACZ,KAAA,EAAO,WAAA,IAAe,CAAC,CAAC,cAAA;AAAA,UACxB;AAAA;AAAA,OACF;AAAA,MACC,WAAA,IAAe,cAAA,oBACd,GAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,SAAA,EAAU,KAAA,EAAM,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,OAAA,EAAS,OAAA,IAC/D,QAAA,EAAA,cAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAEA,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,IAAI,CAAA,EAAG,QAAA,EAAU,YAAW,EACrC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,GAAA,EAAK,IAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,MAAA,EAElE,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,gBAAA,EAAiB,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,QAAA,EAAA,+BAAA,EAEpE,CAAA;AAAA,sBACA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAA,CAAA,KAAK;AACb,YAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,YAAA,WAAA,CAAY,KAAK,CAAA;AACjB,YAAA,sBAAA,CAAuB,KAAK,CAAA;AAE5B,YAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAO,EAAE,GAAA,EAAI,EAAG,MAAK,IAAK,EAAA;AACtD,YAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,cAAA,UAAA,CAAW,OAAO,CAAA;AAAA,YACpB,CAAA,MAAO;AACL,cAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,YACxB;AAEA,YAAA,IAAI,MAAM,QAAA,CAAS,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,cAAA,YAAA,EAAa;AAAA,YACf;AAAA,UACF,CAAA;AAAA,UACA,OAAA,EAAS,MAAM,eAAA,CAAgB,MAAM,CAAA;AAAA,UACrC,SAAA,EAAW,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,KAAQ,WAAW,YAAA,EAAa;AAAA,UAClD,WAAA,EAAY,yCAAA;AAAA,UACZ,KAAA,EAAO,CAAC,CAAC,cAAA;AAAA,UACT,IAAA,EAAK;AAAA;AAAA,OACP;AAAA,MAAA,CAEE,gBAAA,CAAiB,MAAA,GAAS,CAAA,IAAK,aAAA,IAAkB,QAAA,CAAS,IAAA,EAAK,IAAK,gBAAA,CAAiB,MAAA,KAAW,CAAA,IAAK,CAAC,aAAA,qBACtG,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,CAAA;AAAA,UACX,EAAA,EAAI;AAAA,YACF,QAAA,EAAU,UAAA;AAAA,YACV,MAAA,EAAQ,GAAA;AAAA,YACR,KAAA,EAAO,MAAA;AAAA,YACP,SAAA,EAAW,GAAA;AAAA,YACX,QAAA,EAAU,MAAA;AAAA,YACV,EAAA,EAAI;AAAA,WACN;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,aAAA,oBACC,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EAC7D,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,MAAM,EAAA,EAAI,CAAA;AAAA,kCAC3B,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,mBAAA,EAAiB;AAAA,aAAA,EACtE,CAAA;AAAA,YAED,gBAAA,CAAiB,IAAI,CAAA,GAAA,qBACpB,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,SAAS,MAAM;AACb,kBAAA,IAAI,CAAC,KAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/C,oBAAA,OAAA,CAAQ,CAAC,GAAG,IAAA,EAAM,GAAA,CAAI,IAAI,CAAC,CAAA;AAC3B,oBAAA,IAAI,CAAC,WAAA,EAAa,cAAA,CAAe,IAAI,CAAA;AAAA,kBACvC;AACA,kBAAA,WAAA,CAAY,EAAE,CAAA;AACd,kBAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,gBACxB,CAAA;AAAA,gBACA,EAAA,EAAI;AAAA,kBACF,MAAA,EAAQ,SAAA;AAAA,kBACR,EAAA,EAAI,CAAA;AAAA,kBACJ,SAAA,EAAW,EAAE,eAAA,EAAiB,cAAA;AAAe,iBAC/C;AAAA,gBAEA,QAAA,kBAAA,GAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,SAAS,GAAA,CAAI,IAAA;AAAA,oBACb,SAAA,EAAW,CAAA,EAAG,GAAA,CAAI,SAAS,CAAA,MAAA,CAAA;AAAA,oBAC3B,sBAAA,EAAwB,EAAE,OAAA,EAAS,OAAA,EAAQ;AAAA,oBAC3C,wBAAA,EAA0B,EAAE,OAAA,EAAS,SAAA;AAAU;AAAA;AACjD,eAAA;AAAA,cApBK,GAAA,CAAI;AAAA,aAsBZ,CAAA;AAAA,YACA,QAAA,CAAS,IAAA,EAAK,IAAK,mBAAA,oBAClB,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM;AACb,kBAAA,MAAM,UAAA,GAAa,SAAS,IAAA,EAAK;AACjC,kBAAA,IAAI,UAAA,IAAc,CAAC,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAC/D,oBAAA,OAAA,CAAQ,CAAC,GAAG,IAAA,EAAM,UAAU,CAAC,CAAA;AAC7B,oBAAA,IAAI,CAAC,WAAA,EAAa,cAAA,CAAe,IAAI,CAAA;AACrC,oBAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,kBAC9B;AACA,kBAAA,WAAA,CAAY,EAAE,CAAA;AACd,kBAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,gBACxB,CAAA;AAAA,gBACA,EAAA,EAAI;AAAA,kBACF,MAAA,EAAQ,SAAA;AAAA,kBACR,EAAA,EAAI,CAAA;AAAA,kBACJ,SAAA,EAAW,EAAE,eAAA,EAAiB,cAAA,EAAe;AAAA,kBAC7C,SAAA,EAAW,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAA;AAAA,kBACvD,WAAA,EAAa;AAAA,iBACf;AAAA,gBAEA,QAAA,kBAAA,GAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,kBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,CAAA,EAAE,EACvD,QAAA,EAAA;AAAA,sCAAA,IAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,QAAA,EAAA;AAAA,wBAAA,UAAA;AAAA,wBAAS,SAAS,IAAA,EAAK;AAAA,wBAAE;AAAA,uBAAA,EAAC,CAAA;AAAA,sCACtD,GAAA,CAAC,QAAK,IAAA,EAAK,OAAA,EAAQ,OAAM,KAAA,EAAM,KAAA,EAAM,SAAA,EAAU,OAAA,EAAQ,UAAA,EAAW;AAAA,qBAAA,EACpE,CAAA;AAAA,oBAEF,SAAA,EAAU,4BAAA;AAAA,oBACV,wBAAA,EAA0B,EAAE,OAAA,EAAS,SAAA;AAAU;AAAA;AACjD;AAAA;AACF;AAAA;AAAA,OAEJ;AAAA,MAGD,IAAA,CAAK,SAAS,CAAA,oBACb,GAAA,CAAC,OAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,QAAA,EAAU,QAAQ,GAAA,EAAK,IAAA,EAAM,IAAI,GAAA,EAAI,EAC9D,eAAK,GAAA,CAAI,CAAC,KAAK,KAAA,qBACd,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,GAAA;AAAA,UACP,QAAA,EAAU,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CAAA,KAAK,CAAA,KAAM,GAAG,CAAC,CAAA;AAAA,UACnD,IAAA,EAAK,OAAA;AAAA,UACL,OAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAM;AAAA,SAAA;AAAA,QALD;AAAA,OAOR,CAAA,EACH,CAAA;AAAA,MAGD,cAAA,oBACC,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,WAAU,KAAA,EAAM,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,OAAA,IACjE,QAAA,EAAA,cAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,KAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EACjC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,wBAGD,OAAA,EAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,GAAE,EAAG,CAAA;AAAA,oBAExB,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACjC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,WAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,YAAA;AAAA,UACT,QAAA,EAAU,WAAW,CAAC,eAAA;AAAA,UACtB,EAAA,EAAI,EAAE,QAAA,EAAU,GAAA,EAAI;AAAA,UAEnB,oBAAU,YAAA,GAAe;AAAA;AAAA,OAC5B;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,UAC5B,OAAA,EAAQ,UAAA;AAAA,UACR,IAAA,EAAK,QAAA;AAAA,UACN,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,uBACE,IAAA,CAAC,OAAI,EAAA,EAAI,EAAE,WAAW,QAAA,EAAU,EAAA,EAAI,GAAE,EACpC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,KAAA,EAAM,cAAA,EAAe,IAAI,EAAE,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,yBAAA,EAE7D,CAAA;AAAA,wBACA,IAAA,CAAC,cAAW,KAAA,EAAM,gBAAA,EAAiB,IAAI,EAAE,EAAA,EAAI,GAAE,EAAG,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UACzC,GAAA;AAAA,0BACP,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,OAAA,EAAS,mBAAA,EAAqB,EAAA,EAAI,EAAE,MAAA,EAAQ,SAAA,EAAU,EAAG,QAAA,EAAA,QAAA,EAElF,CAAA;AAAA,UAAQ,GAAA;AAAA,UAAI;AAAA,SAAA,EAEd;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,EAAA,EAAI,GAAE,EACf,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,SAAA,EACd,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAW,QAAA,EAAA,+BAAA,EAA6B,CAAA;AAAA,QAAa;AAAA,OAAA,EAExD,CAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAS,IAAA,EAAC,SAAS,CAAA,EACvB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,QAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EAAI,EAAA,EAAI,GACrB,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,IAAI,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAI,EACtB,QAAA,EAAA,kBAAA,IACH,CAAA,EACF,CAAA;AAAA,0BACC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EACrB,QAAA,kBAAA,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAI;AAAA,YACF,QAAA,EAAU,EAAE,EAAA,EAAI,QAAA,EAAS;AAAA,YACzB,GAAA,EAAK,EAAE,EAAA,EAAI,EAAA,EAAG;AAAA,YACd,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE;AAAA,YACZ,UAAA,EAAY,EAAE,EAAA,EAAI,WAAA,EAAY;AAAA,YAC9B,WAAA,EAAa,EAAE,EAAA,EAAI,SAAA;AAAU,WAC/B;AAAA,UAEC,QAAA,EAAA,gBAAA;AAAiB;AAAA,OACpB,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,2BACG,KAAA,EAAA,EAAM,IAAA,EAAY,SAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAC7C,QAAA,kBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,SAAA,EAAW,uBAAA;AAAA,QACX,OAAO,OAAA,GACH,EAAE,IAAI,MAAA,EAAQ,EAAA,EAAI,SAAQ,GAC1B,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAI,MAAA,EAAQ,EAAA,EAAI,QAAQ,EAAA,EAAI,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,QACjE,QAAA,EAAU,UAAU,OAAA,GAAU,QAAA;AAAA,QAC9B,SAAA,EAAW,MAAA;AAAA,QACX,OAAA,EAAS,kBAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,QACX,YAAA,EAAc,CAAA;AAAA,QACd,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe;AAAA,OACjB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,CAAA,EAAG,GAAA;AAAA,cACH,YAAA,EAAc,WAAA;AAAA,cACd,WAAA,EAAa,SAAA;AAAA,cACb,OAAA,EAAS,MAAA;AAAA,cACT,cAAA,EAAgB,eAAA;AAAA,cAChB,UAAA,EAAY;AAAA,aACd;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,UAAA,EAAY,KAAK,QAAA,EAAA,gBAAA,EAE1C,CAAA;AAAA,8BACA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,kBAC5B,IAAA,EAAK,OAAA;AAAA,kBACL,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAE;AAAA,kBAEZ,8BAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AACb;AAAA;AAAA,SACF;AAAA,wBAEA,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAE,EAC5C,QAAA,EAAA,aAAA,EAAc,EACjB;AAAA;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,444 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useRef, useEffect, useMemo, useCallback } from 'react';
3
+ import { makeStyles, Box, TextField, InputAdornment, Paper, ButtonGroup, Button, Typography, Grid } from '@material-ui/core';
4
+ import Skeleton from '@mui/material/Skeleton';
5
+ import { ResponseErrorPanel } from '@backstage/core-components';
6
+ import { useStackOverflowData } from './hooks/useStackOverflowData.esm.js';
7
+ import { useStackOverflowSearch } from './hooks/useStackOverflowSearch.esm.js';
8
+ import './hooks/useStackOverflowStyles.esm.js';
9
+ import { StackOverflowSearchResultListItem } from './StackOverflowSearchResultListItem.esm.js';
10
+ import SearchIcon from '@material-ui/icons/Search';
11
+ import { StackOverflowIcon } from '../../icons/StackOverflowIcon.esm.js';
12
+
13
+ const useStyles = makeStyles((theme) => ({
14
+ filters: {
15
+ padding: theme.spacing(2),
16
+ marginTop: theme.spacing(2)
17
+ },
18
+ buttonGroup: {
19
+ flexWrap: "wrap"
20
+ },
21
+ resultCount: {
22
+ marginTop: theme.spacing(1),
23
+ fontSize: "0.875rem",
24
+ color: theme.palette.text.secondary
25
+ },
26
+ searchField: {
27
+ borderRadius: 40,
28
+ paddingLeft: 16,
29
+ paddingRight: 16
30
+ },
31
+ pagination: {
32
+ display: "flex",
33
+ justifyContent: "center",
34
+ alignItems: "center",
35
+ marginTop: theme.spacing(2),
36
+ marginBottom: theme.spacing(2)
37
+ },
38
+ loadingContainer: {
39
+ minHeight: "600px"
40
+ // Fixed height for consistency
41
+ },
42
+ loadingSkeletonItem: {
43
+ padding: theme.spacing(2),
44
+ marginBottom: theme.spacing(2),
45
+ borderRadius: theme.shape.borderRadius
46
+ },
47
+ skeletonContent: {
48
+ display: "flex",
49
+ flexDirection: "column",
50
+ gap: theme.spacing(1)
51
+ },
52
+ skeletonHeader: {
53
+ display: "flex",
54
+ alignItems: "center",
55
+ gap: theme.spacing(1),
56
+ marginBottom: theme.spacing(1)
57
+ },
58
+ skeletonTags: {
59
+ display: "flex",
60
+ gap: theme.spacing(1),
61
+ marginTop: theme.spacing(1)
62
+ }
63
+ }));
64
+ const FILTERS = [
65
+ { id: "unanswered", label: "Unanswered" },
66
+ { id: "newest", label: "Newest" },
67
+ { id: "active", label: "Active" },
68
+ { id: "score", label: "Score" }
69
+ ];
70
+ const CLIENT_ITEMS_PER_PAGE = 5;
71
+ const SERVER_ITEMS_PER_PAGE = 30;
72
+ const SEARCH_ITEMS_PER_PAGE = 30;
73
+ const useDebounce = (value, delay) => {
74
+ const [debouncedValue, setDebouncedValue] = useState(value);
75
+ useEffect(() => {
76
+ const handler = setTimeout(() => {
77
+ setDebouncedValue(value);
78
+ }, delay);
79
+ return () => {
80
+ clearTimeout(handler);
81
+ };
82
+ }, [value, delay]);
83
+ return debouncedValue;
84
+ };
85
+ const LoadingSkeleton = () => {
86
+ const classes = useStyles();
87
+ const skeletonKeys = useMemo(
88
+ () => Array.from(
89
+ { length: CLIENT_ITEMS_PER_PAGE },
90
+ (_, index) => `skeleton-${index}-${Math.random().toString(36).substr(2, 9)}`
91
+ ),
92
+ []
93
+ );
94
+ return /* @__PURE__ */ jsx("div", { className: classes.loadingContainer, children: skeletonKeys.map((key) => /* @__PURE__ */ jsx(Paper, { className: classes.loadingSkeletonItem, elevation: 1, children: /* @__PURE__ */ jsxs("div", { className: classes.skeletonContent, children: [
95
+ /* @__PURE__ */ jsxs("div", { className: classes.skeletonHeader, children: [
96
+ /* @__PURE__ */ jsx(Skeleton, { variant: "circular", width: 32, height: 32 }),
97
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
98
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: "60%", height: 20 }),
99
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: "40%", height: 16 })
100
+ ] }),
101
+ /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", width: 60, height: 24 })
102
+ ] }),
103
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: "90%", height: 24 }),
104
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: "75%", height: 20 }),
105
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: "60%", height: 20 }),
106
+ /* @__PURE__ */ jsxs("div", { className: classes.skeletonTags, children: [
107
+ /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", width: 60, height: 20 }),
108
+ /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", width: 80, height: 20 }),
109
+ /* @__PURE__ */ jsx(Skeleton, { variant: "rectangular", width: 45, height: 20 })
110
+ ] }),
111
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center", marginTop: 8 }, children: [
112
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: 120, height: 16 }),
113
+ /* @__PURE__ */ jsx(Skeleton, { variant: "text", width: 80, height: 16 })
114
+ ] })
115
+ ] }) }, key)) });
116
+ };
117
+ const calculateServerPage = (clientPage, serverPageSize = SERVER_ITEMS_PER_PAGE) => {
118
+ return Math.ceil(clientPage * CLIENT_ITEMS_PER_PAGE / serverPageSize);
119
+ };
120
+ const calculateItemsRange = (clientPage, serverPage, serverPageSize = SERVER_ITEMS_PER_PAGE) => {
121
+ const globalStartIndex = (clientPage - 1) * CLIENT_ITEMS_PER_PAGE;
122
+ const serverStartIndex = (serverPage - 1) * serverPageSize;
123
+ const localStartIndex = globalStartIndex - serverStartIndex;
124
+ const localEndIndex = localStartIndex + CLIENT_ITEMS_PER_PAGE;
125
+ return { localStartIndex, localEndIndex };
126
+ };
127
+ const useEnhancedSearch = () => {
128
+ const searchHook = useStackOverflowSearch();
129
+ const [searchCache, setSearchCache] = useState({});
130
+ const lastSearchRef = useRef(null);
131
+ const getActualSearchPageSize = useCallback(() => {
132
+ return searchHook.searchData?.pageSize || SEARCH_ITEMS_PER_PAGE;
133
+ }, [searchHook.searchData?.pageSize]);
134
+ const enhancedSearch = useCallback((term, clientPage) => {
135
+ const actualPageSize = getActualSearchPageSize();
136
+ const serverPage = calculateServerPage(clientPage, actualPageSize);
137
+ const cacheKey = `${term}-${serverPage}`;
138
+ const currentSearch = { term, page: serverPage };
139
+ if (lastSearchRef.current && lastSearchRef.current.term === currentSearch.term && lastSearchRef.current.page === currentSearch.page) {
140
+ return;
141
+ }
142
+ if (searchCache[cacheKey]) {
143
+ return;
144
+ }
145
+ lastSearchRef.current = currentSearch;
146
+ searchHook.search(term, serverPage);
147
+ }, [getActualSearchPageSize, searchCache, searchHook]);
148
+ useEffect(() => {
149
+ if (searchHook.searchData && lastSearchRef.current) {
150
+ const serverPage = searchHook.searchData.page;
151
+ const searchTerm = lastSearchRef.current.term;
152
+ const cacheKey = `${searchTerm}-${serverPage}`;
153
+ setSearchCache((prev) => ({
154
+ ...prev,
155
+ [cacheKey]: {
156
+ items: searchHook?.searchData?.items,
157
+ totalCount: searchHook?.searchData?.totalCount,
158
+ pageSize: searchHook?.searchData?.pageSize,
159
+ timestamp: Date.now()
160
+ }
161
+ }));
162
+ }
163
+ }, [searchHook.searchData]);
164
+ const getSearchDisplayData = useCallback((term, clientPage) => {
165
+ const actualPageSize = getActualSearchPageSize();
166
+ const serverPage = calculateServerPage(clientPage, actualPageSize);
167
+ const cacheKey = `${term}-${serverPage}`;
168
+ const cachedData = searchCache[cacheKey];
169
+ if (!cachedData) {
170
+ return {
171
+ currentPageData: [],
172
+ totalCount: 0,
173
+ loading: searchHook.loading,
174
+ error: searchHook.error
175
+ };
176
+ }
177
+ const { localStartIndex, localEndIndex } = calculateItemsRange(
178
+ clientPage,
179
+ serverPage,
180
+ cachedData.pageSize
181
+ );
182
+ const currentPageData = cachedData.items.slice(localStartIndex, localEndIndex);
183
+ return {
184
+ currentPageData,
185
+ totalCount: cachedData.totalCount,
186
+ loading: false,
187
+ error: null
188
+ };
189
+ }, [searchCache, searchHook.loading, searchHook.error, getActualSearchPageSize]);
190
+ const clearSearchCache = useCallback(() => {
191
+ setSearchCache({});
192
+ lastSearchRef.current = null;
193
+ }, []);
194
+ return {
195
+ enhancedSearch,
196
+ getSearchDisplayData,
197
+ clearSearch: searchHook.clearSearch,
198
+ clearSearchCache,
199
+ loading: searchHook.loading,
200
+ error: searchHook.error
201
+ };
202
+ };
203
+ const StackOverflowQuestions = () => {
204
+ const classes = useStyles();
205
+ const {
206
+ data: questionsData,
207
+ loading: questionsLoading,
208
+ error: questionsError,
209
+ fetchActiveQuestions,
210
+ fetchNewestQuestions,
211
+ fetchTopScoredQuestions,
212
+ fetchUnansweredQuestions
213
+ } = useStackOverflowData("questions");
214
+ const {
215
+ enhancedSearch,
216
+ getSearchDisplayData,
217
+ clearSearch,
218
+ clearSearchCache
219
+ } = useEnhancedSearch();
220
+ const [searchTerm, setSearchTerm] = useState("");
221
+ const [activeFilter, setActiveFilter] = useState("active");
222
+ const [currentPage, setCurrentPage] = useState(1);
223
+ const [questionsPage, setQuestionsPage] = useState(1);
224
+ const prevSearchModeRef = useRef(false);
225
+ const enhancedSearchRef = useRef(enhancedSearch);
226
+ const clearSearchRef = useRef(clearSearch);
227
+ const clearSearchCacheRef = useRef(clearSearchCache);
228
+ useEffect(() => {
229
+ enhancedSearchRef.current = enhancedSearch;
230
+ clearSearchRef.current = clearSearch;
231
+ clearSearchCacheRef.current = clearSearchCache;
232
+ });
233
+ const debouncedSearchTerm = useDebounce(searchTerm, 500);
234
+ const isSearchMode = !!searchTerm.trim();
235
+ const requiredServerPage = useMemo(() => {
236
+ return calculateServerPage(questionsPage, SERVER_ITEMS_PER_PAGE);
237
+ }, [questionsPage]);
238
+ useEffect(() => {
239
+ if (!isSearchMode) {
240
+ switch (activeFilter) {
241
+ case "active":
242
+ fetchActiveQuestions(requiredServerPage);
243
+ break;
244
+ case "newest":
245
+ fetchNewestQuestions(requiredServerPage);
246
+ break;
247
+ case "score":
248
+ fetchTopScoredQuestions(requiredServerPage);
249
+ break;
250
+ case "unanswered":
251
+ fetchUnansweredQuestions(requiredServerPage);
252
+ break;
253
+ default:
254
+ fetchActiveQuestions(requiredServerPage);
255
+ break;
256
+ }
257
+ }
258
+ }, [activeFilter, requiredServerPage, isSearchMode, fetchActiveQuestions, fetchNewestQuestions, fetchTopScoredQuestions, fetchUnansweredQuestions]);
259
+ useEffect(() => {
260
+ const wasInSearchMode = prevSearchModeRef.current;
261
+ if (isSearchMode && !wasInSearchMode) {
262
+ setCurrentPage(1);
263
+ } else if (!isSearchMode && wasInSearchMode) {
264
+ setQuestionsPage(1);
265
+ setCurrentPage(1);
266
+ }
267
+ prevSearchModeRef.current = isSearchMode;
268
+ }, [isSearchMode]);
269
+ useEffect(() => {
270
+ if (!isSearchMode) {
271
+ setQuestionsPage(1);
272
+ setCurrentPage(1);
273
+ }
274
+ }, [activeFilter, isSearchMode]);
275
+ useEffect(() => {
276
+ if (debouncedSearchTerm.trim()) {
277
+ if (isSearchMode) {
278
+ enhancedSearchRef.current(debouncedSearchTerm, currentPage);
279
+ }
280
+ } else {
281
+ clearSearchRef.current();
282
+ clearSearchCacheRef.current();
283
+ }
284
+ }, [debouncedSearchTerm, currentPage, isSearchMode]);
285
+ const handleKeyPress = (e) => {
286
+ if (e.key === "Enter" && searchTerm.trim()) {
287
+ enhancedSearchRef.current(searchTerm, currentPage);
288
+ }
289
+ };
290
+ const displayInfo = useMemo(() => {
291
+ if (isSearchMode) {
292
+ const searchDisplayData = getSearchDisplayData(searchTerm, currentPage);
293
+ const totalPages2 = Math.ceil(searchDisplayData.totalCount / CLIENT_ITEMS_PER_PAGE);
294
+ return {
295
+ currentPageData: searchDisplayData.currentPageData,
296
+ totalPages: totalPages2,
297
+ totalCount: searchDisplayData.totalCount,
298
+ loading: searchDisplayData.loading,
299
+ error: searchDisplayData.error
300
+ };
301
+ }
302
+ if (!questionsData?.questions) {
303
+ return {
304
+ currentPageData: [],
305
+ totalPages: 1,
306
+ totalCount: 0,
307
+ loading: questionsLoading,
308
+ error: questionsError
309
+ };
310
+ }
311
+ const { localStartIndex, localEndIndex } = calculateItemsRange(
312
+ questionsPage,
313
+ requiredServerPage,
314
+ SERVER_ITEMS_PER_PAGE
315
+ );
316
+ const currentPageData = questionsData.questions.slice(localStartIndex, localEndIndex);
317
+ const totalServerItems = questionsData.totalCount || 0;
318
+ const totalPages = Math.ceil(totalServerItems / CLIENT_ITEMS_PER_PAGE);
319
+ return {
320
+ currentPageData,
321
+ totalPages,
322
+ totalCount: totalServerItems,
323
+ loading: questionsLoading,
324
+ error: questionsError
325
+ };
326
+ }, [
327
+ isSearchMode,
328
+ getSearchDisplayData,
329
+ searchTerm,
330
+ currentPage,
331
+ questionsPage,
332
+ questionsData?.questions,
333
+ questionsData?.totalCount,
334
+ requiredServerPage,
335
+ questionsLoading,
336
+ questionsError
337
+ ]);
338
+ const handlePageChange = (newPage) => {
339
+ if (isSearchMode) {
340
+ setCurrentPage(newPage);
341
+ if (searchTerm.trim()) {
342
+ enhancedSearchRef.current(searchTerm, newPage);
343
+ }
344
+ } else {
345
+ setQuestionsPage(newPage);
346
+ setCurrentPage(newPage);
347
+ }
348
+ };
349
+ const toggleFilter = (filterId) => {
350
+ setActiveFilter(filterId);
351
+ };
352
+ const displayPageNumber = isSearchMode ? currentPage : questionsPage;
353
+ const PaginationControls = () => {
354
+ if (displayInfo.totalPages <= 1 && displayInfo.totalCount === 0 && !displayInfo.loading) {
355
+ return null;
356
+ }
357
+ return /* @__PURE__ */ jsxs("div", { className: classes.pagination, children: [
358
+ /* @__PURE__ */ jsx(
359
+ Button,
360
+ {
361
+ disabled: displayPageNumber <= 1,
362
+ onClick: () => handlePageChange(displayPageNumber - 1),
363
+ variant: "outlined",
364
+ children: "Previous"
365
+ }
366
+ ),
367
+ /* @__PURE__ */ jsxs(Typography, { variant: "body1", style: { margin: "0 16px" }, children: [
368
+ "Page ",
369
+ displayPageNumber,
370
+ " of ",
371
+ displayInfo.totalPages || 1
372
+ ] }),
373
+ /* @__PURE__ */ jsx(
374
+ Button,
375
+ {
376
+ disabled: displayPageNumber >= (displayInfo.totalPages || 1),
377
+ onClick: () => handlePageChange(displayPageNumber + 1),
378
+ variant: "outlined",
379
+ children: "Next"
380
+ }
381
+ )
382
+ ] });
383
+ };
384
+ if (displayInfo.error) return /* @__PURE__ */ jsx(ResponseErrorPanel, { error: displayInfo.error });
385
+ return /* @__PURE__ */ jsxs("div", { children: [
386
+ /* @__PURE__ */ jsx(Box, { mb: 3, children: /* @__PURE__ */ jsx(
387
+ TextField,
388
+ {
389
+ fullWidth: true,
390
+ variant: "outlined",
391
+ placeholder: "Search questions...",
392
+ value: searchTerm,
393
+ onChange: (e) => setSearchTerm(e.target.value),
394
+ onKeyDown: handleKeyPress,
395
+ InputProps: {
396
+ startAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx(SearchIcon, {}) }),
397
+ className: classes.searchField
398
+ }
399
+ }
400
+ ) }),
401
+ /* @__PURE__ */ jsx(PaginationControls, {}),
402
+ !isSearchMode && /* @__PURE__ */ jsx(Paper, { className: classes.filters, children: /* @__PURE__ */ jsx(ButtonGroup, { className: classes.buttonGroup, children: FILTERS.map(({ id, label }) => /* @__PURE__ */ jsx(
403
+ Button,
404
+ {
405
+ variant: activeFilter === id ? "contained" : "outlined",
406
+ color: "primary",
407
+ onClick: () => toggleFilter(id),
408
+ children: label
409
+ },
410
+ id
411
+ )) }) }),
412
+ /* @__PURE__ */ jsx(Typography, { className: classes.resultCount, children: isSearchMode ? `Search results: ${displayInfo.totalCount} total found` : `Showing ${displayInfo.currentPageData.length} of ${displayInfo.totalCount} results` }),
413
+ displayInfo.loading && /* @__PURE__ */ jsx(LoadingSkeleton, {}),
414
+ !displayInfo.loading && /* @__PURE__ */ jsxs(Fragment, { children: [
415
+ displayInfo.currentPageData && displayInfo.totalCount === 0 && /* @__PURE__ */ jsx(Box, { textAlign: "center", py: 4, children: /* @__PURE__ */ jsx(Typography, { variant: "body1", gutterBottom: true, children: searchTerm.trim() ? `No questions found matching "${searchTerm}"` : "No questions found" }) }),
416
+ displayInfo.currentPageData.length > 0 && /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Grid, { container: true, spacing: 2, children: displayInfo.currentPageData.map((question) => /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
417
+ StackOverflowSearchResultListItem,
418
+ {
419
+ result: {
420
+ location: question.webUrl,
421
+ title: question.title,
422
+ text: question.owner?.name,
423
+ answers: question.answerCount,
424
+ tags: question.tags,
425
+ created: question.creationDate,
426
+ author: question.owner?.name,
427
+ score: question.score,
428
+ isAnswered: question.isAnswered,
429
+ creationDate: question.creationDate,
430
+ userRole: question.owner?.role,
431
+ userProfile: question.owner?.webUrl,
432
+ avatar: question.owner?.avatarUrl,
433
+ userReputation: question.owner?.reputation
434
+ },
435
+ icon: /* @__PURE__ */ jsx(StackOverflowIcon, {})
436
+ }
437
+ ) }, question.id)) }) })
438
+ ] }),
439
+ /* @__PURE__ */ jsx(PaginationControls, {})
440
+ ] });
441
+ };
442
+
443
+ export { StackOverflowQuestions };
444
+ //# sourceMappingURL=StackOverflowPosts.esm.js.map