{"version":3,"file":"FileReference-DcLQze-v.js","sources":["../src/modules/mng-custom-reports/WebMethods.ts","../src/components/file-io/FileReference.ts"],"sourcesContent":["import { z } from 'zod'\r\nimport { generateUUID } from '../../functions/generateUUID'\r\n\r\nexport type ReportDefinitionType = z.infer\r\nexport const ReportDefinitionType = z.enum(['Metadata', 'StaticDocument', 'SSRS'])\r\nexport type KeyValuePair = z.infer\r\nexport const KeyValuePair = z.object({\r\n Key: z.string(),\r\n Value: z.string().nullable(),\r\n})\r\nexport type ReportDefinitionDto = z.infer\r\nexport const ReportDefinitionDto = z.object({\r\n // Local use only\r\n _Id: z.string(),\r\n\r\n // For identifying necessary fields\r\n Type: ReportDefinitionType,\r\n \r\n // For: Metadata\r\n Expiry: z.coerce.date().optional().nullable(),\r\n ExportFileName: z.string().optional().nullable(),\r\n\r\n // For: StaticDocument\r\n DocumentPath: z.string().optional().nullable(),\r\n \r\n // For: SSRS\r\n ReportName: z.string().optional().nullable(),\r\n Parameters: KeyValuePair.array().optional().nullable(),\r\n\r\n // For: Reflection\r\n MethodDefinition: z.string().optional().nullable(),\r\n})\r\n\r\nexport type SSRSReportParameterType = z.infer\r\nexport const SSRSReportParameterType = z.enum(['Boolean', 'DateTime', 'Integer', 'Float', 'String']);\r\nexport type SSRSReportParameterVisibility = z.infer\r\nexport const SSRSReportParameterVisibility = z.enum(['Visible', 'Hidden', 'Internal'])\r\nexport const SSRSReportParameterState = z.enum(['HasValidValue', 'MissingValidValue', 'HasOutstandingDependencies', 'DynamicValuesUnavailable'])\r\n\r\nexport type SSRSReportParameterDefinition = z.infer\r\nexport const SSRSReportParameterDefinition = z.object({\r\n Name: z.string(),\r\n ParameterType: SSRSReportParameterType,\r\n ParameterVisibility: SSRSReportParameterVisibility,\r\n ParameterState: SSRSReportParameterState,\r\n ValidValues: z.object({\r\n Label: z.string(),\r\n Value: z.string(),\r\n }).array(),\r\n Nullable: z.boolean(),\r\n AllowBlank: z.boolean(),\r\n MultiValue: z.boolean(),\r\n Prompt: z.string().nullable(),\r\n Dependencies: z.string().array(),\r\n DefaultValues: z.string().nullable().array(),\r\n})\r\n\r\nexport type SSRSReport = z.infer\r\nexport const SSRSReport = z.object({\r\n Id: z.string().uuid(),\r\n Name: z.string(),\r\n Description: z.string().nullable(),\r\n Path: z.string(),\r\n Size: z.number().int().positive(),\r\n ModifiedBy: z.string(),\r\n ModifiedDate: z.coerce.date(),\r\n CreatedBy: z.string(),\r\n CreatedDate: z.coerce.date(),\r\n ParameterDefinitions: SSRSReportParameterDefinition.array(),\r\n})\r\n\r\nexport type StaticDocumentOption = z.infer\r\nexport const StaticDocumentOption = z.object({\r\n DocumentName: z.string(),\r\n DocumentPath: z.string(),\r\n})\r\n\r\nexport type ReflectionMethodParameterOption = z.infer\r\nexport const ReflectionMethodParameterOption = z.object({\r\n Name: z.string(),\r\n ClrType: z.string(),\r\n})\r\n\r\nexport type ReflectionMethodOption = z.infer\r\nexport const ReflectionMethodOption = z.object({\r\n MethodDefinition: z.string(),\r\n DisplayName: z.string(),\r\n Parameters: ReflectionMethodParameterOption.array(),\r\n})\r\n\r\nexport class ReportsAPI {\r\n baseURL: URL;\r\n constructor(base: URL) {\r\n this.baseURL = base;\r\n }\r\n\r\n public async GetReports(): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/Reports/GetReports`);\r\n const data = await res.json();\r\n return await SSRSReport.array().parseAsync(data);\r\n }\r\n public async GetStaticDocuments(): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/Reports/GetStaticDocuments`);\r\n const data = await res.json();\r\n return await StaticDocumentOption.array().parseAsync(data);\r\n }\r\n public async GetEligibleReflectionMethods(): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/Reports/GetEligibleReflectionMethods`);\r\n const data = await res.json();\r\n return await ReflectionMethodOption.array().parseAsync(data);\r\n }\r\n public async EncodeReportDefinition(definitions: ReportDefinitionDto[]): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/Reports/EncodeReportDefinition`, {\r\n method: 'POST',\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(definitions),\r\n });\r\n const data = await res.json();\r\n const parsed = await z.object({ Encoded: z.string() }).parseAsync(data);\r\n return parsed.Encoded;\r\n }\r\n public async DecodeReportDefinition(definition: string): Promise {\r\n const params = new URLSearchParams({\r\n });\r\n const res = await fetch(`${this.baseURL.href}/api/Reports/DecodeReportDefinition?${params.toString()}`, {\r\n method: 'POST',\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(definition),\r\n });\r\n const data = await res.json();\r\n // The server doesn't have an \"_Id\" field, so we need to add one ourselves\r\n const parsed = await ReportDefinitionDto.partial({ _Id: true }).array().parseAsync(data)\r\n for(let i = 0; i < parsed.length; i++) {\r\n parsed[i]._Id = generateUUID();\r\n }\r\n return await ReportDefinitionDto.array().parseAsync(parsed)\r\n }\r\n /** Returns a FileReferenceID */\r\n public async RunReport(definition: string): Promise {\r\n const params = new URLSearchParams({\r\n interactive: 'false',\r\n });\r\n const res = await fetch(`${this.baseURL.href}/api/Reports/RunReport?${params.toString()}`, {\r\n method: 'POST',\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(definition),\r\n redirect: 'manual'\r\n });\r\n const data = await res.json();\r\n const parsed = await z.object({ FileReferenceID: z.string() }).parseAsync(data);\r\n return parsed.FileReferenceID;\r\n }\r\n}\r\n","\r\nimport { z } from 'zod'\r\nimport { mean } from 'lodash'\r\nimport { parse } from '@tinyhttp/content-disposition'\r\nimport { formatBytes } from '../../functions/format_bytes'\r\nimport { isNullish } from '../../functions/nullish'\r\nimport { ApiErrorSchema } from '../../modules/mng-dare-import/WebMethods'\r\nimport type { Mutex } from 'async-mutex'\r\n\r\nexport type FileReferenceClientStatus = z.infer\r\nexport const FileReferenceClientStatus = z.enum([\r\n 'InvalidFileReferenceID',\r\n 'TemporaryDowntime',\r\n 'Cancelled',\r\n 'MissingContent',\r\n 'Complete'\r\n])\r\nexport type FileReferenceMetadata = z.infer\r\nexport const FileReferenceMetadata = z.object({\r\n FileReferenceID: z.string(),\r\n Status: FileReferenceClientStatus,\r\n EstimatedFileSize: z.number().positive().nullable(),\r\n ContentDownloadUrl: z.string().url().nullable(),\r\n FileName: z.string().nullable(),\r\n CreationDate: z.coerce.date().nullable(),\r\n})\r\n\r\nexport type FileReferenceGroupStatus = z.infer\r\nexport const FileReferenceGroupStatus = z.enum([\r\n 'Open',\r\n 'Closed',\r\n])\r\nexport type FileReferenceGroupMetadata = z.infer\r\nexport const FileReferenceGroupMetadata = z.object({\r\n Status: FileReferenceGroupStatus,\r\n FileCountLimit: z.number().gte(0),\r\n FileSizeLimit: z.number().gte(0).nullable(),\r\n RemainingFiles: z.number().gte(0),\r\n FileReferences: z.string().array(),\r\n})\r\n\r\nexport type ContentRangeDto = z.infer\r\nexport const ContentRangeDto = z.object({\r\n // Start: z.bigint().positive(),\r\n // End: z.bigint().positive(),\r\n // Length: z.bigint().positive(),\r\n Start: z.number().gte(0),\r\n End: z.number().positive(),\r\n Length: z.number().positive(),\r\n})\r\n\r\nexport function FormatContentRange(range: ContentRangeDto): string {\r\n return `bytes ${range.Start}-${range.End}/${range.Length}`;\r\n}\r\n\r\nexport const UploadPlanType = z.enum([\r\n 'ProxiedChunks',\r\n 'DirectAzureBlobStorage',\r\n]);\r\nexport type UploadPlanDto = z.infer\r\nexport const UploadPlanDto = z.intersection(\r\n z.object({\r\n Method: UploadPlanType,\r\n FileSizeLimitBytes: z.number().gte(0),\r\n Segments: ContentRangeDto.array(),\r\n }),\r\n z.discriminatedUnion('Method', [\r\n z.object({\r\n Method: z.literal('ProxiedChunks'),\r\n }),\r\n z.object({\r\n Method: z.literal('DirectAzureBlobStorage'),\r\n AzureBlobStorageSasUploadUrl: z.string().url(),\r\n })\r\n ])\r\n);\r\n\r\nexport type UploadManifestDto = z.infer\r\nexport const UploadManifestDto = z.object({\r\n FileName: z.string().max(255),\r\n //FileSize: z.bigint().positive(),\r\n FileSize: z.number().positive(),\r\n Crc32Hash: z.string().length(8).regex(/^[0-9A-Fa-f]{8}$/g, \"Hash must be hexadecimal formatted\"),\r\n})\r\n\r\n/** Based on: https://learn.microsoft.com/en-us/dotnet/api/system.iprogress-1.report?view=net-9.0#system-iprogress-1-report(-0) */\r\nexport interface IProgress {\r\n Report(value: T): void;\r\n}\r\n\r\nexport interface SimpleProgress {\r\n /** The current progress without any units. This could be bytes or it could be a chunk index. */\r\n current: number;\r\n /** The total without any units. This could be bytes or it could be a chunk index. */\r\n total: number;\r\n /** The \"current\" property divided by the \"total\", which should be in the range of [0, 1.0] */\r\n ratio: number;\r\n bytesPerSecond?: number;\r\n}\r\n\r\nexport interface FileUploadOptions {\r\n /**\r\n * Used for entirely cancelling an upload\r\n */\r\n abortSignal?: AbortSignal;\r\n /**\r\n * Used for tracking upload progress\r\n */\r\n externalProgress?: IProgress;\r\n /**\r\n * Used for temporarily pausing an upload\r\n */\r\n resumableMutex?: Mutex;\r\n}\r\n\r\nexport class FileReferenceAPI {\r\n baseURL: URL;\r\n constructor(base: URL) {\r\n this.baseURL = base;\r\n }\r\n\r\n public async Ping(): Promise {\r\n return await fetch(`${this.baseURL.href}/api/FileReference/Ping`);\r\n }\r\n\r\n public async GetFileReferenceMetadata(fileReferenceID: string): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/${encodeURIComponent(fileReferenceID)}`, {\r\n method: 'HEAD',\r\n redirect: 'manual'\r\n });\r\n const HttpStatus2FileStatus: Record = {\r\n 404: 'InvalidFileReferenceID',\r\n 409: 'TemporaryDowntime',\r\n 410: 'Cancelled',\r\n 204: 'MissingContent',\r\n 200: 'Complete',\r\n //302: 'Complete', // Fetch can't see this status for security reasons\r\n }\r\n let data: FileReferenceMetadata = {\r\n FileReferenceID: fileReferenceID,\r\n // 'Cancelled' will be a fallback status since something clearly went wrong\r\n Status: HttpStatus2FileStatus[res.status] ?? 'Cancelled',\r\n EstimatedFileSize: null,\r\n ContentDownloadUrl: null,\r\n FileName: null,\r\n CreationDate: null,\r\n }\r\n\r\n try {\r\n data.EstimatedFileSize = Number(res.headers.get('Content-Length') ?? '');\r\n } catch {}\r\n try {\r\n if (res.headers.has('Content-Location')){\r\n const loc = res.headers.get('Content-Location')!;\r\n data.ContentDownloadUrl = new URL(loc, window.origin).toString();\r\n }\r\n } catch {}\r\n try {\r\n // Extract fields from 'Content-Disposition' header\r\n const headerValue = res.headers.get('Content-Disposition');\r\n if (headerValue !== null) {\r\n const content = parse(headerValue);\r\n if (typeof content.parameters['filename'] === 'string') {\r\n data.FileName = content.parameters['filename'];\r\n }\r\n const parsedDate = FileReferenceMetadata.shape.CreationDate.safeParse(content.parameters['creation-date']);\r\n if (parsedDate.success) {\r\n data.CreationDate = parsedDate.data;\r\n }\r\n }\r\n } catch {}\r\n \r\n return data;\r\n }\r\n\r\n public async GetManyFileReferenceMetadata(fileReferenceIDs: string[]): Promise {\r\n const promises = fileReferenceIDs.map(fr => this.GetFileReferenceMetadata(fr));\r\n const settled = await Promise.allSettled(promises);\r\n return settled.filter(r => r.status === 'fulfilled').map(r => r.value);\r\n }\r\n\r\n // #region Uploading\r\n public async UploadEntireFile(fileReferenceID: string, entireFile: File, options: FileUploadOptions): Promise {\r\n const { abortSignal, externalProgress, resumableMutex } = options;\r\n if (entireFile.size === 0) {\r\n throw new Error('File size cannot be 0');\r\n }\r\n const { computeCrc32 } = await import('../../functions/checksum');\r\n\r\n // Assemble the manifest\r\n const manifest: UploadManifestDto = {\r\n FileName: entireFile.name,\r\n FileSize: entireFile.size,\r\n Crc32Hash: await computeCrc32(entireFile),\r\n }\r\n\r\n // Start the upload session and get back our upload plan\r\n console.debug(`[FileReferenceAPI] [FRID# ${fileReferenceID}] Starting upload session with manifest:`, manifest);\r\n const plan = await this.StartUploadSession(fileReferenceID, manifest);\r\n console.debug(`[FileReferenceAPI] [FRID# ${fileReferenceID}] ✅ Upload session started. ${formatBytes(manifest.FileSize)} using '${plan.Method}':`, plan);\r\n\r\n try {\r\n\r\n if (plan.FileSizeLimitBytes >= 0 && plan.FileSizeLimitBytes < entireFile.size) {\r\n throw new Error(\"File size exceeds limit\");\r\n }\r\n\r\n let ALL_BYTES_SENT = 0;\r\n let ALL_TOTAL_BYTES = entireFile.size;\r\n\r\n const BANDWIDTH_ROLLING_WINDOW = [0,0,0,0,0];\r\n let LAST_SENT_TIME_SEC = Date.now() / 1000;\r\n const UPLOAD_STARTED_SEC = Date.now() / 1000;\r\n \r\n if (plan.Method === 'ProxiedChunks') {\r\n // Follow the upload plan\r\n for(let i = 0; i < plan.Segments.length; i++) {\r\n const range = plan.Segments[i];\r\n /**\r\n * The 'Content-Range' header is inclusive, but Blob.slice() is exclusive.\r\n * For example, if a file is `2671719` bytes long, the `range.End`\r\n * (which is based around Content-Range) will be `2671718`, but the\r\n * Blob.slice() end index should be `2671719`.\r\n * This is because there is no byte at the `..19` index, since that is the length\r\n * of the file and the index starts at 0.\r\n */\r\n const chunk = entireFile.slice(range.Start, range.End + 1, 'application/octet-stream');\r\n \r\n // Keep track of progress made this chunk\r\n let CHUNK_BYTES_SENT = 0;\r\n //let CHUNK_TOTAL_BYTES = chunk.size;\r\n \r\n const chunkProgress: IProgress = {\r\n Report(value) {\r\n console.debug(`[FileReferenceAPI] [FRID# ${fileReferenceID}] Chunk ${i+1} of ${plan.Segments.length} reported progress: `, value);\r\n // If the length is computable, we use it to update `currentChunk`\r\n if (value.lengthComputable) {\r\n \r\n // Compute the transmit rate in bytes-per-second\r\n const now = Date.now() / 1000;\r\n const transmit_rate_bps = (value.loaded - CHUNK_BYTES_SENT) / (now - LAST_SENT_TIME_SEC);\r\n \r\n // console.log('value.loaded?', value.loaded, 'CHUNK_BYTES_SENT?', CHUNK_BYTES_SENT, 'Now?', now, 'LAST_SENT_TIME_SEC?', LAST_SENT_TIME_SEC);\r\n // console.log('Delta bytes?', value.loaded - CHUNK_BYTES_SENT, 'Delta time?', now - LAST_SENT_TIME_SEC);\r\n \r\n // Cycle the rolling window\r\n BANDWIDTH_ROLLING_WINDOW.shift();\r\n BANDWIDTH_ROLLING_WINDOW.push(transmit_rate_bps);\r\n \r\n // Store how much we've sent so far this chunk\r\n CHUNK_BYTES_SENT = value.loaded;\r\n // Update the timestamp to measure the next\r\n LAST_SENT_TIME_SEC = now;\r\n \r\n // Update external progress only if we have granular updates\r\n externalProgress?.Report({\r\n current: ALL_BYTES_SENT + value.loaded,\r\n total: ALL_TOTAL_BYTES,\r\n ratio: (ALL_BYTES_SENT + value.loaded) / ALL_TOTAL_BYTES,\r\n // Rolling average of bandwidth\r\n bytesPerSecond: mean(BANDWIDTH_ROLLING_WINDOW),\r\n });\r\n }\r\n else {\r\n // Do not make any updates\r\n // The only updates we make are the ones made when the Promise completes,\r\n // since we can only measure an entire chunk instead of more granular.\r\n } \r\n },\r\n }\r\n\r\n // Check for a lock, pause execution if we are locked\r\n if (!isNullish(resumableMutex)) {\r\n await resumableMutex.waitForUnlock();\r\n }\r\n \r\n console.debug(`[FileReferenceAPI] [FRID# ${fileReferenceID}] Uploading chunk ${i+1} of ${plan.Segments.length}, bytes: ${FormatContentRange(range)} (${formatBytes(chunk.size)})`);\r\n // TODO: use abort signal here\r\n await this.UploadChunkTrackProgress(fileReferenceID, range, chunk, chunkProgress);\r\n ALL_BYTES_SENT += chunk.size;\r\n \r\n externalProgress?.Report({\r\n current: ALL_BYTES_SENT,\r\n total: ALL_TOTAL_BYTES,\r\n ratio: ALL_BYTES_SENT / ALL_TOTAL_BYTES,\r\n // If every value is zero, it's likely because the upload couldn't be computed due to things like `lengthComputable`\r\n bytesPerSecond: BANDWIDTH_ROLLING_WINDOW.every(v => v === 0) ? undefined : mean(BANDWIDTH_ROLLING_WINDOW),\r\n });\r\n \r\n console.debug(`[FileReferenceAPI] [FRID# ${fileReferenceID}] ✅ Chunk ${i+1} of ${plan.Segments.length} completed`);\r\n }\r\n }\r\n else if (plan.Method === 'DirectAzureBlobStorage') {\r\n // Upload the file directly to Azure Blob Storage\r\n // Chunks and splitting is handled behind the scenes for us 😌\r\n const { BlockBlobClient, AnonymousCredential, newPipeline } = await import('@azure/storage-blob');\r\n const { ResumablePolicyFactory } = await import('./BlobResumablePolicy');\r\n // Create a default pipeline with newPipeline\r\n const pipeline = newPipeline(new AnonymousCredential());\r\n // Inject customized factory into default pipeline\r\n if (!isNullish(resumableMutex)) {\r\n pipeline.factories.unshift(new ResumablePolicyFactory(resumableMutex));\r\n }\r\n // Create a BlobClient\r\n const blobClient = new BlockBlobClient(plan.AzureBlobStorageSasUploadUrl, pipeline);\r\n\r\n const timer = Math.floor(Math.random() * 100);\r\n console.time(`Direct Blob Upload [${timer}]`);\r\n const res = await blobClient.uploadData(entireFile, {\r\n abortSignal: abortSignal,\r\n // This needs to be small enough that the progress bar will refresh since the Azure SDK developers didn't bother to use the XHR.upload `progress` event.\r\n maxSingleShotSize: 10_000_000, // 10_000_000 bytes or 10 MB\r\n concurrency: 2,\r\n onProgress(progress) {\r\n // Compute the transmit rate in bytes-per-second\r\n const now = Date.now() / 1000;\r\n const transmit_rate_bps = (progress.loadedBytes) / (now - UPLOAD_STARTED_SEC);\r\n\r\n // Update external progress only if we have granular updates\r\n externalProgress?.Report({\r\n current: progress.loadedBytes,\r\n total: ALL_TOTAL_BYTES,\r\n ratio: progress.loadedBytes / ALL_TOTAL_BYTES,\r\n // Rolling average of bandwidth\r\n bytesPerSecond: transmit_rate_bps,\r\n });\r\n },\r\n });\r\n console.timeEnd(`Direct Blob Upload [${timer}]`);\r\n \r\n // Throw error code?\r\n if (!isNullish(res.errorCode)) {\r\n throw res.errorCode;\r\n }\r\n }\r\n\r\n // Commit the upload session\r\n await this.CommitUploadSession(fileReferenceID);\r\n }\r\n catch (err) {\r\n // TODO: handle errors a little better so that the user can be told what happened\r\n\r\n // If any error, cancel the upload session\r\n await this.CancelUploadSession(fileReferenceID);\r\n }\r\n }\r\n \r\n public async StartUploadSession(fileReferenceID: string, manifest: UploadManifestDto): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/${encodeURIComponent(fileReferenceID)}/StartUploadSession`, {\r\n method: 'POST',\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n body: JSON.stringify(manifest),\r\n });\r\n const data = await res.json();\r\n const parsed = await UploadPlanDto.parseAsync(data);\r\n return parsed;\r\n }\r\n\r\n public async UploadChunk(fileReferenceID: string, range: ContentRangeDto, chunk: Blob): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/${encodeURIComponent(fileReferenceID)}`, {\r\n method: 'PUT',\r\n headers: {\r\n 'Content-Type': 'application/octet-stream',\r\n 'Content-Range': FormatContentRange(range),\r\n },\r\n body: chunk,\r\n });\r\n return res;\r\n }\r\n\r\n public UploadChunkTrackProgress(fileReferenceID: string, range: ContentRangeDto, chunk: Blob, progress: IProgress): Promise {\r\n console.time('Chunk Upload');\r\n console.time('Total Request');\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.responseType = 'text';\r\n xhr.onreadystatechange = function() {\r\n if (xhr.readyState !== 4) {\r\n return;\r\n }\r\n\r\n const response = new Response(xhr.response, {\r\n //url: xhr.responseURL,\r\n status: xhr.status,\r\n statusText: xhr.statusText,\r\n });\r\n \r\n if (response.ok) {\r\n console.timeEnd('Total Request');\r\n resolve(response);\r\n }\r\n else {\r\n reject(response);\r\n }\r\n };\r\n \r\n xhr.addEventListener('error', (event) => {\r\n reject(event);\r\n });\r\n\r\n xhr.upload.addEventListener('progress', (event) => {\r\n progress.Report(event);\r\n });\r\n\r\n // When the upload finishes\r\n xhr.upload.addEventListener('load', (event) => {\r\n console.timeEnd('Chunk Upload');\r\n });\r\n\r\n xhr.open('PUT', `${this.baseURL.href}/api/FileReference/${encodeURIComponent(fileReferenceID)}`, true);\r\n xhr.setRequestHeader('Content-Range', FormatContentRange(range));\r\n xhr.send(chunk);\r\n });\r\n }\r\n\r\n public async CommitUploadSession(fileReferenceID: string): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/${encodeURIComponent(fileReferenceID)}/CommitUploadSession`, {\r\n method: 'POST',\r\n });\r\n return res;\r\n }\r\n\r\n public async CancelUploadSession(fileReferenceID: string): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/${encodeURIComponent(fileReferenceID)}/CancelUploadSession`, {\r\n method: 'POST',\r\n });\r\n return res;\r\n }\r\n\r\n //#endregion\r\n //#region Groups\r\n\r\n public async GetGroupMetadata(fileReferenceGroupID: string): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/Group/${encodeURIComponent(fileReferenceGroupID)}`, {\r\n method: 'GET',\r\n });\r\n if (!res.ok) {\r\n // TODO: throw a particular exception\r\n }\r\n const data = await res.json();\r\n const parsed = await FileReferenceGroupMetadata.parseAsync(data);\r\n return parsed;\r\n }\r\n\r\n public async GroupCreateNewFile(fileReferenceGroupID: string): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/Group/${encodeURIComponent(fileReferenceGroupID)}/GetNewFile`, {\r\n method: 'POST',\r\n });\r\n const data = await res.json();\r\n const apiError = await ApiErrorSchema.safeParseAsync(data);\r\n if(apiError.success) {\r\n throw new Error(apiError.data.Message);\r\n }\r\n const parsed = await z.object({ FileReferenceID: z.string() }).parseAsync(data);\r\n return parsed.FileReferenceID;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region Test Endpoints (Super Admin permission)\r\n\r\n public async Test_GetNewFile(): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/Test/GetNewFile`, {\r\n method: 'POST',\r\n });\r\n const data = await res.json();\r\n const parsed = await z.object({ FileReferenceID: z.string() }).parseAsync(data);\r\n return parsed.FileReferenceID;\r\n }\r\n\r\n public async Test_GetNewFileGroup(): Promise {\r\n const res = await fetch(`${this.baseURL.href}/api/FileReference/Test/GetNewFileGroup`, {\r\n method: 'POST',\r\n });\r\n const data = await res.json();\r\n const parsed = await z.object({ FileReferenceGroupID: z.string() }).parseAsync(data);\r\n return parsed.FileReferenceGroupID;\r\n }\r\n\r\n //#endregion\r\n}\r\n"],"names":["ReportDefinitionType","z","KeyValuePair","ReportDefinitionDto","SSRSReportParameterType","SSRSReportParameterVisibility","SSRSReportParameterState","SSRSReportParameterDefinition","SSRSReport","StaticDocumentOption","ReflectionMethodParameterOption","ReflectionMethodOption","ReportsAPI","base","data","definitions","definition","params","parsed","generateUUID","FileReferenceClientStatus","FileReferenceMetadata","FileReferenceGroupStatus","FileReferenceGroupMetadata","ContentRangeDto","FormatContentRange","range","UploadPlanType","UploadPlanDto","FileReferenceAPI","fileReferenceID","res","loc","headerValue","content","parse","parsedDate","fileReferenceIDs","promises","fr","r","entireFile","options","abortSignal","externalProgress","resumableMutex","computeCrc32","manifest","plan","formatBytes","ALL_BYTES_SENT","ALL_TOTAL_BYTES","BANDWIDTH_ROLLING_WINDOW","LAST_SENT_TIME_SEC","UPLOAD_STARTED_SEC","i","chunk","CHUNK_BYTES_SENT","chunkProgress","value","now","transmit_rate_bps","mean","isNullish","v","BlockBlobClient","AnonymousCredential","newPipeline","ResumablePolicyFactory","pipeline","blobClient","timer","progress","resolve","reject","xhr","response","event","fileReferenceGroupID","apiError","ApiErrorSchema"],"mappings":";;;;;;AAIO,MAAMA,IAAuBC,EAAE,KAAK,CAAC,YAAY,kBAAkB,MAAM,CAAC,GAEpEC,IAAeD,EAAE,OAAO;AAAA,EACnC,KAAKA,EAAE,OAAO;AAAA,EACd,OAAOA,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC,GAEYE,IAAsBF,EAAE,OAAO;AAAA;AAAA,EAE1C,KAAKA,EAAE,OAAO;AAAA;AAAA,EAGd,MAAMD;AAAA;AAAA,EAGN,QAAQC,EAAE,OAAO,OAAO,WAAW,SAAS;AAAA,EAC5C,gBAAgBA,EAAE,OAAS,EAAA,SAAA,EAAW,SAAS;AAAA;AAAA,EAG/C,cAAcA,EAAE,OAAS,EAAA,SAAA,EAAW,SAAS;AAAA;AAAA,EAG7C,YAAYA,EAAE,OAAS,EAAA,SAAA,EAAW,SAAS;AAAA,EAC3C,YAAYC,EAAa,MAAQ,EAAA,SAAA,EAAW,SAAS;AAAA;AAAA,EAGrD,kBAAkBD,EAAE,SAAS,WAAW,SAAS;AACnD,CAAC,GAGYG,IAA0BH,EAAE,KAAK,CAAC,WAAW,YAAY,WAAW,SAAS,QAAQ,CAAC,GAEtFI,IAAgCJ,EAAE,KAAK,CAAC,WAAW,UAAU,UAAU,CAAC,GACxEK,IAA2BL,EAAE,KAAK,CAAC,iBAAiB,qBAAqB,8BAA8B,0BAA0B,CAAC,GAGlIM,IAAgCN,EAAE,OAAO;AAAA,EACpD,MAAMA,EAAE,OAAO;AAAA,EACf,eAAeG;AAAA,EACf,qBAAqBC;AAAA,EACrB,gBAAgBC;AAAA,EAChB,aAAaL,EAAE,OAAO;AAAA,IACpB,OAAOA,EAAE,OAAO;AAAA,IAChB,OAAOA,EAAE,OAAO;AAAA,EACjB,CAAA,EAAE,MAAM;AAAA,EACT,UAAUA,EAAE,QAAQ;AAAA,EACpB,YAAYA,EAAE,QAAQ;AAAA,EACtB,YAAYA,EAAE,QAAQ;AAAA,EACtB,QAAQA,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,cAAcA,EAAE,OAAO,EAAE,MAAM;AAAA,EAC/B,eAAeA,EAAE,SAAS,WAAW,MAAM;AAC7C,CAAC,GAGYO,IAAaP,EAAE,OAAO;AAAA,EACjC,IAAIA,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,MAAMA,EAAE,OAAO;AAAA,EACf,aAAaA,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAMA,EAAE,OAAO;AAAA,EACf,MAAMA,EAAE,OAAS,EAAA,IAAA,EAAM,SAAS;AAAA,EAChC,YAAYA,EAAE,OAAO;AAAA,EACrB,cAAcA,EAAE,OAAO,KAAK;AAAA,EAC5B,WAAWA,EAAE,OAAO;AAAA,EACpB,aAAaA,EAAE,OAAO,KAAK;AAAA,EAC3B,sBAAsBM,EAA8B,MAAM;AAC5D,CAAC,GAGYE,IAAuBR,EAAE,OAAO;AAAA,EAC3C,cAAcA,EAAE,OAAO;AAAA,EACvB,cAAcA,EAAE,OAAO;AACzB,CAAC,GAGYS,IAAkCT,EAAE,OAAO;AAAA,EACtD,MAAMA,EAAE,OAAO;AAAA,EACf,SAASA,EAAE,OAAO;AACpB,CAAC,GAGYU,IAAyBV,EAAE,OAAO;AAAA,EAC7C,kBAAkBA,EAAE,OAAO;AAAA,EAC3B,aAAaA,EAAE,OAAO;AAAA,EACtB,YAAYS,EAAgC,MAAM;AACpD,CAAC;AAEM,MAAME,GAAW;AAAA,EAEtB,YAAYC,GAAW;AACrB,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAa,aAAoC;AAEzC,UAAAC,IAAO,OADD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,yBAAyB,GAC9C,KAAK;AAC5B,WAAO,MAAMN,EAAW,QAAQ,WAAWM,CAAI;AAAA,EAAA;AAAA,EAEjD,MAAa,qBAAsD;AAE3D,UAAAA,IAAO,OADD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,iCAAiC,GACtD,KAAK;AAC5B,WAAO,MAAML,EAAqB,QAAQ,WAAWK,CAAI;AAAA,EAAA;AAAA,EAE3D,MAAa,+BAAkE;AAEvE,UAAAA,IAAO,OADD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,2CAA2C,GAChE,KAAK;AAC5B,WAAO,MAAMH,EAAuB,QAAQ,WAAWG,CAAI;AAAA,EAAA;AAAA,EAE7D,MAAa,uBAAuBC,GAAqD;AAQjF,UAAAD,IAAO,OAPD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,uCAAuC;AAAA,MACjF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAUC,CAAW;AAAA,IAAA,CACjC,GACsB,KAAK;AAE5B,YADe,MAAMd,EAAE,OAAO,EAAE,SAASA,EAAE,OAAS,EAAA,CAAC,EAAE,WAAWa,CAAI,GACxD;AAAA,EAAA;AAAA,EAEhB,MAAa,uBAAuBE,GAAoD;AACtF,UAAMC,IAAS,IAAI,gBAAgB,EAClC,GAQKH,IAAO,OAPD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,uCAAuCG,EAAO,SAAS,CAAC,IAAI;AAAA,MACtG,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAUD,CAAU;AAAA,IAAA,CAChC,GACsB,KAAK,GAEtBE,IAAS,MAAMf,EAAoB,QAAQ,EAAE,KAAK,GAAK,CAAC,EAAE,QAAQ,WAAWW,CAAI;AACvF,aAAQ,IAAI,GAAG,IAAII,EAAO,QAAQ;AACzB,MAAAA,EAAA,CAAC,EAAE,MAAMC,EAAa;AAE/B,WAAO,MAAMhB,EAAoB,QAAQ,WAAWe,CAAM;AAAA,EAAA;AAAA;AAAA,EAG5D,MAAa,UAAUF,GAAqC;AACpD,UAAAC,IAAS,IAAI,gBAAgB;AAAA,MACjC,aAAa;AAAA,IAAA,CACd,GASKH,IAAO,OARD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,0BAA0BG,EAAO,SAAS,CAAC,IAAI;AAAA,MACzF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAUD,CAAU;AAAA,MAC/B,UAAU;AAAA,IAAA,CACX,GACsB,KAAK;AAE5B,YADe,MAAMf,EAAE,OAAO,EAAE,iBAAiBA,EAAE,OAAS,EAAA,CAAC,EAAE,WAAWa,CAAI,GAChE;AAAA,EAAA;AAElB;ACpJa,MAAAM,IAA4BnB,EAAE,KAAK;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC,GAEYoB,IAAwBpB,EAAE,OAAO;AAAA,EAC5C,iBAAiBA,EAAE,OAAO;AAAA,EAC1B,QAAQmB;AAAA,EACR,mBAAmBnB,EAAE,OAAS,EAAA,SAAA,EAAW,SAAS;AAAA,EAClD,oBAAoBA,EAAE,OAAS,EAAA,IAAA,EAAM,SAAS;AAAA,EAC9C,UAAUA,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAcA,EAAE,OAAO,OAAO,SAAS;AACzC,CAAC,GAGYqB,IAA2BrB,EAAE,KAAK;AAAA,EAC7C;AAAA,EACA;AACF,CAAC,GAEYsB,IAA6BtB,EAAE,OAAO;AAAA,EACjD,QAAQqB;AAAA,EACR,gBAAgBrB,EAAE,SAAS,IAAI,CAAC;AAAA,EAChC,eAAeA,EAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAS;AAAA,EAC1C,gBAAgBA,EAAE,SAAS,IAAI,CAAC;AAAA,EAChC,gBAAgBA,EAAE,OAAO,EAAE,MAAM;AACnC,CAAC,GAGYuB,IAAkBvB,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAItC,OAAOA,EAAE,SAAS,IAAI,CAAC;AAAA,EACvB,KAAKA,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,QAAQA,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAEM,SAASwB,EAAmBC,GAAgC;AAC1D,SAAA,SAASA,EAAM,KAAK,IAAIA,EAAM,GAAG,IAAIA,EAAM,MAAM;AAC1D;AAEa,MAAAC,IAAiB1B,EAAE,KAAK;AAAA,EACnC;AAAA,EACA;AACF,CAAC,GAEY2B,IAAgB3B,EAAE;AAAA,EAC7BA,EAAE,OAAO;AAAA,IACP,QAAQ0B;AAAA,IACR,oBAAoB1B,EAAE,SAAS,IAAI,CAAC;AAAA,IACpC,UAAUuB,EAAgB,MAAM;AAAA,EAAA,CACjC;AAAA,EACDvB,EAAE,mBAAmB,UAAU;AAAA,IAC7BA,EAAE,OAAO;AAAA,MACP,QAAQA,EAAE,QAAQ,eAAe;AAAA,IAAA,CAClC;AAAA,IACDA,EAAE,OAAO;AAAA,MACP,QAAQA,EAAE,QAAQ,wBAAwB;AAAA,MAC1C,8BAA8BA,EAAE,OAAO,EAAE,IAAI;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA;AACH;AAGiCA,EAAE,OAAO;AAAA,EACxC,UAAUA,EAAE,SAAS,IAAI,GAAG;AAAA;AAAA,EAE5B,UAAUA,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAWA,EAAE,SAAS,OAAO,CAAC,EAAE,MAAM,qBAAqB,oCAAoC;AACjG,CAAC;AAgCM,MAAM4B,GAAiB;AAAA,EAE5B,YAAYhB,GAAW;AACrB,SAAK,UAAUA;AAAA,EAAA;AAAA,EAGjB,MAAa,OAA0B;AACrC,WAAO,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,yBAAyB;AAAA,EAAA;AAAA,EAGlE,MAAa,yBAAyBiB,GAAyD;AACvF,UAAAC,IAAM,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,sBAAsB,mBAAmBD,CAAe,CAAC,IAAI;AAAA,MACvG,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,CACX;AASD,QAAIhB,IAA8B;AAAA,MAChC,iBAAiBgB;AAAA;AAAA,MAEjB,QAXuE;AAAA,QACvE,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA;AAAA,MAEP,EAIgCC,EAAI,MAAM,KAAK;AAAA,MAC7C,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV,cAAc;AAAA,IAChB;AAEI,QAAA;AACF,MAAAjB,EAAK,oBAAoB,OAAOiB,EAAI,QAAQ,IAAI,gBAAgB,KAAK,EAAE;AAAA,IAAA,QACjE;AAAA,IAAA;AACJ,QAAA;AACF,UAAIA,EAAI,QAAQ,IAAI,kBAAkB,GAAE;AACtC,cAAMC,IAAMD,EAAI,QAAQ,IAAI,kBAAkB;AAC9C,QAAAjB,EAAK,qBAAqB,IAAI,IAAIkB,GAAK,OAAO,MAAM,EAAE,SAAS;AAAA,MAAA;AAAA,IACjE,QACM;AAAA,IAAA;AACJ,QAAA;AAEF,YAAMC,IAAcF,EAAI,QAAQ,IAAI,qBAAqB;AACzD,UAAIE,MAAgB,MAAM;AAClB,cAAAC,IAAUC,EAAMF,CAAW;AACjC,QAAI,OAAOC,EAAQ,WAAW,YAAgB,aACvCpB,EAAA,WAAWoB,EAAQ,WAAW;AAE/B,cAAAE,IAAaf,EAAsB,MAAM,aAAa,UAAUa,EAAQ,WAAW,eAAe,CAAC;AACzG,QAAIE,EAAW,YACbtB,EAAK,eAAesB,EAAW;AAAA,MACjC;AAAA,IACF,QACM;AAAA,IAAA;AAED,WAAAtB;AAAA,EAAA;AAAA,EAGT,MAAa,6BAA6BuB,GAA8D;AACtG,UAAMC,IAAWD,EAAiB,IAAI,OAAM,KAAK,yBAAyBE,CAAE,CAAC;AAEtE,YADS,MAAM,QAAQ,WAAWD,CAAQ,GAClC,OAAO,CAAAE,MAAKA,EAAE,WAAW,WAAW,EAAE,IAAI,CAAKA,MAAAA,EAAE,KAAK;AAAA,EAAA;AAAA;AAAA,EAIvE,MAAa,iBAAiBV,GAAyBW,GAAkBC,GAA2C;AAClH,UAAM,EAAE,aAAAC,GAAa,kBAAAC,GAAkB,gBAAAC,EAAmB,IAAAH;AACtD,QAAAD,EAAW,SAAS;AAChB,YAAA,IAAI,MAAM,uBAAuB;AAEzC,UAAM,EAAE,cAAAK,EAAA,IAAiB,MAAM,OAAO,wBAA0B,GAG1DC,IAA8B;AAAA,MAClC,UAAUN,EAAW;AAAA,MACrB,UAAUA,EAAW;AAAA,MACrB,WAAW,MAAMK,EAAaL,CAAU;AAAA,IAC1C;AAGA,YAAQ,MAAM,6BAA6BX,CAAe,4CAA4CiB,CAAQ;AAC9G,UAAMC,IAAO,MAAM,KAAK,mBAAmBlB,GAAiBiB,CAAQ;AACpE,YAAQ,MAAM,6BAA6BjB,CAAe,+BAA+BmB,EAAYF,EAAS,QAAQ,CAAC,WAAWC,EAAK,MAAM,MAAMA,CAAI;AAEnJ,QAAA;AAEF,UAAIA,EAAK,sBAAsB,KAAMA,EAAK,qBAAqBP,EAAW;AAClE,cAAA,IAAI,MAAM,yBAAyB;AAG3C,UAAIS,IAAiB,GACjBC,IAAkBV,EAAW;AAEjC,YAAMW,IAA2B,CAAC,GAAE,GAAE,GAAE,GAAE,CAAC;AACvC,UAAAC,IAAqB,KAAK,IAAA,IAAQ;AAChC,YAAAC,IAAqB,KAAK,IAAA,IAAQ;AAEpC,UAAAN,EAAK,WAAW;AAElB,iBAAQO,IAAI,GAAGA,IAAIP,EAAK,SAAS,QAAQO,KAAK;AACtC,gBAAA7B,IAAQsB,EAAK,SAASO,CAAC,GASvBC,IAAQf,EAAW,MAAMf,EAAM,OAAOA,EAAM,MAAM,GAAG,0BAA0B;AAGrF,cAAI+B,IAAmB;AAGvB,gBAAMC,IAA0C;AAAA,YAC9C,OAAOC,GAAO;AAGZ,kBAFQ,QAAA,MAAM,6BAA6B7B,CAAe,WAAWyB,IAAE,CAAC,OAAOP,EAAK,SAAS,MAAM,wBAAwBW,CAAK,GAE5HA,EAAM,kBAAkB;AAGpB,sBAAAC,IAAM,KAAK,IAAA,IAAQ,KACnBC,KAAqBF,EAAM,SAASF,MAAqBG,IAAMP;AAMrE,gBAAAD,EAAyB,MAAM,GAC/BA,EAAyB,KAAKS,CAAiB,GAG/CJ,IAAmBE,EAAM,QAEJN,IAAAO,GAGrBhB,KAAA,QAAAA,EAAkB,OAAO;AAAA,kBACvB,SAASM,IAAiBS,EAAM;AAAA,kBAChC,OAAOR;AAAA,kBACP,QAAQD,IAAiBS,EAAM,UAAUR;AAAA;AAAA,kBAEzC,gBAAgBW,OAAKV,CAAwB;AAAA,gBAAA;AAAA,cAC9C;AAAA,YAMH;AAAA,UAEJ;AAGI,UAACW,EAAUlB,CAAc,KAC3B,MAAMA,EAAe,cAAc,GAGrC,QAAQ,MAAM,6BAA6Bf,CAAe,qBAAqByB,IAAE,CAAC,OAAOP,EAAK,SAAS,MAAM,YAAYvB,EAAmBC,CAAK,CAAC,KAAKuB,EAAYO,EAAM,IAAI,CAAC,GAAG,GAEjL,MAAM,KAAK,yBAAyB1B,GAAiBJ,GAAO8B,GAAOE,CAAa,GAChFR,KAAkBM,EAAM,MAExBZ,KAAA,QAAAA,EAAkB,OAAO;AAAA,YACvB,SAASM;AAAA,YACT,OAAOC;AAAA,YACP,OAAOD,IAAiBC;AAAA;AAAA,YAExB,gBAAgBC,EAAyB,MAAM,CAAAY,MAAKA,MAAM,CAAC,IAAI,SAAYF,EAAAA,KAAKV,CAAwB;AAAA,UAAA,IAGlG,QAAA,MAAM,6BAA6BtB,CAAe,aAAayB,IAAE,CAAC,OAAOP,EAAK,SAAS,MAAM,YAAY;AAAA,QAAA;AAAA,eAG5GA,EAAK,WAAW,0BAA0B;AAGjD,cAAM,EAAE,iBAAAiB,GAAiB,qBAAAC,GAAqB,aAAAC,MAAgB,MAAM,OAAO,6BAAqB,GAC1F,EAAE,wBAAAC,EAAA,IAA2B,MAAM,OAAO,mCAAuB,GAEjEC,IAAWF,EAAY,IAAID,GAAqB;AAElD,QAACH,EAAUlB,CAAc,KAC3BwB,EAAS,UAAU,QAAQ,IAAID,EAAuBvB,CAAc,CAAC;AAGvE,cAAMyB,IAAa,IAAIL,EAAgBjB,EAAK,8BAA8BqB,CAAQ,GAE5EE,IAAQ,KAAK,MAAM,KAAK,WAAW,GAAG;AACpC,gBAAA,KAAK,uBAAuBA,CAAK,GAAG;AAC5C,cAAMxC,IAAM,MAAMuC,EAAW,WAAW7B,GAAY;AAAA,UAClD,aAAAE;AAAA;AAAA,UAEA,mBAAmB;AAAA;AAAA,UACnB,aAAa;AAAA,UACb,WAAW6B,GAAU;AAEb,kBAAAZ,IAAM,KAAK,IAAA,IAAQ,KACnBC,IAAqBW,EAAS,eAAgBZ,IAAMN;AAG1D,YAAAV,KAAA,QAAAA,EAAkB,OAAO;AAAA,cACvB,SAAS4B,EAAS;AAAA,cAClB,OAAOrB;AAAA,cACP,OAAOqB,EAAS,cAAcrB;AAAA;AAAA,cAE9B,gBAAgBU;AAAA,YAAA;AAAA,UACjB;AAAA,QACH,CACD;AAID,YAHQ,QAAA,QAAQ,uBAAuBU,CAAK,GAAG,GAG3C,CAACR,EAAUhC,EAAI,SAAS;AAC1B,gBAAMA,EAAI;AAAA,MACZ;AAII,YAAA,KAAK,oBAAoBD,CAAe;AAAA,YAEpC;AAIJ,YAAA,KAAK,oBAAoBA,CAAe;AAAA,IAAA;AAAA,EAChD;AAAA,EAGF,MAAa,mBAAmBA,GAAyBiB,GAAqD;AAQtG,UAAAjC,IAAO,OAPD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,sBAAsB,mBAAmBgB,CAAe,CAAC,uBAAuB;AAAA,MAC1H,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAUiB,CAAQ;AAAA,IAAA,CAC9B,GACsB,KAAK;AAErB,WADQ,MAAMnB,EAAc,WAAWd,CAAI;AAAA,EAC3C;AAAA,EAGT,MAAa,YAAYgB,GAAyBJ,GAAwB8B,GAAgC;AASjG,WARK,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,sBAAsB,mBAAmB1B,CAAe,CAAC,IAAI;AAAA,MACvG,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiBL,EAAmBC,CAAK;AAAA,MAC3C;AAAA,MACA,MAAM8B;AAAA,IAAA,CACP;AAAA,EACM;AAAA,EAGF,yBAAyB1B,GAAyBJ,GAAwB8B,GAAagB,GAAuD;AACnJ,mBAAQ,KAAK,cAAc,GAC3B,QAAQ,KAAK,eAAe,GACrB,IAAI,QAAQ,CAACC,GAASC,MAAW;AAChC,YAAAC,IAAM,IAAI,eAAe;AAC/B,MAAAA,EAAI,eAAe,QACnBA,EAAI,qBAAqB,WAAW;AAC9B,YAAAA,EAAI,eAAe;AACrB;AAGF,cAAMC,IAAW,IAAI,SAASD,EAAI,UAAU;AAAA;AAAA,UAE1C,QAAQA,EAAI;AAAA,UACZ,YAAYA,EAAI;AAAA,QAAA,CACjB;AAED,QAAIC,EAAS,MACX,QAAQ,QAAQ,eAAe,GAC/BH,EAAQG,CAAQ,KAGhBF,EAAOE,CAAQ;AAAA,MAEnB,GAEID,EAAA,iBAAiB,SAAS,CAACE,MAAU;AACvC,QAAAH,EAAOG,CAAK;AAAA,MAAA,CACb,GAEDF,EAAI,OAAO,iBAAiB,YAAY,CAACE,MAAU;AACjD,QAAAL,EAAS,OAAOK,CAAK;AAAA,MAAA,CACtB,GAGDF,EAAI,OAAO,iBAAiB,QAAQ,CAACE,MAAU;AAC7C,gBAAQ,QAAQ,cAAc;AAAA,MAAA,CAC/B,GAEGF,EAAA,KAAK,OAAO,GAAG,KAAK,QAAQ,IAAI,sBAAsB,mBAAmB7C,CAAe,CAAC,IAAI,EAAI,GACrG6C,EAAI,iBAAiB,iBAAiBlD,EAAmBC,CAAK,CAAC,GAC/DiD,EAAI,KAAKnB,CAAK;AAAA,IAAA,CACf;AAAA,EAAA;AAAA,EAGH,MAAa,oBAAoB1B,GAA4C;AAIpE,WAHK,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,sBAAsB,mBAAmBA,CAAe,CAAC,wBAAwB;AAAA,MAC3H,QAAQ;AAAA,IAAA,CACT;AAAA,EACM;AAAA,EAGT,MAAa,oBAAoBA,GAA4C;AAIpE,WAHK,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,sBAAsB,mBAAmBA,CAAe,CAAC,wBAAwB;AAAA,MAC3H,QAAQ;AAAA,IAAA,CACT;AAAA,EACM;AAAA;AAAA;AAAA,EAMT,MAAa,iBAAiBgD,GAAmE;AACzF,UAAA/C,IAAM,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,4BAA4B,mBAAmB+C,CAAoB,CAAC,IAAI;AAAA,MAClH,QAAQ;AAAA,IAAA,CACT;AACG,IAAC/C,EAAI;AAGH,UAAAjB,IAAO,MAAMiB,EAAI,KAAK;AAErB,WADQ,MAAMR,EAA2B,WAAWT,CAAI;AAAA,EACxD;AAAA,EAGT,MAAa,mBAAmBgE,GAA+C;AAIvE,UAAAhE,IAAO,OAHD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,4BAA4B,mBAAmBgE,CAAoB,CAAC,eAAe;AAAA,MAC7H,QAAQ;AAAA,IAAA,CACT,GACsB,KAAK,GACtBC,IAAW,MAAMC,EAAe,eAAelE,CAAI;AACzD,QAAGiE,EAAS;AACV,YAAM,IAAI,MAAMA,EAAS,KAAK,OAAO;AAGvC,YADe,MAAM9E,EAAE,OAAO,EAAE,iBAAiBA,EAAE,OAAS,EAAA,CAAC,EAAE,WAAWa,CAAI,GAChE;AAAA,EAAA;AAAA;AAAA;AAAA,EAOhB,MAAa,kBAAmC;AAIxC,UAAAA,IAAO,OAHD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,sCAAsC;AAAA,MAChF,QAAQ;AAAA,IAAA,CACT,GACsB,KAAK;AAE5B,YADe,MAAMb,EAAE,OAAO,EAAE,iBAAiBA,EAAE,OAAS,EAAA,CAAC,EAAE,WAAWa,CAAI,GAChE;AAAA,EAAA;AAAA,EAGhB,MAAa,uBAAwC;AAI7C,UAAAA,IAAO,OAHD,MAAM,MAAM,GAAG,KAAK,QAAQ,IAAI,2CAA2C;AAAA,MACrF,QAAQ;AAAA,IAAA,CACT,GACsB,KAAK;AAE5B,YADe,MAAMb,EAAE,OAAO,EAAE,sBAAsBA,EAAE,OAAS,EAAA,CAAC,EAAE,WAAWa,CAAI,GACrE;AAAA,EAAA;AAAA;AAIlB;"}