{"version":3,"file":"almaobservatory-shared-lib.mjs","sources":["../../../projects/shared-ui/src/lib/common/pipes/safe.pipe.ts","../../../projects/shared-ui/src/lib/common/pipes/frequency-type.pipe.ts","../../../projects/shared-ui/src/lib/common/pipes/bytes.pipe.ts","../../../projects/shared-ui/src/lib/common/directives/lazy-load.directive.ts","../../../projects/shared-ui/src/lib/image-similarity/models/image-similarity.model.ts","../../../projects/shared-ui/src/lib/common/directives/sticky-popover.directive.ts","../../../projects/shared-ui/src/lib/common/providers/providers.tokens.ts","../../../projects/shared-ui/src/lib/image-similarity/services/image-similarity.service.ts","../../../projects/shared-ui/src/lib/image-similarity/services/similarity-download.service.ts","../../../projects/shared-ui/src/lib/image-similarity/components/image-similarity-popup/image-similarity-popup.component.ts","../../../projects/shared-ui/src/lib/image-similarity/components/image-similarity-popup/image-similarity-popup.component.html","../../../projects/shared-ui/src/lib/image-similarity/components/image-similarity-trigger/image-similarity-trigger.component.ts","../../../projects/shared-ui/src/lib/image-similarity/components/image-similarity-trigger/image-similarity-trigger.component.html","../../../projects/shared-ui/src/lib/line-detection/components/line-preview.component.ts","../../../projects/shared-ui/src/lib/line-detection/components/line-preview.component.html","../../../projects/shared-ui/src/lib/line-detection/services/line-detections.service.ts","../../../projects/shared-ui/src/lib/common/utils/coordinate-utils.ts","../../../projects/shared-ui/src/lib/cell-preview/services/soda-cutout.service.ts","../../../projects/shared-ui/src/lib/cell-preview/components/cell-preview-shared/cell-preview-shared.component.ts","../../../projects/shared-ui/src/lib/cell-preview/components/cell-preview-shared/cell-preview-shared.component.html","../../../projects/shared-ui/src/public-api.ts","../../../projects/shared-ui/src/almaobservatory-shared-lib.ts"],"sourcesContent":["import {Pipe, PipeTransform} from '@angular/core';\r\nimport {DomSanitizer, SafeHtml, SafeResourceUrl, SafeScript, SafeStyle, SafeUrl} from '@angular/platform-browser';\r\n\r\n// this pipe is implemented to allow us to use variables in the htmls file that include foreign links to our applications.\r\n// you can have more details under this link\r\n// https://medium.com/@swarnakishore/angular-safe-pipe-implementation-to-bypass-domsanitizer-stripping-out-content-c1bf0f1cc36b\r\n\r\n@Pipe({name: 'safe'})\r\nexport class SafePipe implements PipeTransform {\r\n   constructor(private readonly sanitizer: DomSanitizer) {}\r\n\r\n   public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\r\n      switch (type) {\r\n         case 'html':\r\n            return this.sanitizer.bypassSecurityTrustHtml(value);\r\n         case 'style':\r\n            return this.sanitizer.bypassSecurityTrustStyle(value);\r\n         case 'script':\r\n            return this.sanitizer.bypassSecurityTrustScript(value);\r\n         case 'url':\r\n            return this.sanitizer.bypassSecurityTrustUrl(value);\r\n         case 'resourceUrl':\r\n            return this.sanitizer.bypassSecurityTrustResourceUrl(value);\r\n         default:\r\n            throw new Error(`Invalid safe type specified: ${type}`);\r\n      }\r\n   }\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\n\r\n@Pipe({\r\n   name: 'frequencyType',\r\n   standalone: true\r\n})\r\nexport class FrequencyTypePipe implements PipeTransform {\r\n   transform(numberChannels: number, ...args: unknown[]): unknown {\r\n      if (numberChannels < 129) {\r\n         return 'continuum';\r\n      } else {\r\n         return 'line';\r\n      }\r\n   }\r\n}\r\n","import {Pipe, PipeTransform} from '@angular/core';\r\n\r\n@Pipe({\r\n   name: 'bytes',\r\n   standalone: true\r\n})\r\nexport class BytesPipe implements PipeTransform {\r\n   transform(value: number, decimalPlaces: number = 0): string {\r\n      if (isNaN(value) || value === 0) return '0 Bytes';\r\n\r\n      const k = 1024;\r\n      const dm = Math.max(0, decimalPlaces);\r\n      const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n      const i = Math.floor(Math.log(value) / Math.log(k));\r\n      const result = parseFloat((value / Math.pow(k, i)).toFixed(dm));\r\n\r\n      return `${result} ${sizes[i]}`;\r\n   }\r\n}\r\n","import {Directive, ElementRef, EventEmitter, Output, AfterViewInit} from '@angular/core';\r\n\r\n@Directive({\r\n   selector: '[appLazyLoad]',\r\n   standalone: true\r\n})\r\nexport class LazyLoadDirective implements AfterViewInit {\r\n   @Output() lazyLoad = new EventEmitter<void>();\r\n\r\n   constructor(private el: ElementRef) {}\r\n\r\n   ngAfterViewInit(): void {\r\n      // Watch the element to see if it comes into view\r\n      const observer = new IntersectionObserver(\r\n         ([entry]) => {\r\n            // When it does, emit the event and stop observing\r\n            if (entry.isIntersecting) {\r\n               this.lazyLoad.emit();\r\n               observer.disconnect();\r\n            }\r\n         },\r\n         {\r\n            // Trigger 400px before element is fully in view\r\n            rootMargin: '400px'\r\n         }\r\n      );\r\n\r\n      observer.observe(this.el.nativeElement);\r\n   }\r\n}\r\n","export interface ImageMorphologySimilarity {\r\n   readonly imageId: string;\r\n   readonly ngasFileId: string;\r\n   readonly similarImageIdList: string[];\r\n   readonly similarImageGroups: ImageMorphologySimilarityGroup[];\r\n   readonly spwId: string;\r\n   readonly projectCode: string;\r\n   readonly mousUid: string;\r\n   readonly sourceName: string;\r\n   readonly scienceCategory: string;\r\n   readonly scienceKeywords: string;\r\n   readonly freqMin: string;\r\n   readonly freqMax: string;\r\n}\r\n\r\nexport interface ImageMorphologySimilarityGroup {\r\n   representativeImageId: string;\r\n   similarImageIdList: string[];\r\n}\r\n\r\nexport enum GroupSelectionState {\r\n   None = 'none',\r\n   Partial = 'partial',\r\n   All = 'all'\r\n}\r\n\r\nexport interface DisplayImage {\r\n   imageId: string;\r\n   ngasFileId: string;\r\n   fileName: string;\r\n   loaded: boolean;\r\n   sourceName: string;\r\n   scienceCategory: string;\r\n   scienceKeywords: string[];\r\n   frequencyRange: string;\r\n   project: string;\r\n   memberOUS: string;\r\n   ngasFileNameId: string;\r\n   downloadUrl: string | null;\r\n}\r\n","import {Directive, ElementRef, Input, Output, EventEmitter, Renderer2, TemplateRef, inject, DestroyRef, signal} from '@angular/core';\r\nimport {NgbPopover} from '@ng-bootstrap/ng-bootstrap';\r\nimport {DOCUMENT} from '@angular/common';\r\nimport {fromEvent} from 'rxjs';\r\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\r\n\r\nconst CLOSE_OPEN_DELAY_MS = 300;\r\n\r\n@Directive({\r\n   selector: '[stickyPopover]',\r\n   exportAs: 'stickyPopover',\r\n   standalone: true,\r\n   hostDirectives: [NgbPopover]\r\n})\r\nexport class StickyPopover {\r\n   @Input()\r\n   set stickyPopover(value: TemplateRef<any>) {\r\n      this.popover.ngbPopover = value;\r\n   }\r\n\r\n   @Output() outMouseEnterPopover = new EventEmitter<void>();\r\n   @Output() outMouseLeavePopover = new EventEmitter<void>();\r\n\r\n   private readonly elRef = inject(ElementRef<HTMLElement>);\r\n   private readonly renderer = inject(Renderer2);\r\n   private readonly document = inject(DOCUMENT);\r\n   private readonly destroyRef = inject(DestroyRef);\r\n   private readonly popover = inject(NgbPopover);\r\n\r\n   private openTimeout: ReturnType<typeof setTimeout> | null = null;\r\n   private closeTimeout: ReturnType<typeof setTimeout> | null = null;\r\n   private readonly canClosePopover = signal(true);\r\n\r\n   // store unlisteners so we can clean up (prevents leaks + duplicated handlers)\r\n   private hostUnlisteners: Array<() => void> = [];\r\n   private popoverUnlisteners: Array<() => void> = [];\r\n\r\n   constructor() {\r\n      this.initializeListeners();\r\n\r\n      this.destroyRef.onDestroy(() => {\r\n         if (this.openTimeout) {\r\n            clearTimeout(this.openTimeout);\r\n            this.openTimeout = null;\r\n         }\r\n         if (this.closeTimeout) {\r\n            clearTimeout(this.closeTimeout);\r\n            this.closeTimeout = null;\r\n         }\r\n         this.cleanupPopoverListeners();\r\n         this.cleanupHostListeners();\r\n         this.popover.close();\r\n      });\r\n   }\r\n\r\n   private initializeListeners() {\r\n      this.hostUnlisteners.push(\r\n         this.renderer.listen(this.elRef.nativeElement, 'mouseenter', () => {\r\n            if (this.popover.isOpen()) {\r\n               // Cursor moved from popover content back onto the trigger.\r\n               // Cancel the pending close directly, don't flip canClosePopover,\r\n               // which could leave it stuck in a wrong state.\r\n               if (this.closeTimeout) {\r\n                  clearTimeout(this.closeTimeout);\r\n                  this.closeTimeout = null;\r\n               }\r\n            } else {\r\n               this.canClosePopover.set(true);\r\n               if (this.openTimeout) {\r\n                  clearTimeout(this.openTimeout);\r\n               }\r\n               this.openTimeout = setTimeout(() => this.openPopoverSafely(), this.popover.openDelay || CLOSE_OPEN_DELAY_MS);\r\n            }\r\n         })\r\n      );\r\n\r\n      this.hostUnlisteners.push(\r\n         this.renderer.listen(this.elRef.nativeElement, 'mouseleave', () => {\r\n            if (this.openTimeout) {\r\n               clearTimeout(this.openTimeout);\r\n               this.openTimeout = null;\r\n            }\r\n            if (this.closeTimeout) {\r\n               clearTimeout(this.closeTimeout);\r\n            }\r\n            this.canClosePopover.set(true);\r\n            this.closeTimeout = setTimeout(() => {\r\n               if (this.canClosePopover()) {\r\n                  this.popover.close();\r\n                  this.cleanupPopoverListeners();\r\n               }\r\n               this.closeTimeout = null;\r\n            }, CLOSE_OPEN_DELAY_MS);\r\n         })\r\n      );\r\n\r\n      // Close on scroll outside the popover. Floating UI repositions on every scroll event\r\n      // Without this the popover chases the trigger across the screen.\r\n      fromEvent(this.document, 'scroll', {capture: true} as EventListenerOptions)\r\n         .pipe(takeUntilDestroyed(this.destroyRef))\r\n         .subscribe((event: Event) => {\r\n            if (!this.popover.isOpen()) return;\r\n            const popoverId = this.elRef.nativeElement.getAttribute('aria-describedby');\r\n            const popoverEl = popoverId ? this.document.getElementById(popoverId) : null;\r\n            if (popoverEl?.contains(event.target as Node)) return;\r\n            this.canClosePopover.set(true);\r\n            this.popover.close();\r\n            this.cleanupPopoverListeners();\r\n         });\r\n   }\r\n\r\n   private openPopoverSafely() {\r\n      this.popover.open();\r\n\r\n      // wait for DOM render; then attach hover listeners to THIS popover instance\r\n      setTimeout(() => this.attachPopoverHoverListeners(), 0);\r\n   }\r\n\r\n   private attachPopoverHoverListeners() {\r\n      //avoid accumulating listeners on repeated opens\r\n      this.cleanupPopoverListeners();\r\n\r\n      const popoverId = this.elRef.nativeElement.getAttribute('aria-describedby');\r\n      const popoverElement = popoverId ? this.document.getElementById(popoverId) : null;\r\n      if (!popoverElement) return;\r\n\r\n      this.popoverUnlisteners.push(\r\n         this.renderer.listen(popoverElement, 'mouseenter', () => {\r\n            this.outMouseEnterPopover.emit();\r\n            if (this.closeTimeout) {\r\n               clearTimeout(this.closeTimeout);\r\n               this.closeTimeout = null;\r\n            }\r\n            this.canClosePopover.set(false);\r\n         })\r\n      );\r\n\r\n      this.popoverUnlisteners.push(\r\n         this.renderer.listen(popoverElement, 'mouseleave', (event: MouseEvent) => {\r\n            this.outMouseLeavePopover.emit();\r\n            const relatedTarget = event.relatedTarget as HTMLElement | null;\r\n\r\n            // If the mouse moved into a child popover (one whose trigger lives inside this\r\n            // popover's content), keep this popover open and wait until the child is exited.\r\n            const childPopoverEl = relatedTarget?.closest('.popover') as HTMLElement | null;\r\n            if (childPopoverEl) {\r\n               const childPopoverId = childPopoverEl.id;\r\n               const childTrigger = childPopoverId\r\n                  ? this.document.querySelector(`[aria-describedby=\"${childPopoverId}\"]`)\r\n                  : null;\r\n               if (childTrigger && popoverElement.contains(childTrigger)) {\r\n                  const unlistenChild = this.renderer.listen(childPopoverEl, 'mouseleave', (childEvent: MouseEvent) => {\r\n                     unlistenChild();\r\n                     const childRelated = childEvent.relatedTarget as HTMLElement | null;\r\n                     if (\r\n                        childRelated &&\r\n                        (popoverElement.contains(childRelated) || this.elRef.nativeElement.contains(childRelated))\r\n                     ) {\r\n                        return;\r\n                     }\r\n                     // Mouse left child popover to outside -> close parent with timeout.\r\n                     this.canClosePopover.set(true);\r\n                     if (this.closeTimeout) clearTimeout(this.closeTimeout);\r\n                     this.closeTimeout = setTimeout(() => {\r\n                        if (this.canClosePopover()) {\r\n                           this.popover.close();\r\n                           this.cleanupPopoverListeners();\r\n                        }\r\n                        this.closeTimeout = null;\r\n                     }, CLOSE_OPEN_DELAY_MS);\r\n                  });\r\n                  this.popoverUnlisteners.push(unlistenChild);\r\n                  return;\r\n               }\r\n            }\r\n\r\n            this.canClosePopover.set(true);\r\n            if (this.closeTimeout) {\r\n               clearTimeout(this.closeTimeout);\r\n            }\r\n            this.closeTimeout = setTimeout(() => {\r\n               if (this.canClosePopover()) {\r\n                  this.popover.close();\r\n                  this.cleanupPopoverListeners();\r\n               }\r\n               this.closeTimeout = null;\r\n            }, CLOSE_OPEN_DELAY_MS);\r\n         })\r\n      );\r\n   }\r\n\r\n   private cleanupPopoverListeners() {\r\n      this.popoverUnlisteners.forEach((fn) => fn());\r\n      this.popoverUnlisteners = [];\r\n   }\r\n\r\n   private cleanupHostListeners() {\r\n      this.hostUnlisteners.forEach((fn) => fn());\r\n      this.hostUnlisteners = [];\r\n   }\r\n\r\n   public closeWithTimeout() {\r\n      this.canClosePopover.set(true);\r\n      if (this.closeTimeout) {\r\n         clearTimeout(this.closeTimeout);\r\n      }\r\n      this.closeTimeout = setTimeout(() => {\r\n         if (this.canClosePopover()) {\r\n            this.popover.close();\r\n            this.cleanupPopoverListeners();\r\n         }\r\n         this.closeTimeout = null;\r\n      }, CLOSE_OPEN_DELAY_MS);\r\n   }\r\n\r\n   @Input()\r\n   set popoverTitle(value: string | TemplateRef<any>) {\r\n      this.popover.popoverTitle = value;\r\n   }\r\n\r\n   @Input()\r\n   set autoClose(value: boolean | 'inside' | 'outside') {\r\n      this.popover.autoClose = value;\r\n   }\r\n\r\n   @Input()\r\n   set placement(value: string) {\r\n      this.popover.placement = value;\r\n   }\r\n\r\n   @Input()\r\n   set triggers(value: string) {\r\n      this.popover.triggers = value;\r\n   }\r\n\r\n   @Input()\r\n   set container(value: string) {\r\n      this.popover.container = value;\r\n   }\r\n\r\n   @Input()\r\n   set popoverClass(value: string) {\r\n      this.popover.popoverClass = value;\r\n   }\r\n\r\n   @Input()\r\n   set openDelay(value: number) {\r\n      this.popover.openDelay = value;\r\n   }\r\n\r\n   @Input()\r\n   set closeDelay(value: number) {\r\n      this.popover.closeDelay = value;\r\n   }\r\n\r\n   @Input()\r\n   set animation(value: boolean) {\r\n      this.popover.animation = value;\r\n   }\r\n\r\n   public open(): void {\r\n      this.popover.open();\r\n\r\n      setTimeout(() => this.attachPopoverHoverListeners(), 0);\r\n   }\r\n\r\n   public close(): void {\r\n      this.canClosePopover.set(true);\r\n      this.popover.close();\r\n      this.cleanupPopoverListeners();\r\n   }\r\n\r\n}\r\n\r\n","import {InjectionToken} from '@angular/core';\r\nimport {ElasticSearchProvider} from './elastic-search-provider.interface';\r\nimport {DataPortalProvider} from './data-portal-provider.interface';\r\nimport {LinePreviewProvider} from './line-preview-provider.interface';\r\nimport {SodaProvider} from './soda-provider.interface';\r\n\r\nexport const ELASTIC_SEARCH_PROVIDER = new InjectionToken<ElasticSearchProvider>('ElasticSearchProvider');\r\nexport const DATA_PORTAL_PROVIDER = new InjectionToken<DataPortalProvider>('DataPortalProvider');\r\nexport const LINE_PREVIEW_PROVIDER = new InjectionToken<LinePreviewProvider>('LinePreviewProvider');\r\nexport const SODA_PROVIDER = new InjectionToken<SodaProvider>('SodaProvider');\r\n","import {Injectable, Inject} from '@angular/core';\r\nimport {catchError, map, Observable, of} from 'rxjs';\r\nimport {ImageMorphologySimilarity} from '../models/image-similarity.model';\r\nimport {ELASTIC_SEARCH_PROVIDER} from '../../common/providers/providers.tokens';\r\nimport {ElasticSearchProvider} from '../../common/providers/elastic-search-provider.interface';\r\n\r\n@Injectable({\r\n   providedIn: 'root'\r\n})\r\nexport class ImageSimilarityService {\r\n   constructor(\r\n      @Inject(ELASTIC_SEARCH_PROVIDER)\r\n      private readonly elasticService: ElasticSearchProvider\r\n   ) {}\r\n\r\n   checkNgasFileIdExists(ngasFileId: string): Observable<boolean> {\r\n      return this.elasticService\r\n         .searchByQuery({\r\n            index: 'image-morphology-similarity',\r\n            body: {\r\n               size: 1,\r\n               query: {\r\n                  term: {\r\n                     ngasFileId: ngasFileId\r\n                  }\r\n               }\r\n            }\r\n         })\r\n         .pipe(\r\n            map((res: any) => (res.hits?.total ?? 0) > 0),\r\n            catchError(() => [])\r\n         );\r\n   }\r\n\r\n   getImageSimilarityDataByNgasFileId(ngasFileId: string): Observable<ImageMorphologySimilarity> {\r\n      return this.elasticService\r\n         .searchByQuery({\r\n            index: 'image-morphology-similarity',\r\n            body: {\r\n               size: 1,\r\n               query: {\r\n                  term: {ngasFileId: ngasFileId}\r\n               }\r\n            }\r\n         })\r\n         .pipe(\r\n            map((data: any) => {\r\n               const hit = data.hits.hits[0]?._source;\r\n               if (!hit) throw new Error(`No result found for NGAS File ID: ${ngasFileId}`);\r\n\r\n               return {\r\n                  imageId: hit.imageId,\r\n                  ngasFileId: hit.ngasFileId,\r\n                  similarImageIdList: hit.similarImageIdList,\r\n                  similarImageGroups: (hit.similarImageGroups ?? []).map((group: any) => ({\r\n                     representativeImageId: group.representativeImageId,\r\n                     similarImageIdList: group.similarImageIdList\r\n                  })),\r\n                  spwId: hit.spwId,\r\n                  projectCode: hit.projectCode,\r\n                  mousUid: hit.mousUid,\r\n                  sourceName: hit.sourceName,\r\n                  scienceCategory: hit.scienceCategory,\r\n                  scienceKeywords: hit.scienceKeywords,\r\n                  freqMin: hit.freqMin,\r\n                  freqMax: hit.freqMax\r\n               } as ImageMorphologySimilarity;\r\n            }),\r\n            catchError(() => [])\r\n         );\r\n   }\r\n\r\n   getNgasFileIdsByImageIds(imageIds: string[]): Observable<ImageMorphologySimilarity[]> {\r\n      return this.elasticService\r\n         .searchByQuery({\r\n            index: 'image-morphology-similarity',\r\n            body: {\r\n               size: imageIds.length,\r\n               _source: ['imageId', 'ngasFileId', 'sourceName', 'scienceCategory', 'scienceKeywords', 'freqMin', 'freqMax', 'projectCode', 'mousUid'],\r\n               query: {\r\n                  terms: {\r\n                     imageId: imageIds\r\n                  }\r\n               }\r\n            }\r\n         })\r\n         .pipe(\r\n            map((res: any) => {\r\n               return (\r\n                  res.hits?.hits?.map((hit: any) => ({\r\n                     imageId: hit._source.imageId,\r\n                     ngasFileId: hit._source.ngasFileId,\r\n                     sourceName: hit._source.sourceName,\r\n                     scienceCategory: hit._source.scienceCategory,\r\n                     scienceKeywords: hit._source.scienceKeywords,\r\n                     freqMin: hit._source.freqMin,\r\n                     freqMax: hit._source.freqMax,\r\n                     projectCode: hit._source.projectCode,\r\n                     mousUid: hit._source.mousUid,\r\n                     similarImageIdList: [],\r\n                     similarImageGroups: [],\r\n                     spwId: ''\r\n                  })) ?? []\r\n               );\r\n            }),\r\n            catchError(() => of([]))\r\n         );\r\n   }\r\n}\r\n","import {formatDate} from '@angular/common';\r\nimport {HttpClient} from '@angular/common/http';\r\nimport {Injectable, Inject} from '@angular/core';\r\nimport {catchError, of, tap} from 'rxjs';\r\nimport {DATA_PORTAL_PROVIDER} from '../../common/providers/providers.tokens';\r\nimport {DataPortalProvider} from '../../common/providers/data-portal-provider.interface';\r\n\r\n@Injectable({\r\n   providedIn: 'root'\r\n})\r\nexport class SimilarityDownloadService {\r\n   constructor(private readonly httpClient: HttpClient, @Inject(DATA_PORTAL_PROVIDER) private readonly provider: DataPortalProvider) {}\r\n\r\n   filesCache = new Map<string, string>();\r\n   dataPortalUrl = this.provider.getDataPortalUrl();\r\n\r\n   buildFitsFileLink(fitsFileName: string): string {\r\n      return `${this.dataPortalUrl}/${fitsFileName}`;\r\n   }\r\n\r\n   loadImageBlob(file: string): void {\r\n      if (this.filesCache.has(file)) return;\r\n\r\n      this.httpClient\r\n         .get(`${this.provider.getDataPortalUrl()}/${file}`, {responseType: 'blob'})\r\n         .pipe(\r\n            tap((blob) => this.addToImageBlobCache(file, blob)),\r\n            catchError(() => {\r\n               this.filesCache.set(file, 'error fetching file');\r\n               return of(null);\r\n            })\r\n         )\r\n         .subscribe();\r\n   }\r\n\r\n   addToImageBlobCache(file: string, blob: Blob): void {\r\n      const reader = new FileReader();\r\n      reader.onload = () => {\r\n         this.filesCache.set(file, reader.result as string); // base64\r\n      };\r\n      reader.readAsDataURL(blob);\r\n   }\r\n\r\n   getImageUrl(file: string): string {\r\n      const value = this.filesCache.get(file);\r\n      return value && value !== 'error fetching file' ? value : null;\r\n   }\r\n\r\n   generateDownloadScript(fitsFileNames: string[]): void {\r\n      if (!fitsFileNames?.length) return;\r\n\r\n      const timestamp = formatDate(new Date(), 'yyyy-MM-dd-HH-mm-ss', 'en-US');\r\n      const fileName = `download_similar_images_${timestamp}.sh`;\r\n\r\n      let script = `#!/bin/bash\\n`;\r\n\r\n      for (const fitsFileName of fitsFileNames) {\r\n         script += `wget ${this.dataPortalUrl}/${fitsFileName}\\n`;\r\n      }\r\n\r\n      const blob = new Blob([script], {type: 'text/x-sh'});\r\n      const url = window.URL.createObjectURL(blob);\r\n\r\n      const a = document.createElement('a');\r\n      a.href = url;\r\n      a.download = fileName;\r\n      a.click();\r\n\r\n      window.URL.revokeObjectURL(url);\r\n   }\r\n}\r\n","import {Component, ElementRef, OnDestroy, ViewChild, EventEmitter, Output, signal, Inject} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {NgbTooltipModule, NgbModalModule, NgbTooltip} from '@ng-bootstrap/ng-bootstrap';\r\nimport {FormsModule} from '@angular/forms';\r\nimport {forkJoin, of, switchMap, tap} from 'rxjs';\r\nimport {LazyLoadDirective} from '../../../common/directives/lazy-load.directive';\r\nimport {InfiniteScrollDirective} from 'ngx-infinite-scroll';\r\nimport {DisplayImage, GroupSelectionState, ImageMorphologySimilarity, ImageMorphologySimilarityGroup} from '../../models/image-similarity.model';\r\nimport {StickyPopover} from '../../../common/directives/sticky-popover.directive';\r\nimport {ImageSimilarityService} from '../../services/image-similarity.service';\r\nimport {SimilarityDownloadService} from '../../services/similarity-download.service';\r\n\r\n@Component({\r\n   selector: 'shared-image-similarity-popup',\r\n   standalone: true,\r\n   templateUrl: './image-similarity-popup.component.html',\r\n   styleUrls: ['./image-similarity-popup.component.scss'],\r\n   imports: [CommonModule, NgbTooltipModule, NgbModalModule, InfiniteScrollDirective, StickyPopover, LazyLoadDirective, FormsModule]\r\n})\r\nexport class ImageSimilarityPopupComponent implements OnDestroy {\r\n   @Output() openSingleCarta = new EventEmitter<string>();\r\n   @Output() openMultipleCarta = new EventEmitter<string[]>();\r\n   readonly originalNgasFileId = signal<string | null>(null);\r\n   @ViewChild('scrollContainer') scrollContainerRef!: ElementRef<HTMLElement>;\r\n   allImageIds: string[] = [];\r\n   originalImageId: string;\r\n   visibleImages: DisplayImage[] = [];\r\n   page = 0;\r\n   pageSize = 200;\r\n   isLoading = false;\r\n   allLoaded = false;\r\n   selectedImageIds = new Set<string>();\r\n   similarityMatrix: number[][] = [];\r\n   similarityLookup: Record<string, string[]> = {};\r\n   lastRightClickIndex: number | null = null;\r\n   firstSelectedIndex: number | null = null;\r\n   imageMetadataCache = new Map<string, ImageMorphologySimilarity>();\r\n   groupSelectionStates: Record<string, GroupSelectionState> = {};\r\n   similarImageGroups: ImageMorphologySimilarityGroup[] = [];\r\n   displayImageGroups: DisplayImage[] = [];\r\n   displayImageGroupMap = new Map<string, DisplayImage>();\r\n   GroupSelectionState = GroupSelectionState;\r\n   reorderingEnabled: boolean = true;\r\n   resizeHandler = this.setResponsiveModalWidth.bind(this);\r\n\r\n   constructor(private readonly imageSimilarityService: ImageSimilarityService, private readonly downloadService: SimilarityDownloadService) {}\r\n\r\n   trackByImageId(index: number, image: {imageId: string}): string {\r\n      return image.imageId;\r\n   }\r\n\r\n   toggleSelection(imageId: string, popover: StickyPopover) {\r\n      if (imageId === this.originalImageId) return;\r\n      popover.close();\r\n\r\n      const isSelected = this.selectedImageIds.has(imageId);\r\n\r\n      this.setFirstSelectedIndex();\r\n\r\n      if (isSelected) {\r\n         this.selectedImageIds.delete(imageId);\r\n         this.reorderImages();\r\n      } else {\r\n         this.selectedImageIds.add(imageId);\r\n\r\n         if (this.similarityLookup[imageId]) {\r\n            // We already have the similarity list for this image (cached)\r\n            this.reorderImages();\r\n         } else {\r\n            const ngasFileId = this.visibleImages.find((img) => img.imageId === imageId).ngasFileId;\r\n            this.imageSimilarityService.getImageSimilarityDataByNgasFileId(ngasFileId).subscribe((data) => {\r\n               this.similarityLookup[imageId] = data.similarImageIdList;\r\n\r\n               this.reorderImages();\r\n            });\r\n         }\r\n      }\r\n      this.updateGroupSelectionStates();\r\n   }\r\n\r\n   reorderImages() {\r\n      if (!this.reorderingEnabled) return;\r\n\r\n      const selected = Array.from(this.selectedImageIds);\r\n      const allRelevantImages = new Set<string>();\r\n      const selectedMatrix: number[][] = [];\r\n\r\n      // Collect all unique images from all selected images similarity vectors\r\n      for (const imageId of selected) {\r\n         const similarIds = this.similarityLookup[imageId];\r\n         if (!similarIds) continue;\r\n\r\n         similarIds.forEach((id) => allRelevantImages.add(id));\r\n      }\r\n\r\n      // Convert to array for consistent indexing\r\n      const combinedImageSimilarity = Array.from(allRelevantImages);\r\n\r\n      // Build similarity matrix using the combined image similarity vectors\r\n      for (const imageId of selected) {\r\n         const similarIds = this.similarityLookup[imageId];\r\n         if (!similarIds) continue;\r\n\r\n         // Map each similarity vector to indices\r\n         const indices = similarIds.map((id) => combinedImageSimilarity.indexOf(id)).filter((index) => index !== -1);\r\n         selectedMatrix.push(indices);\r\n      }\r\n\r\n      if (selectedMatrix.length === 0) return;\r\n\r\n      // Apply similarity combine algorithm\r\n      const reordered = this.similarityCombine(selectedMatrix);\r\n      const reorderedImageIds = reordered.map((i) => combinedImageSimilarity[i]);\r\n\r\n      // Put selected images first, then reordered results (excluding already selected)\r\n      const newOrder = [...selected, ...reorderedImageIds.filter((id) => !this.selectedImageIds.has(id))];\r\n\r\n      this.allImageIds = newOrder;\r\n      this.refreshVisibleImages();\r\n   }\r\n\r\n   refreshVisibleImages() {\r\n      const totalCount = this.page * this.pageSize;\r\n      const neededIds = this.allImageIds.slice(0, totalCount);\r\n      const missingIds = neededIds.filter((id) => !this.imageMetadataCache.has(id));\r\n\r\n      // Create a lookup of currently visible images by imageId\r\n      const prevMap = new Map(this.visibleImages.map((img) => [img.imageId, img]));\r\n\r\n      const buildVisibleImages = () => {\r\n         this.visibleImages = neededIds.map((id) => {\r\n            const existing = prevMap.get(id);\r\n            if (existing) return existing;\r\n\r\n            const metadata = this.imageMetadataCache.get(id);\r\n            return this.mapToImageDisplay(id, metadata);\r\n         });\r\n      };\r\n\r\n      if (missingIds.length === 0) {\r\n         // All metadata available, rebuild visibleImages using existing references\r\n         buildVisibleImages();\r\n      } else {\r\n         // Fetch missing metadata and then rebuild visibleImages using existing references\r\n         this.imageSimilarityService.getNgasFileIdsByImageIds(missingIds).subscribe((items) => {\r\n            items.forEach((item) => {\r\n               this.imageMetadataCache.set(item.imageId, item);\r\n            });\r\n            buildVisibleImages();\r\n         });\r\n      }\r\n   }\r\n\r\n   mapToImageDisplay(imageId: string, item: any): DisplayImage {\r\n      const ngasFileId = item?.ngasFileId ?? null;\r\n      const fileName = ngasFileId ? ngasFileId.replace('.fits', '') + '.preview.tiny.png' : null;\r\n\r\n      return {\r\n         imageId,\r\n         ngasFileId,\r\n         fileName,\r\n         loaded: false,\r\n         sourceName: item?.sourceName ?? 'N/A',\r\n         scienceCategory: item?.scienceCategory ?? 'N/A',\r\n         scienceKeywords: (item?.scienceKeywords ?? '').split(',').map((k) => k.trim()),\r\n         frequencyRange: `${Number(item?.freqMin).toFixed(2) ?? '?'} - ${Number(item?.freqMax).toFixed(2) ?? '?'} GHz`,\r\n         project: item?.projectCode ?? 'N/A',\r\n         memberOUS: item?.mousUid ?? 'N/A',\r\n         ngasFileNameId: ngasFileId ? `${ngasFileId}` : 'N/A',\r\n         downloadUrl: ngasFileId ? this.downloadService.buildFitsFileLink(ngasFileId) : null\r\n      };\r\n   }\r\n\r\n   similarityCombine(similarityMatrix: number[][]): number[] {\r\n      if (similarityMatrix.length === 0) return [];\r\n      if (similarityMatrix[0].length === 0) return [];\r\n\r\n      // Step 1: Find the highest index used — this determines the size of our score array\r\n      const maxSourceId = Math.max(...similarityMatrix.flat()) + 1;\r\n\r\n      // Step 2: Prepare a score array where each index corresponds to an image index\r\n      const scoreArray = new Array<number>(maxSourceId).fill(0);\r\n\r\n      // Step 3: For each selected image's similarity list...\r\n      for (let i = 0; i < similarityMatrix.length; i++) {\r\n         for (let j = 0; j < similarityMatrix[i].length; j++) {\r\n            const sourceId = similarityMatrix[i][j];\r\n            // The earlier (more similar) the image appears, the higher its score\r\n            scoreArray[sourceId] += maxSourceId - j;\r\n         }\r\n      }\r\n\r\n      // Step 4: Set any image that had no score to a very low value\r\n      for (let i = 0; i < scoreArray.length; i++) {\r\n         if (scoreArray[i] < 1) {\r\n            scoreArray[i] = -1e10;\r\n         }\r\n      }\r\n\r\n      // Step 5: Sort images by their cumulative score (descending) and return their indices\r\n      return scoreArray\r\n         .map((score, index) => ({score, index}))\r\n         .sort((a, b) => b.score - a.score)\r\n         .slice(0, similarityMatrix[0].length)\r\n         .map((entry) => entry.index);\r\n   }\r\n\r\n   isSelected(imageId: string): boolean {\r\n      return this.selectedImageIds.has(imageId);\r\n   }\r\n\r\n   setFirstSelectedIndex() {\r\n      if (this.firstSelectedIndex === null && this.selectedImageIds.size === 1) {\r\n         const firstSelectedId = Array.from(this.selectedImageIds)[0];\r\n         this.firstSelectedIndex = this.visibleImages.findIndex((img) => img.imageId === firstSelectedId);\r\n      }\r\n   }\r\n\r\n   handleRightClick(event: MouseEvent, clickedIndex: number) {\r\n      event.preventDefault();\r\n\r\n      const clickedImageId = this.visibleImages[clickedIndex]?.imageId;\r\n      if (!clickedImageId || clickedImageId === this.originalImageId) return;\r\n\r\n      const isAlreadySelected = this.selectedImageIds.has(clickedImageId);\r\n      this.setFirstSelectedIndex();\r\n\r\n      isAlreadySelected ? this.handleRangeDeselection(clickedIndex) : this.handleRangeSelection(clickedIndex);\r\n      this.updateGroupSelectionStates();\r\n   }\r\n\r\n   handleRangeDeselection(clickedIndex: number) {\r\n      const lastSelectedIndex = this.getLastSelectedIndex();\r\n      const {start, end} = this.getRange(clickedIndex, lastSelectedIndex);\r\n\r\n      for (let i = start; i <= end; i++) {\r\n         const imageId = this.visibleImages[i]?.imageId;\r\n         if (imageId && this.selectedImageIds.has(imageId) && imageId !== this.originalImageId) {\r\n            this.selectedImageIds.delete(imageId);\r\n         }\r\n      }\r\n\r\n      this.reorderImages();\r\n   }\r\n\r\n   handleRangeSelection(clickedIndex: number) {\r\n      const {start, end} = this.getRange(clickedIndex, this.firstSelectedIndex ?? clickedIndex);\r\n      const affectedRange: string[] = [];\r\n\r\n      for (let i = start; i <= end; i++) {\r\n         const imageId = this.visibleImages[i]?.imageId;\r\n         if (imageId && imageId !== this.originalImageId) {\r\n            this.selectedImageIds.add(imageId);\r\n            if (!this.similarityLookup[imageId]) {\r\n               affectedRange.push(imageId);\r\n            }\r\n         }\r\n      }\r\n\r\n      if (affectedRange.length === 0) {\r\n         this.reorderImages();\r\n         return;\r\n      }\r\n\r\n      this.fetchMissingSimilarityData(affectedRange).subscribe(() => {\r\n         this.reorderImages();\r\n      });\r\n   }\r\n\r\n   getRange(indexA: number, indexB: number): {start: number; end: number} {\r\n      return {\r\n         start: Math.min(indexA, indexB),\r\n         end: Math.max(indexA, indexB)\r\n      };\r\n   }\r\n\r\n   fetchMissingSimilarityData(imageIds: string[]) {\r\n      const missingNgasIds: {id: string; ngasFileId: string}[] = [];\r\n\r\n      const idsToFetch: string[] = [];\r\n\r\n      imageIds.forEach((id) => {\r\n         const visible = this.visibleImages.find((img) => img.imageId === id);\r\n         const cached = this.imageMetadataCache.get(id);\r\n\r\n         if (visible?.ngasFileId) {\r\n            missingNgasIds.push({id, ngasFileId: visible.ngasFileId});\r\n         } else if (cached?.ngasFileId) {\r\n            missingNgasIds.push({id, ngasFileId: cached.ngasFileId});\r\n         } else {\r\n            idsToFetch.push(id); // Metadata not available yet\r\n         }\r\n      });\r\n\r\n      const fetchMissingMetadata$ =\r\n         idsToFetch.length > 0\r\n            ? this.imageSimilarityService.getNgasFileIdsByImageIds(idsToFetch).pipe(\r\n                 tap((items) => {\r\n                    items.forEach((item) => {\r\n                       this.imageMetadataCache.set(item.imageId, item);\r\n                       missingNgasIds.push({\r\n                          id: item.imageId,\r\n                          ngasFileId: item.ngasFileId\r\n                       });\r\n                    });\r\n                 })\r\n              )\r\n            : of(null);\r\n\r\n      return fetchMissingMetadata$.pipe(\r\n         switchMap(() => {\r\n            const requests = missingNgasIds.map(({id, ngasFileId}) =>\r\n               this.imageSimilarityService.getImageSimilarityDataByNgasFileId(ngasFileId).pipe(\r\n                  tap((data) => {\r\n                     this.similarityLookup[id] = data.similarImageIdList;\r\n                  })\r\n               )\r\n            );\r\n\r\n            return forkJoin(requests);\r\n         })\r\n      );\r\n   }\r\n\r\n   getLastSelectedIndex(): number {\r\n      let lastIndex = -1;\r\n      for (let i = this.visibleImages.length - 1; i >= 0; i--) {\r\n         if (this.selectedImageIds.has(this.visibleImages[i].imageId)) {\r\n            lastIndex = i;\r\n            break;\r\n         }\r\n      }\r\n      return lastIndex;\r\n   }\r\n\r\n   loadNextBatch() {\r\n      if (this.isLoading || this.allLoaded) return;\r\n      this.isLoading = true;\r\n\r\n      const start = this.page * this.pageSize;\r\n      const end = start + this.pageSize;\r\n      const currentBatch = this.allImageIds.slice(start, end);\r\n\r\n      if (currentBatch.length === 0) {\r\n         this.allLoaded = true;\r\n         this.isLoading = false;\r\n         return;\r\n      }\r\n\r\n      this.imageSimilarityService.getNgasFileIdsByImageIds(currentBatch).subscribe((items) => {\r\n         const itemMap = new Map(items.map((item) => [item.imageId, item]));\r\n\r\n         itemMap.forEach((item, imageId) => {\r\n            this.imageMetadataCache.set(imageId, item);\r\n         });\r\n\r\n         const batchOffset = this.page * this.pageSize;\r\n\r\n         const newImages = currentBatch.map((imageId, i) => {\r\n            const item = this.imageMetadataCache.get(imageId);\r\n            const base = this.mapToImageDisplay(imageId, item);\r\n            // First 200 images are eager; others will be lazy\r\n            const isEager = batchOffset + i < this.pageSize;\r\n\r\n            if (isEager) {\r\n               this.downloadService.loadImageBlob(base.fileName);\r\n            }\r\n\r\n            return {\r\n               ...base,\r\n               loaded: isEager\r\n            };\r\n         });\r\n\r\n         this.visibleImages = [...this.visibleImages, ...newImages];\r\n         this.page++;\r\n         setTimeout(() => {\r\n            this.setResponsiveModalWidth();\r\n         }, 0);\r\n         this.isLoading = false;\r\n         this.loadExtraIfNotScrollable();\r\n      });\r\n   }\r\n\r\n   loadSimilarImages(ngasFileId) {\r\n      this.originalNgasFileId.set(ngasFileId);\r\n      this.imageSimilarityService.getImageSimilarityDataByNgasFileId(ngasFileId).subscribe((data: ImageMorphologySimilarity) => {\r\n         this.allImageIds = data.similarImageIdList;\r\n         this.similarImageGroups = data.similarImageGroups;\r\n         this.updateGroupSelectionStates();\r\n         const representativeIds = data.similarImageGroups.map((group) => group.representativeImageId);\r\n         this.imageSimilarityService.getNgasFileIdsByImageIds(representativeIds).subscribe((repItems) => {\r\n            this.displayImageGroups = repItems.map((item) => {\r\n               this.imageMetadataCache.set(item.imageId, item);\r\n\r\n               const base = this.mapToImageDisplay(item.imageId, item);\r\n               this.downloadService.loadImageBlob(base.fileName);\r\n\r\n               return {\r\n                  ...base,\r\n                  loaded: true\r\n               };\r\n            });\r\n            this.displayImageGroups.forEach((img) => {\r\n               this.displayImageGroupMap.set(img.imageId, img);\r\n            });\r\n         });\r\n\r\n         this.originalImageId = data.imageId;\r\n         this.selectedImageIds = new Set([data.imageId]);\r\n         this.similarityLookup[data.imageId] = data.similarImageIdList;\r\n         this.page = 0;\r\n         this.visibleImages = [];\r\n         this.allLoaded = false;\r\n         this.loadNextBatch(); // Load first 200 ngasFileIds\r\n         setTimeout(() => {\r\n            window.addEventListener('resize', this.resizeHandler);\r\n         }, 0);\r\n      });\r\n   }\r\n\r\n   loadExtraIfNotScrollable(): void {\r\n      // Defer until DOM settles\r\n      setTimeout(() => {\r\n         const container = this.scrollContainerRef?.nativeElement;\r\n         if (container && container.clientHeight > 0 && container.scrollHeight <= container.clientHeight && !this.allLoaded) {\r\n            this.loadNextBatch();\r\n         }\r\n      }, 100);\r\n   }\r\n\r\n   openMousAndSourceNameSearch(): void {\r\n      const baseUrl = this.buildBaseUrl();\r\n\r\n      const mousSet = new Set<string>();\r\n      const sourceNameSet = new Set<string>();\r\n\r\n      this.selectedImageIds.forEach((imageId) => {\r\n         const imageData: ImageMorphologySimilarity = this.imageMetadataCache.get(imageId);\r\n         if (imageData) {\r\n            if (imageData.mousUid) {\r\n               mousSet.add(imageData.mousUid);\r\n            }\r\n            if (imageData.sourceName) {\r\n               sourceNameSet.add(imageData.sourceName);\r\n            }\r\n         }\r\n      });\r\n\r\n      const encodedMous = encodeURIComponent([...mousSet].join('|'));\r\n      const encodedSourceNames = encodeURIComponent([...sourceNameSet].join('|'));\r\n\r\n      const fullUrl = `${baseUrl}?result_view=observations&mous=${encodedMous}&sourceName=${encodedSourceNames}`;\r\n\r\n      window.open(fullUrl, '_blank');\r\n   }\r\n\r\n   buildBaseUrl(): string {\r\n      return `${window.location.origin}/aq/`;\r\n   }\r\n\r\n   onDownloadScriptClick(): void {\r\n      const fitsFileNames = Array.from(this.selectedImageIds).map((imageId) => this.imageMetadataCache.get(imageId).ngasFileId);\r\n      this.downloadService.generateDownloadScript(fitsFileNames);\r\n   }\r\n\r\n   toggleGroupSelection(group: ImageMorphologySimilarityGroup): void {\r\n      const affectedIds = group.similarImageIdList.filter((id) => id !== this.originalImageId);\r\n      const allSelected = affectedIds.every((id) => this.selectedImageIds.has(id));\r\n\r\n      if (allSelected) {\r\n         // Deselect\r\n         affectedIds.forEach((id) => this.selectedImageIds.delete(id));\r\n         this.updateGroupSelectionStates();\r\n         this.reorderImages();\r\n      } else {\r\n         // Select\r\n         affectedIds.forEach((id) => this.selectedImageIds.add(id));\r\n\r\n         const missing = affectedIds.filter((id) => !this.similarityLookup[id]);\r\n\r\n         if (missing.length === 0) {\r\n            // All similarity data already cached\r\n            this.updateGroupSelectionStates();\r\n            this.reorderImages();\r\n         } else {\r\n            // Fetch similarity data for the new selections\r\n            this.fetchMissingSimilarityData(missing).subscribe(() => {\r\n               this.updateGroupSelectionStates();\r\n               this.reorderImages();\r\n            });\r\n         }\r\n      }\r\n   }\r\n\r\n   updateGroupSelectionStates(): void {\r\n      this.groupSelectionStates = {};\r\n\r\n      for (const group of this.similarImageGroups) {\r\n         const filteredIds = group.similarImageIdList.filter((id) => id !== this.originalImageId);\r\n         const selected = filteredIds.filter((id) => this.selectedImageIds.has(id));\r\n         const total = filteredIds.length;\r\n\r\n         this.groupSelectionStates[group.representativeImageId] = selected.length === 0 ? GroupSelectionState.None : selected.length === total ? GroupSelectionState.All : GroupSelectionState.Partial;\r\n      }\r\n   }\r\n\r\n   getImageCssClasses(imageId: string): Record<string, boolean> {\r\n      const isSelected = this.selectedImageIds.has(imageId);\r\n\r\n      const groupState = this.findGroupStateForImage(imageId);\r\n\r\n      return {\r\n         imageSelected: isSelected,\r\n         groupFullySelected: groupState === GroupSelectionState.All,\r\n         groupPartialSelected: groupState === GroupSelectionState.Partial\r\n      };\r\n   }\r\n\r\n   findGroupStateForImage(imageId: string): GroupSelectionState {\r\n      for (const group of this.similarImageGroups) {\r\n         if (group.similarImageIdList.includes(imageId)) {\r\n            return this.groupSelectionStates[group.representativeImageId] || GroupSelectionState.None;\r\n         }\r\n      }\r\n      return GroupSelectionState.None;\r\n   }\r\n\r\n   openCartaForAllSelectedFiles() {\r\n      const ngasFileIds: string[] = Array.from(this.selectedImageIds).map((imageId) => this.imageMetadataCache.get(imageId).ngasFileId);\r\n      this.openMultipleCarta.emit(ngasFileIds);\r\n   }\r\n\r\n   openCartaForSelectedFile(ngasFileId: string) {\r\n      this.openSingleCarta.emit(ngasFileId);\r\n   }\r\n\r\n   onReorderingToggleChange(tooltip: NgbTooltip) {\r\n      // Close and reopen tooltip to make sure tooltip text is updated based on reorderingEnabled value.\r\n      if (tooltip.isOpen()) {\r\n         tooltip.close();\r\n         setTimeout(() => tooltip.open(), 0);\r\n      }\r\n      if (this.reorderingEnabled) {\r\n         this.reorderImages();\r\n      }\r\n   }\r\n\r\n   onScroll() {\r\n      this.loadNextBatch();\r\n   }\r\n\r\n   public triggerResize() {\r\n      this.setResponsiveModalWidth();\r\n   }\r\n\r\n   setResponsiveModalWidth() {\r\n      const modalDialog = document.querySelector('div[role=\"document\"].modal-dialog') as HTMLElement;\r\n      const modalContent = document.querySelector('.modal-content') as HTMLElement;\r\n      const modalBody = document.querySelector('.modal-body') as HTMLElement;\r\n      const imageGrid = document.querySelector('.image-grid') as HTMLElement;\r\n      const imageItem = document.querySelector('.image-item') as HTMLElement;\r\n\r\n      if (!modalDialog) return;\r\n\r\n      // Apply base layout and fallback width\r\n      Object.assign(modalDialog.style, {\r\n         margin: 'auto',\r\n         height: '90%',\r\n         position: 'fixed',\r\n         top: '50%',\r\n         left: '50%',\r\n         transform: 'translate(-50%, -50%)'\r\n      });\r\n\r\n      modalDialog.style.setProperty('width', '90vw', 'important');\r\n      modalDialog.style.setProperty('max-width', '90vw', 'important');\r\n      modalDialog.style.setProperty('min-width', '60vw', 'important');\r\n\r\n      // If all elements exist, calculate the exact width of the modal based on how many images can fit per row.\r\n      // This ensures the modal resizes to fit the images perfectly with no leftover space.\r\n      if (!imageGrid || !modalContent || !modalBody || !imageItem) return;\r\n\r\n      const imageSize = imageItem.offsetWidth;\r\n\r\n      const gridStyles = window.getComputedStyle(imageGrid);\r\n      const gapSize = parseFloat(gridStyles.columnGap || gridStyles.gap || '0');\r\n\r\n      const bodyStyles = window.getComputedStyle(modalBody);\r\n      const paddingLeft = parseFloat(bodyStyles.paddingLeft || '0');\r\n      const paddingRight = parseFloat(bodyStyles.paddingRight || '0');\r\n      const modalPadding = paddingLeft + paddingRight;\r\n\r\n      const maxWidth = window.innerWidth * 0.9;\r\n      const maxImagesPerRow = Math.floor((maxWidth - imageSize) / (imageSize + gapSize));\r\n      const imageCount = imageGrid.querySelectorAll('.image-item').length;\r\n      const imagesInRow = Math.min(maxImagesPerRow, imageCount);\r\n\r\n      const contentWidth = imagesInRow * imageSize + (imagesInRow + 1) * gapSize + modalPadding;\r\n\r\n      modalDialog.style.width = `${contentWidth}px`;\r\n\r\n      const currentHeightPx = modalBody.offsetHeight;\r\n      const viewportHeightPx = window.innerHeight;\r\n\r\n      const currentHeightVh = (currentHeightPx / viewportHeightPx) * 100;\r\n      modalBody.style.minHeight = `${currentHeightVh}vh`;\r\n\r\n      this.loadExtraIfNotScrollable();\r\n   }\r\n\r\n   ngOnDestroy(): void {\r\n      window.removeEventListener('resize', this.resizeHandler);\r\n   }\r\n}\r\n","<div class=\"modal-header bg-primary\">\r\n   <h4 class=\"modal-title text-white\">Image Morphology Similarity Search</h4>\r\n   <div class=\"ms-auto d-flex align-items-center\">\r\n      <div\r\n         style=\"margin: 0.125rem 0 0.125rem 0\"\r\n         class=\"form-check form-check-inline form-switch\">\r\n         <input\r\n            id=\"aq-img-similarity-group-toggle-reordering\"\r\n            #reorderTooltip=\"ngbTooltip\"\r\n            class=\"form-check-input\"\r\n            type=\"checkbox\"\r\n            [(ngModel)]=\"reorderingEnabled\"\r\n            triggers=\"hover\"\r\n            placement=\"left\"\r\n            [ngbTooltip]=\"reorderingEnabled ? 'Disable automatic reordering' : 'Enable automatic reordering'\"\r\n            (change)=\"onReorderingToggleChange(reorderTooltip)\" />\r\n      </div>\r\n      <button\r\n         id=\"aq-img-similarity-carta-all-selected-files\"\r\n         class=\"unstyled-button\"\r\n         (click)=\"openCartaForAllSelectedFiles()\">\r\n         <img\r\n            class=\"py-1\"\r\n            src=\"assets/images/carta_logo.png\"\r\n            style=\"cursor: pointer; padding-left: 0.75rem; padding-right: 0.75rem\"\r\n            placement=\"left\"\r\n            [ngbTooltip]=\"'CARTA'\"\r\n            alt=\"CARTA\" />\r\n      </button>\r\n      <button\r\n         id=\"aq-img-similarity-download-script-for-selected-fits\"\r\n         class=\"btn\"\r\n         style=\"color: white\"\r\n         (click)=\"onDownloadScriptClick()\">\r\n         <i\r\n            class=\"fa-light fa-download me-1\"\r\n            [ngbTooltip]=\"'Download script for selected FITS files'\"></i>\r\n      </button>\r\n\r\n      <button\r\n         id=\"aq-img-similarity-open-selected-files-new-tab\"\r\n         class=\"btn\"\r\n         style=\"color: white; padding-right: 19px\"\r\n         (click)=\"openMousAndSourceNameSearch()\">\r\n         <i\r\n            class=\"fa-light fa-up-right-from-square me-1\"\r\n            [ngbTooltip]=\"'Open selected observations in a new tab'\"></i>\r\n      </button>\r\n   </div>\r\n</div>\r\n\r\n<div class=\"d-flex justify-content-between align-items-center first-row\">\r\n   <span class=\"ps-3 fw-semibold\">{{ originalNgasFileId() }}</span>\r\n   <div class=\"group-representatives d-flex justify-content-end\">\r\n      @for (group of similarImageGroups; let i = $index; track group.representativeImageId) {\r\n      <div\r\n         id=\"{{ 'aq-img-similarity-group-' + (i + 1) }}\"\r\n         class=\"image-item\"\r\n         [ngClass]=\"{\r\n            groupFullySelected: groupSelectionStates[group.representativeImageId] === GroupSelectionState.All,\r\n            groupPartialSelected: groupSelectionStates[group.representativeImageId] === GroupSelectionState.Partial\r\n         }\"\r\n         (click)=\"toggleGroupSelection(group)\">\r\n         <span\r\n            #stickyPopover=\"stickyPopover\"\r\n            [stickyPopover]=\"'Quick select group ' + (i + 1)\"\r\n            [autoClose]=\"false\"\r\n            [animation]=\"false\"\r\n            [openDelay]=\"300\"\r\n            popoverClass=\"preview-popover\"\r\n            [placement]=\"['bottom', 'top', 'bottom-start', 'bottom-end', 'top-start', 'top-end']\"\r\n            container=\"body\"\r\n            style=\"font-size: 15px\">\r\n            @if (displayImageGroupMap.get(group.representativeImageId); as image) {\r\n            <img\r\n               [src]=\"downloadService.getImageUrl(image.fileName)\"\r\n               [alt]=\"'ID: ' + image.imageId\" />\r\n            }\r\n         </span>\r\n      </div>\r\n      }\r\n   </div>\r\n</div>\r\n\r\n<div\r\n   class=\"modal-body image-scroll-container\"\r\n   #scrollContainer\r\n   infiniteScroll\r\n   [infiniteScrollDistance]=\"2\"\r\n   [infiniteScrollThrottle]=\"100\"\r\n   [scrollWindow]=\"false\"\r\n   (scrolled)=\"onScroll()\">\r\n   <div class=\"image-grid\">\r\n      @for (image of visibleImages; let i = $index; track image.imageId) {\r\n      <div\r\n         id=\"{{ 'aq-img-similarity-file-id-' + image.imageId }}\"\r\n         class=\"image-item\"\r\n         [class.imageSelected]=\"isSelected(image.imageId)\"\r\n         (click)=\"toggleSelection(image.imageId, stickyPopover)\"\r\n         (contextmenu)=\"handleRightClick($event, i)\">\r\n         <span\r\n            #stickyPopover=\"stickyPopover\"\r\n            [stickyPopover]=\"popContent\"\r\n            [popoverContext]=\"{image: image}\"\r\n            triggers=\"manual\"\r\n            [popoverTitle]=\"popTitle\"\r\n            [autoClose]=\"false\"\r\n            [animation]=\"false\"\r\n            [openDelay]=\"750\"\r\n            popoverClass=\"preview-popover\"\r\n            [placement]=\"['bottom', 'top', 'bottom-start', 'bottom-end', 'top-start', 'top-end']\"\r\n            container=\"body\"\r\n            style=\"font-size: 15px\">\r\n            @if (image.loaded) {\r\n            <img\r\n               [src]=\"downloadService.getImageUrl(image.fileName)\"\r\n               [alt]=\"'ID: ' + image.imageId\"\r\n               loading=\"lazy\" />\r\n            } @else {\r\n            <div\r\n               appLazyLoad\r\n               (lazyLoad)=\"image.loaded = true; downloadService.loadImageBlob(image.fileName)\"\r\n               class=\"image-loader-placeholder\"></div>\r\n            }\r\n         </span>\r\n\r\n         <ng-template #popContent>\r\n            <div>\r\n               <div><b>Image id:</b> {{ image.imageId || '-' }}</div>\r\n               <div><b>Source:</b> {{ image.sourceName || '-' }}</div>\r\n               <div><b>Category:</b> {{ image.scienceCategory || '-' }}</div>\r\n               <div><b>Keywords:</b> {{ (image.scienceKeywords || []).join(', ') }}</div>\r\n               <div><b>Frequency:</b> {{ image.frequencyRange || '-' }}</div>\r\n               <div><b>Project:</b> {{ image.project || '-' }}</div>\r\n               <div><b>Member OUS:</b> {{ image.memberOUS || '-' }}</div>\r\n               <div>\r\n                  @if (image.downloadUrl) {\r\n                  <b>File:</b>\r\n                  <a\r\n                     id=\"{{ 'aq-img-similarity-download-file-id-' + image.imageId }}\"\r\n                     [href]=\"image.downloadUrl\"\r\n                     target=\"_blank\"\r\n                     style=\"color: #194775\">\r\n                     {{ image.ngasFileNameId }}\r\n                  </a>\r\n                  } @else {\r\n                  <span style=\"color: grey; font-style: italic\">No file available</span>\r\n                  }\r\n               </div>\r\n               <button\r\n                  id=\"{{ 'aq-img-similarity-carta-file-id-' + image.imageId }}\"\r\n                  class=\"unstyled-button\"\r\n                  (click)=\"openCartaForSelectedFile(image.ngasFileId)\">\r\n                  <img\r\n                     class=\"py-1\"\r\n                     src=\"assets/images/carta_logo.png\"\r\n                     style=\"cursor: pointer\"\r\n                     placement=\"right\"\r\n                     [ngbTooltip]=\"'CARTA'\"\r\n                     alt=\"CARTA\" />\r\n               </button>\r\n            </div>\r\n         </ng-template>\r\n      </div>\r\n      }\r\n   </div>\r\n\r\n   @if (isLoading) {\r\n   <div class=\"d-flex spinner-wrapper\">\r\n      <div\r\n         class=\"spinner-border spinner-border-sm\"\r\n         role=\"status\">\r\n         <span class=\"visually-hidden\">Loading...</span>\r\n      </div>\r\n   </div>\r\n   }\r\n</div>\r\n\r\n<ng-template #popTitle> <i class=\"fa-light fa-list-alt me-1\"></i>Observation details </ng-template>\r\n","import {CommonModule} from '@angular/common';\r\nimport {Component, ElementRef, EventEmitter, Input, Output, ViewChild} from '@angular/core';\r\nimport {FormsModule} from '@angular/forms';\r\nimport {catchError, finalize, forkJoin, from, ObservableInput, of, switchMap, tap} from 'rxjs';\r\nimport {SafePipe} from '../../../common/pipes/safe.pipe';\r\nimport {NgbModal, NgbModalRef, NgbTooltipModule} from '@ng-bootstrap/ng-bootstrap';\r\nimport {ImageSimilarityPopupComponent} from '../image-similarity-popup/image-similarity-popup.component';\r\n\r\n@Component({\r\n   selector: 'shared-image-similarity-trigger',\r\n   standalone: true,\r\n   templateUrl: './image-similarity-trigger.component.html',\r\n   imports: [CommonModule, FormsModule, SafePipe, NgbTooltipModule]\r\n})\r\nexport class ImageSimilarityTriggerComponent {\r\n   @Input() fileId!: string;\r\n   @Input() hideIcon;\r\n   @Input() tooltipPlacement: string = 'right';\r\n   @Input() tooltipContainer: string = '';\r\n   @Input({required: true}) fetchCartaSocketUrlFn!: (fileId: string) => ObservableInput<string>;\r\n\r\n   @Output() started = new EventEmitter<void>();\r\n\r\n   @ViewChild('cartaModalTemplate', {static: true}) cartaModalTemplate: ElementRef;\r\n\r\n   isCartaLoading = false;\r\n   cartaSocketUrl?: string;\r\n   cartaSocketUrls?: string[];\r\n   cartaInfoMessage = '';\r\n   cartaErrorMessage = '';\r\n\r\n   constructor(private modalService: NgbModal) {}\r\n\r\n   openImageSimilaritySearch(): void {\r\n      if (!this.fileId || !this.fetchCartaSocketUrlFn) return;\r\n      this.started.emit();\r\n\r\n      const modalSimilarityRef: NgbModalRef = this.modalService.open(ImageSimilarityPopupComponent, {centered: true, scrollable: true, size: 'xl'});\r\n      modalSimilarityRef.componentInstance.loadSimilarImages(this.fileId);\r\n\r\n      // Subscribe to the open single CARTA event\r\n      modalSimilarityRef.componentInstance.openSingleCarta.subscribe((fileId: string) => {\r\n         modalSimilarityRef.close();\r\n         this.openCartaSingle(fileId);\r\n      });\r\n\r\n      // Subscribe to the open CARTA with multiple selected files event\r\n      modalSimilarityRef.componentInstance.openMultipleCarta.subscribe((fileIds: string[]) => {\r\n         const originalFileId = modalSimilarityRef.componentInstance.originalNgasFileId();\r\n         modalSimilarityRef.close();\r\n         const others = fileIds.filter((id) => id !== originalFileId);\r\n         if (others.length > 0) {\r\n            this.openCartaMultiple(originalFileId, others);\r\n         } else {\r\n            this.openCartaSingle(originalFileId);\r\n         }\r\n      });\r\n   }\r\n\r\n   public openCartaSingle(fileId: string): void {\r\n      this.showCartaModal();\r\n\r\n      from(this.fetchCartaSocketUrlFn(fileId))\r\n         .pipe(\r\n            tap((url) => {\r\n               this.cartaSocketUrl = url;\r\n               this.cartaSocketUrls = undefined;\r\n               this.cartaInfoMessage = '';\r\n            }),\r\n            catchError(() => {\r\n               this.cartaErrorMessage = 'Could not load CARTA. Please try again later.';\r\n               return of(null);\r\n            }),\r\n            finalize(() => (this.isCartaLoading = false))\r\n         )\r\n         .subscribe();\r\n   }\r\n\r\n   openCartaMultiple(originalFileId: string, otherFileIds: string[]): void {\r\n      this.showCartaModal();\r\n\r\n      const others$ = otherFileIds.length ? forkJoin(otherFileIds.map((id) => from(this.fetchCartaSocketUrlFn(id)))) : of<string[]>([]);\r\n\r\n      others$\r\n         .pipe(\r\n            switchMap((urls) => {\r\n               this.cartaSocketUrls = urls;\r\n               const total = otherFileIds.length + 1;\r\n               const label = total === 1 ? 'file' : 'files';\r\n               this.cartaInfoMessage = `You have selected ${total} ${label} in the similarity search. ` + `Please go to File → Append image ... and select the image files to see them all in CARTA.`;\r\n\r\n               return from(this.fetchCartaSocketUrlFn(originalFileId));\r\n            }),\r\n            tap((originalUrl) => (this.cartaSocketUrl = originalUrl)),\r\n            catchError(() => {\r\n               this.cartaErrorMessage = 'Could not load CARTA. Please try again later.';\r\n               return of(null);\r\n            }),\r\n            finalize(() => (this.isCartaLoading = false))\r\n         )\r\n         .subscribe();\r\n   }\r\n\r\n   showCartaModal(): void {\r\n      this.started.emit();\r\n      this.isCartaLoading = true;\r\n      this.cartaSocketUrl = undefined;\r\n      this.cartaSocketUrls = undefined;\r\n      this.cartaInfoMessage = '';\r\n      this.cartaErrorMessage = '';\r\n\r\n      this.modalService.open(this.cartaModalTemplate);\r\n      setTimeout(() => requestAnimationFrame(() => this.centerModalAndSetTheCorrectWidth()), 0);\r\n   }\r\n\r\n   openCartaInANewTab(): void {\r\n      if (this.cartaSocketUrl) {\r\n         window.open(this.cartaSocketUrl, '_blank');\r\n      }\r\n   }\r\n\r\n   centerModalAndSetTheCorrectWidth(): void {\r\n      const dialogs = document.querySelectorAll('.modal.show .modal-dialog');\r\n      const bodies = document.querySelectorAll('.modal.show .modal-body');\r\n\r\n      // Select the last .modal.show instead of the first generic .modal-body found so that the styles are applied\r\n      const modalDialog = dialogs.length ? (dialogs[dialogs.length - 1] as HTMLElement) : null;\r\n      const modalBody = bodies.length ? (bodies[bodies.length - 1] as HTMLElement) : null;\r\n      if (!modalDialog) return;\r\n\r\n      // Apply base layout and fallback width\r\n      Object.assign(modalDialog.style, {\r\n         margin: 'auto',\r\n         height: '90%',\r\n         position: 'fixed',\r\n         top: '50%',\r\n         left: '50%',\r\n         transform: 'translate(-50%, -50%)'\r\n      });\r\n\r\n      modalDialog.style.setProperty('width', '65vw', 'important');\r\n      modalDialog.style.setProperty('max-width', '65vw', 'important');\r\n      modalDialog.style.setProperty('min-width', '60vw', 'important');\r\n\r\n      if (modalBody) {\r\n         const currentHeightPx = modalBody.offsetHeight || 0;\r\n         const viewportHeightPx = window.innerHeight || 1;\r\n         modalBody.style.minHeight = `${(currentHeightPx / viewportHeightPx) * 100}vh`;\r\n      }\r\n   }\r\n}\r\n","@if (!hideIcon) {\r\n<span\r\n   class=\"fa-stack mb-2\"\r\n   id=\"{{ 'image-morphology-similarity-search-' + fileId }}\"\r\n   style=\"cursor: pointer; margin-top: 5px\"\r\n   [placement]=\"tooltipPlacement\"\r\n   [container]=\"tooltipContainer\"\r\n   [ngbTooltip]=\"'Image Similarity Search'\"\r\n   (click)=\"openImageSimilaritySearch()\">\r\n   <i\r\n      class=\"fa fa-regular fa-square fa-stack-2x\"\r\n      style=\"font-weight: 300\"></i>\r\n   <i\r\n      class=\"fa fa-tilde fa-stack-1x fa-inverse\"\r\n      style=\"color: black\"></i>\r\n</span>\r\n}\r\n\r\n<ng-template #cartaModalTemplate>\r\n   <div\r\n      class=\"modal-header bg-primary\"\r\n      style=\"padding: 5px !important\">\r\n      <h4 class=\"modal-title text-white\">\r\n         <img\r\n            src=\"assets/images/carta_logo.png\"\r\n            class=\"me-2\" />CARTA\r\n      </h4>\r\n      <div class=\"ms-auto\">\r\n         @if (cartaSocketUrl && !isCartaLoading) {\r\n         <button\r\n            class=\"btn float-end\"\r\n            (click)=\"openCartaInANewTab()\"\r\n            style=\"color: white\">\r\n            <i class=\"fa-light fa-up-right-from-square me-1\"></i>\r\n         </button>\r\n         }\r\n      </div>\r\n   </div>\r\n\r\n   <div class=\"modal-body\">\r\n      @if (cartaErrorMessage) {\r\n      <div\r\n         class=\"d-flex justify-content-center align-items-center\"\r\n         style=\"height: 75vh\">\r\n         <div class=\"text-center text-danger\">\r\n            <i class=\"fa fa-exclamation-triangle me-2\"></i>{{ cartaErrorMessage }}\r\n         </div>\r\n      </div>\r\n      } @else if (isCartaLoading || !cartaSocketUrl) {\r\n      <div\r\n         class=\"d-flex justify-content-center align-items-center\"\r\n         style=\"height: 75vh\">\r\n         <div\r\n            class=\"spinner-border spinner-border-sm\"\r\n            role=\"status\">\r\n            <span class=\"visually-hidden\">Loading...</span>\r\n         </div>\r\n      </div>\r\n      } @else { @if (cartaInfoMessage) {\r\n      <div class=\"mb-2 px-2 mx-1 py-1 bg-info bg-opacity-10 border border-success border-opacity-10 rounded-2 w-100\">\r\n         {{ cartaInfoMessage }}\r\n      </div>\r\n      }\r\n      <iframe\r\n         title=\"CARTA\"\r\n         [src]=\"cartaSocketUrl | safe : 'resourceUrl'\"\r\n         class=\"w-100\"\r\n         style=\"height: 75vh\">\r\n      </iframe>\r\n      }\r\n   </div>\r\n</ng-template>\r\n","import {ChangeDetectionStrategy, Component, HostListener, Inject, Input, ViewChild} from '@angular/core';\r\nimport {CommonModule} from '@angular/common';\r\nimport {StickyPopover} from '../../common/directives/sticky-popover.directive';\r\nimport {AdmitProductLine} from '../models/line.model';\r\nimport {LINE_PREVIEW_PROVIDER} from '../../common/providers/providers.tokens';\r\nimport {LinePreviewProvider} from '../../common/providers/line-preview-provider.interface';\r\n\r\n@Component({\r\n   selector: 'lib-line-preview',\r\n   standalone: true,\r\n   imports: [CommonModule, StickyPopover],\r\n   templateUrl: './line-preview.component.html',\r\n   changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class LinePreviewComponent {\r\n   @ViewChild('stickyPopover', {static: true}) stickyPopover!: StickyPopover;\r\n\r\n   @Input({required: true}) row!: AdmitProductLine;\r\n   @Input({required: true}) dataPortalUrl!: string;\r\n\r\n   constructor(@Inject(LINE_PREVIEW_PROVIDER) private readonly provider: LinePreviewProvider) {}\r\n\r\n   get moment0Id(): string | undefined {\r\n      return this.row?.moment0NgasFileId;\r\n   }\r\n\r\n   get moment0Url(): string {\r\n      return this.moment0Id ? this.provider.getFileUrl(this.moment0Id) : '';\r\n   }\r\n\r\n   openFileInNewTab(file: string): void {\r\n      window.open(`${this.dataPortalUrl}/${file}`, '_blank');\r\n   }\r\n\r\n   openXmlInNewTab(): void {\r\n      const xml = this.row?.admitProductSource?.ngasFileId;\r\n      if (!xml) return;\r\n      window.open(`${this.dataPortalUrl}/${xml}`, '_blank');\r\n   }\r\n\r\n   openTgzInNewTab(): void {\r\n      const xml = this.row?.admitProductSource?.ngasFileId;\r\n      if (!xml) return;\r\n\r\n      const tgz = xml.replace(/\\.[^./\\\\]+$/, '.tgz');\r\n      window.open(`${this.dataPortalUrl}/${tgz}`, '_blank');\r\n   }\r\n\r\n   @HostListener('mouseenter')\r\n   onMouseEnter(): void {\r\n      if (this.moment0Id) {\r\n         this.provider.prefetch?.(this.moment0Id);\r\n      }\r\n   }\r\n}\r\n","<span\r\n   #stickyPopover=\"stickyPopover\"\r\n   [stickyPopover]=\"popContent\"\r\n   [popoverTitle]=\"popTitle\"\r\n   [autoClose]=\"false\"\r\n   [animation]=\"false\"\r\n   [openDelay]=\"300\"\r\n   popoverClass=\"preview-popover\"\r\n   placement=\"right-bottom\"\r\n   container=\"body\"\r\n   style=\"font-size: 15px\">\r\n   <i class=\"fa-light fa-image\"></i>\r\n</span>\r\n\r\n<ng-template #popTitle> <i class=\"fa-light fa-image me-1\"></i> Previews for {{ row.formula }} - {{ row.transition }} </ng-template>\r\n\r\n<ng-template #popContent>\r\n   <div class=\"d-flex flex-row bd-highlight mb-3\">\r\n      <div class=\"border rounded\">\r\n         <div\r\n            id=\"{{ 'cell-preview-line-mom0-' + row.id }}\"\r\n            class=\"d-flex justify-content-center align-items-center\">\r\n            <img\r\n               *ngIf=\"moment0Id; else noMom0\"\r\n               [src]=\"moment0Url\"\r\n               [style.width.px]=\"210\"\r\n               [style.height.px]=\"210\"\r\n               style=\"cursor: pointer\"\r\n               (click)=\"openFileInNewTab(moment0Id!)\" />\r\n            <ng-template #noMom0>\r\n               <div class=\"p-3 text-muted text-nowrap\">No moment0 preview</div>\r\n            </ng-template>\r\n         </div>\r\n      </div>\r\n\r\n      <div class=\"d-flex flex-column p-2\">\r\n         <div class=\"text-nowrap mb-2\">\r\n            <a\r\n               id=\"{{ 'cell-preview-line-xml' + row.id }}\"\r\n               class=\"link-primary me-4\"\r\n               style=\"cursor: pointer\"\r\n               (click)=\"openXmlInNewTab()\">\r\n               ADMIT xml\r\n            </a>\r\n         </div>\r\n\r\n         <div class=\"text-nowrap mb-2\">\r\n            <a\r\n               id=\"{{ 'cell-preview-line-tgz' + row.id }}\"\r\n               class=\"link-primary me-4\"\r\n               style=\"cursor: pointer\"\r\n               (click)=\"openTgzInNewTab()\">\r\n               ADMIT tgz\r\n            </a>\r\n         </div>\r\n      </div>\r\n   </div>\r\n</ng-template>\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {catchError, map, Observable, of} from 'rxjs';\r\nimport {AdmitProductLine} from '../models/line.model';\r\nimport {ELASTIC_SEARCH_PROVIDER} from '../../common/providers/providers.tokens';\r\nimport {ElasticSearchProvider} from '../../common/providers/elastic-search-provider.interface';\r\nimport {orderBy} from 'lodash';\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class LineDetectionsService {\r\n   constructor(\r\n      @Inject(ELASTIC_SEARCH_PROVIDER)\r\n      private readonly elastic: ElasticSearchProvider\r\n   ) {}\r\n\r\n   getDetectedLinesByNgasFitsFileId(ngasFitsFileId?: string): Observable<AdmitProductLine[]> {\r\n      if (!ngasFitsFileId) {\r\n         return of([]);\r\n      }\r\n\r\n      return this.elastic\r\n         .searchByQuery({\r\n            index: 'admit-lines',\r\n            body: {\r\n               _source: ['id', 'formula', 'transition', 'peakIntensity', 'moment0NgasFileId', 'admitProductSource.ngasFileId'],\r\n               query: {terms: {ngasFitsFileId: [ngasFitsFileId]}}\r\n            }\r\n         })\r\n         .pipe(\r\n            map((data: any) => (data?.hits?.hits ?? []).map(({_source}: any) => ({..._source} as AdmitProductLine))),\r\n            map((lines) => this.filterByUniqueMoleculeTransitionPair(lines)),\r\n            map((lines) => orderBy(lines, [(l) => Number(l.peakIntensity)], ['desc'])),\r\n            catchError(() => of([]))\r\n         );\r\n   }\r\n\r\n   filterByUniqueMoleculeTransitionPair(lines: AdmitProductLine[]): AdmitProductLine[] {\r\n      const uniqueLines = new Map<string, AdmitProductLine>();\r\n\r\n      for (const line of lines ?? []) {\r\n         const molecule = line.formula?.trim() ?? '';\r\n         const transition = line.transition?.trim() ?? '';\r\n         if (!molecule || !transition) continue;\r\n\r\n         const key = `${molecule}_${transition}`;\r\n         const existing = uniqueLines.get(key);\r\n\r\n         if (!existing || line.peakIntensity > existing.peakIntensity) {\r\n            uniqueLines.set(key, line);\r\n         }\r\n      }\r\n\r\n      return Array.from(uniqueLines.values());\r\n   }\r\n}\r\n","const GALACTIC_MATRIX = [-0.054875539726, 0.494109453312, -0.867666135858, -0.87343710801, -0.444829589425, -0.198076386122, -0.483834985808, 0.74698225181, 0.455983795705];\r\n\r\nexport function galacticToRaDec(longitude: number, latitude: number): {ra: number; dec: number} {\r\n   const d2r = Math.PI / 180;\r\n   const r2d = 180 / Math.PI;\r\n   const twopi = 2 * Math.PI;\r\n\r\n   longitude *= d2r;\r\n   latitude *= d2r;\r\n\r\n   const cp1 = Math.cos(latitude);\r\n   const m = [Math.cos(longitude) * cp1, Math.sin(longitude) * cp1, Math.sin(latitude)];\r\n\r\n   const s = [0, 0, 0];\r\n   s[0] = m[0] * GALACTIC_MATRIX[0] + m[1] * GALACTIC_MATRIX[1] + m[2] * GALACTIC_MATRIX[2];\r\n   s[1] = m[0] * GALACTIC_MATRIX[3] + m[1] * GALACTIC_MATRIX[4] + m[2] * GALACTIC_MATRIX[5];\r\n   s[2] = m[0] * GALACTIC_MATRIX[6] + m[1] * GALACTIC_MATRIX[7] + m[2] * GALACTIC_MATRIX[8];\r\n\r\n   const r = Math.sqrt(s[0] * s[0] + s[1] * s[1] + s[2] * s[2]);\r\n   const b = Math.asin(s[2] / r);\r\n   const cb = Math.cos(b);\r\n   let a = Math.atan2(s[1] / r / cb, s[0] / r / cb);\r\n\r\n   if (a < 0) {\r\n      a += twopi;\r\n   }\r\n\r\n   return {ra: a * r2d, dec: b * r2d};\r\n}\r\n\r\nexport function eclipticToRaDec(lambda: number, beta: number): {ra: number; dec: number} {\r\n   const lambdaRad = (lambda * Math.PI) / 180;\r\n   const betaRad = (beta * Math.PI) / 180;\r\n   const epsilonDeg = 23.439291;\r\n   const epsilonRad = (epsilonDeg * Math.PI) / 180;\r\n\r\n   const sinLambda = Math.sin(lambdaRad);\r\n   const cosLambda = Math.cos(lambdaRad);\r\n   const tanBeta = Math.tan(betaRad);\r\n   const sinBeta = Math.sin(betaRad);\r\n   const cosBeta = Math.cos(betaRad);\r\n   const cosEpsilon = Math.cos(epsilonRad);\r\n   const sinEpsilon = Math.sin(epsilonRad);\r\n\r\n   const numerator = sinLambda * cosEpsilon - tanBeta * sinEpsilon;\r\n   const denominator = cosLambda;\r\n   let alphaRad = Math.atan2(numerator, denominator);\r\n\r\n   if (alphaRad < 0) {\r\n      alphaRad += 2 * Math.PI;\r\n   }\r\n\r\n   const deltaRad = Math.asin(sinBeta * cosEpsilon + cosBeta * sinEpsilon * sinLambda);\r\n\r\n   const raDeg = (alphaRad * 180) / Math.PI;\r\n   const decDeg = (deltaRad * 180) / Math.PI;\r\n\r\n   return {ra: raDeg, dec: decDeg};\r\n}\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport {galacticToRaDec, eclipticToRaDec} from '../../common/utils/coordinate-utils';\r\nimport {SODA_PROVIDER} from '../../common/providers/providers.tokens';\r\nimport {SodaProvider} from '../../common/providers/soda-provider.interface';\r\n\r\nexport interface SodaFilter {\r\n   id: string;\r\n   value: unknown;\r\n   valueParsed?: unknown;\r\n   isDisabled?: boolean;\r\n}\r\n\r\ninterface SourceResolverValueParsed {\r\n   ra: number;\r\n   dec: number;\r\n   radius?: number; // arcmin\r\n}\r\n\r\nconst SPEED_OF_LIGHT = 299_792_458; // m/s\r\n\r\n// ALMA receiver band limits in GHz.\r\n// Used only when the user selects a band filter and we need to convert it to SODA BAND (wavelength in meters).\r\nconst BAND_FREQ_RANGES: Record<string, [number, number]> = {\r\n   '1': [35, 50],\r\n   '2': [67, 116],\r\n   '3': [84, 116],\r\n   '4': [125, 163],\r\n   '5': [163, 211],\r\n   '6': [211, 275],\r\n   '7': [275, 373],\r\n   '8': [385, 500],\r\n   '9': [602, 720],\r\n   '10': [787, 950]\r\n};\r\n\r\n// Supports decimal and scientific notation, e.g. 10, -3.5, 1.2E3\r\nconst numPat = '([+-]?\\\\d+(?:\\\\.\\\\d+)?(?:[Ee][+-]?\\\\d+)?)';\r\nconst numRangeRe = new RegExp(`^${numPat}\\\\s*\\\\.\\\\.\\\\s*${numPat}$`);\r\nconst numGtRe = new RegExp(`^>\\\\s*${numPat}$`);\r\nconst numLtRe = new RegExp(`^<\\\\s*${numPat}$`);\r\nconst numOnlyRe = new RegExp(`^${numPat}$`);\r\n\r\ninterface CirclePos {\r\n   type: 'CIRCLE';\r\n   ra: number;\r\n   dec: number;\r\n   radiusDeg: number;\r\n}\r\n\r\ninterface RangePos {\r\n   type: 'RANGE';\r\n   raMin: number;\r\n   raMax: number;\r\n   decMin: number;\r\n   decMax: number;\r\n}\r\n\r\ntype PosConstraint = CirclePos | RangePos;\r\ntype LowerWaveBound = number | '-Inf';\r\ntype UpperWaveBound = number | '+Inf';\r\n\r\ninterface WavelengthRange {\r\n   waveMin: LowerWaveBound;\r\n   waveMax: UpperWaveBound;\r\n}\r\n\r\n@Injectable({providedIn: 'root'})\r\nexport class SodaCutoutService {\r\n\r\n   private readonly sodaUrl: string;\r\n\r\n   constructor(@Inject(SODA_PROVIDER) sodaProvider: SodaProvider) {\r\n      this.sodaUrl = sodaProvider.getSodaUrl();\r\n   }\r\n\r\n   /**\r\n    * Builds a SODA sync URL for the selected file.\r\n    *\r\n    * ID is always required.\r\n    * POS is added only if a valid position-related filter is found.\r\n    * BAND is added only if a valid spectral filter is found.\r\n    *\r\n    * If no usable POS/BAND filters exist, the service returns a URL with only ID,\r\n    * which means the full file is requested.\r\n    */\r\n   buildCutoutUrl(fitsFileId: string, freqResolutionKHz: number | undefined, filters: SodaFilter[]): string | null {\r\n      if (!fitsFileId?.trim()) {\r\n         return null;\r\n      }\r\n\r\n      const url = new URL(this.sodaUrl);\r\n      url.searchParams.set('ID', fitsFileId);\r\n\r\n      // Ignore disabled filters when building the cutout request.\r\n      const activeFilters = filters.filter((f) => !f.isDisabled);\r\n\r\n      const posParam = this.buildPosParam(activeFilters);\r\n      if (posParam) {\r\n         url.searchParams.set('POS', posParam);\r\n      }\r\n\r\n      const bandParam = this.buildBandParam(activeFilters, freqResolutionKHz);\r\n      if (bandParam) {\r\n         url.searchParams.set('BAND', bandParam);\r\n      }\r\n\r\n      return url.toString();\r\n   }\r\n\r\n   /**\r\n    * Builds the SODA POS parameter from the current active filters (source name resolver, RD/Dec, galactic, ecliptic)\r\n    * If multiple position constraints are present, we keep only the smallest one.\r\n    */\r\n   private buildPosParam(filters: SodaFilter[]): string | null {\r\n      const constraints: PosConstraint[] = [];\r\n\r\n      for (const f of filters) {\r\n         if (f.id === 'sourceNameResolver') {\r\n            const parsed = f.valueParsed as SourceResolverValueParsed | undefined;\r\n\r\n            // Source resolver already gives us RA/Dec.\r\n            // Radius can come either from parsed data or from a trailing \", radius\" entered by the user.\r\n            if (parsed && Number.isFinite(parsed.ra) && Number.isFinite(parsed.dec) && this.isValidRa(parsed.ra) && this.isValidDec(parsed.dec)) {\r\n               const radiusFromText = this.extractTrailingRadiusArcmin(this.toSafeString(f.value));\r\n               const radiusArcmin = radiusFromText ?? parsed.radius ?? 10;\r\n\r\n               if (Number.isFinite(radiusArcmin) && radiusArcmin > 0) {\r\n                  constraints.push({\r\n                     type: 'CIRCLE',\r\n                     ra: parsed.ra,\r\n                     dec: parsed.dec,\r\n                     radiusDeg: radiusArcmin / 60 // SODA expects degrees, UI radius is arcmin\r\n                  });\r\n               }\r\n            }\r\n            continue;\r\n         }\r\n\r\n         if (f.id === 'raDec' && this.hasValue(f.value)) {\r\n            const c = this.parseRaDecFilter(this.toSafeString(f.value));\r\n            if (c) constraints.push(c);\r\n            continue;\r\n         }\r\n\r\n         if (f.id === 'galactic' && this.hasValue(f.value)) {\r\n            const c = this.parseGalacticFilter(this.toSafeString(f.value));\r\n            if (c) constraints.push(c);\r\n            continue;\r\n         }\r\n\r\n         if (f.id === 'ecliptic' && this.hasValue(f.value)) {\r\n            const c = this.parseEclipticFilter(this.toSafeString(f.value));\r\n            if (c) constraints.push(c);\r\n         }\r\n      }\r\n\r\n      if (constraints.length === 0) {\r\n         return null;\r\n      }\r\n\r\n      const best = constraints.reduce((a, b) => (this.posSize(a) <= this.posSize(b) ? a : b));\r\n      return this.formatPos(best);\r\n   }\r\n\r\n   /**\r\n    * RA/Dec parsing rules:\r\n    * - single RA + single Dec => CIRCLE\r\n    * - interval input (.., >, <) => RANGE\r\n    */\r\n   private parseRaDecFilter(value: string): PosConstraint | null {\r\n      const {coordStr, radiusArcmin} = this.extractCoordAndRadius(value);\r\n      const parts = coordStr.split(/\\s+/);\r\n\r\n      if (parts.length < 2) {\r\n         return null;\r\n      }\r\n\r\n      const raPart = parts[0];\r\n      const decPart = parts.slice(1).join(' ');\r\n      const isInterval = (s: string) => s.includes('..') || s.startsWith('>') || s.startsWith('<');\r\n\r\n      if (!isInterval(raPart) && !isInterval(decPart)) {\r\n         const ra = this.parseRaValue(raPart);\r\n         const dec = this.parseDecValue(decPart);\r\n\r\n         if (ra == null || dec == null || !this.isValidRa(ra) || !this.isValidDec(dec)) {\r\n            return null;\r\n         }\r\n\r\n         return {\r\n            type: 'CIRCLE',\r\n            ra,\r\n            dec,\r\n            radiusDeg: radiusArcmin / 60\r\n         };\r\n      }\r\n\r\n      const raInterval = this.parseInterval(raPart, 0, 360);\r\n      const decInterval = this.parseInterval(decPart, -90, 90);\r\n\r\n      if (!raInterval || !decInterval) {\r\n         return null;\r\n      }\r\n\r\n      if (!this.isValidRa(raInterval.min) || !this.isValidRa(raInterval.max)) {\r\n         return null;\r\n      }\r\n\r\n      if (!this.isValidDec(decInterval.min) || !this.isValidDec(decInterval.max)) {\r\n         return null;\r\n      }\r\n\r\n      return {\r\n         type: 'RANGE',\r\n         raMin: raInterval.min,\r\n         raMax: raInterval.max,\r\n         decMin: decInterval.min,\r\n         decMax: decInterval.max\r\n      };\r\n   }\r\n\r\n   /**\r\n    * Galactic parsing rules are the same as RA/Dec:\r\n    * - single lon/lat => convert to RA/Dec and use CIRCLE\r\n    * - interval lon/lat => convert box corners to RA/Dec and use RANGE\r\n    */\r\n   private parseGalacticFilter(value: string): PosConstraint | null {\r\n      const {coordStr, radiusArcmin} = this.extractCoordAndRadius(value);\r\n      const parts = coordStr.split(/\\s+/);\r\n\r\n      if (parts.length < 2) {\r\n         return null;\r\n      }\r\n\r\n      const lonPart = parts[0];\r\n      const latPart = parts.slice(1).join(' ');\r\n      const isInterval = (s: string) => s.includes('..') || s.startsWith('>') || s.startsWith('<');\r\n\r\n      if (!isInterval(lonPart) && !isInterval(latPart)) {\r\n         const lon = this.parseSingleNumberStrict(lonPart);\r\n         const lat = this.parseSingleNumberStrict(latPart);\r\n\r\n         if (lon == null || lat == null || !this.isValidLon(lon) || !this.isValidLat(lat)) {\r\n            return null;\r\n         }\r\n\r\n         const {ra, dec} = galacticToRaDec(lon, lat);\r\n         if (!this.isValidRa(ra) || !this.isValidDec(dec)) {\r\n            return null;\r\n         }\r\n\r\n         return {\r\n            type: 'CIRCLE',\r\n            ra,\r\n            dec,\r\n            radiusDeg: radiusArcmin / 60\r\n         };\r\n      }\r\n\r\n      const lonInterval = this.parseInterval(lonPart, 0, 360);\r\n      const latInterval = this.parseInterval(latPart, -90, 90);\r\n\r\n      if (!lonInterval || !latInterval) {\r\n         return null;\r\n      }\r\n\r\n      return this.cornersToRangePos(\r\n         [\r\n            [lonInterval.min, latInterval.min],\r\n            [lonInterval.min, latInterval.max],\r\n            [lonInterval.max, latInterval.min],\r\n            [lonInterval.max, latInterval.max]\r\n         ],\r\n         galacticToRaDec\r\n      );\r\n   }\r\n\r\n   /**\r\n    * Ecliptic behaves the same as galactic, only with a different coordinate transform.\r\n    */\r\n   private parseEclipticFilter(value: string): PosConstraint | null {\r\n      const {coordStr, radiusArcmin} = this.extractCoordAndRadius(value);\r\n      const parts = coordStr.split(/\\s+/);\r\n\r\n      if (parts.length < 2) {\r\n         return null;\r\n      }\r\n\r\n      const lonPart = parts[0];\r\n      const latPart = parts.slice(1).join(' ');\r\n      const isInterval = (s: string) => s.includes('..') || s.startsWith('>') || s.startsWith('<');\r\n\r\n      if (!isInterval(lonPart) && !isInterval(latPart)) {\r\n         const lon = this.parseSingleNumberStrict(lonPart);\r\n         const lat = this.parseSingleNumberStrict(latPart);\r\n\r\n         if (lon == null || lat == null || !this.isValidLon(lon) || !this.isValidLat(lat)) {\r\n            return null;\r\n         }\r\n\r\n         const {ra, dec} = eclipticToRaDec(lon, lat);\r\n         if (!this.isValidRa(ra) || !this.isValidDec(dec)) {\r\n            return null;\r\n         }\r\n\r\n         return {\r\n            type: 'CIRCLE',\r\n            ra,\r\n            dec,\r\n            radiusDeg: radiusArcmin / 60\r\n         };\r\n      }\r\n\r\n      const lonInterval = this.parseInterval(lonPart, 0, 360);\r\n      const latInterval = this.parseInterval(latPart, -90, 90);\r\n\r\n      if (!lonInterval || !latInterval) {\r\n         return null;\r\n      }\r\n\r\n      return this.cornersToRangePos(\r\n         [\r\n            [lonInterval.min, latInterval.min],\r\n            [lonInterval.min, latInterval.max],\r\n            [lonInterval.max, latInterval.min],\r\n            [lonInterval.max, latInterval.max]\r\n         ],\r\n         eclipticToRaDec\r\n      );\r\n   }\r\n\r\n   /**\r\n    * Converts a lon/lat rectangle to an RA/Dec bounding box by converting the 4 corners.\r\n    */\r\n   private cornersToRangePos(corners: [number, number][], toRaDec: (lon: number, lat: number) => {ra: number; dec: number}): RangePos | null {\r\n      const coords = corners.map(([lon, lat]) => toRaDec(lon, lat));\r\n\r\n      if (coords.some((c) => !Number.isFinite(c.ra) || !Number.isFinite(c.dec))) {\r\n         return null;\r\n      }\r\n\r\n      const raValues = coords.map((c) => this.normalizeRa(c.ra));\r\n      const decValues = coords.map((c) => c.dec);\r\n\r\n      return {\r\n         type: 'RANGE',\r\n         raMin: Math.min(...raValues),\r\n         raMax: Math.max(...raValues),\r\n         decMin: Math.min(...decValues),\r\n         decMax: Math.max(...decValues)\r\n      };\r\n   }\r\n\r\n   /**\r\n    * Used only to compare multiple position constraints and keep the smallest one.\r\n    */\r\n   private posSize(pos: PosConstraint): number {\r\n      if (pos.type === 'CIRCLE') {\r\n         return 2 * pos.radiusDeg;\r\n      }\r\n\r\n      const decMid = 0.5 * (pos.decMax + pos.decMin);\r\n      const cosDec = Math.max(Math.cos((decMid * Math.PI) / 180), 0.01);\r\n      return Math.max((pos.raMax - pos.raMin) / cosDec, pos.decMax - pos.decMin);\r\n   }\r\n\r\n   /**\r\n    * Formats the final SODA POS value.\r\n    */\r\n   private formatPos(pos: PosConstraint): string {\r\n      if (pos.type === 'CIRCLE') {\r\n         return `CIRCLE ${this.formatNumber(pos.ra)} ${this.formatNumber(pos.dec)} ${this.formatNumber(pos.radiusDeg)}`;\r\n      }\r\n\r\n      return `RANGE ${this.formatNumber(pos.raMin)} ${this.formatNumber(pos.raMax)} ${this.formatNumber(pos.decMin)} ${this.formatNumber(pos.decMax)}`;\r\n   }\r\n\r\n   /**\r\n    * Builds the SODA BAND parameter from spectral filters (frequency, band).\r\n    * SODA BAND must be wavelength in meters, not frequency in GHz.\r\n    * If multiple spectral constraints are present, we keep only the smallest one.\r\n    */\r\n   private buildBandParam(filters: SodaFilter[], freqResolutionKHz: number | undefined): string | null {\r\n      const ranges: WavelengthRange[] = [];\r\n\r\n      for (const f of filters) {\r\n         if (f.id === 'frequency' && this.hasValue(f.value)) {\r\n            ranges.push(...this.freqStringToWavelengthRanges(this.toSafeString(f.value), freqResolutionKHz));\r\n            continue;\r\n         }\r\n\r\n         if (f.id === 'band' && this.hasValue(f.value)) {\r\n            const bandRanges = this.toSafeString(f.value)\r\n               .split(',')\r\n               .map((b) => b.trim())\r\n               .filter((b) => BAND_FREQ_RANGES[b] != null)\r\n               .map((b) => this.freqRangeToWavelength(...BAND_FREQ_RANGES[b]));\r\n\r\n            ranges.push(...bandRanges);\r\n            continue;\r\n         }\r\n      }\r\n\r\n      if (ranges.length === 0) {\r\n         return null;\r\n      }\r\n\r\n      const best = ranges.reduce((a, b) => (this.waveRangeWidth(a) <= this.waveRangeWidth(b) ? a : b));\r\n      return ` ${this.formatWaveBound(best.waveMin)} ${this.formatWaveBound(best.waveMax)}`.trim();\r\n   }\r\n\r\n   /**\r\n    * AQ frequency filter may contain multiple values separated by \"|\".\r\n    * Each valid value is converted into a wavelength range.\r\n    */\r\n   private freqStringToWavelengthRanges(freqStr: string, freqResKHz: number | undefined): WavelengthRange[] {\r\n      return freqStr\r\n         .split('|')\r\n         .map((s) => s.trim())\r\n         .filter(Boolean)\r\n         .map((s) => this.parseSingleFreqToWavelength(s, freqResKHz))\r\n         .filter((r): r is WavelengthRange => r != null);\r\n   }\r\n\r\n   /**\r\n    * Converts one frequency expression to a SODA wavelength range.\r\n    */\r\n   private parseSingleFreqToWavelength(str: string, freqResKHz: number | undefined): WavelengthRange | null {\r\n      const rangeMatch = numRangeRe.exec(str);\r\n      if (rangeMatch) {\r\n         const fMin = +rangeMatch[1];\r\n         const fMax = +rangeMatch[2];\r\n         if (!Number.isFinite(fMin) || !Number.isFinite(fMax) || fMin <= 0 || fMax <= 0) {\r\n            return null;\r\n         }\r\n         return this.freqRangeToWavelength(fMin, fMax);\r\n      }\r\n\r\n      if (numOnlyRe.test(str)) {\r\n         return this.freqSingleToWavelength(+str, freqResKHz);\r\n      }\r\n\r\n      const gtMatch = numGtRe.exec(str);\r\n      if (gtMatch) {\r\n         const freqGHz = +gtMatch[1];\r\n         if (!Number.isFinite(freqGHz) || freqGHz <= 0) {\r\n            return null;\r\n         }\r\n\r\n         return {\r\n            waveMin: '-Inf',\r\n            waveMax: SPEED_OF_LIGHT / (freqGHz * 1e9)\r\n         };\r\n      }\r\n\r\n      const ltMatch = numLtRe.exec(str);\r\n      if (ltMatch) {\r\n         const freqGHz = +ltMatch[1];\r\n         if (!Number.isFinite(freqGHz) || freqGHz <= 0) {\r\n            return null;\r\n         }\r\n\r\n         return {\r\n            waveMin: SPEED_OF_LIGHT / (freqGHz * 1e9),\r\n            waveMax: '+Inf'\r\n         };\r\n      }\r\n\r\n      return null;\r\n   }\r\n\r\n   /**\r\n    * Converts a frequency interval in GHz to a wavelength interval in meters.\r\n    */\r\n   private freqRangeToWavelength(fMinGHz: number, fMaxGHz: number): WavelengthRange {\r\n      if (!Number.isFinite(fMinGHz) || !Number.isFinite(fMaxGHz) || fMinGHz <= 0 || fMaxGHz <= 0) {\r\n         throw new Error('Invalid frequency range');\r\n      }\r\n\r\n      const minGHz = Math.min(fMinGHz, fMaxGHz);\r\n      const maxGHz = Math.max(fMinGHz, fMaxGHz);\r\n\r\n      return {\r\n         waveMin: SPEED_OF_LIGHT / (maxGHz * 1e9),\r\n         waveMax: SPEED_OF_LIGHT / (minGHz * 1e9)\r\n      };\r\n   }\r\n\r\n   /**\r\n    * For a single frequency value, use a small interval around it based on resolution.\r\n    * Resolution comes from the preview and is given in kHz.\r\n    */\r\n   private freqSingleToWavelength(fGHz: number, freqResKHz: number | undefined): WavelengthRange | null {\r\n      if (!Number.isFinite(fGHz) || fGHz <= 0) {\r\n         return null;\r\n      }\r\n\r\n      if (freqResKHz == null || !Number.isFinite(freqResKHz) || freqResKHz <= 0) {\r\n         return null;\r\n      }\r\n\r\n      const fHz = fGHz * 1e9;\r\n      const resHz = freqResKHz * 1e3;\r\n      const lowerHz = fHz - 5 * resHz;\r\n      const upperHz = fHz + 5 * resHz;\r\n\r\n      if (lowerHz <= 0 || upperHz <= 0) {\r\n         return null;\r\n      }\r\n\r\n      return {\r\n         waveMin: SPEED_OF_LIGHT / upperHz,\r\n         waveMax: SPEED_OF_LIGHT / lowerHz\r\n      };\r\n   }\r\n\r\n   /**\r\n    * Used to compare multiple wavelength ranges and keep the narrowest one.\r\n    */\r\n   private waveRangeWidth(range: WavelengthRange): number {\r\n      if (typeof range.waveMin !== 'number' || typeof range.waveMax !== 'number') {\r\n         return Number.POSITIVE_INFINITY;\r\n      }\r\n\r\n      return range.waveMax - range.waveMin;\r\n   }\r\n\r\n   private formatWaveBound(bound: LowerWaveBound | UpperWaveBound): string {\r\n      return typeof bound === 'number' ? this.formatNumber(bound) : bound;\r\n   }\r\n\r\n   /**\r\n    * Parses RA either as decimal degrees or as sexagesimal hours.\r\n    */\r\n   private parseRaValue(ra: string): number | null {\r\n      const s = ra.trim();\r\n\r\n      if (/^[\\d.]+$/.test(s)) {\r\n         const value = Number(s);\r\n         return Number.isFinite(value) ? value : null;\r\n      }\r\n\r\n      const normalized = s.replace(/[hm]/gi, ':').replace(/s$/i, '');\r\n      const tokens = normalized.split(':');\r\n      if (tokens.length !== 3) {\r\n         return null;\r\n      }\r\n\r\n      const h = Number(tokens[0]);\r\n      const m = Number(tokens[1]);\r\n      const sec = Number(tokens[2]);\r\n\r\n      if (![h, m, sec].every(Number.isFinite)) {\r\n         return null;\r\n      }\r\n\r\n      return ((h + m / 60 + sec / 3600) * 15) % 360;\r\n   }\r\n\r\n   /**\r\n    * Parses Dec either as decimal degrees or as sexagesimal degrees.\r\n    */\r\n   private parseDecValue(dec: string): number | null {\r\n      const s = dec.trim();\r\n\r\n      if (/^[+-]?[\\d.]+$/.test(s)) {\r\n         const value = Number(s);\r\n         return Number.isFinite(value) ? value : null;\r\n      }\r\n\r\n      const sign = s[0] === '-' ? -1 : 1;\r\n      const normalized = s.replace(/^[+-]/, '').replace(/[dm]/gi, ':').replace(/s$/i, '');\r\n      const tokens = normalized.split(':');\r\n\r\n      if (tokens.length !== 3) {\r\n         return null;\r\n      }\r\n\r\n      const d = Number(tokens[0]);\r\n      const m = Number(tokens[1]);\r\n      const sec = Number(tokens[2]);\r\n\r\n      if (![d, m, sec].every(Number.isFinite)) {\r\n         return null;\r\n      }\r\n\r\n      return sign * (d + m / 60 + sec / 3600);\r\n   }\r\n\r\n   private parseInterval(str: string, defaultMin: number, defaultMax: number): {min: number; max: number} | null {\r\n      const s = str.trim();\r\n\r\n      const rangeMatch = numRangeRe.exec(s);\r\n      if (rangeMatch) {\r\n         const min = +rangeMatch[1];\r\n         const max = +rangeMatch[2];\r\n         if (!Number.isFinite(min) || !Number.isFinite(max) || min > max) {\r\n            return null;\r\n         }\r\n         return {min, max};\r\n      }\r\n\r\n      const gtMatch = numGtRe.exec(s);\r\n      if (gtMatch) {\r\n         const min = +gtMatch[1];\r\n         if (!Number.isFinite(min) || min > defaultMax) {\r\n            return null;\r\n         }\r\n         return {min, max: defaultMax};\r\n      }\r\n\r\n      const ltMatch = numLtRe.exec(s);\r\n      if (ltMatch) {\r\n         const max = +ltMatch[1];\r\n         if (!Number.isFinite(max) || max < defaultMin) {\r\n            return null;\r\n         }\r\n         return {min: defaultMin, max};\r\n      }\r\n\r\n      const numMatch = numOnlyRe.exec(s);\r\n      if (numMatch) {\r\n         const value = +numMatch[1];\r\n         if (!Number.isFinite(value)) {\r\n            return null;\r\n         }\r\n         return {min: value, max: value};\r\n      }\r\n\r\n      return null;\r\n   }\r\n\r\n   private parseSingleNumberStrict(str: string): number | null {\r\n      const s = str.trim();\r\n      if (!numOnlyRe.test(s)) {\r\n         return null;\r\n      }\r\n\r\n      const value = Number(s);\r\n      return Number.isFinite(value) ? value : null;\r\n   }\r\n\r\n   /**\r\n    * Extracts optional \", radius\" suffix from coordinate input.\r\n    * If no explicit radius is present, default to 10 arcmin.\r\n    */\r\n   private extractCoordAndRadius(raw: string): {coordStr: string; radiusArcmin: number} {\r\n      const coordStr = raw.trim();\r\n      const overriddenRadius = this.extractTrailingRadiusArcmin(coordStr);\r\n\r\n      if (overriddenRadius == null) {\r\n         return {coordStr, radiusArcmin: 10};\r\n      }\r\n\r\n      const commaIdx = coordStr.lastIndexOf(',');\r\n      return {\r\n         coordStr: coordStr.substring(0, commaIdx).trim(),\r\n         radiusArcmin: overriddenRadius\r\n      };\r\n   }\r\n\r\n   private extractTrailingRadiusArcmin(raw: string): number | null {\r\n      const str = raw.trim();\r\n      const commaIdx = str.lastIndexOf(',');\r\n\r\n      if (commaIdx < 0) {\r\n         return null;\r\n      }\r\n\r\n      const candidate = str.substring(commaIdx + 1).trim();\r\n      if (!/^\\d+(?:\\.\\d+)?$/.test(candidate)) {\r\n         return null;\r\n      }\r\n\r\n      const radius = Number(candidate);\r\n      return Number.isFinite(radius) && radius > 0 ? radius : null;\r\n   }\r\n\r\n   private formatNumber(value: number): string {\r\n      return Number.isFinite(value) ? String(value) : '';\r\n   }\r\n\r\n   /**\r\n    * RA wraps around at 360 degrees, so normalize it before building ranges.\r\n    */\r\n   private normalizeRa(ra: number): number {\r\n      const normalized = ra % 360;\r\n      return normalized < 0 ? normalized + 360 : normalized;\r\n   }\r\n\r\n   private isValidRa(ra: number): boolean {\r\n      return Number.isFinite(ra) && ra >= 0 && ra <= 360;\r\n   }\r\n\r\n   private isValidDec(dec: number): boolean {\r\n      return Number.isFinite(dec) && dec >= -90 && dec <= 90;\r\n   }\r\n\r\n   private isValidLon(lon: number): boolean {\r\n      return Number.isFinite(lon) && lon >= 0 && lon <= 360;\r\n   }\r\n\r\n   private isValidLat(lat: number): boolean {\r\n      return Number.isFinite(lat) && lat >= -90 && lat <= 90;\r\n   }\r\n\r\n   private hasValue(value: unknown): boolean {\r\n      return value != null && String(value).trim() !== '';\r\n   }\r\n\r\n   private toSafeString(value: unknown): string {\r\n      return value == null ? '' : String(value);\r\n   }\r\n}\r\n","import {ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output} from '@angular/core';\r\nimport {CommonModule, DecimalPipe} from '@angular/common';\r\nimport {SafePipe} from '../../../common/pipes/safe.pipe';\r\nimport {NgbTooltipModule} from '@ng-bootstrap/ng-bootstrap';\r\nimport {FrequencyTypePipe} from '../../../common/pipes/frequency-type.pipe';\r\nimport {BytesPipe} from '../../../common/pipes/bytes.pipe';\r\nimport {ImageSimilarityService} from '../../../image-similarity/services/image-similarity.service';\r\nimport {Observable, ObservableInput, of} from 'rxjs';\r\nimport {ImageSimilarityTriggerComponent} from '../../../image-similarity/components/image-similarity-trigger/image-similarity-trigger.component';\r\nimport {AdmitProductLine} from '../../../line-detection/models/line.model';\r\nimport {LineDetectionsService} from '../../../line-detection/services/line-detections.service';\r\nimport {LinePreviewComponent} from '../../../line-detection/components/line-preview.component';\r\nimport {SodaCutoutService, SodaFilter} from '../../../cell-preview/services/soda-cutout.service';\r\n\r\n@Component({\r\n   selector: 'lib-cell-preview-shared',\r\n   standalone: true,\r\n   imports: [CommonModule, SafePipe, NgbTooltipModule, FrequencyTypePipe, BytesPipe, DecimalPipe, ImageSimilarityTriggerComponent, LinePreviewComponent],\r\n   templateUrl: './cell-preview-shared.component.html'\r\n})\r\nexport class CellPreviewSharedComponent implements OnInit {\r\n   @Input() preview: any;\r\n   @Input() thumbnailFile?: string | null = null; // AQ\r\n   @Input() previewImage?: any; // RH\r\n   @Input() previewError?: boolean | null = null;\r\n   @Input() previewWidth;\r\n   @Input() previewHeight;\r\n   @Input() isFromAq;\r\n   @Input() hidePreview: boolean = false;\r\n   @Input() dataPortalUrl: string = '';\r\n   @Input({required: true}) fetchCartaSocketUrlFn!: (id: string) => ObservableInput<string>;\r\n   @Input() headerFilters: SodaFilter[] = [];\r\n   tentativeLines$: Observable<AdmitProductLine[]> = of([]);\r\n\r\n   @Output() outOpenFile = new EventEmitter<string>();\r\n   @Output() similarityStarted = new EventEmitter<void>();\r\n\r\n   similarityAvailable: boolean | null = null;\r\n   cutoutUrl: string | null = null;\r\n   maxTentativeLinesToShow = 6;\r\n\r\n   constructor(\r\n      private readonly imageSimilarityService: ImageSimilarityService,\r\n      private readonly lineDetectionsService: LineDetectionsService,\r\n      private readonly ref: ChangeDetectorRef,\r\n      private readonly sodaCutoutService: SodaCutoutService\r\n   ) {}\r\n\r\n   ngOnInit() {\r\n      if (this.preview?.fitsFile) {\r\n         this.imageSimilarityService.checkNgasFileIdExists(this.preview.fitsFile).subscribe((exists) => {\r\n            this.similarityAvailable = exists;\r\n            this.ref.markForCheck();\r\n         });\r\n      } else {\r\n         this.similarityAvailable = false;\r\n      }\r\n      this.tentativeLines$ = this.preview?.fitsFile ? this.lineDetectionsService.getDetectedLinesByNgasFitsFileId(this.preview?.fitsFile) : of([]);\r\n      this.cutoutUrl = this.sodaCutoutService.buildCutoutUrl(this.preview?.fitsFile, this.preview?.resMax, this.headerFilters);\r\n   }\r\n\r\n   emitOpenFile(file: string) {\r\n      this.outOpenFile.emit(file);\r\n   }\r\n\r\n   openCdsPortal() {\r\n      if (this.preview?.ra && this.preview?.dec) {\r\n         const url = `http://cdsportal.u-strasbg.fr/?target=${this.preview.ra}%20${this.preview.dec}`;\r\n         window.open(url, '_blank');\r\n      }\r\n   }\r\n\r\n   getTentativeLinesDisplay(lines: AdmitProductLine[] | null | undefined): {\r\n      visible: AdmitProductLine[];\r\n      remaining: number;\r\n   } {\r\n      const all = lines ?? [];\r\n      const visible = all.slice(0, this.maxTentativeLinesToShow);\r\n      const remaining = Math.max(0, all.length - visible.length);\r\n\r\n      return {visible, remaining};\r\n   }\r\n\r\n   openLinesInANewTab(): void {\r\n      const baseUrl = this.buildBaseUrl();\r\n\r\n      const sourceName = this.preview?.sourceName;\r\n      const mous = this.preview?.mous;\r\n      const ngasFitsFile = this.preview?.fitsFile;\r\n\r\n      if (!sourceName && !mous && !ngasFitsFile) {\r\n         return;\r\n      }\r\n\r\n      const params: string[] = ['result_view=lines'];\r\n\r\n      if (sourceName) params.push(`sourceName=${encodeURIComponent(sourceName)}`);\r\n      if (mous) params.push(`mous=${encodeURIComponent(mous)}`);\r\n      if (ngasFitsFile) params.push(`linesFitsFile=${encodeURIComponent(ngasFitsFile)}`);\r\n\r\n      const fullUrl = `${baseUrl}?${params.join('&')}`;\r\n      window.open(fullUrl, '_blank');\r\n   }\r\n\r\n   buildBaseUrl(): string {\r\n      return `${window.location.origin}/aq/`;\r\n   }\r\n\r\n   downloadCutout(): void {\r\n      window.open(this.cutoutUrl, '_blank');\r\n   }\r\n}\r\n","<div class=\"d-flex flex-row bd-highlight mb-3\">\r\n   @if (!hidePreview) {\r\n   <div class=\"p-2\">\r\n      @if (isFromAq) { @if (preview.isContinuumPreview) {\r\n      <strong>Combined continuum</strong>\r\n      } @else {\r\n      <strong>SPW {{ preview.index }}</strong>\r\n      } : {{ preview.freqMin | number }}..{{ preview.freqMax | number }}GHz, {{ preview.resMax | number }} kHz, {{ preview.polProduct }}\r\n      } @if (previewError) {\r\n      <div class=\"border rounded\">\r\n         <div\r\n            class=\"d-flex justify-content-center align-items-center\"\r\n            [style.width.px]=\"previewWidth\"\r\n            [style.height.px]=\"previewHeight\">\r\n            preview not available\r\n         </div>\r\n      </div>\r\n      } @else {\r\n      <div class=\"border rounded\">\r\n         <div\r\n            class=\"d-flex justify-content-center align-items-center\"\r\n            [style.width.px]=\"previewWidth\"\r\n            [style.height.px]=\"previewHeight\">\r\n            @if (isFromAq ? thumbnailFile : previewImage?.blob) {\r\n            <img\r\n               [src]=\"(isFromAq ? thumbnailFile : previewImage?.blob) | safe : 'resourceUrl'\"\r\n               style=\"cursor: pointer\"\r\n               (click)=\"emitOpenFile(preview.previewFile)\" />\r\n            } @else {\r\n            <div class=\"spinner-border spinner-border-sm\">\r\n               <span class=\"visually-hidden\">Loading...</span>\r\n            </div>\r\n            }\r\n         </div>\r\n      </div>\r\n      }\r\n   </div>\r\n   }\r\n\r\n   <div class=\"d-flex flex-column p-2\">\r\n      @if (preview?.previewFile) {\r\n      <i\r\n         id=\"{{ 'previews-interactive-file-' + preview.previewFile }}\"\r\n         class=\"fa-light fa-images mb-2 ms-1\"\r\n         style=\"font-size: 1.5rem; cursor: pointer\"\r\n         placement=\"right\"\r\n         [ngbTooltip]=\"'Interactive preview'\"\r\n         (click)=\"emitOpenFile(preview.previewFile)\"></i>\r\n      } @if (preview?.imageFile) {\r\n      <i\r\n         id=\"{{ 'previews-image-file-' + preview.imageFile }}\"\r\n         class=\"fa-light fa-image mb-2 ms-1\"\r\n         style=\"font-size: 1.5rem; cursor: pointer\"\r\n         placement=\"right\"\r\n         [ngbTooltip]=\"'PNG preview file'\"\r\n         (click)=\"emitOpenFile(preview.imageFile)\"></i>\r\n      } @if (isFromAq ? (preview?.previewFile || preview?.fitsFile) : preview?.name) {\r\n      <img\r\n         [id]=\"'previews-carta-file-' + (isFromAq ? preview?.previewFile : preview?.name)\"\r\n         class=\"py-1\"\r\n         src=\"assets/images/carta_logo.png\"\r\n         style=\"cursor: pointer\"\r\n         placement=\"right\"\r\n         [ngbTooltip]=\"'CARTA'\"\r\n         (click)=\"similarityTrigger.openCartaSingle(preview?.fitsFile)\" />\r\n      } @if (preview?.ra && preview?.dec) {\r\n      <img\r\n         id=\"{{ 'previews-cds-link-' + preview.name }}\"\r\n         class=\"py-1\"\r\n         src=\"assets/images/cds_logo.png\"\r\n         style=\"cursor: pointer\"\r\n         placement=\"right\"\r\n         [ngbTooltip]=\"'CDS'\"\r\n         (click)=\"openCdsPortal()\" />\r\n      }\r\n      <span style=\"width: 2em\">\r\n         <shared-image-similarity-trigger\r\n            #similarityTrigger\r\n            [hideIcon]=\"!(preview?.previewFile && similarityAvailable)\"\r\n            [fileId]=\"preview?.fitsFile\"\r\n            [fetchCartaSocketUrlFn]=\"fetchCartaSocketUrlFn\"\r\n            (started)=\"similarityStarted.emit()\">\r\n         </shared-image-similarity-trigger\r\n      ></span>\r\n      @if (cutoutUrl) {\r\n      <i\r\n         class=\"fa-light fa-scissors mb-2 ms-1\"\r\n         style=\"font-size: 1.5rem; cursor: pointer\"\r\n         placement=\"right\"\r\n         [ngbTooltip]=\"'Download cut-out (SODA)'\"\r\n         (click)=\"downloadCutout()\"></i>\r\n      }\r\n   </div>\r\n\r\n   <div class=\"p-2 w-100\">\r\n      @if (preview?.fitsFile && isFromAq && dataPortalUrl) {\r\n      <div class=\"text-nowrap mb-2\">\r\n         <a\r\n            id=\"{{ 'previews-fits-file-' + preview.fitsFile }}\"\r\n            class=\"link-primary me-4\"\r\n            [href]=\"dataPortalUrl + '/' + preview.fitsFile\">\r\n            {{ preview.fitsFile }}\r\n         </a>\r\n         {{ preview.fitsFileSize | bytes }}\r\n      </div>\r\n      }\r\n      <div class=\"d-flex\">\r\n         <div class=\"d-flex flex-column p-2\">\r\n            <ul class=\"list list-unstyled text-nowrap\">\r\n               @if (preview?.band) {\r\n               <li><strong>Band</strong>: {{ preview.band }}</li>\r\n               } @if (preview?.chaNum) {\r\n               <li><strong>Frequency type</strong>: {{ preview.chaNum | frequencyType }}</li>\r\n               } @if (preview?.freqMin && preview?.freqMax) {\r\n               <li><strong>Frequency range</strong>: {{ preview.freqMin | number }}..{{ preview.freqMax | number }}</li>\r\n               } @if (preview?.resMax) {\r\n               <li><strong>Frequency resolution</strong>: {{ preview.resMax | number }} kHz</li>\r\n               } @if (preview?.continuumSensitivity) {\r\n               <li><strong>Continuum sensitivity</strong>: {{ preview.continuumSensitivity | number }}</li>\r\n               } @if (preview?.sens10) {\r\n               <li><strong>Line sens. (10km/s)</strong>: {{ preview.sens10 | number }} mJy/beam</li>\r\n               } @if (preview?.sensBand) {\r\n               <li><strong>Line sens. (native)</strong>: {{ preview.sensBand | number }} uJy/beam</li>\r\n               } @if (preview?.polProduct) {\r\n               <li><strong>Polarisations</strong>: {{ preview.polProduct }}</li>\r\n               } @if (preview?.array) {\r\n               <li><strong>Array</strong>: {{ preview.array }}</li>\r\n               }\r\n            </ul>\r\n         </div>\r\n         <div class=\"d-flex justify-content-center w-100 p-2\">\r\n            <div class=\"text-start\">\r\n               @let lines = (tentativeLines$ | async) ?? []; @let display = getTentativeLinesDisplay(lines); @if (lines.length > 0) {\r\n               <div class=\"d-flex align-items-center gap-2\">\r\n                  <i\r\n                     class=\"fa-light fa-arrow-up-right-from-square\"\r\n                     style=\"cursor: pointer\"\r\n                     ngbTooltip=\"Open Lines in new tab\"\r\n                     (click)=\"openLinesInANewTab()\"></i>\r\n                  <strong class=\"d-block\">Tentative line detections</strong>\r\n               </div>\r\n               <ul class=\"list list-unstyled text-nowrap m-0 p-0\">\r\n                  @for (line of display.visible; track line.id){\r\n                  <li class=\"d-flex align-items-center gap-2\">\r\n                     <lib-line-preview\r\n                        [row]=\"line\"\r\n                        [dataPortalUrl]=\"dataPortalUrl\"></lib-line-preview>\r\n                     <span style=\"color: #FF5D06\">{{ line.formula }} {{ line.transition }}</span>\r\n                  </li>\r\n                  } @if (display.remaining > 0) {\r\n                  <li class=\"text-muted\">…and {{ display.remaining }} more</li>\r\n                  }\r\n               </ul>\r\n               }\r\n            </div>\r\n         </div>\r\n      </div>\r\n   </div>\r\n</div>\r\n","// Components\r\nexport * from './lib/cell-preview/components/cell-preview-shared/cell-preview-shared.component';\r\nexport * from './lib/image-similarity/components/image-similarity-popup/image-similarity-popup.component';\r\nexport * from './lib/image-similarity/components/image-similarity-trigger/image-similarity-trigger.component';\r\nexport * from './lib/line-detection/components/line-preview.component';\r\n// Directives\r\nexport * from './lib/common/directives/lazy-load.directive';\r\nexport * from './lib/common/directives/sticky-popover.directive';\r\n\r\n// Pipes\r\nexport * from './lib/common/pipes/safe.pipe';\r\nexport * from './lib/common/pipes/bytes.pipe';\r\nexport * from './lib/common/pipes/frequency-type.pipe';\r\n\r\n// Providers\r\nexport * from './lib/common/providers/elastic-search-provider.interface';\r\nexport * from './lib/common/providers/data-portal-provider.interface';\r\nexport * from './lib/common/providers/line-preview-provider.interface';\r\nexport * from './lib/common/providers/soda-provider.interface';\r\nexport * from './lib/common/providers/providers.tokens';\r\n\r\n// Utils\r\nexport * from './lib/common/utils/coordinate-utils';\r\n\r\n// Services\r\nexport * from './lib/image-similarity/services/image-similarity.service';\r\nexport * from './lib/line-detection/services/line-detections.service';\r\nexport * from './lib/cell-preview/services/soda-cutout.service';\r\n\r\n// Models\r\nexport * from './lib/image-similarity/models/image-similarity.model';\r\nexport * from './lib/line-detection/models/line.model';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.ImageSimilarityService","i2.SimilarityDownloadService","i4","i2.LineDetectionsService","i3.SodaCutoutService","i5"],"mappings":"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"}