@jfvilas/plugin-kwirth-fileman 0.13.5

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityKwirthFilemanContent.esm.js","sources":["../../src/components/EntityKwirthFilemanContent.tsx"],"sourcesContent":["/*\r\nCopyright 2025 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport React, { useEffect, useRef, useState } from 'react'\r\nimport useAsync from 'react-use/esm/useAsync'\r\n\r\nimport { Progress, WarningPanel } from '@backstage/core-components'\r\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api'\r\nimport { ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR, isKwirthAvailable, ClusterValidPods, IStatusLine, getPodList, getContainerList, IBackendInfo } from '@jfvilas/plugin-kwirth-common'\r\nimport { MissingAnnotationEmptyState, useEntity } from '@backstage/plugin-catalog-react'\r\n\r\n// kwirth\r\nimport { kwirthFilemanApiRef } from '../api'\r\nimport { accessKeySerialize, InstanceMessageActionEnum, InstanceConfigViewEnum, IInstanceMessage, InstanceMessageTypeEnum, SignalMessageLevelEnum, InstanceConfigObjectEnum, InstanceConfig, InstanceMessageFlowEnum, SignalMessageEventEnum, ISignalMessage } from '@jfvilas/kwirth-common'\r\n\r\n// kwirth fileman components\r\nimport { KwirthNews, ComponentNotFound, StatusLog, ClusterList, ErrorType } from '@jfvilas/plugin-kwirth-frontend'\r\n\r\n// Material-UI\r\nimport { Grid, Card, CardHeader, Box, IconButton, Typography } from '@material-ui/core'\r\n\r\n// Icons\r\nimport PlayIcon from '@material-ui/icons/PlayArrow'\r\nimport PauseIcon from '@material-ui/icons/Pause'\r\nimport StopIcon from '@material-ui/icons/Stop'\r\nimport InfoIcon from '@material-ui/icons/Info'\r\nimport WarningIcon from '@material-ui/icons/Warning'\r\nimport ErrorIcon from '@material-ui/icons/Error'\r\nimport KwirthFilemanLogo from '../assets/kwirthfileman-logo.svg'\r\nimport { v4 as uuid } from 'uuid'\r\nimport { FileManager, IError, IFileData } from '@jfvilas/react-file-manager'\r\nimport '@jfvilas/react-file-manager/dist/style.css'\r\nimport styles from './custom-fm.module.css'\r\nimport { VERSION } from '../version'\r\n\r\nexport interface IEntityKwirthFilemanProps {\r\n hideVersion?: boolean\r\n excludeContainers?: string[]\r\n}\r\n\r\nexport const EntityKwirthFilemanContent: React.FC<IEntityKwirthFilemanProps> = (props:IEntityKwirthFilemanProps) => { \r\n const { entity } = useEntity()\r\n const kwirthFilemanApi = useApi(kwirthFilemanApiRef)\r\n const alertApi = useApi(alertApiRef)\r\n const [validClusters, setResources] = useState<ClusterValidPods[]>([])\r\n const [selectedClusterName, setSelectedClusterName] = useState('')\r\n const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([])\r\n const [selectedPodNames, setSelectedPodNames] = useState<string[]>([])\r\n const [selectedContainerNames, setSelectedContainerNames] = useState<string[]>([])\r\n const [started, setStarted] = useState(false)\r\n const [stopped, setStopped] = useState(true)\r\n const paused=useRef<boolean>(false)\r\n const [statusMessages, setStatusMessages] = useState<IStatusLine[]>([])\r\n const [webSocket, setWebSocket] = useState<WebSocket>()\r\n const [showStatusDialog, setShowStatusDialog] = useState(false)\r\n const [statusLevel, setStatusLevel] = useState<SignalMessageLevelEnum>(SignalMessageLevelEnum.INFO)\r\n const [ backendVersion, setBackendVersion ] = useState<string>('')\r\n const [ backendInfo, setBackendInfo ] = useState<IBackendInfo>()\r\n const instance = useRef<string>()\r\n const [ stateFiles, setStateFiles ] = useState<IFileData[]>([])\r\n const files = useRef<IFileData[]>([])\r\n const [ currentPath, setCurrentPath] = useState('')\r\n const { loading, error } = useAsync ( async () => {\r\n if (backendVersion==='') setBackendVersion(await kwirthFilemanApi.getVersion())\r\n if (!backendInfo) setBackendInfo(await kwirthFilemanApi.getInfo())\r\n let reqScopes = ['fileman$read']\r\n let data:ClusterValidPods[] = await kwirthFilemanApi.requestAccess(entity, 'fileman', reqScopes)\r\n setResources(data)\r\n })\r\n const filemanBoxRef = useRef<HTMLDivElement | null>(null)\r\n const [filemanBoxTop, setFilemanBoxTop] = useState(0)\r\n let permissions={\r\n create: true,\r\n delete: true,\r\n download: true,\r\n copy: true,\r\n move: true,\r\n rename: true,\r\n upload: true\r\n }\r\n\r\n interface IFileUploadConfig { \r\n url: string\r\n method?: \"POST\" | \"PUT\"\r\n headers?: { [key: string]: string }\r\n }\r\n let fileUploadConfig:IFileUploadConfig= {\r\n url: ''\r\n }\r\n\r\n let cluster = validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n let accessKey = cluster.accessKeys.get('fileman$read')\r\n if (accessKey) {\r\n fileUploadConfig = {\r\n url: `${cluster.url}/channel/fileman/upload?key=${instance.current}`,\r\n method:'POST',\r\n headers: {\r\n 'Authorization': 'Bearer '+ accessKeySerialize(accessKey)\r\n }\r\n }\r\n }\r\n }\r\n \r\n let level = currentPath.split('/').length - 1\r\n if (level<3) {\r\n permissions = {\r\n create: false,\r\n delete: false,\r\n download: false,\r\n copy: false,\r\n move: false,\r\n rename: false,\r\n upload: false\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (filemanBoxRef.current) setFilemanBoxTop(filemanBoxRef.current.getBoundingClientRect().top)\r\n })\r\n\r\n const clickStart = () => {\r\n if (!paused.current) {\r\n setStarted(true)\r\n paused.current=false\r\n setStopped(false)\r\n startFilemanViewer()\r\n }\r\n else {\r\n paused.current=false\r\n setStarted(true)\r\n }\r\n }\r\n\r\n const onClickPause = () => {\r\n setStarted(false)\r\n paused.current=true\r\n }\r\n\r\n const onClickStop = () => {\r\n setStarted(false)\r\n setStopped(true)\r\n paused.current=false\r\n stopFilemanViewer()\r\n }\r\n\r\n const onSelectCluster = (clusterName:string|undefined) => {\r\n if (started) onClickStop()\r\n if (clusterName) {\r\n setSelectedClusterName(clusterName)\r\n setSelectedPodNames([])\r\n setSelectedContainerNames([])\r\n setStatusMessages([])\r\n let cluster = validClusters.find(cluster => cluster.name === clusterName)\r\n\r\n if (cluster && cluster.pods) {\r\n let validNamespaces = Array.from(new Set(cluster.pods.map(pod => pod.namespace)))\r\n if (validNamespaces.length === 1) {\r\n setSelectedNamespaces(validNamespaces)\r\n let podList = getPodList (cluster.pods, validNamespaces)\r\n setSelectedPodNames(podList.map(pod => pod.name))\r\n setSelectedContainerNames(getContainerList(cluster.pods, validNamespaces, podList.map(pod => pod.name), props.excludeContainers || []))\r\n }\r\n else {\r\n setSelectedNamespaces([])\r\n }\r\n }\r\n }\r\n }\r\n\r\n enum FilemanCommandEnum {\r\n HOME = 'home',\r\n DIR = 'dir',\r\n CREATE = 'create',\r\n RENAME = 'rename',\r\n DELETE = 'delete',\r\n MOVE = 'move',\r\n COPY = 'copy',\r\n UPLOAD = 'upload',\r\n DOWNLOAD = 'download'\r\n }\r\n\r\n interface IFilemanMessage extends IInstanceMessage {\r\n msgtype: 'filemanmessage'\r\n id: string\r\n accessKey: string\r\n instance: string\r\n namespace: string\r\n group: string\r\n pod: string\r\n container: string\r\n command: FilemanCommandEnum\r\n params?: string[]\r\n }\r\n\r\n interface IFilemanMessageResponse extends IInstanceMessage {\r\n msgtype: 'filemanmessageresponse'\r\n id: string\r\n command: FilemanCommandEnum\r\n namespace: string\r\n group: string\r\n pod: string\r\n container: string\r\n data?: any\r\n }\r\n\r\n const processFilemanMessage = (wsEvent:any) => {\r\n let msg:IFilemanMessage = JSON.parse(wsEvent.data)\r\n\r\n switch (msg.type) {\r\n case InstanceMessageTypeEnum.DATA: {\r\n let response = JSON.parse(wsEvent.data) as IFilemanMessageResponse\r\n switch(response.action) {\r\n case InstanceMessageActionEnum.COMMAND: {\r\n switch(response.command) {\r\n case FilemanCommandEnum.HOME:\r\n let data = response.data as string[]\r\n let nss = Array.from (new Set (data.map(n => n.split('/')[0])))\r\n nss.map(ns => {\r\n if (!files.current.some(f => f.path === '/'+ ns)) {\r\n files.current.push ({ name: ns, isDirectory: true, path: '/'+ ns, class:'namespace' }) \r\n }\r\n let podNames = Array.from (new Set (data.filter(a => a.split('/')[0]===ns).map(o => o.split('/')[1])))\r\n podNames.map(p => {\r\n if (!files.current.some(f => f.path === '/'+ns+'/'+p)) {\r\n //filemanData.files.push({ name: p, isDirectory: true, path: '/'+ns+'/'+p, class:'pod' })\r\n files.current.push ({ name: p, isDirectory: true, path: '/'+ns+'/'+p, class:'pod' })\r\n }\r\n let conts = Array.from (new Set (data.filter(a => a.split('/')[0]===ns && a.split('/')[1]===p).map(o => o.split('/')[2])))\r\n conts.map(c => {\r\n if (!files.current.some(f => f.path === '/'+ns+'/'+p+'/'+c)) {\r\n //filemanData.files.push ({ name: c, isDirectory: true, path: '/'+ns+'/'+p+'/'+c, class:'container' })\r\n files.current.push ({ name: c, isDirectory: true, path: '/'+ns+'/'+p+'/'+c, class:'container' })\r\n }\r\n })\r\n })\r\n })\r\n setStateFiles([...files.current])\r\n break\r\n case FilemanCommandEnum.DIR:\r\n let content = JSON.parse(response.data)\r\n if (content.status==='Success') {\r\n for (let o of content.metadata.object) {\r\n let name = o.name.split('/')[o.name.split('/').length-1]\r\n let e = {\r\n name,\r\n isDirectory: (o.type===1),\r\n path: o.name,\r\n updatedAt: new Date(+o.time).toISOString(),\r\n size: +o.size,\r\n ...(o.type===0? {class:'file'}:{})\r\n }\r\n let i = files.current.findIndex(f => f.path === e.path)\r\n if (i>=0)\r\n files.current[i]=e\r\n else\r\n files.current.push(e)\r\n }\r\n setStateFiles([...files.current])\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, content.text || content.message)\r\n }\r\n break\r\n case FilemanCommandEnum.RENAME: {\r\n let content = JSON.parse(response.data)\r\n if (content.status!=='Success') addMessage( SignalMessageLevelEnum.ERROR, content.text || content.message)\r\n }\r\n break\r\n case FilemanCommandEnum.DELETE: {\r\n let content = JSON.parse(response.data)\r\n if (content.status==='Success') {\r\n let fname = content.metadata.object\r\n files.current = files.current.filter(f => f.path !== fname)\r\n files.current = files.current.filter(f => !f.path.startsWith(fname+'/'))\r\n setStateFiles([...files.current])\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, content.text || content.message)\r\n }\r\n break\r\n }\r\n case FilemanCommandEnum.MOVE:\r\n case FilemanCommandEnum.COPY:\r\n case FilemanCommandEnum.CREATE: {\r\n let content = JSON.parse(response.data)\r\n if (content.status==='Success') {\r\n //filemanData.files = filemanData.files.filter(f => f.path !== content.metadata.object)\r\n let f = { \r\n name: (content.metadata.object as string).split('/').slice(-1)[0],\r\n isDirectory: (content.metadata.type===1),\r\n path: content.metadata.object,\r\n updatedAt: new Date(+content.metadata.time).toISOString(), \r\n size: +content.metadata.size,\r\n ...(content.metadata.type.type===0? {class:'file'}:{})\r\n }\r\n files.current.push(f)\r\n setStateFiles([...files.current])\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, content.text || content.message)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n break\r\n }\r\n break\r\n }\r\n case InstanceMessageTypeEnum.SIGNAL:\r\n let signalMessage = JSON.parse(wsEvent.data) as ISignalMessage\r\n if (signalMessage.flow === InstanceMessageFlowEnum.RESPONSE) {\r\n if (signalMessage.action === InstanceMessageActionEnum.START) {\r\n if (signalMessage.text) addMessage(SignalMessageLevelEnum.INFO, signalMessage.text)\r\n instance.current = signalMessage.instance\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, wsEvent.data)\r\n }\r\n }\r\n else if (signalMessage.flow === InstanceMessageFlowEnum.UNSOLICITED) {\r\n let cluster = validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n let accessKey = cluster.accessKeys.get('fileman$read')\r\n if (accessKey && instance?.current) {\r\n if (signalMessage.event === SignalMessageEventEnum.ADD) {\r\n let filemanMessage:IFilemanMessage = {\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n action: InstanceMessageActionEnum.COMMAND,\r\n channel: 'fileman',\r\n type: InstanceMessageTypeEnum.DATA,\r\n accessKey: accessKeySerialize(accessKey),\r\n instance: instance.current,\r\n id: uuid(),\r\n command: FilemanCommandEnum.HOME,\r\n namespace: signalMessage.namespace!,\r\n group: '',\r\n pod: signalMessage.pod!,\r\n container: signalMessage.container!,\r\n params: [],\r\n msgtype: 'filemanmessage'\r\n }\r\n let payload = JSON.stringify( filemanMessage )\r\n wsEvent.target.send(payload)\r\n if (signalMessage.text) addMessage( SignalMessageLevelEnum.INFO, signalMessage.text)\r\n }\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.INFO, 'Have no instance/accessKey')\r\n }\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.INFO, 'Have no cluster')\r\n }\r\n }\r\n break\r\n\r\n default:\r\n console.log(`Invalid message type ${msg.type}`)\r\n break\r\n }\r\n }\r\n\r\n const addMessage = (level:SignalMessageLevelEnum, text:string) => {\r\n alertApi.post({ message: text, severity: level, display:'transient' }) \r\n setStatusMessages ((prev) => [...prev, {\r\n level,\r\n text,\r\n type: InstanceMessageTypeEnum.SIGNAL,\r\n }])\r\n }\r\n\r\n const websocketOnMessage = (wsEvent:any) => {\r\n let instanceMessage:IInstanceMessage\r\n try {\r\n instanceMessage = JSON.parse(wsEvent.data) as IInstanceMessage\r\n }\r\n catch (err) {\r\n console.log(err)\r\n console.log(wsEvent.data)\r\n return\r\n }\r\n\r\n switch(instanceMessage.channel) {\r\n case 'fileman':\r\n processFilemanMessage(wsEvent)\r\n break\r\n default:\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid channel in message: '+instanceMessage.channel)\r\n addMessage (SignalMessageLevelEnum.ERROR, 'Invalid message: '+JSON.stringify(instanceMessage))\r\n break\r\n }\r\n }\r\n\r\n const websocketOnOpen = (ws:WebSocket) => {\r\n setWebSocket(ws)\r\n let cluster=validClusters.find(cluster => cluster.name === selectedClusterName)\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n let pods = cluster.pods.filter(p => selectedNamespaces.includes(p.namespace))\r\n if (!pods) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No pods found')\r\n return\r\n }\r\n console.log(`WS connected`)\r\n let accessKey = cluster.accessKeys.get('fileman$read')\r\n if (accessKey) {\r\n let containers:string[] = []\r\n if (selectedContainerNames.length>0) {\r\n for(var p of selectedPodNames) {\r\n for (var c of selectedContainerNames) {\r\n containers.push(p+'+'+c)\r\n }\r\n }\r\n }\r\n let iConfig:InstanceConfig = {\r\n channel: 'fileman',\r\n objects: InstanceConfigObjectEnum.PODS,\r\n action: InstanceMessageActionEnum.START,\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n instance: '',\r\n accessKey: accessKeySerialize(accessKey),\r\n scope: 'fileman$read',\r\n view: (selectedContainerNames.length > 0 ? InstanceConfigViewEnum.CONTAINER : InstanceConfigViewEnum.POD),\r\n namespace: selectedNamespaces.join(','),\r\n group: '',\r\n pod: selectedPodNames.map(p => p).join(','),\r\n container: containers.join(','),\r\n data: {},\r\n type: InstanceMessageTypeEnum.SIGNAL\r\n }\r\n ws.send(JSON.stringify(iConfig))\r\n }\r\n else {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No accessKey for starting fileman streaming')\r\n return\r\n }\r\n }\r\n\r\n const startFilemanViewer = () => {\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName);\r\n if (!cluster) {\r\n addMessage(SignalMessageLevelEnum.ERROR,'No cluster selected')\r\n return\r\n }\r\n\r\n try {\r\n let ws = new WebSocket(cluster.url)\r\n ws.onopen = () => websocketOnOpen(ws)\r\n ws.onmessage = (event) => websocketOnMessage(event)\r\n ws.onclose = (event) => websocketOnClose(event)\r\n setWebSocket(ws)\r\n }\r\n catch (err) {\r\n }\r\n\r\n }\r\n\r\n const websocketOnClose = (_event:any) => {\r\n console.log(`WS disconnected`)\r\n setStarted(false)\r\n paused.current=false\r\n setStopped(true)\r\n }\r\n\r\n const stopFilemanViewer = () => {\r\n webSocket?.close()\r\n }\r\n\r\n const actionButtons = () => {\r\n let hasKey=false\r\n let cluster=validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n hasKey = Boolean(cluster.accessKeys.get('fileman$read'))\r\n }\r\n\r\n return <>\r\n <IconButton onClick={() => clickStart()} title=\"Play\" disabled={started || !paused || selectedPodNames.length === 0 || !hasKey}>\r\n <PlayIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickPause} title=\"Pause\" disabled={!((started && !paused.current) && selectedPodNames.length > 0)}>\r\n <PauseIcon />\r\n </IconButton>\r\n <IconButton onClick={onClickStop} title=\"Stop\" disabled={stopped || selectedPodNames.length === 0}>\r\n <StopIcon />\r\n </IconButton>\r\n </>\r\n }\r\n\r\n const statusButtons = (title:string) => {\r\n const show = (level:SignalMessageLevelEnum) => {\r\n setShowStatusDialog(true)\r\n setStatusLevel(level)\r\n }\r\n\r\n const prepareText = (txt:string|undefined) => {\r\n return txt? (txt.length>25? txt.substring(0,25)+\"...\":txt) : 'N/A'\r\n }\r\n\r\n return (\r\n <Grid container direction='row' >\r\n <Grid item>\r\n <Typography variant='h5'>{prepareText(title)}</Typography>\r\n </Grid>\r\n <Grid item style={{marginTop:'-8px'}}>\r\n <IconButton title=\"info\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)} onClick={() => show(SignalMessageLevelEnum.INFO)}>\r\n <InfoIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.INFO)?'blue':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"warning\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)} onClick={() => show(SignalMessageLevelEnum.WARNING)} style={{marginLeft:'-16px'}}>\r\n <WarningIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.WARNING)?'orange':'#BDBDBD'}}/>\r\n </IconButton>\r\n <IconButton title=\"error\" disabled={!statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)} onClick={() => show(SignalMessageLevelEnum.ERROR)} style={{marginLeft:'-16px'}}>\r\n <ErrorIcon style={{ color:statusMessages.some(m=>m.type === InstanceMessageTypeEnum.SIGNAL && m.level=== SignalMessageLevelEnum.ERROR)?'red':'#BDBDBD'}}/>\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n )\r\n }\r\n\r\n const statusClear = (level: SignalMessageLevelEnum) => {\r\n setStatusMessages(statusMessages.filter(m=> m.level!==level))\r\n setShowStatusDialog(false)\r\n }\r\n\r\n const onError = (error: IError, _file: IFileData) => {\r\n addMessage( SignalMessageLevelEnum.ERROR, error.message)\r\n }\r\n\r\n const onRename\t= (file: IFileData, newName: string) => {\r\n let [namespace,pod,container] = file.path.split('/').slice(1)\r\n //filemanData.files = filemanData.files.filter (f => f.path!==file.path)\r\n files.current = files.current.filter (f => f.path!==file.path)\r\n setStateFiles([...files.current])\r\n sendCommand(FilemanCommandEnum.RENAME, namespace, pod, container, [file.path, newName])\r\n }\r\n\r\n const onRefresh = () => {\r\n if (level >= 3) {\r\n files.current = files.current.filter ( f => !f.path.startsWith(currentPath+'/'))\r\n //files.current = files.current.filter ( f => f.path!==currentPath)\r\n getLocalDir(currentPath+'/')\r\n }\r\n else {\r\n sendCommand(FilemanCommandEnum.HOME, '', '', '', [])\r\n }\r\n\r\n }\r\n \r\n const getLocalDir = (folder:string) => {\r\n let cluster = validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n let accessKey = cluster.accessKeys.get('fileman$read')\r\n if (accessKey && instance?.current && webSocket) {\r\n let [namespace,pod,container] = folder.split('/').slice(1)\r\n let filemanMessage:IFilemanMessage = {\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n action: InstanceMessageActionEnum.COMMAND,\r\n channel: 'fileman',\r\n type: InstanceMessageTypeEnum.DATA,\r\n accessKey: accessKeySerialize(accessKey),\r\n instance: instance.current,\r\n id: uuid(),\r\n command: FilemanCommandEnum.DIR,\r\n namespace: namespace,\r\n group: '',\r\n pod: pod,\r\n container: container,\r\n params: [folder],\r\n msgtype: 'filemanmessage'\r\n }\r\n let payload = JSON.stringify(filemanMessage)\r\n webSocket.send(payload)\r\n }\r\n }\r\n }\r\n\r\n const sendCommand = (command: FilemanCommandEnum, namespace:string, pod:string, container:string, params:string[]) => {\r\n let cluster = validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n let accessKey = cluster.accessKeys.get('fileman$read')\r\n if (accessKey && instance?.current && webSocket) { \r\n let filemanMessage:IFilemanMessage = {\r\n flow: InstanceMessageFlowEnum.REQUEST,\r\n action: InstanceMessageActionEnum.COMMAND,\r\n channel: 'fileman',\r\n type: InstanceMessageTypeEnum.DATA,\r\n accessKey: accessKeySerialize(accessKey),\r\n instance: instance.current,\r\n id: uuid(),\r\n command: command,\r\n namespace: namespace,\r\n group: '',\r\n pod: pod,\r\n container: container,\r\n params: params,\r\n msgtype: 'filemanmessage'\r\n }\r\n let payload = JSON.stringify( filemanMessage )\r\n webSocket.send(payload)\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, 'Have no instance/accessKey')\r\n }\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, 'Have no cluster')\r\n }\r\n }\r\n\r\n const onDelete = async (filesToDelete: IFileData[]) => {\r\n for (let file of filesToDelete) {\r\n let [namespace,pod,container] = file.path.split('/').slice(1)\r\n sendCommand(FilemanCommandEnum.DELETE, namespace, pod, container, [file.path])\r\n }\r\n }\r\n\r\n const onCreateFolder = async (name: string, parentFolder: IFileData) => {\r\n let [namespace,pod,container] = parentFolder.path.split('/').slice(1)\r\n sendCommand(FilemanCommandEnum.CREATE, namespace, pod, container, [parentFolder.path + '/' + name])\r\n }\r\n\r\n const onDownload = async (filesToDownload: Array<IFileData>) => {\r\n let cluster = validClusters.find(cluster => cluster.name===selectedClusterName)\r\n if (cluster) {\r\n let accessKey = cluster.accessKeys.get('fileman$read')\r\n if (accessKey) {\r\n\r\n for (let file of filesToDownload) {\r\n const url = `${cluster.url}/channel/fileman/download?key=${instance.current}&filename=${file.path}`\r\n \r\n try {\r\n const response = await fetch(url, { headers: { 'Authorization': 'Bearer '+ accessKeySerialize(accessKey) } })\r\n\r\n if (response.ok) {\r\n const blob = await response.blob()\r\n\r\n const link = document.createElement('a')\r\n link.href = URL.createObjectURL(blob)\r\n link.download = file.path.split('/').slice(-1)[0]\r\n if (file.isDirectory) link.download += '.tar.gz'\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(link.href)\r\n }\r\n else {\r\n console.error(`Error downloading file: ${file.path}`)\r\n addMessage( SignalMessageLevelEnum.ERROR, `Error downloading file ${file.path}: (${response.status}) ${await response.text()}`)\r\n }\r\n }\r\n catch (error) {\r\n console.error(`Error downloading file: ${file.path}`, error)\r\n addMessage( SignalMessageLevelEnum.ERROR, `Error downloading file ${file.path}: ${error}`)\r\n }\r\n }\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, 'Have no instance/accessKey')\r\n }\r\n }\r\n else {\r\n addMessage( SignalMessageLevelEnum.ERROR, 'Have no cluster')\r\n }\r\n }\r\n\r\n const onPaste = (filesToPaste: Array<IFileData>, destFolder:IFileData, operation:string) => {\r\n let command = operation==='move'? FilemanCommandEnum.MOVE : FilemanCommandEnum.COPY\r\n for (let file of filesToPaste) {\r\n let [namespace,pod,container] = file.path.split('/').slice(1)\r\n sendCommand(command, namespace, pod, container, [file.path, destFolder.path])\r\n } \r\n }\r\n\r\n const onFolderChange = (folder:string) => {\r\n setCurrentPath(folder)\r\n folder +='/'\r\n let level = folder.split('/').length - 1\r\n if (level > 3) getLocalDir(folder)\r\n }\r\n\r\n const onFileUploading = (file: IFileData, _parentFolder: IFileData) => { \r\n return { filename: currentPath + '/' + file.name }\r\n }\r\n\r\n return (<>\r\n\r\n { loading && <Progress/> }\r\n\r\n {!isKwirthAvailable(entity) && !loading && error && (\r\n <WarningPanel title={'An error has ocurred while obtaining data from kuebernetes clusters.'} message={error?.message} />\r\n )}\r\n\r\n {!isKwirthAvailable(entity) && !loading && (\r\n <MissingAnnotationEmptyState readMoreUrl='https://github.com/jfvilas/plugin-kwirth-fileman' annotation={[ANNOTATION_BACKSTAGE_KUBERNETES_LABELID, ANNOTATION_BACKSTAGE_KUBERNETES_LABELSELECTOR]}/>\r\n )}\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length===0 &&\r\n <ComponentNotFound error={ErrorType.NO_CLUSTERS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)===0 &&\r\n <ComponentNotFound error={ErrorType.NO_PODS} entity={entity}/>\r\n }\r\n\r\n { isKwirthAvailable(entity) && !loading && validClusters && validClusters.length>0 && validClusters.reduce((sum,cluster) => sum+cluster.pods.length, 0)>0 &&\r\n <Box sx={{ display: 'flex', height:'100%'}}>\r\n <Box sx={{ width: '200px', maxWidth:'200px'}}>\r\n <Grid container direction='column'>\r\n <Grid item> \r\n <Card>\r\n <ClusterList resources={validClusters} selectedClusterName={selectedClusterName} onSelect={onSelectCluster}/>\r\n </Card>\r\n </Grid>\r\n {!props.hideVersion &&\r\n <Grid item>\r\n <Card>\r\n <KwirthNews latestVersions={backendInfo} backendVersion={backendVersion} ownVersion={VERSION}/>\r\n </Card>\r\n </Grid>\r\n }\r\n </Grid>\r\n </Box>\r\n\r\n <Box sx={{ flexGrow: 1, flex:1, overflow:'hidden', p:1, marginLeft:'8px' }}>\r\n\r\n { !selectedClusterName && \r\n <img src={KwirthFilemanLogo} alt='No cluster selected' style={{ left:'40%', marginTop:'10%', width:'20%', position:'relative' }} />\r\n }\r\n\r\n { selectedClusterName && <>\r\n <Card style={{ marginTop:-8, marginBottom:'8px' }}>\r\n <CardHeader\r\n title={statusButtons(selectedClusterName)}\r\n style={{marginTop:-4, marginBottom:4, flexShrink:0}}\r\n action={actionButtons()}\r\n />\r\n </Card>\r\n { started && <Grid ref={filemanBoxRef} style={{height: `calc(100vh - ${filemanBoxTop}px - 35px)`}}>\r\n <FileManager \r\n className={styles.customFm}\r\n files={stateFiles}\r\n filePreviewPath='http://avoid-console-error'\r\n primaryColor='#1976d2'\r\n fontFamily='\"Helvetica Neue\", Helvetica, Roboto, Arial, sans-serif'\r\n height='100%'\r\n actions={new Map()}\r\n icons={new Map()} \r\n fileUploadConfig={fileUploadConfig} \r\n onCreateFolder={onCreateFolder}\r\n onError={onError}\r\n onRename={onRename}\r\n onPaste={onPaste}\r\n onDelete={onDelete}\r\n onFolderChange={onFolderChange}\r\n onRefresh={onRefresh}\r\n onFileUploading={onFileUploading}\r\n onDownload={onDownload}\r\n enableFilePreview={false}\r\n initialPath={''}\r\n permissions={permissions}\r\n />\r\n </Grid>}\r\n </>}\r\n </Box>\r\n </Box>\r\n }\r\n { showStatusDialog && <StatusLog level={statusLevel} onClose={() => setShowStatusDialog(false)} statusMessages={statusMessages} onClear={statusClear}/>}\r\n </>)\r\n}\r\n"],"names":["cluster","FilemanCommandEnum","content","uuid","level","p","error"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAoDO,MAAM,0BAAA,GAAkE,CAAC,KAAA,KAAoC;AAChH,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,gBAAA,GAAmB,OAAO,mBAAmB,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,OAAO,WAAW,CAAA;AACnC,EAAA,MAAM,CAAC,aAAA,EAAe,YAAY,CAAA,GAAI,QAAA,CAA6B,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAAS,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AACrE,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAI,QAAA,CAAmB,EAAE,CAAA;AACjF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAO,OAAgB,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA,CAAwB,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA,EAAoB;AACtD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAiC,uBAAuB,IAAI,CAAA;AAClG,EAAA,MAAM,CAAE,cAAA,EAAgB,iBAAkB,CAAA,GAAI,SAAiB,EAAE,CAAA;AACjE,EAAA,MAAM,CAAE,WAAA,EAAa,cAAe,CAAA,GAAI,QAAA,EAAuB;AAC/D,EAAA,MAAM,WAAW,MAAA,EAAe;AAChC,EAAA,MAAM,CAAE,UAAA,EAAY,aAAc,CAAA,GAAI,QAAA,CAAsB,EAAE,CAAA;AAC9D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAoB,EAAE,CAAA;AACpC,EAAA,MAAM,CAAE,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AAClD,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,SAAW,YAAY;AAC9C,IAAA,IAAI,mBAAiB,EAAA,EAAI,iBAAA,CAAkB,MAAM,gBAAA,CAAiB,YAAY,CAAA;AAC9E,IAAA,IAAI,CAAC,WAAA,EAAa,cAAA,CAAe,MAAM,gBAAA,CAAiB,SAAS,CAAA;AACjE,IAAA,IAAI,SAAA,GAAY,CAAC,cAAc,CAAA;AAC/B,IAAA,IAAI,OAA0B,MAAM,gBAAA,CAAiB,aAAA,CAAc,MAAA,EAAQ,WAAW,SAAS,CAAA;AAC/F,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACrB,CAAC,CAAA;AACD,EAAA,MAAM,aAAA,GAAgB,OAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,CAAC,CAAA;AACpD,EAAA,IAAI,WAAA,GAAY;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,IAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACZ;AAOA,EAAA,IAAI,gBAAA,GAAoC;AAAA,IACpC,GAAA,EAAK;AAAA,GACT;AAEA,EAAA,IAAI,UAAU,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC9E,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AACrD,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,gBAAA,GAAmB;AAAA,QACf,KAAK,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,4BAAA,EAA+B,SAAS,OAAO,CAAA,CAAA;AAAA,QAClE,MAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS;AAAA,UACL,eAAA,EAAiB,SAAA,GAAW,kBAAA,CAAmB,SAAS;AAAA;AAC5D,OACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,IAAI,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,MAAA,GAAS,CAAA;AAC5C,EAAA,IAAI,QAAM,CAAA,EAAG;AACT,IAAA,WAAA,GAAc;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,KAAA;AAAA,MACR,QAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAM,KAAA;AAAA,MACN,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACZ;AAAA,EACJ;AAEA,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,cAAc,OAAA,EAAS,gBAAA,CAAiB,cAAc,OAAA,CAAQ,qBAAA,GAAwB,GAAG,CAAA;AAAA,EACjG,CAAC,CAAA;AAED,EAAA,MAAM,aAAa,MAAM;AACrB,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACjB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAA,CAAO,OAAA,GAAQ,KAAA;AACf,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,kBAAA,EAAmB;AAAA,IACvB,CAAA,MACK;AACD,MAAA,MAAA,CAAO,OAAA,GAAQ,KAAA;AACf,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACnB;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACvB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,OAAA,GAAQ,IAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACtB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,OAAA,GAAQ,KAAA;AACf,IAAA,iBAAA,EAAkB;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,WAAA,KAAiC;AACtD,IAAA,IAAI,SAAS,WAAA,EAAY;AACzB,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,sBAAA,CAAuB,WAAW,CAAA;AAClC,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,yBAAA,CAA0B,EAAE,CAAA;AAC5B,MAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,MAAA,IAAIA,WAAU,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAS,WAAW,CAAA;AAExE,MAAA,IAAIA,QAAAA,IAAWA,SAAQ,IAAA,EAAM;AACzB,QAAA,IAAI,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAIA,QAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,SAAS,CAAC,CAAC,CAAA;AAChF,QAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAC9B,UAAA,qBAAA,CAAsB,eAAe,CAAA;AACrC,UAAA,IAAI,OAAA,GAAU,UAAA,CAAYA,QAAAA,CAAQ,IAAA,EAAM,eAAe,CAAA;AACvD,UAAA,mBAAA,CAAoB,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAI,CAAC,CAAA;AAChD,UAAA,yBAAA,CAA0B,gBAAA,CAAiBA,QAAAA,CAAQ,IAAA,EAAM,eAAA,EAAiB,QAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,IAAI,CAAA,EAAG,KAAA,CAAM,iBAAA,IAAqB,EAAE,CAAC,CAAA;AAAA,QAC1I,CAAA,MACK;AACD,UAAA,qBAAA,CAAsB,EAAE,CAAA;AAAA,QAC5B;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,IAAK,kBAAA;AAAL,EAAA,CAAA,CAAKC,mBAAAA,KAAL;AACI,IAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,IAAAA,oBAAA,KAAA,CAAA,GAAM,KAAA;AACN,IAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,IAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,IAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,IAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,IAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,IAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,IAAAA,oBAAA,UAAA,CAAA,GAAW,UAAA;AAAA,EAAA,CAAA,EATV,kBAAA,KAAA,kBAAA,GAAA,EAAA,CAAA,CAAA;AAoCL,EAAA,MAAM,qBAAA,GAAwB,CAAC,OAAA,KAAgB;AAC3C,IAAA,IAAI,GAAA,GAAsB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAEjD,IAAA,QAAQ,IAAI,IAAA;AAAM,MACd,KAAK,wBAAwB,IAAA,EAAM;AAC/B,QAAA,IAAI,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACtC,QAAA,QAAO,SAAS,MAAA;AAAQ,UACpB,KAAK,yBAAA,CAA0B,OAAA;AAAS,YAAA;AACpC,cAAA,QAAO,SAAS,OAAA;AAAS,gBACrB,KAAK,MAAA;AACD,kBAAA,IAAI,OAAO,QAAA,CAAS,IAAA;AACpB,kBAAA,IAAI,GAAA,GAAM,KAAA,CAAM,IAAA,CAAM,IAAI,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9D,kBAAA,GAAA,CAAI,IAAI,CAAA,EAAA,KAAM;AACV,oBAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,GAAA,GAAK,EAAE,CAAA,EAAG;AAC9C,sBAAA,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAM,EAAE,IAAA,EAAM,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,GAAA,GAAK,EAAA,EAAI,KAAA,EAAM,WAAA,EAAa,CAAA;AAAA,oBACzF;AACA,oBAAA,IAAI,QAAA,GAAW,KAAA,CAAM,IAAA,CAAM,IAAI,GAAA,CAAK,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,KAAI,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACrG,oBAAA,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK;AACd,sBAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,GAAA,GAAI,EAAA,GAAG,GAAA,GAAI,CAAC,CAAA,EAAG;AAEnD,wBAAA,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAM,EAAE,IAAA,EAAM,GAAG,WAAA,EAAa,IAAA,EAAM,IAAA,EAAM,GAAA,GAAI,EAAA,GAAG,GAAA,GAAI,CAAA,EAAG,KAAA,EAAM,OAAO,CAAA;AAAA,sBACvF;AACA,sBAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAM,IAAI,IAAK,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,MAAI,EAAA,IAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,KAAI,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACzH,sBAAA,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK;AACX,wBAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,GAAA,GAAI,EAAA,GAAG,GAAA,GAAI,CAAA,GAAE,GAAA,GAAI,CAAC,CAAA,EAAG;AAEzD,0BAAA,KAAA,CAAM,QAAQ,IAAA,CAAM,EAAE,IAAA,EAAM,CAAA,EAAG,aAAa,IAAA,EAAM,IAAA,EAAM,GAAA,GAAI,EAAA,GAAG,MAAI,CAAA,GAAE,GAAA,GAAI,CAAA,EAAG,KAAA,EAAM,aAAa,CAAA;AAAA,wBACnG;AAAA,sBACJ,CAAC,CAAA;AAAA,oBACL,CAAC,CAAA;AAAA,kBACL,CAAC,CAAA;AACD,kBAAA,aAAA,CAAc,CAAC,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAChC,kBAAA;AAAA,gBACJ,KAAK,KAAA;AACD,kBAAA,IAAI,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACtC,kBAAA,IAAI,OAAA,CAAQ,WAAS,SAAA,EAAW;AAC5B,oBAAA,KAAA,IAAS,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ;AACnC,sBAAA,IAAI,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAO,CAAC,CAAA;AACvD,sBAAA,IAAI,CAAA,GAAI;AAAA,wBACJ,IAAA;AAAA,wBACA,WAAA,EAAc,EAAE,IAAA,KAAO,CAAA;AAAA,wBACvB,MAAM,CAAA,CAAE,IAAA;AAAA,wBACR,4BAAW,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAI,GAAE,WAAA,EAAY;AAAA,wBACzC,IAAA,EAAM,CAAC,CAAA,CAAE,IAAA;AAAA,wBACT,GAAI,EAAE,IAAA,KAAO,CAAA,GAAG,EAAC,KAAA,EAAM,MAAA,KAAQ;AAAC,uBACpC;AACA,sBAAA,IAAI,CAAA,GAAI,MAAM,OAAA,CAAQ,SAAA,CAAU,OAAK,CAAA,CAAE,IAAA,KAAS,EAAE,IAAI,CAAA;AACtD,sBAAA,IAAI,CAAA,IAAG,CAAA;AACH,wBAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAE,CAAA;AAAA;AAEjB,wBAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,oBAC5B;AACA,oBAAA,aAAA,CAAc,CAAC,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,kBACpC,CAAA,MACK;AACD,oBAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAO,OAAA,CAAQ,IAAA,IAAQ,QAAQ,OAAO,CAAA;AAAA,kBAC7E;AACA,kBAAA;AAAA,gBACJ,KAAK,QAAA;AAA2B,kBAAA;AACxB,oBAAA,IAAIC,QAAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACtC,oBAAA,IAAIA,QAAAA,CAAQ,WAAS,SAAA,EAAW,UAAA,CAAY,uBAAuB,KAAA,EAAOA,QAAAA,CAAQ,IAAA,IAAQA,QAAAA,CAAQ,OAAO,CAAA;AAAA,kBAC7G;AACA,kBAAA;AAAA,gBACJ,KAAK,QAAA,eAA2B;AAC5B,kBAAA,IAAIA,QAAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACtC,kBAAA,IAAIA,QAAAA,CAAQ,WAAS,SAAA,EAAW;AAC5B,oBAAA,IAAI,KAAA,GAAQA,SAAQ,QAAA,CAAS,MAAA;AAC7B,oBAAA,KAAA,CAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,KAAK,CAAA;AAC1D,oBAAA,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,KAAA,GAAM,GAAG,CAAC,CAAA;AACvE,oBAAA,aAAA,CAAc,CAAC,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,kBACpC,CAAA,MACK;AACD,oBAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAOA,QAAAA,CAAQ,IAAA,IAAQA,SAAQ,OAAO,CAAA;AAAA,kBAC7E;AACA,kBAAA;AAAA,gBACJ;AAAA,gBACA,KAAK,MAAA;AAAA,gBACL,KAAK,MAAA;AAAA,gBACL,KAAK,QAAA,eAA2B;AAC5B,kBAAA,IAAIA,QAAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACtC,kBAAA,IAAIA,QAAAA,CAAQ,WAAS,SAAA,EAAW;AAE5B,oBAAA,IAAI,CAAA,GAAI;AAAA,sBACJ,IAAA,EAAOA,QAAAA,CAAQ,QAAA,CAAS,MAAA,CAAkB,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAE,CAAC,CAAA;AAAA,sBAChE,WAAA,EAAcA,QAAAA,CAAQ,QAAA,CAAS,IAAA,KAAO,CAAA;AAAA,sBACtC,IAAA,EAAMA,SAAQ,QAAA,CAAS,MAAA;AAAA,sBACvB,SAAA,EAAA,qBAAe,IAAA,CAAK,CAACA,SAAQ,QAAA,CAAS,IAAI,GAAE,WAAA,EAAY;AAAA,sBACxD,IAAA,EAAM,CAACA,QAAAA,CAAQ,QAAA,CAAS,IAAA;AAAA,sBACxB,GAAIA,QAAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAA,KAAO,IAAG,EAAC,KAAA,EAAM,MAAA,EAAM,GAAE;AAAC,qBACxD;AACA,oBAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAC,CAAA;AACpB,oBAAA,aAAA,CAAc,CAAC,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,kBACpC,CAAA,MACK;AACD,oBAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAOA,QAAAA,CAAQ,IAAA,IAAQA,SAAQ,OAAO,CAAA;AAAA,kBAC7E;AACA,kBAAA;AAAA,gBACJ;AAAA;AACJ,YACJ;AACA,YAAA;AAAA;AAEJ,QAAA;AAAA,MACJ;AAAA,MACA,KAAK,uBAAA,CAAwB,MAAA;AACzB,QAAA,IAAI,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAC3C,QAAA,IAAI,aAAA,CAAc,IAAA,KAAS,uBAAA,CAAwB,QAAA,EAAU;AACzD,UAAA,IAAI,aAAA,CAAc,MAAA,KAAW,yBAAA,CAA0B,KAAA,EAAO;AAC1D,YAAA,IAAI,cAAc,IAAA,EAAM,UAAA,CAAW,sBAAA,CAAuB,IAAA,EAAM,cAAc,IAAI,CAAA;AAClF,YAAA,QAAA,CAAS,UAAU,aAAA,CAAc,QAAA;AAAA,UACrC,CAAA,MACK;AACD,YAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,UAC1D;AAAA,QACJ,CAAA,MAAA,IACS,aAAA,CAAc,IAAA,KAAS,uBAAA,CAAwB,WAAA,EAAa;AACjE,UAAA,IAAIF,WAAU,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC9E,UAAA,IAAIA,QAAAA,EAAS;AACT,YAAA,IAAI,SAAA,GAAYA,QAAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AACrD,YAAA,IAAI,SAAA,IAAa,UAAU,OAAA,EAAS;AAChC,cAAA,IAAI,aAAA,CAAc,KAAA,KAAU,sBAAA,CAAuB,GAAA,EAAK;AACpD,gBAAA,IAAI,cAAA,GAAiC;AAAA,kBACjC,MAAM,uBAAA,CAAwB,OAAA;AAAA,kBAC9B,QAAQ,yBAAA,CAA0B,OAAA;AAAA,kBAClC,OAAA,EAAS,SAAA;AAAA,kBACT,MAAM,uBAAA,CAAwB,IAAA;AAAA,kBAC9B,SAAA,EAAW,mBAAmB,SAAS,CAAA;AAAA,kBACvC,UAAU,QAAA,CAAS,OAAA;AAAA,kBACnB,IAAIG,EAAA,EAAK;AAAA,kBACT,OAAA,EAAS,MAAA;AAAA,kBACT,WAAW,aAAA,CAAc,SAAA;AAAA,kBACzB,KAAA,EAAO,EAAA;AAAA,kBACP,KAAK,aAAA,CAAc,GAAA;AAAA,kBACnB,WAAW,aAAA,CAAc,SAAA;AAAA,kBACzB,QAAQ,EAAC;AAAA,kBACT,OAAA,EAAS;AAAA,iBACb;AACA,gBAAA,IAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAW,cAAe,CAAA;AAC7C,gBAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,OAAO,CAAA;AAC3B,gBAAA,IAAI,cAAc,IAAA,EAAM,UAAA,CAAY,sBAAA,CAAuB,IAAA,EAAM,cAAc,IAAI,CAAA;AAAA,cACvF;AAAA,YACJ,CAAA,MACK;AACD,cAAA,UAAA,CAAY,sBAAA,CAAuB,MAAM,4BAA4B,CAAA;AAAA,YACzE;AAAA,UACJ,CAAA,MACK;AACD,YAAA,UAAA,CAAY,sBAAA,CAAuB,MAAM,iBAAiB,CAAA;AAAA,UAC9D;AAAA,QACJ;AACA,QAAA;AAAA,MAEJ;AACI,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAC9C,QAAA;AAAA;AACR,EACJ,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAACC,MAAAA,EAA8B,IAAA,KAAgB;AAC9D,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,UAAUA,MAAAA,EAAO,OAAA,EAAQ,aAAa,CAAA;AACrE,IAAA,iBAAA,CAAmB,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM;AAAA,MACnC,KAAA,EAAAA,MAAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAM,uBAAA,CAAwB;AAAA,KACjC,CAAC,CAAA;AAAA,EACN,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,OAAA,KAAgB;AACxC,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI;AACA,MAAA,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC7C,SACO,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACf,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,IAAI,CAAA;AACxB,MAAA;AAAA,IACJ;AAEA,IAAA,QAAO,gBAAgB,OAAA;AAAS,MAC5B,KAAK,SAAA;AACD,QAAA,qBAAA,CAAsB,OAAO,CAAA;AAC7B,QAAA;AAAA,MACJ;AACI,QAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAO,8BAAA,GAA+B,eAAA,CAAgB,OAAO,CAAA;AAChG,QAAA,UAAA,CAAY,uBAAuB,KAAA,EAAO,mBAAA,GAAoB,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA;AAC7F,QAAA;AAAA;AACR,EACJ,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAiB;AACtC,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,IAAIJ,WAAQ,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAS,mBAAmB,CAAA;AAC9E,IAAA,IAAI,CAACA,QAAAA,EAAS;AACV,MAAA,UAAA,CAAW,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,IAAA,GAAOA,QAAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAAK,OAAK,kBAAA,CAAmB,QAAA,CAASA,EAAAA,CAAE,SAAS,CAAC,CAAA;AAC5E,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,UAAA,CAAW,sBAAA,CAAuB,OAAM,eAAe,CAAA;AACvD,MAAA;AAAA,IACJ;AACA,IAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,CAAc,CAAA;AAC1B,IAAA,IAAI,SAAA,GAAYL,QAAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AACrD,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,IAAI,aAAsB,EAAC;AAC3B,MAAA,IAAI,sBAAA,CAAuB,SAAO,CAAA,EAAG;AACjC,QAAA,KAAA,IAAQ,KAAK,gBAAA,EAAkB;AAC3B,UAAA,KAAA,IAAS,KAAK,sBAAA,EAAwB;AAClC,YAAA,UAAA,CAAW,IAAA,CAAK,CAAA,GAAE,GAAA,GAAI,CAAC,CAAA;AAAA,UAC3B;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAI,OAAA,GAAyB;AAAA,QACzB,OAAA,EAAS,SAAA;AAAA,QACT,SAAS,wBAAA,CAAyB,IAAA;AAAA,QAClC,QAAQ,yBAAA,CAA0B,KAAA;AAAA,QAClC,MAAM,uBAAA,CAAwB,OAAA;AAAA,QAC9B,QAAA,EAAU,EAAA;AAAA,QACV,SAAA,EAAW,mBAAmB,SAAS,CAAA;AAAA,QACvC,KAAA,EAAO,cAAA;AAAA,QACP,MAAO,sBAAA,CAAuB,MAAA,GAAS,CAAA,GAAI,sBAAA,CAAuB,YAAY,sBAAA,CAAuB,GAAA;AAAA,QACrG,SAAA,EAAW,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA;AAAA,QACtC,KAAA,EAAO,EAAA;AAAA,QACP,GAAA,EAAK,iBAAiB,GAAA,CAAI,CAAAK,OAAKA,EAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,QAC1C,SAAA,EAAW,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,QAC9B,MAAM,EAAC;AAAA,QACP,MAAM,uBAAA,CAAwB;AAAA,OAClC;AACA,MAAA,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,IACnC,CAAA,MACK;AACD,MAAA,UAAA,CAAW,sBAAA,CAAuB,OAAM,6CAA6C,CAAA;AACrF,MAAA;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC7B,IAAA,IAAIL,WAAQ,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC5E,IAAA,IAAI,CAACA,QAAAA,EAAS;AACV,MAAA,UAAA,CAAW,sBAAA,CAAuB,OAAM,qBAAqB,CAAA;AAC7D,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI;AACA,MAAA,IAAI,EAAA,GAAK,IAAI,SAAA,CAAUA,QAAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,EAAA,CAAG,MAAA,GAAS,MAAM,eAAA,CAAgB,EAAE,CAAA;AACpC,MAAA,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU,kBAAA,CAAmB,KAAK,CAAA;AAClD,MAAA,EAAA,CAAG,OAAA,GAAU,CAAC,KAAA,KAAU,gBAAA,CAAiB,KAAK,CAAA;AAC9C,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACnB,SACO,GAAA,EAAK;AAAA,IACZ;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,MAAA,KAAe;AACvC,IAAA,OAAA,CAAQ,IAAI,CAAA,eAAA,CAAiB,CAAA;AAC7B,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,MAAA,CAAO,OAAA,GAAQ,KAAA;AACf,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,oBAAoB,MAAM;AAC5B,IAAA,SAAA,EAAW,KAAA,EAAM;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAM;AACxB,IAAA,IAAI,MAAA,GAAO,KAAA;AACX,IAAA,IAAIA,WAAQ,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC5E,IAAA,IAAIA,QAAAA,EAAS;AACT,MAAA,MAAA,GAAS,OAAA,CAAQA,QAAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAC,CAAA;AAAA,IAC3D;AAEA,IAAA,uBAAO,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACH,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,YAAW,EAAG,KAAA,EAAM,MAAA,EAAO,QAAA,EAAU,OAAA,IAAW,CAAC,UAAU,gBAAA,CAAiB,MAAA,KAAW,CAAA,IAAK,CAAC,MAAA,EAAA,kBACpH,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,IAAS,CACd,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,YAAA,EAAc,KAAA,EAAM,SAAQ,QAAA,EAAU,EAAG,OAAA,IAAW,CAAC,MAAA,CAAO,OAAA,IAAY,gBAAA,CAAiB,MAAA,GAAS,CAAA,CAAA,EAAA,kBACnH,KAAA,CAAA,aAAA,CAAC,SAAA,EAAA,IAAU,CACf,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAA,EAAS,WAAA,EAAa,KAAA,EAAM,MAAA,EAAO,QAAA,EAAU,OAAA,IAAW,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAA,kBAC5F,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,IAAS,CACd,CACJ,CAAA;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAiB;AACpC,IAAA,MAAM,IAAA,GAAO,CAACI,MAAAA,KAAiC;AAC3C,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,cAAA,CAAeA,MAAK,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAAyB;AAC1C,MAAA,OAAO,GAAA,GAAM,GAAA,CAAI,MAAA,GAAO,EAAA,GAAI,GAAA,CAAI,UAAU,CAAA,EAAE,EAAE,CAAA,GAAE,KAAA,GAAM,GAAA,GAAO,KAAA;AAAA,IACjE,CAAA;AAEA,IAAA,2CACK,IAAA,EAAA,EAAK,SAAA,EAAS,MAAC,SAAA,EAAU,KAAA,EAAA,sCACrB,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,cAAW,OAAA,EAAQ,IAAA,EAAA,EAAM,YAAY,KAAK,CAAE,CACjD,CAAA,kBACA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,MAAC,KAAA,EAAO,EAAC,WAAU,MAAA,EAAM,EAAA,sCAC9B,UAAA,EAAA,EAAW,KAAA,EAAM,QAAO,QAAA,EAAU,CAAC,eAAe,IAAA,CAAK,CAAA,CAAA,KAAG,EAAE,IAAA,KAAS,uBAAA,CAAwB,UAAU,CAAA,CAAE,KAAA,KAAS,sBAAA,CAAuB,IAAI,GAAG,OAAA,EAAS,MAAM,KAAK,sBAAA,CAAuB,IAAI,qBAC5L,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAE,OAAM,cAAA,CAAe,IAAA,CAAK,OAAG,CAAA,CAAE,IAAA,KAAS,wBAAwB,MAAA,IAAU,CAAA,CAAE,KAAA,KAAS,sBAAA,CAAuB,IAAI,CAAA,GAAE,MAAA,GAAO,WAAS,EAAE,CAC3J,mBACA,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,OAAM,SAAA,EAAU,QAAA,EAAU,CAAC,cAAA,CAAe,IAAA,CAAK,OAAG,CAAA,CAAE,IAAA,KAAS,wBAAwB,MAAA,IAAU,CAAA,CAAE,KAAA,KAAS,sBAAA,CAAuB,OAAO,CAAA,EAAG,OAAA,EAAS,MAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA,EAAG,KAAA,EAAO,EAAC,UAAA,EAAW,SAAO,EAAA,kBAClO,KAAA,CAAA,aAAA,CAAC,eAAY,KAAA,EAAO,EAAE,OAAM,cAAA,CAAe,IAAA,CAAK,CAAA,CAAA,KAAG,CAAA,CAAE,SAAS,uBAAA,CAAwB,MAAA,IAAU,EAAE,KAAA,KAAS,sBAAA,CAAuB,OAAO,CAAA,GAAE,QAAA,GAAS,WAAS,EAAE,CACnK,mBACA,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,OAAM,OAAA,EAAQ,QAAA,EAAU,CAAC,cAAA,CAAe,IAAA,CAAK,CAAA,CAAA,KAAG,CAAA,CAAE,SAAS,uBAAA,CAAwB,MAAA,IAAU,EAAE,KAAA,KAAS,sBAAA,CAAuB,KAAK,CAAA,EAAG,OAAA,EAAS,MAAM,IAAA,CAAK,uBAAuB,KAAK,CAAA,EAAG,OAAO,EAAC,UAAA,EAAW,SAAO,EAAA,kBAC5N,KAAA,CAAA,aAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,EAAE,KAAA,EAAM,cAAA,CAAe,KAAK,CAAA,CAAA,KAAG,CAAA,CAAE,SAAS,uBAAA,CAAwB,MAAA,IAAU,EAAE,KAAA,KAAS,sBAAA,CAAuB,KAAK,CAAA,GAAE,KAAA,GAAM,WAAS,EAAE,CAC5J,CACJ,CACJ,CAAA;AAAA,EAER,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAACA,MAAAA,KAAkC;AACnD,IAAA,iBAAA,CAAkB,eAAe,MAAA,CAAO,CAAA,CAAA,KAAI,CAAA,CAAE,KAAA,KAAQA,MAAK,CAAC,CAAA;AAC5D,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAACE,MAAAA,EAAe,KAAA,KAAqB;AACjD,IAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAOA,MAAAA,CAAM,OAAO,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAiB,OAAA,KAAoB;AACnD,IAAA,IAAI,CAAC,SAAA,EAAU,GAAA,EAAI,SAAS,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AAE5D,IAAA,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAQ,OAAK,CAAA,CAAE,IAAA,KAAO,KAAK,IAAI,CAAA;AAC7D,IAAA,aAAA,CAAc,CAAC,GAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAChC,IAAA,WAAA,CAAY,QAAA,eAA2B,WAAW,GAAA,EAAK,SAAA,EAAW,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EAC1F,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AACpB,IAAA,IAAI,SAAS,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAS,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,WAAA,GAAY,GAAG,CAAC,CAAA;AAE/E,MAAA,WAAA,CAAY,cAAY,GAAG,CAAA;AAAA,IAC/B,CAAA,MACK;AACD,MAAA,WAAA,CAAY,MAAA,aAAyB,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACvD;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAAkB;AACnC,IAAA,IAAIN,WAAU,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC9E,IAAA,IAAIA,QAAAA,EAAS;AACT,MAAA,IAAI,SAAA,GAAYA,QAAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AACrD,MAAA,IAAI,SAAA,IAAa,QAAA,EAAU,OAAA,IAAW,SAAA,EAAW;AAC7C,QAAA,IAAI,CAAC,SAAA,EAAU,GAAA,EAAI,SAAS,CAAA,GAAI,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACzD,QAAA,IAAI,cAAA,GAAiC;AAAA,UACjC,MAAM,uBAAA,CAAwB,OAAA;AAAA,UAC9B,QAAQ,yBAAA,CAA0B,OAAA;AAAA,UAClC,OAAA,EAAS,SAAA;AAAA,UACT,MAAM,uBAAA,CAAwB,IAAA;AAAA,UAC9B,SAAA,EAAW,mBAAmB,SAAS,CAAA;AAAA,UACvC,UAAU,QAAA,CAAS,OAAA;AAAA,UACnB,IAAIG,EAAA,EAAK;AAAA,UACT,OAAA,EAAS,KAAA;AAAA,UACT,SAAA;AAAA,UACA,KAAA,EAAO,EAAA;AAAA,UACP,GAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,UACf,OAAA,EAAS;AAAA,SACb;AACA,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAC3C,QAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,cAAc,CAAC,OAAA,EAA6B,SAAA,EAAkB,GAAA,EAAY,WAAmB,MAAA,KAAoB;AACnH,IAAA,IAAIH,WAAU,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC9E,IAAA,IAAIA,QAAAA,EAAS;AACT,MAAA,IAAI,SAAA,GAAYA,QAAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AACrD,MAAA,IAAI,SAAA,IAAa,QAAA,EAAU,OAAA,IAAW,SAAA,EAAW;AAC7C,QAAA,IAAI,cAAA,GAAiC;AAAA,UACjC,MAAM,uBAAA,CAAwB,OAAA;AAAA,UAC9B,QAAQ,yBAAA,CAA0B,OAAA;AAAA,UAClC,OAAA,EAAS,SAAA;AAAA,UACT,MAAM,uBAAA,CAAwB,IAAA;AAAA,UAC9B,SAAA,EAAW,mBAAmB,SAAS,CAAA;AAAA,UACvC,UAAU,QAAA,CAAS,OAAA;AAAA,UACnB,IAAIG,EAAA,EAAK;AAAA,UACT,OAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAA,EAAO,EAAA;AAAA,UACP,GAAA;AAAA,UACA,SAAA;AAAA,UACA,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACb;AACA,QAAA,IAAI,OAAA,GAAU,IAAA,CAAK,SAAA,CAAW,cAAe,CAAA;AAC7C,QAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,MAC1B,CAAA,MACK;AACD,QAAA,UAAA,CAAY,sBAAA,CAAuB,OAAO,4BAA4B,CAAA;AAAA,MAC1E;AAAA,IACJ,CAAA,MACK;AACD,MAAA,UAAA,CAAY,sBAAA,CAAuB,OAAO,iBAAiB,CAAA;AAAA,IAC/D;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,aAAA,KAA+B;AACnD,IAAA,KAAA,IAAS,QAAQ,aAAA,EAAe;AAC5B,MAAA,IAAI,CAAC,SAAA,EAAU,GAAA,EAAI,SAAS,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AAC5D,MAAA,WAAA,CAAY,uBAA2B,SAAA,EAAW,GAAA,EAAK,WAAW,CAAC,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACjF;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAO,IAAA,EAAc,YAAA,KAA4B;AACpE,IAAA,IAAI,CAAC,SAAA,EAAU,GAAA,EAAI,SAAS,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACpE,IAAA,WAAA,CAAY,QAAA,eAA2B,WAAW,GAAA,EAAK,SAAA,EAAW,CAAC,YAAA,CAAa,IAAA,GAAO,GAAA,GAAM,IAAI,CAAC,CAAA;AAAA,EACtG,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,eAAA,KAAsC;AAC5D,IAAA,IAAIH,WAAU,aAAA,CAAc,IAAA,CAAK,CAAAA,QAAAA,KAAWA,QAAAA,CAAQ,SAAO,mBAAmB,CAAA;AAC9E,IAAA,IAAIA,QAAAA,EAAS;AACT,MAAA,IAAI,SAAA,GAAYA,QAAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AACrD,MAAA,IAAI,SAAA,EAAW;AAEX,QAAA,KAAA,IAAS,QAAQ,eAAA,EAAiB;AAC9B,UAAA,MAAM,GAAA,GAAM,GAAGA,QAAAA,CAAQ,GAAG,iCAAiC,QAAA,CAAS,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,CAAA;AAEjG,UAAA,IAAI;AACA,YAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,EAAE,eAAA,EAAiB,SAAA,GAAW,kBAAA,CAAmB,SAAS,CAAA,IAAK,CAAA;AAE5G,YAAA,IAAI,SAAS,EAAA,EAAI;AACb,cAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,cAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,cAAA,IAAA,CAAK,IAAA,GAAO,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,cAAA,IAAA,CAAK,QAAA,GAAW,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA;AAChD,cAAA,IAAI,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,QAAA,IAAY,SAAA;AACvC,cAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,cAAA,IAAA,CAAK,KAAA,EAAM;AACX,cAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,cAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,IAAI,CAAA;AAAA,YACjC,CAAA,MACK;AACD,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACpD,cAAA,UAAA,CAAY,sBAAA,CAAuB,KAAA,EAAO,CAAA,uBAAA,EAA0B,IAAA,CAAK,IAAI,CAAA,GAAA,EAAM,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,YAClI;AAAA,UACJ,SACOM,MAAAA,EAAO;AACV,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,IAAI,IAAIA,MAAK,CAAA;AAC3D,YAAA,UAAA,CAAY,uBAAuB,KAAA,EAAO,CAAA,uBAAA,EAA0B,KAAK,IAAI,CAAA,EAAA,EAAKA,MAAK,CAAA,CAAE,CAAA;AAAA,UAC7F;AAAA,QACJ;AAAA,MACJ,CAAA,MACK;AACD,QAAA,UAAA,CAAY,sBAAA,CAAuB,OAAO,4BAA4B,CAAA;AAAA,MAC1E;AAAA,IACJ,CAAA,MACK;AACD,MAAA,UAAA,CAAY,sBAAA,CAAuB,OAAO,iBAAiB,CAAA;AAAA,IAC/D;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,YAAA,EAAgC,UAAA,EAAsB,SAAA,KAAqB;AACxF,IAAA,IAAI,OAAA,GAAU,SAAA,KAAY,MAAA,GAAQ,MAAA,cAA0B,MAAA;AAC5D,IAAA,KAAA,IAAS,QAAQ,YAAA,EAAc;AAC3B,MAAA,IAAI,CAAC,SAAA,EAAU,GAAA,EAAI,SAAS,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AAC5D,MAAA,WAAA,CAAY,OAAA,EAAS,WAAW,GAAA,EAAK,SAAA,EAAW,CAAC,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IAChF;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAkB;AACtC,IAAA,cAAA,CAAe,MAAM,CAAA;AACrB,IAAA,MAAA,IAAS,GAAA;AACT,IAAA,IAAIF,MAAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,MAAA,GAAS,CAAA;AACvC,IAAA,IAAIA,MAAAA,GAAQ,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,EAAiB,aAAA,KAA6B;AACnE,IAAA,OAAO,EAAE,QAAA,EAAU,WAAA,GAAc,GAAA,GAAM,KAAK,IAAA,EAAK;AAAA,EACrD,CAAA;AAEA,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAEF,2BAAW,KAAA,CAAA,aAAA,CAAC,QAAA,EAAA,IAAQ,GAErB,CAAC,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,OAAA,IAAW,yBACvC,KAAA,CAAA,aAAA,CAAC,YAAA,EAAA,EAAa,OAAO,sEAAA,EAAwE,OAAA,EAAS,OAAO,OAAA,EAAS,CAAA,EAGzH,CAAC,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,OAAA,oBAC5B,KAAA,CAAA,aAAA,CAAC,+BAA4B,WAAA,EAAY,kDAAA,EAAmD,YAAY,CAAC,uCAAA,EAAyC,6CAA6C,CAAA,EAAE,CAAA,EAGnM,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,WAAW,aAAA,IAAiB,aAAA,CAAc,WAAS,CAAA,oBAC/E,KAAA,CAAA,aAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,SAAA,CAAU,WAAA,EAAa,QAAe,CAAA,EAGlE,iBAAA,CAAkB,MAAM,CAAA,IAAK,CAAC,WAAW,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAO,CAAA,IAAK,aAAA,CAAc,MAAA,CAAO,CAAC,GAAA,EAAIJ,QAAAA,KAAY,MAAIA,QAAAA,CAAQ,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAI,CAAA,oBACtJ,KAAA,CAAA,aAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,UAAU,OAAA,EAAS,MAAA,EAAe,GAG9D,iBAAA,CAAkB,MAAM,KAAK,CAAC,OAAA,IAAW,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAO,CAAA,IAAK,cAAc,MAAA,CAAO,CAAC,GAAA,EAAIA,QAAAA,KAAY,GAAA,GAAIA,QAAAA,CAAQ,KAAK,MAAA,EAAQ,CAAC,CAAA,GAAE,CAAA,oBACpJ,KAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,IAAI,EAAE,OAAA,EAAS,QAAQ,MAAA,EAAO,MAAA,sBAC/B,KAAA,CAAA,aAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,KAAA,EAAO,OAAA,EAAS,UAAS,OAAA,EAAO,EAAA,sCACtC,IAAA,EAAA,EAAK,SAAA,EAAS,MAAC,SAAA,EAAU,QAAA,EAAA,kBACtB,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,sCACL,IAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAC,eAAY,SAAA,EAAW,aAAA,EAAe,qBAA0C,QAAA,EAAU,eAAA,EAAgB,CAC/G,CACJ,CAAA,EACC,CAAC,MAAM,WAAA,oBACJ,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAA,kBACN,KAAA,CAAA,aAAA,CAAC,4BACG,KAAA,CAAA,aAAA,CAAC,UAAA,EAAA,EAAW,cAAA,EAAgB,WAAA,EAAa,cAAA,EAAgC,UAAA,EAAY,SAAQ,CACjG,CACJ,CAER,CACJ,CAAA,sCAEC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,QAAA,EAAU,CAAA,EAAG,IAAA,EAAK,GAAG,QAAA,EAAS,QAAA,EAAU,GAAE,CAAA,EAAG,UAAA,EAAW,OAAM,EAAA,EAEnE,CAAC,mBAAA,oBACC,KAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,mBAAmB,GAAA,EAAI,qBAAA,EAAsB,OAAO,EAAE,IAAA,EAAK,OAAO,SAAA,EAAU,KAAA,EAAO,KAAA,EAAM,KAAA,EAAO,QAAA,EAAS,UAAA,IAAc,CAAA,EAGnI,mBAAA,oBAAuB,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACrB,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAE,SAAA,EAAU,EAAA,EAAI,YAAA,EAAa,KAAA,EAAM,EAAA,kBAC5C,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAO,cAAc,mBAAmB,CAAA;AAAA,MACxC,OAAO,EAAC,SAAA,EAAU,IAAI,YAAA,EAAa,CAAA,EAAG,YAAW,CAAA,EAAC;AAAA,MAClD,QAAQ,aAAA;AAAc;AAAA,GAE9B,CAAA,EACE,OAAA,oBAAW,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,EAAC,MAAA,EAAQ,CAAA,aAAA,EAAgB,aAAa,cAAY,EAAA,kBAC5F,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACD,WAAW,MAAA,CAAO,QAAA;AAAA,MAClB,KAAA,EAAO,UAAA;AAAA,MACP,eAAA,EAAgB,4BAAA;AAAA,MAChB,YAAA,EAAa,SAAA;AAAA,MACb,UAAA,EAAW,wDAAA;AAAA,MACX,MAAA,EAAO,MAAA;AAAA,MACP,OAAA,sBAAa,GAAA,EAAI;AAAA,MACjB,KAAA,sBAAW,GAAA,EAAI;AAAA,MACf,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA,MACA,UAAA;AAAA,MACA,iBAAA,EAAmB,KAAA;AAAA,MACnB,WAAA,EAAa,EAAA;AAAA,MACb;AAAA;AAAA,GAEJ,CACJ,CACJ,CACJ,CAAA,EAEF,gBAAA,wCAAqB,SAAA,EAAA,EAAU,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAK,GAAG,cAAA,EAAgC,OAAA,EAAS,aAAY,CACzJ,CAAA;AACJ;;;;"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../node_modules/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = ".file-explorer {\r\n box-shadow: 0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12);\r\n border-radius: 4px;\r\n min-height: 150px;\r\n border: 0\r\n}\r\n\r\n.file-explorer .toolbar {\r\n min-height: 46px;\r\n}\r\n\r\n.file-explorer .breadcrumb {\r\n padding-top: 10px;\r\n min-height: 36px;\r\n}\r\n\r\n.file-explorer .statusbar {\r\n padding-top: 4px;\r\n}\r\n";
4
+ var styles = {};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=custom-fm.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-fm.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,45 @@
1
+ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
2
+ import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';
3
+ import { Entity } from '@backstage/catalog-model';
4
+ import { InstanceConfigScopeEnum } from '@jfvilas/kwirth-common';
5
+ import { ClusterValidPods, IBackendInfo } from '@jfvilas/plugin-kwirth-common';
6
+
7
+ interface IEntityKwirthFilemanProps {
8
+ }
9
+
10
+ declare const kwirthFilemanPlugin: _backstage_core_plugin_api.BackstagePlugin<{
11
+ root: _backstage_core_plugin_api.RouteRef<undefined>;
12
+ }, {}, {}>;
13
+ declare const EntityKwirthFilemanContent: (props: IEntityKwirthFilemanProps) => JSX.Element;
14
+
15
+ interface KwirthFilemanApi {
16
+ getResources(entity: Entity): Promise<any>;
17
+ requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
18
+ getVersion(): Promise<any>;
19
+ getInfo(): any;
20
+ }
21
+ declare const kwirthFilemanApiRef: _backstage_core_plugin_api.ApiRef<KwirthFilemanApi>;
22
+
23
+ interface KwirthFilemanClientOptions {
24
+ discoveryApi: DiscoveryApi;
25
+ fetchApi: FetchApi;
26
+ }
27
+ declare class KwirthFilemanClient implements KwirthFilemanApi {
28
+ private readonly discoveryApi;
29
+ private readonly fetchApi;
30
+ constructor(options: KwirthFilemanClientOptions);
31
+ /**
32
+ *
33
+ * @param entity
34
+ * @returns an array of clusters (with their correpsonding info) and a pod list for each, where the entity has been dicovered
35
+ */
36
+ getVersion(): Promise<string>;
37
+ getInfo(): Promise<IBackendInfo>;
38
+ getResources(entity: Entity): Promise<ClusterValidPods>;
39
+ requestAccess(entity: Entity, channel: string, scopes: InstanceConfigScopeEnum[]): Promise<ClusterValidPods[]>;
40
+ }
41
+
42
+ declare const VERSION = "0.13.4";
43
+
44
+ export { EntityKwirthFilemanContent, KwirthFilemanClient, VERSION, kwirthFilemanApiRef, kwirthFilemanPlugin };
45
+ export type { KwirthFilemanApi, KwirthFilemanClientOptions };
@@ -0,0 +1,4 @@
1
+ export { EntityKwirthFilemanContent, kwirthFilemanPlugin } from './plugin.esm.js';
2
+ export { KwirthFilemanClient } from './api/KwirthFilemanClient.esm.js';
3
+ export { kwirthFilemanApiRef } from './api/types.esm.js';
4
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,29 @@
1
+ function styleInject(css, ref) {
2
+ if ( ref === void 0 ) ref = {};
3
+ var insertAt = ref.insertAt;
4
+
5
+ if (typeof document === 'undefined') { return; }
6
+
7
+ var head = document.head || document.getElementsByTagName('head')[0];
8
+ var style = document.createElement('style');
9
+ style.type = 'text/css';
10
+
11
+ if (insertAt === 'top') {
12
+ if (head.firstChild) {
13
+ head.insertBefore(style, head.firstChild);
14
+ } else {
15
+ head.appendChild(style);
16
+ }
17
+ } else {
18
+ head.appendChild(style);
19
+ }
20
+
21
+ if (style.styleSheet) {
22
+ style.styleSheet.cssText = css;
23
+ } else {
24
+ style.appendChild(document.createTextNode(css));
25
+ }
26
+ }
27
+
28
+ export { styleInject as default };
29
+ //# sourceMappingURL=style-inject.es.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-inject.es.esm.js","sources":["../../../../../../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAY,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;","x_google_ignoreList":[0]}
@@ -0,0 +1,33 @@
1
+ import { KwirthFilemanClient } from './api/KwirthFilemanClient.esm.js';
2
+ import { kwirthFilemanApiRef } from './api/types.esm.js';
3
+ import { createPlugin, createApiFactory, fetchApiRef, discoveryApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
4
+ import { rootRouteRef } from './routes.esm.js';
5
+
6
+ const kwirthFilemanPlugin = createPlugin({
7
+ id: "kwirthfileman",
8
+ apis: [
9
+ createApiFactory({
10
+ api: kwirthFilemanApiRef,
11
+ deps: {
12
+ discoveryApi: discoveryApiRef,
13
+ fetchApi: fetchApiRef
14
+ },
15
+ factory({ discoveryApi, fetchApi }) {
16
+ return new KwirthFilemanClient({ discoveryApi, fetchApi });
17
+ }
18
+ })
19
+ ],
20
+ routes: {
21
+ root: rootRouteRef
22
+ }
23
+ });
24
+ const EntityKwirthFilemanContent = kwirthFilemanPlugin.provide(
25
+ createRoutableExtension({
26
+ name: "EntityKwirthFilemanContent",
27
+ component: () => import('./components/EntityKwirthFilemanContent.esm.js').then((m) => m.EntityKwirthFilemanContent),
28
+ mountPoint: rootRouteRef
29
+ })
30
+ );
31
+
32
+ export { EntityKwirthFilemanContent, kwirthFilemanPlugin };
33
+ //# sourceMappingURL=plugin.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\n\r\nimport { kwirthFilemanApiRef, KwirthFilemanClient } from './api'\r\nimport { createApiFactory, createPlugin, createRoutableExtension } from '@backstage/core-plugin-api'\r\nimport { discoveryApiRef, fetchApiRef } from '@backstage/core-plugin-api'\r\nimport { rootRouteRef } from './routes'\r\nimport { IEntityKwirthFilemanProps } from './components/EntityKwirthFilemanContent'\r\n\r\nexport const kwirthFilemanPlugin = createPlugin({\r\n id: 'kwirthfileman', \r\n apis: [\r\n createApiFactory({\r\n api: kwirthFilemanApiRef,\r\n deps: {\r\n discoveryApi: discoveryApiRef,\r\n fetchApi: fetchApiRef,\r\n },\r\n factory({ discoveryApi, fetchApi }) {\r\n return new KwirthFilemanClient({ discoveryApi, fetchApi });\r\n },\r\n }),\r\n ],\r\n routes: {\r\n root: rootRouteRef\r\n }\r\n})\r\n\r\nexport const EntityKwirthFilemanContent : (props: IEntityKwirthFilemanProps) => JSX.Element = kwirthFilemanPlugin.provide(\r\n createRoutableExtension({\r\n name: 'EntityKwirthFilemanContent',\r\n component: () =>\r\n import('./components/EntityKwirthFilemanContent').then(m => m.EntityKwirthFilemanContent as (props: IEntityKwirthFilemanProps) => JSX.Element),\r\n mountPoint: rootRouteRef\r\n })\r\n)\r\n"],"names":[],"mappings":";;;;;AAsBO,MAAM,sBAAsB,YAAA,CAAa;AAAA,EAC9C,EAAA,EAAI,eAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,mBAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAS,EAAG;AAClC,QAAA,OAAO,IAAI,mBAAA,CAAoB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,MAC3D;AAAA,KACD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,6BAAiF,mBAAA,CAAoB,OAAA;AAAA,EAChH,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,4BAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,gDAAyC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,0BAA+E,CAAA;AAAA,IAC/I,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
@@ -0,0 +1,8 @@
1
+ import { createRouteRef } from '@backstage/core-plugin-api';
2
+
3
+ const rootRouteRef = createRouteRef({
4
+ id: "kwirthfileman"
5
+ });
6
+
7
+ export { rootRouteRef };
8
+ //# sourceMappingURL=routes.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["/*\r\nCopyright 2024 Julio Fernandez\r\n\r\nLicensed under the Apache License, Version 2.0 (the \"License\");\r\nyou may not use this file except in compliance with the License.\r\nYou may obtain a copy of the License at\r\n\r\n http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nUnless required by applicable law or agreed to in writing, software\r\ndistributed under the License is distributed on an \"AS IS\" BASIS,\r\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\nSee the License for the specific language governing permissions and\r\nlimitations under the License.\r\n*/\r\nimport { createRouteRef } from '@backstage/core-plugin-api'\r\n\r\nexport const rootRouteRef = createRouteRef({\r\n id: 'kwirthfileman',\r\n})\r\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;;;;"}
@@ -0,0 +1,4 @@
1
+ const VERSION = "0.13.5";
2
+
3
+ export { VERSION };
4
+ //# sourceMappingURL=version.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.esm.js","sources":["../src/version.ts"],"sourcesContent":["export const VERSION:string=\"0.13.5\"; \r\n"],"names":[],"mappings":"AAAO,MAAM,OAAA,GAAe;;;;"}
package/package.json ADDED
@@ -0,0 +1,90 @@
1
+ {
2
+ "name": "@jfvilas/plugin-kwirth-fileman",
3
+ "version": "0.13.5",
4
+ "description": "Frontend plugin for doing visual file management on Kubernetes containers",
5
+ "keywords": [
6
+ "Backstage",
7
+ "Kubernetes",
8
+ "file",
9
+ "observability",
10
+ "Kwirth",
11
+ "plugin"
12
+ ],
13
+ "backstage": {
14
+ "role": "frontend-plugin",
15
+ "pluginId": "kwirth",
16
+ "pluginPackages": [
17
+ "@jfvilas/plugin-kwirth-fileman",
18
+ "@jfvilas/plugin-kwirth-frontend",
19
+ "@jfvilas/plugin-kwirth-backend",
20
+ "@jfvilas/plugin-kwirth-common"
21
+ ]
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/jfvilas/plugin-kwirth-fileman.git"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "license": "Apache-2.0",
31
+ "author": {
32
+ "name": "Julio Fernandez",
33
+ "url": "https://github.com/jfvilas",
34
+ "email": "jfvilas@outlook.com"
35
+ },
36
+ "sideEffects": false,
37
+ "exports": {
38
+ ".": {
39
+ "import": "./dist/index.esm.js",
40
+ "types": "./dist/index.d.ts",
41
+ "default": "./dist/index.esm.js"
42
+ },
43
+ "./package.json": "./package.json"
44
+ },
45
+ "main": "./dist/index.esm.js",
46
+ "types": "./dist/index.d.ts",
47
+ "files": [
48
+ "dist"
49
+ ],
50
+ "scripts": {
51
+ "build": "backstage-cli package build",
52
+ "clean": "backstage-cli package clean",
53
+ "lint": "backstage-cli package lint",
54
+ "prepack": "backstage-cli package prepack",
55
+ "postpack": "backstage-cli package postpack",
56
+ "start": "backstage-cli package start",
57
+ "test": "backstage-cli package test"
58
+ },
59
+ "dependencies": {
60
+ "@backstage/catalog-model": "^1.5.0",
61
+ "@backstage/core-components": "^0.14.9",
62
+ "@backstage/core-plugin-api": "^1.9.3",
63
+ "@backstage/frontend-plugin-api": "^0.7.0",
64
+ "@backstage/integration-react": "^1.1.29",
65
+ "@backstage/plugin-auth-react": "^0.1.4",
66
+ "@backstage/plugin-catalog-react": "^1.12.2",
67
+ "@material-ui/core": "^4.12.2",
68
+ "@material-ui/icons": "^4.9.1",
69
+ "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
70
+ "react-use": "^17.2.4"
71
+ },
72
+ "devDependencies": {
73
+ "@backstage/cli": "^0.26.11",
74
+ "@testing-library/dom": "^10.0.0",
75
+ "@testing-library/jest-dom": "^6.0.0",
76
+ "@testing-library/react": "^15.0.0",
77
+ "@types/lodash": "^4.14.151",
78
+ "@types/react-dom": "^18.2.19",
79
+ "canvas": "^2.11.2",
80
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0",
81
+ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
82
+ "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
83
+ },
84
+ "peerDependencies": {
85
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0",
86
+ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
87
+ "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
88
+ },
89
+ "module": "./dist/index.esm.js"
90
+ }