@snugdesk/avaya-ipo-widget 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"snugdesk-avaya-ipo-widget.mjs","sources":["../../../projects/avaya-ipo-widget/src/lib/config/app-config.ts","../../../projects/avaya-ipo-widget/src/lib/services/avaya-ipo.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/country.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/phone-number-lookup.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/authentication.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/entities-search.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-details/call-details.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-details/call-details.component.html","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-history.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-history.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-card/contact-card.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-card/contact-card.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-details/contact-details.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-details/contact-details.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contacts.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contacts.component.html","../../../projects/avaya-ipo-widget/src/lib/components/settings/settings.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/settings/settings.component.html","../../../projects/avaya-ipo-widget/src/lib/components/login/login.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/login/login.component.html","../../../projects/avaya-ipo-widget/src/lib/services/recording-manager.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/transcription-stream.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/idle/phone-idle.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/idle/phone-idle.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/incoming/phone-incoming.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/incoming/phone-incoming.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/active/phone-active.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/active/phone-active.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/phone.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/phone.component.html","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.component.ts","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.component.html","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.module.ts","../../../projects/avaya-ipo-widget/src/public-api.ts","../../../projects/avaya-ipo-widget/src/snugdesk-avaya-ipo-widget.ts"],"sourcesContent":["export const APP_CONFIG = {\n ASSET_CDN_BASE_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget',\n AWL_SDK_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/js/awl.min.js',\n AGENT_STATUS_API_URL: 'https://v2xla9n0t6.execute-api.us-west-2.amazonaws.com/dev',\n CALL_HISTORY_API_URL: 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory',\n CALL_SESSION_WS_URL: 'wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession',\n TRANSCRIPTION_WS_URL: 'ws://localhost:3000/ws/transcribe',\n TRANSCRIPTION_WS_MIME_TYPE: 'audio/pcm;rate=16000;encoding=s16le',\n TRANSCRIPTION_LANGUAGE_CODE: 'hi-IN',\n TRANSCRIPTION_ALT_LANGUAGE_CODES: ['en-IN'],\n TRANSCRIPTION_MODEL: 'latest_short',\n POSTCALL_TRANSCRIBE_API_URL: 'http://localhost:3000/api/transcribe-call-gemini',\n COUNTRY_ENDPOINT: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/metadata/countries.json',\n PHONE_NUMBER_LOOKUP_BASE: 'https://api.snugdesk.com/phone-numbers',\n PHONE_NUMBER_HLR_BASE: 'https://api.snugdesk.com/phone-numbers/hlr',\n PHONE_LOOKUP_COUNTRY_CODE: '91',\n ENTITY_SEARCH_BASE: 'https://search.snugdesk.com/entities',\n OPENSEARCH_ENTITIES_URL: 'https://api.snugdesk.com/opensearch/entities',\n PUSH_API_BASE: 'https://<your-api-id>.execute-api.<region>.amazonaws.com',\n DIAL_OUT_PREFIX: '0',\n} as const;\n\nexport const assetUrl = (path: string): string => {\n const base = APP_CONFIG.ASSET_CDN_BASE_URL.replace(/\\/$/, '');\n const cleanPath = path.replace(/^\\//, '');\n return `${base}/${cleanPath}`;\n};\n\nexport const formatDialOutNumber = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n const raw = value.toString().trim();\n if (!raw) {\n return '';\n }\n\n let digits = raw.replace(/\\D/g, '');\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n\n if (countryCode && digits.startsWith(countryCode) && digits.length > 10) {\n digits = digits.slice(countryCode.length);\n }\n\n if (digits.length === 10) {\n return `${APP_CONFIG.DIAL_OUT_PREFIX || ''}${digits}`;\n }\n\n return digits;\n};\n","import { Injectable, NgZone } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { APP_CONFIG, assetUrl } from '../config/app-config';\n\ndeclare var AWL: any;\n\nexport enum LoginState {\n LOGIN_SUCCESS = 'AWL_MSG_LOGIN_SUCCESS',\n LOGIN_FAILED = 'AWL_MSG_LOGIN_FAILED',\n LOGIN_EMPTYUSERNAME = 'AWL_MSG_LOGIN_EMPTYUSERNAME',\n LOGIN_EMPTYPASSWORD = 'AWL_MSG_LOGIN_EMPTYPASSWORD',\n LOGIN_GW_NOTCONFIGURED = 'AWL_MSG_LOGIN_GW_NOTCONFIGURED',\n LOGGEDOUT = 'AWL_MSG_LOGGEDOUT',\n WEBSOCKET_FAILURE = 'AWL_MSG_LOGIN_WEBSOCKET_FAILURE',\n DEVICEACCESS_FAILURE = 'AWL_MSG_DEVICEACCESS_FAILURE',\n RELOGGED_IN = 'AWL_MSG_RELOGGED_IN',\n RECONNECTING = 'AWL_MSG_RECONNECTING',\n FAILING_OVER = 'AWL_MSG_FAILING_OVER',\n FAILOVER_SUCCESS = 'AWL_MSG_FAIL_OVER_SUCCESS',\n FAILOVER_FAILED = 'AWL_MSG_FAIL_OVER_FAILED',\n FAILING_BACK = 'AWL_MSG_FAILING_BACK',\n FAILBACK_SUCCESS = 'AWL_MSG_FAIL_BACK_SUCCESS',\n FAILBACK_FAILED = 'AWL_MSG_FAIL_BACK_FAILED',\n}\n\nexport enum CallState {\n IDLE = 'AWL_MSG_CALL_IDLE',\n PROGRESSING = 'AWL_MSG_CALL_PROGRESSING',\n RINGING = 'AWL_MSG_CALL_RINGING',\n CONNECTED = 'AWL_MSG_CALL_CONNECTED',\n DISCONNECTED = 'AWL_MSG_CALL_DISCONNECTED',\n FAILED = 'AWL_MSG_CALL_FAILED',\n INCOMING = 'AWL_MSG_CALL_INCOMING',\n HELD = 'AWL_MSG_CALL_HELD',\n TRANSFERRED = 'AWL_MSG_CALL_TRANSFERRED',\n FAREND_UPDATE = 'AWL_MSG_CALL_FAREND_UPDATE',\n}\n\nexport interface RemoteMedia {\n callId: string;\n stream: MediaStream;\n}\n\nexport class AvayaIPOCallListener {\n constructor(private service: AvayaIPOService) { }\n\n onNewIncomingCall = (callId: any, callObj: any, autoAnswer: any): void => {\n const farEndNumber = callObj.getFarEndNumber();\n this.service.zone.run(() => {\n this.service.setLastIncomingCall(callId, farEndNumber);\n this.service.incomingCallSubject.next({\n callId,\n farEndNumber,\n });\n });\n\n if (!this.service.activeCallsMap.has(callId)) {\n this.service.assignToFirstAvailableSlot(callId, callObj);\n }\n };\n onCallStateChange = (callId: any, callObj: any, event: any): void => {\n // Raw callback from AWL (WebSocket JSON-RPC). Useful to see the original event.\n console.debug('[AWL] onCallStateChange raw →', { callId, event });\n const state = callObj.getCallState();\n this.service.zone.run(() => {\n this.service.callStateSubject.next({ callId, state });\n });\n\n if (event === 'CallTransferSuccessful') {\n console.debug('Call transfer successful');\n }\n\n this.service.handleCallState(callObj);\n\n try {\n const remote = callObj?.getRemoteStream?.();\n\n // if (remote instanceof MediaStream) {\n // this.service.remoteStream = remote;\n // this.service.remoteStream$.next(remote);\n // }\n if (remote instanceof MediaStream) {\n const payload: RemoteMedia = { callId, stream: remote };\n this.service.remoteStream = payload;\n this.service.remoteStream$.next(payload);\n }\n } catch (err) {\n console.warn('Failed to extract media streams', err);\n }\n };\n\n onCallTerminate = (callId: any, reason: any): void => {\n this.service.releaseCallById(callId);\n console.debug('Call terminated: ', reason);\n this.service.zone.run(() => {\n this.service.callTerminateSubject.next({ callId, reason });\n });\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AvayaIPOService {\n private cli!: any; // This should be the type of your Avaya IPO CLI instance\n\n public remoteStream: RemoteMedia | null = null;\n readonly remoteStream$ = new BehaviorSubject<RemoteMedia | null>(null);\n public localStream: MediaStream | null = null;\n public incomingCallSubject = new Subject<{\n callId: string;\n farEndNumber: string;\n }>();\n public callTerminateSubject = new Subject<{ callId: string; reason: any }>();\n public outgoingDialSubject = new BehaviorSubject<{ dialed: string } | null>(\n null\n );\n private ringAudio: HTMLAudioElement | null = null;\n private lastIncomingCall: { callId: string; farEndNumber: string } | null =\n null;\n public callStateSubject = new Subject<{ callId: string; state: string }>();\n public transferStatusSubject = new Subject<{\n callId?: string;\n success: boolean;\n message: string;\n }>();\n private transferInProgressCallId: string | null = null;\n\n private callSlots: Record<'1' | '2' | '3', any | null> = {\n '1': null,\n '2': null,\n '3': null,\n };\n public activeCallsMap = new Map<string, any>();\n public activeCallId: string | null = null;\n public currentcallId: string | null = null;\n\n public getLastIncomingCall():\n | { callId: string; farEndNumber: string }\n | null {\n return this.lastIncomingCall;\n }\n\n public clearLastIncomingCall(): void {\n this.lastIncomingCall = null;\n this.stopRingTone();\n }\n\n public notifyOutgoingDial(dialed: string): void {\n if (!dialed) {\n return;\n }\n this.outgoingDialSubject.next({ dialed });\n }\n\n public clearOutgoingDial(): void {\n this.outgoingDialSubject.next(null);\n }\n\n public getActiveCallCount(): number {\n return this.activeCallsMap.size;\n }\n\n public setLastIncomingCall(callId: string, farEndNumber: string): void {\n this.lastIncomingCall = { callId, farEndNumber };\n this.startRingTone();\n }\n\n private startRingTone(): void {\n try {\n if (!this.ringAudio) {\n this.ringAudio = new Audio();\n }\n this.ringAudio.src = assetUrl('assets/sounds/ringback_tone.mp3');\n this.ringAudio.loop = true;\n this.ringAudio.currentTime = 0;\n this.ringAudio.play().catch(() => {\n // Ignore autoplay failures.\n });\n } catch {\n // ignore play errors\n }\n }\n\n private stopRingTone(): void {\n if (!this.ringAudio) {\n return;\n }\n try {\n this.ringAudio.pause();\n this.ringAudio.currentTime = 0;\n this.ringAudio.src = '';\n } catch {\n // ignore teardown errors\n }\n }\n\n private agentId = '';\n private loginStatusSubject = new BehaviorSubject<boolean>(false);\n public loginStatus$ = this.loginStatusSubject.asObservable();\n\n private readonly DOM_TAGS = {\n localVideo: 'lclVideo',\n remoteVideo: 'rmtVideo',\n remoteAudio: 'rmtAudio',\n localAudio: 'lclAudio',\n };\n\n private configTemplate = {\n serviceType: '', // expected: 'phone' or 'agent' (must be provided)\n enableVideo: false,\n Gateway: { ip: '', port: '' },\n Stunserver: { ip: '', port: '' },\n Turnserver: { ip: '', port: '', user: '', pwd: '' },\n AppData: { applicationID: '', applicationUA: '', appInstanceID: '' },\n disableResiliency: false,\n };\n\n private readonly agentStatusApiUrl = APP_CONFIG.AGENT_STATUS_API_URL;\n\n private readonly CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;\n\n private prewarmedStream?: MediaStream;\n\n private isSafari(): boolean {\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n }\n\n private _rpcPatched = false;\n private _rpcMessageListenerWs?: WebSocket;\n private isLoggedIn = false;\n private initAttempts = 0;\n\n constructor(public zone: NgZone, private http: HttpClient) { }\n\n setConfigValues(opts: {\n serviceType?: string;\n gatewayIp?: string;\n gatewayPort?: string;\n stunIp?: string;\n stunPort?: string;\n turnIp?: string;\n turnPort?: string;\n }): void {\n const clean = (value?: string) => {\n const trimmed = value?.toString().trim();\n return trimmed ? trimmed : undefined;\n };\n const stunIp = clean(opts.stunIp);\n const stunPort = clean(opts.stunPort);\n const turnIp = clean(opts.turnIp);\n const turnPort = clean(opts.turnPort);\n this.configTemplate = {\n ...this.configTemplate,\n serviceType: opts.serviceType ?? this.configTemplate.serviceType,\n Gateway: {\n ...this.configTemplate.Gateway,\n ip: clean(opts.gatewayIp) ?? this.configTemplate.Gateway.ip,\n port: clean(opts.gatewayPort) ?? this.configTemplate.Gateway.port,\n },\n Stunserver: {\n ...this.configTemplate.Stunserver,\n ip: stunIp ?? this.configTemplate.Stunserver.ip,\n port: stunPort ?? this.configTemplate.Stunserver.port,\n },\n Turnserver: {\n ...this.configTemplate.Turnserver,\n ip: turnIp ?? this.configTemplate.Turnserver.ip,\n port: turnPort ?? this.configTemplate.Turnserver.port,\n user: this.configTemplate.Turnserver.user,\n pwd: this.configTemplate.Turnserver.pwd,\n },\n };\n }\n\n init() {\n // AWL is exposed by the SDK script. In some builds it shows up as `AWL`,\n // in others as `awlGlobal`. Check every known slot before giving up.\n const awlRef: any =\n (typeof AWL !== 'undefined' ? (AWL as any) : undefined) ??\n (window as any)?.AWL ??\n (window as any)?.awlGlobal;\n if (awlRef) {\n this.cli = new awlRef.client();\n this.logCliCapabilities('init');\n const cliAny = this.cli as any;\n Object.defineProperty(cliAny, 'jsonRpc', {\n configurable: true,\n set: (rpcClient: any) => {\n // restore the real property\n delete cliAny.jsonRpc;\n cliAny.jsonRpc = rpcClient;\n // now do the patch\n this._doPatch();\n },\n });\n this.initAttempts = 0;\n } else {\n console.warn('AWL is not yet loaded');\n if (this.initAttempts < 5) {\n this.initAttempts++;\n setTimeout(() => this.init(), 400);\n }\n }\n }\n\n logIn(username: string, password: string, attempt = 0): void {\n if (!this.cli) {\n this.init();\n }\n if (!this.cli) {\n if (attempt < 5) {\n setTimeout(() => this.logIn(username, password, attempt + 1), 300);\n return;\n }\n console.error('AWL client not initialized; cannot log in.');\n return;\n }\n this.logCliCapabilities('login');\n this.cli.enableLogging?.();\n // this.cli.disableLogging();\n\n const appInstanceId = this.cli.generateAppInstanceID();\n const config = {\n ...this.configTemplate,\n AppData: {\n ...this.configTemplate.AppData,\n appInstanceID: appInstanceId,\n },\n };\n // Avoid sending invalid STUN/TURN configs when values are empty.\n if (!config.Stunserver?.ip || !config.Stunserver?.port) {\n delete (config as any).Stunserver;\n }\n if (!config.Turnserver?.ip || !config.Turnserver?.port) {\n delete (config as any).Turnserver;\n }\n console.debug('Parsed config: ', config);\n\n const res_setConfiguration = this.cli.setConfiguration(\n config,\n this.handleConfigChange,\n this.handleRegistrationChange,\n new AvayaIPOCallListener(this),\n this.handleTokenRenewal\n );\n console.debug('res_setConfiguration: ', res_setConfiguration);\n\n if (res_setConfiguration === 'AWL_MSG_SETCONFIG_SUCCESS') {\n console.debug('SET CONFIG SUCCESS');\n }\n\n const res_setDomElements = this.cli.setDomElements(this.DOM_TAGS);\n console.debug('res_setDomElements: ', res_setDomElements);\n\n if (res_setDomElements === 'AWL_MSG_SETDOM_FAILED') {\n console.debug('SET DOM FAILED');\n } else {\n console.debug('SET DOM PASS');\n }\n\n const bumbConnection = 'true';\n this.cli.logIn(username, password, bumbConnection);\n this.setAgentId(username);\n }\n\n private logCliCapabilities(label: string): void {\n if (!this.cli) {\n console.warn(`[AWL] ${label}: client not ready`);\n return;\n }\n const cliAny = this.cli as any;\n const ownMethods = Object.keys(cliAny).filter(\n (key) => typeof cliAny[key] === 'function'\n );\n const proto = Object.getPrototypeOf(cliAny);\n const protoMethods = proto\n ? Object.getOwnPropertyNames(proto).filter(\n (key) => key !== 'constructor' && typeof cliAny[key] === 'function'\n )\n : [];\n const methods = Array.from(new Set([...ownMethods, ...protoMethods])).sort();\n if (methods.length === 0) {\n console.warn(`[AWL] ${label}: no methods found on client`, {\n ownKeys: Object.keys(cliAny),\n protoKeys: proto ? Object.getOwnPropertyNames(proto) : [],\n });\n return;\n }\n }\n\n logOut(): void {\n if (!this.isLoggedIn) {\n console.debug('Logout skipped: client not logged in');\n return;\n }\n this.cli.logOut();\n }\n\n logout(): void {\n const jsonRpc = (this.cli as any)?.jsonRpc;\n const ws: WebSocket | undefined = jsonRpc?.ws;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n console.warn('Logout skipped: JSON-RPC websocket not ready; falling back to SDK logout');\n this.logOut();\n return;\n }\n const id =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `logout-${Date.now()}`;\n ws.send(\n JSON.stringify({\n protocol: 'jsonrpc-3.0.0',\n id,\n service: 'phoneservice',\n msgname: 'logout',\n params: null,\n })\n );\n }\n\n getAlternateServerConfig(): any {\n return this.cli.getAlternateServerConfig();\n }\n\n getDeviceList(): void {\n this.cli.getDeviceList((deviceList: any[]) => {\n console.debug('Device List: ', deviceList);\n });\n }\n\n setDeviceIds(deviceIds: any): void {\n console.debug('setDeviceIds: ', deviceIds);\n this.cli.setDeviceIds(deviceIds);\n }\n\n public async makeCall(destination: string): Promise<'1' | '2' | '3' | null> {\n\n await this.prewarmMic();\n console.debug('makeCall devicelist: ', this.getDeviceList());\n const freeSlot = (['1', '2', '3'] as const).find(\n (s) => this.callSlots[s] === null\n );\n if (!freeSlot) {\n console.warn('All call slots are currently occupied.');\n return null;\n }\n\n // const callObj = this.cli.makeCall(destination, 'audio');\n const callObj = this.cli.makeCall(destination, 'video', {\n headers: { 'X-Original-Caller': 'asees' },\n });\n\n if (!callObj) {\n console.error('Error! Cannot make call.');\n return null;\n }\n\n const callId = callObj.getCallId();\n this.activeCallsMap.set(callId, callObj);\n this.callSlots[freeSlot] = callObj;\n this.activeCallId = callId;\n\n return freeSlot;\n }\n\n dropCall(): void {\n if (!this.activeCallId) {\n console.warn('No active call to drop.');\n return;\n }\n\n // Find the slot that contains the active call using activeCallId\n let targetSlot: '1' | '2' | '3' | null = null;\n for (const [slot, callObj] of Object.entries(this.callSlots)) {\n if (callObj && callObj.getCallId() === this.activeCallId) {\n targetSlot = slot as '1' | '2' | '3';\n break;\n }\n }\n\n if (!targetSlot) {\n console.error(\n 'Active call slot not found for activeCallId:',\n this.activeCallId\n );\n return;\n }\n\n // Drop the active call from the identified slot\n const callId = this.callSlots[targetSlot].getCallId();\n const res_dropCall = this.cli.dropCall(callId);\n console.debug('res_dropCall: ', res_dropCall);\n\n // Remove the call from the activeCalls map and the slot\n this.activeCallsMap.delete(callId);\n this.callSlots[targetSlot] = null;\n\n // Reset activeCallId\n this.activeCallId = null;\n }\n\n doMute(): void {\n const res_doMute = this.cli.doMute(this.activeCallId);\n console.debug('res_doMute: ', res_doMute);\n }\n\n doUnMute(): void {\n const res_doUnMute = this.cli.doUnMute(this.activeCallId);\n console.debug('res_doUnMute: ', res_doUnMute);\n }\n\n doHold(): void {\n const res_doHold = this.cli.doHold(this.activeCallId);\n console.debug('res_doHold: ', res_doHold);\n }\n\n doUnHold(): void {\n const res_doUnHold = this.cli.doUnHold(this.activeCallId);\n console.debug('res_doUnHold: ', res_doUnHold);\n }\n\n pauseVideo(): void {\n const res_pauseVideo = this.cli.pauseVideo(this.activeCallId);\n console.debug('res_pauseVideo: ', res_pauseVideo);\n }\n\n playVideo(): void {\n const res_playVideo = this.cli.playVideo(this.activeCallId);\n console.debug('res_playVideo: ', res_playVideo);\n }\n\n transferCall(target: string, type: string): void {\n const res_transferCall = this.cli.transferCall(\n target,\n this.activeCallId,\n type\n );\n console.debug('res_transferCall: ', res_transferCall);\n if (res_transferCall) {\n this.transferInProgressCallId = this.activeCallId || null;\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: true,\n message: 'Transfer initiated',\n });\n } else {\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: false,\n message: 'Failed to transfer',\n });\n }\n }\n\n sendDTMF(digit: string | number): void {\n const res_sendDTMF = this.cli.sendDTMF(this.activeCallId, digit);\n console.debug('res_sendDTMF: ', res_sendDTMF);\n }\n\n answerCall(): void {\n const incomingCallId = this.lastIncomingCall?.callId || null;\n let callId = incomingCallId || this.activeCallId || null;\n\n if (!callId) {\n for (const callObj of Object.values(this.callSlots)) {\n if (callObj) {\n callId = callObj.getCallId();\n break;\n }\n }\n }\n\n if (!callId) {\n console.warn('No callId available to answer.');\n return;\n }\n\n this.activeCallId = callId;\n this.stopRingTone();\n const res_answerCall = this.cli.answerCall(callId);\n console.debug('res_answerCall: ', res_answerCall);\n\n if (incomingCallId) {\n this.clearLastIncomingCall();\n }\n }\n\n addVideo(): void {\n const res_addVideo = this.cli.addVideo(this.activeCallId);\n console.debug('res_addVideo: ', res_addVideo);\n }\n\n removeVideo(): void {\n const res_removeVideo = this.cli.removeVideo(this.activeCallId);\n console.debug('res_removeVideo: ', res_removeVideo);\n }\n\n clearCallSlot(): void {\n this.callSlots['1'] = null;\n }\n\n setAgentId(id: string): void {\n this.agentId = id;\n }\n\n agentIdle(): void {\n const params = new HttpParams()\n .set('action', 'release')\n .set('agentId', this.agentId);\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe(\n (response) => console.debug('Agent marked as idle: ', response),\n (error) => console.error('Error updating agent status: ', error)\n );\n }\n\n agentBusy(): void {\n const params = new HttpParams()\n .set('action', 'confirm')\n .set('agentId', this.agentId);\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe(\n (response) => console.debug('Agent marked as busy: ', response),\n (error) => console.error('Error updating agent status: ', error)\n );\n }\n\n agentAutoRelease(): void {\n setInterval(() => {\n const params = new HttpParams().set('action', 'auto-release');\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.get(this.agentStatusApiUrl, { params, headers }).subscribe(\n (response) => console.debug('Auto-release triggered: ', response),\n (error) => console.error('Auto-release failed: ', error)\n );\n }, 2 * 60 * 1000);\n }\n\n handleConfigChange = (res_configChange: any): void => {\n console.debug('res_configChange: ', res_configChange);\n };\n\n handleRegistrationChange = (res_registrationChange: any): void => {\n // console.debug('res_registrationChange: ', res_registrationChange);\n this.zone.run(() => {\n this.loginStatusSubject.next(res_registrationChange);\n });\n console.debug('res_registrationChange: ', res_registrationChange);\n if (res_registrationChange?.result === LoginState.LOGIN_SUCCESS) {\n const rpc: any = (this.cli as any).jsonRpc;\n this.isLoggedIn = true;\n if (rpc && rpc.ws) {\n rpc.ws.evtConnectionOpen.attach(() => {\n this.patchRpcForTransfers(this.agentId);\n });\n }\n }\n\n if (res_registrationChange?.result === LoginState.LOGIN_FAILED) {\n // LOGIN_FAILED means the client is not authenticated yet; skip SDK logout to avoid\n // \"Logout denied as client not logged in yet\".\n this.isLoggedIn = false;\n }\n\n };\n\n handleTokenRenewal = (res_tokenRenewal: any): void => {\n console.debug('res_tokenRenewal: ', res_tokenRenewal);\n if (res_tokenRenewal.result == 'AWL_MSG_TOKEN_RENEW_SUCCESS') {\n console.debug('Token is successfully renewed');\n } else {\n console.debug('Token renewal failed. reason: ', res_tokenRenewal.reason);\n }\n };\n\n assignToFirstAvailableSlot(callId: string, callObj: any): void {\n const freeSlot = Object.entries(this.callSlots).find(\n ([_, obj]) => obj === null\n );\n if (freeSlot) {\n this.callSlots[freeSlot[0] as '1' | '2' | '3'] = callObj;\n this.activeCallsMap.set(callId, callObj);\n // If we don't already have an active call tracked, set this incoming call as active.\n if (!this.activeCallId) {\n this.activeCallId = callId;\n }\n } else {\n console.warn('All call slots are occupied');\n }\n }\n\n getSlotForCallId(callId: string): '1' | '2' | '3' | null {\n for (const [slot, callObj] of Object.entries(this.callSlots)) {\n if (callObj && callObj.getCallId() === callId) {\n return slot as '1' | '2' | '3';\n }\n }\n return null;\n }\n\n releaseCallById(callId: string): void {\n for (const [slot, obj] of Object.entries(this.callSlots)) {\n if (obj?.getCallId() === callId) {\n this.callSlots[slot as '1' | '2' | '3'] = null;\n this.activeCallsMap.delete(callId);\n break;\n }\n }\n }\n\n handleCallState(callObj: any): void {\n console.debug(\n `Call state updated for Call ID: ${callObj?.getCallId()}`,\n callObj\n );\n console.debug(\n `Call state updated for Call ID: ${callObj?.getSipUri()}`,\n callObj\n );\n this.currentcallId = callObj.getCallId();\n const state = callObj.getCallState();\n if (!this.activeCallId) {\n this.activeCallId = callObj.getCallId();\n }\n switch (state) {\n case CallState.CONNECTED:\n this.stopRingTone();\n break;\n case CallState.FAILED:\n case CallState.DISCONNECTED:\n console.debug('Call Failed or DISCONNECTED! Releasing call...');\n this.stopRingTone();\n this.releaseCallById(callObj.getCallId());\n // Signal UI to reset to dialpad (ensure change detection runs)\n this.zone.run(() => {\n this.callStateSubject.next({\n callId: callObj.getCallId(),\n state: CallState.DISCONNECTED,\n });\n });\n break;\n case CallState.FAREND_UPDATE:\n console.debug(\n 'FarEnd Updated:',\n callObj.getFarEndNumber(),\n callObj.getFarEndName(),\n callObj.getSipUri()\n );\n break;\n default:\n console.debug('Call state: ', state);\n }\n }\n\n swapLines(): void {\n let currentSlotKey: string | null = null;\n\n // Find the slot key of the current active call\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (call && call.getCallId() === this.activeCallId) {\n currentSlotKey = key;\n break;\n }\n }\n\n if (!currentSlotKey) {\n console.warn('Active call slot not found.');\n return;\n }\n\n // Find another active call to swap to\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (key === currentSlotKey) continue;\n if (call) {\n const currentCall = this.callSlots[currentSlotKey as '1' | '2' | '3'];\n\n this.cli.doHold(currentCall?.getCallId());\n\n this.cli.doUnHold(call.getCallId());\n\n this.activeCallId = call.getCallId();\n return;\n }\n }\n\n console.warn('No other active calls to swap to.');\n }\n\n public swapToSlot(targetSlot: '1' | '2' | '3'): void {\n // 1) Find the current slot\n let currentSlotKey: '1' | '2' | '3' | null = null;\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (call && call.getCallId() === this.activeCallId) {\n currentSlotKey = key as '1' | '2' | '3';\n break;\n }\n }\n\n if (!currentSlotKey) {\n console.warn(\"Active call slot not found, can't swap.\");\n return;\n }\n\n // 2) If targetSlot is the same as currentSlotKey, do nothing\n if (targetSlot === currentSlotKey) {\n return;\n }\n\n // 3) If the target slot has a call\n const targetCall = this.callSlots[targetSlot];\n if (!targetCall) {\n console.warn(`No call in slot ${targetSlot}, can't unhold that slot.`);\n return;\n }\n\n // 4) Hold the old slot\n const currentCall = this.callSlots[currentSlotKey];\n this.cli.doHold(currentCall?.getCallId());\n\n // 5) Unhold the target slot\n this.cli.doUnHold(targetCall.getCallId());\n\n // 6) Update activeCallId\n this.activeCallId = targetCall.getCallId();\n }\n\n public dropCallBySlot(targetSlot: '1' | '2' | '3'): void {\n // Check if there is a call in the requested slot.\n const targetCall = this.callSlots[targetSlot];\n if (!targetCall) {\n console.warn(`No active call in slot ${targetSlot} to drop.`);\n return;\n }\n\n // Retrieve the call ID from the target call.\n const callId = targetCall.getCallId();\n\n // Issue the drop command through Avaya's CLI.\n const res_dropCall = this.cli.dropCall(callId);\n console.debug('dropCallBySlot response:', res_dropCall);\n\n // Clean up: remove the call from the slot and from the activeCallsMap.\n this.activeCallsMap.delete(callId);\n this.callSlots[targetSlot] = null;\n\n // If the activeCallId matches the dropped call, reset it.\n if (this.activeCallId === callId) {\n this.activeCallId = null;\n }\n }\n\n\n public logCall(callData: any) {\n // 1) Build the HttpParams with \"action=log\"\n const params = new HttpParams().set('action', 'log');\n\n // 2) Set headers to JSON\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n // 3) Make a POST request, passing callData in the body, and use params + headers\n return this.http.post(this.CALL_HISTORY_API_URL, callData, {\n params,\n headers,\n });\n }\n\n public getActiveCallId(): string | null {\n if (!this.activeCallId) {\n return null;\n }\n\n const callObj = this.activeCallsMap.get(this.activeCallId);\n if (!callObj) {\n return null;\n }\n\n return callObj.getCallId();\n }\n\n public async initLocalMic(): Promise<void> {\n try {\n const micStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n this.localStream = micStream;\n } catch (err) {\n console.error('Failed to capture microphone:', err);\n }\n }\n /////////////////////////////////////////////////////////////\n private patchRpcForTransfers(agentId: string) {\n if (this._rpcPatched) {\n console.debug('[RPC-PATCH] already patched');\n return;\n }\n const jsonRpc = (this.cli as any).jsonRpc;\n if (!jsonRpc || !jsonRpc.ws) {\n console.warn('[RPC-PATCH] JSON-RPC not ready yet');\n return;\n }\n\n console.debug('[RPC-PATCH] patching ws.send now');\n this._rpcPatched = true;\n\n const ws = jsonRpc.ws as WebSocket;\n const origSend = ws.send.bind(ws);\n\n ws.send = (raw: string | ArrayBuffer) => {\n // log every outbound frame so you can see your injection happen\n try {\n const msg = JSON.parse(raw as string);\n if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {\n console.debug(`[RPC-PATCH] sending ${msg.msgname} →`, msg.params);\n }\n } catch (_) {\n /* not JSON, ignore */\n }\n\n return origSend(raw);\n };\n }\n\n public async makeCallWithCustomData(\n destination: string,\n dataToSend: string\n ): Promise<'1' | '2' | '3' | null> {\n // 0) Safari race fix\n await this.prewarmMic();\n\n this.patchRpcForTransfers(dataToSend);\n\n // 2) find a free slot\n const freeSlot = (['1', '2', '3'] as const).find(\n (s) => this.callSlots[s] === null\n );\n if (!freeSlot) {\n console.warn('All call slots are occupied.');\n return null;\n }\n\n // 3) kick off the call via AWL\n const callObj = this.cli.makeCall(destination, 'audio');\n if (!callObj) {\n console.error('Error! Cannot make call.');\n return null;\n }\n\n // 4) book-keep exactly as you do today\n const callId = callObj.getCallId();\n this.activeCallsMap.set(callId, callObj);\n this.callSlots[freeSlot] = callObj;\n this.activeCallId = callId;\n return freeSlot;\n }\n\n public transferCallWithTag(target: string, type: 'Attended' | 'Blind'): void {\n // 1) patch the JSON-RPC so the next transferCall has our tag\n this.patchRpcForTransfers(this.agentId);\n\n // 2) do the normal AWL transfer\n const res = this.cli.transferCall(target, this.activeCallId, type);\n console.debug('res_transferCall:', res);\n if (res) {\n this.transferInProgressCallId = this.activeCallId || null;\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: true,\n message: 'Transfer initiated',\n });\n } else {\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: false,\n message: 'Failed to transfer',\n });\n }\n }\n\n public consumeTransferInProgress(callId: string): boolean {\n if (this.transferInProgressCallId && this.transferInProgressCallId === callId) {\n this.transferInProgressCallId = null;\n return true;\n }\n return false;\n }\n\n private _doPatch() {\n // if (this._rpcPatched) return;\n this._rpcPatched = true;\n\n const jsonRpc = (this.cli as any).jsonRpc;\n const ws: WebSocket = jsonRpc.ws;\n const origSend = ws.send.bind(ws);\n\n ws.send = (data: string | ArrayBuffer) => {\n try {\n const msg = JSON.parse(data as string);\n if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {\n // inject your field\n msg.params.transferingAgent = this.agentId;\n const patched = JSON.stringify(msg);\n return origSend(patched);\n }\n } catch {\n // non-JSON or other messages\n }\n return origSend(data);\n };\n }\n\n\n /** Pre-warm microphone so AWL always has a local stream when it tries addStream() */\n public async prewarmMic(): Promise<MediaStream> {\n // Reuse if we already have a healthy stream\n if (this.prewarmedStream && this.prewarmedStream.getTracks().length) {\n return this.prewarmedStream;\n }\n\n // On Safari, first call should be simple (no exact device constraints)\n const audio: MediaStreamConstraints['audio'] =\n this.isSafari() ? true : { echoCancellation: false, noiseSuppression: false, autoGainControl: false };\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio });\n\n this.prewarmedStream = stream;\n this.localStream = stream;\n\n // Hand it to the polyfill fallback so addStream(undefined) still works\n (window as any).__LAST_LOCAL_STREAM = stream;\n\n // (Optional) Nudge autoplay policy: attach to a muted hidden <audio> once\n try {\n const a = document.createElement('audio');\n a.muted = true;\n a.autoplay = true;\n a.style.display = 'none';\n a.srcObject = stream;\n document.body.appendChild(a);\n await a.play().catch(() => { });\n // keep element for lifetime of the page to avoid GC issues\n } catch { }\n\n return stream;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../config/app-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CountryService {\n private countriesData!: any[];\n\n // private static readonly COUNTRY_ENDPOINT = `https://assets.snugdesk.com/metadata/countries.json`;\n private static readonly COUNTRY_ENDPOINT = APP_CONFIG.COUNTRY_ENDPOINT;\n\n constructor(private httpClient: HttpClient) {}\n\n public async getAllCountries(): Promise<any[]> {\n if (!this.countriesData) {\n this.countriesData = await lastValueFrom(\n this.httpClient.get<any[]>(CountryService.COUNTRY_ENDPOINT)\n );\n }\n return this.countriesData;\n }\n\n async getCountryFromCallingCode(\n countryCallingCode: string\n ): Promise<any | undefined> {\n await this.getAllCountries();\n return this.countriesData?.find(\n (c: any) => c.callingCode === countryCallingCode\n );\n }\n\n async getCountryFromCountryCode(\n countryCode: string\n ): Promise<any | undefined> {\n await this.getAllCountries();\n return this.countriesData?.find((c: any) => c.code === countryCode);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../config/app-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PhoneNumberLookupService {\n constructor(private httpClient: HttpClient) {}\n\n async lookupPhoneNumber(phoneNumber: string, hlr?: boolean): Promise<Object> {\n const normalizedPhoneNumber = this.normalizeForLookup(phoneNumber);\n const apiEndpoint = hlr\n ? `${APP_CONFIG.PHONE_NUMBER_HLR_BASE}/${encodeURIComponent(\n normalizedPhoneNumber\n )}`\n : `${APP_CONFIG.PHONE_NUMBER_LOOKUP_BASE}/${encodeURIComponent(\n normalizedPhoneNumber\n )}`;\n\n const res_lookupPhoneNumber = await lastValueFrom(\n this.httpClient.get(apiEndpoint)\n );\n // console.debug('res_lookupPhoneNumber: ', res_lookupPhoneNumber);\n\n return res_lookupPhoneNumber;\n }\n\n private normalizeForLookup(phoneNumber: string): string {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n return '';\n }\n\n let normalized = phoneNumber.trim();\n if (normalized.startsWith('00')) {\n return `+${normalized.slice(2)}`;\n }\n if (normalized.startsWith('+')) {\n return normalized;\n }\n\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!countryCode) {\n return digits;\n }\n\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n\n if (local.startsWith(countryCode)) {\n return `+${local}`;\n }\n return `+${countryCode}${local}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthenticationService {\n tenant$: BehaviorSubject<any>;\n user$: BehaviorSubject<any>;\n isAuthenticated$: BehaviorSubject<boolean>;\n\n constructor(private snugdeskAuthService: SnugdeskAuthenticationService) {\n this.tenant$ = this.snugdeskAuthService.tenant$;\n this.user$ = this.snugdeskAuthService.user$;\n this.isAuthenticated$ = this.snugdeskAuthService.isAuthenticated$;\n }\n\n isAuthenticated(): boolean {\n return this.snugdeskAuthService.isAuthenticated();\n }\n\n getAuthSessionToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n\n getAuthDomainToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n getDecodedAuthDomainToken(): any {\n return this.snugdeskAuthService.getDecodedToken();\n }\n \n getTenantId(): string {\n // return this.getDecodedAuthSessionToken().tenantId;\n return this.snugdeskAuthService.getTenantId();\n }\n\n getDecodedAuthSessionToken(): any {\n if (!this.isAuthenticated()) {\n const err: any = new Error(`User not authenticated`);\n err.status = 403;\n throw err;\n }\n \n const token = this.getAuthSessionToken();\n if (!token) {\n const err: any = new Error(`Token missing`);\n err.status = 401;\n throw err;\n }\n \n return this.snugdeskAuthService.getDecodedToken();\n }\n \n\n getUserId(): string {\n return this.snugdeskAuthService.getUserId();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { APP_CONFIG } from '../config/app-config';\nimport { AuthenticationService } from './authentication.service';\n\n@Injectable({ providedIn: 'root' })\nexport class EntitiesSearchService {\n private nameCache = new Map<string, string>();\n\n constructor(\n private http: HttpClient,\n private authenticationService: AuthenticationService\n ) { }\n\n async fetchContacts(\n tenantId: string,\n size = 25,\n searchAfter?: [string, string]\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n {\n bool: {\n should: [\n { exists: { field: 'phone_numbers' } },\n { exists: { field: 'phone' } },\n { exists: { field: 'normalizedPhoneNumber' } },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n if (searchAfter && searchAfter.length === 2) {\n (body as any).search_after = searchAfter;\n }\n\n return this.postEntities(body);\n }\n\n async searchByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n ],\n must: [\n {\n bool: {\n should: [\n {\n simple_query_string: {\n query: phoneNumber,\n fields: ['name', 'emails', 'phone_numbers'],\n default_operator: 'and',\n },\n },\n {\n wildcard: {\n 'emails.keyword': {\n value: this.ensureWildcard(phoneNumber),\n case_insensitive: true,\n },\n },\n },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n\n return this.postEntities(body);\n }\n\n async searchEntities(\n tenantId: string,\n query: string,\n size = 25,\n from = 0\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n ],\n must: [\n {\n bool: {\n should: [\n {\n simple_query_string: {\n query,\n fields: ['name', 'emails', 'phone_numbers'],\n default_operator: 'and',\n },\n },\n {\n wildcard: {\n 'emails.keyword': {\n value: this.ensureWildcard(query),\n case_insensitive: true,\n },\n },\n },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n\n return this.postEntities(body);\n }\n\n getCachedName(tenantId: string, phoneNumber: string): string | null {\n const key = this.cacheKey(tenantId, phoneNumber);\n return this.nameCache.get(key) || null;\n }\n\n async lookupNameByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<string | null> {\n const cached = this.getCachedName(tenantId, phoneNumber);\n if (cached) {\n return cached;\n }\n const res: any = await this.searchByPhone(tenantId, phoneNumber, size);\n const hit = res?.hits?.hits?.[0];\n const name = hit?._source?.name;\n const trimmed = typeof name === 'string' ? name.trim() : '';\n if (trimmed) {\n this.nameCache.set(this.cacheKey(tenantId, phoneNumber), trimmed);\n return trimmed;\n }\n return null;\n }\n\n private postEntities(body: object): Promise<any> {\n const token = this.authenticationService.getAuthSessionToken();\n const headers = token ? { Authorization: `Bearer ${token}` } : undefined;\n return lastValueFrom(\n this.http.post(APP_CONFIG.OPENSEARCH_ENTITIES_URL, body, { headers })\n );\n }\n\n private cacheKey(tenantId: string, phoneNumber: string): string {\n return `${tenantId}:${phoneNumber}`;\n }\n\n private ensureWildcard(value: string): string {\n const trimmed = (value || '').toString().trim();\n if (!trimmed) {\n return '*';\n }\n return trimmed.includes('*') ? trimmed : `${trimmed}*`;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../../../config/app-config';\n\ntype TranscriptLine = {\n speaker?: string;\n text?: string;\n};\n\n@Component({\n selector: 'app-call-details',\n templateUrl: './call-details.component.html',\n styleUrls: ['./call-details.component.css'],\n standalone: false,\n})\nexport class CallDetailsComponent {\n @Input() call: any;\n transcriptLines: TranscriptLine[] = [];\n summaryText = '';\n customerSentiment = '';\n isTranscribing = false;\n transcriptionError = '';\n isTranscriptFullscreen = false;\n hasGeneratedTranscript = false;\n private readonly ANALYZE_CALL_API = APP_CONFIG.POSTCALL_TRANSCRIBE_API_URL;\n\n constructor(private http: HttpClient) {}\n\n getBadge(): string {\n const base =\n this.call?.phoneNumber?.country?.code ||\n this.call?.direction ||\n '--';\n return base.toString().slice(0, 2).toUpperCase();\n }\n\n getDisplayName(): string {\n return (\n this.call?.lookupPhoneNumber?.name ||\n this.call?.phoneNumber?.lookupPhoneNumber?.name ||\n this.call?.contactName ||\n 'Unknown'\n );\n }\n\n getPhone(): string {\n return (\n this.call?.phoneNumber?.normalizedPhoneNumber ||\n this.call?.phoneNumber?.lookupPhoneNumber?.['international-number'] ||\n this.call?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n this.call?.phoneNumber ||\n ''\n );\n }\n\n getTranscriptSpeaker(line: TranscriptLine): string {\n const raw = (line?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'customer') {\n const name = this.getDisplayName();\n return name && name !== 'Unknown' ? name : 'Unknown';\n }\n if (normalized === 'agent') {\n return 'Agent';\n }\n return raw || 'Unknown';\n }\n\n async runTranscription(): Promise<void> {\n if (!this.call?.fullCallRecordingUrl || this.isTranscribing) {\n return;\n }\n this.isTranscribing = true;\n this.transcriptionError = '';\n try {\n const recordingBlob = await lastValueFrom(\n this.http.get(this.call.fullCallRecordingUrl, { responseType: 'blob' })\n );\n const formData = new FormData();\n formData.append('file', recordingBlob, this.getRecordingFilename());\n const res: any = await lastValueFrom(\n this.http.post(this.ANALYZE_CALL_API, formData)\n );\n this.transcriptLines = this.normalizeTranscript(res?.transcript);\n this.summaryText = typeof res?.summary === 'string' ? res.summary : '';\n this.customerSentiment = typeof res?.customerSentiment === 'string' ? res.customerSentiment : '';\n this.hasGeneratedTranscript = true;\n } catch (err) {\n console.error('[CallDetails] Transcription failed', err);\n this.transcriptionError = 'Failed to analyze call. Please try again.';\n } finally {\n this.isTranscribing = false;\n }\n }\n\n private normalizeTranscript(input: any): TranscriptLine[] {\n if (!input) {\n return [];\n }\n if (typeof input === 'string') {\n return input\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parsed = this.parseSpeakerLine(line);\n return { speaker: parsed.speaker, text: parsed.text };\n });\n }\n if (Array.isArray(input)) {\n return input\n .map((entry) => {\n if (typeof entry === 'string') {\n const parsed = this.parseSpeakerLine(entry);\n return { speaker: parsed.speaker, text: parsed.text };\n }\n if (entry && typeof entry === 'object') {\n return {\n speaker: entry.speaker,\n text: entry.text,\n };\n }\n return null;\n })\n .filter(Boolean) as TranscriptLine[];\n }\n return [];\n }\n\n getSentimentEmoji(): string {\n const value = (this.customerSentiment || '').toLowerCase();\n if (value.includes('positive')) return '🙂';\n if (value.includes('negative')) return '☹️';\n if (value.includes('neutral')) return '😐';\n return '';\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n toggleTranscriptFullscreen(): void {\n this.isTranscriptFullscreen = !this.isTranscriptFullscreen;\n }\n\n private getRecordingFilename(): string {\n const url = this.call?.fullCallRecordingUrl;\n if (typeof url === 'string') {\n try {\n const parsed = new URL(url);\n const name = parsed.pathname.split('/').pop();\n if (name) {\n return name;\n }\n } catch {\n const parts = url.split('/').filter(Boolean);\n const name = parts[parts.length - 1];\n if (name) {\n return name;\n }\n }\n }\n return 'call-recording.wav';\n }\n}\n","<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"divider\">|</span>\n <span class=\"missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"detail-card summary-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Duration</div>\n <div class=\"value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Disconnect Side</div>\n <div class=\"value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Country</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.country?.nameEn ||\n call?.phoneNumber?.lookupPhoneNumber?.country ||\n 'N/A'\n }}\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Provider</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.lookupPhoneNumber?.['prefix-network'] ||\n call?.phoneNumber?.lookupPhoneNumber?.provider ||\n 'N/A'\n }}\n </div>\n </div>\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n @if (!hasGeneratedTranscript) {\n <div class=\"transcription-actions outside\">\n <button class=\"action-btn\" type=\"button\" [disabled]=\"isTranscribing\" (click)=\"runTranscription()\">\n <span class=\"btn-content\">\n @if (isTranscribing) {\n <span class=\"btn-spinner\" aria-hidden=\"true\"></span>\n }\n <span>{{ isTranscribing ? 'Generating...' : 'Run AI Call Analysis' }}</span>\n </span>\n </button>\n @if (transcriptionError) {\n <div class=\"status-error\">{{ transcriptionError }}</div>\n }\n </div>\n }\n\n <div class=\"detail-card\">\n <div class=\"detail-title\">Call Summary</div>\n @if (customerSentiment) {\n <div class=\"summary-sentiment\">\n Customer Sentiment: {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n }\n @if (summaryText) {\n <div class=\"summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"placeholder\">No summary available.</div>\n }\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title-row\">\n <div class=\"detail-title\">AI Call Transcription</div>\n @if (transcriptLines?.length) {\n <button\n class=\"chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (call?.fullCallRecordingUrl) {\n @if (transcriptLines?.length) {\n <div class=\"chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"chat-bubble\" [class.agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isTranscribing) {\n <div class=\"transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"placeholder\">No transcription available.</div>\n }\n\n } @else {\n <div class=\"placeholder\">No recording available for transcription.</div>\n }\n </div>\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG, formatDialOutNumber } from '../../config/app-config';\n\n@Component({\n selector: 'app-call-history',\n templateUrl: './call-history.component.html',\n styleUrls: ['./call-history.component.css'],\n standalone: false,\n})\nexport class CallHistoryComponent implements OnInit {\n @Input() mode: 'dial' | 'transfer' = 'dial';\n @Input() tenantId?: string;\n @Input() agentId?: string;\n @Output() makeCallEv = new EventEmitter<{ dialOut: string; name?: string }>();\n @Output() transferEv = new EventEmitter<any>();\n\n private readonly CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;\n\n showHistoryLoader: boolean = false;\n\n callHistory: any[] = [];\n searchTerm = '';\n recentCallactiveTab: 'recentCall' | 'missedCall' = 'recentCall';\n selectedCall: any = null;\n\n constructor(private http: HttpClient, private cdr: ChangeDetectorRef) {}\n\n async ngOnInit(): Promise<void> {\n await this.loadCallHistory();\n }\n\n recentSelectTab(tab: 'recentCall' | 'missedCall'): void {\n this.recentCallactiveTab = tab;\n }\n\n async loadCallHistory(): Promise<void> {\n this.showHistoryLoader = true;\n try {\n const tenantId = this.tenantId || this.getTenantIdFromSession();\n const userId = this.agentId || this.getUserIdFromSession();\n\n if (!tenantId || !userId) {\n console.warn('Missing tenantId or agentId for call history', {\n tenantId,\n userId,\n });\n return;\n }\n\n const response: any = await this.getCallHistory(tenantId, userId);\n const items = response.items || [];\n\n this.callHistory = items.sort(\n (a: any, b: any) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n } catch (error) {\n console.error('Failed to load call history:', error);\n } finally {\n this.showHistoryLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n getCallHistory(tenantId: string, agentId: string): Promise<any> {\n // GET /avayaCallHistory?action=history&tenantId=xxx&agentId=yyy\n return lastValueFrom(\n this.http.get(\n `${this.CALL_HISTORY_API_URL}?action=history&tenantId=${tenantId}&agentId=${agentId}`\n )\n );\n }\n\n makeCall(phoneNumber: string, name?: string): void {\n const dialOut = formatDialOutNumber(phoneNumber);\n if (!dialOut) {\n console.warn('No dialable number for call history makeCall:', phoneNumber);\n return;\n }\n this.makeCallEv.emit({ dialOut, name });\n }\n\n get callerDropped(): any[] {\n return this.callHistory.filter((item) => {\n const duration = Number(item?.duration ?? 0);\n return item.disconnectSide === 'CALLER' && duration <= 0;\n });\n }\n\n get filteredRecent(): any[] {\n if (!this.searchTerm.trim()) return this.callHistory;\n const term = this.searchTerm.toLowerCase();\n const termDigits = this.searchTerm.replace(/\\D/g, '');\n return this.callHistory.filter((item) => {\n const phone =\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n item?.lookupPhoneNumber?.['local-number'] ||\n item?.lookupPhoneNumber?.normalizedPhoneNumber ||\n '';\n const name = item?.lookupPhoneNumber?.name || '';\n const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedRecent(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredRecent);\n }\n\n get filteredMissed(): any[] {\n if (!this.searchTerm.trim()) return this.callerDropped;\n const term = this.searchTerm.toLowerCase();\n const termDigits = this.searchTerm.replace(/\\D/g, '');\n return this.callerDropped.filter((item) => {\n const phone =\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n item?.lookupPhoneNumber?.['local-number'] ||\n item?.lookupPhoneNumber?.normalizedPhoneNumber ||\n '';\n const name = item?.lookupPhoneNumber?.name || '';\n const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedMissed(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredMissed);\n }\n\n onSelectCall(item: any): void {\n this.selectedCall = item;\n }\n\n closeDetails(): void {\n this.selectedCall = null;\n }\n\n selectFromHistory(item: any): void {\n if (this.mode === 'transfer') {\n \n this.transferEv.emit(item);\n return;\n }\n\n \n const dialable =\n this.resolveDialable(item) ||\n (item?.phoneNumber ?? '').toString().replace(/\\s+/g, '');\n if (!dialable) {\n console.warn('No dialable number found in history item:', item);\n return;\n }\n const dialOut = formatDialOutNumber(dialable);\n if (!dialOut) {\n console.warn('No dialable number after formatting history item:', item);\n return;\n }\n const name = this.resolveName(item);\n this.makeCallEv.emit({ dialOut, name });\n }\n\n\n private resolveDialable(item: any): string | null {\n const clean = (v: any) => (v ?? '').toString().replace(/\\s+/g, '');\n return (\n clean(item?.resolvedDialable) ||\n clean(item?.phoneNumber?.normalizedPhoneNumber) ||\n clean(item?.phoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.phoneNumber) ||\n clean(item?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.normalizedPhoneNumber) ||\n null\n );\n }\n\n private resolveName(item: any): string | undefined {\n const name =\n item?.phoneNumber?.name ||\n item?.lookupPhoneNumber?.name ||\n item?.name;\n if (typeof name === 'string' && name.trim()) {\n return name.trim();\n }\n return undefined;\n }\n\n private formatDialOutFromInput(value: any): string {\n return formatDialOutNumber(value);\n }\n\n private getTenantIdFromSession(): string | undefined {\n const raw = sessionStorage.getItem('sd-tenant');\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return parsed?.id || parsed?.tenantId || undefined;\n } catch {\n return undefined;\n }\n }\n\n private getUserIdFromSession(): string | undefined {\n const raw = sessionStorage.getItem('sd-user');\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return parsed?.id || parsed?.userId || undefined;\n } catch {\n return undefined;\n }\n }\n\n getPhoneDisplay(item: any): string {\n return (\n item?.phoneNumber?.name ||\n item?.lookupPhoneNumber?.name ||\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['international-number'] ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n ''\n ).toString();\n }\n\n getPhoneBadge(item: any): string {\n const displayName =\n item?.phoneNumber?.name || item?.lookupPhoneNumber?.name || '';\n if (displayName) {\n return this.getInitials(displayName);\n }\n const code =\n item?.phoneNumber?.country?.code ||\n item?.phoneNumber?.lookupPhoneNumber?.['country-code'] ||\n '';\n if (code) return code.toUpperCase();\n const display = this.getPhoneDisplay(item);\n return display ? display.slice(0, 2) : '--';\n }\n\n private getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '--';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n\n private groupByDate(items: any[]): Array<{ label: string; items: any[] }> {\n const groups: Array<{ label: string; items: any[] }> = [];\n let currentLabel = '';\n let currentGroup: { label: string; items: any[] } | null = null;\n\n for (const item of items) {\n const label = this.formatDateLabel(item?.timestamp);\n if (!currentGroup || label !== currentLabel) {\n currentLabel = label;\n currentGroup = { label, items: [] };\n groups.push(currentGroup);\n }\n currentGroup.items.push(item);\n }\n\n return groups;\n }\n\n private formatDateLabel(ts: string): string {\n const date = ts ? new Date(ts) : new Date();\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n\n const isSameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\n if (isSameDay(date, today)) return 'Today';\n if (isSameDay(date, yesterday)) return 'Yesterday';\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n });\n }\n}\n","<div class=\"recent_container_outer\">\n @if (showHistoryLoader) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (selectedCall) {\n <div class=\"history_details_panel\">\n <button class=\"back_btn\" type=\"button\" (click)=\"closeDetails()\">← Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name\" [class.history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta\" [ngClass]=\"{\n missed: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"meta_label\" [ngClass]=\"{\n inbound: call.direction?.toLowerCase() === 'inbound',\n outbound: call.direction?.toLowerCase() === 'outbound',\n missed: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta caller_drop\">\n <span class=\"meta_label missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span class=\"direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n }\n }\n @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No missed calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n }\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'app-contact-card',\n templateUrl: './contact-card.component.html',\n styleUrls: ['./contact-card.component.css'],\n standalone: false,\n})\nexport class ContactCardComponent {\n @Input() name = '';\n @Input() phone = '';\n @Output() call = new EventEmitter<Event>();\n\n get initials(): string {\n const parts = (this.name || '').trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) {\n return (this.phone || '').slice(0, 2).toUpperCase() || '--';\n }\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n\n onCall(ev: Event): void {\n ev.stopPropagation();\n this.call.emit(ev);\n }\n}\n","<div class=\"contact-card\">\n <div class=\"contact-avatar grd1\">{{ initials }}</div>\n <div class=\"contact-body\">\n <div class=\"contact-name\">{{ name }}</div>\n <div class=\"contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n</div>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-contact-details',\n templateUrl: './contact-details.component.html',\n styleUrls: ['./contact-details.component.css'],\n standalone: false,\n})\nexport class ContactDetailsComponent {\n @Input() contact: any;\n\n getDisplayName(): string {\n return (this.contact?.name || 'Unknown').toString();\n }\n\n getPrimaryPhone(): string {\n const phones = Array.isArray(this.contact?.phone_numbers)\n ? this.contact.phone_numbers\n : [];\n return (\n phones[0] ||\n this.contact?.phone ||\n this.contact?.normalizedPhoneNumber ||\n 'Unknown'\n ).toString();\n }\n\n getEmails(): string[] {\n const emails = Array.isArray(this.contact?.emails)\n ? this.contact.emails.filter((e: any) => typeof e === 'string' && e.trim())\n : [];\n return emails;\n }\n\n getPhoneNumbers(): string[] {\n const phones = Array.isArray(this.contact?.phone_numbers)\n ? this.contact.phone_numbers.filter((p: any) => typeof p === 'string' && p.trim())\n : [];\n return phones;\n }\n\n getInitials(): string {\n const parts = this.getDisplayName().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '--';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n}\n","<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">{{ getInitials() }}</div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">{{ getDisplayName() }}</div>\n <div class=\"secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"meta-line\">\n @if (contact?.is_organization) {\n <span class=\"dir outbound\">Organization</span>\n } @else {\n <span class=\"dir inbound\">Individual</span>\n }\n <span class=\"divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Phones</div>\n <div class=\"value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Emails</div>\n <div class=\"value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Call</div>\n <div class=\"value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Email</div>\n <div class=\"value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow SMS</div>\n <div class=\"value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow WhatsApp</div>\n <div class=\"value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Created</div>\n <div class=\"value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Updated</div>\n <div class=\"value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, OnInit, AfterViewInit, ElementRef, Output, ViewChild } from '@angular/core';\nimport { EntitiesSearchService } from '../../services/entities-search.service';\n\ntype ContactItem = {\n id: string;\n name: string;\n phone: string;\n entity: any;\n};\n\n@Component({\n selector: 'app-contacts',\n templateUrl: './contacts.component.html',\n styleUrls: ['./contacts.component.css'],\n standalone: false,\n})\nexport class ContactsComponent implements OnInit, AfterViewInit {\n @Input() tenantId?: string;\n @ViewChild('listEl') listEl?: ElementRef<HTMLElement>;\n @Output() makeCallEv = new EventEmitter<{ dialOut: string; name?: string }>();\n contacts: ContactItem[] = [];\n groupedContacts: Array<{ label: string; items: ContactItem[] }> = [];\n selectedContact: ContactItem | null = null;\n searchTerm = '';\n isLoading = false;\n error = '';\n private searchToken = 0;\n private pageSize = 25;\n private nextFrom = 0;\n private searchAfter?: [string, string];\n private hasMore = true;\n isLoadingMore = false;\n\n constructor(private entitiesSearchService: EntitiesSearchService) {}\n\n ngOnInit(): void {\n this.resetAndLoad();\n }\n\n ngAfterViewInit(): void {\n this.ensureFill();\n }\n\n private resetAndLoad(): void {\n this.contacts = [];\n this.groupedContacts = [];\n this.pageSize = this.getPageSize();\n this.nextFrom = 0;\n this.searchAfter = undefined;\n this.hasMore = true;\n this.loadNextPage();\n }\n\n async loadNextPage(): Promise<void> {\n if (!this.tenantId || this.isLoading) {\n return;\n }\n if (!this.hasMore || this.isLoadingMore) {\n return;\n }\n this.isLoading = this.contacts.length === 0;\n this.isLoadingMore = this.contacts.length > 0;\n this.error = '';\n const results: ContactItem[] = [];\n\n try {\n const res: any = await this.entitiesSearchService.fetchContacts(\n this.tenantId,\n this.pageSize,\n this.searchAfter\n );\n const hits = res?.hits?.hits;\n const totalHits =\n typeof res?.hits?.total?.value === 'number'\n ? res.hits.total.value\n : null;\n if (!Array.isArray(hits) || hits.length === 0) {\n this.hasMore = false;\n } else {\n for (const hit of hits) {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter(\n (p: any) => typeof p === 'string' && p.trim()\n )\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n continue;\n }\n const name = (source.name || '').toString().trim() || 'Unknown';\n results.push({\n id: source.id || hit?._id || phone,\n name,\n phone,\n entity: source,\n });\n }\n const lastHit = hits[hits.length - 1];\n const lastSort = Array.isArray(lastHit?.sort) ? lastHit.sort : null;\n if (lastSort && lastSort.length >= 2) {\n this.searchAfter = [String(lastSort[0]), String(lastSort[1])];\n }\n this.nextFrom += hits.length;\n if (totalHits !== null) {\n this.hasMore = this.nextFrom < totalHits;\n } else {\n this.hasMore = hits.length >= this.pageSize;\n }\n }\n } catch (err) {\n console.error('Failed to load contacts', err);\n this.error = 'Failed to load contacts';\n this.hasMore = false;\n }\n\n if (results.length > 0) {\n this.contacts = [...this.contacts, ...results];\n }\n this.applySearch();\n this.isLoading = false;\n this.isLoadingMore = false;\n this.ensureFill();\n }\n\n onSearchChange(value: string): void {\n this.searchTerm = value;\n const term = this.searchTerm.trim();\n if (!term) {\n this.applySearch();\n return;\n }\n this.selectedContact = null;\n this.searchContacts(term);\n }\n\n private groupContacts(\n contacts: ContactItem[]\n ): Array<{ label: string; items: ContactItem[] }> {\n const sorted = [...contacts].sort((a, b) => {\n const aName = (a.name || '').toLowerCase();\n const bName = (b.name || '').toLowerCase();\n return aName.localeCompare(bName);\n });\n\n const groups: Array<{ label: string; items: ContactItem[] }> = [];\n let currentLabel = '';\n let currentGroup: { label: string; items: ContactItem[] } | null = null;\n\n for (const contact of sorted) {\n const label = this.getGroupLabel(contact.name);\n if (!currentGroup || label !== currentLabel) {\n currentLabel = label;\n currentGroup = { label, items: [] };\n groups.push(currentGroup);\n }\n currentGroup.items.push(contact);\n }\n\n return groups;\n }\n\n private applySearch(): void {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = term\n ? this.contacts.filter((contact) => {\n const name = (contact.name || '').toLowerCase();\n const phone = (contact.phone || '').toLowerCase();\n return name.includes(term) || phone.includes(term);\n })\n : this.contacts;\n this.groupedContacts = this.groupContacts(filtered);\n this.ensureFill();\n }\n\n openContact(contact: ContactItem): void {\n this.selectedContact = contact;\n }\n\n closeContact(): void {\n this.selectedContact = null;\n }\n\n onCallContact(contact: ContactItem, ev?: Event): void {\n if (ev) {\n ev.stopPropagation();\n }\n this.makeCallEv.emit({ dialOut: contact.phone, name: contact.name });\n }\n\n private async searchContacts(term: string): Promise<void> {\n if (!this.tenantId) {\n return;\n }\n const token = ++this.searchToken;\n try {\n const res: any = await this.entitiesSearchService.searchEntities(\n this.tenantId,\n term,\n 25,\n 0\n );\n if (token !== this.searchToken) {\n return;\n }\n const hits = res?.hits?.hits;\n const results: ContactItem[] = [];\n if (Array.isArray(hits)) {\n for (const hit of hits) {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter(\n (p: any) => typeof p === 'string' && p.trim()\n )\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n continue;\n }\n const name = (source.name || '').toString().trim() || 'Unknown';\n results.push({\n id: source.id || hit?._id || phone,\n name,\n phone,\n entity: source,\n });\n }\n }\n this.groupedContacts = this.groupContacts(results);\n } catch (err) {\n console.error('Failed to search contacts', err);\n this.error = 'Failed to search contacts';\n }\n }\n\n onListScroll(event: Event): void {\n if (this.searchTerm.trim()) {\n return;\n }\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n const threshold = 60;\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining <= threshold) {\n this.loadNextPage();\n }\n }\n\n private ensureFill(): void {\n if (this.searchTerm.trim()) {\n return;\n }\n if (!this.listEl || this.isLoading || this.isLoadingMore || !this.hasMore) {\n return;\n }\n setTimeout(() => {\n const el = this.listEl?.nativeElement;\n if (!el || this.isLoading || this.isLoadingMore || !this.hasMore) {\n return;\n }\n if (el.scrollHeight <= el.clientHeight + 4) {\n this.loadNextPage();\n }\n }, 0);\n }\n\n private getGroupLabel(name: string): string {\n const letter = (name || '').trim().charAt(0).toUpperCase();\n return letter >= 'A' && letter <= 'Z' ? letter : '#';\n }\n\n private getPageSize(): number {\n const viewport = typeof window !== 'undefined' ? window.innerHeight : 800;\n const available = Math.max(280, viewport - 260);\n const rowHeight = 64;\n const rows = Math.ceil(available / rowHeight);\n return Math.max(10, rows);\n }\n\n}\n","<div class=\"contacts-panel\">\n @if (!selectedContact) {\n <div class=\"contacts-search\">\n <span class=\"contacts-search-icon\">🔍</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"contacts-state error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"contact-details\">\n <div class=\"contact-details-actions\">\n <button type=\"button\" class=\"contact-back\" (click)=\"closeContact()\">← Back</button>\n <button type=\"button\" class=\"contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"contacts-load-more\">\n <div class=\"contacts-spinner\" aria-hidden=\"true\"></div>\n </div>\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n} from '@angular/core';\n\n@Component({\n selector: 'app-settings',\n templateUrl: './settings.component.html',\n styleUrls: ['./settings.component.css'],\n standalone: false,\n})\nexport class SettingsComponent implements OnInit, OnDestroy {\n @Input() selectedAudioInputId?: string;\n @Input() selectedAudioOutputId?: string;\n @Input() extensionId?: string;\n @Input() darkMode = false;\n\n @Output() change = new EventEmitter<{\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }>();\n @Output() darkModeChange = new EventEmitter<boolean>();\n @Output() logout = new EventEmitter<void>();\n\n audioInputs: MediaDeviceInfo[] = [];\n audioOutputs: MediaDeviceInfo[] = [];\n\n ngOnInit(): void {\n if (navigator?.mediaDevices) {\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n this.handleDeviceChange\n );\n this.refreshDeviceList();\n } else {\n console.warn('MediaDevices API not supported');\n }\n }\n\n onLogout(): void {\n this.logout.emit();\n }\n\n onToggleDarkMode(): void {\n this.darkMode = !this.darkMode;\n this.darkModeChange.emit(this.darkMode);\n }\n\n ngOnDestroy(): void {\n navigator.mediaDevices.removeEventListener(\n 'devicechange',\n this.handleDeviceChange\n );\n }\n\n private handleDeviceChange = async (): Promise<void> => {\n await this.refreshDeviceList();\n };\n\n private async refreshDeviceList(): Promise<void> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n this.audioInputs = devices.filter((d) => d.kind === 'audioinput');\n this.audioOutputs = devices.filter((d) => d.kind === 'audiooutput');\n\n // Fallback to first device if previous selection is no longer available\n if (\n !this.audioInputs.some((d) => d.deviceId === this.selectedAudioInputId)\n ) {\n this.selectedAudioInputId = this.audioInputs[0]?.deviceId ?? '';\n }\n\n if (\n !this.audioOutputs.some((d) => d.deviceId === this.selectedAudioOutputId)\n ) {\n this.selectedAudioOutputId = this.audioOutputs[0]?.deviceId ?? '';\n }\n\n this.emitDeviceChange();\n }\n\n onMicChange(deviceId: string | undefined): void {\n this.selectedAudioInputId = deviceId;\n this.emitDeviceChange();\n }\n\n onSpeakerChange(deviceId: string | undefined): void {\n this.selectedAudioOutputId = deviceId;\n this.emitDeviceChange();\n }\n\n private emitDeviceChange(): void {\n this.change.emit({\n audioInputId: this.selectedAudioInputId ?? '',\n audioOutputId: this.selectedAudioOutputId ?? '',\n videoInputId: undefined,\n });\n }\n\n trackByDeviceId(index: number, device: MediaDeviceInfo): string {\n return device.deviceId;\n }\n}\n","<div class=\"settings-wrapper\">\n <div class=\"settings-card\">\n <div class=\"settings-header\">\n <div>\n <div class=\"settings-title\">Account</div>\n <div class=\"settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Audio Devices</div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Microphone</div>\n <div class=\"device-subtitle\">Choose your input device</div>\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || ('Microphone ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Speakers</div>\n <div class=\"device-subtitle\">Choose your output device</div>\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || ('Speaker ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Appearance</div>\n <button type=\"button\" class=\"theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"theme-label\">Dark Mode</span>\n <span class=\"theme-pill\" [class.is-on]=\"darkMode\">\n <span class=\"theme-knob\"></span>\n </span>\n </button>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Component({\n selector: 'app-avaya-ipo-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.css'],\n standalone: false,\n})\nexport class AvayaIpoLoginComponent {\n @Input() loginForm!: FormGroup;\n @Input() showLoginLoader = false;\n @Input() hasAvayaSocketError = false;\n @Input() hasAvayaLoginError = false;\n @Input() hasAvayaLoginFailedGeneral = false;\n @Input() hasAvayaLoginConflictError = false;\n @Input() hasAvayaDeviceError = false;\n\n @Output() login = new EventEmitter<void>();\n\n showLoginPassword = false;\n\n onLoginClick(): void {\n this.login.emit();\n }\n\n restrictNumeric(evt: KeyboardEvent): boolean {\n const allowedKeys = [\n 'Enter',\n 'Backspace',\n 'ArrowLeft',\n 'ArrowRight',\n 'Tab',\n 'Delete',\n ];\n const isDigit = /^[0-9]$/.test(evt.key);\n if (!isDigit && !allowedKeys.includes(evt.key)) {\n evt.preventDefault();\n return false;\n }\n return true;\n }\n}\n","<div class=\"login-background\">\n <div class=\"login-simple\">\n <div class=\"logo\">\n <div class=\"logo-img\"></div>\n <div class=\"logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"alert error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <button type=\"submit\" class=\"btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CallMetadata } from '../models/active-call.model';\nimport { APP_CONFIG } from '../config/app-config';\n\nexport interface RecordingSession {\n audioContext: AudioContext;\n recordingStream: MediaStreamAudioDestinationNode;\n recorder?: MediaRecorder | null;\n metadata: CallMetadata;\n stopping: boolean;\n chunkIndex: number;\n chunkTimer?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class RecordingManagerService {\n private sessions = new Map<string, RecordingSession>();\n\n private readonly MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';\n private readonly MIME_TYPE_FALLBACK = 'audio/webm';\n private readonly CHUNK_DURATION_MS = 3000;\n private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 200;\n\n private readonly CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;\n\n constructor(private http: HttpClient) {}\n\n startRecording(\n localMediaStream: MediaStream,\n remoteMediaStream: MediaStream,\n metadata: CallMetadata\n ): RecordingSession | undefined {\n this.stopRecording(metadata.callId);\n\n if (!localMediaStream || !remoteMediaStream) {\n console.warn(\n `[${metadata.callId}] Skipped start recording: missing remote or local stream`\n );\n return undefined;\n }\n\n const localTracks = localMediaStream.getAudioTracks();\n const remoteTracks = remoteMediaStream.getAudioTracks();\n console.debug(\n `[${metadata.callId}] Recording tracks`,\n `local=${localTracks.length}`,\n `remote=${remoteTracks.length}`\n );\n if (localTracks.length === 0 || remoteTracks.length === 0) {\n console.warn(\n `[${metadata.callId}] Skipped start recording: missing audio tracks`\n );\n return undefined;\n }\n\n const audioContext = new AudioContext();\n const recordingStream = audioContext.createMediaStreamDestination();\n\n audioContext\n .createMediaStreamSource(localMediaStream)\n .connect(recordingStream);\n audioContext\n .createMediaStreamSource(remoteMediaStream)\n .connect(recordingStream);\n\n const session: RecordingSession = {\n audioContext,\n recordingStream,\n metadata,\n stopping: false,\n chunkIndex: 0,\n recorder: null,\n chunkTimer: undefined,\n };\n\n this.sessions.set(metadata.callId, session);\n this.startNextChunk(session);\n return session;\n }\n\n getSession(callId: string): RecordingSession | undefined {\n return this.sessions.get(callId);\n }\n\n stopRecording(callId: string): void {\n const session = this.sessions.get(callId);\n if (!session) return;\n\n session.stopping = true;\n\n if (session.chunkTimer) {\n clearTimeout(session.chunkTimer);\n session.chunkTimer = undefined;\n }\n\n const rec = session.recorder;\n if (rec && rec.state === 'recording') {\n try {\n rec.stop();\n console.debug(`[${callId}] MediaRecorder stopped`);\n } catch {}\n }\n\n setTimeout(() => {\n if (session.audioContext.state !== 'closed') {\n session.audioContext.close();\n console.debug(`[${callId}] AudioContext closed`);\n }\n }, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);\n\n this.sessions.delete(callId);\n }\n\n private startNextChunk(session: RecordingSession): void {\n if (session.stopping) return;\n\n const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)\n ? this.MIME_TYPE_PREFERRED\n : this.MIME_TYPE_FALLBACK;\n\n const recorder = new MediaRecorder(session.recordingStream.stream, { mimeType });\n session.recorder = recorder;\n\n const myChunkIdx = session.chunkIndex++;\n\n recorder.ondataavailable = async (evt: BlobEvent) => {\n if (!evt.data || evt.data.size === 0) return;\n\n const filename = this.generateChunkFilename(session.metadata.callId, myChunkIdx);\n\n try {\n await this.uploadCallRecording(session.metadata, evt.data, filename);\n console.debug(`[${session.metadata.callId}] ✅ uploaded chunk -> ${filename}`);\n } catch (err) {\n console.error(`[${session.metadata.callId}] ❌ upload failed -> ${filename}`, err);\n }\n };\n\n recorder.onerror = (err) => {\n console.error(`[${session.metadata.callId}] MediaRecorder error:`, err);\n };\n\n recorder.onstop = () => {\n if (session.stopping) return;\n setTimeout(() => this.startNextChunk(session), 0);\n };\n\n recorder.start();\n console.debug(\n `[${session.metadata.callId}] MediaRecorder started for chunk #${myChunkIdx}`\n );\n\n session.chunkTimer = window.setTimeout(() => {\n if (!session.stopping && recorder.state === 'recording') {\n recorder.stop();\n console.debug(\n `[${session.metadata.callId}] MediaRecorder stopped for chunk #${myChunkIdx}`\n );\n }\n }, this.CHUNK_DURATION_MS) as unknown as number;\n }\n\n private async uploadCallRecording(\n metadata: RecordingSession['metadata'],\n file: Blob,\n filename?: string\n ): Promise<{ success: boolean; message: string; s3Key?: string }> {\n try {\n if (!filename) {\n filename = this.generateFilename(metadata.callId, metadata.agentId);\n }\n\n const base64 = await this.convertBlobToBase64(file);\n const body = base64.split(',')[1];\n\n const payload = {\n ...metadata,\n phoneNumber: this.normalizePhoneNumberForUpload(metadata.phoneNumber),\n filename,\n isBase64: true,\n body,\n };\n\n const url = `${this.CALL_HISTORY_API_URL}?action=uploadRecording`;\n const res: any = await lastValueFrom(\n this.http.post(url, payload, {\n headers: { 'Content-Type': 'application/json' },\n responseType: 'json',\n })\n );\n\n return {\n success: true,\n message: res?.message || 'Upload successful',\n s3Key: res?.s3Key,\n };\n } catch (err: any) {\n console.error(`[${metadata.callId}] Upload failed:`, err);\n return {\n success: false,\n message: err?.message || 'Upload failed',\n };\n }\n }\n\n private convertBlobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n private generateFilename(callId: string, agentId: string): string {\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '')\n .replace('T', '-')\n .slice(0, 15);\n return `${timestamp}-${agentId}-${callId}.webm`;\n }\n\n private generateChunkFilename(callId: string, chunkIndex: number): string {\n const now = new Date();\n const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');\n const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');\n const msStr = now.getMilliseconds().toString().padStart(3, '0');\n const part = String(chunkIndex).padStart(4, '0');\n return `${callId}-${dateStr}-${timeStr}${msStr}-part${part}.webm`;\n }\n\n private normalizePhoneNumberForUpload(value: string): string {\n let digits = (value ?? '').toString().replace(/\\D/g, '');\n if (digits.startsWith('00')) {\n digits = digits.slice(2);\n }\n if (digits.startsWith('0')) {\n digits = digits.slice(1);\n }\n if (digits.length === 10 && !digits.startsWith('91')) {\n digits = `91${digits}`;\n }\n return digits;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nimport { APP_CONFIG } from '../config/app-config';\n\ntype TranscriptMessage = {\n callId: string;\n text: string;\n isFinal: boolean;\n ts: number;\n speaker?: string;\n};\n\ntype StreamSession = {\n label: 'agent' | 'customer';\n ws: WebSocket;\n processor: ScriptProcessorNode;\n sourceNode: MediaStreamAudioSourceNode;\n closed: boolean;\n chunkTimer?: ReturnType<typeof setInterval>;\n pendingChunks: Uint8Array[];\n pendingBytes: number;\n lastChunkSentAt: number;\n noiseFloor: number;\n readyForBinary: boolean;\n allowSendBinary: boolean;\n muted: boolean;\n lastAudioSentAt: number;\n};\n\ntype TranscriptionSession = {\n callId: string;\n audioContext: AudioContext;\n zeroGain: GainNode;\n streams: StreamSession[];\n closed: boolean;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class TranscriptionStreamService implements OnDestroy {\n private session: TranscriptionSession | null = null;\n private transcriptSubject = new Subject<TranscriptMessage>();\n readonly transcript$ = this.transcriptSubject.asObservable();\n\n private readonly SAMPLE_RATE = 16000;\n private readonly BUFFER_SIZE = 1024;\n private readonly SILENCE_RMS_THRESHOLD = 0.002;\n private readonly VOICE_RMS_THRESHOLD = 0.006;\n private readonly NOISE_FLOOR_MULTIPLIER = 2.5;\n private readonly NOISE_FLOOR_SMOOTHING = 0.05;\n private readonly CHUNK_INTERVAL_MS = 50;\n private readonly CUSTOM_WS_URL = APP_CONFIG.TRANSCRIPTION_WS_URL;\n private readonly CUSTOM_WS_MIME_TYPE = APP_CONFIG.TRANSCRIPTION_WS_MIME_TYPE;\n private readonly LANGUAGE_CODE = APP_CONFIG.TRANSCRIPTION_LANGUAGE_CODE;\n private readonly ALT_LANGUAGE_CODES = APP_CONFIG.TRANSCRIPTION_ALT_LANGUAGE_CODES;\n private readonly TRANSCRIPTION_MODEL = APP_CONFIG.TRANSCRIPTION_MODEL;\n\n constructor() {}\n\n ngOnDestroy(): void {\n if (this.session) {\n this.stopSession(this.session.callId);\n }\n this.transcriptSubject.complete();\n }\n\n async startSession(\n callId: string,\n localStream: MediaStream,\n remoteStream: MediaStream,\n allowSendBinary = false\n ): Promise<void> {\n if (!callId || !localStream || !remoteStream) {\n throw new Error('Missing call or media stream for transcription');\n }\n if (this.session?.callId === callId) {\n return;\n }\n if (this.session) {\n this.stopSession(this.session.callId);\n }\n\n const customUrl =\n typeof this.CUSTOM_WS_URL === 'string' ? this.CUSTOM_WS_URL.trim() : '';\n if (!customUrl) {\n throw new Error('TRANSCRIPTION_WS_URL is not configured');\n }\n const audioContext = new AudioContext({ sampleRate: this.SAMPLE_RATE });\n const zeroGain = audioContext.createGain();\n zeroGain.gain.value = 0;\n\n zeroGain.connect(audioContext.destination);\n\n const session: TranscriptionSession = {\n callId,\n audioContext,\n zeroGain,\n streams: [],\n closed: false,\n };\n\n this.session = session;\n\n const localSource = audioContext.createMediaStreamSource(localStream);\n const remoteSource = audioContext.createMediaStreamSource(remoteStream);\n session.streams.push(\n this.createStreamSession({\n callId,\n label: 'agent',\n sourceNode: localSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n }),\n this.createStreamSession({\n callId,\n label: 'customer',\n sourceNode: remoteSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n })\n );\n }\n\n stopSession(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n const session = this.session;\n session.closed = true;\n try {\n session.zeroGain.disconnect();\n } catch {}\n for (const stream of session.streams) {\n stream.closed = true;\n try {\n stream.processor.disconnect();\n stream.sourceNode.disconnect();\n } catch {}\n if (stream.chunkTimer) {\n clearInterval(stream.chunkTimer);\n stream.chunkTimer = undefined;\n }\n try {\n if (stream.ws.readyState === WebSocket.OPEN) {\n this.flushPendingAudio(stream);\n stream.ws.send(JSON.stringify({ type: 'end', source: stream.label }));\n stream.ws.close();\n }\n } catch {}\n }\n try {\n session.audioContext.close();\n } catch {}\n this.session = null;\n }\n\n enableBinary(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n stream.allowSendBinary = true;\n }\n }\n\n setStreamMuted(callId: string, label: 'agent' | 'customer', muted: boolean): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n if (stream.label === label) {\n stream.muted = muted;\n }\n }\n }\n\n private mixToMono(buffer: AudioBuffer): Float32Array {\n const channels = buffer.numberOfChannels;\n if (channels === 1) {\n return buffer.getChannelData(0);\n }\n const length = buffer.length;\n const output = new Float32Array(length);\n for (let c = 0; c < channels; c++) {\n const data = buffer.getChannelData(c);\n for (let i = 0; i < length; i++) {\n output[i] += data[i];\n }\n }\n for (let i = 0; i < length; i++) {\n output[i] = output[i] / channels;\n }\n return output;\n }\n\n private calculateRms(samples: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i];\n sum += value * value;\n }\n return Math.sqrt(sum / samples.length);\n }\n\n private encodePcm16(input: Float32Array, sourceRate: number): Uint8Array {\n const resampled =\n sourceRate === this.SAMPLE_RATE\n ? input\n : this.downsampleBuffer(input, sourceRate, this.SAMPLE_RATE);\n if (!resampled || resampled.length === 0) {\n return new Uint8Array();\n }\n const buffer = new ArrayBuffer(resampled.length * 2);\n const view = new DataView(buffer);\n for (let i = 0; i < resampled.length; i++) {\n let s = Math.max(-1, Math.min(1, resampled[i]));\n s = s < 0 ? s * 0x8000 : s * 0x7fff;\n view.setInt16(i * 2, s, true);\n }\n return new Uint8Array(buffer);\n }\n\n private downsampleBuffer(\n input: Float32Array,\n sourceRate: number,\n targetRate: number\n ): Float32Array {\n const ratio = sourceRate / targetRate;\n const length = Math.round(input.length / ratio);\n const output = new Float32Array(length);\n let offset = 0;\n for (let i = 0; i < length; i++) {\n const nextOffset = Math.round((i + 1) * ratio);\n let sum = 0;\n let count = 0;\n for (let j = offset; j < nextOffset && j < input.length; j++) {\n sum += input[j];\n count++;\n }\n output[i] = count ? sum / count : 0;\n offset = nextOffset;\n }\n return output;\n }\n\n private queueAudio(stream: StreamSession, chunk: Uint8Array): void {\n stream.pendingChunks.push(chunk);\n stream.pendingBytes += chunk.byteLength;\n this.flushPendingAudio(stream);\n }\n\n private flushPendingAudio(stream: StreamSession): void {\n if (stream.pendingBytes === 0 || stream.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const merged = this.mergeChunks(stream.pendingChunks, stream.pendingBytes);\n stream.pendingChunks = [];\n stream.pendingBytes = 0;\n stream.ws.send(merged);\n stream.lastAudioSentAt = Date.now();\n stream.lastChunkSentAt = stream.lastAudioSentAt;\n }\n\n private mergeChunks(chunks: Uint8Array[], totalBytes: number): Uint8Array {\n if (chunks.length === 1) {\n return chunks[0];\n }\n const out = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return out;\n }\n\n private handleTranscriptPayload(callId: string, text: string): void {\n if (!text) return;\n try {\n const data = JSON.parse(text);\n if (typeof data?.text === 'string') {\n this.transcriptSubject.next({\n callId,\n text: data.text,\n isFinal: Boolean(data?.isFinal ?? data?.final ?? true),\n ts: typeof data?.ts === 'number' ? data.ts : Date.now(),\n speaker: data?.speaker || data?.source,\n });\n return;\n }\n if (typeof data?.transcript === 'string') {\n const ts = typeof data?.ts === 'number' ? data.ts : Date.now();\n const isFinal = Boolean(data?.isFinal ?? data?.final ?? true);\n const lines = data.transcript\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .filter(Boolean);\n if (lines.length > 1) {\n for (const line of lines) {\n const parsed = this.parseSpeakerLine(line);\n this.transcriptSubject.next({\n callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n } else {\n const parsed = this.parseSpeakerLine(data.transcript.trim());\n this.transcriptSubject.next({\n callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n return;\n }\n const results = data?.Transcript?.Results || data?.results;\n if (!Array.isArray(results)) return;\n for (const result of results) {\n const transcript =\n result?.Alternatives?.[0]?.Transcript ||\n result?.alternatives?.[0]?.transcript;\n if (!transcript) continue;\n this.transcriptSubject.next({\n callId,\n text: transcript,\n isFinal: !(result.IsPartial ?? result.isPartial),\n ts: Date.now(),\n });\n }\n } catch (err) {\n this.transcriptSubject.next({\n callId,\n text,\n isFinal: true,\n ts: Date.now(),\n });\n }\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n private createStreamSession(opts: {\n callId: string;\n label: 'agent' | 'customer';\n sourceNode: MediaStreamAudioSourceNode;\n audioContext: AudioContext;\n zeroGain: GainNode;\n url: string;\n allowSendBinary: boolean;\n }): StreamSession {\n const ws = new WebSocket(opts.url);\n ws.binaryType = 'arraybuffer';\n console.debug('[Transcription] Opening WebSocket', {\n url: ws.url,\n source: opts.label,\n });\n\n const processor = opts.audioContext.createScriptProcessor(\n this.BUFFER_SIZE,\n 1,\n 1\n );\n opts.sourceNode.connect(processor);\n processor.connect(opts.zeroGain);\n\n const stream: StreamSession = {\n label: opts.label,\n ws,\n processor,\n sourceNode: opts.sourceNode,\n closed: false,\n pendingChunks: [],\n pendingBytes: 0,\n lastChunkSentAt: Date.now(),\n noiseFloor: this.SILENCE_RMS_THRESHOLD,\n readyForBinary: false,\n allowSendBinary: opts.allowSendBinary,\n muted: false,\n lastAudioSentAt: Date.now(),\n };\n\n ws.onopen = () => {\n opts.audioContext.resume().catch(() => {});\n const payload = {\n type: 'start',\n mimeType:\n this.CUSTOM_WS_MIME_TYPE || 'audio/pcm;rate=16000;encoding=s16le',\n sampleRate: this.SAMPLE_RATE,\n encoding: 's16le',\n channels: 1,\n callId: opts.callId,\n source: opts.label,\n languageCode: this.LANGUAGE_CODE,\n alternativeLanguageCodes: this.ALT_LANGUAGE_CODES,\n model: this.TRANSCRIPTION_MODEL,\n };\n ws.send(JSON.stringify(payload));\n stream.readyForBinary = false;\n console.debug('[Transcription] WebSocket open', { source: opts.label });\n processor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (stream.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n if (stream.muted && opts.label === 'agent') {\n return;\n }\n const input = this.mixToMono(event.inputBuffer);\n if (!input || input.length === 0) {\n return;\n }\n const rms = this.calculateRms(input);\n if (rms < this.SILENCE_RMS_THRESHOLD) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n return;\n }\n const adaptiveThreshold = Math.max(\n this.VOICE_RMS_THRESHOLD,\n stream.noiseFloor * this.NOISE_FLOOR_MULTIPLIER\n );\n if (rms < adaptiveThreshold) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n return;\n }\n const pcmBytes = this.encodePcm16(\n input,\n opts.audioContext.sampleRate\n );\n if (pcmBytes.byteLength === 0) {\n return;\n }\n if (!stream.readyForBinary || !stream.allowSendBinary) {\n return;\n }\n this.queueAudio(stream, pcmBytes);\n };\n };\n\n ws.onerror = (err) => {\n console.error('[Transcription] WebSocket error', {\n readyState: ws.readyState,\n url: ws.url,\n error: err,\n source: opts.label,\n });\n };\n\n ws.onmessage = (evt) => {\n if (!evt?.data) return;\n if (typeof evt.data === 'string') {\n try {\n const maybeAck = JSON.parse(evt.data);\n if (\n maybeAck &&\n maybeAck.type === 'ack' &&\n maybeAck.message === 'stream-started'\n ) {\n stream.readyForBinary = true;\n return;\n }\n } catch {\n // ignore parse failures; handled below\n }\n this.handleTranscriptPayload(opts.callId, evt.data);\n return;\n }\n if (evt.data instanceof Blob) {\n evt.data.text().then((text) => this.handleTranscriptPayload(opts.callId, text));\n }\n };\n\n ws.onclose = (evt) => {\n console.warn('[Transcription] WebSocket closed', {\n code: evt?.code,\n reason: evt?.reason,\n wasClean: evt?.wasClean,\n source: opts.label,\n });\n this.stopSession(opts.callId);\n };\n\n stream.chunkTimer = setInterval(() => {\n if (stream.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n if (stream.readyForBinary && stream.allowSendBinary) {\n this.flushPendingAudio(stream);\n }\n }, this.CHUNK_INTERVAL_MS);\n\n return stream;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { CountryISO, SearchCountryField } from 'ngx-intl-tel-input';\n\n@Component({\n selector: 'app-phone-idle',\n templateUrl: './phone-idle.component.html',\n styleUrls: ['./phone-idle.component.css'],\n standalone: false,\n})\nexport class PhoneIdleComponent {\n @Input() dialForm!: FormGroup;\n @Input() contacts: any[] = [];\n @Input() showDirectoryPhonebook = false;\n @Input() isRinging = false;\n @Input() CountryISO = CountryISO;\n @Input() SearchCountryField = SearchCountryField;\n\n @Output() toggleDirectory = new EventEmitter<void>();\n @Output() clear = new EventEmitter<void>();\n @Output() makeCall = new EventEmitter<void>();\n @Output() keypadInput = new EventEmitter<string>();\n @Output() keyboardInput = new EventEmitter<KeyboardEvent>();\n\n getContactBadge(contact: any): string {\n const base = contact?.name || contact?.phone || '--';\n return base.toString().slice(0, 2).toUpperCase();\n }\n\n onToggleDirectory(): void {\n this.toggleDirectory.emit();\n }\n onClear(): void {\n this.clear.emit();\n }\n onMakeCall(): void {\n this.makeCall.emit();\n }\n onKeypadInput(d: string): void {\n this.keypadInput.emit(d);\n }\n onKeyboardInput(ev: KeyboardEvent): void {\n this.keyboardInput.emit(ev);\n }\n}\n","<form class=\"phone-shell classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"input-row classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"clear-btn\" (click)=\"onClear()\">⌫</button>\n </div>\n\n <div class=\"keypad classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"digit\">1</span>\n <span class=\"letters\">&nbsp;</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"digit\">2</span>\n <span class=\"letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"digit\">3</span>\n <span class=\"letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"digit\">4</span>\n <span class=\"letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"digit\">5</span>\n <span class=\"letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"digit\">6</span>\n <span class=\"letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"digit\">7</span>\n <span class=\"letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"digit\">8</span>\n <span class=\"letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"digit\">9</span>\n <span class=\"letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"digit\">*</span>\n <span class=\"letters\">&nbsp;</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"digit\">0</span>\n <span class=\"letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"digit\">#</span>\n <span class=\"letters\">&nbsp;</span>\n </button>\n </div>\n\n <div class=\"actions\">\n <button type=\"submit\" class=\"call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n</form>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { assetUrl } from '../../../config/app-config';\n\n@Component({\n selector: 'app-phone-incoming',\n templateUrl: './phone-incoming.component.html',\n styleUrls: ['./phone-incoming.component.css'],\n standalone: false,\n})\nexport class PhoneIncomingComponent {\n incomingAvatarUrl = assetUrl('assets/images/incomingCall_avatar.gif');\n @Input() incomingCallName?: string;\n @Input() incomingNameResolved = false;\n @Input() incomingCallNumber: string | undefined;\n @Output() accept = new EventEmitter<void>();\n @Output() decline = new EventEmitter<void>();\n}\n","<div class=\"incoming-screen\">\n <div class=\"incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n &nbsp;\n }\n </div>\n <div class=\"incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming-status\">CALLING...</div>\n\n <div class=\"incoming-actions\">\n <button type=\"button\" class=\"incoming-btn accept\" (click)=\"accept.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"incoming-btn decline\" (click)=\"decline.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { assetUrl } from '../../../config/app-config';\nimport { EntitiesSearchService } from '../../../services/entities-search.service';\n\n@Component({\n selector: 'app-phone-active',\n templateUrl: './phone-active.component.html',\n styleUrls: ['./phone-active.component.css'],\n standalone: false,\n})\nexport class PhoneActiveComponent implements OnInit {\n @Input() tenantId?: string;\n activeAvatarUrl = assetUrl('assets/images/incomingCall_avatar.gif');\n @Input() activeCallName?: string;\n @Input() activeCallNumber: string | null = null;\n @Input() activeCallDuration = 0;\n @Input() callStatusText = '';\n @Input() isConnecting = false;\n @Input() isMuted = false;\n @Input() isHeld = false;\n @Output() endCall = new EventEmitter<void>();\n @Output() toggleMute = new EventEmitter<void>();\n @Output() toggleHold = new EventEmitter<void>();\n @Output() transfer = new EventEmitter<void>();\n @Output() openContacts = new EventEmitter<void>();\n @Output() openKeypad = new EventEmitter<void>();\n @Output() startTranscription = new EventEmitter<void>();\n @Output() contactsLoaded = new EventEmitter<any[]>();\n\n private isLoadingContacts = false;\n\n constructor(private entitiesSearchService: EntitiesSearchService) {}\n\n ngOnInit(): void {\n this.fetchContacts();\n }\n\n async fetchContacts(): Promise<void> {\n if (!this.tenantId || this.isLoadingContacts) {\n return;\n }\n this.isLoadingContacts = true;\n const size = 50;\n let searchAfter: [string, string] | undefined;\n let allContacts: any[] = [];\n\n while (true) {\n try {\n const res_searchEntities: any =\n await this.entitiesSearchService.fetchContacts(\n this.tenantId,\n size,\n searchAfter\n );\n const hits = res_searchEntities?.hits?.hits;\n\n if (!Array.isArray(hits) || hits.length === 0) {\n break;\n }\n\n const mapped = hits.map((hit: any) => {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter((p: any) => typeof p === 'string' && p.trim())\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n return null;\n }\n return {\n ...source,\n id: source.id || hit?._id,\n phone,\n };\n }).filter(Boolean);\n allContacts = [...allContacts, ...mapped];\n if (hits.length < size) {\n break;\n }\n const lastHit = hits[hits.length - 1];\n const lastSort = Array.isArray(lastHit?.sort) ? lastHit.sort : null;\n if (lastSort && lastSort.length >= 2) {\n searchAfter = [String(lastSort[0]), String(lastSort[1])];\n } else {\n break;\n }\n } catch (error) {\n console.error('Error fetching contacts:', error);\n break;\n }\n }\n\n this.contactsLoaded.emit(allContacts);\n this.isLoadingContacts = false;\n }\n\n formatDuration(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(\n 2,\n '0'\n )}`;\n }\n}\n","<div class=\"active-screen\">\n <div class=\"active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"active-duration\" [class.is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"active-controls\">\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Add Call</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transfer</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"control-label\">Keypad</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"active-bottom\">\n <button type=\"button\" class=\"end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n","import { Component, ElementRef, OnDestroy, OnInit, AfterViewInit, OnChanges, SimpleChanges, ViewChild } from '@angular/core';\nimport { ChangeDetectorRef, EventEmitter, Input, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\nimport { CountryISO, SearchCountryField } from 'ngx-intl-tel-input';\nimport { AvayaIPOService, CallState } from '../../services/avaya-ipo.service';\nimport { PhoneNumberUtil, PhoneNumberFormat } from 'google-libphonenumber';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { APP_CONFIG, assetUrl, formatDialOutNumber } from '../../config/app-config';\nimport { RecordingManagerService } from '../../services/recording-manager.service';\nimport { TranscriptionStreamService } from '../../services/transcription-stream.service';\n\n@Component({\n selector: 'app-phone',\n templateUrl: './phone.component.html',\n styleUrls: ['./phone.component.css'],\n standalone: false,\n})\nexport class PhoneComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n @Input() contacts: any[] = [];\n @Input() tenantId?: string;\n @Input() agentId?: string;\n @Output() callScreenChange = new EventEmitter<boolean>();\n private _isActiveCall = false;\n @Input()\n set isActiveCall(value: boolean) {\n this._isActiveCall = value;\n this.emitCallScreenState();\n }\n get isActiveCall(): boolean {\n return this._isActiveCall;\n }\n @Input() activeCallNumber: string | null = null;\n @Input() incomingCallName?: string | null;\n @Input() incomingNameResolved = false;\n @Input() activeCallName?: string | null;\n @Input() serverIp?: string;\n @Input() serverPort?: number;\n @Input() stunIp?: string;\n @Input() stunPort?: number;\n @Input() turnIp?: string;\n @Input() turnPort?: number;\n @Input() configurationMode?: string;\n @Output() makeCallEv = new EventEmitter<string>();\n @Output() endCallEv = new EventEmitter<void>();\n @ViewChild('audioElement') audioElement: any;\n private callStateSub?: any;\n private endToneTimeout?: ReturnType<typeof setTimeout>;\n private suppressHangupToneOnce = false;\n private transferStatusSub?: any;\n private remoteStreamSub?: any;\n private callTerminateSub?: any;\n private outgoingDialSub?: any;\n private transcriptionSub?: any;\n private lastRemoteStream: MediaStream | null = null;\n private lastLocalStream: MediaStream | null = null;\n private currentCallId: string | null = null;\n private pendingOutgoing = false;\n private transcriptionActiveCallId: string | null = null;\n private pendingTranscriptionCallId: string | null = null;\n private pendingTranscriptionAllowBinary = false;\n private lastPartialIndex: Record<string, number> = {};\n private pendingIncomingCall = false;\n\n dialForm!: FormGroup;\n directoryForm!: FormGroup;\n showDirectoryPhonebook = false;\n isTransferMode = false;\n isAddCallMode = false;\n directoryTab: 'contacts' | 'dialpad' = 'contacts';\n directoryNumber = '';\n contactSearch = '';\n directoryDigits = [\n { digit: '1', letters: '' },\n { digit: '2', letters: 'ABC' },\n { digit: '3', letters: 'DEF' },\n { digit: '4', letters: 'GHI' },\n { digit: '5', letters: 'JKL' },\n { digit: '6', letters: 'MNO' },\n { digit: '7', letters: 'PQRS' },\n { digit: '8', letters: 'TUV' },\n { digit: '9', letters: 'WXYZ' },\n { digit: '*', letters: '' },\n { digit: '0', letters: '+' },\n { digit: '#', letters: '' },\n ];\n incomingCallSubscription: any;\n incomingCallNumber: string | undefined;\n isMuted = false;\n isHeld = false;\n activeCallDuration = 0;\n callStatusText = '';\n transferError = '';\n transferSuccess = '';\n transferPending = false;\n private transferErrorTimeout?: ReturnType<typeof setTimeout>;\n private activeCallTimer?: ReturnType<typeof setInterval>;\n private muteToggleInProgress = false;\n private holdToggleInProgress = false;\n isKeypadOpen = false;\n isTranscriptionOpen = false;\n transcriptText = '';\n transcriptSegments: Array<{ ts: number; text: string; speaker?: string }> = [];\n private transcriptStartedAt = 0;\n private transcriptEndedAt = 0;\n autoDownloadSummaryOnEnd = false;\n summaryText = '';\n dtmfBuffer = '';\n private phoneUtil = PhoneNumberUtil.getInstance();\n\n CountryISO = CountryISO;\n SearchCountryField = SearchCountryField;\n isRinging = false;\n audio: any;\n get isConnecting(): boolean {\n return this.callStatusText === 'Calling...';\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private formBuilder: FormBuilder,\n private avayaIpoService: AvayaIPOService,\n private authenticationService: AuthenticationService,\n private recordingManagerService: RecordingManagerService,\n private transcriptionStreamService: TranscriptionStreamService\n ) {\n this.dialForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n this.directoryForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n }\n\n ngOnInit(): void {\n window.addEventListener('keydown', this.handleKeyboardInput);\n this.emitCallScreenState();\n\n const lastIncoming = this.avayaIpoService.getLastIncomingCall();\n if (lastIncoming) {\n this.handleIncomingCall(lastIncoming);\n }\n\n this.incomingCallSubscription =\n this.avayaIpoService.incomingCallSubject.subscribe((data) => {\n this.handleIncomingCall(data);\n });\n\n this.outgoingDialSub = this.avayaIpoService.outgoingDialSubject.subscribe(\n (payload) => {\n if (!payload?.dialed || this.isRinging) {\n return;\n }\n this.callStatusText = 'Calling...';\n this._isActiveCall = true;\n this.pendingOutgoing = true;\n this.currentCallId = null;\n this.stopCallTimer();\n this.startCallTimer(true);\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n );\n\n this.transcriptionSub =\n this.transcriptionStreamService.transcript$.subscribe((evt) => {\n if (!evt || !evt.text) {\n return;\n }\n if (\n this.transcriptionActiveCallId &&\n evt.callId !== this.transcriptionActiveCallId\n ) {\n return;\n }\n this.applyTranscriptUpdate(evt.text, evt.isFinal, evt.ts, evt.speaker);\n });\n\n this.callStateSub = this.avayaIpoService.callStateSubject.subscribe(\n (evt) => {\n if (!evt?.state) {\n return;\n }\n if (\n evt.callId &&\n (evt.state === CallState.PROGRESSING ||\n evt.state === CallState.RINGING ||\n evt.state === CallState.CONNECTED ||\n evt.state === CallState.HELD)\n ) {\n if (!this.currentCallId || this.pendingOutgoing) {\n this.currentCallId = evt.callId;\n this.pendingOutgoing = false;\n }\n }\n if (evt.state === CallState.CONNECTED) {\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = true;\n if (evt.callId) {\n this.currentCallId = evt.callId;\n }\n this.pendingOutgoing = false;\n this.callStatusText = '';\n this.startCallTimer(false);\n this.avayaIpoService.clearLastIncomingCall();\n console.debug('[Phone] Call connected, starting recording', evt.callId);\n this.startRecordingForCall(evt.callId);\n if (evt.callId) {\n this.startTranscriptionForCall(evt.callId, true);\n }\n this.emitCallScreenState();\n }\n if (evt.state === CallState.INCOMING || evt.state === CallState.RINGING) {\n if (evt.callId) {\n this.startTranscriptionForCall(evt.callId, false);\n }\n // Ring tone is handled by AvayaIPOService.\n }\n if (evt.state === CallState.DISCONNECTED || evt.state === CallState.FAILED) {\n if (evt.callId && this.currentCallId && evt.callId !== this.currentCallId) {\n return;\n }\n if (evt.callId) {\n this.recordingManagerService.stopRecording(evt.callId);\n }\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n }\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = false;\n this.isMuted = false;\n this.isHeld = false;\n this.isKeypadOpen = false;\n this.isTranscriptionOpen = false;\n this.stopTranscription(evt.callId);\n this.dtmfBuffer = '';\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.directoryForm.reset();\n this.stopCallTimer();\n this.callStatusText = 'Disconnected';\n this.incomingCallNumber = undefined;\n this.currentCallId = null;\n this.pendingOutgoing = false;\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.emitCallScreenState();\n if (this.suppressHangupToneOnce) {\n this.suppressHangupToneOnce = false;\n this.finishDisconnectWithoutTone();\n } else {\n this.playHangupToneAndThenIdle();\n }\n }\n if (evt.state === CallState.HELD) {\n if (evt.callId) {\n this.recordingManagerService.stopRecording(evt.callId);\n }\n }\n }\n );\n\n this.transferStatusSub = this.avayaIpoService.transferStatusSubject.subscribe(\n (status) => {\n if (status?.success) {\n this.transferError = '';\n this.transferSuccess = 'Transfer successful';\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n this.transferErrorTimeout = undefined;\n }\n if (this.transferPending) {\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.directoryForm.reset();\n }\n this.transferErrorTimeout = setTimeout(() => {\n this.transferSuccess = '';\n this.cdr.detectChanges();\n }, 2000);\n } else {\n this.transferSuccess = '';\n this.transferError = status?.message || 'Failed to transfer';\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n }\n this.transferErrorTimeout = setTimeout(() => {\n this.transferError = '';\n this.cdr.detectChanges();\n }, 2500);\n }\n this.transferPending = false;\n this.cdr.detectChanges();\n }\n );\n\n this.remoteStreamSub = this.avayaIpoService.remoteStream$.subscribe((r) => {\n if (r?.stream?.getAudioTracks?.().length) {\n this.lastRemoteStream = r.stream;\n this.lastLocalStream = this.avayaIpoService.localStream;\n if (this.pendingTranscriptionCallId) {\n this.startTranscriptionForCall(\n this.pendingTranscriptionCallId,\n this.pendingTranscriptionAllowBinary\n );\n }\n }\n });\n\n this.callTerminateSub = this.avayaIpoService.callTerminateSubject.subscribe(\n (evt) => {\n if (evt?.callId && this.currentCallId && evt.callId !== this.currentCallId) {\n return;\n }\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n }\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = false;\n this.incomingCallNumber = undefined;\n this.currentCallId = null;\n this.pendingOutgoing = false;\n this.isTranscriptionOpen = false;\n this.stopTranscription(evt?.callId);\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['incomingNameResolved'] && this.pendingIncomingCall) {\n if (this.incomingNameResolved) {\n this.isRinging = true;\n this.pendingIncomingCall = false;\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n }\n }\n\n ngAfterViewInit(): void {\n this.audio = this.audioElement?.nativeElement;\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('keydown', this.handleKeyboardInput);\n this.callStateSub?.unsubscribe?.();\n this.transferStatusSub?.unsubscribe?.();\n this.remoteStreamSub?.unsubscribe?.();\n this.callTerminateSub?.unsubscribe?.();\n this.outgoingDialSub?.unsubscribe?.();\n this.transcriptionSub?.unsubscribe?.();\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n }\n this.stopCallTimer();\n this.stopTranscription();\n }\n\n makeCall(): void {\n if (this.dialForm.invalid) {\n console.warn('Dial form is invalid:', this.dialForm.value);\n return;\n }\n\n const phone = this.dialForm.value.phoneNumber;\n const e164 = this.formatE164(\n phone?.internationalNumber || phone?.number || phone\n );\n if (!e164) {\n console.warn('Invalid phone number for dial:', phone);\n return;\n }\n const dialOut = this.formatDialOut(e164);\n this.callStatusText = 'Calling...';\n this.isRinging = false;\n this._isActiveCall = true;\n this.emitCallScreenState();\n this.makeCallEv.emit(dialOut);\n this.dialForm.reset();\n this.showDirectoryPhonebook = false;\n }\n\n onClear(): void {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n if (!current) return control?.reset();\n\n const updated = current.slice(0, -1);\n updated ? this.updatePhoneControl(updated) : control?.reset();\n }\n\n handleKeyboardInput = (event: KeyboardEvent): void => {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n\n let updated = current;\n if (event.key === 'Enter') {\n this.makeCall();\n return;\n } else if (event.key === 'Backspace') {\n if (!current) return control?.reset();\n updated = current.slice(0, -1);\n } else if (/^[0-9]$/.test(event.key)) {\n updated += event.key;\n } else {\n return;\n }\n\n updated ? this.updatePhoneControl(updated) : control?.reset();\n };\n\n handleKeypadInput(digit: string): void {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n this.updatePhoneControl(current + digit);\n }\n\n private updatePhoneControl(value: string): void {\n setTimeout(() => {\n this.dialForm.get('phoneNumber')?.setValue(value);\n this.cdr.detectChanges();\n });\n }\n\n private formatE164(value: string | undefined | null): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n const cleaned = value.replace(/\\s+/g, '');\n if (cleaned.startsWith('+')) {\n return cleaned;\n }\n if (cleaned.startsWith('00')) {\n return `+${cleaned.slice(2)}`;\n }\n try {\n const parsed = this.phoneUtil.parse(cleaned, 'IN');\n if (this.phoneUtil.isValidNumber(parsed)) {\n return this.phoneUtil.format(parsed, PhoneNumberFormat.E164);\n }\n } catch {\n // Fall back to cleaned value when parsing fails.\n }\n return cleaned;\n }\n\n private formatDialOut(e164: string): string {\n return formatDialOutNumber(e164);\n }\n\n\n declineAvayaCall() {\n this.suppressHangupToneOnce = true;\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = false;\n this.pendingOutgoing = false;\n this.avayaIpoService.clearOutgoingDial();\n this.audio?.pause?.();\n if (this.audio) {\n this.audio.currentTime = 0;\n }\n this.emitCallScreenState();\n this.avayaIpoService.agentIdle();\n this.cdr.detectChanges();\n this.endCallEv.emit();\n }\n\n acceptAvayaCAll() {\n this.avayaIpoService.answerCall();\n // this.headerComponent.showAvayaIpo = true;\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = true;\n this.callStatusText = '';\n this.startCallTimer();\n this.avayaIpoService.clearLastIncomingCall();\n this.emitCallScreenState();\n }\n\n onEndActiveCall(): void {\n this._isActiveCall = false;\n this.stopCallTimer();\n this.callStatusText = 'Disconnected';\n this.suppressHangupToneOnce = true;\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.isKeypadOpen = false;\n this.dtmfBuffer = '';\n this.emitCallScreenState();\n this.endCallEv.emit();\n }\n\n private playHangupToneAndThenIdle(): void {\n if (!this.audio) {\n return;\n }\n try {\n this.audio.pause();\n this.audio.currentTime = 0;\n this.audio.loop = false;\n this.audio.src = assetUrl('assets/sounds/hangup_tone.mp3');\n this.audio.loop = false;\n void this.audio.play().catch(() => {\n // Ignore aborts caused by immediate pause.\n });\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n }\n this.endToneTimeout = setTimeout(() => {\n this.audio?.pause?.();\n if (this.audio) {\n this.audio.currentTime = 0;\n }\n this._isActiveCall = false;\n this.callStatusText = '';\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }, 2000);\n } catch (err) {\n console.warn('Failed to play hangup tone', err);\n }\n }\n\n private finishDisconnectWithoutTone(): void {\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n }\n this.endToneTimeout = setTimeout(() => {\n this._isActiveCall = false;\n this.callStatusText = '';\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }, 1000);\n }\n\n private handleIncomingCall(data: { callId: string; farEndNumber: string }): void {\n const phoneUtil = PhoneNumberUtil.getInstance();\n try {\n let normalizedNumber = data.farEndNumber.trim();\n\n // Convert numbers with \"00XX\" to \"+XX\"\n if (normalizedNumber.startsWith('00')) {\n normalizedNumber = '+' + normalizedNumber.substring(2);\n }\n\n let parsedNumber;\n if (\n normalizedNumber.startsWith('+') ||\n /^\\d{1,4}/.test(normalizedNumber)\n ) {\n parsedNumber = phoneUtil.parse(normalizedNumber);\n } else {\n parsedNumber = phoneUtil.parse(\n normalizedNumber,\n this.authenticationService.tenant$\n .getValue()\n .contactInformation.country.code.toUpperCase()\n );\n }\n\n this.incomingCallNumber = phoneUtil.format(\n parsedNumber,\n PhoneNumberFormat.INTERNATIONAL\n );\n } catch (error) {\n console.warn('Invalid phone number:', data.farEndNumber);\n this.incomingCallNumber = data.farEndNumber; // Fallback\n }\n this._isActiveCall = false;\n this.showDirectoryPhonebook = false;\n this.isKeypadOpen = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.contactSearch = '';\n this.directoryForm.reset();\n this.callStatusText = '';\n this.isRinging = this.incomingNameResolved;\n this.pendingIncomingCall = !this.incomingNameResolved;\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n this.endToneTimeout = undefined;\n }\n this.emitCallScreenState();\n }\n\n onActiveOpenContacts(): void {\n this.isTransferMode = false;\n this.isAddCallMode = true;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n this.showDirectoryPhonebook = true;\n }\n\n onActiveOpenKeypad(): void {\n this.isKeypadOpen = true;\n }\n\n closeKeypad(): void {\n this.isKeypadOpen = false;\n }\n\n private startTranscriptionForCall(\n callId: string,\n allowSendBinary = false\n ): void {\n if (!callId) {\n return;\n }\n if (this.transcriptionActiveCallId === callId) {\n if (allowSendBinary) {\n this.transcriptionStreamService.enableBinary(callId);\n }\n return;\n }\n if (!this.lastLocalStream || !this.lastRemoteStream) {\n this.pendingTranscriptionCallId = callId;\n this.pendingTranscriptionAllowBinary = allowSendBinary;\n return;\n }\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n this.transcriptSegments = [];\n this.transcriptText = '';\n this.lastPartialIndex = {};\n this.transcriptStartedAt = Date.now();\n this.transcriptEndedAt = 0;\n this.transcriptionStreamService\n .startSession(callId, this.lastLocalStream, this.lastRemoteStream, allowSendBinary)\n .then(() => {\n this.transcriptionActiveCallId = callId;\n })\n .catch((err) => {\n console.error('[Phone] Failed to start transcription', err);\n });\n }\n\n private applyTranscriptUpdate(\n text: string,\n isFinal: boolean,\n ts: number,\n speaker?: string\n ): void {\n const trimmed = (text || '').trim();\n if (!trimmed) {\n return;\n }\n const key = (speaker || 'unknown').toString().toLowerCase();\n if (!isFinal) {\n const existingIndex = this.lastPartialIndex[key];\n if (existingIndex !== undefined && this.transcriptSegments[existingIndex]) {\n this.transcriptSegments[existingIndex] = { ts, text: trimmed, speaker };\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n this.lastPartialIndex[key] = this.transcriptSegments.length - 1;\n }\n this.cdr.detectChanges();\n return;\n }\n\n const pendingIndex = this.lastPartialIndex[key];\n if (pendingIndex !== undefined && this.transcriptSegments[pendingIndex]) {\n this.transcriptSegments[pendingIndex] = { ts, text: trimmed, speaker };\n delete this.lastPartialIndex[key];\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n }\n this.cdr.detectChanges();\n }\n\n getTranscriptSpeakerLabel(segment: { speaker?: string }): string {\n const raw = (segment?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'agent') {\n return 'Agent';\n }\n if (normalized === 'customer') {\n return this.activeCallName || this.incomingCallName || 'Unknown';\n }\n return raw || 'Unknown';\n }\n\n getTranscriptBubbleClass(segment: { speaker?: string }): string {\n const normalized = (segment?.speaker || '').toString().trim().toLowerCase();\n if (normalized === 'agent') {\n return 'agent';\n }\n if (normalized === 'customer') {\n return 'customer';\n }\n return '';\n }\n\n get customerTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'customer')\n .map(({ ts, text }) => ({ ts, text }));\n }\n\n get agentTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'agent')\n .map(({ ts, text }) => ({ ts, text }));\n }\n\n openTranscription(): void {\n this.isTranscriptionOpen = true;\n }\n\n closeTranscription(): void {\n this.isTranscriptionOpen = false;\n }\n\n private stopTranscription(callId?: string): void {\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n }\n this.transcriptEndedAt = Date.now();\n\n if (this.autoDownloadSummaryOnEnd && this.transcriptSegments.length > 0) {\n this.generateAndDownloadSummary(callId);\n }\n\n this.transcriptText = '';\n this.transcriptSegments = [];\n this.lastPartialIndex = {};\n this.transcriptStartedAt = 0;\n this.transcriptEndedAt = 0;\n this.isTranscriptionOpen = false;\n }\n\n private generateAndDownloadSummary(callId?: string): void {\n const fullText = this.transcriptSegments.map((s) => s.text).join(' ');\n if (!fullText.trim()) return;\n\n const bullets = this.buildExtractiveSummary(fullText, 5);\n const actions = this.extractActionItems(fullText);\n const keyInfo = this.extractKeyInfo(fullText);\n\n const mdLines: string[] = [];\n mdLines.push('# Call Summary');\n mdLines.push(`**Call ID:** ${callId ?? '-'}`);\n mdLines.push(`**Start:** ${this.transcriptStartedAt ? new Date(this.transcriptStartedAt).toISOString() : '-'}`);\n mdLines.push(`**End:** ${this.transcriptEndedAt ? new Date(this.transcriptEndedAt).toISOString() : '-'}`);\n const durMs =\n this.transcriptStartedAt && this.transcriptEndedAt\n ? this.transcriptEndedAt - this.transcriptStartedAt\n : 0;\n mdLines.push(`**Duration:** ${this.fmtHMS(durMs)}`);\n mdLines.push('');\n\n mdLines.push('## Highlights');\n if (bullets.length) bullets.forEach((b) => mdLines.push(`- ${b}`));\n else mdLines.push('- (no highlights)');\n\n if (actions.length) {\n mdLines.push('', '## Action Items');\n actions.forEach((a) => mdLines.push(`- [ ] ${a}`));\n }\n\n if (keyInfo.length) {\n mdLines.push('', '## Key Info');\n keyInfo.forEach((k) => mdLines.push(`- ${k}`));\n }\n\n mdLines.push('', '## Transcript (final lines)');\n for (const seg of this.transcriptSegments) {\n const offset = seg.ts - (this.transcriptStartedAt || seg.ts);\n mdLines.push(`[${this.fmtHMS(offset)}] ${seg.text}`);\n }\n\n const mdBlob = new Blob([mdLines.join('\\n')], {\n type: 'text/markdown;charset=utf-8',\n });\n const name = `call-${callId || 'unknown'}-summary.md`;\n this.downloadBlobFile(mdBlob, name);\n this.summaryText = mdLines.join('\\n');\n }\n\n private buildExtractiveSummary(text: string, maxBullets = 5): string[] {\n const sents = this.splitSentences(text);\n if (sents.length <= maxBullets) return sents;\n\n const stop = new Set(\n (\n 'i,me,my,myself,we,our,ours,ourselves,you,your,yours,' +\n 'he,him,his,she,her,hers,it,its,they,them,their,theirs,what,which,who,whom,' +\n 'this,that,these,those,am,is,are,was,were,be,been,being,have,has,had,do,does,' +\n 'did,doing,a,an,the,and,but,if,or,because,as,until,while,of,at,by,for,with,' +\n 'about,against,between,into,through,during,before,after,above,below,to,from,' +\n 'up,down,in,out,on,off,over,under,again,further,then,once,here,there,when,' +\n 'where,why,how,all,any,both,each,few,more,most,other,some,such,no,nor,not,' +\n 'only,own,same,so,than,too,very,can,will,just,don,should,now'\n ).split(',')\n );\n\n const tokenize = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w && !stop.has(w));\n\n const freq = new Map<string, number>();\n for (const s of sents) {\n for (const w of tokenize(s)) {\n freq.set(w, (freq.get(w) || 0) + 1);\n }\n }\n\n const scored = sents.map((s, i) => {\n const words = tokenize(s);\n const score =\n words.reduce((acc, w) => acc + (freq.get(w) || 0), 0) /\n Math.max(1, words.length);\n return { i, s, score };\n });\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, maxBullets)\n .sort((a, b) => a.i - b.i)\n .map((x) => x.s.trim());\n }\n\n private splitSentences(text: string): string[] {\n return text\n .replace(/\\s+/g, ' ')\n .split(/(?<=[.!?])\\s+(?=[A-Z0-9])/g)\n .map((s) => s.trim())\n .filter(Boolean);\n }\n\n private extractActionItems(text: string): string[] {\n const sents = this.splitSentences(text);\n const pat =\n /(need to|please|send|share|call|schedule|arrange|follow up|email|whatsapp|provide|confirm|deliver|prepare|create|set up|book|assign|remind)/i;\n return sents.filter((s) => pat.test(s)).slice(0, 12);\n }\n\n private extractKeyInfo(text: string): string[] {\n const out: string[] = [];\n const phones = text.match(/(?:\\+?\\d[\\s-]?){8,15}\\d/g) || [];\n const emails =\n text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi) || [];\n const amounts =\n text.match(/(?:₹|\\$|INR\\s?)\\s?\\d[\\d,]*(?:\\.\\d+)?/g) || [];\n const dates =\n text.match(\n /\\b(?:\\d{1,2}[-/]\\d{1,2}[-/]\\d{2,4}|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\\s+\\d{1,2}(?:,\\s*\\d{4})?)\\b/gi\n ) || [];\n if (phones.length) out.push(`Phones: ${Array.from(new Set(phones)).join(', ')}`);\n if (emails.length) out.push(`Emails: ${Array.from(new Set(emails)).join(', ')}`);\n if (amounts.length) out.push(`Amounts: ${Array.from(new Set(amounts)).join(', ')}`);\n if (dates.length) out.push(`Dates: ${Array.from(new Set(dates)).join(', ')}`);\n return out;\n }\n\n private downloadBlobFile(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n private fmtHMS(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n return (h > 0 ? String(h).padStart(2, '0') + ':' : '') +\n String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0');\n }\n\n onClosePhonebook(): void {\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.contactSearch = '';\n this.directoryForm.reset();\n this.transferError = '';\n this.transferSuccess = '';\n this.transferPending = false;\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n this.transferErrorTimeout = undefined;\n }\n }\n\n onContactsLoaded(list: any[]): void {\n this.contacts = Array.isArray(list) ? list : [];\n }\n\n get filteredContacts(): any[] {\n const term = this.contactSearch.trim().toLowerCase();\n if (!term) {\n return this.contacts;\n }\n return this.contacts.filter((contact) => {\n const name = (contact?.name || '').toString().toLowerCase();\n const phone = (contact?.phone || '').toString().toLowerCase();\n return name.includes(term) || phone.includes(term);\n });\n }\n\n onSelectContact(contact: any): void {\n const value = contact?.phone || '';\n if (value) {\n const dialOut = this.formatDialOutFromInput(value);\n if (this.isTransferMode) {\n this.transferSuccess = '';\n this.avayaIpoService.transferCall(\n this.formatTransferTargetFromInput(value),\n 'unAttended'\n );\n this.transferPending = true;\n return;\n } else {\n if (this.isAddCallMode) {\n this.avayaIpoService.doHold();\n }\n this.makeCallEv.emit(dialOut);\n }\n }\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryForm.reset();\n this.transferError = '';\n this.transferPending = false;\n }\n\n toggleMute(): void {\n if (this.muteToggleInProgress) {\n return;\n }\n this.muteToggleInProgress = true;\n setTimeout(() => {\n this.muteToggleInProgress = false;\n }, 500);\n if (this.isMuted) {\n this.avayaIpoService.doUnMute();\n } else {\n this.avayaIpoService.doMute();\n }\n this.isMuted = !this.isMuted;\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.setStreamMuted(\n this.transcriptionActiveCallId,\n 'agent',\n this.isMuted\n );\n }\n }\n\n toggleHold(): void {\n if (this.holdToggleInProgress) {\n return;\n }\n this.holdToggleInProgress = true;\n setTimeout(() => {\n this.holdToggleInProgress = false;\n }, 800);\n if (this.isHeld) {\n this.avayaIpoService.doUnHold();\n } else {\n this.avayaIpoService.doHold();\n }\n this.isHeld = !this.isHeld;\n }\n\n onTransferCall(): void {\n this.isTransferMode = true;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n this.transferSuccess = '';\n this.showDirectoryPhonebook = true;\n }\n\n private emitCallScreenState(): void {\n this.callScreenChange.emit(this.isRinging || this.isActiveCall);\n }\n\n private startCallTimer(reset = true): void {\n if (this.activeCallTimer) {\n return;\n }\n if (reset) {\n this.activeCallDuration = 0;\n }\n this.activeCallTimer = setInterval(() => {\n this.activeCallDuration += 1;\n this.cdr.markForCheck();\n }, 1000);\n }\n\n private stopCallTimer(): void {\n if (this.activeCallTimer) {\n clearInterval(this.activeCallTimer);\n this.activeCallTimer = undefined;\n }\n this.activeCallDuration = 0;\n }\n\n // Idle handlers forwarded to existing logic\n onIdleToggleDirectory(): void {\n this.showDirectoryPhonebook = !this.showDirectoryPhonebook;\n if (this.showDirectoryPhonebook) {\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n }\n }\n onIdleClear(): void {\n this.onClear();\n }\n onIdleMakeCall(): void {\n this.makeCall();\n }\n onIdleKeypadInput(digit: string): void {\n this.handleKeypadInput(digit);\n }\n onIdleKeyboardInput(ev: KeyboardEvent): void {\n this.handleKeyboardInput(ev);\n }\n\n setDirectoryTab(tab: 'contacts' | 'dialpad'): void {\n this.directoryTab = tab;\n if (tab === 'dialpad') {\n this.contactSearch = '';\n }\n }\n\n onDirectoryKeypad(digit: string): void {\n const control = this.directoryForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n this.updateDirectoryControl(current + digit);\n }\n\n onDirectoryBackspace(): void {\n const control = this.directoryForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n if (!current) {\n return control?.reset();\n }\n const updated = current.slice(0, -1);\n updated ? this.updateDirectoryControl(updated) : control?.reset();\n }\n\n onDirectoryUseNumber(): void {\n const raw = this.directoryForm.value.phoneNumber;\n const value =\n raw?.internationalNumber ||\n raw?.number ||\n (typeof raw === 'string' ? raw : '') ||\n this.directoryNumber;\n if (!value) {\n return;\n }\n const dialOut = this.formatDialOutFromInput(value);\n if (this.isTransferMode) {\n this.transferSuccess = '';\n this.avayaIpoService.transferCall(\n this.formatTransferTargetFromInput(value),\n 'unAttended'\n );\n this.transferPending = true;\n return;\n } else {\n if (this.isAddCallMode) {\n this.avayaIpoService.doHold();\n }\n this.makeCallEv.emit(dialOut);\n }\n this.showDirectoryPhonebook = false;\n\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.directoryForm.reset();\n this.transferError = '';\n this.transferPending = false;\n }\n\n onDirectoryClear(): void {\n this.directoryForm.reset();\n this.directoryNumber = '';\n }\n\n onDtmfDigit(digit: string): void {\n this.dtmfBuffer += digit;\n this.avayaIpoService.sendDTMF(digit);\n }\n\n onDtmfBackspace(): void {\n if (!this.dtmfBuffer) {\n return;\n }\n this.dtmfBuffer = this.dtmfBuffer.slice(0, -1);\n }\n\n private updateDirectoryControl(value: string): void {\n setTimeout(() => {\n this.directoryForm.get('phoneNumber')?.setValue(value);\n this.directoryNumber = value;\n this.cdr.detectChanges();\n });\n }\n\n private formatDialOutFromInput(value: string): string {\n const e164 = this.formatE164(value);\n return this.formatDialOut(e164 || value);\n }\n\n private formatTransferTargetFromInput(value: string): string {\n const e164 = this.formatE164(value);\n return formatDialOutNumber(e164 || value);\n }\n\n private async startRecordingForCall(callId: string): Promise<void> {\n if (!callId) {\n return;\n }\n console.debug('[Phone] startRecordingForCall', callId);\n let local = this.lastLocalStream || this.avayaIpoService.localStream;\n const hasAudio = (stream?: MediaStream | null) =>\n stream instanceof MediaStream && stream.getAudioTracks().length > 0;\n const metadata = {\n tenantId: this.tenantId || '',\n agentId: this.agentId || '',\n phoneNumber: this.activeCallNumber || '',\n callId,\n };\n\n if (!hasAudio(local)) {\n console.warn('[Phone] Missing local audio, requesting mic', callId);\n try {\n await this.avayaIpoService.initLocalMic();\n } catch (err) {\n console.warn('[Phone] initLocalMic failed', err);\n }\n local = this.lastLocalStream || this.avayaIpoService.localStream;\n if (!hasAudio(local)) {\n console.warn('[Phone] Still missing local audio for recording', callId);\n return;\n }\n }\n\n const remote = this.lastRemoteStream;\n if (hasAudio(remote)) {\n this.recordingManagerService.startRecording(local!, remote!, metadata);\n return;\n }\n\n const remoteSub = this.avayaIpoService.remoteStream$.subscribe((r) => {\n if (!r || r.callId !== callId) {\n return;\n }\n if (!hasAudio(r.stream)) {\n return;\n }\n const freshLocal = this.avayaIpoService.localStream;\n if (!hasAudio(freshLocal)) {\n return;\n }\n console.debug('[Phone] Remote audio ready, restarting recording', callId);\n this.recordingManagerService.startRecording(\n freshLocal!,\n r.stream,\n metadata\n );\n remoteSub.unsubscribe();\n });\n }\n}\n","<div class=\"phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"onClosePhonebook()\">‹</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>+</button>\n </div>\n @if (transferError) {\n <div class=\"phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"phonebook-tabs\">\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"phonebook-search\">\n <span class=\"search-icon\">🔍</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"dialpad-backspace\" (click)=\"onDirectoryBackspace()\">⌫</button>\n </div>\n\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"dialpad-digit\">{{ item.digit }}</span>\n <span class=\"dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet keypad-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeKeypad()\">‹</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">DTMF</div>\n <div class=\"phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>+</button>\n </div>\n\n <div class=\"dialpad-input dtmf-input\">\n <div class=\"dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet transcription-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeTranscription()\">‹</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"transcription-split\">\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Customer\n </div>\n <div class=\"transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Agent\n </div>\n <div class=\"transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n","import { ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnInit, OnDestroy, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { AvayaIPOService, CallState, LoginState } from './services/avaya-ipo.service';\nimport { APP_CONFIG, assetUrl, formatDialOutNumber } from './config/app-config';\nimport { Subscription } from 'rxjs';\nimport { CountryService } from './services/country.service';\nimport { PhoneNumberLookupService } from './services/phone-number-lookup.service';\nimport { EntitiesSearchService } from './services/entities-search.service';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Component({\n selector: 'snugdesk-avaya-ipo-widget',\n templateUrl: './avaya-ipo-widget.component.html',\n styleUrls: ['./avaya-ipo-widget.component.css'],\n standalone: false,\n})\nexport class AvayaIPOWidgetComponent implements OnInit, OnDestroy {\n @HostBinding('class.dark-mode') hostDarkMode = false;\n private readonly STORAGE_KEY = 'avayaIpoWidgetLogin';\n // Public API inputs (kept for compatibility with host apps)\n @Input() isVisible = true;\n @Input() configurationMode?: string;\n @Input() avayaIPOServerIP?: string;\n @Input() avayaIPOServerPort?: number;\n @Input() avayaIPOServerStunServerIP?: string;\n @Input() avayaIPOServerStunServerPort?: number;\n @Input() avayaIPOServerTurnServerIP?: string;\n @Input() avayaIPOServerTurnServerPort?: number;\n @Input() token?: string;\n @Input() tenantId!: string;\n @Input() userId!: string;\n\n @Output() notificationEvent: EventEmitter<number> = new EventEmitter<number>();\n readonly avayaLogoUrl = assetUrl('assets/images/logo-avaya_small_color.svg');\n\n isReconnectingInProgress = false;\n isFailoverInProgress = false;\n isFailbackInProgress = false;\n\n showLoginForm = true;\n showLoginLoader = false;\n hasAvayaSocketError = false;\n hasAvayaLoginError = false;\n hasAvayaLoginFailedGeneral = false;\n hasAvayaLoginConflictError = false;\n hasAvayaDeviceError = false;\n private awlScriptPromise?: Promise<void>;\n\n loginForm!: FormGroup;\n activeTab: 'history' | 'contacts' | 'keypad' | 'settings' = 'keypad';\n private loginSub?: Subscription;\n private incomingCallSub?: Subscription;\n private callStateSub?: Subscription;\n hideTabs = false;\n darkModeEnabled = false;\n activeCallNumber: string | null = null;\n incomingCallName: string | null = null;\n incomingNameResolved = false;\n activeCallName: string | null = null;\n authErrorMessage = '';\n authLoading = true;\n private hasInitialized = false;\n private callLogIndex = new Map<\n string,\n { direction: 'inbound' | 'outbound'; phoneNumber: any; connected: boolean }\n >();\n private pendingDisconnectSide: 'AGENT' | 'CALLER' | null = null;\n private callStartTimes = new Map<string, number>();\n\n constructor(\n private formBuilder: FormBuilder,\n private avayaIPOService: AvayaIPOService,\n private cdr: ChangeDetectorRef,\n private countryService: CountryService,\n private phoneNumberLookupService: PhoneNumberLookupService,\n private entitiesSearchService: EntitiesSearchService,\n private snugdeskAuthService: SnugdeskAuthenticationService\n ) { }\n\n async ngOnInit(): Promise<void> {\n this.restoreThemePreference();\n if (await this.authenticateWithToken()) {\n this.authLoading = false;\n this.initAfterAuth();\n }\n }\n\n private initAfterAuth(): void {\n if (this.hasInitialized) {\n return;\n }\n this.authLoading = false;\n this.hasInitialized = true;\n this.loginForm = this.formBuilder.group({\n ipoExtensionNo: ['', Validators.required],\n ipoPassword: ['', Validators.required],\n });\n\n this.loginSub = this.avayaIPOService.loginStatus$.subscribe((status) => {\n this.handleLoginStatus(status);\n });\n\n this.incomingCallSub = this.avayaIPOService.incomingCallSubject.subscribe(\n async ({ callId, farEndNumber }) => {\n if (!callId) {\n return;\n }\n this.activeTab = 'keypad';\n const phoneNumber = (farEndNumber ?? '').toString();\n this.activeCallNumber = phoneNumber;\n this.incomingCallName = null;\n this.incomingNameResolved = false;\n this.activeCallName = null;\n const normalizedSearch = this.normalizePhoneForSearch(phoneNumber);\n const cachedName = this.entitiesSearchService.getCachedName(\n this.tenantId,\n normalizedSearch\n );\n if (cachedName) {\n this.incomingCallName = cachedName;\n this.activeCallName = cachedName;\n this.incomingNameResolved = true;\n }\n\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(phoneNumber),\n this.getOpenSearchCallerName(normalizedSearch),\n ]);\n const mapNumber =\n lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '') ||\n lookupResult?.normalizedPhoneNumber ||\n phoneNumber;\n this.activeCallNumber = mapNumber;\n if (callerName) {\n this.incomingCallName = callerName;\n this.activeCallName = callerName;\n }\n this.incomingNameResolved = true;\n const phonePayload: any = {\n ...(lookupResult || { normalizedPhoneNumber: mapNumber }),\n };\n if (callerName) {\n phonePayload.name = callerName;\n }\n this.callLogIndex.set(callId, {\n direction: 'inbound',\n phoneNumber: phonePayload,\n connected: false,\n });\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: phonePayload,\n direction: 'inbound',\n duration: 0,\n status: 'incoming',\n timestamp: new Date().toISOString(),\n callinginfo: 'ringing',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (incoming) failed', err),\n });\n }\n );\n\n this.callStateSub = this.avayaIPOService.callStateSubject.subscribe(\n ({ callId, state }) => {\n if (!callId || !state) {\n return;\n }\n const meta = this.callLogIndex.get(callId);\n if (!meta) {\n return;\n }\n if (state === CallState.CONNECTED) {\n this.avayaIPOService.clearLastIncomingCall();\n meta.connected = true;\n this.callStartTimes.set(callId, Date.now());\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'connected',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (connected) failed', err),\n });\n return;\n }\n if (state === CallState.DISCONNECTED || state === CallState.FAILED) {\n this.avayaIPOService.clearLastIncomingCall();\n let disconnectSide: 'AGENT' | 'CALLER' | 'NA' =\n this.pendingDisconnectSide ?? 'CALLER';\n let disconnectReason: string | undefined;\n if (this.avayaIPOService.consumeTransferInProgress(callId)) {\n disconnectSide = 'NA';\n disconnectReason = 'Transfer';\n }\n const status = 'disconnected';\n const startedAt = this.callStartTimes.get(callId);\n const duration = startedAt\n ? Math.max(0, Math.floor((Date.now() - startedAt) / 1000))\n : 0;\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration,\n status,\n timestamp: new Date().toISOString(),\n callinginfo: 'disconnected',\n disconnectSide,\n disconnectReason,\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error(`logCall (${status}) failed`, err),\n });\n this.callLogIndex.delete(callId);\n this.callStartTimes.delete(callId);\n this.pendingDisconnectSide = null;\n if (this.avayaIPOService.activeCallId === callId) {\n this.activeCallNumber = null;\n this.activeCallName = null;\n this.incomingCallName = null;\n }\n }\n }\n );\n\n this.restoreSession();\n }\n\n private async authenticateWithToken(): Promise<boolean> {\n this.authLoading = true;\n const token = (this.token || '').trim();\n\n if (token) {\n try {\n const ok = this.snugdeskAuthService.checkToken(token);\n if (!ok) {\n this.authErrorMessage = 'Authentication token invalid.';\n return false;\n }\n this.snugdeskAuthService.setToken(token);\n sessionStorage.setItem('auth_sessionToken', token);\n if (!this.tenantId) {\n this.tenantId = this.snugdeskAuthService.getTenantId();\n }\n if (!this.userId) {\n this.userId = this.snugdeskAuthService.getUserId();\n }\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Token validation failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n if (this.tenantId && this.userId) {\n try {\n const loginOk = await this.snugdeskAuthService.login(\n this.tenantId,\n this.userId\n );\n if (!loginOk) {\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n const newToken = this.snugdeskAuthService.getToken();\n if (!newToken) {\n this.authErrorMessage = 'Authentication token missing.';\n return false;\n }\n this.snugdeskAuthService.setToken(newToken);\n this.token = newToken;\n sessionStorage.setItem('auth_sessionToken', newToken);\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Login failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n this.authErrorMessage = 'Authentication token missing.';\n this.authLoading = false;\n return false;\n }\n\n async onAuthLoginClick(): Promise<void> {\n if (await this.authenticateWithToken()) {\n this.authErrorMessage = '';\n this.initAfterAuth();\n }\n }\n\n onLogin(): void {\n this.loginForm.markAllAsTouched();\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = false;\n this.hasAvayaDeviceError = false;\n this.hasAvayaSocketError = false;\n\n if (this.loginForm.invalid) {\n return;\n }\n\n this.showLoginLoader = true;\n\n // Ensure AWL SDK is loaded, then configure and login.\n this.loadAwlScript(APP_CONFIG.AWL_SDK_URL)\n .then(() => {\n this.avayaIPOService.setConfigValues({\n serviceType: this.configurationMode || 'phone',\n gatewayIp: this.avayaIPOServerIP,\n gatewayPort: this.avayaIPOServerPort?.toString(),\n stunIp: this.avayaIPOServerStunServerIP,\n stunPort: this.avayaIPOServerStunServerPort?.toString(),\n turnIp: this.avayaIPOServerTurnServerIP,\n turnPort: this.avayaIPOServerTurnServerPort?.toString(),\n });\n\n this.avayaIPOService.init();\n this.avayaIPOService.logIn(\n this.loginForm.value.ipoExtensionNo,\n this.loginForm.value.ipoPassword\n );\n })\n .catch((err) => {\n console.error('Failed to load AWL SDK', err);\n this.showLoginLoader = false;\n this.hasAvayaSocketError = true;\n });\n }\n\n onLogout(): void {\n this.avayaIPOService.logout();\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.loginForm.reset();\n this.clearSession();\n }\n\n private handleLoginStatus(status: any): void {\n if (!status) {\n return;\n }\n\n if (typeof status === 'boolean') {\n if (status) {\n this.showLoginLoader = false;\n this.showLoginForm = false;\n this.avayaIPOService.initLocalMic().catch((err) => {\n console.warn('initLocalMic failed', err);\n });\n this.persistSession();\n }\n return;\n }\n\n const result = status.result ?? status.loginState;\n switch (result) {\n case LoginState.LOGIN_SUCCESS:\n this.showLoginLoader = false;\n this.showLoginForm = false;\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = false;\n this.hasAvayaLoginConflictError = false;\n this.hasAvayaSocketError = false;\n this.hasAvayaDeviceError = false;\n this.avayaIPOService.initLocalMic().catch((err) => {\n console.warn('initLocalMic failed', err);\n });\n this.persistSession();\n break;\n case LoginState.LOGGEDOUT:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.loginForm.reset();\n this.clearSession();\n break;\n case LoginState.LOGIN_FAILED:\n case LoginState.LOGIN_EMPTYUSERNAME:\n case LoginState.LOGIN_EMPTYPASSWORD:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n if (status?.reason === 'Invalid Credentials') {\n this.hasAvayaLoginError = true;\n this.hasAvayaLoginFailedGeneral = false;\n } else {\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = true;\n }\n break;\n case LoginState.WEBSOCKET_FAILURE:\n case LoginState.LOGIN_GW_NOTCONFIGURED:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.hasAvayaSocketError = true;\n break;\n case LoginState.DEVICEACCESS_FAILURE:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.hasAvayaDeviceError = true;\n break;\n default:\n break;\n }\n }\n\n selectTab(tab: 'history' | 'contacts' | 'keypad' | 'settings'): void {\n this.activeTab = tab;\n }\n\n onHistoryMakeCall(payload: { dialOut: string; name?: string }): void {\n this.triggerCall(payload);\n }\n\n onPhoneMakeCall(phoneNumber: string): void {\n this.triggerCall(phoneNumber);\n }\n\n onContactsMakeCall(payload: { dialOut: string; name?: string }): void {\n this.triggerCall(payload);\n }\n\n onPhoneEndCall(): void {\n try {\n this.pendingDisconnectSide = 'AGENT';\n const pendingIncoming = this.avayaIPOService.getLastIncomingCall();\n const activeCallId = this.avayaIPOService.activeCallId;\n const targetCallId =\n pendingIncoming?.callId || activeCallId || null;\n if (targetCallId) {\n const meta = this.callLogIndex.get(targetCallId);\n if (meta && !meta.connected) {\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId: targetCallId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'disconnected',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n disconnectSide: 'AGENT',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (agent disconnect) failed', err),\n });\n this.callLogIndex.delete(targetCallId);\n if (pendingIncoming?.callId) {\n this.avayaIPOService.clearLastIncomingCall();\n }\n this.pendingDisconnectSide = null;\n }\n }\n this.avayaIPOService.dropCall();\n } catch (err) {\n console.warn('Failed to end call', err);\n }\n }\n\n onDeviceChange(change: {\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }): void {\n console.debug('Device selection changed', change);\n }\n\n onThemeToggle(enabled: boolean): void {\n this.darkModeEnabled = enabled;\n this.hostDarkMode = enabled;\n try {\n localStorage.setItem('sd-dark-mode', JSON.stringify(enabled));\n } catch { }\n }\n\n onCallScreenChange(active: boolean): void {\n Promise.resolve().then(() => {\n this.hideTabs = active;\n this.cdr.detectChanges();\n });\n }\n\n private async triggerCall(raw: any): Promise<void> {\n const providedName =\n typeof raw === 'object' && raw !== null ? raw?.name : null;\n const destination = formatDialOutNumber(\n raw?.dialOut ??\n raw?.internationalNumber ??\n raw?.number ??\n (typeof raw === 'string' ? raw : '')\n );\n if (!destination) {\n console.warn('No destination to dial');\n return;\n }\n this.activeTab = 'keypad';\n this.activeCallNumber = destination;\n this.activeCallName = providedName || null;\n const normalizedSearch = this.normalizePhoneForSearch(destination);\n if (!providedName) {\n const cachedName = this.entitiesSearchService.getCachedName(\n this.tenantId,\n normalizedSearch\n );\n if (cachedName) {\n this.activeCallName = cachedName;\n }\n }\n this.avayaIPOService.notifyOutgoingDial(destination);\n try {\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(destination),\n providedName ? Promise.resolve(null) : this.getOpenSearchCallerName(normalizedSearch),\n ]);\n const mapNumber =\n lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '') ||\n lookupResult?.normalizedPhoneNumber ||\n destination;\n this.activeCallNumber = mapNumber;\n if (providedName) {\n this.activeCallName = providedName;\n } else if (callerName) {\n this.activeCallName = callerName;\n }\n const slot = await this.avayaIPOService.makeCall(destination);\n if (!slot) {\n return;\n }\n const callId = this.avayaIPOService.activeCallId;\n if (callId) {\n this.activeCallNumber = mapNumber;\n const phonePayload: any = lookupResult || { normalizedPhoneNumber: mapNumber };\n const resolvedName = providedName || callerName;\n if (resolvedName && !phonePayload.name) {\n phonePayload.name = resolvedName;\n }\n this.callLogIndex.set(callId, {\n direction: 'outbound',\n phoneNumber: phonePayload,\n connected: false,\n });\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: phonePayload,\n direction: 'outbound',\n duration: 0,\n status: 'initiated',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (initiated) failed', err),\n });\n }\n } catch (err) {\n console.error('Failed to place call', err);\n }\n }\n\n ngOnDestroy(): void {\n this.loginSub?.unsubscribe();\n this.incomingCallSub?.unsubscribe();\n this.callStateSub?.unsubscribe();\n }\n\n private async getLookupPhoneNumber(phoneNumber: string): Promise<any> {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n console.warn(\n 'lookupPhoneNumber called with an invalid phoneNumber: ',\n phoneNumber\n );\n return { phoneNumber: '' };\n }\n\n let normalizedPhoneNumber = phoneNumber.trim();\n if (normalizedPhoneNumber.startsWith('00')) {\n normalizedPhoneNumber = '+' + normalizedPhoneNumber.substring(2);\n }\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n if (\n countryCode &&\n !normalizedPhoneNumber.startsWith('+') &&\n !normalizedPhoneNumber.startsWith('00')\n ) {\n let digits = normalizedPhoneNumber.replace(/\\D/g, '');\n if (digits.length >= 10 && digits.startsWith('0')) {\n digits = digits.slice(1);\n }\n if (digits.startsWith(countryCode)) {\n normalizedPhoneNumber = `+${digits}`;\n } else {\n normalizedPhoneNumber = `+${countryCode}${digits}`;\n }\n }\n\n try {\n const res_lookupPhoneNumber: any =\n await this.phoneNumberLookupService.lookupPhoneNumber(\n normalizedPhoneNumber\n );\n\n if (!res_lookupPhoneNumber?.data?.valid) {\n throw new Error('Invalid res_lookupPhoneNumber');\n }\n\n const countryCode = res_lookupPhoneNumber?.data\n ? res_lookupPhoneNumber.data['country-code']\n : null;\n const res_getCountryFromCountryCode = countryCode\n ? await this.countryService.getCountryFromCountryCode(countryCode)\n : null;\n return {\n normalizedPhoneNumber: normalizedPhoneNumber,\n lookupPhoneNumber: res_lookupPhoneNumber?.data,\n country: res_getCountryFromCountryCode,\n };\n } catch (err) {\n console.warn(\n `Error looking up phone number ${phoneNumber}: `,\n err\n );\n return { normalizedPhoneNumber: normalizedPhoneNumber };\n }\n }\n\n private async getOpenSearchCallerName(\n phoneNumber: string\n ): Promise<string | null> {\n const tenantId = this.tenantId;\n if (!tenantId || !phoneNumber) {\n return null;\n }\n\n try {\n return await this.entitiesSearchService.lookupNameByPhone(\n tenantId,\n phoneNumber\n );\n } catch (err) {\n console.warn('OpenSearch lookup failed:', err);\n return null;\n }\n }\n\n private normalizePhoneForSearch(value: string): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n let normalized = value.trim();\n if (normalized.startsWith('00')) {\n normalized = '+' + normalized.slice(2);\n }\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!digits) {\n return '';\n }\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n if (countryCode && local.startsWith(countryCode)) {\n local = local.slice(countryCode.length);\n }\n return local;\n }\n\n private persistSession(): void {\n try {\n const payload = {\n loggedIn: true,\n extension: this.loginForm.value.ipoExtensionNo ?? '',\n password: this.loginForm.value.ipoPassword ?? '',\n };\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(payload));\n } catch (err) {\n console.warn('Unable to persist login session', err);\n }\n }\n\n private restoreSession(): void {\n try {\n const raw = localStorage.getItem(this.STORAGE_KEY);\n if (!raw) {\n return;\n }\n const parsed = JSON.parse(raw);\n if (parsed?.loggedIn) {\n this.showLoginForm = false;\n this.showLoginLoader = true;\n this.loginForm.patchValue({\n ipoExtensionNo: parsed.extension ?? '',\n ipoPassword: parsed.password ?? '',\n });\n if (parsed.extension && parsed.password) {\n // auto-login after brief tick to ensure view init\n setTimeout(() => this.onLogin(), 0);\n }\n }\n } catch (err) {\n console.warn('Unable to restore login session', err);\n }\n }\n\n private restoreThemePreference(): void {\n try {\n const stored = localStorage.getItem('sd-dark-mode');\n if (stored !== null) {\n this.darkModeEnabled = JSON.parse(stored) === true;\n this.hostDarkMode = this.darkModeEnabled;\n }\n } catch { }\n }\n\n private clearSession(): void {\n try {\n localStorage.removeItem(this.STORAGE_KEY);\n } catch (err) {\n console.warn('Unable to clear login session', err);\n }\n }\n\n private loadAwlScript(src: string): Promise<void> {\n if (!this.awlScriptPromise) {\n this.awlScriptPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector<HTMLScriptElement>(\n `script[src=\"${src}\"]`\n );\n if (existing) {\n if (existing.dataset['loaded'] === 'true') {\n resolve();\n return;\n }\n existing.addEventListener('load', () => resolve());\n existing.addEventListener('error', (e) => reject(e));\n return;\n }\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n script.defer = true;\n script.dataset['loaded'] = 'false';\n script.onload = () => {\n script.dataset['loaded'] = 'true';\n resolve();\n };\n script.onerror = (e) => reject(e);\n document.body.appendChild(script);\n });\n }\n return this.awlScriptPromise;\n }\n}\n","<div class=\"media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\n\n@if (authLoading) {\n <div class=\"auth-loading-screen\">\n <div class=\"auth-loading-card\">\n <div class=\"spinner\" aria-hidden=\"true\"></div>\n <div class=\"auth-loading-title\">Checking authentication</div>\n <div class=\"auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"auth-error-screen\">\n <div class=\"auth-error-card\">\n <div class=\"auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"auth-error-title\">Authentication Required</div>\n <div class=\"auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"container_connection_status_overlay\">\n <div class=\"container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"widget-body\">\n <div class=\"widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>History</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Settings</span>\n <button type=\"button\" class=\"settings-btn is-active\" disabled>\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Keypad</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"global-loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs) {\n <nav class=\"tabs\">\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"tab-text\">History</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"tab-text\">Contacts</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"tab-text\">Keypad</span>\n </button>\n </nav>\n }\n}\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { NgxIntlTelInputModule } from 'ngx-intl-tel-input';\n\nimport { AvayaIPOWidgetComponent } from './avaya-ipo-widget.component';\nimport { CallHistoryComponent } from './components/call-history/call-history.component';\nimport { CallDetailsComponent } from './components/call-history/call-details/call-details.component';\nimport { ContactsComponent } from './components/contacts/contacts.component';\nimport { ContactCardComponent } from './components/contacts/contact-card/contact-card.component';\nimport { ContactDetailsComponent } from './components/contacts/contact-details/contact-details.component';\nimport { SettingsComponent } from './components/settings/settings.component';\nimport { AvayaIpoLoginComponent } from './components/login/login.component';\nimport { PhoneComponent } from './components/phone/phone.component';\nimport { PhoneIdleComponent } from './components/phone/idle/phone-idle.component';\nimport { PhoneIncomingComponent } from './components/phone/incoming/phone-incoming.component';\nimport { PhoneActiveComponent } from './components/phone/active/phone-active.component';\n\n@NgModule({\n declarations: [\n AvayaIPOWidgetComponent,\n CallHistoryComponent,\n CallDetailsComponent,\n ContactsComponent,\n ContactCardComponent,\n ContactDetailsComponent,\n SettingsComponent,\n AvayaIpoLoginComponent,\n PhoneComponent,\n PhoneIdleComponent,\n PhoneIncomingComponent,\n PhoneActiveComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatButtonModule,\n NgxIntlTelInputModule,\n ],\n exports: [AvayaIPOWidgetComponent],\n})\nexport class AvayaIPOWidgetModule {}\n","/*\n * Public API Surface of avaya-ipo-widget\n */\n\nexport * from './lib/avaya-ipo-widget.component';\nexport * from './lib/avaya-ipo-widget.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.AuthenticationService","i3","i4","i5.CallDetailsComponent","i1.EntitiesSearchService","i2.ContactCardComponent","i3.ContactDetailsComponent","i2","i6","i2.AvayaIPOService","i3.AuthenticationService","i4.RecordingManagerService","i5.TranscriptionStreamService","i7.PhoneIdleComponent","i8.PhoneIncomingComponent","i9.PhoneActiveComponent","i10","i3.CountryService","i4.PhoneNumberLookupService","i5.EntitiesSearchService","i7.CallHistoryComponent","i8.ContactsComponent","i9.SettingsComponent","i10.AvayaIpoLoginComponent","i11.PhoneComponent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAO,MAAM,UAAU,GAAG;AACxB,IAAA,kBAAkB,EAAE,wDAAwD;AAC5E,IAAA,WAAW,EAAE,6EAA6E;AAC1F,IAAA,oBAAoB,EAAE,4DAA4D;AAClF,IAAA,oBAAoB,EAAE,yEAAyE;AAC/F,IAAA,mBAAmB,EAAE,kEAAkE;AACvF,IAAA,oBAAoB,EAAE,mCAAmC;AACzD,IAAA,0BAA0B,EAAE,qCAAqC;AACjE,IAAA,2BAA2B,EAAE,OAAO;IACpC,gCAAgC,EAAE,CAAC,OAAO,CAAC;AAC3C,IAAA,mBAAmB,EAAE,cAAc;AACnC,IAAA,2BAA2B,EAAE,kDAAkD;AAC/E,IAAA,gBAAgB,EAAE,uFAAuF;AACzG,IAAA,wBAAwB,EAAE,wCAAwC;AAClE,IAAA,qBAAqB,EAAE,4CAA4C;AACnE,IAAA,yBAAyB,EAAE,IAAI;AAC/B,IAAA,kBAAkB,EAAE,sCAAsC;AAC1D,IAAA,uBAAuB,EAAE,8CAA8C;AACvE,IAAA,aAAa,EAAE,0DAA0D;AACzE,IAAA,eAAe,EAAE,GAAG;CACZ;AAEH,MAAM,QAAQ,GAAG,CAAC,IAAY,KAAY;AAC/C,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACzC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,SAAS,EAAE;AAC/B,CAAC;AAEM,MAAM,mBAAmB,GAAG,CAAC,KAAU,KAAY;IACxD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,QAAA,OAAO,EAAE;IACX;IACA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;IACnC,IAAI,CAAC,GAAG,EAAE;AACR,QAAA,OAAO,EAAE;IACX;IAEA,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,yBAAyB,IAAI,EAAE;AAC5D,SAAA,QAAQ;AACR,SAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAErB,IAAA,IAAI,WAAW,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE;QACvE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;IAC3C;AAEA,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE;QACxB,OAAO,CAAA,EAAG,UAAU,CAAC,eAAe,IAAI,EAAE,CAAA,EAAG,MAAM,CAAA,CAAE;IACvD;AAEA,IAAA,OAAO,MAAM;AACf,CAAC;;AC5CD,IAAY,UAiBX;AAjBD,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,eAAA,CAAA,GAAA,uBAAuC;AACvC,IAAA,UAAA,CAAA,cAAA,CAAA,GAAA,sBAAqC;AACrC,IAAA,UAAA,CAAA,qBAAA,CAAA,GAAA,6BAAmD;AACnD,IAAA,UAAA,CAAA,qBAAA,CAAA,GAAA,6BAAmD;AACnD,IAAA,UAAA,CAAA,wBAAA,CAAA,GAAA,gCAAyD;AACzD,IAAA,UAAA,CAAA,WAAA,CAAA,GAAA,mBAA+B;AAC/B,IAAA,UAAA,CAAA,mBAAA,CAAA,GAAA,iCAAqD;AACrD,IAAA,UAAA,CAAA,sBAAA,CAAA,GAAA,8BAAqD;AACrD,IAAA,UAAA,CAAA,aAAA,CAAA,GAAA,qBAAmC;AACnC,IAAA,UAAA,CAAA,cAAA,CAAA,GAAA,sBAAqC;AACrC,IAAA,UAAA,CAAA,cAAA,CAAA,GAAA,sBAAqC;AACrC,IAAA,UAAA,CAAA,kBAAA,CAAA,GAAA,2BAA8C;AAC9C,IAAA,UAAA,CAAA,iBAAA,CAAA,GAAA,0BAA4C;AAC5C,IAAA,UAAA,CAAA,cAAA,CAAA,GAAA,sBAAqC;AACrC,IAAA,UAAA,CAAA,kBAAA,CAAA,GAAA,2BAA8C;AAC9C,IAAA,UAAA,CAAA,iBAAA,CAAA,GAAA,0BAA4C;AAC9C,CAAC,EAjBW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;AAmBtB,IAAY,SAWX;AAXD,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,mBAA0B;AAC1B,IAAA,SAAA,CAAA,aAAA,CAAA,GAAA,0BAAwC;AACxC,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,sBAAgC;AAChC,IAAA,SAAA,CAAA,WAAA,CAAA,GAAA,wBAAoC;AACpC,IAAA,SAAA,CAAA,cAAA,CAAA,GAAA,2BAA0C;AAC1C,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,qBAA8B;AAC9B,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,uBAAkC;AAClC,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,mBAA0B;AAC1B,IAAA,SAAA,CAAA,aAAA,CAAA,GAAA,0BAAwC;AACxC,IAAA,SAAA,CAAA,eAAA,CAAA,GAAA,4BAA4C;AAC9C,CAAC,EAXW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;MAkBR,oBAAoB,CAAA;AACX,IAAA,OAAA;AAApB,IAAA,WAAA,CAAoB,OAAwB,EAAA;QAAxB,IAAA,CAAA,OAAO,GAAP,OAAO;IAAqB;IAEhD,iBAAiB,GAAG,CAAC,MAAW,EAAE,OAAY,EAAE,UAAe,KAAU;AACvE,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;YACzB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC;AACtD,YAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBACpC,MAAM;gBACN,YAAY;AACb,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC5C,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC;QAC1D;AACF,IAAA,CAAC;IACD,iBAAiB,GAAG,CAAC,MAAW,EAAE,OAAY,EAAE,KAAU,KAAU;;QAElE,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACjE,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE;QACpC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvD,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,KAAK,KAAK,wBAAwB,EAAE;AACtC,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;QAC3C;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC;AAErC,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,OAAO,EAAE,eAAe,IAAI;;;;;AAM3C,YAAA,IAAI,MAAM,YAAY,WAAW,EAAE;gBACjC,MAAM,OAAO,GAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;AACvD,gBAAA,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,OAAO;gBACnC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;YAC1C;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC;QACtD;AACF,IAAA,CAAC;AAED,IAAA,eAAe,GAAG,CAAC,MAAW,EAAE,MAAW,KAAU;AACnD,QAAA,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;AACpC,QAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,MAAM,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACzB,YAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5D,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AACF;MAGY,eAAe,CAAA;AAkIP,IAAA,IAAA;AAAsB,IAAA,IAAA;IAjIjC,GAAG,CAAO;IAEX,YAAY,GAAuB,IAAI;AACrC,IAAA,aAAa,GAAG,IAAI,eAAe,CAAqB,IAAI,CAAC;IAC/D,WAAW,GAAuB,IAAI;AACtC,IAAA,mBAAmB,GAAG,IAAI,OAAO,EAGpC;AACG,IAAA,oBAAoB,GAAG,IAAI,OAAO,EAAmC;AACrE,IAAA,mBAAmB,GAAG,IAAI,eAAe,CAC9C,IAAI,CACL;IACO,SAAS,GAA4B,IAAI;IACzC,gBAAgB,GACtB,IAAI;AACC,IAAA,gBAAgB,GAAG,IAAI,OAAO,EAAqC;AACnE,IAAA,qBAAqB,GAAG,IAAI,OAAO,EAItC;IACI,wBAAwB,GAAkB,IAAI;AAE9C,IAAA,SAAS,GAAwC;AACvD,QAAA,GAAG,EAAE,IAAI;AACT,QAAA,GAAG,EAAE,IAAI;AACT,QAAA,GAAG,EAAE,IAAI;KACV;AACM,IAAA,cAAc,GAAG,IAAI,GAAG,EAAe;IACvC,YAAY,GAAkB,IAAI;IAClC,aAAa,GAAkB,IAAI;IAEnC,mBAAmB,GAAA;QAGxB,OAAO,IAAI,CAAC,gBAAgB;IAC9B;IAEO,qBAAqB,GAAA;AAC1B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,EAAE;IACrB;AAEO,IAAA,kBAAkB,CAAC,MAAc,EAAA;QACtC,IAAI,CAAC,MAAM,EAAE;YACX;QACF;QACA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3C;IAEO,iBAAiB,GAAA;AACtB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;IACrC;IAEO,kBAAkB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI;IACjC;IAEO,mBAAmB,CAAC,MAAc,EAAE,YAAoB,EAAA;QAC7D,IAAI,CAAC,gBAAgB,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE;QAChD,IAAI,CAAC,aAAa,EAAE;IACtB;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACnB,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE;YAC9B;YACA,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,QAAQ,CAAC,iCAAiC,CAAC;AAChE,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAK;;AAEjC,YAAA,CAAC,CAAC;QACJ;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AACA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE;QACzB;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,OAAO,GAAG,EAAE;AACZ,IAAA,kBAAkB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACzD,IAAA,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;AAE3C,IAAA,QAAQ,GAAG;AAC1B,QAAA,UAAU,EAAE,UAAU;AACtB,QAAA,WAAW,EAAE,UAAU;AACvB,QAAA,WAAW,EAAE,UAAU;AACvB,QAAA,UAAU,EAAE,UAAU;KACvB;AAEO,IAAA,cAAc,GAAG;QACvB,WAAW,EAAE,EAAE;AACf,QAAA,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7B,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;AAChC,QAAA,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;AACnD,QAAA,OAAO,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;AACpE,QAAA,iBAAiB,EAAE,KAAK;KACzB;AAEgB,IAAA,iBAAiB,GAAG,UAAU,CAAC,oBAAoB;AAEnD,IAAA,oBAAoB,GAAG,UAAU,CAAC,oBAAoB;AAE/D,IAAA,eAAe;IAEf,QAAQ,GAAA;QACd,OAAO,gCAAgC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;IACnE;IAEQ,WAAW,GAAG,KAAK;AACnB,IAAA,qBAAqB;IACrB,UAAU,GAAG,KAAK;IAClB,YAAY,GAAG,CAAC;IAExB,WAAA,CAAmB,IAAY,EAAU,IAAgB,EAAA;QAAtC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAAkB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAgB;AAE7D,IAAA,eAAe,CAAC,IAQf,EAAA;AACC,QAAA,MAAM,KAAK,GAAG,CAAC,KAAc,KAAI;YAC/B,MAAM,OAAO,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;YACxC,OAAO,OAAO,GAAG,OAAO,GAAG,SAAS;AACtC,QAAA,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG;YACpB,GAAG,IAAI,CAAC,cAAc;YACtB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,CAAC,WAAW;AAChE,YAAA,OAAO,EAAE;AACP,gBAAA,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO;AAC9B,gBAAA,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;AAC3D,gBAAA,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI;AAClE,aAAA;AACD,YAAA,UAAU,EAAE;AACV,gBAAA,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU;gBACjC,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;gBAC/C,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;AACtD,aAAA;AACD,YAAA,UAAU,EAAE;AACV,gBAAA,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU;gBACjC,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;gBAC/C,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;AACrD,gBAAA,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI;AACzC,gBAAA,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG;AACxC,aAAA;SACF;IACH;IAEA,IAAI,GAAA;;;AAGF,QAAA,MAAM,MAAM,GACV,CAAC,OAAO,GAAG,KAAK,WAAW,GAAI,GAAW,GAAG,SAAS;AACrD,YAAA,MAAc,EAAE,GAAG;YACnB,MAAc,EAAE,SAAS;QAC5B,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE;AAC9B,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;AAC/B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAU;AAC9B,YAAA,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE;AACvC,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,GAAG,EAAE,CAAC,SAAc,KAAI;;oBAEtB,OAAO,MAAM,CAAC,OAAO;AACrB,oBAAA,MAAM,CAAC,OAAO,GAAG,SAAS;;oBAE1B,IAAI,CAAC,QAAQ,EAAE;gBACjB,CAAC;AACF,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC;QACvB;aAAO;AACL,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;AACrC,YAAA,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE;gBACzB,IAAI,CAAC,YAAY,EAAE;gBACnB,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC;YACpC;QACF;IACF;AAEA,IAAA,KAAK,CAAC,QAAgB,EAAE,QAAgB,EAAE,OAAO,GAAG,CAAC,EAAA;AACnD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,IAAI,CAAC,IAAI,EAAE;QACb;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACb,YAAA,IAAI,OAAO,GAAG,CAAC,EAAE;AACf,gBAAA,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;gBAClE;YACF;AACA,YAAA,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC;YAC3D;QACF;AACA,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI;;QAG1B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE;AACtD,QAAA,MAAM,MAAM,GAAG;YACb,GAAG,IAAI,CAAC,cAAc;AACtB,YAAA,OAAO,EAAE;AACP,gBAAA,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO;AAC9B,gBAAA,aAAa,EAAE,aAAa;AAC7B,aAAA;SACF;;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE;YACtD,OAAQ,MAAc,CAAC,UAAU;QACnC;AACA,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE;YACtD,OAAQ,MAAc,CAAC,UAAU;QACnC;AACA,QAAA,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,MAAM,CAAC;AAExC,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CACpD,MAAM,EACN,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,wBAAwB,EAC7B,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAC9B,IAAI,CAAC,kBAAkB,CACxB;AACD,QAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;AAE7D,QAAA,IAAI,oBAAoB,KAAK,2BAA2B,EAAE;AACxD,YAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;QACrC;AAEA,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjE,QAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;AAEzD,QAAA,IAAI,kBAAkB,KAAK,uBAAuB,EAAE;AAClD,YAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACjC;aAAO;AACL,YAAA,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/B;QAEA,MAAM,cAAc,GAAG,MAAM;QAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC;AAClD,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAC3B;AAEQ,IAAA,kBAAkB,CAAC,KAAa,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAA,kBAAA,CAAoB,CAAC;YAChD;QACF;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAU;QAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3C,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,UAAU,CAC3C;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QAC3C,MAAM,YAAY,GAAG;cACjB,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,CACtC,CAAC,GAAG,KAAK,GAAG,KAAK,aAAa,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,UAAU;cAErE,EAAE;QACN,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAC5E,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,KAAK,8BAA8B,EAAE;AACzD,gBAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5B,gBAAA,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,EAAE;AAC1D,aAAA,CAAC;YACF;QACF;IACF;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC;YACrD;QACF;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;IACnB;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,GAAW,EAAE,OAAO;AAC1C,QAAA,MAAM,EAAE,GAA0B,OAAO,EAAE,EAAE;QAC7C,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;AAC3C,YAAA,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;YACxF,IAAI,CAAC,MAAM,EAAE;YACb;QACF;QACA,MAAM,EAAE,GACN,OAAO,MAAM,KAAK,WAAW,IAAI,YAAY,IAAI;AAC/C,cAAE,MAAM,CAAC,UAAU;AACnB,cAAE,CAAA,OAAA,EAAU,IAAI,CAAC,GAAG,EAAE,EAAE;AAC5B,QAAA,EAAE,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC;AACb,YAAA,QAAQ,EAAE,eAAe;YACzB,EAAE;AACF,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC,CACH;IACH;IAEA,wBAAwB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE;IAC5C;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,UAAiB,KAAI;AAC3C,YAAA,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,UAAU,CAAC;AAC5C,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,YAAY,CAAC,SAAc,EAAA;AACzB,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,SAAS,CAAC;AAC1C,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;IAClC;IAEO,MAAM,QAAQ,CAAC,WAAmB,EAAA;AAEvC,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE;QACvB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,IAAI,CAC9C,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAClC;QACD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC;AACtD,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE;AACtD,YAAA,OAAO,EAAE,EAAE,mBAAmB,EAAE,OAAO,EAAE;AAC1C,SAAA,CAAC;QAEF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;AACzC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE;QAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;AAE1B,QAAA,OAAO,QAAQ;IACjB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC;YACvC;QACF;;QAGA,IAAI,UAAU,GAA2B,IAAI;AAC7C,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC5D,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE;gBACxD,UAAU,GAAG,IAAuB;gBACpC;YACF;QACF;QAEA,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,CAAC,KAAK,CACX,8CAA8C,EAC9C,IAAI,CAAC,YAAY,CAClB;YACD;QACF;;QAGA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,SAAS,EAAE;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC9C,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC;;AAG7C,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI;;AAGjC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AACrD,QAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC;IAC3C;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;AACzD,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAC/C;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AACrD,QAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC;IAC3C;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;AACzD,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAC/C;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC;AAC7D,QAAA,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,cAAc,CAAC;IACnD;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC;AAC3D,QAAA,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,aAAa,CAAC;IACjD;IAEA,YAAY,CAAC,MAAc,EAAE,IAAY,EAAA;AACvC,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAC5C,MAAM,EACN,IAAI,CAAC,YAAY,EACjB,IAAI,CACL;AACD,QAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;QACrD,IAAI,gBAAgB,EAAE;YACpB,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI;AACzD,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,gBAAA,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;AACtC,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,OAAO,EAAE,oBAAoB;AAC9B,aAAA,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,gBAAA,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;AACtC,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,oBAAoB;AAC9B,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,QAAQ,CAAC,KAAsB,EAAA;AAC7B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;AAChE,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAC/C;IAEA,UAAU,GAAA;QACR,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,IAAI,IAAI;QAC5D,IAAI,MAAM,GAAG,cAAc,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;QAExD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;gBACnD,IAAI,OAAO,EAAE;AACX,oBAAA,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE;oBAC5B;gBACF;YACF;QACF;QAEA,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC;YAC9C;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;QAC1B,IAAI,CAAC,YAAY,EAAE;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAClD,QAAA,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,cAAc,CAAC;QAEjD,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,qBAAqB,EAAE;QAC9B;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;AACzD,QAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAC/C;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/D,QAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,eAAe,CAAC;IACrD;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI;IAC5B;AAEA,IAAA,UAAU,CAAC,EAAU,EAAA;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;IACnB;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU;AAC1B,aAAA,GAAG,CAAC,QAAQ,EAAE,SAAS;AACvB,aAAA,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAEvE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CACvE,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,QAAQ,CAAC,EAC/D,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CACjE;IACH;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU;AAC1B,aAAA,GAAG,CAAC,QAAQ,EAAE,SAAS;AACvB,aAAA,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAEvE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CACvE,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,QAAQ,CAAC,EAC/D,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CACjE;IACH;IAEA,gBAAgB,GAAA;QACd,WAAW,CAAC,MAAK;AACf,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC;YAC7D,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;YAEvE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAClE,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,QAAQ,CAAC,EACjE,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CACzD;AACH,QAAA,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACnB;AAEA,IAAA,kBAAkB,GAAG,CAAC,gBAAqB,KAAU;AACnD,QAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;AACvD,IAAA,CAAC;AAED,IAAA,wBAAwB,GAAG,CAAC,sBAA2B,KAAU;;AAE/D,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACtD,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,sBAAsB,CAAC;QACjE,IAAI,sBAAsB,EAAE,MAAM,KAAK,UAAU,CAAC,aAAa,EAAE;AAC/D,YAAA,MAAM,GAAG,GAAS,IAAI,CAAC,GAAW,CAAC,OAAO;AAC1C,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,YAAA,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE;gBACjB,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAK;AACnC,oBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;AACzC,gBAAA,CAAC,CAAC;YACJ;QACF;QAEA,IAAI,sBAAsB,EAAE,MAAM,KAAK,UAAU,CAAC,YAAY,EAAE;;;AAG9D,YAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACzB;AAEF,IAAA,CAAC;AAED,IAAA,kBAAkB,GAAG,CAAC,gBAAqB,KAAU;AACnD,QAAA,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,gBAAgB,CAAC;AACrD,QAAA,IAAI,gBAAgB,CAAC,MAAM,IAAI,6BAA6B,EAAE;AAC5D,YAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC;QAChD;aAAO;YACL,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,gBAAgB,CAAC,MAAM,CAAC;QAC1E;AACF,IAAA,CAAC;IAED,0BAA0B,CAAC,MAAc,EAAE,OAAY,EAAA;QACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAClD,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,KAAK,IAAI,CAC3B;QACD,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAoB,CAAC,GAAG,OAAO;YACxD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;;AAExC,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,gBAAA,IAAI,CAAC,YAAY,GAAG,MAAM;YAC5B;QACF;aAAO;AACL,YAAA,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;QAC7C;IACF;AAEA,IAAA,gBAAgB,CAAC,MAAc,EAAA;AAC7B,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC5D,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,KAAK,MAAM,EAAE;AAC7C,gBAAA,OAAO,IAAuB;YAChC;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,eAAe,CAAC,MAAc,EAAA;AAC5B,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACxD,YAAA,IAAI,GAAG,EAAE,SAAS,EAAE,KAAK,MAAM,EAAE;AAC/B,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAuB,CAAC,GAAG,IAAI;AAC9C,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;gBAClC;YACF;QACF;IACF;AAEA,IAAA,eAAe,CAAC,OAAY,EAAA;AAC1B,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,gCAAA,EAAmC,OAAO,EAAE,SAAS,EAAE,CAAA,CAAE,EACzD,OAAO,CACR;AACD,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,gCAAA,EAAmC,OAAO,EAAE,SAAS,EAAE,CAAA,CAAE,EACzD,OAAO,CACR;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE;AACxC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,EAAE;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE;QACzC;QACA,QAAQ,KAAK;YACX,KAAK,SAAS,CAAC,SAAS;gBACtB,IAAI,CAAC,YAAY,EAAE;gBACnB;YACF,KAAK,SAAS,CAAC,MAAM;YACrB,KAAK,SAAS,CAAC,YAAY;AACzB,gBAAA,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC;gBAC/D,IAAI,CAAC,YAAY,EAAE;gBACnB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;;AAEzC,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzB,wBAAA,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;wBAC3B,KAAK,EAAE,SAAS,CAAC,YAAY;AAC9B,qBAAA,CAAC;AACJ,gBAAA,CAAC,CAAC;gBACF;YACF,KAAK,SAAS,CAAC,aAAa;gBAC1B,OAAO,CAAC,KAAK,CACX,iBAAiB,EACjB,OAAO,CAAC,eAAe,EAAE,EACzB,OAAO,CAAC,aAAa,EAAE,EACvB,OAAO,CAAC,SAAS,EAAE,CACpB;gBACD;AACF,YAAA;AACE,gBAAA,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC;;IAE1C;IAEA,SAAS,GAAA;QACP,IAAI,cAAc,GAAkB,IAAI;;AAGxC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACxD,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE;gBAClD,cAAc,GAAG,GAAG;gBACpB;YACF;QACF;QAEA,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC;YAC3C;QACF;;AAGA,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACxD,IAAI,GAAG,KAAK,cAAc;gBAAE;YAC5B,IAAI,IAAI,EAAE;gBACR,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAiC,CAAC;gBAErE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;gBAEzC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAEnC,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE;gBACpC;YACF;QACF;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC;IACnD;AAEO,IAAA,UAAU,CAAC,UAA2B,EAAA;;QAE3C,IAAI,cAAc,GAA2B,IAAI;AACjD,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACxD,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,YAAY,EAAE;gBAClD,cAAc,GAAG,GAAsB;gBACvC;YACF;QACF;QAEA,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC;YACvD;QACF;;AAGA,QAAA,IAAI,UAAU,KAAK,cAAc,EAAE;YACjC;QACF;;QAGA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,mBAAmB,UAAU,CAAA,yBAAA,CAA2B,CAAC;YACtE;QACF;;QAGA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;;QAGzC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;;AAGzC,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,SAAS,EAAE;IAC5C;AAEO,IAAA,cAAc,CAAC,UAA2B,EAAA;;QAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,0BAA0B,UAAU,CAAA,SAAA,CAAW,CAAC;YAC7D;QACF;;AAGA,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE;;QAGrC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC9C,QAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,YAAY,CAAC;;AAGvD,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI;;AAGjC,QAAA,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE;AAChC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;AAGO,IAAA,OAAO,CAAC,QAAa,EAAA;;AAE1B,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;;QAGpD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;;QAGvE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,QAAQ,EAAE;YACzD,MAAM;YACN,OAAO;AACR,SAAA,CAAC;IACJ;IAEO,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,OAAO,CAAC,SAAS,EAAE;IAC5B;AAEO,IAAA,MAAM,YAAY,GAAA;AACvB,QAAA,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;AAC1D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;QAC9B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC;QACrD;IACF;;AAEQ,IAAA,oBAAoB,CAAC,OAAe,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC;YAC5C;QACF;AACA,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,GAAW,CAAC,OAAO;QACzC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;AAC3B,YAAA,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC;YAClD;QACF;AAEA,QAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC;AACjD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,MAAM,EAAE,GAAG,OAAO,CAAC,EAAe;QAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAEjC,QAAA,EAAE,CAAC,IAAI,GAAG,CAAC,GAAyB,KAAI;;AAEtC,YAAA,IAAI;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAa,CAAC;AACrC,gBAAA,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,IAAI,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE;AAChE,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,GAAG,CAAC,OAAO,CAAA,EAAA,CAAI,EAAE,GAAG,CAAC,MAAM,CAAC;gBACnE;YACF;YAAE,OAAO,CAAC,EAAE;;YAEZ;AAEA,YAAA,OAAO,QAAQ,CAAC,GAAG,CAAC;AACtB,QAAA,CAAC;IACH;AAEO,IAAA,MAAM,sBAAsB,CACjC,WAAmB,EACnB,UAAkB,EAAA;;AAGlB,QAAA,MAAM,IAAI,CAAC,UAAU,EAAE;AAEvB,QAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;;QAGrC,MAAM,QAAQ,GAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAW,CAAC,IAAI,CAC9C,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAClC;QACD,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC;AAC5C,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QACvD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;AACzC,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE;QAClC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;AACxC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;AAC1B,QAAA,OAAO,QAAQ;IACjB;IAEO,mBAAmB,CAAC,MAAc,EAAE,IAA0B,EAAA;;AAEnE,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;;AAGvC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;AAClE,QAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC;QACvC,IAAI,GAAG,EAAE;YACP,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI;AACzD,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,gBAAA,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;AACtC,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,OAAO,EAAE,oBAAoB;AAC9B,aAAA,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,gBAAA,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,SAAS;AACtC,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,oBAAoB;AAC9B,aAAA,CAAC;QACJ;IACF;AAEO,IAAA,yBAAyB,CAAC,MAAc,EAAA;QAC7C,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,wBAAwB,KAAK,MAAM,EAAE;AAC7E,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI;AACpC,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,KAAK;IACd;IAEQ,QAAQ,GAAA;;AAEd,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,MAAM,OAAO,GAAI,IAAI,CAAC,GAAW,CAAC,OAAO;AACzC,QAAA,MAAM,EAAE,GAAc,OAAO,CAAC,EAAE;QAChC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAEjC,QAAA,EAAE,CAAC,IAAI,GAAG,CAAC,IAA0B,KAAI;AACvC,YAAA,IAAI;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC;AACtC,gBAAA,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,IAAI,GAAG,CAAC,OAAO,KAAK,cAAc,EAAE;;oBAEhE,GAAG,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO;oBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AACnC,oBAAA,OAAO,QAAQ,CAAC,OAAO,CAAC;gBACpB;YACF;AAAE,YAAA,MAAM;;YAER;AACA,YAAA,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,QAAA,CAAC;IACH;;AAIO,IAAA,MAAM,UAAU,GAAA;;AAErB,QAAA,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE;YACnE,OAAO,IAAI,CAAC,eAAe;QAC7B;;QAGA,MAAM,KAAK,GACT,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;AAEvG,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC;AAEnE,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM;;AAGxB,QAAA,MAAc,CAAC,mBAAmB,GAAG,MAAM;;AAG5C,QAAA,IAAI;YACF,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AACzC,YAAA,CAAC,CAAC,KAAK,GAAG,IAAI;AACd,YAAA,CAAC,CAAC,QAAQ,GAAG,IAAI;AACjB,YAAA,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;AACxB,YAAA,CAAC,CAAC,SAAS,GAAG,MAAM;AACpB,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5B,YAAA,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAK,EAAG,CAAC,CAAC;;QAEjC;QAAE,MAAM,EAAE;AAEV,QAAA,OAAO,MAAM;IACf;uGAj7BW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MC7FrB,cAAc,CAAA;AAML,IAAA,UAAA;AALZ,IAAA,aAAa;;AAGb,IAAA,OAAgB,gBAAgB,GAAG,UAAU,CAAC,gBAAgB;AAEtE,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAAe;AAEtC,IAAA,MAAM,eAAe,GAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvB,YAAA,IAAI,CAAC,aAAa,GAAG,MAAM,aAAa,CACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAQ,cAAc,CAAC,gBAAgB,CAAC,CAC5D;QACH;QACA,OAAO,IAAI,CAAC,aAAa;IAC3B;IAEA,MAAM,yBAAyB,CAC7B,kBAA0B,EAAA;AAE1B,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAC7B,CAAC,CAAM,KAAK,CAAC,CAAC,WAAW,KAAK,kBAAkB,CACjD;IACH;IAEA,MAAM,yBAAyB,CAC7B,WAAmB,EAAA;AAEnB,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;IACrE;uGA/BW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCCY,wBAAwB,CAAA;AACf,IAAA,UAAA;AAApB,IAAA,WAAA,CAAoB,UAAsB,EAAA;QAAtB,IAAA,CAAA,UAAU,GAAV,UAAU;IAAe;AAE7C,IAAA,MAAM,iBAAiB,CAAC,WAAmB,EAAE,GAAa,EAAA;QACxD,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC;QAClE,MAAM,WAAW,GAAG;cAChB,CAAA,EAAG,UAAU,CAAC,qBAAqB,IAAI,kBAAkB,CACvD,qBAAqB,CACtB,CAAA;cACD,CAAA,EAAG,UAAU,CAAC,wBAAwB,CAAA,CAAA,EAAI,kBAAkB,CAC1D,qBAAqB,CACtB,CAAA,CAAE;AAEP,QAAA,MAAM,qBAAqB,GAAG,MAAM,aAAa,CAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CACjC;;AAGD,QAAA,OAAO,qBAAqB;IAC9B;AAEQ,IAAA,kBAAkB,CAAC,WAAmB,EAAA;QAC5C,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACnD,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE;AACnC,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC/B,OAAO,CAAA,CAAA,EAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAClC;AACA,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC9B,YAAA,OAAO,UAAU;QACnB;QAEA,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,yBAAyB,IAAI,EAAE;AAC5D,aAAA,QAAQ;AACR,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,MAAM;QACf;QAEA,IAAI,KAAK,GAAG,MAAM;AAClB,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC/C,YAAA,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB;AAEA,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;YACjC,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;QACpB;AACA,QAAA,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,EAAG,KAAK,EAAE;IAClC;uGAnDW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFvB,MAAM,EAAA,CAAA;;2FAEP,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,qBAAqB,CAAA;AAKZ,IAAA,mBAAA;AAJpB,IAAA,OAAO;AACP,IAAA,KAAK;AACL,IAAA,gBAAgB;AAEhB,IAAA,WAAA,CAAoB,mBAAkD,EAAA;QAAlD,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO;QAC/C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC,gBAAgB;IACnE;IAEA,eAAe,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE;IACnD;IAEA,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;IAC5C;IAEA,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;IAC5C;IACA,yBAAyB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE;IACnD;IAEA,WAAW,GAAA;;AAET,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;IAC/C;IAEA,0BAA0B,GAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE;AAC3B,YAAA,MAAM,GAAG,GAAQ,IAAI,KAAK,CAAC,CAAA,sBAAA,CAAwB,CAAC;AACpD,YAAA,GAAG,CAAC,MAAM,GAAG,GAAG;AAChB,YAAA,MAAM,GAAG;QACX;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE;QACxC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,MAAM,GAAG,GAAQ,IAAI,KAAK,CAAC,CAAA,aAAA,CAAe,CAAC;AAC3C,YAAA,GAAG,CAAC,MAAM,GAAG,GAAG;AAChB,YAAA,MAAM,GAAG;QACX;AAEA,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE;IACnD;IAGA,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;IAC7C;uGAnDW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,6BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCEY,qBAAqB,CAAA;AAItB,IAAA,IAAA;AACA,IAAA,qBAAA;AAJF,IAAA,SAAS,GAAG,IAAI,GAAG,EAAkB;IAE7C,WAAA,CACU,IAAgB,EAChB,qBAA4C,EAAA;QAD5C,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;IAC3B;IAEJ,MAAM,aAAa,CACjB,QAAgB,EAChB,IAAI,GAAG,EAAE,EACT,WAA8B,EAAA;AAE9B,QAAA,MAAM,IAAI,GAAG;YACX,IAAI;AACJ,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,IAAI,EAAE;AACJ,gBAAA;AACE,oBAAA,cAAc,EAAE;AACd,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,OAAO,EAAE,OAAO;AACjB,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,GAAG,EAAE;AACH,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE;AACN,wBAAA,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;AAC/B,wBAAA,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;AACjC,wBAAA;AACE,4BAAA,IAAI,EAAE;AACJ,gCAAA,MAAM,EAAE;AACN,oCAAA,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE;AACtC,oCAAA,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;AAC9B,oCAAA,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE;AAC/C,iCAAA;AACD,gCAAA,oBAAoB,EAAE,CAAC;AACxB,6BAAA;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF;QACD,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1C,YAAA,IAAY,CAAC,YAAY,GAAG,WAAW;QAC1C;AAEA,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC;IAEA,MAAM,aAAa,CACjB,QAAgB,EAChB,WAAmB,EACnB,IAAI,GAAG,EAAE,EAAA;AAET,QAAA,MAAM,IAAI,GAAG;YACX,IAAI;AACJ,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,IAAI,EAAE;AACJ,gBAAA;AACE,oBAAA,cAAc,EAAE;AACd,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,OAAO,EAAE,OAAO;AACjB,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,GAAG,EAAE;AACH,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE;AACN,wBAAA,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;AAC/B,wBAAA,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;AAClC,qBAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA;AACE,4BAAA,IAAI,EAAE;AACJ,gCAAA,MAAM,EAAE;AACN,oCAAA;AACE,wCAAA,mBAAmB,EAAE;AACnB,4CAAA,KAAK,EAAE,WAAW;AAClB,4CAAA,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC3C,4CAAA,gBAAgB,EAAE,KAAK;AACxB,yCAAA;AACF,qCAAA;AACD,oCAAA;AACE,wCAAA,QAAQ,EAAE;AACR,4CAAA,gBAAgB,EAAE;AAChB,gDAAA,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;AACvC,gDAAA,gBAAgB,EAAE,IAAI;AACvB,6CAAA;AACF,yCAAA;AACF,qCAAA;AACF,iCAAA;AACD,gCAAA,oBAAoB,EAAE,CAAC;AACxB,6BAAA;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF;AAED,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC;AAEA,IAAA,MAAM,cAAc,CAClB,QAAgB,EAChB,KAAa,EACb,IAAI,GAAG,EAAE,EACT,IAAI,GAAG,CAAC,EAAA;AAER,QAAA,MAAM,IAAI,GAAG;YACX,IAAI;AACJ,YAAA,gBAAgB,EAAE,IAAI;AACtB,YAAA,IAAI,EAAE;AACJ,gBAAA;AACE,oBAAA,cAAc,EAAE;AACd,wBAAA,KAAK,EAAE,KAAK;AACZ,wBAAA,OAAO,EAAE,OAAO;AACjB,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,GAAG,EAAE;AACH,wBAAA,KAAK,EAAE,KAAK;AACb,qBAAA;AACF,iBAAA;AACF,aAAA;AACD,YAAA,KAAK,EAAE;AACL,gBAAA,IAAI,EAAE;AACJ,oBAAA,MAAM,EAAE;AACN,wBAAA,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;AAC/B,wBAAA,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;AAClC,qBAAA;AACD,oBAAA,IAAI,EAAE;AACJ,wBAAA;AACE,4BAAA,IAAI,EAAE;AACJ,gCAAA,MAAM,EAAE;AACN,oCAAA;AACE,wCAAA,mBAAmB,EAAE;4CACnB,KAAK;AACL,4CAAA,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC3C,4CAAA,gBAAgB,EAAE,KAAK;AACxB,yCAAA;AACF,qCAAA;AACD,oCAAA;AACE,wCAAA,QAAQ,EAAE;AACR,4CAAA,gBAAgB,EAAE;AAChB,gDAAA,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AACjC,gDAAA,gBAAgB,EAAE,IAAI;AACvB,6CAAA;AACF,yCAAA;AACF,qCAAA;AACF,iCAAA;AACD,gCAAA,oBAAoB,EAAE,CAAC;AACxB,6BAAA;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;AACF,aAAA;SACF;AAED,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;IAChC;IAEA,aAAa,CAAC,QAAgB,EAAE,WAAmB,EAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;IACxC;IAEA,MAAM,iBAAiB,CACrB,QAAgB,EAChB,WAAmB,EACnB,IAAI,GAAG,EAAE,EAAA;QAET,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC;QACxD,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,MAAM;QACf;AACA,QAAA,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC;QACtE,MAAM,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;AAChC,QAAA,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,IAAI;AAC/B,QAAA,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;QAC3D,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC;AACjE,YAAA,OAAO,OAAO;QAChB;AACA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,YAAY,CAAC,IAAY,EAAA;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE;AAC9D,QAAA,MAAM,OAAO,GAAG,KAAK,GAAG,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,EAAE,GAAG,SAAS;AACxE,QAAA,OAAO,aAAa,CAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CACtE;IACH;IAEQ,QAAQ,CAAC,QAAgB,EAAE,WAAmB,EAAA;AACpD,QAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,EAAE;IACrC;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;QAC/C,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,GAAG;QACZ;AACA,QAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,CAAA,EAAG,OAAO,GAAG;IACxD;uGAvNW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCSrB,oBAAoB,CAAA;AAWX,IAAA,IAAA;AAVX,IAAA,IAAI;IACb,eAAe,GAAqB,EAAE;IACtC,WAAW,GAAG,EAAE;IAChB,iBAAiB,GAAG,EAAE;IACtB,cAAc,GAAG,KAAK;IACtB,kBAAkB,GAAG,EAAE;IACvB,sBAAsB,GAAG,KAAK;IAC9B,sBAAsB,GAAG,KAAK;AACb,IAAA,gBAAgB,GAAG,UAAU,CAAC,2BAA2B;AAE1E,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAe;IAEvC,QAAQ,GAAA;QACN,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI;YACrC,IAAI,CAAC,IAAI,EAAE,SAAS;AACpB,YAAA,IAAI;AACN,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;IAClD;IAEA,cAAc,GAAA;AACZ,QAAA,QACE,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI;AAClC,YAAA,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI;YAC/C,IAAI,CAAC,IAAI,EAAE,WAAW;AACtB,YAAA,SAAS;IAEb;IAEA,QAAQ,GAAA;AACN,QAAA,QACE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,qBAAqB;YAC7C,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,sBAAsB,CAAC;YACnE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC;YAC3D,IAAI,CAAC,IAAI,EAAE,WAAW;AACtB,YAAA,EAAE;IAEN;AAEA,IAAA,oBAAoB,CAAC,IAAoB,EAAA;AACvC,QAAA,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;AACnD,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE;AACpC,QAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAClC,YAAA,OAAO,IAAI,IAAI,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,SAAS;QACtD;AACA,QAAA,IAAI,UAAU,KAAK,OAAO,EAAE;AAC1B,YAAA,OAAO,OAAO;QAChB;QACA,OAAO,GAAG,IAAI,SAAS;IACzB;AAEA,IAAA,MAAM,gBAAgB,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,IAAI,IAAI,CAAC,cAAc,EAAE;YAC3D;QACF;AACA,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAC5B,QAAA,IAAI;YACF,MAAM,aAAa,GAAG,MAAM,aAAa,CACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CACxE;AACD,YAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,YAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;AACnE,YAAA,MAAM,GAAG,GAAQ,MAAM,aAAa,CAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAChD;YACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,UAAU,CAAC;AAChE,YAAA,IAAI,CAAC,WAAW,GAAG,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,GAAG,CAAC,OAAO,GAAG,EAAE;AACtE,YAAA,IAAI,CAAC,iBAAiB,GAAG,OAAO,GAAG,EAAE,iBAAiB,KAAK,QAAQ,GAAG,GAAG,CAAC,iBAAiB,GAAG,EAAE;AAChG,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;QACpC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC;AACxD,YAAA,IAAI,CAAC,kBAAkB,GAAG,2CAA2C;QACvE;gBAAU;AACR,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC7B;IACF;AAEQ,IAAA,mBAAmB,CAAC,KAAU,EAAA;QACpC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO;iBACJ,KAAK,CAAC,OAAO;iBACb,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;iBACzB,MAAM,CAAC,OAAO;AACd,iBAAA,GAAG,CAAC,CAAC,IAAI,KAAI;gBACZ,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC1C,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;AACvD,YAAA,CAAC,CAAC;QACN;AACA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,OAAO;AACJ,iBAAA,GAAG,CAAC,CAAC,KAAK,KAAI;AACb,gBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC3C,oBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;gBACvD;AACA,gBAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBACtC,OAAO;wBACL,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;qBACjB;gBACH;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC;iBACA,MAAM,CAAC,OAAO,CAAqB;QACxC;AACA,QAAA,OAAO,EAAE;IACX;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,EAAE,WAAW,EAAE;AAC1D,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,IAAI;AAC3C,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,IAAI;AAC3C,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;AAAE,YAAA,OAAO,IAAI;AAC1C,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,gBAAgB,CAAC,IAAY,EAAA;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC;QAC7D,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;QACnE;QACA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;IAC9B;IAEA,0BAA0B,GAAA;AACxB,QAAA,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,sBAAsB;IAC5D;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,oBAAoB;AAC3C,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,YAAA,IAAI;AACF,gBAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC;AAC3B,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;gBAC7C,IAAI,IAAI,EAAE;AACR,oBAAA,OAAO,IAAI;gBACb;YACF;AAAE,YAAA,MAAM;AACN,gBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBACpC,IAAI,IAAI,EAAE;AACR,oBAAA,OAAO,IAAI;gBACb;YACF;QACF;AACA,QAAA,OAAO,oBAAoB;IAC7B;uGAxJW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,uGChBjC,o9MAoKA,EAAA,MAAA,EAAA,CAAA,65JAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FDpJa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAGhB,KAAK,EAAA,QAAA,EAAA,o9MAAA,EAAA,MAAA,EAAA,CAAA,65JAAA,CAAA,EAAA;;sBAGhB;;;MENU,oBAAoB,CAAA;AAgBX,IAAA,IAAA;AAA0B,IAAA,GAAA;IAfrC,IAAI,GAAwB,MAAM;AAClC,IAAA,QAAQ;AACR,IAAA,OAAO;AACN,IAAA,UAAU,GAAG,IAAI,YAAY,EAAsC;AACnE,IAAA,UAAU,GAAG,IAAI,YAAY,EAAO;AAE7B,IAAA,oBAAoB,GAAG,UAAU,CAAC,oBAAoB;IAEvE,iBAAiB,GAAY,KAAK;IAElC,WAAW,GAAU,EAAE;IACvB,UAAU,GAAG,EAAE;IACf,mBAAmB,GAAgC,YAAY;IAC/D,YAAY,GAAQ,IAAI;IAExB,WAAA,CAAoB,IAAgB,EAAU,GAAsB,EAAA;QAAhD,IAAA,CAAA,IAAI,GAAJ,IAAI;QAAsB,IAAA,CAAA,GAAG,GAAH,GAAG;IAAsB;AAEvE,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,MAAM,IAAI,CAAC,eAAe,EAAE;IAC9B;AAEA,IAAA,eAAe,CAAC,GAAgC,EAAA;AAC9C,QAAA,IAAI,CAAC,mBAAmB,GAAG,GAAG;IAChC;AAEA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAC7B,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAE1D,YAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE;AACxB,gBAAA,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE;oBAC3D,QAAQ;oBACR,MAAM;AACP,iBAAA,CAAC;gBACF;YACF;YAEA,MAAM,QAAQ,GAAQ,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;AACjE,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE;AAElC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAC3B,CAAC,CAAM,EAAE,CAAM,KACb,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CACpE;QAEH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;QACtD;gBAAU;AACR,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;IAEA,cAAc,CAAC,QAAgB,EAAE,OAAe,EAAA;;AAE9C,QAAA,OAAO,aAAa,CAClB,IAAI,CAAC,IAAI,CAAC,GAAG,CACX,CAAA,EAAG,IAAI,CAAC,oBAAoB,4BAA4B,QAAQ,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CACtF,CACF;IACH;IAEA,QAAQ,CAAC,WAAmB,EAAE,IAAa,EAAA;AACzC,QAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,WAAW,CAAC;YAC1E;QACF;QACA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzC;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,cAAc,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC;AAC1D,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,WAAW;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AAC1C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACtC,YAAA,MAAM,KAAK,GACT,IAAI,EAAE,WAAW,EAAE,qBAAqB;AACxC,gBAAA,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC;AACtD,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAAC;gBACzC,IAAI,EAAE,iBAAiB,EAAE,qBAAqB;AAC9C,gBAAA,EAAE;YACJ,MAAM,IAAI,GAAG,IAAI,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE;AAChD,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACvD,YAAA,QACE,CAAC,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,KAAK;gBACtD,KAAK,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7C,gBAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEhD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;IAC9C;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC,aAAa;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;AAC1C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACxC,YAAA,MAAM,KAAK,GACT,IAAI,EAAE,WAAW,EAAE,qBAAqB;AACxC,gBAAA,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC;AACtD,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAAC;gBACzC,IAAI,EAAE,iBAAiB,EAAE,qBAAqB;AAC9C,gBAAA,EAAE;YACJ,MAAM,IAAI,GAAG,IAAI,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE;AAChD,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACvD,YAAA,QACE,CAAC,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,KAAK;gBACtD,KAAK,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7C,gBAAA,IAAI,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AAEhD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;IAC9C;AAEA,IAAA,YAAY,CAAC,IAAS,EAAA;AACpB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;AAEA,IAAA,iBAAiB,CAAC,IAAS,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE;AAE5B,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B;QACF;AAGA,QAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC1B,YAAA,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,IAAI,CAAC;YAC/D;QACF;AACA,QAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,mDAAmD,EAAE,IAAI,CAAC;YACvE;QACF;QACA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzC;AAGQ,IAAA,eAAe,CAAC,IAAS,EAAA;QAC/B,MAAM,KAAK,GAAG,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AAClE,QAAA,QACE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC;AAC7B,YAAA,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,qBAAqB,CAAC;YAC/C,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAC;AAC7D,YAAA,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC;YACxB,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAC;AACnE,YAAA,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,qBAAqB,CAAC;AACrD,YAAA,IAAI;IAER;AAEQ,IAAA,WAAW,CAAC,IAAS,EAAA;AAC3B,QAAA,MAAM,IAAI,GACR,IAAI,EAAE,WAAW,EAAE,IAAI;YACvB,IAAI,EAAE,iBAAiB,EAAE,IAAI;YAC7B,IAAI,EAAE,IAAI;QACZ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;QACpB;AACA,QAAA,OAAO,SAAS;IAClB;AAEQ,IAAA,sBAAsB,CAAC,KAAU,EAAA;AACvC,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC;IACnC;IAEQ,sBAAsB,GAAA;QAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;AAC/C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;AAC1B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAC9B,OAAO,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,QAAQ,IAAI,SAAS;QACpD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;IAEQ,oBAAoB,GAAA;QAC1B,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;AAC7C,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,SAAS;AAC1B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAC9B,OAAO,MAAM,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,IAAI,SAAS;QAClD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,SAAS;QAClB;IACF;AAEA,IAAA,eAAe,CAAC,IAAS,EAAA;AACvB,QAAA,OAAO,CACL,IAAI,EAAE,WAAW,EAAE,IAAI;YACvB,IAAI,EAAE,iBAAiB,EAAE,IAAI;YAC7B,IAAI,EAAE,WAAW,EAAE,qBAAqB;AACxC,YAAA,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,sBAAsB,CAAC;AAC9D,YAAA,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC;AACtD,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,EAAE,EACF,QAAQ,EAAE;IACd;AAEA,IAAA,aAAa,CAAC,IAAS,EAAA;AACrB,QAAA,MAAM,WAAW,GACf,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,IAAI,EAAE,iBAAiB,EAAE,IAAI,IAAI,EAAE;QAChE,IAAI,WAAW,EAAE;AACf,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;QACtC;QACA,MAAM,IAAI,GACR,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI;AAChC,YAAA,IAAI,EAAE,WAAW,EAAE,iBAAiB,GAAG,cAAc,CAAC;AACtD,YAAA,EAAE;AACJ,QAAA,IAAI,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC1C,QAAA,OAAO,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAC7C;AAEQ,IAAA,WAAW,CAAC,IAAY,EAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACtD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;QACjE,OAAO,CAAA,EAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,WAAW,EAAE;IACpE;AAEQ,IAAA,WAAW,CAAC,KAAY,EAAA;QAC9B,MAAM,MAAM,GAA2C,EAAE;QACzD,IAAI,YAAY,GAAG,EAAE;QACrB,IAAI,YAAY,GAA2C,IAAI;AAE/D,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC;AACnD,YAAA,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,YAAY,EAAE;gBAC3C,YAAY,GAAG,KAAK;gBACpB,YAAY,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;YAC3B;AACA,YAAA,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,eAAe,CAAC,EAAU,EAAA;AAChC,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,IAAI,EAAE;AAC3C,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;QAC5B,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEtC,QAAA,MAAM,SAAS,GAAG,CAAC,CAAO,EAAE,CAAO,KACjC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE;AACnC,YAAA,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE;YAC7B,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;AAE7B,QAAA,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;AAAE,YAAA,OAAO,OAAO;AAC1C,QAAA,IAAI,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC;AAAE,YAAA,OAAO,WAAW;AAClD,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;AACtC,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,IAAI,EAAE,SAAS;AAChB,SAAA,CAAC;IACJ;uGA/RW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,kNCXjC,+vcAyPA,EAAA,MAAA,EAAA,CAAA,0l4CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FD9Oa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAGhB,KAAK,EAAA,QAAA,EAAA,+vcAAA,EAAA,MAAA,EAAA,CAAA,0l4CAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;sBACA;;sBACA;;;MERU,oBAAoB,CAAA;IACtB,IAAI,GAAG,EAAE;IACT,KAAK,GAAG,EAAE;AACT,IAAA,IAAI,GAAG,IAAI,YAAY,EAAS;AAE1C,IAAA,IAAI,QAAQ,GAAA;QACV,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACnE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI;QAC7D;AACA,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;QAC3C;QACA,OAAO,CAAA,EAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,WAAW,EAAE;IACpE;AAEA,IAAA,MAAM,CAAC,EAAS,EAAA;QACd,EAAE,CAAC,eAAe,EAAE;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpB;uGAnBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,kJCRjC,mwBAaA,EAAA,MAAA,EAAA,CAAA,ytBAAA,CAAA,EAAA,CAAA;;2FDLa,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAGhB,KAAK,EAAA,QAAA,EAAA,mwBAAA,EAAA,MAAA,EAAA,CAAA,ytBAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;;MEHU,uBAAuB,CAAA;AACzB,IAAA,OAAO;IAEhB,cAAc,GAAA;AACZ,QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,QAAQ,EAAE;IACrD;IAEA,eAAe,GAAA;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa;AACtD,cAAE,IAAI,CAAC,OAAO,CAAC;cACb,EAAE;AACN,QAAA,OAAO,CACL,MAAM,CAAC,CAAC,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,KAAK;YACnB,IAAI,CAAC,OAAO,EAAE,qBAAqB;AACnC,YAAA,SAAS,EACT,QAAQ,EAAE;IACd;IAEA,SAAS,GAAA;QACP,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;cAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;cACxE,EAAE;AACN,QAAA,OAAO,MAAM;IACf;IAEA,eAAe,GAAA;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa;cACpD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;cAC/E,EAAE;AACN,QAAA,OAAO,MAAM;IACf;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACvE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;AACnC,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;QACjE,OAAO,CAAA,EAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,WAAW,EAAE;IACpE;uGAtCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,gHCRpC,yxEAoEA,EAAA,MAAA,EAAA,CAAA,qoCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAJ,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;2FD5Da,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cAGnB,KAAK,EAAA,QAAA,EAAA,yxEAAA,EAAA,MAAA,EAAA,CAAA,qoCAAA,CAAA,EAAA;;sBAGhB;;;MEOU,iBAAiB,CAAA;AAiBR,IAAA,qBAAA;AAhBX,IAAA,QAAQ;AACI,IAAA,MAAM;AACjB,IAAA,UAAU,GAAG,IAAI,YAAY,EAAsC;IAC7E,QAAQ,GAAkB,EAAE;IAC5B,eAAe,GAAmD,EAAE;IACpE,eAAe,GAAuB,IAAI;IAC1C,UAAU,GAAG,EAAE;IACf,SAAS,GAAG,KAAK;IACjB,KAAK,GAAG,EAAE;IACF,WAAW,GAAG,CAAC;IACf,QAAQ,GAAG,EAAE;IACb,QAAQ,GAAG,CAAC;AACZ,IAAA,WAAW;IACX,OAAO,GAAG,IAAI;IACtB,aAAa,GAAG,KAAK;AAErB,IAAA,WAAA,CAAoB,qBAA4C,EAAA;QAA5C,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;IAA0B;IAEnE,QAAQ,GAAA;QACN,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,UAAU,EAAE;IACnB;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;AAClB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,MAAM,YAAY,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;YACpC;QACF;QACA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE;YACvC;QACF;QACA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC7C,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;QACf,MAAM,OAAO,GAAkB,EAAE;AAEjC,QAAA,IAAI;YACF,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAC7D,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,WAAW,CACjB;AACD,YAAA,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI;YAC5B,MAAM,SAAS,GACb,OAAO,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK;AACjC,kBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;kBACf,IAAI;AACV,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC7C,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;YACtB;iBAAO;AACL,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,oBAAA,MAAM,MAAM,GAAG,GAAG,EAAE,OAAO,IAAI,EAAE;oBACjC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa;0BAC7C,MAAM,CAAC,aAAa,CAAC,MAAM,CACzB,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;0BAE/C,EAAE;AACN,oBAAA,MAAM,KAAK,GACT,MAAM,CAAC,CAAC,CAAC;AACT,wBAAA,MAAM,CAAC,KAAK;AACZ,wBAAA,MAAM,CAAC,qBAAqB;AAC5B,wBAAA,EAAE;oBACJ,IAAI,CAAC,KAAK,EAAE;wBACV;oBACF;AACA,oBAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,SAAS;oBAC/D,OAAO,CAAC,IAAI,CAAC;wBACX,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,KAAK;wBAClC,IAAI;wBACJ,KAAK;AACL,wBAAA,MAAM,EAAE,MAAM;AACf,qBAAA,CAAC;gBACJ;gBACA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI;gBACnE,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;oBACpC,IAAI,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D;AACA,gBAAA,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM;AAC5B,gBAAA,IAAI,SAAS,KAAK,IAAI,EAAE;oBACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,SAAS;gBAC1C;qBAAO;oBACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ;gBAC7C;YACF;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;AAC7C,YAAA,IAAI,CAAC,KAAK,GAAG,yBAAyB;AACtC,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACtB;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC;QAChD;QACA,IAAI,CAAC,WAAW,EAAE;AAClB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACnC,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,CAAC,WAAW,EAAE;YAClB;QACF;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;IAC3B;AAEQ,IAAA,aAAa,CACnB,QAAuB,EAAA;AAEvB,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACzC,YAAA,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC1C,YAAA,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC1C,YAAA,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;AACnC,QAAA,CAAC,CAAC;QAEF,MAAM,MAAM,GAAmD,EAAE;QACjE,IAAI,YAAY,GAAG,EAAE;QACrB,IAAI,YAAY,GAAmD,IAAI;AAEvE,QAAA,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9C,YAAA,IAAI,CAAC,YAAY,IAAI,KAAK,KAAK,YAAY,EAAE;gBAC3C,YAAY,GAAG,KAAK;gBACpB,YAAY,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;AACnC,gBAAA,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;YAC3B;AACA,YAAA,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAClC;AAEA,QAAA,OAAO,MAAM;IACf;IAEQ,WAAW,GAAA;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QACjD,MAAM,QAAQ,GAAG;cACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AAC/B,gBAAA,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC/C,gBAAA,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE;AACjD,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AACpD,YAAA,CAAC;AACH,cAAE,IAAI,CAAC,QAAQ;QACjB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE;IACnB;AAEA,IAAA,WAAW,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;IAChC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;IAC7B;IAEA,aAAa,CAAC,OAAoB,EAAE,EAAU,EAAA;QAC5C,IAAI,EAAE,EAAE;YACN,EAAE,CAAC,eAAe,EAAE;QACtB;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IACtE;IAEQ,MAAM,cAAc,CAAC,IAAY,EAAA;AACvC,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;QACF;AACA,QAAA,MAAM,KAAK,GAAG,EAAE,IAAI,CAAC,WAAW;AAChC,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAC9D,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ,EAAE,EACF,CAAC,CACF;AACD,YAAA,IAAI,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE;gBAC9B;YACF;AACA,YAAA,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI;YAC9B,MAAM,OAAO,GAAkB,EAAE;AAC/B,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,gBAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,oBAAA,MAAM,MAAM,GAAG,GAAG,EAAE,OAAO,IAAI,EAAE;oBACjC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa;0BAC7C,MAAM,CAAC,aAAa,CAAC,MAAM,CACzB,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;0BAE/C,EAAE;AACN,oBAAA,MAAM,KAAK,GACT,MAAM,CAAC,CAAC,CAAC;AACT,wBAAA,MAAM,CAAC,KAAK;AACZ,wBAAA,MAAM,CAAC,qBAAqB;AAC5B,wBAAA,EAAE;oBACJ,IAAI,CAAC,KAAK,EAAE;wBACV;oBACF;AACA,oBAAA,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,SAAS;oBAC/D,OAAO,CAAC,IAAI,CAAC;wBACX,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,KAAK;wBAClC,IAAI;wBACJ,KAAK;AACL,wBAAA,MAAM,EAAE,MAAM;AACf,qBAAA,CAAC;gBACJ;YACF;YACA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QACpD;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC;AAC/C,YAAA,IAAI,CAAC,KAAK,GAAG,2BAA2B;QAC1C;IACF;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE;YAC1B;QACF;AACA,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,IAAI,CAAC,MAAM,EAAE;YACX;QACF;QACA,MAAM,SAAS,GAAG,EAAE;AACpB,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY;AAC9E,QAAA,IAAI,SAAS,IAAI,SAAS,EAAE;YAC1B,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE;YAC1B;QACF;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACzE;QACF;QACA,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa;AACrC,YAAA,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBAChE;YACF;YACA,IAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,YAAY,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,YAAY,EAAE;YACrB;QACF,CAAC,EAAE,CAAC,CAAC;IACP;AAEQ,IAAA,aAAa,CAAC,IAAY,EAAA;AAChC,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AAC1D,QAAA,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,GAAG;IACtD;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,CAAC,WAAW,GAAG,GAAG;AACzE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,CAAC;QAC/C,MAAM,SAAS,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;IAC3B;uGA/QW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAK,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,oPChB9B,0uEAyDA,EAAA,MAAA,EAAA,CAAA,msHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,uBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDzCa,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,KAAK,EAAA,QAAA,EAAA,0uEAAA,EAAA,MAAA,EAAA,CAAA,msHAAA,CAAA,EAAA;;sBAGhB;;sBACA,SAAS;uBAAC,QAAQ;;sBAClB;;;MEJU,iBAAiB,CAAA;AACnB,IAAA,oBAAoB;AACpB,IAAA,qBAAqB;AACrB,IAAA,WAAW;IACX,QAAQ,GAAG,KAAK;AAEf,IAAA,MAAM,GAAG,IAAI,YAAY,EAI/B;AACM,IAAA,cAAc,GAAG,IAAI,YAAY,EAAW;AAC5C,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;IAE3C,WAAW,GAAsB,EAAE;IACnC,YAAY,GAAsB,EAAE;IAEpC,QAAQ,GAAA;AACN,QAAA,IAAI,SAAS,EAAE,YAAY,EAAE;YAC3B,SAAS,CAAC,YAAY,CAAC,gBAAgB,CACrC,cAAc,EACd,IAAI,CAAC,kBAAkB,CACxB;YACD,IAAI,CAAC,iBAAiB,EAAE;QAC1B;aAAO;AACL,YAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC;QAChD;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,QAAQ;QAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IACzC;IAEA,WAAW,GAAA;QACT,SAAS,CAAC,YAAY,CAAC,mBAAmB,CACxC,cAAc,EACd,IAAI,CAAC,kBAAkB,CACxB;IACH;IAEQ,kBAAkB,GAAG,YAA0B;AACrD,QAAA,MAAM,IAAI,CAAC,iBAAiB,EAAE;AAChC,IAAA,CAAC;AAEO,IAAA,MAAM,iBAAiB,GAAA;QAC7B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC/D,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;AACjE,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;;QAGnE,IACE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,oBAAoB,CAAC,EACvE;AACA,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE;QACjE;QAEA,IACE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,qBAAqB,CAAC,EACzE;AACA,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE;QACnE;QAEA,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA,IAAA,WAAW,CAAC,QAA4B,EAAA;AACtC,QAAA,IAAI,CAAC,oBAAoB,GAAG,QAAQ;QACpC,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEA,IAAA,eAAe,CAAC,QAA4B,EAAA;AAC1C,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ;QACrC,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACf,YAAA,YAAY,EAAE,IAAI,CAAC,oBAAoB,IAAI,EAAE;AAC7C,YAAA,aAAa,EAAE,IAAI,CAAC,qBAAqB,IAAI,EAAE;AAC/C,YAAA,YAAY,EAAE,SAAS;AACxB,SAAA,CAAC;IACJ;IAEA,eAAe,CAAC,KAAa,EAAE,MAAuB,EAAA;QACpD,OAAO,MAAM,CAAC,QAAQ;IACxB;uGA1FW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,wTCf9B,8iFAyEA,EAAA,MAAA,EAAA,CAAA,qpFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAP,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,CAAA,EAAA,CAAA;;2FD1Da,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAN7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,cAGZ,KAAK,EAAA,QAAA,EAAA,8iFAAA,EAAA,MAAA,EAAA,CAAA,qpFAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAKA;;sBACA;;;MElBU,sBAAsB,CAAA;AACxB,IAAA,SAAS;IACT,eAAe,GAAG,KAAK;IACvB,mBAAmB,GAAG,KAAK;IAC3B,kBAAkB,GAAG,KAAK;IAC1B,0BAA0B,GAAG,KAAK;IAClC,0BAA0B,GAAG,KAAK;IAClC,mBAAmB,GAAG,KAAK;AAE1B,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;IAE1C,iBAAiB,GAAG,KAAK;IAEzB,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;AAEA,IAAA,eAAe,CAAC,GAAkB,EAAA;AAChC,QAAA,MAAM,WAAW,GAAG;YAClB,OAAO;YACP,WAAW;YACX,WAAW;YACX,YAAY;YACZ,KAAK;YACL,QAAQ;SACT;QACD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACvC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC9C,GAAG,CAAC,cAAc,EAAE;AACpB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,IAAI;IACb;uGAhCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,2aCTnC,yrFA0DA,EAAA,MAAA,EAAA,CAAA,mlvEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAR,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,yHAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sFAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,CAAA,EAAA,CAAA;;2FDjDa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,cAGnB,KAAK,EAAA,QAAA,EAAA,yrFAAA,EAAA,MAAA,EAAA,CAAA,mlvEAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;;MEAU,uBAAuB,CAAA;AAUd,IAAA,IAAA;AATZ,IAAA,QAAQ,GAAG,IAAI,GAAG,EAA4B;IAErC,mBAAmB,GAAG,wBAAwB;IAC9C,kBAAkB,GAAG,YAAY;IACjC,iBAAiB,GAAG,IAAI;IACxB,4BAA4B,GAAG,GAAG;AAElC,IAAA,oBAAoB,GAAG,UAAU,CAAC,oBAAoB;AAEvE,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAe;AAEvC,IAAA,cAAc,CACZ,gBAA6B,EAC7B,iBAA8B,EAC9B,QAAsB,EAAA;AAEtB,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;AAEnC,QAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,EAAE;YAC3C,OAAO,CAAC,IAAI,CACV,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,CAAA,yDAAA,CAA2D,CAC/E;AACD,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE;AACrD,QAAA,MAAM,YAAY,GAAG,iBAAiB,CAAC,cAAc,EAAE;QACvD,OAAO,CAAC,KAAK,CACX,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,oBAAoB,EACvC,CAAA,MAAA,EAAS,WAAW,CAAC,MAAM,EAAE,EAC7B,CAAA,OAAA,EAAU,YAAY,CAAC,MAAM,CAAA,CAAE,CAChC;AACD,QAAA,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YACzD,OAAO,CAAC,IAAI,CACV,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,CAAA,+CAAA,CAAiD,CACrE;AACD,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE;AACvC,QAAA,MAAM,eAAe,GAAG,YAAY,CAAC,4BAA4B,EAAE;QAEnE;aACG,uBAAuB,CAAC,gBAAgB;aACxC,OAAO,CAAC,eAAe,CAAC;QAC3B;aACG,uBAAuB,CAAC,iBAAiB;aACzC,OAAO,CAAC,eAAe,CAAC;AAE3B,QAAA,MAAM,OAAO,GAAqB;YAChC,YAAY;YACZ,eAAe;YACf,QAAQ;AACR,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,UAAU,EAAE,SAAS;SACtB;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;AAC3C,QAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC5B,QAAA,OAAO,OAAO;IAChB;AAEA,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;IAClC;AAEA,IAAA,aAAa,CAAC,MAAc,EAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;AACzC,QAAA,IAAI,CAAC,OAAO;YAAE;AAEd,QAAA,OAAO,CAAC,QAAQ,GAAG,IAAI;AAEvB,QAAA,IAAI,OAAO,CAAC,UAAU,EAAE;AACtB,YAAA,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;AAChC,YAAA,OAAO,CAAC,UAAU,GAAG,SAAS;QAChC;AAEA,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ;QAC5B,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW,EAAE;AACpC,YAAA,IAAI;gBACF,GAAG,CAAC,IAAI,EAAE;AACV,gBAAA,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA,uBAAA,CAAyB,CAAC;YACpD;YAAE,MAAM,EAAC;QACX;QAEA,UAAU,CAAC,MAAK;YACd,IAAI,OAAO,CAAC,YAAY,CAAC,KAAK,KAAK,QAAQ,EAAE;AAC3C,gBAAA,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE;AAC5B,gBAAA,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA,qBAAA,CAAuB,CAAC;YAClD;AACF,QAAA,CAAC,EAAE,IAAI,CAAC,4BAA4B,CAAC;AAErC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B;AAEQ,IAAA,cAAc,CAAC,OAAyB,EAAA;QAC9C,IAAI,OAAO,CAAC,QAAQ;YAAE;QAEtB,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB;cACnE,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,kBAAkB;AAE3B,QAAA,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC;AAChF,QAAA,OAAO,CAAC,QAAQ,GAAG,QAAQ;AAE3B,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE;AAEvC,QAAA,QAAQ,CAAC,eAAe,GAAG,OAAO,GAAc,KAAI;YAClD,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;gBAAE;AAEtC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;AAEhF,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;AACpE,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAC;YAC/E;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,wBAAwB,QAAQ,CAAA,CAAE,EAAE,GAAG,CAAC;YACnF;AACF,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,KAAI;AACzB,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAA,sBAAA,CAAwB,EAAE,GAAG,CAAC;AACzE,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,MAAM,GAAG,MAAK;YACrB,IAAI,OAAO,CAAC,QAAQ;gBAAE;AACtB,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACnD,QAAA,CAAC;QAED,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAA,OAAO,CAAC,KAAK,CACX,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAE,CAC9E;QAED,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;YAC1C,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,KAAK,WAAW,EAAE;gBACvD,QAAQ,CAAC,IAAI,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CACX,CAAA,CAAA,EAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAA,mCAAA,EAAsC,UAAU,CAAA,CAAE,CAC9E;YACH;AACF,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAsB;IACjD;AAEQ,IAAA,MAAM,mBAAmB,CAC/B,QAAsC,EACtC,IAAU,EACV,QAAiB,EAAA;AAEjB,QAAA,IAAI;YACF,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC;YACrE;YAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEjC,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,GAAG,QAAQ;gBACX,WAAW,EAAE,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACrE,QAAQ;AACR,gBAAA,QAAQ,EAAE,IAAI;gBACd,IAAI;aACL;AAED,YAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,oBAAoB,yBAAyB;AACjE,YAAA,MAAM,GAAG,GAAQ,MAAM,aAAa,CAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE;AAC3B,gBAAA,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;AAC/C,gBAAA,YAAY,EAAE,MAAM;AACrB,aAAA,CAAC,CACH;YAED,OAAO;AACL,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,mBAAmB;gBAC5C,KAAK,EAAE,GAAG,EAAE,KAAK;aAClB;QACH;QAAE,OAAO,GAAQ,EAAE;YACjB,OAAO,CAAC,KAAK,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,CAAA,gBAAA,CAAkB,EAAE,GAAG,CAAC;YACzD,OAAO;AACL,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,eAAe;aACzC;QACH;IACF;AAEQ,IAAA,mBAAmB,CAAC,IAAU,EAAA;QACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,YAAA,MAAM,CAAC,OAAO,GAAG,MAAM;AACvB,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAgB,CAAC;AACtD,YAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC5B,QAAA,CAAC,CAAC;IACJ;IAEQ,gBAAgB,CAAC,MAAc,EAAE,OAAe,EAAA;AACtD,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI;AACvB,aAAA,WAAW;AACX,aAAA,OAAO,CAAC,OAAO,EAAE,EAAE;AACnB,aAAA,OAAO,CAAC,GAAG,EAAE,GAAG;AAChB,aAAA,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACf,QAAA,OAAO,GAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,MAAM,OAAO;IACjD;IAEQ,qBAAqB,CAAC,MAAc,EAAE,UAAkB,EAAA;AAC9D,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;AAChE,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AAC/D,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAChD,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,KAAA,CAAO;IACnE;AAEQ,IAAA,6BAA6B,CAAC,KAAa,EAAA;AACjD,QAAA,IAAI,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACxD,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AAC3B,YAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B;AACA,QAAA,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC1B,YAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B;AACA,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACpD,YAAA,MAAM,GAAG,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE;QACxB;AACA,QAAA,OAAO,MAAM;IACf;uGArOW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA;;2FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCsBrB,0BAA0B,CAAA;IAC7B,OAAO,GAAgC,IAAI;AAC3C,IAAA,iBAAiB,GAAG,IAAI,OAAO,EAAqB;AACnD,IAAA,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;IAE3C,WAAW,GAAG,KAAK;IACnB,WAAW,GAAG,IAAI;IAClB,qBAAqB,GAAG,KAAK;IAC7B,mBAAmB,GAAG,KAAK;IAC3B,sBAAsB,GAAG,GAAG;IAC5B,qBAAqB,GAAG,IAAI;IAC5B,iBAAiB,GAAG,EAAE;AACtB,IAAA,aAAa,GAAG,UAAU,CAAC,oBAAoB;AAC/C,IAAA,mBAAmB,GAAG,UAAU,CAAC,0BAA0B;AAC3D,IAAA,aAAa,GAAG,UAAU,CAAC,2BAA2B;AACtD,IAAA,kBAAkB,GAAG,UAAU,CAAC,gCAAgC;AAChE,IAAA,mBAAmB,GAAG,UAAU,CAAC,mBAAmB;AAErE,IAAA,WAAA,GAAA,EAAe;IAEf,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACvC;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE;IACnC;IAEA,MAAM,YAAY,CAChB,MAAc,EACd,WAAwB,EACxB,YAAyB,EACzB,eAAe,GAAG,KAAK,EAAA;QAEvB,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE;AAC5C,YAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;QACnE;QACA,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE;YACnC;QACF;AACA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACvC;QAEA,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE;QACzE,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC;QAC3D;AACA,QAAA,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AACvE,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE;AAC1C,QAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC;AAEvB,QAAA,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC;AAE1C,QAAA,MAAM,OAAO,GAAyB;YACpC,MAAM;YACN,YAAY;YACZ,QAAQ;AACR,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,MAAM,EAAE,KAAK;SACd;AAED,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;QAEtB,MAAM,WAAW,GAAG,YAAY,CAAC,uBAAuB,CAAC,WAAW,CAAC;QACrE,MAAM,YAAY,GAAG,YAAY,CAAC,uBAAuB,CAAC,YAAY,CAAC;QACvE,OAAO,CAAC,OAAO,CAAC,IAAI,CAClB,IAAI,CAAC,mBAAmB,CAAC;YACvB,MAAM;AACN,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,UAAU,EAAE,WAAW;YACvB,YAAY;YACZ,QAAQ;AACR,YAAA,GAAG,EAAE,SAAS;YACd,eAAe;AAChB,SAAA,CAAC,EACF,IAAI,CAAC,mBAAmB,CAAC;YACvB,MAAM;AACN,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,UAAU,EAAE,YAAY;YACxB,YAAY;YACZ,QAAQ;AACR,YAAA,GAAG,EAAE,SAAS;YACd,eAAe;AAChB,SAAA,CAAC,CACH;IACH;AAEA,IAAA,WAAW,CAAC,MAAc,EAAA;AACxB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE;YACnD;QACF;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,QAAA,OAAO,CAAC,MAAM,GAAG,IAAI;AACrB,QAAA,IAAI;AACF,YAAA,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC/B;QAAE,MAAM,EAAC;AACT,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE;AACpC,YAAA,MAAM,CAAC,MAAM,GAAG,IAAI;AACpB,YAAA,IAAI;AACF,gBAAA,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE;AAC7B,gBAAA,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE;YAChC;YAAE,MAAM,EAAC;AACT,YAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,gBAAA,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;AAChC,gBAAA,MAAM,CAAC,UAAU,GAAG,SAAS;YAC/B;AACA,YAAA,IAAI;gBACF,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;AAC3C,oBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;oBAC9B,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AACrE,oBAAA,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE;gBACnB;YACF;YAAE,MAAM,EAAC;QACX;AACA,QAAA,IAAI;AACF,YAAA,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE;QAC9B;QAAE,MAAM,EAAC;AACT,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;IACrB;AAEA,IAAA,YAAY,CAAC,MAAc,EAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE;YACnD;QACF;QACA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACzC,YAAA,MAAM,CAAC,eAAe,GAAG,IAAI;QAC/B;IACF;AAEA,IAAA,cAAc,CAAC,MAAc,EAAE,KAA2B,EAAE,KAAc,EAAA;AACxE,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE;YACnD;QACF;QACA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACzC,YAAA,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE;AAC1B,gBAAA,MAAM,CAAC,KAAK,GAAG,KAAK;YACtB;QACF;IACF;AAEQ,IAAA,SAAS,CAAC,MAAmB,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB;AACxC,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;AAClB,YAAA,OAAO,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QACjC;AACA,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC;AACvC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;AACrC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/B,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACtB;QACF;AACA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ;QAClC;AACA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,YAAY,CAAC,OAAqB,EAAA;QACxC,IAAI,GAAG,GAAG,CAAC;AACX,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACvC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AACxB,YAAA,GAAG,IAAI,KAAK,GAAG,KAAK;QACtB;QACA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IACxC;IAEQ,WAAW,CAAC,KAAmB,EAAE,UAAkB,EAAA;AACzD,QAAA,MAAM,SAAS,GACb,UAAU,KAAK,IAAI,CAAC;AAClB,cAAE;AACF,cAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC;QAChE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;YACxC,OAAO,IAAI,UAAU,EAAE;QACzB;QACA,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AACpD,QAAA,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC;AACjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,YAAA,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM;YACnC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC/B;AACA,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;IAC/B;AAEQ,IAAA,gBAAgB,CACtB,KAAmB,EACnB,UAAkB,EAClB,UAAkB,EAAA;AAElB,QAAA,MAAM,KAAK,GAAG,UAAU,GAAG,UAAU;AACrC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;YAC9C,IAAI,GAAG,GAAG,CAAC;YACX,IAAI,KAAK,GAAG,CAAC;AACb,YAAA,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5D,gBAAA,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;AACf,gBAAA,KAAK,EAAE;YACT;AACA,YAAA,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,CAAC;YACnC,MAAM,GAAG,UAAU;QACrB;AACA,QAAA,OAAO,MAAM;IACf;IAEQ,UAAU,CAAC,MAAqB,EAAE,KAAiB,EAAA;AACzD,QAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,QAAA,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,UAAU;AACvC,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;IAChC;AAEQ,IAAA,iBAAiB,CAAC,MAAqB,EAAA;AAC7C,QAAA,IAAI,MAAM,CAAC,YAAY,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;YACxE;QACF;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC;AAC1E,QAAA,MAAM,CAAC,aAAa,GAAG,EAAE;AACzB,QAAA,MAAM,CAAC,YAAY,GAAG,CAAC;AACvB,QAAA,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;AACtB,QAAA,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE;AACnC,QAAA,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe;IACjD;IAEQ,WAAW,CAAC,MAAoB,EAAE,UAAkB,EAAA;AAC1D,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC;QAClB;AACA,QAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC;QACtC,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,UAAU;QAC5B;AACA,QAAA,OAAO,GAAG;IACZ;IAEQ,uBAAuB,CAAC,MAAc,EAAE,IAAY,EAAA;AAC1D,QAAA,IAAI,CAAC,IAAI;YAAE;AACX,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC7B,YAAA,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;AAClC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;oBAC1B,MAAM;oBACN,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,oBAAA,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;AACtD,oBAAA,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AACvD,oBAAA,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM;AACvC,iBAAA,CAAC;gBACF;YACF;AACA,YAAA,IAAI,OAAO,IAAI,EAAE,UAAU,KAAK,QAAQ,EAAE;gBACxC,MAAM,EAAE,GAAG,OAAO,IAAI,EAAE,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;AAC9D,gBAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC;AAC7D,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC;qBAChB,KAAK,CAAC,OAAO;qBACb,GAAG,CAAC,CAAC,IAAY,KAAK,IAAI,CAAC,IAAI,EAAE;qBACjC,MAAM,CAAC,OAAO,CAAC;AAClB,gBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,oBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;wBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;AAC1C,wBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;4BAC1B,MAAM;4BACN,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,OAAO;4BACP,EAAE;4BACF,OAAO,EAAE,MAAM,CAAC,OAAO;AACxB,yBAAA,CAAC;oBACJ;gBACF;qBAAO;AACL,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAC5D,oBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;wBAC1B,MAAM;wBACN,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,OAAO;wBACP,EAAE;wBACF,OAAO,EAAE,MAAM,CAAC,OAAO;AACxB,qBAAA,CAAC;gBACJ;gBACA;YACF;YACA,MAAM,OAAO,GAAG,IAAI,EAAE,UAAU,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO;AAC1D,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE;AAC7B,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,MAAM,UAAU,GACd,MAAM,EAAE,YAAY,GAAG,CAAC,CAAC,EAAE,UAAU;oBACrC,MAAM,EAAE,YAAY,GAAG,CAAC,CAAC,EAAE,UAAU;AACvC,gBAAA,IAAI,CAAC,UAAU;oBAAE;AACjB,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;oBAC1B,MAAM;AACN,oBAAA,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;AAChD,oBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAC1B,MAAM;gBACN,IAAI;AACJ,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;AACf,aAAA,CAAC;QACJ;IACF;AAEQ,IAAA,gBAAgB,CAAC,IAAY,EAAA;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC;QAC7D,IAAI,KAAK,EAAE;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;QACnE;QACA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE;IAC9B;AAEQ,IAAA,mBAAmB,CAAC,IAQ3B,EAAA;QACC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AAClC,QAAA,EAAE,CAAC,UAAU,GAAG,aAAa;AAC7B,QAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;YACjD,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,MAAM,EAAE,IAAI,CAAC,KAAK;AACnB,SAAA,CAAC;AAEF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CACvD,IAAI,CAAC,WAAW,EAChB,CAAC,EACD,CAAC,CACF;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;AAClC,QAAA,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEhC,QAAA,MAAM,MAAM,GAAkB;YAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,EAAE;YACF,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,UAAU;AAC3B,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,aAAa,EAAE,EAAE;AACjB,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;YAC3B,UAAU,EAAE,IAAI,CAAC,qBAAqB;AACtC,YAAA,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,IAAI,CAAC,eAAe;AACrC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE;SAC5B;AAED,QAAA,EAAE,CAAC,MAAM,GAAG,MAAK;AACf,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;AAC1C,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,QAAQ,EACN,IAAI,CAAC,mBAAmB,IAAI,qCAAqC;gBACnE,UAAU,EAAE,IAAI,CAAC,WAAW;AAC5B,gBAAA,QAAQ,EAAE,OAAO;AACjB,gBAAA,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,KAAK;gBAClB,YAAY,EAAE,IAAI,CAAC,aAAa;gBAChC,wBAAwB,EAAE,IAAI,CAAC,kBAAkB;gBACjD,KAAK,EAAE,IAAI,CAAC,mBAAmB;aAChC;YACD,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAChC,YAAA,MAAM,CAAC,cAAc,GAAG,KAAK;AAC7B,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACvE,YAAA,SAAS,CAAC,cAAc,GAAG,CAAC,KAA2B,KAAI;AACzD,gBAAA,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;oBACrD;gBACF;gBACA,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE;oBAC1C;gBACF;gBACA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;oBAChC;gBACF;gBACA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACpC,gBAAA,IAAI,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACpC,oBAAA,MAAM,CAAC,UAAU;wBACf,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC,UAAU;AACpD,4BAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG;oBAClC;gBACF;AACA,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,IAAI,CAAC,mBAAmB,EACxB,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAChD;AACD,gBAAA,IAAI,GAAG,GAAG,iBAAiB,EAAE;AAC3B,oBAAA,MAAM,CAAC,UAAU;wBACf,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC,UAAU;AACpD,4BAAA,IAAI,CAAC,qBAAqB,GAAG,GAAG;oBAClC;gBACF;AACA,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAC/B,KAAK,EACL,IAAI,CAAC,YAAY,CAAC,UAAU,CAC7B;AACD,gBAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,EAAE;oBAC7B;gBACF;gBACA,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;oBACrD;gBACF;AACA,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC;AACnC,YAAA,CAAC;AACH,QAAA,CAAC;AAED,QAAA,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC/C,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,GAAG,EAAE,EAAE,CAAC,GAAG;AACX,gBAAA,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,EAAE,CAAC,SAAS,GAAG,CAAC,GAAG,KAAI;YACrB,IAAI,CAAC,GAAG,EAAE,IAAI;gBAAE;AAChB,YAAA,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AAChC,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACrC,oBAAA,IACE,QAAQ;wBACR,QAAQ,CAAC,IAAI,KAAK,KAAK;AACvB,wBAAA,QAAQ,CAAC,OAAO,KAAK,gBAAgB,EACrC;AACA,wBAAA,MAAM,CAAC,cAAc,GAAG,IAAI;wBAC5B;oBACF;gBACF;AAAE,gBAAA,MAAM;;gBAER;gBACA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC;gBACnD;YACF;AACA,YAAA,IAAI,GAAG,CAAC,IAAI,YAAY,IAAI,EAAE;gBAC5B,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjF;AACF,QAAA,CAAC;AAED,QAAA,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,KAAI;AACnB,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE;gBAC/C,IAAI,EAAE,GAAG,EAAE,IAAI;gBACf,MAAM,EAAE,GAAG,EAAE,MAAM;gBACnB,QAAQ,EAAE,GAAG,EAAE,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,KAAK;AACnB,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC,MAAK;AACnC,YAAA,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE;gBACrD;YACF;YACA,IAAI,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,eAAe,EAAE;AACnD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;YAChC;AACF,QAAA,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC;AAE1B,QAAA,OAAO,MAAM;IACf;uGAtdW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cADb,MAAM,EAAA,CAAA;;2FACnB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MC5BrB,kBAAkB,CAAA;AACpB,IAAA,QAAQ;IACR,QAAQ,GAAU,EAAE;IACpB,sBAAsB,GAAG,KAAK;IAC9B,SAAS,GAAG,KAAK;IACjB,UAAU,GAAG,UAAU;IACvB,kBAAkB,GAAG,kBAAkB;AAEtC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAQ;AAC1C,IAAA,KAAK,GAAG,IAAI,YAAY,EAAQ;AAChC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAU;AACxC,IAAA,aAAa,GAAG,IAAI,YAAY,EAAiB;AAE3D,IAAA,eAAe,CAAC,OAAY,EAAA;QAC1B,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,KAAK,IAAI,IAAI;AACpD,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE;IAClD;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;IAC7B;IACA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;IACA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;AACA,IAAA,aAAa,CAAC,CAAS,EAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B;AACA,IAAA,eAAe,CAAC,EAAiB,EAAA;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7B;uGAjCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,oaCV/B,y2GAmFA,EAAA,MAAA,EAAA,CAAA,m7EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAT,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAQ,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,CAAA,EAAA,CAAA;;2FDzEa,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,cAGd,KAAK,EAAA,QAAA,EAAA,y2GAAA,EAAA,MAAA,EAAA,CAAA,m7EAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;;MEbU,sBAAsB,CAAA;AACjC,IAAA,iBAAiB,GAAG,QAAQ,CAAC,uCAAuC,CAAC;AAC5D,IAAA,gBAAgB;IAChB,oBAAoB,GAAG,KAAK;AAC5B,IAAA,kBAAkB;AACjB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AACjC,IAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;uGANjC,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,4QCTnC,quDAyCA,EAAA,MAAA,EAAA,CAAA,gmCAAA,CAAA,EAAA,CAAA;;2FDhCa,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBANlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAGlB,KAAK,EAAA,QAAA,EAAA,quDAAA,EAAA,MAAA,EAAA,CAAA,gmCAAA,CAAA,EAAA;;sBAIhB;;sBACA;;sBACA;;sBACA;;sBACA;;;MELU,oBAAoB,CAAA;AAqBX,IAAA,qBAAA;AApBX,IAAA,QAAQ;AACjB,IAAA,eAAe,GAAG,QAAQ,CAAC,uCAAuC,CAAC;AAC1D,IAAA,cAAc;IACd,gBAAgB,GAAkB,IAAI;IACtC,kBAAkB,GAAG,CAAC;IACtB,cAAc,GAAG,EAAE;IACnB,YAAY,GAAG,KAAK;IACpB,OAAO,GAAG,KAAK;IACf,MAAM,GAAG,KAAK;AACb,IAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAClC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,IAAA,YAAY,GAAG,IAAI,YAAY,EAAQ;AACvC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,kBAAkB,GAAG,IAAI,YAAY,EAAQ;AAC7C,IAAA,cAAc,GAAG,IAAI,YAAY,EAAS;IAE5C,iBAAiB,GAAG,KAAK;AAEjC,IAAA,WAAA,CAAoB,qBAA4C,EAAA;QAA5C,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;IAA0B;IAEnE,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA,IAAA,MAAM,aAAa,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC5C;QACF;AACA,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC7B,MAAM,IAAI,GAAG,EAAE;AACf,QAAA,IAAI,WAAyC;QAC7C,IAAI,WAAW,GAAU,EAAE;QAE3B,OAAO,IAAI,EAAE;AACX,YAAA,IAAI;AACF,gBAAA,MAAM,kBAAkB,GACtB,MAAM,IAAI,CAAC,qBAAqB,CAAC,aAAa,CAC5C,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ,WAAW,CACZ;AACH,gBAAA,MAAM,IAAI,GAAG,kBAAkB,EAAE,IAAI,EAAE,IAAI;AAE3C,gBAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC7C;gBACF;gBAEA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,KAAI;AACnC,oBAAA,MAAM,MAAM,GAAG,GAAG,EAAE,OAAO,IAAI,EAAE;oBACjC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa;0BAC7C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAM,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE;0BACzE,EAAE;AACN,oBAAA,MAAM,KAAK,GACT,MAAM,CAAC,CAAC,CAAC;AACT,wBAAA,MAAM,CAAC,KAAK;AACZ,wBAAA,MAAM,CAAC,qBAAqB;AAC5B,wBAAA,EAAE;oBACJ,IAAI,CAAC,KAAK,EAAE;AACV,wBAAA,OAAO,IAAI;oBACb;oBACA,OAAO;AACL,wBAAA,GAAG,MAAM;AACT,wBAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG;wBACzB,KAAK;qBACN;AACH,gBAAA,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAClB,WAAW,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC;AACzC,gBAAA,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE;oBACtB;gBACF;gBACA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI;gBACnE,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;AACpC,oBAAA,WAAW,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1D;qBAAO;oBACL;gBACF;YACF;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;gBAChD;YACF;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;AACrC,QAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;IAChC;AAEA,IAAA,cAAc,CAAC,YAAoB,EAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;AAC7C,QAAA,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE;QACjC,OAAO,CAAA,EAAG,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CACpE,CAAC,EACD,GAAG,CACJ,CAAA,CAAE;IACL;uGAjGW,oBAAoB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAH,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,sjBCVjC,uiNAqHA,EAAA,MAAA,EAAA,CAAA,qmDAAA,CAAA,EAAA,CAAA;;2FD3Ga,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,cAGhB,KAAK,EAAA,QAAA,EAAA,uiNAAA,EAAA,MAAA,EAAA,CAAA,qmDAAA,CAAA,EAAA;;sBAGhB;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;;METU,cAAc,CAAA;AAqGf,IAAA,GAAA;AACA,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,qBAAA;AACA,IAAA,uBAAA;AACA,IAAA,0BAAA;IAzGD,QAAQ,GAAU,EAAE;AACpB,IAAA,QAAQ;AACR,IAAA,OAAO;AACN,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAW;IAChD,aAAa,GAAG,KAAK;IAC7B,IACI,YAAY,CAAC,KAAc,EAAA;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AACA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,aAAa;IAC3B;IACS,gBAAgB,GAAkB,IAAI;AACtC,IAAA,gBAAgB;IAChB,oBAAoB,GAAG,KAAK;AAC5B,IAAA,cAAc;AACd,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,MAAM;AACN,IAAA,QAAQ;AACR,IAAA,MAAM;AACN,IAAA,QAAQ;AACR,IAAA,iBAAiB;AAChB,IAAA,UAAU,GAAG,IAAI,YAAY,EAAU;AACvC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;AACnB,IAAA,YAAY;AAC/B,IAAA,YAAY;AACZ,IAAA,cAAc;IACd,sBAAsB,GAAG,KAAK;AAC9B,IAAA,iBAAiB;AACjB,IAAA,eAAe;AACf,IAAA,gBAAgB;AAChB,IAAA,eAAe;AACf,IAAA,gBAAgB;IAChB,gBAAgB,GAAuB,IAAI;IAC3C,eAAe,GAAuB,IAAI;IAC1C,aAAa,GAAkB,IAAI;IACnC,eAAe,GAAG,KAAK;IACvB,yBAAyB,GAAkB,IAAI;IAC/C,0BAA0B,GAAkB,IAAI;IAChD,+BAA+B,GAAG,KAAK;IACvC,gBAAgB,GAA2B,EAAE;IAC7C,mBAAmB,GAAG,KAAK;AAEnC,IAAA,QAAQ;AACR,IAAA,aAAa;IACb,sBAAsB,GAAG,KAAK;IAC9B,cAAc,GAAG,KAAK;IACtB,aAAa,GAAG,KAAK;IACrB,YAAY,GAA2B,UAAU;IACjD,eAAe,GAAG,EAAE;IACpB,aAAa,GAAG,EAAE;AAClB,IAAA,eAAe,GAAG;AAChB,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;AAC3B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;AAC/B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE;AAC9B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE;AAC/B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;AAC3B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;AAC5B,QAAA,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;KAC5B;AACD,IAAA,wBAAwB;AACxB,IAAA,kBAAkB;IAClB,OAAO,GAAG,KAAK;IACf,MAAM,GAAG,KAAK;IACd,kBAAkB,GAAG,CAAC;IACtB,cAAc,GAAG,EAAE;IACnB,aAAa,GAAG,EAAE;IAClB,eAAe,GAAG,EAAE;IACpB,eAAe,GAAG,KAAK;AACf,IAAA,oBAAoB;AACpB,IAAA,eAAe;IACf,oBAAoB,GAAG,KAAK;IAC5B,oBAAoB,GAAG,KAAK;IACpC,YAAY,GAAG,KAAK;IACpB,mBAAmB,GAAG,KAAK;IAC3B,cAAc,GAAG,EAAE;IACnB,kBAAkB,GAA0D,EAAE;IACtE,mBAAmB,GAAG,CAAC;IACvB,iBAAiB,GAAG,CAAC;IAC7B,wBAAwB,GAAG,KAAK;IAChC,WAAW,GAAG,EAAE;IAChB,UAAU,GAAG,EAAE;AACP,IAAA,SAAS,GAAG,eAAe,CAAC,WAAW,EAAE;IAEjD,UAAU,GAAG,UAAU;IACvB,kBAAkB,GAAG,kBAAkB;IACvC,SAAS,GAAG,KAAK;AACjB,IAAA,KAAK;AACL,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,cAAc,KAAK,YAAY;IAC7C;IAEA,WAAA,CACU,GAAsB,EACtB,WAAwB,EACxB,eAAgC,EAChC,qBAA4C,EAC5C,uBAAgD,EAChD,0BAAsD,EAAA;QALtD,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;QACrB,IAAA,CAAA,uBAAuB,GAAvB,uBAAuB;QACvB,IAAA,CAAA,0BAA0B,GAA1B,0BAA0B;QAElC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACrC,YAAA,WAAW,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACvC,SAAA,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC1C,YAAA,WAAW,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACvC,SAAA,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC;QAC5D,IAAI,CAAC,mBAAmB,EAAE;QAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE;QAC/D,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,wBAAwB;YAC3B,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,IAAI,KAAI;AAC1D,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;AAC/B,YAAA,CAAC,CAAC;AAEJ,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,SAAS,CACvE,CAAC,OAAO,KAAI;YACV,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;gBACtC;YACF;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,YAAY;AAClC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;YACzB,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CACF;AAED,QAAA,IAAI,CAAC,gBAAgB;YACnB,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,KAAI;gBAC5D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;oBACrB;gBACF;gBACA,IACE,IAAI,CAAC,yBAAyB;AAC9B,oBAAA,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,yBAAyB,EAC7C;oBACA;gBACF;AACA,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC;AACxE,YAAA,CAAC,CAAC;AAEJ,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,CACjE,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE;gBACf;YACF;YACA,IACE,GAAG,CAAC,MAAM;AACV,iBAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,WAAW;AAClC,oBAAA,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,OAAO;AAC/B,oBAAA,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,SAAS;oBACjC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,EAC/B;gBACA,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,EAAE;AAC/C,oBAAA,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM;AAC/B,oBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;gBAC9B;YACF;YACA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,SAAS,EAAE;AACrC,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE;AACd,oBAAA,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM;gBACjC;AACA,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,gBAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC1B,gBAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;gBAC5C,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,GAAG,CAAC,MAAM,CAAC;AACvE,gBAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC;AACtC,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE;oBACd,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;gBAClD;gBACA,IAAI,CAAC,mBAAmB,EAAE;YAC5B;AACA,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,OAAO,EAAE;AACvE,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE;oBACd,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;gBACnD;;YAEF;AACA,YAAA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,YAAY,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,MAAM,EAAE;AAC1E,gBAAA,IAAI,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE;oBACzE;gBACF;AACA,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE;oBACd,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxD;AACA,gBAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;oBAClC,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAC3E,oBAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrC,oBAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,oBAAA,IAAI,CAAC,+BAA+B,GAAG,KAAK;gBAC9C;AACA,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;AAClC,gBAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,gBAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,gBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBAC1B,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,IAAI,CAAC,cAAc,GAAG,cAAc;AACpC,gBAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;AACnC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;AAC5C,gBAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;gBACxC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,oBAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;oBACnC,IAAI,CAAC,2BAA2B,EAAE;gBACpC;qBAAO;oBACL,IAAI,CAAC,yBAAyB,EAAE;gBAClC;YACF;YACA,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,EAAE;AAChC,gBAAA,IAAI,GAAG,CAAC,MAAM,EAAE;oBACd,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;gBACxD;YACF;AACF,QAAA,CAAC,CACF;AAED,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,SAAS,CAC3E,CAAC,MAAM,KAAI;AACT,YAAA,IAAI,MAAM,EAAE,OAAO,EAAE;AACnB,gBAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,gBAAA,IAAI,CAAC,eAAe,GAAG,qBAAqB;AAC5C,gBAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,oBAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACvC,oBAAA,IAAI,CAAC,oBAAoB,GAAG,SAAS;gBACvC;AACA,gBAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,oBAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,oBAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,oBAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,oBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,oBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;gBAC5B;AACA,gBAAA,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,MAAK;AAC1C,oBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;gBAC1B,CAAC,EAAE,IAAI,CAAC;YACV;iBAAO;AACL,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;gBACzB,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,OAAO,IAAI,oBAAoB;AAC5D,gBAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,oBAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;gBACzC;AACA,gBAAA,IAAI,CAAC,oBAAoB,GAAG,UAAU,CAAC,MAAK;AAC1C,oBAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;gBAC1B,CAAC,EAAE,IAAI,CAAC;YACV;AACA,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CACF;AAED,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YACxE,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,IAAI,CAAC,MAAM,EAAE;AACxC,gBAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,MAAM;gBAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW;AACvD,gBAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE;oBACnC,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,0BAA0B,EAC/B,IAAI,CAAC,+BAA+B,CACrC;gBACH;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,SAAS,CACzE,CAAC,GAAG,KAAI;AACN,YAAA,IAAI,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE;gBAC1E;YACF;AACA,YAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;gBAClC,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAC3E,gBAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrC,gBAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,gBAAA,IAAI,CAAC,+BAA+B,GAAG,KAAK;YAC9C;AACA,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;AACnC,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC;AACnC,YAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;AAC5C,YAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;YACxC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CACF;IACH;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC/D,YAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;gBAChC,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;QACF;IACF;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa;IAC/C;IAEA,WAAW,GAAA;QACT,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC;AAC/D,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,IAAI;AAClC,QAAA,IAAI,CAAC,iBAAiB,EAAE,WAAW,IAAI;AACvC,QAAA,IAAI,CAAC,eAAe,EAAE,WAAW,IAAI;AACrC,QAAA,IAAI,CAAC,gBAAgB,EAAE,WAAW,IAAI;AACtC,QAAA,IAAI,CAAC,eAAe,EAAE,WAAW,IAAI;AACrC,QAAA,IAAI,CAAC,gBAAgB,EAAE,WAAW,IAAI;AACtC,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;QACzC;QACA,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC1D;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW;AAC7C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAC1B,KAAK,EAAE,mBAAmB,IAAI,KAAK,EAAE,MAAM,IAAI,KAAK,CACrD;QACD,IAAI,CAAC,IAAI,EAAE;AACT,YAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC;YACrD;QACF;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,cAAc,GAAG,YAAY;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;IACrC;IAEA,OAAO,GAAA;QACL,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;AAChD,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;AAChE,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,OAAO,EAAE,KAAK,EAAE;QAErC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE;IAC/D;AAEA,IAAA,mBAAmB,GAAG,CAAC,KAAoB,KAAU;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;AAChD,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;QAEhE,IAAI,OAAO,GAAG,OAAO;AACrB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE;YACzB,IAAI,CAAC,QAAQ,EAAE;YACf;QACF;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;AACpC,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,OAAO,EAAE,KAAK,EAAE;YACrC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC;aAAO,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AACpC,YAAA,OAAO,IAAI,KAAK,CAAC,GAAG;QACtB;aAAO;YACL;QACF;AAEA,QAAA,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE;AAC/D,IAAA,CAAC;AAED,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;AAChD,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;AAChE,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,GAAG,KAAK,CAAC;IAC1C;AAEQ,IAAA,kBAAkB,CAAC,KAAa,EAAA;QACtC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AACjD,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,KAAgC,EAAA;QACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,OAAO,EAAE;QACX;QACA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACzC,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,OAAO,OAAO;QAChB;AACA,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC5B,OAAO,CAAA,CAAA,EAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC/B;AACA,QAAA,IAAI;AACF,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;YAClD,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;AACxC,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC;YAC9D;QACF;AAAE,QAAA,MAAM;;QAER;AACA,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,aAAa,CAAC,IAAY,EAAA;AAChC,QAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC;IAClC;IAGA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;AACxC,QAAA,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI;AACrB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC;QAC5B;QACA,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;AAChC,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;;AAEjC,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;QACxB,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;QAC5C,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;AACpC,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;AAClC,QAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;AAC5C,QAAA,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;AACxC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACpB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf;QACF;AACA,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC;AAC1B,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,+BAA+B,CAAC;AAC1D,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK;YACvB,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAK;;AAElC,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,gBAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;YACnC;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,gBAAA,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI;AACrB,gBAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC;gBAC5B;AACA,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE;gBACxB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B,CAAC,EAAE,IAAI,CAAC;QACV;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,CAAC;QACjD;IACF;IAEQ,2BAA2B,GAAA;AACjC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;QACnC;AACA,QAAA,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,MAAK;AACpC,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;YACxB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B,CAAC,EAAE,IAAI,CAAC;IACV;AAEQ,IAAA,kBAAkB,CAAC,IAA8C,EAAA;AACvE,QAAA,MAAM,SAAS,GAAG,eAAe,CAAC,WAAW,EAAE;AAC/C,QAAA,IAAI;YACF,IAAI,gBAAgB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;;AAG/C,YAAA,IAAI,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;gBACrC,gBAAgB,GAAG,GAAG,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD;AAEA,YAAA,IAAI,YAAY;AAChB,YAAA,IACE,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC;AAChC,gBAAA,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACjC;AACA,gBAAA,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClD;iBAAO;gBACL,YAAY,GAAG,SAAS,CAAC,KAAK,CAC5B,gBAAgB,EAChB,IAAI,CAAC,qBAAqB,CAAC;AACxB,qBAAA,QAAQ;qBACR,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CACjD;YACH;AAEA,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC,MAAM,CACxC,YAAY,EACZ,iBAAiB,CAAC,aAAa,CAChC;QACH;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,YAAY,CAAC;YACxD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9C;AACA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,oBAAoB;AAC1C,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,oBAAoB;AACrD,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QACjC;QACA,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;IACpC;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;IAC1B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;IAC3B;AAEQ,IAAA,yBAAyB,CAC/B,MAAc,EACd,eAAe,GAAG,KAAK,EAAA;QAEvB,IAAI,CAAC,MAAM,EAAE;YACX;QACF;AACA,QAAA,IAAI,IAAI,CAAC,yBAAyB,KAAK,MAAM,EAAE;YAC7C,IAAI,eAAe,EAAE;AACnB,gBAAA,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,MAAM,CAAC;YACtD;YACA;QACF;QACA,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;AACnD,YAAA,IAAI,CAAC,0BAA0B,GAAG,MAAM;AACxC,YAAA,IAAI,CAAC,+BAA+B,GAAG,eAAe;YACtD;QACF;AACA,QAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,QAAA,IAAI,CAAC,+BAA+B,GAAG,KAAK;AAC5C,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE;AACrC,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC;AACF,aAAA,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe;aACjF,IAAI,CAAC,MAAK;AACT,YAAA,IAAI,CAAC,yBAAyB,GAAG,MAAM;AACzC,QAAA,CAAC;AACA,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,YAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC;AAC7D,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,qBAAqB,CAC3B,IAAY,EACZ,OAAgB,EAChB,EAAU,EACV,OAAgB,EAAA;QAEhB,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;QACnC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AACA,QAAA,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;QAC3D,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAChD,IAAI,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE;AACzE,gBAAA,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;YACzE;iBAAO;AACL,gBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC5D,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;YACjE;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YACxB;QACF;QAEA,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QAC/C,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE;AACvE,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE;AACtE,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;QACnC;aAAO;AACL,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC9D;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,yBAAyB,CAAC,OAA6B,EAAA;AACrD,QAAA,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE;AACtD,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE;AACpC,QAAA,IAAI,UAAU,KAAK,OAAO,EAAE;AAC1B,YAAA,OAAO,OAAO;QAChB;AACA,QAAA,IAAI,UAAU,KAAK,UAAU,EAAE;YAC7B,OAAO,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,gBAAgB,IAAI,SAAS;QAClE;QACA,OAAO,GAAG,IAAI,SAAS;IACzB;AAEA,IAAA,wBAAwB,CAAC,OAA6B,EAAA;AACpD,QAAA,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC3E,QAAA,IAAI,UAAU,KAAK,OAAO,EAAE;AAC1B,YAAA,OAAO,OAAO;QAChB;AACA,QAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC7B,YAAA,OAAO,UAAU;QACnB;AACA,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,IAAI,0BAA0B,GAAA;QAC5B,OAAO,IAAI,CAAC;aACT,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,KAAK,UAAU;AACnF,aAAA,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C;AAEA,IAAA,IAAI,uBAAuB,GAAA;QACzB,OAAO,IAAI,CAAC;aACT,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO;AAChF,aAAA,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;IACjC;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;IAClC;AAEQ,IAAA,iBAAiB,CAAC,MAAe,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAClC,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC;AAC3E,YAAA,IAAI,CAAC,yBAAyB,GAAG,IAAI;AACrC,YAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;AACtC,YAAA,IAAI,CAAC,+BAA+B,GAAG,KAAK;QAC9C;AACA,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE;AAEnC,QAAA,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,YAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC;QACzC;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,QAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAC5B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,QAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;IAClC;AAEQ,IAAA,0BAA0B,CAAC,MAAe,EAAA;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YAAE;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;QAE7C,MAAM,OAAO,GAAa,EAAE;AAC5B,QAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAA,aAAA,EAAgB,MAAM,IAAI,GAAG,CAAA,CAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,mBAAmB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAA,CAAE,CAAC;QAC/G,OAAO,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,iBAAiB,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAA,CAAE,CAAC;QAC3G,MAAM,KAAK,GACT,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC;AAC/B,cAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;cAC9B,CAAC;AACP,QAAA,OAAO,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAE,CAAC;AACnD,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AAEhB,QAAA,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC;QAC7B,IAAI,OAAO,CAAC,MAAM;AAAE,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAC;;AAC7D,YAAA,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAEtC,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,iBAAiB,CAAC;AACnC,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE,CAAC,CAAC;QACpD;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;AAClB,YAAA,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,CAAC;AAC/B,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAC,CAAC;QAChD;AAEA,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,6BAA6B,CAAC;AAC/C,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzC,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,mBAAmB,IAAI,GAAG,CAAC,EAAE,CAAC;AAC5D,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAA,CAAE,CAAC;QACtD;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;AAC5C,YAAA,IAAI,EAAE,6BAA6B;AACpC,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,GAAG,CAAA,KAAA,EAAQ,MAAM,IAAI,SAAS,aAAa;AACrD,QAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;IACvC;AAEQ,IAAA,sBAAsB,CAAC,IAAY,EAAE,UAAU,GAAG,CAAC,EAAA;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACvC,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU;AAAE,YAAA,OAAO,KAAK;AAE5C,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,CACE,sDAAsD;YACtD,4EAA4E;YAC5E,8EAA8E;YAC9E,4EAA4E;YAC5E,6EAA6E;YAC7E,2EAA2E;YAC3E,2EAA2E;AAC3E,YAAA,6DAA6D,EAC7D,KAAK,CAAC,GAAG,CAAC,CACb;AAED,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAS,KACzB;AACG,aAAA,WAAW;AACX,aAAA,OAAO,CAAC,cAAc,EAAE,GAAG;aAC3B,KAAK,CAAC,KAAK;AACX,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB;AACtC,QAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACrB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE;AAC3B,gBAAA,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC;QACF;QAEA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAChC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GACT,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;AAC3B,YAAA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO;AACJ,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;AAChC,aAAA,KAAK,CAAC,CAAC,EAAE,UAAU;AACnB,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxB,aAAA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B;AAEQ,IAAA,cAAc,CAAC,IAAY,EAAA;AACjC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,MAAM,EAAE,GAAG;aACnB,KAAK,CAAC,4BAA4B;aAClC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;aACnB,MAAM,CAAC,OAAO,CAAC;IACpB;AAEQ,IAAA,kBAAkB,CAAC,IAAY,EAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QACvC,MAAM,GAAG,GACP,8IAA8I;QAChJ,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;IACtD;AAEQ,IAAA,cAAc,CAAC,IAAY,EAAA;QACjC,MAAM,GAAG,GAAa,EAAE;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,EAAE;QAC3D,MAAM,MAAM,GACV,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,IAAI,EAAE;QAC7D,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,IAAI,EAAE;QAC3D,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,CACR,2HAA2H,CAC5H,IAAI,EAAE;QACT,IAAI,MAAM,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;QAChF,IAAI,MAAM,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;QAChF,IAAI,OAAO,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,CAAA,SAAA,EAAY,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;QACnF,IAAI,KAAK,CAAC,MAAM;YAAE,GAAG,CAAC,IAAI,CAAC,CAAA,OAAA,EAAU,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;AAC7E,QAAA,OAAO,GAAG;IACZ;IAEQ,gBAAgB,CAAC,IAAU,EAAE,QAAgB,EAAA;QACnD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC;AACrC,QAAA,CAAC,CAAC,IAAI,GAAG,GAAG;AACZ,QAAA,CAAC,CAAC,QAAQ,GAAG,QAAQ;AACrB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,KAAK,EAAE;QACT,CAAC,CAAC,MAAM,EAAE;AACV,QAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;IAC1B;AAEQ,IAAA,MAAM,CAAC,EAAU,EAAA;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;AAC5C,QAAA,MAAM,CAAC,GAAG,QAAQ,GAAG,EAAE;QACvB,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;YACnD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACjE;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;AAC7B,YAAA,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACvC,YAAA,IAAI,CAAC,oBAAoB,GAAG,SAAS;QACvC;IACF;AAEA,IAAA,gBAAgB,CAAC,IAAW,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE;IACjD;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;QACpD,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC,QAAQ;QACtB;QACA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACtC,YAAA,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;AAC3D,YAAA,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,WAAW,EAAE;AAC7D,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AACpD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,eAAe,CAAC,OAAY,EAAA;AAC1B,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE;QAClC,IAAI,KAAK,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;AAClD,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,gBAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAC/B,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EACzC,YAAY,CACb;AACD,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;gBAC3B;YACF;iBAAO;AACL,gBAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,oBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;gBAC/B;AACA,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAC/B;QACF;AACA,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;IAC9B;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B;QACF;AACA,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAChC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;QACnC,CAAC,EAAE,GAAG,CAAC;AACP,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;QACjC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;QAC/B;AACA,QAAA,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO;AAC5B,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAClC,YAAA,IAAI,CAAC,0BAA0B,CAAC,cAAc,CAC5C,IAAI,CAAC,yBAAyB,EAC9B,OAAO,EACP,IAAI,CAAC,OAAO,CACb;QACH;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B;QACF;AACA,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;QAChC,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;QACnC,CAAC,EAAE,GAAG,CAAC;AACP,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;QACjC;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;QAC/B;AACA,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM;IAC5B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI;IACpC;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC;IACjE;IAEQ,cAAc,CAAC,KAAK,GAAG,IAAI,EAAA;AACjC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB;QACF;QACA,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC;QAC7B;AACA,QAAA,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,MAAK;AACtC,YAAA,IAAI,CAAC,kBAAkB,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB,CAAC,EAAE,IAAI,CAAC;IACV;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;AACnC,YAAA,IAAI,CAAC,eAAe,GAAG,SAAS;QAClC;AACA,QAAA,IAAI,CAAC,kBAAkB,GAAG,CAAC;IAC7B;;IAGA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,sBAAsB;AAC1D,QAAA,IAAI,IAAI,CAAC,sBAAsB,EAAE;AAC/B,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACzB;IACF;IACA,WAAW,GAAA;QACT,IAAI,CAAC,OAAO,EAAE;IAChB;IACA,cAAc,GAAA;QACZ,IAAI,CAAC,QAAQ,EAAE;IACjB;AACA,IAAA,iBAAiB,CAAC,KAAa,EAAA;AAC7B,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AACA,IAAA,mBAAmB,CAAC,EAAiB,EAAA;AACnC,QAAA,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAC9B;AAEA,IAAA,eAAe,CAAC,GAA2B,EAAA;AACzC,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;AACvB,QAAA,IAAI,GAAG,KAAK,SAAS,EAAE;AACrB,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACzB;IACF;AAEA,IAAA,iBAAiB,CAAC,KAAa,EAAA;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;AACrD,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;AAChE,QAAA,IAAI,CAAC,sBAAsB,CAAC,OAAO,GAAG,KAAK,CAAC;IAC9C;IAEA,oBAAoB,GAAA;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;AACrD,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;QAChE,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,OAAO,EAAE,KAAK,EAAE;QACzB;QACA,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpC,QAAA,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE;IACnE;IAEA,oBAAoB,GAAA;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW;AAChD,QAAA,MAAM,KAAK,GACT,GAAG,EAAE,mBAAmB;AACxB,YAAA,GAAG,EAAE,MAAM;AACX,aAAC,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe;QACtB,IAAI,CAAC,KAAK,EAAE;YACV;QACF;QACA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAC/B,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EACzC,YAAY,CACb;AACD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;YAC3B;QACF;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YAC/B;AACA,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,sBAAsB,GAAG,KAAK;AAEnC,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;AAC9B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;IAC9B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,CAAC,eAAe,GAAG,EAAE;IAC3B;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;AACvB,QAAA,IAAI,CAAC,UAAU,IAAI,KAAK;AACxB,QAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtC;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB;QACF;AACA,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD;AAEQ,IAAA,sBAAsB,CAAC,KAAa,EAAA;QAC1C,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AACtD,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,sBAAsB,CAAC,KAAa,EAAA;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,KAAK,CAAC;IAC1C;AAEQ,IAAA,6BAA6B,CAAC,KAAa,EAAA;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACnC,QAAA,OAAO,mBAAmB,CAAC,IAAI,IAAI,KAAK,CAAC;IAC3C;IAEQ,MAAM,qBAAqB,CAAC,MAAc,EAAA;QAChD,IAAI,CAAC,MAAM,EAAE;YACX;QACF;AACA,QAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,MAAM,CAAC;QACtD,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,WAAW;AACpE,QAAA,MAAM,QAAQ,GAAG,CAAC,MAA2B,KAC3C,MAAM,YAAY,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;AACrE,QAAA,MAAM,QAAQ,GAAG;AACf,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;AAC7B,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;AAC3B,YAAA,WAAW,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;YACxC,MAAM;SACP;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,MAAM,CAAC;AACnE,YAAA,IAAI;AACF,gBAAA,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;YAC3C;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,CAAC;YAClD;YACA,KAAK,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,WAAW;AAChE,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpB,gBAAA,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,MAAM,CAAC;gBACvE;YACF;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB;AACpC,QAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YACpB,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,KAAM,EAAE,MAAO,EAAE,QAAQ,CAAC;YACtE;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,KAAI;YACnE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE;gBAC7B;YACF;YACA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;gBACvB;YACF;AACA,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW;AACnD,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;gBACzB;YACF;AACA,YAAA,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,MAAM,CAAC;AACzE,YAAA,IAAI,CAAC,uBAAuB,CAAC,cAAc,CACzC,UAAW,EACX,CAAC,CAAC,MAAM,EACR,QAAQ,CACT;YACD,SAAS,CAAC,WAAW,EAAE;AACzB,QAAA,CAAC,CAAC;IACJ;uGAnqCW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAL,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAU,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,0BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,4tBClB3B,2iQAwLA,EAAA,MAAA,EAAA,CAAA,83KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAb,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAS,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,eAAA,EAAA,yBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,0BAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,8BAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAK,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,WAAA,EAAA,YAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,sBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,cAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA;;2FDtKa,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cAGT,KAAK,EAAA,QAAA,EAAA,2iQAAA,EAAA,MAAA,EAAA,CAAA,83KAAA,CAAA,EAAA;;sBAGhB;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAQA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,SAAS;uBAAC,cAAc;;;ME7Bd,uBAAuB,CAAA;AAsDxB,IAAA,WAAA;AACA,IAAA,eAAA;AACA,IAAA,GAAA;AACA,IAAA,cAAA;AACA,IAAA,wBAAA;AACA,IAAA,qBAAA;AACA,IAAA,mBAAA;IA3DsB,YAAY,GAAG,KAAK;IACnC,WAAW,GAAG,qBAAqB;;IAE3C,SAAS,GAAG,IAAI;AAChB,IAAA,iBAAiB;AACjB,IAAA,gBAAgB;AAChB,IAAA,kBAAkB;AAClB,IAAA,0BAA0B;AAC1B,IAAA,4BAA4B;AAC5B,IAAA,0BAA0B;AAC1B,IAAA,4BAA4B;AAC5B,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,MAAM;AAEL,IAAA,iBAAiB,GAAyB,IAAI,YAAY,EAAU;AACrE,IAAA,YAAY,GAAG,QAAQ,CAAC,0CAA0C,CAAC;IAE5E,wBAAwB,GAAG,KAAK;IAChC,oBAAoB,GAAG,KAAK;IAC5B,oBAAoB,GAAG,KAAK;IAE5B,aAAa,GAAG,IAAI;IACpB,eAAe,GAAG,KAAK;IACvB,mBAAmB,GAAG,KAAK;IAC3B,kBAAkB,GAAG,KAAK;IAC1B,0BAA0B,GAAG,KAAK;IAClC,0BAA0B,GAAG,KAAK;IAClC,mBAAmB,GAAG,KAAK;AACnB,IAAA,gBAAgB;AAExB,IAAA,SAAS;IACT,SAAS,GAAmD,QAAQ;AAC5D,IAAA,QAAQ;AACR,IAAA,eAAe;AACf,IAAA,YAAY;IACpB,QAAQ,GAAG,KAAK;IAChB,eAAe,GAAG,KAAK;IACvB,gBAAgB,GAAkB,IAAI;IACtC,gBAAgB,GAAkB,IAAI;IACtC,oBAAoB,GAAG,KAAK;IAC5B,cAAc,GAAkB,IAAI;IACpC,gBAAgB,GAAG,EAAE;IACrB,WAAW,GAAG,IAAI;IACV,cAAc,GAAG,KAAK;AACtB,IAAA,YAAY,GAAG,IAAI,GAAG,EAG3B;IACK,qBAAqB,GAA8B,IAAI;AACvD,IAAA,cAAc,GAAG,IAAI,GAAG,EAAkB;AAElD,IAAA,WAAA,CACU,WAAwB,EACxB,eAAgC,EAChC,GAAsB,EACtB,cAA8B,EAC9B,wBAAkD,EAClD,qBAA4C,EAC5C,mBAAkD,EAAA;QANlD,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,wBAAwB,GAAxB,wBAAwB;QACxB,IAAA,CAAA,qBAAqB,GAArB,qBAAqB;QACrB,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;IACzB;AAEJ,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,sBAAsB,EAAE;AAC7B,QAAA,IAAI,MAAM,IAAI,CAAC,qBAAqB,EAAE,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YACxB,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB;QACF;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACtC,YAAA,cAAc,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACzC,YAAA,WAAW,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;AACvC,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AACrE,YAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAChC,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,SAAS,CACvE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAI;YACjC,IAAI,CAAC,MAAM,EAAE;gBACX;YACF;AACA,YAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;YACzB,MAAM,WAAW,GAAG,CAAC,YAAY,IAAI,EAAE,EAAE,QAAQ,EAAE;AACnD,YAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW;AACnC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;YAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC;AAClE,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CACzD,IAAI,CAAC,QAAQ,EACb,gBAAgB,CACjB;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU;AAClC,gBAAA,IAAI,CAAC,cAAc,GAAG,UAAU;AAChC,gBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;YAClC;YAEA,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACnD,gBAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;AACtC,gBAAA,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC;AAC/C,aAAA,CAAC;AACF,YAAA,MAAM,SAAS,GACb,YAAY,EAAE,iBAAiB,GAAG,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACtE,gBAAA,YAAY,EAAE,qBAAqB;AACnC,gBAAA,WAAW;AACb,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;YACjC,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU;AAClC,gBAAA,IAAI,CAAC,cAAc,GAAG,UAAU;YAClC;AACA,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,YAAA,MAAM,YAAY,GAAQ;gBACxB,IAAI,YAAY,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC;aAC1D;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,YAAY,CAAC,IAAI,GAAG,UAAU;YAChC;AACA,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE;AAC5B,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,WAAW,EAAE,YAAY;AACzB,gBAAA,SAAS,EAAE,KAAK;AACjB,aAAA,CAAC;AACF,YAAA,MAAM,cAAc,GAAG;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;gBAClD,MAAM;AACN,gBAAA,WAAW,EAAE,YAAY;AACzB,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,QAAQ,EAAE,CAAC;AACX,gBAAA,MAAM,EAAE,UAAU;AAClB,gBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,gBAAA,WAAW,EAAE,SAAS;aACvB;YACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;AACrD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC;AAChE,aAAA,CAAC;AACJ,QAAA,CAAC,CACF;AAED,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,SAAS,CACjE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAI;AACpB,YAAA,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;gBACrB;YACF;YACA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE;gBACT;YACF;AACA,YAAA,IAAI,KAAK,KAAK,SAAS,CAAC,SAAS,EAAE;AACjC,gBAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;AAC5C,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3C,gBAAA,MAAM,cAAc,GAAG;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;oBAClD,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,oBAAA,QAAQ,EAAE,CAAC;AACX,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,oBAAA,WAAW,EAAE,SAAS;iBACvB;gBACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;AACrD,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;AACjE,iBAAA,CAAC;gBACF;YACF;AACA,YAAA,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,IAAI,KAAK,KAAK,SAAS,CAAC,MAAM,EAAE;AAClE,gBAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;AAC5C,gBAAA,IAAI,cAAc,GAChB,IAAI,CAAC,qBAAqB,IAAI,QAAQ;AACxC,gBAAA,IAAI,gBAAoC;gBACxC,IAAI,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE;oBAC1D,cAAc,GAAG,IAAI;oBACrB,gBAAgB,GAAG,UAAU;gBAC/B;gBACA,MAAM,MAAM,GAAG,cAAc;gBAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;gBACjD,MAAM,QAAQ,GAAG;sBACb,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,IAAI,CAAC;sBACvD,CAAC;AACL,gBAAA,MAAM,cAAc,GAAG;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;oBAClD,MAAM;oBACN,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ;oBACR,MAAM;AACN,oBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,oBAAA,WAAW,EAAE,cAAc;oBAC3B,cAAc;oBACd,gBAAgB;iBACjB;gBACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;AACrD,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA,SAAA,EAAY,MAAM,CAAA,QAAA,CAAU,EAAE,GAAG,CAAC;AACjE,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC;AAChC,gBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;AAClC,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;gBACjC,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,KAAK,MAAM,EAAE;AAChD,oBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,oBAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,oBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;gBAC9B;YACF;AACF,QAAA,CAAC,CACF;QAED,IAAI,CAAC,cAAc,EAAE;IACvB;AAEQ,IAAA,MAAM,qBAAqB,GAAA;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,EAAE;QAEvC,IAAI,KAAK,EAAE;AACT,YAAA,IAAI;gBACF,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC;gBACrD,IAAI,CAAC,EAAE,EAAE;AACP,oBAAA,IAAI,CAAC,gBAAgB,GAAG,+BAA+B;AACvD,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxC,gBAAA,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,KAAK,CAAC;AAClD,gBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE;gBACxD;AACA,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAChB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE;gBACpD;AACA,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,gBAAA,OAAO,IAAI;YACb;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC;AACpD,gBAAA,IAAI,CAAC,gBAAgB,GAAG,wBAAwB;AAChD,gBAAA,OAAO,KAAK;YACd;oBACQ;AACN,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YAC1B;QACF;QAEA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;AAChC,YAAA,IAAI;AACF,gBAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAClD,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CACZ;gBACD,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,IAAI,CAAC,gBAAgB,GAAG,wBAAwB;AAChD,oBAAA,OAAO,KAAK;gBACd;gBACA,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;gBACpD,IAAI,CAAC,QAAQ,EAAE;AACb,oBAAA,IAAI,CAAC,gBAAgB,GAAG,+BAA+B;AACvD,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC3C,gBAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;AACrB,gBAAA,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC;AACrD,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,gBAAA,OAAO,IAAI;YACb;YAAE,OAAO,GAAG,EAAE;AACZ,gBAAA,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC;AACzC,gBAAA,IAAI,CAAC,gBAAgB,GAAG,wBAAwB;AAChD,gBAAA,OAAO,KAAK;YACd;oBACQ;AACN,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;YAC1B;QACF;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,+BAA+B;AACvD,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,IAAI,MAAM,IAAI,CAAC,qBAAqB,EAAE,EAAE;AACtC,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;YAC1B,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;AACjC,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,QAAA,IAAI,CAAC,0BAA0B,GAAG,KAAK;AACvC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAEhC,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;YAC1B;QACF;AAEA,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;;AAG3B,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,WAAW;aACtC,IAAI,CAAC,MAAK;AACT,YAAA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC;AACnC,gBAAA,WAAW,EAAE,IAAI,CAAC,iBAAiB,IAAI,OAAO;gBAC9C,SAAS,EAAE,IAAI,CAAC,gBAAgB;AAChC,gBAAA,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,EAAE;gBAChD,MAAM,EAAE,IAAI,CAAC,0BAA0B;AACvC,gBAAA,QAAQ,EAAE,IAAI,CAAC,4BAA4B,EAAE,QAAQ,EAAE;gBACvD,MAAM,EAAE,IAAI,CAAC,0BAA0B;AACvC,gBAAA,QAAQ,EAAE,IAAI,CAAC,4BAA4B,EAAE,QAAQ,EAAE;AACxD,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE;YAC3B,IAAI,CAAC,eAAe,CAAC,KAAK,CACxB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,EACnC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CACjC;AACH,QAAA,CAAC;AACA,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC;AAC5C,YAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AACjC,QAAA,CAAC,CAAC;IACN;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACtB,IAAI,CAAC,YAAY,EAAE;IACrB;AAEQ,IAAA,iBAAiB,CAAC,MAAW,EAAA;QACnC,IAAI,CAAC,MAAM,EAAE;YACX;QACF;AAEA,QAAA,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE;YAC/B,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;gBAC1B,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;AAChD,oBAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC;AAC1C,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,cAAc,EAAE;YACvB;YACA;QACF;QAEA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU;QACjD,QAAQ,MAAM;YACZ,KAAK,UAAU,CAAC,aAAa;AAC3B,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,gBAAA,IAAI,CAAC,0BAA0B,GAAG,KAAK;AACvC,gBAAA,IAAI,CAAC,0BAA0B,GAAG,KAAK;AACvC,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAChC,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;gBAChC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,KAAI;AAChD,oBAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC;AAC1C,gBAAA,CAAC,CAAC;gBACF,IAAI,CAAC,cAAc,EAAE;gBACrB;YACF,KAAK,UAAU,CAAC,SAAS;AACvB,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;gBACtB,IAAI,CAAC,YAAY,EAAE;gBACnB;YACF,KAAK,UAAU,CAAC,YAAY;YAC5B,KAAK,UAAU,CAAC,mBAAmB;YACnC,KAAK,UAAU,CAAC,mBAAmB;AACjC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,MAAM,EAAE,MAAM,KAAK,qBAAqB,EAAE;AAC5C,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,oBAAA,IAAI,CAAC,0BAA0B,GAAG,KAAK;gBACzC;qBAAO;AACL,oBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;AAC/B,oBAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI;gBACxC;gBACA;YACF,KAAK,UAAU,CAAC,iBAAiB;YACjC,KAAK,UAAU,CAAC,sBAAsB;AACpC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;gBAC/B;YACF,KAAK,UAAU,CAAC,oBAAoB;AAClC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;gBAC/B;AACF,YAAA;gBACE;;IAEN;AAEA,IAAA,SAAS,CAAC,GAAmD,EAAA;AAC3D,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;IACtB;AAEA,IAAA,iBAAiB,CAAC,OAA2C,EAAA;AAC3D,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAC3B;AAEA,IAAA,eAAe,CAAC,WAAmB,EAAA;AACjC,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IAC/B;AAEA,IAAA,kBAAkB,CAAC,OAA2C,EAAA;AAC5D,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAC3B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,qBAAqB,GAAG,OAAO;YACpC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,mBAAmB,EAAE;AAClE,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY;YACtD,MAAM,YAAY,GAChB,eAAe,EAAE,MAAM,IAAI,YAAY,IAAI,IAAI;YACjD,IAAI,YAAY,EAAE;gBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AAChD,gBAAA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAC3B,oBAAA,MAAM,cAAc,GAAG;wBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;AAClD,wBAAA,MAAM,EAAE,YAAY;wBACpB,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,wBAAA,QAAQ,EAAE,CAAC;AACX,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,wBAAA,WAAW,EAAE,SAAS;AACtB,wBAAA,cAAc,EAAE,OAAO;qBACxB;oBACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;AACrD,wBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC;AACxE,qBAAA,CAAC;AACF,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,YAAY,CAAC;AACtC,oBAAA,IAAI,eAAe,EAAE,MAAM,EAAE;AAC3B,wBAAA,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;oBAC9C;AACA,oBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;gBACnC;YACF;AACA,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;QACjC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,CAAC;QACzC;IACF;AAEA,IAAA,cAAc,CAAC,MAId,EAAA;AACC,QAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC;IACnD;AAEA,IAAA,aAAa,CAAC,OAAgB,EAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAC3B,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/D;QAAE,MAAM,EAAE;IACZ;AAEA,IAAA,kBAAkB,CAAC,MAAe,EAAA;AAChC,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM;AACtB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,WAAW,CAAC,GAAQ,EAAA;QAChC,MAAM,YAAY,GAChB,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI;AAC5D,QAAA,MAAM,WAAW,GAAG,mBAAmB,CACrC,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,mBAAmB;AACxB,YAAA,GAAG,EAAE,MAAM;AACX,aAAC,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,EAAE,CAAC,CACrC;QACD,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC;YACtC;QACF;AACA,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AACzB,QAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,YAAY,IAAI,IAAI;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC;QAClE,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,CACzD,IAAI,CAAC,QAAQ,EACb,gBAAgB,CACjB;YACD,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,cAAc,GAAG,UAAU;YAClC;QACF;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,WAAW,CAAC;AACpD,QAAA,IAAI;YACF,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACnD,gBAAA,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;AACtC,gBAAA,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,gBAAgB,CAAC;AACtF,aAAA,CAAC;AACF,YAAA,MAAM,SAAS,GACb,YAAY,EAAE,iBAAiB,GAAG,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;AACtE,gBAAA,YAAY,EAAE,qBAAqB;AACnC,gBAAA,WAAW;AACb,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;YACjC,IAAI,YAAY,EAAE;AAChB,gBAAA,IAAI,CAAC,cAAc,GAAG,YAAY;YACpC;iBAAO,IAAI,UAAU,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,GAAG,UAAU;YAClC;YACA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7D,IAAI,CAAC,IAAI,EAAE;gBACT;YACF;AACA,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY;YAChD,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;gBACjC,MAAM,YAAY,GAAQ,YAAY,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE;AAC9E,gBAAA,MAAM,YAAY,GAAG,YAAY,IAAI,UAAU;AAC/C,gBAAA,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACtC,oBAAA,YAAY,CAAC,IAAI,GAAG,YAAY;gBAClC;AACA,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE;AAC5B,oBAAA,SAAS,EAAE,UAAU;AACrB,oBAAA,WAAW,EAAE,YAAY;AACzB,oBAAA,SAAS,EAAE,KAAK;AACjB,iBAAA,CAAC;AACF,gBAAA,MAAM,cAAc,GAAG;oBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;oBAClD,MAAM;AACN,oBAAA,WAAW,EAAE,YAAY;AACzB,oBAAA,SAAS,EAAE,UAAU;AACrB,oBAAA,QAAQ,EAAE,CAAC;AACX,oBAAA,MAAM,EAAE,WAAW;AACnB,oBAAA,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACnC,oBAAA,WAAW,EAAE,SAAS;iBACvB;gBACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;AACrD,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;AACjE,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC;QAC5C;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE;AACnC,QAAA,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE;IAClC;IAEQ,MAAM,oBAAoB,CAAC,WAAmB,EAAA;QACpD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;AACnD,YAAA,OAAO,CAAC,IAAI,CACV,wDAAwD,EACxD,WAAW,CACZ;AACD,YAAA,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE;QAC5B;AAEA,QAAA,IAAI,qBAAqB,GAAG,WAAW,CAAC,IAAI,EAAE;AAC9C,QAAA,IAAI,qBAAqB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC1C,qBAAqB,GAAG,GAAG,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC;QAClE;QACA,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,yBAAyB,IAAI,EAAE;AAC5D,aAAA,QAAQ;AACR,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACrB,QAAA,IACE,WAAW;AACX,YAAA,CAAC,qBAAqB,CAAC,UAAU,CAAC,GAAG,CAAC;AACtC,YAAA,CAAC,qBAAqB,CAAC,UAAU,CAAC,IAAI,CAAC,EACvC;YACA,IAAI,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACrD,YAAA,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACjD,gBAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1B;AACA,YAAA,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;AAClC,gBAAA,qBAAqB,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;YACtC;iBAAO;AACL,gBAAA,qBAAqB,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,EAAG,MAAM,EAAE;YACpD;QACF;AAEA,QAAA,IAAI;YACF,MAAM,qBAAqB,GACzB,MAAM,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CACnD,qBAAqB,CACtB;AAEH,YAAA,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,KAAK,EAAE;AACvC,gBAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;YAClD;AAEA,YAAA,MAAM,WAAW,GAAG,qBAAqB,EAAE;AACzC,kBAAE,qBAAqB,CAAC,IAAI,CAAC,cAAc;kBACzC,IAAI;YACR,MAAM,6BAA6B,GAAG;kBAClC,MAAM,IAAI,CAAC,cAAc,CAAC,yBAAyB,CAAC,WAAW;kBAC/D,IAAI;YACR,OAAO;AACL,gBAAA,qBAAqB,EAAE,qBAAqB;gBAC5C,iBAAiB,EAAE,qBAAqB,EAAE,IAAI;AAC9C,gBAAA,OAAO,EAAE,6BAA6B;aACvC;QACH;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CACV,CAAA,8BAAA,EAAiC,WAAW,CAAA,EAAA,CAAI,EAChD,GAAG,CACJ;AACD,YAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE;QACzD;IACF;IAEQ,MAAM,uBAAuB,CACnC,WAAmB,EAAA;AAEnB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE;AAC7B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,CACvD,QAAQ,EACR,WAAW,CACZ;QACH;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,CAAC;AAC9C,YAAA,OAAO,IAAI;QACb;IACF;AAEQ,IAAA,uBAAuB,CAAC,KAAa,EAAA;QAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,YAAA,OAAO,EAAE;QACX;AACA,QAAA,IAAI,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE;AAC7B,QAAA,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YAC/B,UAAU,GAAG,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC;QACA,MAAM,WAAW,GAAG,CAAC,UAAU,CAAC,yBAAyB,IAAI,EAAE;AAC5D,aAAA,QAAQ;AACR,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;QACA,IAAI,KAAK,GAAG,MAAM;AAClB,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC/C,YAAA,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxB;QACA,IAAI,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;YAChD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;QACzC;AACA,QAAA,OAAO,KAAK;IACd;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE;gBACpD,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE;aACjD;AACD,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjE;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC;QACtD;IACF;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAClD,IAAI,CAAC,GAAG,EAAE;gBACR;YACF;YACA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9B,YAAA,IAAI,MAAM,EAAE,QAAQ,EAAE;AACpB,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,gBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AACxB,oBAAA,cAAc,EAAE,MAAM,CAAC,SAAS,IAAI,EAAE;AACtC,oBAAA,WAAW,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;AACnC,iBAAA,CAAC;gBACF,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE;;oBAEvC,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACrC;YACF;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC;QACtD;IACF;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC;AACnD,YAAA,IAAI,MAAM,KAAK,IAAI,EAAE;gBACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI;AAClD,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe;YAC1C;QACF;QAAE,MAAM,EAAE;IACZ;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI;AACF,YAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAC3C;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,CAAC;QACpD;IACF;AAEQ,IAAA,aAAa,CAAC,GAAW,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;gBAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,CAAA,YAAA,EAAe,GAAG,CAAA,EAAA,CAAI,CACvB;gBACD,IAAI,QAAQ,EAAE;oBACZ,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE;AACzC,wBAAA,OAAO,EAAE;wBACT;oBACF;oBACA,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,CAAC;AAClD,oBAAA,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;oBACpD;gBACF;gBACA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,gBAAA,MAAM,CAAC,GAAG,GAAG,GAAG;AAChB,gBAAA,MAAM,CAAC,KAAK,GAAG,IAAI;AACnB,gBAAA,MAAM,CAAC,KAAK,GAAG,IAAI;AACnB,gBAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO;AAClC,gBAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,oBAAA,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM;AACjC,oBAAA,OAAO,EAAE;AACX,gBAAA,CAAC;AACD,gBAAA,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;AACjC,gBAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;AACnC,YAAA,CAAC,CAAC;QACJ;QACA,OAAO,IAAI,CAAC,gBAAgB;IAC9B;uGA3vBW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAjB,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAU,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAAQ,cAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,wBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAAX,IAAA,CAAA,6BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,ipBChBpC,gnbAmNA,EAAA,MAAA,EAAA,CAAA,o5LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAY,oBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,iBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,iBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,sBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,4BAAA,EAAA,4BAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,YAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDnMa,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,cAGzB,KAAK,EAAA,QAAA,EAAA,gnbAAA,EAAA,MAAA,EAAA,CAAA,o5LAAA,CAAA,EAAA;;sBAGhB,WAAW;uBAAC,iBAAiB;;sBAG7B;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;;MEiBU,oBAAoB,CAAA;uGAApB,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,iBAzB7B,uBAAuB;YACvB,oBAAoB;YACpB,oBAAoB;YACpB,iBAAiB;YACjB,oBAAoB;YACpB,uBAAuB;YACvB,iBAAiB;YACjB,sBAAsB;YACtB,cAAc;YACd,kBAAkB;YAClB,sBAAsB;AACtB,YAAA,oBAAoB,aAGpB,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,kBAAkB;YAClB,cAAc;YACd,aAAa;YACb,eAAe;AACf,YAAA,qBAAqB,aAEb,uBAAuB,CAAA,EAAA,CAAA;AAEtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAX7B,YAAY;YACZ,WAAW;YACX,mBAAmB;YACnB,kBAAkB;YAClB,cAAc;YACd,aAAa;YACb,eAAe;YACf,qBAAqB,CAAA,EAAA,CAAA;;2FAIZ,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA3BhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,uBAAuB;wBACvB,oBAAoB;wBACpB,oBAAoB;wBACpB,iBAAiB;wBACjB,oBAAoB;wBACpB,uBAAuB;wBACvB,iBAAiB;wBACjB,sBAAsB;wBACtB,cAAc;wBACd,kBAAkB;wBAClB,sBAAsB;wBACtB,oBAAoB;AACrB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,mBAAmB;wBACnB,kBAAkB;wBAClB,cAAc;wBACd,aAAa;wBACb,eAAe;wBACf,qBAAqB;AACtB,qBAAA;oBACD,OAAO,EAAE,CAAC,uBAAuB,CAAC;AACnC,iBAAA;;;AChDD;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"snugdesk-avaya-ipo-widget.mjs","sources":["../../../projects/avaya-ipo-widget/src/lib/config/app-config.ts","../../../projects/avaya-ipo-widget/src/lib/services/avaya-ipo.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/country.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/phone-number-lookup.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/authentication.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/entities-search.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-details/call-details.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-details/call-details.component.html","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-history.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-history.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-card/contact-card.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-card/contact-card.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-details/contact-details.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-details/contact-details.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contacts.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contacts.component.html","../../../projects/avaya-ipo-widget/src/lib/components/settings/settings.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/settings/settings.component.html","../../../projects/avaya-ipo-widget/src/lib/components/login/login.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/login/login.component.html","../../../projects/avaya-ipo-widget/src/lib/services/recording-manager.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/transcription-stream.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/idle/phone-idle.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/idle/phone-idle.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/incoming/phone-incoming.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/incoming/phone-incoming.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/active/phone-active.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/active/phone-active.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/phone.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/phone.component.html","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.component.ts","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.component.html","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.module.ts","../../../projects/avaya-ipo-widget/src/public-api.ts","../../../projects/avaya-ipo-widget/src/snugdesk-avaya-ipo-widget.ts"],"sourcesContent":["export const APP_CONFIG = {\n // Widget build version — shown in the footer so you can confirm which build is loaded.\n // Keep this in sync with the \"version\" field in projects/avaya-ipo-widget/package.json.\n WIDGET_VERSION: '0.2.3',\n ASSET_CDN_BASE_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget',\n AWL_SDK_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/js/awl.min.js',\n AGENT_STATUS_API_URL: 'https://v2xla9n0t6.execute-api.us-west-2.amazonaws.com/dev',\n CALL_HISTORY_API_URL: 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory',\n // Snugdesk backend (SnugdeskApiV1) endpoint that upserts a call as a real Interaction so it shows\n // up in the same call history as every other channel in snugdesk-app.\n INTERACTION_CALL_LOG_API_URL: 'https://api.snugdesk.com/avaya-ipo/call-log',\n // Stores the full call recording in the backend and links it to the Interaction, triggering the\n // server-side Gemini transcription/summary pipeline.\n INTERACTION_CALL_RECORDING_API_URL: 'https://api.snugdesk.com/avaya-ipo/call-recording',\n CALL_SESSION_WS_URL: 'wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession',\n TRANSCRIPTION_WS_URL: 'ws://localhost:3100/live-stt/stream',\n TRANSCRIPTION_LANGUAGE: 'auto',\n TRANSCRIPTION_MODEL: 'nova-2',\n POSTCALL_TRANSCRIBE_API_URL: 'https://nqfo27pht1.execute-api.us-east-1.amazonaws.com/Stage/ai-transcription/post-call-analysis',\n COUNTRY_ENDPOINT: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/metadata/countries.json',\n PHONE_NUMBER_LOOKUP_BASE: 'https://api.snugdesk.com/phone-numbers',\n PHONE_NUMBER_HLR_BASE: 'https://api.snugdesk.com/phone-numbers/hlr',\n PHONE_LOOKUP_COUNTRY_CODE: '91',\n ENTITY_SEARCH_BASE: 'https://search.snugdesk.com/entities',\n OPENSEARCH_ENTITIES_URL: 'https://api.snugdesk.com/opensearch/entities',\n PUSH_API_BASE: 'https://<your-api-id>.execute-api.<region>.amazonaws.com',\n DIAL_OUT_PREFIX: '0',\n} as const;\n\nexport const assetUrl = (path: string): string => {\n const base = APP_CONFIG.ASSET_CDN_BASE_URL.replace(/\\/$/, '');\n const cleanPath = path.replace(/^\\//, '');\n return `${base}/${cleanPath}`;\n};\n\nexport const formatDialOutNumber = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n const raw = value.toString().trim();\n if (!raw) {\n return '';\n }\n\n let digits = raw.replace(/\\D/g, '');\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n\n if (countryCode && digits.startsWith(countryCode) && digits.length > 10) {\n digits = digits.slice(countryCode.length);\n }\n\n if (digits.length === 10) {\n return `${APP_CONFIG.DIAL_OUT_PREFIX || ''}${digits}`;\n }\n\n return digits;\n};\n","import { Injectable, NgZone } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { APP_CONFIG, assetUrl } from '../config/app-config';\n\ndeclare var AWL: any;\n\nexport enum LoginState {\n LOGIN_SUCCESS = 'AWL_MSG_LOGIN_SUCCESS',\n LOGIN_FAILED = 'AWL_MSG_LOGIN_FAILED',\n LOGIN_EMPTYUSERNAME = 'AWL_MSG_LOGIN_EMPTYUSERNAME',\n LOGIN_EMPTYPASSWORD = 'AWL_MSG_LOGIN_EMPTYPASSWORD',\n LOGIN_GW_NOTCONFIGURED = 'AWL_MSG_LOGIN_GW_NOTCONFIGURED',\n LOGGEDOUT = 'AWL_MSG_LOGGEDOUT',\n WEBSOCKET_FAILURE = 'AWL_MSG_LOGIN_WEBSOCKET_FAILURE',\n DEVICEACCESS_FAILURE = 'AWL_MSG_DEVICEACCESS_FAILURE',\n RELOGGED_IN = 'AWL_MSG_RELOGGED_IN',\n RECONNECTING = 'AWL_MSG_RECONNECTING',\n FAILING_OVER = 'AWL_MSG_FAILING_OVER',\n FAILOVER_SUCCESS = 'AWL_MSG_FAIL_OVER_SUCCESS',\n FAILOVER_FAILED = 'AWL_MSG_FAIL_OVER_FAILED',\n FAILING_BACK = 'AWL_MSG_FAILING_BACK',\n FAILBACK_SUCCESS = 'AWL_MSG_FAIL_BACK_SUCCESS',\n FAILBACK_FAILED = 'AWL_MSG_FAIL_BACK_FAILED',\n}\n\nexport enum CallState {\n IDLE = 'AWL_MSG_CALL_IDLE',\n PROGRESSING = 'AWL_MSG_CALL_PROGRESSING',\n RINGING = 'AWL_MSG_CALL_RINGING',\n CONNECTED = 'AWL_MSG_CALL_CONNECTED',\n DISCONNECTED = 'AWL_MSG_CALL_DISCONNECTED',\n FAILED = 'AWL_MSG_CALL_FAILED',\n INCOMING = 'AWL_MSG_CALL_INCOMING',\n HELD = 'AWL_MSG_CALL_HELD',\n TRANSFERRED = 'AWL_MSG_CALL_TRANSFERRED',\n FAREND_UPDATE = 'AWL_MSG_CALL_FAREND_UPDATE',\n}\n\nexport interface RemoteMedia {\n callId: string;\n stream: MediaStream;\n}\n\nexport class AvayaIPOCallListener {\n constructor(private service: AvayaIPOService) { }\n\n onNewIncomingCall = (callId: any, callObj: any, autoAnswer: any): void => {\n const farEndNumber = callObj.getFarEndNumber();\n this.service.zone.run(() => {\n this.service.setLastIncomingCall(callId, farEndNumber);\n this.service.incomingCallSubject.next({\n callId,\n farEndNumber,\n });\n });\n\n if (!this.service.activeCallsMap.has(callId)) {\n this.service.assignToFirstAvailableSlot(callId, callObj);\n }\n };\n onCallStateChange = (callId: any, callObj: any, event: any): void => {\n // Raw callback from AWL (WebSocket JSON-RPC). Useful to see the original event.\n console.debug('[AWL] onCallStateChange raw →', { callId, event });\n const state = callObj.getCallState();\n this.service.zone.run(() => {\n this.service.callStateSubject.next({ callId, state });\n });\n\n if (event === 'CallTransferSuccessful') {\n console.debug('Call transfer successful');\n }\n\n this.service.handleCallState(callObj);\n\n try {\n const remote = callObj?.getRemoteStream?.();\n\n // if (remote instanceof MediaStream) {\n // this.service.remoteStream = remote;\n // this.service.remoteStream$.next(remote);\n // }\n if (remote instanceof MediaStream) {\n const payload: RemoteMedia = { callId, stream: remote };\n this.service.remoteStream = payload;\n this.service.remoteStream$.next(payload);\n }\n } catch (err) {\n console.warn('Failed to extract media streams', err);\n }\n };\n\n onCallTerminate = (callId: any, reason: any): void => {\n this.service.releaseCallById(callId);\n console.debug('Call terminated: ', reason);\n this.service.zone.run(() => {\n this.service.callTerminateSubject.next({ callId, reason });\n });\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AvayaIPOService {\n private cli!: any; // This should be the type of your Avaya IPO CLI instance\n\n public remoteStream: RemoteMedia | null = null;\n readonly remoteStream$ = new BehaviorSubject<RemoteMedia | null>(null);\n public localStream: MediaStream | null = null;\n public incomingCallSubject = new Subject<{\n callId: string;\n farEndNumber: string;\n }>();\n public callTerminateSubject = new Subject<{ callId: string; reason: any }>();\n public outgoingDialSubject = new BehaviorSubject<{ dialed: string } | null>(\n null\n );\n private ringAudio: HTMLAudioElement | null = null;\n private lastIncomingCall: { callId: string; farEndNumber: string } | null =\n null;\n public callStateSubject = new Subject<{ callId: string; state: string }>();\n public transferStatusSubject = new Subject<{\n callId?: string;\n success: boolean;\n message: string;\n }>();\n private transferInProgressCallId: string | null = null;\n\n private callSlots: Record<'1' | '2' | '3', any | null> = {\n '1': null,\n '2': null,\n '3': null,\n };\n public activeCallsMap = new Map<string, any>();\n public activeCallId: string | null = null;\n public currentcallId: string | null = null;\n\n public getLastIncomingCall():\n | { callId: string; farEndNumber: string }\n | null {\n return this.lastIncomingCall;\n }\n\n public clearLastIncomingCall(): void {\n this.lastIncomingCall = null;\n this.stopRingTone();\n }\n\n public notifyOutgoingDial(dialed: string): void {\n if (!dialed) {\n return;\n }\n this.outgoingDialSubject.next({ dialed });\n }\n\n public clearOutgoingDial(): void {\n this.outgoingDialSubject.next(null);\n }\n\n public getActiveCallCount(): number {\n return this.activeCallsMap.size;\n }\n\n public setLastIncomingCall(callId: string, farEndNumber: string): void {\n this.lastIncomingCall = { callId, farEndNumber };\n this.startRingTone();\n }\n\n private startRingTone(): void {\n try {\n if (!this.ringAudio) {\n this.ringAudio = new Audio();\n }\n this.ringAudio.src = assetUrl('assets/sounds/ringback_tone.mp3');\n this.ringAudio.loop = true;\n this.ringAudio.currentTime = 0;\n this.ringAudio.play().catch(() => {\n // Ignore autoplay failures.\n });\n } catch {\n // ignore play errors\n }\n }\n\n private stopRingTone(): void {\n if (!this.ringAudio) {\n return;\n }\n try {\n this.ringAudio.pause();\n this.ringAudio.currentTime = 0;\n this.ringAudio.src = '';\n } catch {\n // ignore teardown errors\n }\n }\n\n private agentId = '';\n private loginStatusSubject = new BehaviorSubject<boolean>(false);\n public loginStatus$ = this.loginStatusSubject.asObservable();\n\n private readonly DOM_TAGS = {\n localVideo: 'lclVideo',\n remoteVideo: 'rmtVideo',\n remoteAudio: 'rmtAudio',\n localAudio: 'lclAudio',\n };\n\n private configTemplate = {\n serviceType: '', // expected: 'phone' or 'agent' (must be provided)\n enableVideo: false,\n Gateway: { ip: '', port: '' },\n Stunserver: { ip: '', port: '' },\n Turnserver: { ip: '', port: '', user: '', pwd: '' },\n AppData: { applicationID: '', applicationUA: '', appInstanceID: '' },\n disableResiliency: false,\n };\n\n private readonly agentStatusApiUrl = APP_CONFIG.AGENT_STATUS_API_URL;\n\n private prewarmedStream?: MediaStream;\n\n private isSafari(): boolean {\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n }\n\n private _rpcPatched = false;\n private _rpcMessageListenerWs?: WebSocket;\n private isLoggedIn = false;\n private initAttempts = 0;\n\n constructor(public zone: NgZone, private http: HttpClient) { }\n\n setConfigValues(opts: {\n serviceType?: string;\n gatewayIp?: string;\n gatewayPort?: string;\n stunIp?: string;\n stunPort?: string;\n turnIp?: string;\n turnPort?: string;\n }): void {\n const clean = (value?: string) => {\n const trimmed = value?.toString().trim();\n return trimmed ? trimmed : undefined;\n };\n const stunIp = clean(opts.stunIp);\n const stunPort = clean(opts.stunPort);\n const turnIp = clean(opts.turnIp);\n const turnPort = clean(opts.turnPort);\n this.configTemplate = {\n ...this.configTemplate,\n serviceType: opts.serviceType ?? this.configTemplate.serviceType,\n Gateway: {\n ...this.configTemplate.Gateway,\n ip: clean(opts.gatewayIp) ?? this.configTemplate.Gateway.ip,\n port: clean(opts.gatewayPort) ?? this.configTemplate.Gateway.port,\n },\n Stunserver: {\n ...this.configTemplate.Stunserver,\n ip: stunIp ?? this.configTemplate.Stunserver.ip,\n port: stunPort ?? this.configTemplate.Stunserver.port,\n },\n Turnserver: {\n ...this.configTemplate.Turnserver,\n ip: turnIp ?? this.configTemplate.Turnserver.ip,\n port: turnPort ?? this.configTemplate.Turnserver.port,\n user: this.configTemplate.Turnserver.user,\n pwd: this.configTemplate.Turnserver.pwd,\n },\n };\n }\n\n init() {\n // AWL is exposed by the SDK script. In some builds it shows up as `AWL`,\n // in others as `awlGlobal`. Check every known slot before giving up.\n const awlRef: any =\n (typeof AWL !== 'undefined' ? (AWL as any) : undefined) ??\n (window as any)?.AWL ??\n (window as any)?.awlGlobal;\n if (awlRef) {\n this.cli = new awlRef.client();\n this.logCliCapabilities('init');\n const cliAny = this.cli as any;\n Object.defineProperty(cliAny, 'jsonRpc', {\n configurable: true,\n set: (rpcClient: any) => {\n // restore the real property\n delete cliAny.jsonRpc;\n cliAny.jsonRpc = rpcClient;\n // now do the patch\n this._doPatch();\n },\n });\n this.initAttempts = 0;\n } else {\n console.warn('AWL is not yet loaded');\n if (this.initAttempts < 5) {\n this.initAttempts++;\n setTimeout(() => this.init(), 400);\n }\n }\n }\n\n logIn(username: string, password: string, attempt = 0): void {\n if (!this.cli) {\n this.init();\n }\n if (!this.cli) {\n if (attempt < 5) {\n setTimeout(() => this.logIn(username, password, attempt + 1), 300);\n return;\n }\n console.error('AWL client not initialized; cannot log in.');\n return;\n }\n this.logCliCapabilities('login');\n this.cli.enableLogging?.();\n // this.cli.disableLogging();\n\n const appInstanceId = this.cli.generateAppInstanceID();\n const config = {\n ...this.configTemplate,\n AppData: {\n ...this.configTemplate.AppData,\n appInstanceID: appInstanceId,\n },\n };\n // Avoid sending invalid STUN/TURN configs when values are empty.\n if (!config.Stunserver?.ip || !config.Stunserver?.port) {\n delete (config as any).Stunserver;\n }\n if (!config.Turnserver?.ip || !config.Turnserver?.port) {\n delete (config as any).Turnserver;\n }\n console.debug('Parsed config: ', config);\n\n const res_setConfiguration = this.cli.setConfiguration(\n config,\n this.handleConfigChange,\n this.handleRegistrationChange,\n new AvayaIPOCallListener(this),\n this.handleTokenRenewal\n );\n console.debug('res_setConfiguration: ', res_setConfiguration);\n\n if (res_setConfiguration === 'AWL_MSG_SETCONFIG_SUCCESS') {\n console.debug('SET CONFIG SUCCESS');\n }\n\n const res_setDomElements = this.cli.setDomElements(this.DOM_TAGS);\n console.debug('res_setDomElements: ', res_setDomElements);\n\n if (res_setDomElements === 'AWL_MSG_SETDOM_FAILED') {\n console.debug('SET DOM FAILED');\n } else {\n console.debug('SET DOM PASS');\n }\n\n const bumbConnection = 'true';\n this.cli.logIn(username, password, bumbConnection);\n this.setAgentId(username);\n }\n\n private logCliCapabilities(label: string): void {\n if (!this.cli) {\n console.warn(`[AWL] ${label}: client not ready`);\n return;\n }\n const cliAny = this.cli as any;\n const ownMethods = Object.keys(cliAny).filter(\n (key) => typeof cliAny[key] === 'function'\n );\n const proto = Object.getPrototypeOf(cliAny);\n const protoMethods = proto\n ? Object.getOwnPropertyNames(proto).filter(\n (key) => key !== 'constructor' && typeof cliAny[key] === 'function'\n )\n : [];\n const methods = Array.from(new Set([...ownMethods, ...protoMethods])).sort();\n if (methods.length === 0) {\n console.warn(`[AWL] ${label}: no methods found on client`, {\n ownKeys: Object.keys(cliAny),\n protoKeys: proto ? Object.getOwnPropertyNames(proto) : [],\n });\n return;\n }\n }\n\n logOut(): void {\n if (!this.isLoggedIn) {\n console.debug('Logout skipped: client not logged in');\n return;\n }\n this.cli.logOut();\n }\n\n logout(): void {\n const jsonRpc = (this.cli as any)?.jsonRpc;\n const ws: WebSocket | undefined = jsonRpc?.ws;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n console.warn('Logout skipped: JSON-RPC websocket not ready; falling back to SDK logout');\n this.logOut();\n return;\n }\n const id =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `logout-${Date.now()}`;\n ws.send(\n JSON.stringify({\n protocol: 'jsonrpc-3.0.0',\n id,\n service: 'phoneservice',\n msgname: 'logout',\n params: null,\n })\n );\n }\n\n getAlternateServerConfig(): any {\n return this.cli.getAlternateServerConfig();\n }\n\n getDeviceList(): void {\n this.cli.getDeviceList((deviceList: any[]) => {\n console.debug('Device List: ', deviceList);\n });\n }\n\n setDeviceIds(deviceIds: any): void {\n console.debug('setDeviceIds: ', deviceIds);\n this.cli.setDeviceIds(deviceIds);\n }\n\n public async makeCall(destination: string): Promise<'1' | '2' | '3' | null> {\n\n await this.prewarmMic();\n console.debug('makeCall devicelist: ', this.getDeviceList());\n const freeSlot = (['1', '2', '3'] as const).find(\n (s) => this.callSlots[s] === null\n );\n if (!freeSlot) {\n console.warn('All call slots are currently occupied.');\n return null;\n }\n\n // const callObj = this.cli.makeCall(destination, 'audio');\n const callObj = this.cli.makeCall(destination, 'video', {\n headers: { 'X-Original-Caller': 'asees' },\n });\n\n if (!callObj) {\n console.error('Error! Cannot make call.');\n return null;\n }\n\n const callId = callObj.getCallId();\n this.activeCallsMap.set(callId, callObj);\n this.callSlots[freeSlot] = callObj;\n this.activeCallId = callId;\n\n return freeSlot;\n }\n\n dropCall(): void {\n if (!this.activeCallId) {\n console.warn('No active call to drop.');\n return;\n }\n\n // Find the slot that contains the active call using activeCallId\n let targetSlot: '1' | '2' | '3' | null = null;\n for (const [slot, callObj] of Object.entries(this.callSlots)) {\n if (callObj && callObj.getCallId() === this.activeCallId) {\n targetSlot = slot as '1' | '2' | '3';\n break;\n }\n }\n\n if (!targetSlot) {\n console.error(\n 'Active call slot not found for activeCallId:',\n this.activeCallId\n );\n return;\n }\n\n // Drop the active call from the identified slot\n const callId = this.callSlots[targetSlot].getCallId();\n const res_dropCall = this.cli.dropCall(callId);\n console.debug('res_dropCall: ', res_dropCall);\n\n // Remove the call from the activeCalls map and the slot\n this.activeCallsMap.delete(callId);\n this.callSlots[targetSlot] = null;\n\n // Reset activeCallId\n this.activeCallId = null;\n }\n\n doMute(): void {\n const res_doMute = this.cli.doMute(this.activeCallId);\n console.debug('res_doMute: ', res_doMute);\n }\n\n doUnMute(): void {\n const res_doUnMute = this.cli.doUnMute(this.activeCallId);\n console.debug('res_doUnMute: ', res_doUnMute);\n }\n\n doHold(): void {\n const res_doHold = this.cli.doHold(this.activeCallId);\n console.debug('res_doHold: ', res_doHold);\n }\n\n doUnHold(): void {\n const res_doUnHold = this.cli.doUnHold(this.activeCallId);\n console.debug('res_doUnHold: ', res_doUnHold);\n }\n\n pauseVideo(): void {\n const res_pauseVideo = this.cli.pauseVideo(this.activeCallId);\n console.debug('res_pauseVideo: ', res_pauseVideo);\n }\n\n playVideo(): void {\n const res_playVideo = this.cli.playVideo(this.activeCallId);\n console.debug('res_playVideo: ', res_playVideo);\n }\n\n transferCall(target: string, type: string): void {\n const res_transferCall = this.cli.transferCall(\n target,\n this.activeCallId,\n type\n );\n console.debug('res_transferCall: ', res_transferCall);\n if (res_transferCall) {\n this.transferInProgressCallId = this.activeCallId || null;\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: true,\n message: 'Transfer initiated',\n });\n } else {\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: false,\n message: 'Failed to transfer',\n });\n }\n }\n\n sendDTMF(digit: string | number): void {\n const res_sendDTMF = this.cli.sendDTMF(this.activeCallId, digit);\n console.debug('res_sendDTMF: ', res_sendDTMF);\n }\n\n answerCall(): void {\n const incomingCallId = this.lastIncomingCall?.callId || null;\n let callId = incomingCallId || this.activeCallId || null;\n\n if (!callId) {\n for (const callObj of Object.values(this.callSlots)) {\n if (callObj) {\n callId = callObj.getCallId();\n break;\n }\n }\n }\n\n if (!callId) {\n console.warn('No callId available to answer.');\n return;\n }\n\n this.activeCallId = callId;\n this.stopRingTone();\n const res_answerCall = this.cli.answerCall(callId);\n console.debug('res_answerCall: ', res_answerCall);\n\n if (incomingCallId) {\n this.clearLastIncomingCall();\n }\n }\n\n addVideo(): void {\n const res_addVideo = this.cli.addVideo(this.activeCallId);\n console.debug('res_addVideo: ', res_addVideo);\n }\n\n removeVideo(): void {\n const res_removeVideo = this.cli.removeVideo(this.activeCallId);\n console.debug('res_removeVideo: ', res_removeVideo);\n }\n\n clearCallSlot(): void {\n this.callSlots['1'] = null;\n }\n\n setAgentId(id: string): void {\n this.agentId = id;\n }\n\n agentIdle(): void {\n const params = new HttpParams()\n .set('action', 'release')\n .set('agentId', this.agentId);\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe(\n (response) => console.debug('Agent marked as idle: ', response),\n (error) => console.error('Error updating agent status: ', error)\n );\n }\n\n agentBusy(): void {\n const params = new HttpParams()\n .set('action', 'confirm')\n .set('agentId', this.agentId);\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe(\n (response) => console.debug('Agent marked as busy: ', response),\n (error) => console.error('Error updating agent status: ', error)\n );\n }\n\n agentAutoRelease(): void {\n setInterval(() => {\n const params = new HttpParams().set('action', 'auto-release');\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.get(this.agentStatusApiUrl, { params, headers }).subscribe(\n (response) => console.debug('Auto-release triggered: ', response),\n (error) => console.error('Auto-release failed: ', error)\n );\n }, 2 * 60 * 1000);\n }\n\n handleConfigChange = (res_configChange: any): void => {\n console.debug('res_configChange: ', res_configChange);\n };\n\n handleRegistrationChange = (res_registrationChange: any): void => {\n // console.debug('res_registrationChange: ', res_registrationChange);\n this.zone.run(() => {\n this.loginStatusSubject.next(res_registrationChange);\n });\n console.debug('res_registrationChange: ', res_registrationChange);\n if (res_registrationChange?.result === LoginState.LOGIN_SUCCESS) {\n const rpc: any = (this.cli as any).jsonRpc;\n this.isLoggedIn = true;\n if (rpc && rpc.ws) {\n rpc.ws.evtConnectionOpen.attach(() => {\n this.patchRpcForTransfers(this.agentId);\n });\n }\n }\n\n if (res_registrationChange?.result === LoginState.LOGIN_FAILED) {\n // LOGIN_FAILED means the client is not authenticated yet; skip SDK logout to avoid\n // \"Logout denied as client not logged in yet\".\n this.isLoggedIn = false;\n }\n\n };\n\n handleTokenRenewal = (res_tokenRenewal: any): void => {\n console.debug('res_tokenRenewal: ', res_tokenRenewal);\n if (res_tokenRenewal.result == 'AWL_MSG_TOKEN_RENEW_SUCCESS') {\n console.debug('Token is successfully renewed');\n } else {\n console.debug('Token renewal failed. reason: ', res_tokenRenewal.reason);\n }\n };\n\n assignToFirstAvailableSlot(callId: string, callObj: any): void {\n const freeSlot = Object.entries(this.callSlots).find(\n ([_, obj]) => obj === null\n );\n if (freeSlot) {\n this.callSlots[freeSlot[0] as '1' | '2' | '3'] = callObj;\n this.activeCallsMap.set(callId, callObj);\n // If we don't already have an active call tracked, set this incoming call as active.\n if (!this.activeCallId) {\n this.activeCallId = callId;\n }\n } else {\n console.warn('All call slots are occupied');\n }\n }\n\n getSlotForCallId(callId: string): '1' | '2' | '3' | null {\n for (const [slot, callObj] of Object.entries(this.callSlots)) {\n if (callObj && callObj.getCallId() === callId) {\n return slot as '1' | '2' | '3';\n }\n }\n return null;\n }\n\n releaseCallById(callId: string): void {\n for (const [slot, obj] of Object.entries(this.callSlots)) {\n if (obj?.getCallId() === callId) {\n this.callSlots[slot as '1' | '2' | '3'] = null;\n this.activeCallsMap.delete(callId);\n break;\n }\n }\n }\n\n handleCallState(callObj: any): void {\n console.debug(\n `Call state updated for Call ID: ${callObj?.getCallId()}`,\n callObj\n );\n console.debug(\n `Call state updated for Call ID: ${callObj?.getSipUri()}`,\n callObj\n );\n this.currentcallId = callObj.getCallId();\n const state = callObj.getCallState();\n if (!this.activeCallId) {\n this.activeCallId = callObj.getCallId();\n }\n switch (state) {\n case CallState.CONNECTED:\n this.stopRingTone();\n break;\n case CallState.FAILED:\n case CallState.DISCONNECTED:\n console.debug('Call Failed or DISCONNECTED! Releasing call...');\n this.stopRingTone();\n this.releaseCallById(callObj.getCallId());\n // Signal UI to reset to dialpad (ensure change detection runs)\n this.zone.run(() => {\n this.callStateSubject.next({\n callId: callObj.getCallId(),\n state: CallState.DISCONNECTED,\n });\n });\n break;\n case CallState.FAREND_UPDATE:\n console.debug(\n 'FarEnd Updated:',\n callObj.getFarEndNumber(),\n callObj.getFarEndName(),\n callObj.getSipUri()\n );\n break;\n default:\n console.debug('Call state: ', state);\n }\n }\n\n swapLines(): void {\n let currentSlotKey: string | null = null;\n\n // Find the slot key of the current active call\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (call && call.getCallId() === this.activeCallId) {\n currentSlotKey = key;\n break;\n }\n }\n\n if (!currentSlotKey) {\n console.warn('Active call slot not found.');\n return;\n }\n\n // Find another active call to swap to\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (key === currentSlotKey) continue;\n if (call) {\n const currentCall = this.callSlots[currentSlotKey as '1' | '2' | '3'];\n\n this.cli.doHold(currentCall?.getCallId());\n\n this.cli.doUnHold(call.getCallId());\n\n this.activeCallId = call.getCallId();\n return;\n }\n }\n\n console.warn('No other active calls to swap to.');\n }\n\n public swapToSlot(targetSlot: '1' | '2' | '3'): void {\n // 1) Find the current slot\n let currentSlotKey: '1' | '2' | '3' | null = null;\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (call && call.getCallId() === this.activeCallId) {\n currentSlotKey = key as '1' | '2' | '3';\n break;\n }\n }\n\n if (!currentSlotKey) {\n console.warn(\"Active call slot not found, can't swap.\");\n return;\n }\n\n // 2) If targetSlot is the same as currentSlotKey, do nothing\n if (targetSlot === currentSlotKey) {\n return;\n }\n\n // 3) If the target slot has a call\n const targetCall = this.callSlots[targetSlot];\n if (!targetCall) {\n console.warn(`No call in slot ${targetSlot}, can't unhold that slot.`);\n return;\n }\n\n // 4) Hold the old slot\n const currentCall = this.callSlots[currentSlotKey];\n this.cli.doHold(currentCall?.getCallId());\n\n // 5) Unhold the target slot\n this.cli.doUnHold(targetCall.getCallId());\n\n // 6) Update activeCallId\n this.activeCallId = targetCall.getCallId();\n }\n\n public dropCallBySlot(targetSlot: '1' | '2' | '3'): void {\n // Check if there is a call in the requested slot.\n const targetCall = this.callSlots[targetSlot];\n if (!targetCall) {\n console.warn(`No active call in slot ${targetSlot} to drop.`);\n return;\n }\n\n // Retrieve the call ID from the target call.\n const callId = targetCall.getCallId();\n\n // Issue the drop command through Avaya's CLI.\n const res_dropCall = this.cli.dropCall(callId);\n console.debug('dropCallBySlot response:', res_dropCall);\n\n // Clean up: remove the call from the slot and from the activeCallsMap.\n this.activeCallsMap.delete(callId);\n this.callSlots[targetSlot] = null;\n\n // If the activeCallId matches the dropped call, reset it.\n if (this.activeCallId === callId) {\n this.activeCallId = null;\n }\n }\n\n\n public logCall(callData: any) {\n // Push the call into the Snugdesk backend as a real Interaction. The backend (avaya-ipo/call-log)\n // resolves the entity/endpoint and creates-or-updates the Interaction keyed by callId, so the call\n // shows up in the same call history snugdesk-app reads. Authenticated with the Snugdesk session JWT.\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const token =\n (typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('auth_sessionToken')) ||\n '';\n if (token) {\n headers = headers.set('Authorization', `Bearer ${token}`);\n }\n return this.http.post(APP_CONFIG.INTERACTION_CALL_LOG_API_URL, callData, {\n headers,\n });\n }\n\n public getActiveCallId(): string | null {\n if (!this.activeCallId) {\n return null;\n }\n\n const callObj = this.activeCallsMap.get(this.activeCallId);\n if (!callObj) {\n return null;\n }\n\n return callObj.getCallId();\n }\n\n public async initLocalMic(): Promise<void> {\n try {\n const micStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n this.localStream = micStream;\n } catch (err) {\n console.error('Failed to capture microphone:', err);\n }\n }\n /////////////////////////////////////////////////////////////\n private patchRpcForTransfers(agentId: string) {\n if (this._rpcPatched) {\n console.debug('[RPC-PATCH] already patched');\n return;\n }\n const jsonRpc = (this.cli as any).jsonRpc;\n if (!jsonRpc || !jsonRpc.ws) {\n console.warn('[RPC-PATCH] JSON-RPC not ready yet');\n return;\n }\n\n console.debug('[RPC-PATCH] patching ws.send now');\n this._rpcPatched = true;\n\n const ws = jsonRpc.ws as WebSocket;\n const origSend = ws.send.bind(ws);\n\n ws.send = (raw: string | ArrayBuffer) => {\n // log every outbound frame so you can see your injection happen\n try {\n const msg = JSON.parse(raw as string);\n if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {\n console.debug(`[RPC-PATCH] sending ${msg.msgname} →`, msg.params);\n }\n } catch (_) {\n /* not JSON, ignore */\n }\n\n return origSend(raw);\n };\n }\n\n public async makeCallWithCustomData(\n destination: string,\n dataToSend: string\n ): Promise<'1' | '2' | '3' | null> {\n // 0) Safari race fix\n await this.prewarmMic();\n\n this.patchRpcForTransfers(dataToSend);\n\n // 2) find a free slot\n const freeSlot = (['1', '2', '3'] as const).find(\n (s) => this.callSlots[s] === null\n );\n if (!freeSlot) {\n console.warn('All call slots are occupied.');\n return null;\n }\n\n // 3) kick off the call via AWL\n const callObj = this.cli.makeCall(destination, 'audio');\n if (!callObj) {\n console.error('Error! Cannot make call.');\n return null;\n }\n\n // 4) book-keep exactly as you do today\n const callId = callObj.getCallId();\n this.activeCallsMap.set(callId, callObj);\n this.callSlots[freeSlot] = callObj;\n this.activeCallId = callId;\n return freeSlot;\n }\n\n public transferCallWithTag(target: string, type: 'Attended' | 'Blind'): void {\n // 1) patch the JSON-RPC so the next transferCall has our tag\n this.patchRpcForTransfers(this.agentId);\n\n // 2) do the normal AWL transfer\n const res = this.cli.transferCall(target, this.activeCallId, type);\n console.debug('res_transferCall:', res);\n if (res) {\n this.transferInProgressCallId = this.activeCallId || null;\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: true,\n message: 'Transfer initiated',\n });\n } else {\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: false,\n message: 'Failed to transfer',\n });\n }\n }\n\n public consumeTransferInProgress(callId: string): boolean {\n if (this.transferInProgressCallId && this.transferInProgressCallId === callId) {\n this.transferInProgressCallId = null;\n return true;\n }\n return false;\n }\n\n private _doPatch() {\n // if (this._rpcPatched) return;\n this._rpcPatched = true;\n\n const jsonRpc = (this.cli as any).jsonRpc;\n const ws: WebSocket = jsonRpc.ws;\n const origSend = ws.send.bind(ws);\n\n ws.send = (data: string | ArrayBuffer) => {\n try {\n const msg = JSON.parse(data as string);\n if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {\n // inject your field\n msg.params.transferingAgent = this.agentId;\n const patched = JSON.stringify(msg);\n return origSend(patched);\n }\n } catch {\n // non-JSON or other messages\n }\n return origSend(data);\n };\n }\n\n\n /** Pre-warm microphone so AWL always has a local stream when it tries addStream() */\n public async prewarmMic(): Promise<MediaStream> {\n // Reuse if we already have a healthy stream\n if (this.prewarmedStream && this.prewarmedStream.getTracks().length) {\n return this.prewarmedStream;\n }\n\n // On Safari, first call should be simple (no exact device constraints)\n const audio: MediaStreamConstraints['audio'] =\n this.isSafari() ? true : { echoCancellation: false, noiseSuppression: false, autoGainControl: false };\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio });\n\n this.prewarmedStream = stream;\n this.localStream = stream;\n\n // Hand it to the polyfill fallback so addStream(undefined) still works\n (window as any).__LAST_LOCAL_STREAM = stream;\n\n // (Optional) Nudge autoplay policy: attach to a muted hidden <audio> once\n try {\n const a = document.createElement('audio');\n a.muted = true;\n a.autoplay = true;\n a.style.display = 'none';\n a.srcObject = stream;\n document.body.appendChild(a);\n await a.play().catch(() => { });\n // keep element for lifetime of the page to avoid GC issues\n } catch { }\n\n return stream;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../config/app-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CountryService {\n private countriesData!: any[];\n\n // private static readonly COUNTRY_ENDPOINT = `https://assets.snugdesk.com/metadata/countries.json`;\n private static readonly COUNTRY_ENDPOINT = APP_CONFIG.COUNTRY_ENDPOINT;\n\n constructor(private httpClient: HttpClient) {}\n\n public async getAllCountries(): Promise<any[]> {\n if (!this.countriesData) {\n this.countriesData = await lastValueFrom(\n this.httpClient.get<any[]>(CountryService.COUNTRY_ENDPOINT)\n );\n }\n return this.countriesData;\n }\n\n async getCountryFromCallingCode(\n countryCallingCode: string\n ): Promise<any | undefined> {\n await this.getAllCountries();\n return this.countriesData?.find(\n (c: any) => c.callingCode === countryCallingCode\n );\n }\n\n async getCountryFromCountryCode(\n countryCode: string\n ): Promise<any | undefined> {\n await this.getAllCountries();\n return this.countriesData?.find((c: any) => c.code === countryCode);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../config/app-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PhoneNumberLookupService {\n constructor(private httpClient: HttpClient) {}\n\n async lookupPhoneNumber(phoneNumber: string, hlr?: boolean): Promise<Object> {\n const normalizedPhoneNumber = this.normalizeForLookup(phoneNumber);\n const apiEndpoint = hlr\n ? `${APP_CONFIG.PHONE_NUMBER_HLR_BASE}/${encodeURIComponent(\n normalizedPhoneNumber\n )}`\n : `${APP_CONFIG.PHONE_NUMBER_LOOKUP_BASE}/${encodeURIComponent(\n normalizedPhoneNumber\n )}`;\n\n const res_lookupPhoneNumber = await lastValueFrom(\n this.httpClient.get(apiEndpoint)\n );\n // console.debug('res_lookupPhoneNumber: ', res_lookupPhoneNumber);\n\n return res_lookupPhoneNumber;\n }\n\n private normalizeForLookup(phoneNumber: string): string {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n return '';\n }\n\n let normalized = phoneNumber.trim();\n if (normalized.startsWith('00')) {\n return `+${normalized.slice(2)}`;\n }\n if (normalized.startsWith('+')) {\n return normalized;\n }\n\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!countryCode) {\n return digits;\n }\n\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n\n if (local.startsWith(countryCode)) {\n return `+${local}`;\n }\n return `+${countryCode}${local}`;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthenticationService {\n tenant$: BehaviorSubject<any>;\n user$: BehaviorSubject<any>;\n isAuthenticated$: BehaviorSubject<boolean>;\n\n constructor(private snugdeskAuthService: SnugdeskAuthenticationService) {\n this.tenant$ = this.snugdeskAuthService.tenant$;\n this.user$ = this.snugdeskAuthService.user$;\n this.isAuthenticated$ = this.snugdeskAuthService.isAuthenticated$;\n }\n\n isAuthenticated(): boolean {\n return this.snugdeskAuthService.isAuthenticated();\n }\n\n getAuthSessionToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n\n getAuthDomainToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n getDecodedAuthDomainToken(): any {\n return this.snugdeskAuthService.getDecodedToken();\n }\n \n getTenantId(): string {\n // return this.getDecodedAuthSessionToken().tenantId;\n return this.snugdeskAuthService.getTenantId();\n }\n\n getDecodedAuthSessionToken(): any {\n if (!this.isAuthenticated()) {\n const err: any = new Error(`User not authenticated`);\n err.status = 403;\n throw err;\n }\n \n const token = this.getAuthSessionToken();\n if (!token) {\n const err: any = new Error(`Token missing`);\n err.status = 401;\n throw err;\n }\n \n return this.snugdeskAuthService.getDecodedToken();\n }\n \n\n getUserId(): string {\n return this.snugdeskAuthService.getUserId();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { APP_CONFIG } from '../config/app-config';\nimport { AuthenticationService } from './authentication.service';\n\n@Injectable({ providedIn: 'root' })\nexport class EntitiesSearchService {\n private nameCache = new Map<string, string>();\n\n constructor(\n private http: HttpClient,\n private authenticationService: AuthenticationService\n ) { }\n\n async fetchContacts(\n tenantId: string,\n size = 25,\n searchAfter?: [string, string]\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n {\n bool: {\n should: [\n { exists: { field: 'phone_numbers' } },\n { exists: { field: 'phone' } },\n { exists: { field: 'normalizedPhoneNumber' } },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n if (searchAfter && searchAfter.length === 2) {\n (body as any).search_after = searchAfter;\n }\n\n return this.postEntities(body);\n }\n\n async searchByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n ],\n must: [\n {\n bool: {\n should: [\n {\n simple_query_string: {\n query: phoneNumber,\n fields: ['name', 'emails', 'phone_numbers'],\n default_operator: 'and',\n },\n },\n {\n wildcard: {\n 'emails.keyword': {\n value: this.ensureWildcard(phoneNumber),\n case_insensitive: true,\n },\n },\n },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n\n return this.postEntities(body);\n }\n\n async searchEntities(\n tenantId: string,\n query: string,\n size = 25,\n from = 0\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n ],\n must: [\n {\n bool: {\n should: [\n {\n simple_query_string: {\n query,\n fields: ['name', 'emails', 'phone_numbers'],\n default_operator: 'and',\n },\n },\n {\n wildcard: {\n 'emails.keyword': {\n value: this.ensureWildcard(query),\n case_insensitive: true,\n },\n },\n },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n\n return this.postEntities(body);\n }\n\n getCachedName(tenantId: string, phoneNumber: string): string | null {\n const key = this.cacheKey(tenantId, phoneNumber);\n return this.nameCache.get(key) || null;\n }\n\n async lookupNameByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<string | null> {\n const cached = this.getCachedName(tenantId, phoneNumber);\n if (cached) {\n return cached;\n }\n const res: any = await this.searchByPhone(tenantId, phoneNumber, size);\n const hit = res?.hits?.hits?.[0];\n const name = hit?._source?.name;\n const trimmed = typeof name === 'string' ? name.trim() : '';\n if (trimmed) {\n this.nameCache.set(this.cacheKey(tenantId, phoneNumber), trimmed);\n return trimmed;\n }\n return null;\n }\n\n private postEntities(body: object): Promise<any> {\n const token = this.authenticationService.getAuthSessionToken();\n const headers = token ? { Authorization: `Bearer ${token}` } : undefined;\n return lastValueFrom(\n this.http.post(APP_CONFIG.OPENSEARCH_ENTITIES_URL, body, { headers })\n );\n }\n\n private cacheKey(tenantId: string, phoneNumber: string): string {\n return `${tenantId}:${phoneNumber}`;\n }\n\n private ensureWildcard(value: string): string {\n const trimmed = (value || '').toString().trim();\n if (!trimmed) {\n return '*';\n }\n return trimmed.includes('*') ? trimmed : `${trimmed}*`;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../../../config/app-config';\n\ntype TranscriptLine = {\n speaker?: string;\n text?: string;\n};\n\n@Component({\n selector: 'app-call-details',\n templateUrl: './call-details.component.html',\n styleUrls: ['./call-details.component.css'],\n standalone: false,\n})\nexport class CallDetailsComponent {\n @Input() call: any;\n transcriptLines: TranscriptLine[] = [];\n summaryText = '';\n customerBehavior = '';\n isTranscribing = false;\n transcriptionError = '';\n isTranscriptFullscreen = false;\n hasGeneratedTranscript = false;\n private readonly ANALYZE_CALL_API = APP_CONFIG.POSTCALL_TRANSCRIBE_API_URL;\n\n constructor(private http: HttpClient) {}\n\n getBadge(): string {\n const base =\n this.call?.phoneNumber?.country?.code ||\n this.call?.direction ||\n '--';\n return base.toString().slice(0, 2).toUpperCase();\n }\n\n getDisplayName(): string {\n return (\n this.call?.lookupPhoneNumber?.name ||\n this.call?.phoneNumber?.lookupPhoneNumber?.name ||\n this.call?.contactName ||\n 'Unknown'\n );\n }\n\n getPhone(): string {\n return (\n this.call?.phoneNumber?.normalizedPhoneNumber ||\n this.call?.phoneNumber?.lookupPhoneNumber?.['international-number'] ||\n this.call?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n this.call?.phoneNumber ||\n ''\n );\n }\n\n getTranscriptSpeaker(line: TranscriptLine): string {\n const raw = (line?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'customer') {\n const name = this.getDisplayName();\n return name && name !== 'Unknown' ? name : 'Unknown';\n }\n if (normalized === 'agent') {\n return 'Agent';\n }\n return raw || 'Unknown';\n }\n\n async runTranscription(): Promise<void> {\n if (!this.call?.fullCallRecordingUrl || this.isTranscribing) {\n return;\n }\n this.isTranscribing = true;\n this.transcriptionError = '';\n try {\n const recordingBlob = await lastValueFrom(\n this.http.get(this.call.fullCallRecordingUrl, { responseType: 'blob' })\n );\n const formData = new FormData();\n formData.append('file', recordingBlob, this.getRecordingFilename());\n const res: any = await lastValueFrom(\n this.http.post(this.ANALYZE_CALL_API, formData)\n );\n this.transcriptLines = this.normalizeTranscript(res?.transcript);\n this.summaryText = typeof res?.summary === 'string' ? res.summary : '';\n this.customerBehavior =\n typeof res?.customerBehavior === 'string' ? res.customerBehavior : '';\n this.hasGeneratedTranscript = true;\n } catch (err) {\n console.error('[CallDetails] Transcription failed', err);\n this.transcriptionError = 'Failed to analyze call. Please try again.';\n } finally {\n this.isTranscribing = false;\n }\n }\n\n private normalizeTranscript(input: any): TranscriptLine[] {\n if (!input) {\n return [];\n }\n if (typeof input === 'string') {\n return input\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parsed = this.parseSpeakerLine(line);\n return { speaker: parsed.speaker, text: parsed.text };\n });\n }\n if (Array.isArray(input)) {\n return input\n .map((entry) => {\n if (typeof entry === 'string') {\n const parsed = this.parseSpeakerLine(entry);\n return { speaker: parsed.speaker, text: parsed.text };\n }\n if (entry && typeof entry === 'object') {\n return {\n speaker: entry.speaker,\n text: entry.text,\n };\n }\n return null;\n })\n .filter(Boolean) as TranscriptLine[];\n }\n return [];\n }\n\n getBehaviorEmoji(): string {\n const value = (this.customerBehavior || '').toLowerCase();\n if (value.includes('angry')) return '😠';\n if (value.includes('calm')) return '😌';\n if (value.includes('happy')) return '😄';\n if (value.includes('confused')) return '😕';\n if (value.includes('neutral')) return '😐';\n return '';\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n toggleTranscriptFullscreen(): void {\n this.isTranscriptFullscreen = !this.isTranscriptFullscreen;\n }\n\n private getRecordingFilename(): string {\n const url = this.call?.fullCallRecordingUrl;\n if (typeof url === 'string') {\n try {\n const parsed = new URL(url);\n const name = parsed.pathname.split('/').pop();\n if (name) {\n return name;\n }\n } catch {\n const parts = url.split('/').filter(Boolean);\n const name = parts[parts.length - 1];\n if (name) {\n return name;\n }\n }\n }\n return 'call-recording.wav';\n }\n}\n","<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"avaya-ipo-secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"avaya-ipo-meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"avaya-ipo-divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"avaya-ipo-divider\">|</span>\n <span class=\"avaya-ipo-missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-summary-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Duration</div>\n <div class=\"avaya-ipo-value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Disconnect Side</div>\n <div class=\"avaya-ipo-value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Country</div>\n <div class=\"avaya-ipo-value\">\n {{\n call?.phoneNumber?.country?.nameEn ||\n call?.phoneNumber?.lookupPhoneNumber?.country ||\n 'N/A'\n }}\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Provider</div>\n <div class=\"avaya-ipo-value\">\n {{\n call?.phoneNumber?.lookupPhoneNumber?.['prefix-network'] ||\n call?.phoneNumber?.lookupPhoneNumber?.provider ||\n 'N/A'\n }}\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-transcription-card\" [class.avaya-ipo-fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"avaya-ipo-detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n @if (!hasGeneratedTranscript) {\n <div class=\"avaya-ipo-transcription-actions avaya-ipo-outside\">\n <button class=\"avaya-ipo-action-btn\" type=\"button\" [disabled]=\"isTranscribing\" (click)=\"runTranscription()\">\n <span class=\"avaya-ipo-btn-content\">\n @if (isTranscribing) {\n <span class=\"avaya-ipo-btn-spinner\" aria-hidden=\"true\"></span>\n }\n <span>{{ isTranscribing ? 'Generating...' : 'Run AI Call Analysis' }}</span>\n </span>\n </button>\n @if (transcriptionError) {\n <div class=\"avaya-ipo-status-error\">{{ transcriptionError }}</div>\n }\n </div>\n }\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-title\">Call Summary</div>\n @if (customerBehavior) {\n <div class=\"avaya-ipo-summary-sentiment\">\n Customer Behavior: {{ customerBehavior }}\n @if (getBehaviorEmoji()) {\n <span class=\"avaya-ipo-summary-emoji\">{{ getBehaviorEmoji() }}</span>\n }\n </div>\n }\n @if (summaryText) {\n <div class=\"avaya-ipo-summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No summary available.</div>\n }\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-transcription-card\" [class.avaya-ipo-fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">AI Call Transcription</div>\n @if (transcriptLines?.length) {\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (call?.fullCallRecordingUrl) {\n @if (transcriptLines?.length) {\n <div class=\"avaya-ipo-chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"avaya-ipo-chat-bubble\" [class.avaya-ipo-agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"avaya-ipo-chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"avaya-ipo-chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isTranscribing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No transcription available.</div>\n }\n\n } @else {\n <div class=\"avaya-ipo-placeholder\">No recording available for transcription.</div>\n }\n </div>\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { AppSyncHelperService, SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { formatDialOutNumber } from '../../config/app-config';\n\n@Component({\n selector: 'app-call-history',\n templateUrl: './call-history.component.html',\n styleUrls: ['./call-history.component.css'],\n standalone: false,\n})\nexport class CallHistoryComponent implements OnInit {\n @Input() mode: 'dial' | 'transfer' = 'dial';\n @Input() tenantId?: string;\n @Input() agentId?: string;\n @Output() makeCallEv = new EventEmitter<{ dialOut: string; name?: string }>();\n @Output() transferEv = new EventEmitter<any>();\n\n showHistoryLoader: boolean = false;\n\n callHistory: any[] = [];\n searchTerm = '';\n recentCallactiveTab: 'recentCall' | 'missedCall' = 'recentCall';\n selectedCall: any = null;\n\n // Same backend call history snugdesk-app reads: all PHONE-channel Interactions for the tenant,\n // newest first. Run through @snugdesk/core's AppSync helper so auth + Amplify config are shared\n // with the host app.\n private readonly LIST_PHONE_INTERACTIONS_QUERY = `query ListPhoneInteractionsByTenantId($tenantId: ID!, $sortDirection: ModelSortDirection, $filter: ModelInteractionFilterInput, $limit: Int, $nextToken: String) {\n listInteractionsByTenantId(tenantId: $tenantId, sortDirection: $sortDirection, filter: $filter, limit: $limit, nextToken: $nextToken) {\n items {\n id\n providerInteractionId\n channel\n provider\n direction\n status\n last_status\n metadata\n summary\n startedAt\n completedAt\n duration\n createdAt\n recording { key bucket location }\n entityConversation { id entityAddress }\n entity { id name phoneNumberE164 }\n endpoint { id address }\n }\n nextToken\n }\n }`;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private appSync: AppSyncHelperService,\n private auth: SnugdeskAuthenticationService\n ) {}\n\n async ngOnInit(): Promise<void> {\n await this.loadCallHistory();\n }\n\n recentSelectTab(tab: 'recentCall' | 'missedCall'): void {\n this.recentCallactiveTab = tab;\n }\n\n async loadCallHistory(): Promise<void> {\n this.showHistoryLoader = true;\n try {\n const tenantId = this.tenantId || this.auth.getTenantId();\n if (!tenantId) {\n console.warn('Missing tenantId for call history');\n return;\n }\n\n const items = await this.fetchPhoneInteractions(tenantId);\n this.callHistory = items\n .map((interaction) => this.mapInteractionToHistoryItem(interaction))\n .filter((item) => !!item)\n .sort(\n (a: any, b: any) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n } catch (error) {\n console.error('Failed to load call history:', error);\n } finally {\n this.showHistoryLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n private async fetchPhoneInteractions(tenantId: string): Promise<any[]> {\n const interactions: any[] = [];\n let nextToken: string | undefined;\n let pages = 0;\n // Scope to the logged-in agent: Avaya interactions are tagged with hostId = the agent's user id.\n const userId = this.auth.getUserId();\n const andFilters: any[] = [\n { channel: { eq: 'PHONE' } },\n { deletedAt: { attributeExists: false } },\n ];\n if (userId) {\n andFilters.push({ hostId: { eq: userId } });\n }\n do {\n const variables: any = {\n tenantId,\n sortDirection: 'DESC',\n filter: { and: andFilters },\n limit: 100,\n };\n if (nextToken) {\n variables.nextToken = nextToken;\n }\n const res: any = await this.appSync.query(this.LIST_PHONE_INTERACTIONS_QUERY, variables);\n const data = res?.data?.listInteractionsByTenantId;\n if (Array.isArray(data?.items)) {\n interactions.push(...data.items.filter((i: any) => !!i));\n }\n nextToken = data?.nextToken || undefined;\n pages++;\n } while (nextToken && interactions.length < 200 && pages < 5);\n return interactions;\n }\n\n private mapInteractionToHistoryItem(interaction: any): any {\n if (!interaction) {\n return null;\n }\n const metadata = this.safeParse(interaction.metadata) || {};\n const phoneData = metadata.phoneData || {};\n const direction = (interaction.direction || '').toUpperCase() === 'OUT' ? 'outbound' : 'inbound';\n const status = interaction.status || '';\n const duration = Number(interaction.duration) || 0;\n const missed = ['MISSED', 'NO_ANSWER'].includes(status);\n const customerNumber =\n interaction.entity?.phoneNumberE164 ||\n interaction.entityConversation?.entityAddress ||\n phoneData.CallerID ||\n phoneData.CustomerNumber ||\n '';\n const entityName = (interaction.entity?.name || '').toString();\n const isJustNumber = !entityName || /^\\+?[\\d\\s-]+$/.test(entityName);\n const name = !isJustNumber ? entityName : metadata.callerName || '';\n const tsSec = interaction.startedAt || interaction.createdAt || 0;\n const disconnectSide =\n missed && direction === 'inbound' ? 'CALLER' : metadata.disconnectSide || 'AGENT';\n\n return {\n id: interaction.id,\n callId: interaction.providerInteractionId,\n direction,\n status,\n duration: missed ? 0 : duration,\n disconnectSide,\n timestamp: tsSec ? new Date(tsSec * 1000).toISOString() : new Date().toISOString(),\n summary: interaction.summary || '',\n fullCallRecordingUrl: interaction.recording?.location || '',\n phoneNumber: {\n normalizedPhoneNumber: customerNumber,\n name: name || undefined,\n lookupPhoneNumber: name ? { name } : undefined,\n },\n };\n }\n\n private safeParse(value: any): any {\n if (!value) return null;\n if (typeof value === 'object') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n\n makeCall(phoneNumber: string, name?: string): void {\n const dialOut = formatDialOutNumber(phoneNumber);\n if (!dialOut) {\n console.warn('No dialable number for call history makeCall:', phoneNumber);\n return;\n }\n this.makeCallEv.emit({ dialOut, name });\n }\n\n get callerDropped(): any[] {\n return this.callHistory.filter((item) => {\n const duration = Number(item?.duration ?? 0);\n return item.disconnectSide === 'CALLER' && duration <= 0;\n });\n }\n\n get filteredRecent(): any[] {\n if (!this.searchTerm.trim()) return this.callHistory;\n const term = this.searchTerm.toLowerCase();\n const termDigits = this.searchTerm.replace(/\\D/g, '');\n return this.callHistory.filter((item) => {\n const phone =\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n item?.lookupPhoneNumber?.['local-number'] ||\n item?.lookupPhoneNumber?.normalizedPhoneNumber ||\n '';\n const name = item?.lookupPhoneNumber?.name || '';\n const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedRecent(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredRecent);\n }\n\n get filteredMissed(): any[] {\n if (!this.searchTerm.trim()) return this.callerDropped;\n const term = this.searchTerm.toLowerCase();\n const termDigits = this.searchTerm.replace(/\\D/g, '');\n return this.callerDropped.filter((item) => {\n const phone =\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n item?.lookupPhoneNumber?.['local-number'] ||\n item?.lookupPhoneNumber?.normalizedPhoneNumber ||\n '';\n const name = item?.lookupPhoneNumber?.name || '';\n const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedMissed(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredMissed);\n }\n\n onSelectCall(item: any): void {\n this.selectedCall = item;\n }\n\n closeDetails(): void {\n this.selectedCall = null;\n }\n\n selectFromHistory(item: any): void {\n if (this.mode === 'transfer') {\n \n this.transferEv.emit(item);\n return;\n }\n\n \n const dialable =\n this.resolveDialable(item) ||\n (item?.phoneNumber ?? '').toString().replace(/\\s+/g, '');\n if (!dialable) {\n console.warn('No dialable number found in history item:', item);\n return;\n }\n const dialOut = formatDialOutNumber(dialable);\n if (!dialOut) {\n console.warn('No dialable number after formatting history item:', item);\n return;\n }\n const name = this.resolveName(item);\n this.makeCallEv.emit({ dialOut, name });\n }\n\n\n private resolveDialable(item: any): string | null {\n const clean = (v: any) => (v ?? '').toString().replace(/\\s+/g, '');\n return (\n clean(item?.resolvedDialable) ||\n clean(item?.phoneNumber?.normalizedPhoneNumber) ||\n clean(item?.phoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.phoneNumber) ||\n clean(item?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.normalizedPhoneNumber) ||\n null\n );\n }\n\n private resolveName(item: any): string | undefined {\n const name =\n item?.phoneNumber?.name ||\n item?.lookupPhoneNumber?.name ||\n item?.name;\n if (typeof name === 'string' && name.trim()) {\n return name.trim();\n }\n return undefined;\n }\n\n private formatDialOutFromInput(value: any): string {\n return formatDialOutNumber(value);\n }\n\n private getTenantIdFromSession(): string | undefined {\n const raw = sessionStorage.getItem('sd-tenant');\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return parsed?.id || parsed?.tenantId || undefined;\n } catch {\n return undefined;\n }\n }\n\n private getUserIdFromSession(): string | undefined {\n const raw = sessionStorage.getItem('sd-user');\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return parsed?.id || parsed?.userId || undefined;\n } catch {\n return undefined;\n }\n }\n\n getPhoneDisplay(item: any): string {\n return (\n item?.phoneNumber?.name ||\n item?.lookupPhoneNumber?.name ||\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['international-number'] ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n ''\n ).toString();\n }\n\n getPhoneBadge(item: any): string {\n const displayName =\n item?.phoneNumber?.name || item?.lookupPhoneNumber?.name || '';\n if (displayName) {\n return this.getInitials(displayName);\n }\n const code =\n item?.phoneNumber?.country?.code ||\n item?.phoneNumber?.lookupPhoneNumber?.['country-code'] ||\n '';\n if (code) return code.toUpperCase();\n const display = this.getPhoneDisplay(item);\n return display ? display.slice(0, 2) : '--';\n }\n\n private getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '--';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n\n private groupByDate(items: any[]): Array<{ label: string; items: any[] }> {\n const groups: Array<{ label: string; items: any[] }> = [];\n let currentLabel = '';\n let currentGroup: { label: string; items: any[] } | null = null;\n\n for (const item of items) {\n const label = this.formatDateLabel(item?.timestamp);\n if (!currentGroup || label !== currentLabel) {\n currentLabel = label;\n currentGroup = { label, items: [] };\n groups.push(currentGroup);\n }\n currentGroup.items.push(item);\n }\n\n return groups;\n }\n\n private formatDateLabel(ts: string): string {\n const date = ts ? new Date(ts) : new Date();\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n\n const isSameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\n if (isSameDay(date, today)) return 'Today';\n if (isSameDay(date, yesterday)) return 'Yesterday';\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n });\n }\n}\n","<div class=\"avaya-ipo-recent_container_outer\">\n @if (selectedCall) {\n <div class=\"avaya-ipo-history_details_panel\">\n <button class=\"avaya-ipo-back_btn\" type=\"button\" (click)=\"closeDetails()\">← Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name\" [class.avaya-ipo-history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta\" [ngClass]=\"{\n 'avaya-ipo-missed': call.status === 'MISSED',\n 'avaya-ipo-caller_drop': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"avaya-ipo-meta_label\" [ngClass]=\"{\n 'avaya-ipo-inbound': call.direction?.toLowerCase() === 'inbound',\n 'avaya-ipo-outbound': call.direction?.toLowerCase() === 'outbound',\n 'avaya-ipo-missed': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"avaya-ipo-direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"avaya-ipo-direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n @if (mode === 'transfer') {\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n }\n }\n @if (callHistory.length === 0) {\n <div class=\"avaya-ipo-container_call_history_not_found\">\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </span>\n <span>Recent</span>\n </button>\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name avaya-ipo-history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta avaya-ipo-caller_drop\">\n <span class=\"avaya-ipo-meta_label avaya-ipo-missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n <span class=\"avaya-ipo-direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n <button class=\"avaya-ipo-button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n }\n }\n @if (callerDropped.length === 0) {\n <div class=\"avaya-ipo-container_call_history_not_found\">\n <h2>No missed calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n }\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n }\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'app-contact-card',\n templateUrl: './contact-card.component.html',\n styleUrls: ['./contact-card.component.css'],\n standalone: false,\n})\nexport class ContactCardComponent {\n @Input() name = '';\n @Input() phone = '';\n @Output() call = new EventEmitter<Event>();\n\n get initials(): string {\n const parts = (this.name || '').trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) {\n return (this.phone || '').slice(0, 2).toUpperCase() || '--';\n }\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n\n onCall(ev: Event): void {\n ev.stopPropagation();\n this.call.emit(ev);\n }\n}\n","<div class=\"avaya-ipo-contact-card\">\n <div class=\"avaya-ipo-contact-avatar avaya-ipo-grd1\">{{ initials }}</div>\n <div class=\"avaya-ipo-contact-body\">\n <div class=\"avaya-ipo-contact-name\">{{ name }}</div>\n <div class=\"avaya-ipo-contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n</div>\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-contact-details',\n templateUrl: './contact-details.component.html',\n styleUrls: ['./contact-details.component.css'],\n standalone: false,\n})\nexport class ContactDetailsComponent {\n @Input() contact: any;\n\n getDisplayName(): string {\n return (this.contact?.name || 'Unknown').toString();\n }\n\n getPrimaryPhone(): string {\n const phones = Array.isArray(this.contact?.phone_numbers)\n ? this.contact.phone_numbers\n : [];\n return (\n phones[0] ||\n this.contact?.phone ||\n this.contact?.normalizedPhoneNumber ||\n 'Unknown'\n ).toString();\n }\n\n getEmails(): string[] {\n const emails = Array.isArray(this.contact?.emails)\n ? this.contact.emails.filter((e: any) => typeof e === 'string' && e.trim())\n : [];\n return emails;\n }\n\n getPhoneNumbers(): string[] {\n const phones = Array.isArray(this.contact?.phone_numbers)\n ? this.contact.phone_numbers.filter((p: any) => typeof p === 'string' && p.trim())\n : [];\n return phones;\n }\n\n getInitials(): string {\n const parts = this.getDisplayName().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '--';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n}\n","<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">{{ getInitials() }}</div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">{{ getDisplayName() }}</div>\n <div class=\"avaya-ipo-secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"avaya-ipo-meta-line\">\n @if (contact?.is_organization) {\n <span class=\"avaya-ipo-dir avaya-ipo-outbound\">Organization</span>\n } @else {\n <span class=\"avaya-ipo-dir avaya-ipo-inbound\">Individual</span>\n }\n <span class=\"avaya-ipo-divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Phones</div>\n <div class=\"avaya-ipo-value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Emails</div>\n <div class=\"avaya-ipo-value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Call</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Email</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow SMS</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow WhatsApp</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Created</div>\n <div class=\"avaya-ipo-value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Updated</div>\n <div class=\"avaya-ipo-value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, OnInit, AfterViewInit, ElementRef, Output, ViewChild } from '@angular/core';\nimport { EntitiesSearchService } from '../../services/entities-search.service';\n\ntype ContactItem = {\n id: string;\n name: string;\n phone: string;\n entity: any;\n};\n\n@Component({\n selector: 'app-contacts',\n templateUrl: './contacts.component.html',\n styleUrls: ['./contacts.component.css'],\n standalone: false,\n})\nexport class ContactsComponent implements OnInit, AfterViewInit {\n @Input() tenantId?: string;\n @ViewChild('listEl') listEl?: ElementRef<HTMLElement>;\n @Output() makeCallEv = new EventEmitter<{ dialOut: string; name?: string }>();\n contacts: ContactItem[] = [];\n groupedContacts: Array<{ label: string; items: ContactItem[] }> = [];\n selectedContact: ContactItem | null = null;\n searchTerm = '';\n isLoading = false;\n error = '';\n private searchToken = 0;\n private pageSize = 25;\n private nextFrom = 0;\n private searchAfter?: [string, string];\n private hasMore = true;\n isLoadingMore = false;\n\n constructor(private entitiesSearchService: EntitiesSearchService) {}\n\n ngOnInit(): void {\n this.resetAndLoad();\n }\n\n ngAfterViewInit(): void {\n this.ensureFill();\n }\n\n private resetAndLoad(): void {\n this.contacts = [];\n this.groupedContacts = [];\n this.pageSize = this.getPageSize();\n this.nextFrom = 0;\n this.searchAfter = undefined;\n this.hasMore = true;\n this.loadNextPage();\n }\n\n async loadNextPage(): Promise<void> {\n if (!this.tenantId || this.isLoading) {\n return;\n }\n if (!this.hasMore || this.isLoadingMore) {\n return;\n }\n this.isLoading = this.contacts.length === 0;\n this.isLoadingMore = this.contacts.length > 0;\n this.error = '';\n const results: ContactItem[] = [];\n\n try {\n const res: any = await this.entitiesSearchService.fetchContacts(\n this.tenantId,\n this.pageSize,\n this.searchAfter\n );\n const hits = res?.hits?.hits;\n const totalHits =\n typeof res?.hits?.total?.value === 'number'\n ? res.hits.total.value\n : null;\n if (!Array.isArray(hits) || hits.length === 0) {\n this.hasMore = false;\n } else {\n for (const hit of hits) {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter(\n (p: any) => typeof p === 'string' && p.trim()\n )\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n continue;\n }\n const name = (source.name || '').toString().trim() || 'Unknown';\n results.push({\n id: source.id || hit?._id || phone,\n name,\n phone,\n entity: source,\n });\n }\n const lastHit = hits[hits.length - 1];\n const lastSort = Array.isArray(lastHit?.sort) ? lastHit.sort : null;\n if (lastSort && lastSort.length >= 2) {\n this.searchAfter = [String(lastSort[0]), String(lastSort[1])];\n }\n this.nextFrom += hits.length;\n if (totalHits !== null) {\n this.hasMore = this.nextFrom < totalHits;\n } else {\n this.hasMore = hits.length >= this.pageSize;\n }\n }\n } catch (err) {\n console.error('Failed to load contacts', err);\n this.error = 'Failed to load contacts';\n this.hasMore = false;\n }\n\n if (results.length > 0) {\n this.contacts = [...this.contacts, ...results];\n }\n this.applySearch();\n this.isLoading = false;\n this.isLoadingMore = false;\n this.ensureFill();\n }\n\n onSearchChange(value: string): void {\n this.searchTerm = value;\n const term = this.searchTerm.trim();\n if (!term) {\n this.applySearch();\n return;\n }\n this.selectedContact = null;\n this.searchContacts(term);\n }\n\n private groupContacts(\n contacts: ContactItem[]\n ): Array<{ label: string; items: ContactItem[] }> {\n const sorted = [...contacts].sort((a, b) => {\n const aName = (a.name || '').toLowerCase();\n const bName = (b.name || '').toLowerCase();\n return aName.localeCompare(bName);\n });\n\n const groups: Array<{ label: string; items: ContactItem[] }> = [];\n let currentLabel = '';\n let currentGroup: { label: string; items: ContactItem[] } | null = null;\n\n for (const contact of sorted) {\n const label = this.getGroupLabel(contact.name);\n if (!currentGroup || label !== currentLabel) {\n currentLabel = label;\n currentGroup = { label, items: [] };\n groups.push(currentGroup);\n }\n currentGroup.items.push(contact);\n }\n\n return groups;\n }\n\n private applySearch(): void {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = term\n ? this.contacts.filter((contact) => {\n const name = (contact.name || '').toLowerCase();\n const phone = (contact.phone || '').toLowerCase();\n return name.includes(term) || phone.includes(term);\n })\n : this.contacts;\n this.groupedContacts = this.groupContacts(filtered);\n this.ensureFill();\n }\n\n openContact(contact: ContactItem): void {\n this.selectedContact = contact;\n }\n\n closeContact(): void {\n this.selectedContact = null;\n }\n\n onCallContact(contact: ContactItem, ev?: Event): void {\n if (ev) {\n ev.stopPropagation();\n }\n this.makeCallEv.emit({ dialOut: contact.phone, name: contact.name });\n }\n\n private async searchContacts(term: string): Promise<void> {\n if (!this.tenantId) {\n return;\n }\n const token = ++this.searchToken;\n try {\n const res: any = await this.entitiesSearchService.searchEntities(\n this.tenantId,\n term,\n 25,\n 0\n );\n if (token !== this.searchToken) {\n return;\n }\n const hits = res?.hits?.hits;\n const results: ContactItem[] = [];\n if (Array.isArray(hits)) {\n for (const hit of hits) {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter(\n (p: any) => typeof p === 'string' && p.trim()\n )\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n continue;\n }\n const name = (source.name || '').toString().trim() || 'Unknown';\n results.push({\n id: source.id || hit?._id || phone,\n name,\n phone,\n entity: source,\n });\n }\n }\n this.groupedContacts = this.groupContacts(results);\n } catch (err) {\n console.error('Failed to search contacts', err);\n this.error = 'Failed to search contacts';\n }\n }\n\n onListScroll(event: Event): void {\n if (this.searchTerm.trim()) {\n return;\n }\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n const threshold = 60;\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining <= threshold) {\n this.loadNextPage();\n }\n }\n\n private ensureFill(): void {\n if (this.searchTerm.trim()) {\n return;\n }\n if (!this.listEl || this.isLoading || this.isLoadingMore || !this.hasMore) {\n return;\n }\n setTimeout(() => {\n const el = this.listEl?.nativeElement;\n if (!el || this.isLoading || this.isLoadingMore || !this.hasMore) {\n return;\n }\n // Only auto-fill when the container is actually bounded (clientHeight > 0); guards against an\n // unbounded layout looping loadNextPage forever.\n if (el.clientHeight > 0 && el.scrollHeight <= el.clientHeight + 4) {\n this.loadNextPage();\n }\n }, 0);\n }\n\n private getGroupLabel(name: string): string {\n const letter = (name || '').trim().charAt(0).toUpperCase();\n return letter >= 'A' && letter <= 'Z' ? letter : '#';\n }\n\n private getPageSize(): number {\n // Size pages to the ACTUAL scroll container, not the window — so a small popup box doesn't\n // over-fetch and a large/standalone layout doesn't loop. Fall back to window math, then a default.\n const el = this.listEl?.nativeElement;\n const available =\n el && el.clientHeight > 0\n ? el.clientHeight\n : Math.max(280, (typeof window !== 'undefined' ? window.innerHeight : 800) - 260);\n const rowHeight = 64;\n const rows = Math.ceil(available / rowHeight);\n return Math.max(10, rows);\n }\n\n}\n","<div class=\"avaya-ipo-contacts-panel\">\n @if (!selectedContact) {\n <div class=\"avaya-ipo-contacts-search\">\n <span class=\"avaya-ipo-contacts-search-icon\">🔍</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"avaya-ipo-contacts-state avaya-ipo-error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"avaya-ipo-contact-details\">\n <div class=\"avaya-ipo-contact-details-actions\">\n <button type=\"button\" class=\"avaya-ipo-contact-back\" (click)=\"closeContact()\">← Back</button>\n <button type=\"button\" class=\"avaya-ipo-contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"avaya-ipo-contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"avaya-ipo-contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"avaya-ipo-contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"avaya-ipo-contacts-load-more\">\n <div class=\"avaya-ipo-contacts-spinner\" aria-hidden=\"true\"></div>\n </div>\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { APP_CONFIG } from '../../config/app-config';\n\n@Component({\n selector: 'app-settings',\n templateUrl: './settings.component.html',\n styleUrls: ['./settings.component.css'],\n standalone: false,\n})\nexport class SettingsComponent implements OnInit, OnDestroy {\n @Input() selectedAudioInputId?: string;\n @Input() selectedAudioOutputId?: string;\n @Input() extensionId?: string;\n @Input() darkMode = false;\n\n @Output() change = new EventEmitter<{\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }>();\n @Output() darkModeChange = new EventEmitter<boolean>();\n @Output() logout = new EventEmitter<void>();\n\n audioInputs: MediaDeviceInfo[] = [];\n audioOutputs: MediaDeviceInfo[] = [];\n readonly widgetVersion = APP_CONFIG.WIDGET_VERSION;\n\n ngOnInit(): void {\n if (navigator?.mediaDevices) {\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n this.handleDeviceChange\n );\n this.refreshDeviceList();\n } else {\n console.warn('MediaDevices API not supported');\n }\n }\n\n onLogout(): void {\n this.logout.emit();\n }\n\n onToggleDarkMode(): void {\n this.darkMode = !this.darkMode;\n this.darkModeChange.emit(this.darkMode);\n }\n\n ngOnDestroy(): void {\n navigator.mediaDevices.removeEventListener(\n 'devicechange',\n this.handleDeviceChange\n );\n }\n\n private handleDeviceChange = async (): Promise<void> => {\n await this.refreshDeviceList();\n };\n\n private async refreshDeviceList(): Promise<void> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n this.audioInputs = devices.filter((d) => d.kind === 'audioinput');\n this.audioOutputs = devices.filter((d) => d.kind === 'audiooutput');\n\n // Fallback to first device if previous selection is no longer available\n if (\n !this.audioInputs.some((d) => d.deviceId === this.selectedAudioInputId)\n ) {\n this.selectedAudioInputId = this.audioInputs[0]?.deviceId ?? '';\n }\n\n if (\n !this.audioOutputs.some((d) => d.deviceId === this.selectedAudioOutputId)\n ) {\n this.selectedAudioOutputId = this.audioOutputs[0]?.deviceId ?? '';\n }\n\n this.emitDeviceChange();\n }\n\n onMicChange(deviceId: string | undefined): void {\n this.selectedAudioInputId = deviceId;\n this.emitDeviceChange();\n }\n\n onSpeakerChange(deviceId: string | undefined): void {\n this.selectedAudioOutputId = deviceId;\n this.emitDeviceChange();\n }\n\n private emitDeviceChange(): void {\n this.change.emit({\n audioInputId: this.selectedAudioInputId ?? '',\n audioOutputId: this.selectedAudioOutputId ?? '',\n videoInputId: undefined,\n });\n }\n\n trackByDeviceId(index: number, device: MediaDeviceInfo): string {\n return device.deviceId;\n }\n}\n","<div class=\"avaya-ipo-settings-wrapper\">\n <div class=\"avaya-ipo-settings-card\">\n <div class=\"avaya-ipo-settings-header\">\n <div>\n <div class=\"avaya-ipo-settings-title\">Account</div>\n <div class=\"avaya-ipo-settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Audio Devices</div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Microphone</div>\n <div class=\"avaya-ipo-device-subtitle\">Choose your input device</div>\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || ('Microphone ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Speakers</div>\n <div class=\"avaya-ipo-device-subtitle\">Choose your output device</div>\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || ('Speaker ' + (i + 1)) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Appearance</div>\n <button type=\"button\" class=\"avaya-ipo-theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"avaya-ipo-theme-label\">Dark Mode</span>\n <span class=\"avaya-ipo-theme-pill\" [class.avaya-ipo-is-on]=\"darkMode\">\n <span class=\"avaya-ipo-theme-knob\"></span>\n </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section avaya-ipo-about-section\">\n <div class=\"avaya-ipo-section-heading\">About</div>\n <div class=\"avaya-ipo-about-row\">\n <span class=\"avaya-ipo-about-label\">Version</span>\n <span class=\"avaya-ipo-about-value\">v{{ widgetVersion }}</span>\n </div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Component({\n selector: 'app-avaya-ipo-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.css'],\n standalone: false,\n})\nexport class AvayaIpoLoginComponent {\n @Input() loginForm!: FormGroup;\n @Input() showLoginLoader = false;\n @Input() hasAvayaSocketError = false;\n @Input() hasAvayaLoginError = false;\n @Input() hasAvayaLoginFailedGeneral = false;\n @Input() hasAvayaLoginConflictError = false;\n @Input() hasAvayaDeviceError = false;\n\n @Output() login = new EventEmitter<void>();\n\n showLoginPassword = false;\n\n onLoginClick(): void {\n this.login.emit();\n }\n\n restrictNumeric(evt: KeyboardEvent): boolean {\n const allowedKeys = [\n 'Enter',\n 'Backspace',\n 'ArrowLeft',\n 'ArrowRight',\n 'Tab',\n 'Delete',\n ];\n const isDigit = /^[0-9]$/.test(evt.key);\n if (!isDigit && !allowedKeys.includes(evt.key)) {\n evt.preventDefault();\n return false;\n }\n return true;\n }\n}\n","<div class=\"avaya-ipo-login-background\">\n <div class=\"avaya-ipo-login-simple\">\n <div class=\"avaya-ipo-logo\">\n <div class=\"avaya-ipo-logo-img\"></div>\n <div class=\"avaya-ipo-logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"avaya-ipo-alert avaya-ipo-error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"avaya-ipo-form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n\n <button type=\"submit\" class=\"avaya-ipo-btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"avaya-ipo-spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CallMetadata } from '../models/active-call.model';\nimport { APP_CONFIG } from '../config/app-config';\n\nexport interface RecordingSession {\n audioContext: AudioContext;\n recordingStream: MediaStreamAudioDestinationNode;\n recorder?: MediaRecorder | null;\n metadata: CallMetadata;\n stopping: boolean;\n chunks: Blob[];\n mimeType: string;\n uploaded: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class RecordingManagerService {\n private sessions = new Map<string, RecordingSession>();\n\n private readonly MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';\n private readonly MIME_TYPE_FALLBACK = 'audio/webm';\n // Record one continuous file for the whole call; a timeslice just flushes data periodically so the\n // final Blob is complete. The full recording is uploaded once at call end and handed to the backend\n // AI pipeline (transcription + summary).\n private readonly TIMESLICE_MS = 1000;\n private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 500;\n\n private readonly RECORDING_API_URL = APP_CONFIG.INTERACTION_CALL_RECORDING_API_URL;\n\n constructor(private http: HttpClient) {}\n\n startRecording(\n localMediaStream: MediaStream,\n remoteMediaStream: MediaStream,\n metadata: CallMetadata\n ): RecordingSession | undefined {\n this.stopRecording(metadata.callId);\n\n if (!localMediaStream || !remoteMediaStream) {\n console.warn(\n `[${metadata.callId}] Skipped start recording: missing remote or local stream`\n );\n return undefined;\n }\n\n const localTracks = localMediaStream.getAudioTracks();\n const remoteTracks = remoteMediaStream.getAudioTracks();\n console.debug(\n `[${metadata.callId}] Recording tracks`,\n `local=${localTracks.length}`,\n `remote=${remoteTracks.length}`\n );\n if (localTracks.length === 0 || remoteTracks.length === 0) {\n console.warn(\n `[${metadata.callId}] Skipped start recording: missing audio tracks`\n );\n return undefined;\n }\n\n const audioContext = new AudioContext();\n const recordingStream = audioContext.createMediaStreamDestination();\n\n audioContext\n .createMediaStreamSource(localMediaStream)\n .connect(recordingStream);\n audioContext\n .createMediaStreamSource(remoteMediaStream)\n .connect(recordingStream);\n\n const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)\n ? this.MIME_TYPE_PREFERRED\n : this.MIME_TYPE_FALLBACK;\n\n const session: RecordingSession = {\n audioContext,\n recordingStream,\n metadata,\n stopping: false,\n chunks: [],\n recorder: null,\n mimeType,\n uploaded: false,\n };\n this.sessions.set(metadata.callId, session);\n\n const recorder = new MediaRecorder(recordingStream.stream, { mimeType });\n session.recorder = recorder;\n\n recorder.ondataavailable = (evt: BlobEvent) => {\n if (evt.data && evt.data.size > 0) {\n session.chunks.push(evt.data);\n }\n };\n recorder.onerror = (err) => {\n console.error(`[${metadata.callId}] MediaRecorder error:`, err);\n };\n recorder.onstop = () => {\n void this.finalizeRecording(session);\n };\n\n recorder.start(this.TIMESLICE_MS);\n console.debug(`[${metadata.callId}] MediaRecorder started (single-file mode)`);\n return session;\n }\n\n getSession(callId: string): RecordingSession | undefined {\n return this.sessions.get(callId);\n }\n\n stopRecording(callId: string): void {\n const session = this.sessions.get(callId);\n if (!session) return;\n\n session.stopping = true;\n\n const rec = session.recorder;\n if (rec && rec.state !== 'inactive') {\n try {\n rec.stop(); // flushes final data, then onstop -> finalizeRecording (uploads)\n console.debug(`[${callId}] MediaRecorder stopped`);\n } catch {\n void this.finalizeRecording(session);\n }\n } else {\n void this.finalizeRecording(session);\n }\n\n setTimeout(() => {\n if (session.audioContext.state !== 'closed') {\n session.audioContext.close();\n console.debug(`[${callId}] AudioContext closed`);\n }\n }, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);\n\n this.sessions.delete(callId);\n }\n\n private async finalizeRecording(session: RecordingSession): Promise<void> {\n if (session.uploaded) return;\n session.uploaded = true;\n\n if (!session.chunks.length) {\n console.warn(`[${session.metadata.callId}] No recording data captured`);\n return;\n }\n\n const blob = new Blob(session.chunks, { type: session.mimeType });\n session.chunks = [];\n const filename = this.generateFilename(\n session.metadata.callId,\n session.metadata.agentId,\n session.mimeType\n );\n\n try {\n await this.uploadCallRecording(session.metadata, blob, filename, session.mimeType);\n console.debug(`[${session.metadata.callId}] ✅ uploaded recording -> ${filename}`);\n } catch (err) {\n console.error(`[${session.metadata.callId}] ❌ recording upload failed`, err);\n }\n }\n\n private async uploadCallRecording(\n metadata: CallMetadata,\n file: Blob,\n filename: string,\n mimeType: string\n ): Promise<{ success: boolean; message: string; interactionId?: string }> {\n try {\n const base64 = await this.convertBlobToBase64(file);\n const body = base64.split(',')[1];\n\n const payload = {\n tenantId: metadata.tenantId,\n callId: metadata.callId,\n agentId: metadata.agentId,\n filename,\n contentType: mimeType,\n isBase64: true,\n body,\n };\n\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const token =\n (typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('auth_sessionToken')) ||\n '';\n if (token) {\n headers = headers.set('Authorization', `Bearer ${token}`);\n }\n\n const res: any = await lastValueFrom(\n this.http.post(this.RECORDING_API_URL, payload, {\n headers,\n responseType: 'json',\n })\n );\n\n return {\n success: true,\n message: res?.status || 'Upload successful',\n interactionId: res?.interactionId,\n };\n } catch (err: any) {\n console.error(`[${metadata.callId}] Recording upload failed:`, err);\n return {\n success: false,\n message: err?.message || 'Upload failed',\n };\n }\n }\n\n private convertBlobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n private generateFilename(callId: string, agentId: string, mimeType: string): string {\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '')\n .replace('T', '-')\n .slice(0, 15);\n const ext = mimeType.includes('webm') ? 'webm' : 'dat';\n return `${timestamp}-${agentId}-${callId}.${ext}`;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { Subject } from 'rxjs';\n\nimport { APP_CONFIG } from '../config/app-config';\n\ntype TranscriptMessage = {\n callId: string;\n text: string;\n isFinal: boolean;\n ts: number;\n speaker?: string;\n};\n\ntype StreamSession = {\n label: 'agent' | 'customer';\n ws: WebSocket;\n processor: ScriptProcessorNode;\n sourceNode: MediaStreamAudioSourceNode;\n closed: boolean;\n lastChunkSentAt: number;\n noiseFloor: number;\n readyForBinary: boolean;\n allowSendBinary: boolean;\n muted: boolean;\n lastAudioSentAt: number;\n voiceStreak: number;\n};\n\ntype TranscriptionSession = {\n callId: string;\n audioContext: AudioContext;\n zeroGain: GainNode;\n streams: StreamSession[];\n closed: boolean;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class TranscriptionStreamService implements OnDestroy {\n private session: TranscriptionSession | null = null;\n private transcriptSubject = new Subject<TranscriptMessage>();\n readonly transcript$ = this.transcriptSubject.asObservable();\n\n private readonly SAMPLE_RATE = 16000;\n private readonly BUFFER_SIZE = 512;\n private readonly SILENCE_RMS_THRESHOLD = 0.002;\n private readonly VOICE_RMS_THRESHOLD = 0.006;\n private readonly CUSTOMER_SILENCE_RMS_THRESHOLD = 0.0006;\n private readonly CUSTOMER_VOICE_RMS_THRESHOLD = 0.0025;\n private readonly NOISE_FLOOR_MULTIPLIER = 2.5;\n private readonly NOISE_FLOOR_SMOOTHING = 0.05;\n private readonly MIN_VOICE_FRAMES = 2;\n private readonly CUSTOM_WS_URL = APP_CONFIG.TRANSCRIPTION_WS_URL;\n private readonly LANGUAGE = APP_CONFIG.TRANSCRIPTION_LANGUAGE;\n private readonly TRANSCRIPTION_MODEL = APP_CONFIG.TRANSCRIPTION_MODEL;\n\n constructor() {}\n\n ngOnDestroy(): void {\n if (this.session) {\n this.stopSession(this.session.callId);\n }\n this.transcriptSubject.complete();\n }\n\n async startSession(\n callId: string,\n localStream: MediaStream,\n remoteStream: MediaStream,\n allowSendBinary = false\n ): Promise<void> {\n if (!callId || !localStream || !remoteStream) {\n throw new Error('Missing call or media stream for transcription');\n }\n if (this.session?.callId === callId) {\n return;\n }\n if (this.session) {\n this.stopSession(this.session.callId);\n }\n\n const customUrl =\n typeof this.CUSTOM_WS_URL === 'string' ? this.CUSTOM_WS_URL.trim() : '';\n if (!customUrl) {\n throw new Error('TRANSCRIPTION_WS_URL is not configured');\n }\n const audioContext = new AudioContext({ sampleRate: this.SAMPLE_RATE });\n const zeroGain = audioContext.createGain();\n zeroGain.gain.value = 0;\n\n zeroGain.connect(audioContext.destination);\n\n const session: TranscriptionSession = {\n callId,\n audioContext,\n zeroGain,\n streams: [],\n closed: false,\n };\n\n this.session = session;\n\n const localSource = audioContext.createMediaStreamSource(localStream);\n const remoteSource = audioContext.createMediaStreamSource(remoteStream);\n session.streams.push(\n this.createStreamSession({\n callId,\n label: 'agent',\n sourceNode: localSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n }),\n this.createStreamSession({\n callId,\n label: 'customer',\n sourceNode: remoteSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n })\n );\n }\n\n stopSession(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n const session = this.session;\n session.closed = true;\n try {\n session.zeroGain.disconnect();\n } catch {}\n for (const stream of session.streams) {\n stream.closed = true;\n try {\n stream.processor.disconnect();\n stream.sourceNode.disconnect();\n } catch {}\n try {\n if (stream.ws.readyState === WebSocket.OPEN) {\n stream.ws.send(JSON.stringify({ type: 'end' }));\n stream.ws.close();\n }\n } catch {}\n }\n try {\n session.audioContext.close();\n } catch {}\n this.session = null;\n }\n\n destroyAll(): void {\n if (!this.session) {\n return;\n }\n this.stopSession(this.session.callId);\n }\n\n enableBinary(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n stream.allowSendBinary = true;\n }\n }\n\n setStreamMuted(callId: string, label: 'agent' | 'customer', muted: boolean): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n if (stream.label === label) {\n stream.muted = muted;\n }\n }\n }\n\n private mixToMono(buffer: AudioBuffer): Float32Array {\n const channels = buffer.numberOfChannels;\n if (channels === 1) {\n return buffer.getChannelData(0);\n }\n const length = buffer.length;\n const output = new Float32Array(length);\n for (let c = 0; c < channels; c++) {\n const data = buffer.getChannelData(c);\n for (let i = 0; i < length; i++) {\n output[i] += data[i];\n }\n }\n for (let i = 0; i < length; i++) {\n output[i] = output[i] / channels;\n }\n return output;\n }\n\n private calculateRms(samples: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i];\n sum += value * value;\n }\n return Math.sqrt(sum / samples.length);\n }\n\n private encodePcm16(input: Float32Array, sourceRate: number): Uint8Array {\n const resampled =\n sourceRate === this.SAMPLE_RATE\n ? input\n : this.downsampleBuffer(input, sourceRate, this.SAMPLE_RATE);\n if (!resampled || resampled.length === 0) {\n return new Uint8Array();\n }\n const buffer = new ArrayBuffer(resampled.length * 2);\n const view = new DataView(buffer);\n for (let i = 0; i < resampled.length; i++) {\n let s = Math.max(-1, Math.min(1, resampled[i]));\n s = s < 0 ? s * 0x8000 : s * 0x7fff;\n view.setInt16(i * 2, s, true);\n }\n return new Uint8Array(buffer);\n }\n\n private downsampleBuffer(\n input: Float32Array,\n sourceRate: number,\n targetRate: number\n ): Float32Array {\n const ratio = sourceRate / targetRate;\n const length = Math.round(input.length / ratio);\n const output = new Float32Array(length);\n let offset = 0;\n for (let i = 0; i < length; i++) {\n const nextOffset = Math.round((i + 1) * ratio);\n let sum = 0;\n let count = 0;\n for (let j = offset; j < nextOffset && j < input.length; j++) {\n sum += input[j];\n count++;\n }\n output[i] = count ? sum / count : 0;\n offset = nextOffset;\n }\n return output;\n }\n\n private queueAudio(stream: StreamSession, chunk: Uint8Array): void {\n if (stream.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n stream.ws.send(chunk);\n stream.lastAudioSentAt = Date.now();\n stream.lastChunkSentAt = stream.lastAudioSentAt;\n }\n\n private handleTranscriptPayload(callId: string, text: string): void {\n if (!text) return;\n try {\n const data = JSON.parse(text);\n if (typeof data?.text === 'string') {\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: data.text,\n isFinal: Boolean(data?.isFinal ?? data?.final ?? true),\n ts: typeof data?.ts === 'number' ? data.ts : Date.now(),\n speaker: data?.speaker || data?.source,\n });\n return;\n }\n if (data?.type === 'Results' && typeof data?.transcript === 'string') {\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: data.transcript,\n isFinal: Boolean(\n data?.is_final ?? data?.speech_final ?? data?.isFinal ?? data?.final ?? true\n ),\n ts: typeof data?.ts === 'number' ? data.ts : Date.now(),\n speaker: data?.source,\n });\n return;\n }\n if (typeof data?.transcript === 'string') {\n const ts = typeof data?.ts === 'number' ? data.ts : Date.now();\n const isFinal = Boolean(\n data?.isFinal ?? data?.final ?? data?.is_final ?? data?.speech_final ?? true\n );\n const lines = data.transcript\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .filter(Boolean);\n if (lines.length > 1) {\n for (const line of lines) {\n const parsed = this.parseSpeakerLine(line);\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n } else {\n const parsed = this.parseSpeakerLine(data.transcript.trim());\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n return;\n }\n const results = data?.Transcript?.Results || data?.results;\n if (!Array.isArray(results)) return;\n for (const result of results) {\n const transcript =\n result?.Alternatives?.[0]?.Transcript ||\n result?.alternatives?.[0]?.transcript;\n if (!transcript) continue;\n this.transcriptSubject.next({\n callId,\n text: transcript,\n isFinal: !(result.IsPartial ?? result.isPartial),\n ts: Date.now(),\n });\n }\n } catch (err) {\n this.transcriptSubject.next({\n callId,\n text,\n isFinal: true,\n ts: Date.now(),\n });\n }\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n private createStreamSession(opts: {\n callId: string;\n label: 'agent' | 'customer';\n sourceNode: MediaStreamAudioSourceNode;\n audioContext: AudioContext;\n zeroGain: GainNode;\n url: string;\n allowSendBinary: boolean;\n }): StreamSession {\n const ws = new WebSocket(opts.url);\n ws.binaryType = 'arraybuffer';\n console.debug('[Transcription] Opening WebSocket', {\n url: ws.url,\n source: opts.label,\n });\n\n const processor = opts.audioContext.createScriptProcessor(\n this.BUFFER_SIZE,\n 1,\n 1\n );\n opts.sourceNode.connect(processor);\n processor.connect(opts.zeroGain);\n\n const stream: StreamSession = {\n label: opts.label,\n ws,\n processor,\n sourceNode: opts.sourceNode,\n closed: false,\n lastChunkSentAt: Date.now(),\n noiseFloor: this.SILENCE_RMS_THRESHOLD,\n readyForBinary: false,\n allowSendBinary: opts.allowSendBinary,\n muted: false,\n lastAudioSentAt: Date.now(),\n voiceStreak: 0,\n };\n\n ws.onopen = () => {\n opts.audioContext.resume().catch(() => {});\n const payload = {\n type: 'start',\n callId: opts.callId,\n source: opts.label,\n language: this.LANGUAGE,\n model: this.TRANSCRIPTION_MODEL,\n sampleRate: this.SAMPLE_RATE,\n channels: 1,\n };\n ws.send(JSON.stringify(payload));\n stream.readyForBinary = false;\n if (opts.label === 'customer') {\n setTimeout(() => {\n if (!stream.closed && ws.readyState === WebSocket.OPEN && !stream.readyForBinary) {\n console.debug('[Transcription] No ACK yet, enabling customer stream');\n stream.readyForBinary = true;\n }\n }, 1200);\n }\n console.debug('[Transcription] WebSocket open', { source: opts.label });\n processor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (stream.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n if (stream.muted && opts.label === 'agent') {\n return;\n }\n const input = this.mixToMono(event.inputBuffer);\n if (!input || input.length === 0) {\n return;\n }\n const rms = this.calculateRms(input);\n const silenceThreshold =\n opts.label === 'customer'\n ? this.CUSTOMER_SILENCE_RMS_THRESHOLD\n : this.SILENCE_RMS_THRESHOLD;\n const voiceThreshold =\n opts.label === 'customer'\n ? this.CUSTOMER_VOICE_RMS_THRESHOLD\n : this.VOICE_RMS_THRESHOLD;\n if (rms < silenceThreshold) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n return;\n }\n const adaptiveThreshold = Math.max(\n voiceThreshold,\n stream.noiseFloor * this.NOISE_FLOOR_MULTIPLIER\n );\n if (rms < adaptiveThreshold) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n stream.voiceStreak = 0;\n return;\n }\n stream.voiceStreak += 1;\n if (stream.voiceStreak < this.MIN_VOICE_FRAMES) {\n return;\n }\n const pcmBytes = this.encodePcm16(\n input,\n opts.audioContext.sampleRate\n );\n if (pcmBytes.byteLength === 0) {\n return;\n }\n if (!stream.readyForBinary || !stream.allowSendBinary) {\n return;\n }\n this.queueAudio(stream, pcmBytes);\n };\n };\n\n ws.onerror = (err) => {\n console.error('[Transcription] WebSocket error', {\n readyState: ws.readyState,\n url: ws.url,\n error: err,\n source: opts.label,\n });\n };\n\n ws.onmessage = (evt) => {\n if (!evt?.data) return;\n if (typeof evt.data === 'string') {\n try {\n const maybeAck = JSON.parse(evt.data);\n const ackType = (maybeAck?.type || '').toString().toLowerCase();\n const ackMessage = (maybeAck?.message || '').toString().toLowerCase();\n const isReady =\n (ackType === 'ack' && ackMessage === 'stream-started') ||\n (ackType === 'ready' && ackMessage.includes('ready'));\n if (isReady) {\n stream.readyForBinary = true;\n return;\n }\n } catch {\n // ignore parse failures; handled below\n }\n this.handleTranscriptPayload(opts.callId, evt.data);\n return;\n }\n if (evt.data instanceof Blob) {\n evt.data.text().then((text) => this.handleTranscriptPayload(opts.callId, text));\n }\n };\n\n ws.onclose = (evt) => {\n console.warn('[Transcription] WebSocket closed', {\n code: evt?.code,\n reason: evt?.reason,\n wasClean: evt?.wasClean,\n source: opts.label,\n });\n this.stopSession(opts.callId);\n };\n\n return stream;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { CountryISO, SearchCountryField } from 'ngx-intl-tel-input';\n\n@Component({\n selector: 'app-phone-idle',\n templateUrl: './phone-idle.component.html',\n styleUrls: ['./phone-idle.component.css'],\n standalone: false,\n})\nexport class PhoneIdleComponent {\n @Input() dialForm!: FormGroup;\n @Input() contacts: any[] = [];\n @Input() showDirectoryPhonebook = false;\n @Input() isRinging = false;\n @Input() CountryISO = CountryISO;\n @Input() SearchCountryField = SearchCountryField;\n\n @Output() toggleDirectory = new EventEmitter<void>();\n @Output() clear = new EventEmitter<void>();\n @Output() makeCall = new EventEmitter<void>();\n @Output() keypadInput = new EventEmitter<string>();\n @Output() keyboardInput = new EventEmitter<KeyboardEvent>();\n\n getContactBadge(contact: any): string {\n const base = contact?.name || contact?.phone || '--';\n return base.toString().slice(0, 2).toUpperCase();\n }\n\n onToggleDirectory(): void {\n this.toggleDirectory.emit();\n }\n onClear(): void {\n this.clear.emit();\n }\n onMakeCall(): void {\n this.makeCall.emit();\n }\n onKeypadInput(d: string): void {\n this.keypadInput.emit(d);\n }\n onKeyboardInput(ev: KeyboardEvent): void {\n this.keyboardInput.emit(ev);\n }\n}\n","<form class=\"avaya-ipo-phone-shell avaya-ipo-classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"avaya-ipo-input-row avaya-ipo-classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'avaya-ipo-phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"avaya-ipo-clear-btn\" (click)=\"onClear()\" aria-label=\"Backspace\" title=\"Backspace\">\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.12c.36.53.9.88 1.59.88h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"avaya-ipo-dial-cluster\">\n <div class=\"avaya-ipo-keypad avaya-ipo-classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"avaya-ipo-digit\">1</span>\n <span class=\"avaya-ipo-letters\">&nbsp;</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"avaya-ipo-digit\">2</span>\n <span class=\"avaya-ipo-letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"avaya-ipo-digit\">3</span>\n <span class=\"avaya-ipo-letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"avaya-ipo-digit\">4</span>\n <span class=\"avaya-ipo-letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"avaya-ipo-digit\">5</span>\n <span class=\"avaya-ipo-letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"avaya-ipo-digit\">6</span>\n <span class=\"avaya-ipo-letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"avaya-ipo-digit\">7</span>\n <span class=\"avaya-ipo-letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"avaya-ipo-digit\">8</span>\n <span class=\"avaya-ipo-letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"avaya-ipo-digit\">9</span>\n <span class=\"avaya-ipo-letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"avaya-ipo-digit\">*</span>\n <span class=\"avaya-ipo-letters\">&nbsp;</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"avaya-ipo-digit\">0</span>\n <span class=\"avaya-ipo-letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"avaya-ipo-digit\">#</span>\n <span class=\"avaya-ipo-letters\">&nbsp;</span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-actions\">\n <button type=\"submit\" class=\"avaya-ipo-call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n</form>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { assetUrl } from '../../../config/app-config';\n\n@Component({\n selector: 'app-phone-incoming',\n templateUrl: './phone-incoming.component.html',\n styleUrls: ['./phone-incoming.component.css'],\n standalone: false,\n})\nexport class PhoneIncomingComponent {\n incomingAvatarUrl = assetUrl('assets/images/incomingCall_avatar.gif');\n @Input() incomingCallName?: string;\n @Input() incomingNameResolved = false;\n @Input() incomingCallNumber: string | undefined;\n @Output() accept = new EventEmitter<void>();\n @Output() decline = new EventEmitter<void>();\n}\n","<div class=\"avaya-ipo-incoming-screen\">\n <div class=\"avaya-ipo-incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n &nbsp;\n }\n </div>\n <div class=\"avaya-ipo-incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"avaya-ipo-incoming-status\">CALLING...</div>\n\n <div class=\"avaya-ipo-incoming-actions\">\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-accept\" (click)=\"accept.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-decline\" (click)=\"decline.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { assetUrl } from '../../../config/app-config';\nimport { EntitiesSearchService } from '../../../services/entities-search.service';\n\n@Component({\n selector: 'app-phone-active',\n templateUrl: './phone-active.component.html',\n styleUrls: ['./phone-active.component.css'],\n standalone: false,\n})\nexport class PhoneActiveComponent implements OnInit {\n @Input() tenantId?: string;\n activeAvatarUrl = assetUrl('assets/images/incomingCall_avatar.gif');\n @Input() activeCallName?: string;\n @Input() activeCallNumber: string | null = null;\n @Input() activeCallDuration = 0;\n @Input() callStatusText = '';\n @Input() isConnecting = false;\n @Input() isMuted = false;\n @Input() isHeld = false;\n @Output() endCall = new EventEmitter<void>();\n @Output() toggleMute = new EventEmitter<void>();\n @Output() toggleHold = new EventEmitter<void>();\n @Output() transfer = new EventEmitter<void>();\n @Output() openContacts = new EventEmitter<void>();\n @Output() openKeypad = new EventEmitter<void>();\n @Output() startTranscription = new EventEmitter<void>();\n @Output() contactsLoaded = new EventEmitter<any[]>();\n\n private isLoadingContacts = false;\n\n constructor(private entitiesSearchService: EntitiesSearchService) {}\n\n ngOnInit(): void {\n this.fetchContacts();\n }\n\n async fetchContacts(): Promise<void> {\n if (!this.tenantId || this.isLoadingContacts) {\n return;\n }\n this.isLoadingContacts = true;\n const size = 50;\n let searchAfter: [string, string] | undefined;\n let allContacts: any[] = [];\n\n while (true) {\n try {\n const res_searchEntities: any =\n await this.entitiesSearchService.fetchContacts(\n this.tenantId,\n size,\n searchAfter\n );\n const hits = res_searchEntities?.hits?.hits;\n\n if (!Array.isArray(hits) || hits.length === 0) {\n break;\n }\n\n const mapped = hits.map((hit: any) => {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter((p: any) => typeof p === 'string' && p.trim())\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n return null;\n }\n return {\n ...source,\n id: source.id || hit?._id,\n phone,\n };\n }).filter(Boolean);\n allContacts = [...allContacts, ...mapped];\n if (hits.length < size) {\n break;\n }\n const lastHit = hits[hits.length - 1];\n const lastSort = Array.isArray(lastHit?.sort) ? lastHit.sort : null;\n if (lastSort && lastSort.length >= 2) {\n searchAfter = [String(lastSort[0]), String(lastSort[1])];\n } else {\n break;\n }\n } catch (error) {\n console.error('Error fetching contacts:', error);\n break;\n }\n }\n\n this.contactsLoaded.emit(allContacts);\n this.isLoadingContacts = false;\n }\n\n formatDuration(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(\n 2,\n '0'\n )}`;\n }\n}\n","<div class=\"avaya-ipo-active-screen\">\n <div class=\"avaya-ipo-active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"avaya-ipo-active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"avaya-ipo-active-duration\" [class.avaya-ipo-is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"avaya-ipo-active-controls\">\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Add Call</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Transfer</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"avaya-ipo-control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"avaya-ipo-control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.avaya-ipo-is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Keypad</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"avaya-ipo-control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"avaya-ipo-active-bottom\">\n <button type=\"button\" class=\"avaya-ipo-end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"avaya-ipo-btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n","import { Component, ElementRef, OnDestroy, OnInit, AfterViewInit, OnChanges, SimpleChanges, ViewChild } from '@angular/core';\nimport { ChangeDetectorRef, EventEmitter, Input, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\nimport { CountryISO, SearchCountryField } from 'ngx-intl-tel-input';\nimport { AvayaIPOService, CallState } from '../../services/avaya-ipo.service';\nimport { PhoneNumberUtil, PhoneNumberFormat } from 'google-libphonenumber';\nimport { AuthenticationService } from '../../services/authentication.service';\nimport { APP_CONFIG, assetUrl, formatDialOutNumber } from '../../config/app-config';\nimport { RecordingManagerService } from '../../services/recording-manager.service';\nimport { TranscriptionStreamService } from '../../services/transcription-stream.service';\n\n@Component({\n selector: 'app-phone',\n templateUrl: './phone.component.html',\n styleUrls: ['./phone.component.css'],\n standalone: false,\n})\nexport class PhoneComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n @Input() contacts: any[] = [];\n @Input() tenantId?: string;\n @Input() agentId?: string;\n @Output() callScreenChange = new EventEmitter<boolean>();\n private _isActiveCall = false;\n @Input()\n set isActiveCall(value: boolean) {\n this._isActiveCall = value;\n this.emitCallScreenState();\n }\n get isActiveCall(): boolean {\n return this._isActiveCall;\n }\n @Input() activeCallNumber: string | null = null;\n @Input() incomingCallName?: string | null;\n @Input() incomingNameResolved = false;\n @Input() activeCallName?: string | null;\n @Input() serverIp?: string;\n @Input() serverPort?: number;\n @Input() stunIp?: string;\n @Input() stunPort?: number;\n @Input() turnIp?: string;\n @Input() turnPort?: number;\n @Input() configurationMode?: string;\n @Output() makeCallEv = new EventEmitter<string>();\n @Output() endCallEv = new EventEmitter<void>();\n @ViewChild('audioElement') audioElement: any;\n private callStateSub?: any;\n private endToneTimeout?: ReturnType<typeof setTimeout>;\n private suppressHangupToneOnce = false;\n private transferStatusSub?: any;\n private remoteStreamSub?: any;\n private callTerminateSub?: any;\n private outgoingDialSub?: any;\n private transcriptionSub?: any;\n private lastRemoteStream: MediaStream | null = null;\n private lastLocalStream: MediaStream | null = null;\n private currentCallId: string | null = null;\n private pendingOutgoing = false;\n private transcriptionActiveCallId: string | null = null;\n private pendingTranscriptionCallId: string | null = null;\n private pendingTranscriptionAllowBinary = false;\n private lastPartialIndex: Record<string, number> = {};\n private pendingIncomingCall = false;\n\n dialForm!: FormGroup;\n directoryForm!: FormGroup;\n showDirectoryPhonebook = false;\n isTransferMode = false;\n isAddCallMode = false;\n directoryTab: 'contacts' | 'dialpad' = 'contacts';\n directoryNumber = '';\n contactSearch = '';\n directoryDigits = [\n { digit: '1', letters: '' },\n { digit: '2', letters: 'ABC' },\n { digit: '3', letters: 'DEF' },\n { digit: '4', letters: 'GHI' },\n { digit: '5', letters: 'JKL' },\n { digit: '6', letters: 'MNO' },\n { digit: '7', letters: 'PQRS' },\n { digit: '8', letters: 'TUV' },\n { digit: '9', letters: 'WXYZ' },\n { digit: '*', letters: '' },\n { digit: '0', letters: '+' },\n { digit: '#', letters: '' },\n ];\n incomingCallSubscription: any;\n incomingCallNumber: string | undefined;\n isMuted = false;\n isHeld = false;\n activeCallDuration = 0;\n callStatusText = '';\n transferError = '';\n transferSuccess = '';\n transferPending = false;\n private transferErrorTimeout?: ReturnType<typeof setTimeout>;\n private activeCallTimer?: ReturnType<typeof setInterval>;\n private muteToggleInProgress = false;\n private holdToggleInProgress = false;\n isKeypadOpen = false;\n isTranscriptionOpen = false;\n transcriptText = '';\n transcriptSegments: Array<{ ts: number; text: string; speaker?: string }> = [];\n private transcriptStartedAt = 0;\n private transcriptEndedAt = 0;\n autoDownloadSummaryOnEnd = false;\n summaryText = '';\n dtmfBuffer = '';\n private phoneUtil = PhoneNumberUtil.getInstance();\n\n CountryISO = CountryISO;\n SearchCountryField = SearchCountryField;\n isRinging = false;\n audio: any;\n get isConnecting(): boolean {\n return this.callStatusText === 'Calling...';\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private formBuilder: FormBuilder,\n private avayaIpoService: AvayaIPOService,\n private authenticationService: AuthenticationService,\n private recordingManagerService: RecordingManagerService,\n private transcriptionStreamService: TranscriptionStreamService\n ) {\n this.dialForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n this.directoryForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n }\n\n ngOnInit(): void {\n window.addEventListener('keydown', this.handleKeyboardInput);\n this.emitCallScreenState();\n\n const lastIncoming = this.avayaIpoService.getLastIncomingCall();\n if (lastIncoming) {\n this.handleIncomingCall(lastIncoming);\n }\n\n this.incomingCallSubscription =\n this.avayaIpoService.incomingCallSubject.subscribe((data) => {\n this.handleIncomingCall(data);\n });\n\n this.outgoingDialSub = this.avayaIpoService.outgoingDialSubject.subscribe(\n (payload) => {\n if (!payload?.dialed || this.isRinging) {\n return;\n }\n this.callStatusText = 'Calling...';\n this._isActiveCall = true;\n this.pendingOutgoing = true;\n this.currentCallId = null;\n this.stopCallTimer();\n this.startCallTimer(true);\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n );\n\n this.transcriptionSub =\n this.transcriptionStreamService.transcript$.subscribe((evt) => {\n if (!evt || !evt.text) {\n return;\n }\n if (\n this.transcriptionActiveCallId &&\n evt.callId !== this.transcriptionActiveCallId\n ) {\n return;\n }\n this.applyTranscriptUpdate(evt.text, evt.isFinal, evt.ts, evt.speaker);\n });\n\n this.callStateSub = this.avayaIpoService.callStateSubject.subscribe(\n (evt) => {\n if (!evt?.state) {\n return;\n }\n if (\n evt.callId &&\n (evt.state === CallState.PROGRESSING ||\n evt.state === CallState.RINGING ||\n evt.state === CallState.CONNECTED ||\n evt.state === CallState.HELD)\n ) {\n if (!this.currentCallId || this.pendingOutgoing) {\n this.currentCallId = evt.callId;\n this.pendingOutgoing = false;\n }\n }\n if (evt.state === CallState.CONNECTED) {\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = true;\n if (evt.callId) {\n this.currentCallId = evt.callId;\n }\n this.pendingOutgoing = false;\n this.callStatusText = '';\n this.startCallTimer(false);\n this.avayaIpoService.clearLastIncomingCall();\n console.debug('[Phone] Call connected, starting recording', evt.callId);\n this.startRecordingForCall(evt.callId);\n if (evt.callId) {\n this.startTranscriptionForCall(evt.callId, true);\n }\n this.emitCallScreenState();\n }\n if (evt.state === CallState.INCOMING || evt.state === CallState.RINGING) {\n // Ring tone is handled by AvayaIPOService.\n }\n if (evt.state === CallState.DISCONNECTED || evt.state === CallState.FAILED) {\n if (evt.callId && this.currentCallId && evt.callId !== this.currentCallId) {\n return;\n }\n if (evt.callId) {\n this.recordingManagerService.stopRecording(evt.callId);\n }\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n }\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = false;\n this.isMuted = false;\n this.isHeld = false;\n this.isKeypadOpen = false;\n this.isTranscriptionOpen = false;\n this.stopTranscription(evt.callId);\n this.dtmfBuffer = '';\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.directoryForm.reset();\n this.stopCallTimer();\n this.callStatusText = 'Disconnected';\n this.incomingCallNumber = undefined;\n this.currentCallId = null;\n this.pendingOutgoing = false;\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.emitCallScreenState();\n if (this.suppressHangupToneOnce) {\n this.suppressHangupToneOnce = false;\n this.finishDisconnectWithoutTone();\n } else {\n this.playHangupToneAndThenIdle();\n }\n }\n if (evt.state === CallState.HELD) {\n if (evt.callId) {\n this.recordingManagerService.stopRecording(evt.callId);\n }\n }\n }\n );\n\n this.transferStatusSub = this.avayaIpoService.transferStatusSubject.subscribe(\n (status) => {\n if (status?.success) {\n this.transferError = '';\n this.transferSuccess = 'Transfer successful';\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n this.transferErrorTimeout = undefined;\n }\n if (this.transferPending) {\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.directoryForm.reset();\n }\n this.transferErrorTimeout = setTimeout(() => {\n this.transferSuccess = '';\n this.cdr.detectChanges();\n }, 2000);\n } else {\n this.transferSuccess = '';\n this.transferError = status?.message || 'Failed to transfer';\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n }\n this.transferErrorTimeout = setTimeout(() => {\n this.transferError = '';\n this.cdr.detectChanges();\n }, 2500);\n }\n this.transferPending = false;\n this.cdr.detectChanges();\n }\n );\n\n this.remoteStreamSub = this.avayaIpoService.remoteStream$.subscribe((r) => {\n if (r?.stream?.getAudioTracks?.().length) {\n this.lastRemoteStream = r.stream;\n this.lastLocalStream = this.avayaIpoService.localStream;\n if (this.pendingTranscriptionCallId) {\n this.startTranscriptionForCall(\n this.pendingTranscriptionCallId,\n this.pendingTranscriptionAllowBinary\n );\n }\n }\n });\n\n this.callTerminateSub = this.avayaIpoService.callTerminateSubject.subscribe(\n (evt) => {\n if (evt?.callId && this.currentCallId && evt.callId !== this.currentCallId) {\n return;\n }\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n }\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = false;\n this.incomingCallNumber = undefined;\n this.currentCallId = null;\n this.pendingOutgoing = false;\n this.isTranscriptionOpen = false;\n this.stopTranscription(evt?.callId);\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['incomingNameResolved'] && this.pendingIncomingCall) {\n if (this.incomingNameResolved) {\n this.isRinging = true;\n this.pendingIncomingCall = false;\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n }\n }\n\n ngAfterViewInit(): void {\n this.audio = this.audioElement?.nativeElement;\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('keydown', this.handleKeyboardInput);\n this.callStateSub?.unsubscribe?.();\n this.transferStatusSub?.unsubscribe?.();\n this.remoteStreamSub?.unsubscribe?.();\n this.callTerminateSub?.unsubscribe?.();\n this.outgoingDialSub?.unsubscribe?.();\n this.transcriptionSub?.unsubscribe?.();\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n }\n this.stopCallTimer();\n this.stopTranscription();\n }\n\n makeCall(): void {\n if (this.dialForm.invalid) {\n console.warn('Dial form is invalid:', this.dialForm.value);\n return;\n }\n\n const phone = this.dialForm.value.phoneNumber;\n const e164 = this.formatE164(\n phone?.internationalNumber || phone?.number || phone\n );\n if (!e164) {\n console.warn('Invalid phone number for dial:', phone);\n return;\n }\n const dialOut = this.formatDialOut(e164);\n this.callStatusText = 'Calling...';\n this.isRinging = false;\n this._isActiveCall = true;\n this.emitCallScreenState();\n this.makeCallEv.emit(dialOut);\n this.dialForm.reset();\n this.showDirectoryPhonebook = false;\n }\n\n onClear(): void {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n if (!current) return control?.reset();\n\n const updated = current.slice(0, -1);\n updated ? this.updatePhoneControl(updated) : control?.reset();\n }\n\n handleKeyboardInput = (event: KeyboardEvent): void => {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n\n let updated = current;\n if (event.key === 'Enter') {\n this.makeCall();\n return;\n } else if (event.key === 'Backspace') {\n if (!current) return control?.reset();\n updated = current.slice(0, -1);\n } else if (/^[0-9]$/.test(event.key)) {\n updated += event.key;\n } else {\n return;\n }\n\n updated ? this.updatePhoneControl(updated) : control?.reset();\n };\n\n handleKeypadInput(digit: string): void {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n this.updatePhoneControl(current + digit);\n }\n\n private updatePhoneControl(value: string): void {\n setTimeout(() => {\n this.dialForm.get('phoneNumber')?.setValue(value);\n this.cdr.detectChanges();\n });\n }\n\n private formatE164(value: string | undefined | null): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n const cleaned = value.replace(/\\s+/g, '');\n if (cleaned.startsWith('+')) {\n return cleaned;\n }\n if (cleaned.startsWith('00')) {\n return `+${cleaned.slice(2)}`;\n }\n try {\n const parsed = this.phoneUtil.parse(cleaned, 'IN');\n if (this.phoneUtil.isValidNumber(parsed)) {\n return this.phoneUtil.format(parsed, PhoneNumberFormat.E164);\n }\n } catch {\n // Fall back to cleaned value when parsing fails.\n }\n return cleaned;\n }\n\n private formatDialOut(e164: string): string {\n return formatDialOutNumber(e164);\n }\n\n\n declineAvayaCall() {\n this.suppressHangupToneOnce = true;\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = false;\n this.pendingOutgoing = false;\n this.avayaIpoService.clearOutgoingDial();\n this.audio?.pause?.();\n if (this.audio) {\n this.audio.currentTime = 0;\n }\n this.emitCallScreenState();\n this.avayaIpoService.agentIdle();\n this.cdr.detectChanges();\n this.endCallEv.emit();\n }\n\n acceptAvayaCAll() {\n this.avayaIpoService.answerCall();\n // this.headerComponent.showAvayaIpo = true;\n this.isRinging = false;\n this.pendingIncomingCall = false;\n this._isActiveCall = true;\n this.callStatusText = '';\n this.startCallTimer();\n this.avayaIpoService.clearLastIncomingCall();\n this.emitCallScreenState();\n }\n\n onEndActiveCall(): void {\n this._isActiveCall = false;\n this.stopCallTimer();\n this.callStatusText = 'Disconnected';\n this.suppressHangupToneOnce = true;\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.isKeypadOpen = false;\n this.dtmfBuffer = '';\n this.transcriptionStreamService.destroyAll();\n this.emitCallScreenState();\n this.endCallEv.emit();\n }\n\n private playHangupToneAndThenIdle(): void {\n if (!this.audio) {\n return;\n }\n try {\n this.audio.pause();\n this.audio.currentTime = 0;\n this.audio.loop = false;\n this.audio.src = assetUrl('assets/sounds/hangup_tone.mp3');\n this.audio.loop = false;\n void this.audio.play().catch(() => {\n // Ignore aborts caused by immediate pause.\n });\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n }\n this.endToneTimeout = setTimeout(() => {\n this.audio?.pause?.();\n if (this.audio) {\n this.audio.currentTime = 0;\n }\n this._isActiveCall = false;\n this.callStatusText = '';\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }, 2000);\n } catch (err) {\n console.warn('Failed to play hangup tone', err);\n }\n }\n\n private finishDisconnectWithoutTone(): void {\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n }\n this.endToneTimeout = setTimeout(() => {\n this._isActiveCall = false;\n this.callStatusText = '';\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }, 1000);\n }\n\n private handleIncomingCall(data: { callId: string; farEndNumber: string }): void {\n const phoneUtil = PhoneNumberUtil.getInstance();\n try {\n let normalizedNumber = data.farEndNumber.trim();\n\n // Convert numbers with \"00XX\" to \"+XX\"\n if (normalizedNumber.startsWith('00')) {\n normalizedNumber = '+' + normalizedNumber.substring(2);\n }\n\n let parsedNumber;\n if (\n normalizedNumber.startsWith('+') ||\n /^\\d{1,4}/.test(normalizedNumber)\n ) {\n parsedNumber = phoneUtil.parse(normalizedNumber);\n } else {\n parsedNumber = phoneUtil.parse(\n normalizedNumber,\n this.authenticationService.tenant$\n .getValue()\n .contactInformation.country.code.toUpperCase()\n );\n }\n\n this.incomingCallNumber = phoneUtil.format(\n parsedNumber,\n PhoneNumberFormat.INTERNATIONAL\n );\n } catch (error) {\n console.warn('Invalid phone number:', data.farEndNumber);\n this.incomingCallNumber = data.farEndNumber; // Fallback\n }\n this._isActiveCall = false;\n this.showDirectoryPhonebook = false;\n this.isKeypadOpen = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.contactSearch = '';\n this.directoryForm.reset();\n this.callStatusText = '';\n this.isRinging = this.incomingNameResolved;\n this.pendingIncomingCall = !this.incomingNameResolved;\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n this.endToneTimeout = undefined;\n }\n this.emitCallScreenState();\n }\n\n onActiveOpenContacts(): void {\n this.isTransferMode = false;\n this.isAddCallMode = true;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n this.showDirectoryPhonebook = true;\n }\n\n onActiveOpenKeypad(): void {\n this.isKeypadOpen = true;\n }\n\n closeKeypad(): void {\n this.isKeypadOpen = false;\n }\n\n private startTranscriptionForCall(\n callId: string,\n allowSendBinary = false\n ): void {\n if (!callId) {\n return;\n }\n if (this.transcriptionActiveCallId === callId) {\n if (allowSendBinary) {\n this.transcriptionStreamService.enableBinary(callId);\n }\n return;\n }\n if (!this.lastLocalStream || !this.lastRemoteStream) {\n this.pendingTranscriptionCallId = callId;\n this.pendingTranscriptionAllowBinary = allowSendBinary;\n return;\n }\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n this.transcriptSegments = [];\n this.transcriptText = '';\n this.lastPartialIndex = {};\n this.transcriptStartedAt = Date.now();\n this.transcriptEndedAt = 0;\n this.transcriptionStreamService\n .startSession(callId, this.lastLocalStream, this.lastRemoteStream, allowSendBinary)\n .then(() => {\n this.transcriptionActiveCallId = callId;\n })\n .catch((err) => {\n console.error('[Phone] Failed to start transcription', err);\n });\n }\n\n private applyTranscriptUpdate(\n text: string,\n isFinal: boolean,\n ts: number,\n speaker?: string\n ): void {\n const trimmed = (text || '').trim();\n if (!trimmed) {\n return;\n }\n const key = (speaker || 'unknown').toString().toLowerCase();\n if (!isFinal) {\n const existingIndex = this.lastPartialIndex[key];\n if (existingIndex !== undefined && this.transcriptSegments[existingIndex]) {\n this.transcriptSegments[existingIndex] = { ts, text: trimmed, speaker };\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n this.lastPartialIndex[key] = this.transcriptSegments.length - 1;\n }\n this.cdr.detectChanges();\n return;\n }\n\n const pendingIndex = this.lastPartialIndex[key];\n if (pendingIndex !== undefined && this.transcriptSegments[pendingIndex]) {\n this.transcriptSegments[pendingIndex] = { ts, text: trimmed, speaker };\n delete this.lastPartialIndex[key];\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n }\n this.cdr.detectChanges();\n }\n\n getTranscriptSpeakerLabel(segment: { speaker?: string }): string {\n const raw = (segment?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'agent') {\n return 'Agent';\n }\n if (normalized === 'customer') {\n return this.activeCallName || this.incomingCallName || 'Unknown';\n }\n return raw || 'Unknown';\n }\n\n getTranscriptBubbleClass(segment: { speaker?: string }): string {\n const normalized = (segment?.speaker || '').toString().trim().toLowerCase();\n if (normalized === 'agent') {\n return 'agent';\n }\n if (normalized === 'customer') {\n return 'customer';\n }\n return '';\n }\n\n get customerTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'customer')\n .map(({ ts, text }) => ({ ts, text }));\n }\n\n get agentTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'agent')\n .map(({ ts, text }) => ({ ts, text }));\n }\n\n openTranscription(): void {\n this.isTranscriptionOpen = true;\n }\n\n closeTranscription(): void {\n this.isTranscriptionOpen = false;\n }\n\n private stopTranscription(callId?: string): void {\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n }\n this.transcriptEndedAt = Date.now();\n\n if (this.autoDownloadSummaryOnEnd && this.transcriptSegments.length > 0) {\n this.generateAndDownloadSummary(callId);\n }\n\n this.transcriptText = '';\n this.transcriptSegments = [];\n this.lastPartialIndex = {};\n this.transcriptStartedAt = 0;\n this.transcriptEndedAt = 0;\n this.isTranscriptionOpen = false;\n }\n\n private generateAndDownloadSummary(callId?: string): void {\n const fullText = this.transcriptSegments.map((s) => s.text).join(' ');\n if (!fullText.trim()) return;\n\n const bullets = this.buildExtractiveSummary(fullText, 5);\n const actions = this.extractActionItems(fullText);\n const keyInfo = this.extractKeyInfo(fullText);\n\n const mdLines: string[] = [];\n mdLines.push('# Call Summary');\n mdLines.push(`**Call ID:** ${callId ?? '-'}`);\n mdLines.push(`**Start:** ${this.transcriptStartedAt ? new Date(this.transcriptStartedAt).toISOString() : '-'}`);\n mdLines.push(`**End:** ${this.transcriptEndedAt ? new Date(this.transcriptEndedAt).toISOString() : '-'}`);\n const durMs =\n this.transcriptStartedAt && this.transcriptEndedAt\n ? this.transcriptEndedAt - this.transcriptStartedAt\n : 0;\n mdLines.push(`**Duration:** ${this.fmtHMS(durMs)}`);\n mdLines.push('');\n\n mdLines.push('## Highlights');\n if (bullets.length) bullets.forEach((b) => mdLines.push(`- ${b}`));\n else mdLines.push('- (no highlights)');\n\n if (actions.length) {\n mdLines.push('', '## Action Items');\n actions.forEach((a) => mdLines.push(`- [ ] ${a}`));\n }\n\n if (keyInfo.length) {\n mdLines.push('', '## Key Info');\n keyInfo.forEach((k) => mdLines.push(`- ${k}`));\n }\n\n mdLines.push('', '## Transcript (final lines)');\n for (const seg of this.transcriptSegments) {\n const offset = seg.ts - (this.transcriptStartedAt || seg.ts);\n mdLines.push(`[${this.fmtHMS(offset)}] ${seg.text}`);\n }\n\n const mdBlob = new Blob([mdLines.join('\\n')], {\n type: 'text/markdown;charset=utf-8',\n });\n const name = `call-${callId || 'unknown'}-summary.md`;\n this.downloadBlobFile(mdBlob, name);\n this.summaryText = mdLines.join('\\n');\n }\n\n private buildExtractiveSummary(text: string, maxBullets = 5): string[] {\n const sents = this.splitSentences(text);\n if (sents.length <= maxBullets) return sents;\n\n const stop = new Set(\n (\n 'i,me,my,myself,we,our,ours,ourselves,you,your,yours,' +\n 'he,him,his,she,her,hers,it,its,they,them,their,theirs,what,which,who,whom,' +\n 'this,that,these,those,am,is,are,was,were,be,been,being,have,has,had,do,does,' +\n 'did,doing,a,an,the,and,but,if,or,because,as,until,while,of,at,by,for,with,' +\n 'about,against,between,into,through,during,before,after,above,below,to,from,' +\n 'up,down,in,out,on,off,over,under,again,further,then,once,here,there,when,' +\n 'where,why,how,all,any,both,each,few,more,most,other,some,such,no,nor,not,' +\n 'only,own,same,so,than,too,very,can,will,just,don,should,now'\n ).split(',')\n );\n\n const tokenize = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w && !stop.has(w));\n\n const freq = new Map<string, number>();\n for (const s of sents) {\n for (const w of tokenize(s)) {\n freq.set(w, (freq.get(w) || 0) + 1);\n }\n }\n\n const scored = sents.map((s, i) => {\n const words = tokenize(s);\n const score =\n words.reduce((acc, w) => acc + (freq.get(w) || 0), 0) /\n Math.max(1, words.length);\n return { i, s, score };\n });\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, maxBullets)\n .sort((a, b) => a.i - b.i)\n .map((x) => x.s.trim());\n }\n\n private splitSentences(text: string): string[] {\n return text\n .replace(/\\s+/g, ' ')\n .split(/(?<=[.!?])\\s+(?=[A-Z0-9])/g)\n .map((s) => s.trim())\n .filter(Boolean);\n }\n\n private extractActionItems(text: string): string[] {\n const sents = this.splitSentences(text);\n const pat =\n /(need to|please|send|share|call|schedule|arrange|follow up|email|whatsapp|provide|confirm|deliver|prepare|create|set up|book|assign|remind)/i;\n return sents.filter((s) => pat.test(s)).slice(0, 12);\n }\n\n private extractKeyInfo(text: string): string[] {\n const out: string[] = [];\n const phones = text.match(/(?:\\+?\\d[\\s-]?){8,15}\\d/g) || [];\n const emails =\n text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi) || [];\n const amounts =\n text.match(/(?:₹|\\$|INR\\s?)\\s?\\d[\\d,]*(?:\\.\\d+)?/g) || [];\n const dates =\n text.match(\n /\\b(?:\\d{1,2}[-/]\\d{1,2}[-/]\\d{2,4}|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\\s+\\d{1,2}(?:,\\s*\\d{4})?)\\b/gi\n ) || [];\n if (phones.length) out.push(`Phones: ${Array.from(new Set(phones)).join(', ')}`);\n if (emails.length) out.push(`Emails: ${Array.from(new Set(emails)).join(', ')}`);\n if (amounts.length) out.push(`Amounts: ${Array.from(new Set(amounts)).join(', ')}`);\n if (dates.length) out.push(`Dates: ${Array.from(new Set(dates)).join(', ')}`);\n return out;\n }\n\n private downloadBlobFile(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n private fmtHMS(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n return (h > 0 ? String(h).padStart(2, '0') + ':' : '') +\n String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0');\n }\n\n onClosePhonebook(): void {\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.contactSearch = '';\n this.directoryForm.reset();\n this.transferError = '';\n this.transferSuccess = '';\n this.transferPending = false;\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n this.transferErrorTimeout = undefined;\n }\n }\n\n onContactsLoaded(list: any[]): void {\n this.contacts = Array.isArray(list) ? list : [];\n }\n\n get filteredContacts(): any[] {\n const term = this.contactSearch.trim().toLowerCase();\n if (!term) {\n return this.contacts;\n }\n return this.contacts.filter((contact) => {\n const name = (contact?.name || '').toString().toLowerCase();\n const phone = (contact?.phone || '').toString().toLowerCase();\n return name.includes(term) || phone.includes(term);\n });\n }\n\n onSelectContact(contact: any): void {\n const value = contact?.phone || '';\n if (value) {\n const dialOut = this.formatDialOutFromInput(value);\n if (this.isTransferMode) {\n this.transferSuccess = '';\n this.avayaIpoService.transferCall(\n this.formatTransferTargetFromInput(value),\n 'unAttended'\n );\n this.transferPending = true;\n return;\n } else {\n if (this.isAddCallMode) {\n this.avayaIpoService.doHold();\n }\n this.makeCallEv.emit(dialOut);\n }\n }\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryForm.reset();\n this.transferError = '';\n this.transferPending = false;\n }\n\n toggleMute(): void {\n if (this.muteToggleInProgress) {\n return;\n }\n this.muteToggleInProgress = true;\n setTimeout(() => {\n this.muteToggleInProgress = false;\n }, 500);\n if (this.isMuted) {\n this.avayaIpoService.doUnMute();\n } else {\n this.avayaIpoService.doMute();\n }\n this.isMuted = !this.isMuted;\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.setStreamMuted(\n this.transcriptionActiveCallId,\n 'agent',\n this.isMuted\n );\n }\n }\n\n toggleHold(): void {\n if (this.holdToggleInProgress) {\n return;\n }\n this.holdToggleInProgress = true;\n setTimeout(() => {\n this.holdToggleInProgress = false;\n }, 800);\n if (this.isHeld) {\n this.avayaIpoService.doUnHold();\n } else {\n this.avayaIpoService.doHold();\n }\n this.isHeld = !this.isHeld;\n }\n\n onTransferCall(): void {\n this.isTransferMode = true;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n this.transferSuccess = '';\n this.showDirectoryPhonebook = true;\n }\n\n private emitCallScreenState(): void {\n this.callScreenChange.emit(this.isRinging || this.isActiveCall);\n }\n\n private startCallTimer(reset = true): void {\n if (this.activeCallTimer) {\n return;\n }\n if (reset) {\n this.activeCallDuration = 0;\n }\n this.activeCallTimer = setInterval(() => {\n this.activeCallDuration += 1;\n this.cdr.markForCheck();\n }, 1000);\n }\n\n private stopCallTimer(): void {\n if (this.activeCallTimer) {\n clearInterval(this.activeCallTimer);\n this.activeCallTimer = undefined;\n }\n this.activeCallDuration = 0;\n }\n\n // Idle handlers forwarded to existing logic\n onIdleToggleDirectory(): void {\n this.showDirectoryPhonebook = !this.showDirectoryPhonebook;\n if (this.showDirectoryPhonebook) {\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n }\n }\n onIdleClear(): void {\n this.onClear();\n }\n onIdleMakeCall(): void {\n this.makeCall();\n }\n onIdleKeypadInput(digit: string): void {\n this.handleKeypadInput(digit);\n }\n onIdleKeyboardInput(ev: KeyboardEvent): void {\n this.handleKeyboardInput(ev);\n }\n\n setDirectoryTab(tab: 'contacts' | 'dialpad'): void {\n this.directoryTab = tab;\n if (tab === 'dialpad') {\n this.contactSearch = '';\n }\n }\n\n onDirectoryKeypad(digit: string): void {\n const control = this.directoryForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n this.updateDirectoryControl(current + digit);\n }\n\n onDirectoryBackspace(): void {\n const control = this.directoryForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n if (!current) {\n return control?.reset();\n }\n const updated = current.slice(0, -1);\n updated ? this.updateDirectoryControl(updated) : control?.reset();\n }\n\n onDirectoryUseNumber(): void {\n const raw = this.directoryForm.value.phoneNumber;\n const value =\n raw?.internationalNumber ||\n raw?.number ||\n (typeof raw === 'string' ? raw : '') ||\n this.directoryNumber;\n if (!value) {\n return;\n }\n const dialOut = this.formatDialOutFromInput(value);\n if (this.isTransferMode) {\n this.transferSuccess = '';\n this.avayaIpoService.transferCall(\n this.formatTransferTargetFromInput(value),\n 'unAttended'\n );\n this.transferPending = true;\n return;\n } else {\n if (this.isAddCallMode) {\n this.avayaIpoService.doHold();\n }\n this.makeCallEv.emit(dialOut);\n }\n this.showDirectoryPhonebook = false;\n\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.directoryForm.reset();\n this.transferError = '';\n this.transferPending = false;\n }\n\n onDirectoryClear(): void {\n this.directoryForm.reset();\n this.directoryNumber = '';\n }\n\n onDtmfDigit(digit: string): void {\n this.dtmfBuffer += digit;\n this.avayaIpoService.sendDTMF(digit);\n }\n\n onDtmfBackspace(): void {\n if (!this.dtmfBuffer) {\n return;\n }\n this.dtmfBuffer = this.dtmfBuffer.slice(0, -1);\n }\n\n private updateDirectoryControl(value: string): void {\n setTimeout(() => {\n this.directoryForm.get('phoneNumber')?.setValue(value);\n this.directoryNumber = value;\n this.cdr.detectChanges();\n });\n }\n\n private formatDialOutFromInput(value: string): string {\n const e164 = this.formatE164(value);\n return this.formatDialOut(e164 || value);\n }\n\n private formatTransferTargetFromInput(value: string): string {\n const e164 = this.formatE164(value);\n return formatDialOutNumber(e164 || value);\n }\n\n private async startRecordingForCall(callId: string): Promise<void> {\n if (!callId) {\n return;\n }\n console.debug('[Phone] startRecordingForCall', callId);\n let local = this.lastLocalStream || this.avayaIpoService.localStream;\n const hasAudio = (stream?: MediaStream | null) =>\n stream instanceof MediaStream && stream.getAudioTracks().length > 0;\n const metadata = {\n tenantId: this.tenantId || '',\n agentId: this.agentId || '',\n phoneNumber: this.activeCallNumber || '',\n callId,\n };\n\n if (!hasAudio(local)) {\n console.warn('[Phone] Missing local audio, requesting mic', callId);\n try {\n await this.avayaIpoService.initLocalMic();\n } catch (err) {\n console.warn('[Phone] initLocalMic failed', err);\n }\n local = this.lastLocalStream || this.avayaIpoService.localStream;\n if (!hasAudio(local)) {\n console.warn('[Phone] Still missing local audio for recording', callId);\n return;\n }\n }\n\n const remote = this.lastRemoteStream;\n if (hasAudio(remote)) {\n this.recordingManagerService.startRecording(local!, remote!, metadata);\n return;\n }\n\n const remoteSub = this.avayaIpoService.remoteStream$.subscribe((r) => {\n if (!r || r.callId !== callId) {\n return;\n }\n if (!hasAudio(r.stream)) {\n return;\n }\n const freshLocal = this.avayaIpoService.localStream;\n if (!hasAudio(freshLocal)) {\n return;\n }\n console.debug('[Phone] Remote audio ready, restarting recording', callId);\n this.recordingManagerService.startRecording(\n freshLocal!,\n r.stream,\n metadata\n );\n remoteSub.unsubscribe();\n });\n }\n}\n","<div class=\"avaya-ipo-phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"onClosePhonebook()\">‹</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"avaya-ipo-phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>+</button>\n </div>\n @if (transferError) {\n <div class=\"avaya-ipo-phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"avaya-ipo-phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"avaya-ipo-phonebook-tabs\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"avaya-ipo-phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"avaya-ipo-phonebook-search\">\n <span class=\"avaya-ipo-search-icon\">🔍</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"avaya-ipo-phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"avaya-ipo-phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"avaya-ipo-phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"avaya-ipo-phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'avaya-ipo-phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"avaya-ipo-dialpad-backspace\" (click)=\"onDirectoryBackspace()\">⌫</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</span>\n <span class=\"avaya-ipo-dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-keypad-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeKeypad()\">‹</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">DTMF</div>\n <div class=\"avaya-ipo-phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>+</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-input avaya-ipo-dtmf-input\">\n <div class=\"avaya-ipo-dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"avaya-ipo-dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-transcription-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeTranscription()\">‹</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"avaya-ipo-transcription-split\">\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Customer\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Agent\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n","import { ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnInit, OnDestroy, OnChanges, SimpleChanges, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { AvayaIPOService, CallState, LoginState } from './services/avaya-ipo.service';\nimport { APP_CONFIG, assetUrl, formatDialOutNumber } from './config/app-config';\nimport { Subscription } from 'rxjs';\nimport { CountryService } from './services/country.service';\nimport { PhoneNumberLookupService } from './services/phone-number-lookup.service';\nimport { EntitiesSearchService } from './services/entities-search.service';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Component({\n selector: 'snugdesk-avaya-ipo-widget',\n templateUrl: './avaya-ipo-widget.component.html',\n styleUrls: ['./avaya-ipo-widget.component.css'],\n standalone: false,\n})\nexport class AvayaIPOWidgetComponent implements OnInit, OnDestroy, OnChanges {\n @HostBinding('class.avaya-ipo-dark-mode') hostDarkMode = false;\n // Mirror displayMode onto the host element as a class (same pattern as dark-mode) so all layout\n // differences between the two views are pure :host-scoped CSS — the DOM tree is identical in both\n // modes, which keeps every media-element id / scroll-ref / public API invariant intact by construction.\n @HostBinding('class.avaya-ipo-mode-standalone') get hostModeStandalone(): boolean { return this.displayMode === 'standalone'; }\n @HostBinding('class.avaya-ipo-mode-popup') get hostModePopup(): boolean { return this.displayMode !== 'standalone'; }\n private readonly STORAGE_KEY = 'avayaIpoWidgetLogin';\n // Public API inputs (kept for compatibility with host apps)\n @Input() isVisible = true;\n /**\n * Render mode for the widget shell:\n * - 'popup' (default): owns no dimensions — fills whatever box the host gives it (e.g. the snugdesk-app\n * header popover), with a min-size guard and its own internal scroll. Preserves 100% of current behavior.\n * - 'standalone': provides its own full-page frame — a centered card on desktop, full-bleed on mobile —\n * for running the softphone independently.\n */\n @Input() displayMode: 'popup' | 'standalone' = 'popup';\n @Input() configurationMode?: string;\n @Input() avayaIPOServerIP?: string;\n @Input() avayaIPOServerPort?: number;\n @Input() avayaIPOServerStunServerIP?: string;\n @Input() avayaIPOServerStunServerPort?: number;\n @Input() avayaIPOServerTurnServerIP?: string;\n @Input() avayaIPOServerTurnServerPort?: number;\n @Input() token?: string;\n @Input() tenantId!: string;\n @Input() userId!: string;\n /**\n * Optional Avaya IP Office credentials. When BOTH `extension` and `password` are supplied (via the\n * host binding), the widget patches the login form and auto-logs-in once — no manual login needed.\n * If they are not supplied, the widget falls back to any saved localStorage session, otherwise it\n * shows the login form as before.\n */\n @Input() extension?: string;\n @Input() password?: string;\n /** Show/hide the History tab. Default true keeps current behavior. */\n @Input() showHistory = true;\n /** Show/hide the Contacts tab. Default true keeps current behavior. */\n @Input() showContacts = true;\n /**\n * The bottom tab bar only earns its space when at least one of History/Contacts is visible.\n * With both hidden only Keypad (the default view) would remain, so the whole bar is hidden.\n */\n get showTabBar(): boolean {\n return this.showHistory || this.showContacts;\n }\n\n @Output() notificationEvent: EventEmitter<number> = new EventEmitter<number>();\n\n /**\n * Fires when an inbound call starts ringing, so the host app can open/focus the widget popover.\n * Payload: the call id, the caller's number, and the resolved caller name (null if not yet known).\n */\n @Output() incomingCall = new EventEmitter<{ callId: string; number: string; name: string | null }>();\n readonly avayaLogoUrl = assetUrl('assets/images/logo-avaya_small_color.svg');\n readonly widgetVersion = APP_CONFIG.WIDGET_VERSION;\n\n isReconnectingInProgress = false;\n isFailoverInProgress = false;\n isFailbackInProgress = false;\n\n showLoginForm = true;\n showLoginLoader = false;\n hasAvayaSocketError = false;\n hasAvayaLoginError = false;\n hasAvayaLoginFailedGeneral = false;\n hasAvayaLoginConflictError = false;\n hasAvayaDeviceError = false;\n private awlScriptPromise?: Promise<void>;\n\n loginForm!: FormGroup;\n activeTab: 'history' | 'contacts' | 'keypad' | 'settings' = 'keypad';\n private previousTab: 'history' | 'contacts' | 'keypad' = 'keypad';\n private loginSub?: Subscription;\n private incomingCallSub?: Subscription;\n private callStateSub?: Subscription;\n hideTabs = false;\n darkModeEnabled = false;\n activeCallNumber: string | null = null;\n incomingCallName: string | null = null;\n incomingNameResolved = false;\n activeCallName: string | null = null;\n authErrorMessage = '';\n authLoading = true;\n private hasInitialized = false;\n private autoLoginAttempted = false;\n private callLogIndex = new Map<\n string,\n { direction: 'inbound' | 'outbound'; phoneNumber: any; connected: boolean }\n >();\n private pendingDisconnectSide: 'AGENT' | 'CALLER' | null = null;\n private callStartTimes = new Map<string, number>();\n\n constructor(\n private formBuilder: FormBuilder,\n private avayaIPOService: AvayaIPOService,\n private cdr: ChangeDetectorRef,\n private countryService: CountryService,\n private phoneNumberLookupService: PhoneNumberLookupService,\n private entitiesSearchService: EntitiesSearchService,\n private snugdeskAuthService: SnugdeskAuthenticationService\n ) { }\n\n async ngOnInit(): Promise<void> {\n this.restoreThemePreference();\n if (await this.authenticateWithToken()) {\n this.authLoading = false;\n this.initAfterAuth();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // If the host supplies/updates credentials after init, attempt the input-based auto-login.\n if ((changes['extension'] || changes['password']) && this.hasInitialized) {\n this.tryAutoLoginFromInputs();\n }\n // If the currently-active tab gets hidden by the host, fall back to the keypad.\n if (changes['showHistory'] || changes['showContacts']) {\n this.ensureVisibleTab();\n }\n }\n\n private ensureVisibleTab(): void {\n if ((this.activeTab === 'history' && !this.showHistory) ||\n (this.activeTab === 'contacts' && !this.showContacts)) {\n this.activeTab = 'keypad';\n }\n }\n\n private initAfterAuth(): void {\n if (this.hasInitialized) {\n return;\n }\n this.authLoading = false;\n this.hasInitialized = true;\n this.loginForm = this.formBuilder.group({\n ipoExtensionNo: ['', Validators.required],\n ipoPassword: ['', Validators.required],\n });\n\n this.loginSub = this.avayaIPOService.loginStatus$.subscribe((status) => {\n this.handleLoginStatus(status);\n });\n\n this.incomingCallSub = this.avayaIPOService.incomingCallSubject.subscribe(\n async ({ callId, farEndNumber }) => {\n if (!callId) {\n return;\n }\n this.activeTab = 'keypad';\n const phoneNumber = (farEndNumber ?? '').toString();\n this.activeCallNumber = phoneNumber;\n this.incomingCallName = null;\n this.incomingNameResolved = false;\n this.activeCallName = null;\n const normalizedSearch = this.normalizePhoneForSearch(phoneNumber);\n const cachedName = this.entitiesSearchService.getCachedName(\n this.tenantId,\n normalizedSearch\n );\n if (cachedName) {\n this.incomingCallName = cachedName;\n this.activeCallName = cachedName;\n this.incomingNameResolved = true;\n }\n\n // Signal the host app immediately so it can open/focus the widget popover.\n this.incomingCall.emit({ callId, number: phoneNumber, name: this.incomingCallName });\n\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(phoneNumber),\n this.getOpenSearchCallerName(normalizedSearch),\n ]);\n const mapNumber =\n lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '') ||\n lookupResult?.normalizedPhoneNumber ||\n phoneNumber;\n this.activeCallNumber = mapNumber;\n if (callerName) {\n this.incomingCallName = callerName;\n this.activeCallName = callerName;\n }\n this.incomingNameResolved = true;\n const phonePayload: any = {\n ...(lookupResult || { normalizedPhoneNumber: mapNumber }),\n };\n if (callerName) {\n phonePayload.name = callerName;\n }\n this.callLogIndex.set(callId, {\n direction: 'inbound',\n phoneNumber: phonePayload,\n connected: false,\n });\n const callLogPayload = {\n tenantId: this.tenantId,\n userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: phonePayload,\n direction: 'inbound',\n duration: 0,\n status: 'incoming',\n timestamp: new Date().toISOString(),\n callinginfo: 'ringing',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (incoming) failed', err),\n });\n }\n );\n\n this.callStateSub = this.avayaIPOService.callStateSubject.subscribe(\n ({ callId, state }) => {\n if (!callId || !state) {\n return;\n }\n const meta = this.callLogIndex.get(callId);\n if (!meta) {\n return;\n }\n if (state === CallState.CONNECTED) {\n this.avayaIPOService.clearLastIncomingCall();\n meta.connected = true;\n this.callStartTimes.set(callId, Date.now());\n const callLogPayload = {\n tenantId: this.tenantId,\n userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'connected',\n connected: true,\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (connected) failed', err),\n });\n return;\n }\n if (state === CallState.DISCONNECTED || state === CallState.FAILED) {\n this.avayaIPOService.clearLastIncomingCall();\n let disconnectSide: 'AGENT' | 'CALLER' | 'NA' =\n this.pendingDisconnectSide ?? 'CALLER';\n let disconnectReason: string | undefined;\n if (this.avayaIPOService.consumeTransferInProgress(callId)) {\n disconnectSide = 'NA';\n disconnectReason = 'Transfer';\n }\n const status = 'disconnected';\n const startedAt = this.callStartTimes.get(callId);\n const duration = startedAt\n ? Math.max(0, Math.floor((Date.now() - startedAt) / 1000))\n : 0;\n const callLogPayload = {\n tenantId: this.tenantId,\n userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration,\n status,\n connected: meta.connected,\n timestamp: new Date().toISOString(),\n callinginfo: 'disconnected',\n disconnectSide,\n disconnectReason,\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error(`logCall (${status}) failed`, err),\n });\n this.callLogIndex.delete(callId);\n this.callStartTimes.delete(callId);\n this.pendingDisconnectSide = null;\n if (this.avayaIPOService.activeCallId === callId) {\n this.activeCallNumber = null;\n this.activeCallName = null;\n this.incomingCallName = null;\n }\n }\n }\n );\n\n // Prefer host-provided credentials (auto-login); otherwise fall back to a saved localStorage session.\n if (!this.tryAutoLoginFromInputs()) {\n this.restoreSession();\n }\n }\n\n private async authenticateWithToken(): Promise<boolean> {\n this.authLoading = true;\n const token = (this.token || '').trim();\n\n if (token) {\n try {\n const ok = this.snugdeskAuthService.checkToken(token);\n if (!ok) {\n this.authErrorMessage = 'Authentication token invalid.';\n return false;\n }\n this.snugdeskAuthService.setToken(token);\n sessionStorage.setItem('auth_sessionToken', token);\n if (!this.tenantId) {\n this.tenantId = this.snugdeskAuthService.getTenantId();\n }\n if (!this.userId) {\n this.userId = this.snugdeskAuthService.getUserId();\n }\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Token validation failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n if (this.tenantId && this.userId) {\n try {\n const loginOk = await this.snugdeskAuthService.login(\n this.tenantId,\n this.userId\n );\n if (!loginOk) {\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n const newToken = this.snugdeskAuthService.getToken();\n if (!newToken) {\n this.authErrorMessage = 'Authentication token missing.';\n return false;\n }\n this.snugdeskAuthService.setToken(newToken);\n this.token = newToken;\n sessionStorage.setItem('auth_sessionToken', newToken);\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Login failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n this.authErrorMessage = 'Authentication token missing.';\n this.authLoading = false;\n return false;\n }\n\n async onAuthLoginClick(): Promise<void> {\n if (await this.authenticateWithToken()) {\n this.authErrorMessage = '';\n this.initAfterAuth();\n }\n }\n\n onLogin(): void {\n this.loginForm.markAllAsTouched();\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = false;\n this.hasAvayaDeviceError = false;\n this.hasAvayaSocketError = false;\n\n if (this.loginForm.invalid) {\n return;\n }\n\n this.showLoginLoader = true;\n\n // Ensure AWL SDK is loaded, then configure and login.\n this.loadAwlScript(APP_CONFIG.AWL_SDK_URL)\n .then(() => {\n this.avayaIPOService.setConfigValues({\n serviceType: this.configurationMode || 'phone',\n gatewayIp: this.avayaIPOServerIP,\n gatewayPort: this.avayaIPOServerPort?.toString(),\n stunIp: this.avayaIPOServerStunServerIP,\n stunPort: this.avayaIPOServerStunServerPort?.toString(),\n turnIp: this.avayaIPOServerTurnServerIP,\n turnPort: this.avayaIPOServerTurnServerPort?.toString(),\n });\n\n this.avayaIPOService.init();\n this.avayaIPOService.logIn(\n this.loginForm.value.ipoExtensionNo,\n this.loginForm.value.ipoPassword\n );\n })\n .catch((err) => {\n console.error('Failed to load AWL SDK', err);\n this.showLoginLoader = false;\n this.hasAvayaSocketError = true;\n });\n }\n\n onLogout(): void {\n this.avayaIPOService.logout();\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.loginForm.reset();\n this.clearSession();\n }\n\n private handleLoginStatus(status: any): void {\n if (!status) {\n return;\n }\n\n if (typeof status === 'boolean') {\n if (status) {\n this.showLoginLoader = false;\n this.showLoginForm = false;\n this.avayaIPOService.initLocalMic().catch((err) => {\n console.warn('initLocalMic failed', err);\n });\n this.persistSession();\n }\n return;\n }\n\n const result = status.result ?? status.loginState;\n switch (result) {\n case LoginState.LOGIN_SUCCESS:\n this.showLoginLoader = false;\n this.showLoginForm = false;\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = false;\n this.hasAvayaLoginConflictError = false;\n this.hasAvayaSocketError = false;\n this.hasAvayaDeviceError = false;\n this.avayaIPOService.initLocalMic().catch((err) => {\n console.warn('initLocalMic failed', err);\n });\n this.persistSession();\n break;\n case LoginState.LOGGEDOUT:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.loginForm.reset();\n this.clearSession();\n break;\n case LoginState.LOGIN_FAILED:\n case LoginState.LOGIN_EMPTYUSERNAME:\n case LoginState.LOGIN_EMPTYPASSWORD:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n if (status?.reason === 'Invalid Credentials') {\n this.hasAvayaLoginError = true;\n this.hasAvayaLoginFailedGeneral = false;\n } else {\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = true;\n }\n break;\n case LoginState.WEBSOCKET_FAILURE:\n case LoginState.LOGIN_GW_NOTCONFIGURED:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.hasAvayaSocketError = true;\n break;\n case LoginState.DEVICEACCESS_FAILURE:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.hasAvayaDeviceError = true;\n break;\n default:\n break;\n }\n }\n\n selectTab(tab: 'history' | 'contacts' | 'keypad' | 'settings'): void {\n if (tab === 'settings' && this.activeTab !== 'settings') {\n this.previousTab = this.activeTab;\n }\n this.activeTab = tab;\n }\n\n /** Leave Settings and return to the screen the user came from (guards against a now-hidden tab). */\n closeSettings(): void {\n this.activeTab = this.previousTab;\n this.ensureVisibleTab();\n }\n\n onHistoryMakeCall(payload: { dialOut: string; name?: string }): void {\n this.triggerCall(payload);\n }\n\n onPhoneMakeCall(phoneNumber: string): void {\n this.triggerCall(phoneNumber);\n }\n\n onContactsMakeCall(payload: { dialOut: string; name?: string }): void {\n this.triggerCall(payload);\n }\n\n /**\n * Public API — place an outbound call programmatically (e.g. click-to-call from the host app).\n * Switches to the keypad view and dials `number`. Requires the widget to be registered;\n * if it is still on the login screen the call is skipped with a warning.\n *\n * Usage from the host app (via @ViewChild(AvayaIPOWidgetComponent)):\n * this.avayaWidget?.makeCall('9876543210');\n */\n makeCall(number: string): void {\n const dial = (number ?? '').toString().trim();\n if (!dial) {\n console.warn('[avaya-ipo] makeCall: no number provided');\n return;\n }\n if (this.showLoginForm) {\n console.warn('[avaya-ipo] makeCall: widget is not registered yet; cannot place call');\n return;\n }\n this.activeTab = 'keypad';\n void this.triggerCall(dial);\n }\n\n onPhoneEndCall(): void {\n try {\n this.pendingDisconnectSide = 'AGENT';\n const pendingIncoming = this.avayaIPOService.getLastIncomingCall();\n const activeCallId = this.avayaIPOService.activeCallId;\n const targetCallId =\n pendingIncoming?.callId || activeCallId || null;\n if (targetCallId) {\n const meta = this.callLogIndex.get(targetCallId);\n if (meta && !meta.connected) {\n const callLogPayload = {\n tenantId: this.tenantId,\n userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId: targetCallId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'disconnected',\n connected: false,\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n disconnectSide: 'AGENT',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (agent disconnect) failed', err),\n });\n this.callLogIndex.delete(targetCallId);\n if (pendingIncoming?.callId) {\n this.avayaIPOService.clearLastIncomingCall();\n }\n this.pendingDisconnectSide = null;\n }\n }\n this.avayaIPOService.dropCall();\n } catch (err) {\n console.warn('Failed to end call', err);\n }\n }\n\n onDeviceChange(change: {\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }): void {\n console.debug('Device selection changed', change);\n }\n\n onThemeToggle(enabled: boolean): void {\n this.darkModeEnabled = enabled;\n this.hostDarkMode = enabled;\n try {\n localStorage.setItem('sd-dark-mode', JSON.stringify(enabled));\n } catch { }\n }\n\n onCallScreenChange(active: boolean): void {\n Promise.resolve().then(() => {\n this.hideTabs = active;\n this.cdr.detectChanges();\n });\n }\n\n private async triggerCall(raw: any): Promise<void> {\n const providedName =\n typeof raw === 'object' && raw !== null ? raw?.name : null;\n const destination = formatDialOutNumber(\n raw?.dialOut ??\n raw?.internationalNumber ??\n raw?.number ??\n (typeof raw === 'string' ? raw : '')\n );\n if (!destination) {\n console.warn('No destination to dial');\n return;\n }\n this.activeTab = 'keypad';\n this.activeCallNumber = destination;\n this.activeCallName = providedName || null;\n const normalizedSearch = this.normalizePhoneForSearch(destination);\n if (!providedName) {\n const cachedName = this.entitiesSearchService.getCachedName(\n this.tenantId,\n normalizedSearch\n );\n if (cachedName) {\n this.activeCallName = cachedName;\n }\n }\n this.avayaIPOService.notifyOutgoingDial(destination);\n try {\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(destination),\n providedName ? Promise.resolve(null) : this.getOpenSearchCallerName(normalizedSearch),\n ]);\n const mapNumber =\n lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '') ||\n lookupResult?.normalizedPhoneNumber ||\n destination;\n this.activeCallNumber = mapNumber;\n if (providedName) {\n this.activeCallName = providedName;\n } else if (callerName) {\n this.activeCallName = callerName;\n }\n const slot = await this.avayaIPOService.makeCall(destination);\n if (!slot) {\n return;\n }\n const callId = this.avayaIPOService.activeCallId;\n if (callId) {\n this.activeCallNumber = mapNumber;\n const phonePayload: any = lookupResult || { normalizedPhoneNumber: mapNumber };\n const resolvedName = providedName || callerName;\n if (resolvedName && !phonePayload.name) {\n phonePayload.name = resolvedName;\n }\n this.callLogIndex.set(callId, {\n direction: 'outbound',\n phoneNumber: phonePayload,\n connected: false,\n });\n const callLogPayload = {\n tenantId: this.tenantId,\n userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: phonePayload,\n direction: 'outbound',\n duration: 0,\n status: 'initiated',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (initiated) failed', err),\n });\n }\n } catch (err) {\n console.error('Failed to place call', err);\n }\n }\n\n ngOnDestroy(): void {\n this.loginSub?.unsubscribe();\n this.incomingCallSub?.unsubscribe();\n this.callStateSub?.unsubscribe();\n }\n\n private async getLookupPhoneNumber(phoneNumber: string): Promise<any> {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n console.warn(\n 'lookupPhoneNumber called with an invalid phoneNumber: ',\n phoneNumber\n );\n return { phoneNumber: '' };\n }\n\n let normalizedPhoneNumber = phoneNumber.trim();\n if (normalizedPhoneNumber.startsWith('00')) {\n normalizedPhoneNumber = '+' + normalizedPhoneNumber.substring(2);\n }\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n if (\n countryCode &&\n !normalizedPhoneNumber.startsWith('+') &&\n !normalizedPhoneNumber.startsWith('00')\n ) {\n let digits = normalizedPhoneNumber.replace(/\\D/g, '');\n if (digits.length >= 10 && digits.startsWith('0')) {\n digits = digits.slice(1);\n }\n if (digits.startsWith(countryCode)) {\n normalizedPhoneNumber = `+${digits}`;\n } else {\n normalizedPhoneNumber = `+${countryCode}${digits}`;\n }\n }\n\n try {\n const res_lookupPhoneNumber: any =\n await this.phoneNumberLookupService.lookupPhoneNumber(\n normalizedPhoneNumber\n );\n\n if (!res_lookupPhoneNumber?.data?.valid) {\n throw new Error('Invalid res_lookupPhoneNumber');\n }\n\n const countryCode = res_lookupPhoneNumber?.data\n ? res_lookupPhoneNumber.data['country-code']\n : null;\n const res_getCountryFromCountryCode = countryCode\n ? await this.countryService.getCountryFromCountryCode(countryCode)\n : null;\n return {\n normalizedPhoneNumber: normalizedPhoneNumber,\n lookupPhoneNumber: res_lookupPhoneNumber?.data,\n country: res_getCountryFromCountryCode,\n };\n } catch (err) {\n console.warn(\n `Error looking up phone number ${phoneNumber}: `,\n err\n );\n return { normalizedPhoneNumber: normalizedPhoneNumber };\n }\n }\n\n private async getOpenSearchCallerName(\n phoneNumber: string\n ): Promise<string | null> {\n const tenantId = this.tenantId;\n if (!tenantId || !phoneNumber) {\n return null;\n }\n\n try {\n return await this.entitiesSearchService.lookupNameByPhone(\n tenantId,\n phoneNumber\n );\n } catch (err) {\n console.warn('OpenSearch lookup failed:', err);\n return null;\n }\n }\n\n private normalizePhoneForSearch(value: string): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n let normalized = value.trim();\n if (normalized.startsWith('00')) {\n normalized = '+' + normalized.slice(2);\n }\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!digits) {\n return '';\n }\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n if (countryCode && local.startsWith(countryCode)) {\n local = local.slice(countryCode.length);\n }\n return local;\n }\n\n private persistSession(): void {\n try {\n const payload = {\n loggedIn: true,\n extension: this.loginForm.value.ipoExtensionNo ?? '',\n password: this.loginForm.value.ipoPassword ?? '',\n };\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(payload));\n } catch (err) {\n console.warn('Unable to persist login session', err);\n }\n }\n\n private hasInputCredentials(): boolean {\n return !!(this.extension && this.extension.trim() && this.password && this.password.trim());\n }\n\n /**\n * Auto-login when both `extension` and `password` are supplied via @Input. Fires at most once for the\n * widget's lifetime (so a manual logout is respected and we never loop). Returns true if it kicked off\n * a login, so the caller can skip the localStorage fallback.\n */\n private tryAutoLoginFromInputs(): boolean {\n if (this.autoLoginAttempted || !this.loginForm || !this.showLoginForm || !this.hasInputCredentials()) {\n return false;\n }\n this.autoLoginAttempted = true;\n this.loginForm.patchValue({\n ipoExtensionNo: this.extension!.trim(),\n ipoPassword: this.password!.trim(),\n });\n this.showLoginForm = false;\n this.showLoginLoader = true;\n // Brief tick so the view/SDK are ready before we trigger the login.\n setTimeout(() => this.onLogin(), 0);\n return true;\n }\n\n private restoreSession(): void {\n try {\n const raw = localStorage.getItem(this.STORAGE_KEY);\n if (!raw) {\n return;\n }\n const parsed = JSON.parse(raw);\n if (parsed?.loggedIn) {\n this.showLoginForm = false;\n this.showLoginLoader = true;\n this.loginForm.patchValue({\n ipoExtensionNo: parsed.extension ?? '',\n ipoPassword: parsed.password ?? '',\n });\n if (parsed.extension && parsed.password) {\n // auto-login after brief tick to ensure view init\n setTimeout(() => this.onLogin(), 0);\n }\n }\n } catch (err) {\n console.warn('Unable to restore login session', err);\n }\n }\n\n private restoreThemePreference(): void {\n try {\n const stored = localStorage.getItem('sd-dark-mode');\n if (stored !== null) {\n this.darkModeEnabled = JSON.parse(stored) === true;\n this.hostDarkMode = this.darkModeEnabled;\n }\n } catch { }\n }\n\n private clearSession(): void {\n try {\n localStorage.removeItem(this.STORAGE_KEY);\n } catch (err) {\n console.warn('Unable to clear login session', err);\n }\n }\n\n private loadAwlScript(src: string): Promise<void> {\n if (!this.awlScriptPromise) {\n this.awlScriptPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector<HTMLScriptElement>(\n `script[src=\"${src}\"]`\n );\n if (existing) {\n if (existing.dataset['loaded'] === 'true') {\n resolve();\n return;\n }\n existing.addEventListener('load', () => resolve());\n existing.addEventListener('error', (e) => reject(e));\n return;\n }\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n script.defer = true;\n script.dataset['loaded'] = 'false';\n script.onload = () => {\n script.dataset['loaded'] = 'true';\n resolve();\n };\n script.onerror = (e) => reject(e);\n document.body.appendChild(script);\n });\n }\n return this.awlScriptPromise;\n }\n}\n","<div class=\"avaya-ipo-media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\n\n@if (authLoading) {\n <div class=\"avaya-ipo-auth-loading-screen\">\n <div class=\"avaya-ipo-auth-loading-card\">\n <div class=\"avaya-ipo-spinner\" aria-hidden=\"true\"></div>\n <div class=\"avaya-ipo-auth-loading-title\">Checking authentication</div>\n <div class=\"avaya-ipo-auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"avaya-ipo-auth-error-screen\">\n <div class=\"avaya-ipo-auth-error-card\">\n <div class=\"avaya-ipo-auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"avaya-ipo-auth-error-title\">Authentication Required</div>\n <div class=\"avaya-ipo-auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"avaya-ipo-container_connection_status_overlay\">\n <div class=\"avaya-ipo-container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"avaya-ipo-widget-body\">\n <div class=\"avaya-ipo-widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading avaya-ipo-heading-right\">\n <span>History</span>\n <button type=\"button\" class=\"avaya-ipo-settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"avaya-ipo-settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading\">\n <span class=\"avaya-ipo-heading-with-back\">\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-back-btn\" (click)=\"closeSettings()\" aria-label=\"Go back\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n </button>\n <span>Settings</span>\n </span>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-settings-btn-floating\" (click)=\"selectTab('settings')\" aria-label=\"Settings\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </button>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"avaya-ipo-global-loader\">\n <div class=\"avaya-ipo-spinner\"></div>\n <div class=\"avaya-ipo-loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs && showTabBar) {\n <nav class=\"avaya-ipo-tabs\">\n @if (showHistory) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">History</span>\n </button>\n }\n @if (showContacts) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">Contacts</span>\n </button>\n }\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"avaya-ipo-tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"avaya-ipo-tab-text\">Keypad</span>\n </button>\n </nav>\n }\n\n @if (activeTab !== 'keypad') {\n <div class=\"avaya-ipo-widget-version-footer\">v{{ widgetVersion }}</div>\n }\n}\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { NgxIntlTelInputModule } from 'ngx-intl-tel-input';\n\nimport { AvayaIPOWidgetComponent } from './avaya-ipo-widget.component';\nimport { CallHistoryComponent } from './components/call-history/call-history.component';\nimport { CallDetailsComponent } from './components/call-history/call-details/call-details.component';\nimport { ContactsComponent } from './components/contacts/contacts.component';\nimport { ContactCardComponent } from './components/contacts/contact-card/contact-card.component';\nimport { ContactDetailsComponent } from './components/contacts/contact-details/contact-details.component';\nimport { SettingsComponent } from './components/settings/settings.component';\nimport { AvayaIpoLoginComponent } from './components/login/login.component';\nimport { PhoneComponent } from './components/phone/phone.component';\nimport { PhoneIdleComponent } from './components/phone/idle/phone-idle.component';\nimport { PhoneIncomingComponent } from './components/phone/incoming/phone-incoming.component';\nimport { PhoneActiveComponent } from './components/phone/active/phone-active.component';\n\n@NgModule({\n declarations: [\n AvayaIPOWidgetComponent,\n CallHistoryComponent,\n CallDetailsComponent,\n ContactsComponent,\n ContactCardComponent,\n ContactDetailsComponent,\n SettingsComponent,\n AvayaIpoLoginComponent,\n PhoneComponent,\n PhoneIdleComponent,\n PhoneIncomingComponent,\n PhoneActiveComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatButtonModule,\n NgxIntlTelInputModule,\n ],\n exports: [AvayaIPOWidgetComponent],\n})\nexport class AvayaIPOWidgetModule {}\n","/*\n * Public API Surface of avaya-ipo-widget\n */\n\nexport * from './lib/avaya-ipo-widget.component';\nexport * from './lib/avaya-ipo-widget.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.AuthenticationService","i3","i4","i5.CallDetailsComponent","i1.EntitiesSearchService","i2.ContactCardComponent","i3.ContactDetailsComponent","i2","i6","i2.AvayaIPOService","i3.AuthenticationService","i4.RecordingManagerService","i5.TranscriptionStreamService","i7.PhoneIdleComponent","i8.PhoneIncomingComponent","i9.PhoneActiveComponent","i10","i3.CountryService","i4.PhoneNumberLookupService","i5.EntitiesSearchService","i7.CallHistoryComponent","i8.ContactsComponent","i9.SettingsComponent","i10.AvayaIpoLoginComponent","i11.PhoneComponent"],"mappings":"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"}