@webex/plugin-meetings 2.14.1 → 2.14.2

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,"names":["LocusInfo","updateMeeting","webex","meetingId","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","action","locus","meeting","loci","DESYNC","USE_CURRENT","USE_INCOMING","locusInfo","onDeltaLocus","locusDesync","needToGetFullLocus","meetingRequest","getFullLocus","desync","locusUrl","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","updateLocusUrl","url","updateFullState","fullState","updateMeetingInfo","updateSelf","self","updateHostInfo","host","updateMediaShares","mediaShares","data","eventType","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","handleLocusDelta","scope","eventName","args","emit","error","updateParticipantDeltas","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","state","LOCUS","STATE","INACTIVE","warn","Metrics","postEvent","event","REMOTE_ENDED","DESTROY_MEETING","reason","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_REMOVED_REASON","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","findParticipant","collection","item","person","id","generateDelta","prevState","newState","deltas","audioStatus","videoSlidesStatus","videoStatus","forEach","key","reduce","existingParticipant","delta","status","changed","push","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","ControlsUtils","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","current","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","LOCUSINFO","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","result","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","roles","SelfUtils","getRoles","parsedInfo","InfoUtils","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","internal","device","element","getSipUrl","sipUri","moderatorChanged","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","muted","remoteMuted","unmuteAllowed","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUnadmittedGuest","SELF_UNADMITTED_GUEST","isAdmittedGuest","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","video","shareStatus","share","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","EventsScope"],"sources":["index.js"],"sourcesContent":["import {isEqual} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE\n} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\nimport InfoUtils from '../locus-info/infoUtils';\nimport FullState from '../locus-info/fullState';\nimport SelfUtils from '../locus-info/selfUtils';\nimport HostUtils from '../locus-info/hostUtils';\nimport ControlsUtils from '../locus-info/controlsUtils';\nimport MediaSharesUtils from '../locus-info/mediaSharesUtils';\nimport LocusDeltaParser from '../locus-info/parser';\n\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: []\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action, locus, meeting) {\n const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n meeting.locusDesync = false;\n meeting.needToGetFullLocus = false;\n break;\n case DESYNC:\n meeting.meetingRequest.getFullLocus({\n desync: true,\n locusUrl: meeting.locusUrl\n }).then((res) => {\n meeting.locusInfo.onFullLocus(res.body);\n // Notify parser to resume processing delta events\n // now that we have full locus from DESYNC.\n this.locusParser.resume();\n });\n break;\n default:\n LoggerProxy.logger.info(`Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`);\n }\n }\n\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus, meeting) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n /**\n * Stored participant changes between the last event and the current event.\n * All previously stored events are overwritten between events.\n *\n * @instance\n * @type {Array<DeltaParticipant>}\n * @private\n * @member LocusInfo\n */\n this.deltaParticipants = [];\n\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self, locus.participants);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus) {\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting, data) {\n const {eventType} = data;\n\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(data.locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(data.locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(data.locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope, eventName, args) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {sting} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus, eventType) {\n if (!locus) {\n LoggerProxy.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n handleOneOnOneEvent(eventType) {\n if (this.parsedLocus.fullState.type === _CALL_ || this.parsedLocus.fullState.type === _SIP_BRIDGE_) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent'\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent'\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus) {\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n this.updateControls(locus.controls);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self, locus.participants);\n this.updateLocusUrl(locus.url);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants, self) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return participants.find((participant) =>\n (self && participant.identity !== self.identity) &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))) || this.partner;\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if ((this.parsedLocus.fullState.type === _CALL_) || (this.parsedLocus.fullState.type === _SIP_BRIDGE_)) {\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.');\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false\n }\n );\n }\n else\n if (partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave: this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_\n }\n );\n }\n else\n if (this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false\n }\n );\n }\n }\n else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (this.fullState && (this.fullState.state === LOCUS.STATE.INACTIVE || this.fullState.state === LOCUS.STATE.TERMINATING)) {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating');\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false\n }\n );\n }\n else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false\n }\n );\n }\n }\n else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (this.compareAndUpdateFlags.compareSelfAndHost || this.compareAndUpdateFlags.compareHostAndSelf) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if ((this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId) && this.parsedLocus.self.moderator) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost'\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true\n }\n );\n }\n else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost'\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false\n }\n );\n }\n }\n\n /**\n * Update the deltaParticipants property of this object based on a list of\n * provided participants.\n *\n * @param {Array} [participants] - The participants to update against.\n * @returns {void}\n */\n updateParticipantDeltas(participants = []) {\n // Used to find a participant within a participants collection.\n const findParticipant = (participant, collection) =>\n collection.find((item) => item.person.id === participant.person.id);\n\n // Generates an object that indicates which state properties have changed.\n const generateDelta = (prevState = {}, newState = {}) => {\n // Setup deltas.\n const deltas = {\n audioStatus: prevState.audioStatus !== newState.audioStatus,\n videoSlidesStatus: prevState.videoSlidesStatus !== newState.videoSlidesStatus,\n videoStatus: prevState.videoStatus !== newState.videoStatus\n };\n\n // Clean the object\n Object.keys(deltas).forEach(\n (key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n }\n );\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce(\n (collection, participant) => {\n const existingParticipant = findParticipant(\n participant,\n this.participants || []\n ) || {};\n\n const delta = generateDelta(existingParticipant.status, participant.status);\n\n const changed = (Object.keys(delta).length > 0);\n\n if (changed) {\n collection.push({\n person: participant.person,\n delta\n });\n }\n\n return collection;\n }, []\n );\n }\n\n /**\n *\n * @param {Object} participants new participants object\n * @param {boolen} deltaParticpantFlag delta event\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants'\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId\n }\n );\n }\n\n /**\n * @param {Object} controls\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n },\n current\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n }\n else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n }\n else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls'\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls'\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl\n }\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl, info) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n }\n else if (info && info.conversationUrl && !isEqual(this.conversationUrl, info.conversationUrl)) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState'\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState'\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo'\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous\n }\n );\n }\n this.host = host;\n }\n else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info, self) {\n if (info && (!isEqual(this.info, info))) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo'\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {info: parsedInfo.current, self}\n );\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo'\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo'\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n }\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares'\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous\n }\n );\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the locus.mediaShares property\n * @param {Array} participants the locus.participants property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self, participants) {\n if (self && !isEqual(this.self, self)) {\n const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri);\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n }\n else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.isUnadmittedGuest) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.isAdmittedGuest) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (parsedSelves.updates.audioStateChange || parsedSelves.updates.videoStateChange || parsedSelves.updates.shareStateChange) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share\n }\n );\n }\n\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n this.self = self;\n }\n else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl'\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;AACA;;AACA;;AAeA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;IACqBA,S;;;;;EACnB,mBAAYC,aAAZ,EAA2BC,KAA3B,EAAkCC,SAAlC,EAA6C;IAAA;;IAAA;IAC3C;IACA,MAAKC,WAAL,GAAmB;MACjBC,MAAM,EAAE;IADS,CAAnB;IAGA,MAAKH,KAAL,GAAaA,KAAb;IACA,MAAKI,UAAL,GAAkB,KAAlB;IACA,MAAKC,qBAAL,GAA6B,EAA7B;IACA,MAAKJ,SAAL,GAAiBA,SAAjB;IACA,MAAKF,aAAL,GAAqBA,aAArB;IACA,MAAKO,WAAL,GAAmB,IAAIC,eAAJ,EAAnB;IAV2C;EAW5C;EAGD;AACF;AACA;AACA;AACA;AACA;AACA;;;;;WACE,6BAAoBC,MAApB,EAA4BC,KAA5B,EAAmCC,OAAnC,EAA4C;MAAA;;MAC1C,4BAA4CH,gBAAiBI,IAA7D;MAAA,IAAOC,MAAP,yBAAOA,MAAP;MAAA,IAAeC,WAAf,yBAAeA,WAAf;MAAA,IAA4BC,YAA5B,yBAA4BA,YAA5B;;MAEA,QAAQN,MAAR;QACE,KAAKM,YAAL;UACEJ,OAAO,CAACK,SAAR,CAAkBC,YAAlB,CAA+BP,KAA/B;UACA;;QACF,KAAKI,WAAL;UACEH,OAAO,CAACO,WAAR,GAAsB,KAAtB;UACAP,OAAO,CAACQ,kBAAR,GAA6B,KAA7B;UACA;;QACF,KAAKN,MAAL;UACEF,OAAO,CAACS,cAAR,CAAuBC,YAAvB,CAAoC;YAClCC,MAAM,EAAE,IAD0B;YAElCC,QAAQ,EAAEZ,OAAO,CAACY;UAFgB,CAApC,EAGGC,IAHH,CAGQ,UAACC,GAAD,EAAS;YACfd,OAAO,CAACK,SAAR,CAAkBU,WAAlB,CAA8BD,GAAG,CAACE,IAAlC,EADe,CAEf;YACA;;YACA,MAAI,CAACpB,WAAL,CAAiBqB,MAAjB;UACD,CARD;UASA;;QACF;UACEC,qBAAYC,MAAZ,CAAmBC,IAAnB,gFAAgGtB,MAAhG;;MApBJ;IAsBD;IAGD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBC,KAAjB,EAAwBC,OAAxB,EAAiC;MAAA;;MAC/B;MACA,IAAI,CAAC,KAAKJ,WAAL,CAAiByB,aAAtB,EAAqC;QACnC;QACA;QACA,KAAKzB,WAAL,CAAiByB,aAAjB,GAAiC,UAACvB,MAAD,EAASwB,UAAT,EAAwB;UACvD,MAAI,CAACC,mBAAL,CAAyBzB,MAAzB,EAAiCwB,UAAjC,EAA6CtB,OAA7C;QACD,CAFD;MAGD,CAR8B,CAS/B;;;MACA,KAAKJ,WAAL,CAAiB4B,YAAjB,CAA8BzB,KAA9B;IACD;IAGD;AACF;AACA;AACA;AACA;;;;WACE,gBAAiB;MAAA,IAAZA,KAAY,uEAAJ,EAAI;MACf,KAAK0B,OAAL,GAAe1B,KAAK,CAAC0B,OAAN,IAAiB,IAAhC;MACA,KAAKC,gBAAL,GAAwB3B,KAAK,CAACC,OAAN,IAAiB,IAAzC;MACA,KAAK2B,eAAL,GAAuB5B,KAAK,CAAC4B,eAAN,IAAyB,IAAhD;MACA,KAAKC,QAAL,GAAgB7B,KAAK,CAAC6B,QAAN,IAAkB,IAAlC;MACA,KAAKC,MAAL,GAAc9B,KAAK,CAAC8B,MAAN,IAAgB,IAA9B;MACA,KAAKC,YAAL,GAAoB/B,KAAK,CAAC+B,YAAN,IAAsB,IAA1C;MACA,KAAKC,QAAL,GAAgBhC,KAAK,CAACgC,QAAN,IAAkB,IAAlC;MACA,KAAKC,UAAL,GAAkBjC,KAAK,CAACiC,UAAN,IAAoB,IAAtC;MACA,KAAKC,UAAL,GAAkBlC,KAAK,CAACkC,UAAN,IAAoB,IAAtC;MACA,KAAKC,YAAL,GAAoBnC,KAAK,CAACmC,YAAN,IAAsB,IAA1C;MAEA;AACJ;AACA;AACA;AACA;AACA;AACA;;MAEI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MACI,KAAKC,iBAAL,GAAyB,EAAzB,CA7Be,CA+Bf;MACA;;MACA,KAAKC,kBAAL,CAAwBrC,KAAK,CAACmC,YAA9B,EAjCe,CAkCf;;MACA,KAAKG,qBAAL,CAA2BtC,KAAK,CAACuC,eAAjC,EAAkDvC,KAAK,CAACqB,IAAxD;MACA,KAAKmB,cAAL,CAAoBxC,KAAK,CAACyC,QAA1B;MACA,KAAKC,cAAL,CAAoB1C,KAAK,CAAC2C,GAA1B;MACA,KAAKC,eAAL,CAAqB5C,KAAK,CAAC6C,SAA3B;MACA,KAAKC,iBAAL,CAAuB9C,KAAK,CAACqB,IAA7B,EAvCe,CAwCf;;MACA,KAAK0B,UAAL,CAAgB/C,KAAK,CAACgD,IAAtB,EAA4BhD,KAAK,CAACmC,YAAlC;MACA,KAAKc,cAAL,CAAoBjD,KAAK,CAACkD,IAA1B;MACA,KAAKC,iBAAL,CAAuBnD,KAAK,CAACoD,WAA7B;IACD;IAED;AACF;AACA;AACA;AACA;;;;WACE,sBAAapD,KAAb,EAAoB;MAClB,KAAKgB,WAAL,CAAiBhB,KAAjB,EADkB,CAGlB;;MACA,KAAKL,UAAL,GAAkB,IAAlB;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,eAAMM,OAAN,EAAeoD,IAAf,EAAqB;MACnB,IAAOC,SAAP,GAAoBD,IAApB,CAAOC,SAAP;;MAEAnC,qBAAYC,MAAZ,CAAmBC,IAAnB,2DAA2EiC,SAA3E;;MAEA,QAAQA,SAAR;QACE,KAAKC,sBAAWC,gBAAhB;QACA,KAAKD,sBAAWE,gBAAhB;QACA,KAAKF,sBAAWG,gBAAhB;QACA,KAAKH,sBAAWI,uBAAhB;QACA,KAAKJ,sBAAWK,yBAAhB;QACA,KAAKL,sBAAWM,uBAAhB;QACA,KAAKN,sBAAWO,yBAAhB;QACA,KAAKP,sBAAWQ,YAAhB;QACA,KAAKR,sBAAWS,mBAAhB;QACA,KAAKT,sBAAWU,4BAAhB;QACA,KAAKV,sBAAWW,yBAAhB;QACA,KAAKX,sBAAWY,oBAAhB;QACA,KAAKZ,sBAAWa,aAAhB;QACA,KAAKb,sBAAWc,cAAhB;UACE,KAAKrD,WAAL,CAAiBqC,IAAI,CAACrD,KAAtB,EAA6BsD,SAA7B;UACA;;QACF,KAAKC,sBAAWe,UAAhB;UACE,KAAKC,gBAAL,CAAsBlB,IAAI,CAACrD,KAA3B,EAAkCC,OAAlC;UACA;;QAEF;UACE;UACA;UACA,KAAKsE,gBAAL,CAAsBlB,IAAI,CAACrD,KAA3B,EAAkCC,OAAlC;MAxBJ;IA0BD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,oBAAWuE,KAAX,EAAkBC,SAAlB,EAA6BC,IAA7B,EAAmC;MACjC,OAAO,KAAKC,IAAL,CAAUH,KAAV,EAAiBC,SAAjB,EAA4BC,IAA5B,CAAP;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,qBAAY1E,KAAZ,EAAmBsD,SAAnB,EAA8B;MAC5B,IAAI,CAACtD,KAAL,EAAY;QACVmB,qBAAYC,MAAZ,CAAmBwD,KAAnB,CAAyB,qFAAzB;MACD;;MACD,KAAKC,uBAAL,CAA6B7E,KAAK,CAACmC,YAAnC;MACA,KAAKR,gBAAL,GAAwB3B,KAAK,CAACC,OAAN,IAAiB,IAAzC;MACA,KAAKkC,YAAL,GAAoBnC,KAAK,CAACmC,YAA1B;MACA,KAAK2C,eAAL,CAAqB9E,KAArB;MACA,KAAKqC,kBAAL,CAAwBrC,KAAK,CAACmC,YAA9B;MACA,KAAK4C,eAAL;MACA,KAAKC,mBAAL,CAAyB1B,SAAzB,EAV4B,CAW5B;;MACA,KAAKzD,WAAL,CAAiBoF,WAAjB,GAA+BjF,KAA/B;IACD,C,CAED;;IACA;AACF;AACA;AACA;AACA;;;;WACE,6BAAoBsD,SAApB,EAA+B;MAC7B,IAAI,KAAK7D,WAAL,CAAiBoD,SAAjB,CAA2BqC,IAA3B,KAAoCC,iBAApC,IAA8C,KAAK1F,WAAL,CAAiBoD,SAAjB,CAA2BqC,IAA3B,KAAoCE,uBAAtF,EAAoG;QACpG;QACE,IAAI9B,SAAS,KAAKC,sBAAWY,oBAA7B,EAAmD;UACnD;UACE,KAAKkB,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAOC,eALT,EAME;YACEC,cAAc,EAAE,IADlB;YAEEC,cAAc,EAAE;UAFlB,CANF;QAWD,CAfiG,CAgBlG;;;QACA,IAAIrC,SAAS,KAAKC,sBAAWC,gBAA7B,EAA+C;UAC/C;UACE,KAAK6B,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAOC,eALT,EAME;YACEC,cAAc,EAAE,KADlB;YAEEC,cAAc,EAAE;UAFlB,CANF;QAWD;MACF;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,sBAAa3F,KAAb,EAAoB;MAClB,KAAK8E,eAAL,CAAqB9E,KAArB;MACA,KAAKqC,kBAAL,CAAwBrC,KAAK,CAACmC,YAA9B;MACA,KAAK4C,eAAL;IACD;IAED;AACF;AACA;AACA;AACA;;;;WACE,yBAAgB/E,KAAhB,EAAuB;MACrB,KAAKwC,cAAL,CAAoBxC,KAAK,CAACyC,QAA1B;MACA,KAAKH,qBAAL,CAA2BtC,KAAK,CAACuC,eAAjC,EAAkDvC,KAAK,CAACqB,IAAxD;MACA,KAAKuE,aAAL,CAAmB5F,KAAK,CAAC0B,OAAzB;MACA,KAAKkB,eAAL,CAAqB5C,KAAK,CAAC6C,SAA3B;MACA,KAAKI,cAAL,CAAoBjD,KAAK,CAACkD,IAA1B;MACA,KAAKJ,iBAAL,CAAuB9C,KAAK,CAACqB,IAA7B,EAAmCrB,KAAK,CAACgD,IAAzC;MACA,KAAKG,iBAAL,CAAuBnD,KAAK,CAACoD,WAA7B;MACA,KAAKyC,qBAAL,CAA2B7F,KAAK,CAAC4B,eAAjC;MACA,KAAKkE,aAAL,CAAmB9F,KAAK,CAAC+F,OAAzB;MACA,KAAKhD,UAAL,CAAgB/C,KAAK,CAACgD,IAAtB,EAA4BhD,KAAK,CAACmC,YAAlC;MACA,KAAKO,cAAL,CAAoB1C,KAAK,CAAC2C,GAA1B;MACA,KAAKqD,YAAL,CAAkBhG,KAAK,CAAC8B,MAAxB;MACA,KAAKmE,gBAAL,CAAsBjG,KAAK,CAAC+B,YAA5B;MACA,KAAKmE,cAAL,CAAoBlG,KAAK,CAACgC,QAA1B;MACA,KAAKmE,gBAAL,CAAsBnG,KAAK,CAACiC,UAA5B;MACA,KAAKmE,iBAAL,CAAuBpG,KAAK,CAACkC,UAA7B;MACA,KAAKmE,gBAAL,GAjBqB,CAkBrB;IACD;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,yBAAgBlE,YAAhB,EAA8Ba,IAA9B,EAAoC;MAClC,IAAI,CAACb,YAAD,IAAiBA,YAAY,CAACmE,MAAb,KAAwB,CAA7C,EAAgD;QAC9C,OAAO,IAAP;MACD;;MAED,OAAOnE,YAAY,CAACoE,IAAb,CAAkB,UAACC,WAAD;QAAA,OACtBxD,IAAI,IAAIwD,WAAW,CAACC,QAAZ,KAAyBzD,IAAI,CAACyD,QAAvC,KACHtE,YAAY,CAACmE,MAAb,IAAuB,CAAvB,IAA6BE,WAAW,CAACtB,IAAZ,KAAqBwB,iBAArB,IAA+B,CAACF,WAAW,CAACG,OADtE,CADuB;MAAA,CAAlB,KAE+E,KAAKC,OAF3F;IAGD,C,CAED;;IACA;AACF;AACA;AACA;;;;WACE,2BAAkB;MAChB,IAAK,KAAKnH,WAAL,CAAiBoD,SAAjB,CAA2BqC,IAA3B,KAAoCC,iBAArC,IAAiD,KAAK1F,WAAL,CAAiBoD,SAAjB,CAA2BqC,IAA3B,KAAoCE,uBAAzF,EAAwG;QACtG,IAAMwB,OAAO,GAAG,KAAKC,eAAL,CAAqB,KAAK1E,YAA1B,EAAwC,KAAKa,IAA7C,CAAhB;QAEA,KAAK1D,aAAL,CAAmB;UAACsH,OAAO,EAAPA;QAAD,CAAnB,EAHsG,CAKtG;QAEA;QACA;QAEA;;QAEA,IAAI,KAAK/D,SAAL,IAAkB,KAAKA,SAAL,CAAeiE,KAAf,KAAyBC,iBAAMC,KAAN,CAAYC,QAA3D,EAAqE;UACnE;UACA9F,qBAAYC,MAAZ,CAAmB8F,IAAnB,CAAwB,2EAAxB;;UACAC,iBAAQC,SAAR,CAAkB;YAChBC,KAAK,EAAE/D,kBAAUgE,YADD;YAEhB9H,SAAS,EAAE,KAAKA;UAFA,CAAlB;;UAIA,KAAK6F,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAO+B,eALT,EAME;YACEC,MAAM,EAAEC,+BAAoBC,aAD9B;YAEEC,WAAW,EAAE;UAFf,CANF;QAWD,CAlBD,MAoBA,IAAIf,OAAO,CAACE,KAAR,KAAkBc,yBAAcC,MAAd,CAAqBC,IAAvC,IACF,KAAKrI,WAAL,CAAiBuD,IADf,KAED,KAAKvD,WAAL,CAAiBuD,IAAjB,CAAsB8D,KAAtB,KAAgCc,yBAAcC,MAAd,CAAqBE,QAArD,IACD,KAAKtI,WAAL,CAAiBuD,IAAjB,CAAsB8D,KAAtB,KAAgCc,yBAAcC,MAAd,CAAqBG,QADpD,IAED,KAAKvI,WAAL,CAAiBuD,IAAjB,CAAsB8D,KAAtB,KAAgCc,yBAAcC,MAAd,CAAqBI,MAJnD,CAAJ,EAIgE;UAC9Dd,iBAAQC,SAAR,CAAkB;YAChBC,KAAK,EAAE/D,kBAAUgE,YADD;YAEhB9H,SAAS,EAAE,KAAKA;UAFA,CAAlB;;UAIA,KAAK6F,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAO+B,eALT,EAME;YACEC,MAAM,EAAEC,+BAAoBS,YAD9B;YAEEP,WAAW,EAAE,KAAKlI,WAAL,CAAiBuD,IAAjB,CAAsBmF,UAAtB,IAAoC,KAAK1I,WAAL,CAAiBuD,IAAjB,CAAsBmF,UAAtB,CAAiCrB,KAAjC,KAA2CsB;UAF9F,CANF;QAWD,CApBD,MAsBA,IAAI,KAAK3I,WAAL,CAAiBuD,IAAjB,IACF,KAAKvD,WAAL,CAAiBuD,IAAjB,CAAsB8D,KAAtB,KAAgCc,yBAAcC,MAAd,CAAqBC,IADnD,KAEHlB,OAAO,CAACE,KAAR,KAAkBc,yBAAcC,MAAd,CAAqBC,IAAvC,IACDlB,OAAO,CAACE,KAAR,KAAkBc,yBAAcC,MAAd,CAAqBE,QADtC,IAEDnB,OAAO,CAACE,KAAR,KAAkBc,yBAAcC,MAAd,CAAqBG,QAFtC,IAGDpB,OAAO,CAACE,KAAR,KAAkBc,yBAAcC,MAAd,CAAqBQ,IALnC,CAAJ,CAK6C;QAL7C,EAME;UACAlB,iBAAQC,SAAR,CAAkB;YAChBC,KAAK,EAAE/D,kBAAUgE,YADD;YAEhB9H,SAAS,EAAE,KAAKA;UAFA,CAAlB;;UAIA,KAAK6F,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAO+B,eALT,EAME;YACEC,MAAM,EAAEC,+BAAoBa,SAD9B;YAEEX,WAAW,EAAE;UAFf,CANF;QAWD;MACF,CA7ED,MA8EK,IAAI,KAAKlI,WAAL,CAAiBoD,SAAjB,CAA2BqC,IAA3B,KAAoCqD,oBAAxC,EAAmD;QACtD,IAAI,KAAK1F,SAAL,KAAmB,KAAKA,SAAL,CAAeiE,KAAf,KAAyBC,iBAAMC,KAAN,CAAYC,QAArC,IAAiD,KAAKpE,SAAL,CAAeiE,KAAf,KAAyBC,iBAAMC,KAAN,CAAYwB,WAAzG,CAAJ,EAA2H;UACzHrH,qBAAYC,MAAZ,CAAmB8F,IAAnB,CAAwB,uFAAxB;;UACAC,iBAAQC,SAAR,CAAkB;YAChBC,KAAK,EAAE/D,kBAAUgE,YADD;YAEhB9H,SAAS,EAAE,KAAKA;UAFA,CAAlB;;UAIA,KAAK6F,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAO+B,eALT,EAME;YACEC,MAAM,EAAEiB,kCAAuBC,4BADjC;YAEEf,WAAW,EAAE;UAFf,CANF;QAWD,CAjBD,MAkBK,IAAI,KAAK9E,SAAL,IAAkB,KAAKA,SAAL,CAAe8D,OAArC,EAA8C;UACjD;UACAQ,iBAAQC,SAAR,CAAkB;YAChBC,KAAK,EAAE/D,kBAAUgE,YADD;YAEhB9H,SAAS,EAAE,KAAKA;UAFA,CAAlB;;UAIA,KAAK6F,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAO+B,eALT,EAME;YACEC,MAAM,EAAEiB,kCAAuBE,iBADjC;YAEEhB,WAAW,EAAE;UAFf,CANF;QAWD,CAjBI,CAkBL;QACA;QAnBK,KAoBA,IAAI,KAAKlI,WAAL,CAAiBuD,IAAjB,IAAyB,KAAKvD,WAAL,CAAiBuD,IAAjB,CAAsB2D,OAAnD,EAA4D;UAC/D;UACA,KAAKtB,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAO+B,eALT,EAME;YACEC,MAAM,EAAEiB,kCAAuBG,YADjC;YAEEjB,WAAW,EAAE;UAFf,CANF;QAWD;MACF,CArDI,MAsDA;QACHxG,qBAAYC,MAAZ,CAAmB8F,IAAnB,CAAwB,+DAAxB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,4BAAmB;MACjB;MACA;MACA,IAAI,KAAKtH,qBAAL,CAA2BiJ,kBAA3B,IAAiD,KAAKjJ,qBAAL,CAA2BkJ,kBAAhF,EAAoG;QAClG,KAAKD,kBAAL;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,8BAAqB;MAAA;;MACnB;MACA,IAAK,KAAKpJ,WAAL,CAAiBuD,IAAjB,CAAsB+F,YAAtB,+BAAuC,KAAKtJ,WAAL,CAAiByD,IAAxD,0DAAuC,sBAAuB8F,MAA9D,CAAD,IAA0E,KAAKvJ,WAAL,CAAiBuD,IAAjB,CAAsBiG,SAApG,EAA+G;QAC7G,KAAK5D,UAAL,CACE;UACEC,IAAI,EAAE,YADR;UAEEC,QAAQ,EAAE;QAFZ,CADF,EAKEC,kBAAO0D,0BALT,EAME;UACEC,aAAa,EAAE;QADjB,CANF;MAUD,CAXD,MAYK;QACH,KAAK9D,UAAL,CACE;UACEC,IAAI,EAAE,YADR;UAEEC,QAAQ,EAAE;QAFZ,CADF,EAKEC,kBAAO0D,0BALT,EAME;UACEC,aAAa,EAAE;QADjB,CANF;MAUD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,mCAA2C;MAAA;;MAAA,IAAnBhH,YAAmB,uEAAJ,EAAI;;MACzC;MACA,IAAMiH,eAAe,GAAG,SAAlBA,eAAkB,CAAC5C,WAAD,EAAc6C,UAAd;QAAA,OACtBA,UAAU,CAAC9C,IAAX,CAAgB,UAAC+C,IAAD;UAAA,OAAUA,IAAI,CAACC,MAAL,CAAYC,EAAZ,KAAmBhD,WAAW,CAAC+C,MAAZ,CAAmBC,EAAhD;QAAA,CAAhB,CADsB;MAAA,CAAxB,CAFyC,CAKzC;;;MACA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,GAAmC;QAAA,IAAlCC,SAAkC,uEAAtB,EAAsB;QAAA,IAAlBC,QAAkB,uEAAP,EAAO;QACvD;QACA,IAAMC,MAAM,GAAG;UACbC,WAAW,EAAEH,SAAS,CAACG,WAAV,KAA0BF,QAAQ,CAACE,WADnC;UAEbC,iBAAiB,EAAEJ,SAAS,CAACI,iBAAV,KAAgCH,QAAQ,CAACG,iBAF/C;UAGbC,WAAW,EAAEL,SAAS,CAACK,WAAV,KAA0BJ,QAAQ,CAACI;QAHnC,CAAf,CAFuD,CAQvD;;QACA,mBAAYH,MAAZ,EAAoBI,OAApB,CACE,UAACC,GAAD,EAAS;UACP,IAAIL,MAAM,CAACK,GAAD,CAAN,KAAgB,IAApB,EAA0B;YACxB,OAAOL,MAAM,CAACK,GAAD,CAAb;UACD;QACF,CALH;QAQA,OAAOL,MAAP;MACD,CAlBD;;MAoBA,KAAKxH,iBAAL,GAAyBD,YAAY,CAAC+H,MAAb,CACvB,UAACb,UAAD,EAAa7C,WAAb,EAA6B;QAC3B,IAAM2D,mBAAmB,GAAGf,eAAe,CACzC5C,WADyC,EAEzC,MAAI,CAACrE,YAAL,IAAqB,EAFoB,CAAf,IAGvB,EAHL;QAKA,IAAMiI,KAAK,GAAGX,aAAa,CAACU,mBAAmB,CAACE,MAArB,EAA6B7D,WAAW,CAAC6D,MAAzC,CAA3B;QAEA,IAAMC,OAAO,GAAI,mBAAYF,KAAZ,EAAmB9D,MAAnB,GAA4B,CAA7C;;QAEA,IAAIgE,OAAJ,EAAa;UACXjB,UAAU,CAACkB,IAAX,CAAgB;YACdhB,MAAM,EAAE/C,WAAW,CAAC+C,MADN;YAEda,KAAK,EAALA;UAFc,CAAhB;QAID;;QAED,OAAOf,UAAP;MACD,CAnBsB,EAmBpB,EAnBoB,CAAzB;IAqBD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,4BAAmBlH,YAAnB,EAAiC;MAAA;;MAC/B,KAAKkD,UAAL,CACE;QACEC,IAAI,EAAE,YADR;QAEEC,QAAQ,EAAE;MAFZ,CADF,EAKEC,kBAAOgF,8BALT,EAME;QACErI,YAAY,EAAZA,YADF;QAEEsI,WAAW,EAAE,KAAKhL,WAAL,CAAiBgD,QAAjB,8BAA6B,KAAKhD,WAAL,CAAiBgD,QAAjB,CAA0BiI,MAAvD,0DAA6B,sBAAkCC,UAA/D,CAFf;QAGE5B,YAAY,EAAE,KAAKtJ,WAAL,CAAiBuD,IAAjB,IAAyB,KAAKvD,WAAL,CAAiBuD,IAAjB,CAAsB+F,YAH/D;QAIE6B,MAAM,EAAE,KAAKnL,WAAL,CAAiBuD,IAAjB,IAAyB,KAAKvD,WAAL,CAAiBuD,IAAjB,CAAsB4H,MAJzD;QAKE5B,MAAM,EAAE,KAAKvJ,WAAL,CAAiByD,IAAjB,IAAyB,KAAKzD,WAAL,CAAiByD,IAAjB,CAAsB8F;MALzD,CANF;IAcD;IAED;AACF;AACA;AACA;AACA;;;;WACE,wBAAevG,QAAf,EAAyB;MACvB,IAAIA,QAAQ,IAAI,CAAC,uBAAQ,KAAKA,QAAb,EAAuBA,QAAvB,CAAjB,EAAmD;QACjD,KAAKhD,WAAL,CAAiBgD,QAAjB,GAA4BoI,uBAAcC,KAAd,CAAoBrI,QAApB,CAA5B;;QACA,4BAOIoI,uBAAcE,WAAd,CAA0B,KAAKtI,QAA/B,EAAyCA,QAAzC,CAPJ;QAAA,mDACEuI,OADF;QAAA,IAEIC,mBAFJ,0BAEIA,mBAFJ;QAAA,IAGIC,yBAHJ,0BAGIA,yBAHJ;QAAA,IAIIC,0BAJJ,0BAIIA,0BAJJ;QAAA,IAMEC,OANF,yBAMEA,OANF;;QASA,IAAIH,mBAAmB,IAAIC,yBAA3B,EAAsD;UACpD,IAAIpE,KAAK,GAAG,IAAZ;;UAEA,IAAIoE,yBAAJ,EAA+B;YAC7B,IAAIE,OAAO,CAACV,MAAR,CAAeW,MAAnB,EAA2B;cACzBvE,KAAK,GAAGwE,2BAAgBC,MAAxB;YACD,CAFD,MAGK;cACH;cACAzE,KAAK,GAAGsE,OAAO,CAACV,MAAR,CAAec,SAAf,GAA2BF,2BAAgBG,OAA3C,GAAqDH,2BAAgBjD,IAA7E;YACD;UACF,CARD,MASK,IAAI4C,mBAAJ,EAAyB;YAC5BnE,KAAK,GAAGsE,OAAO,CAACV,MAAR,CAAec,SAAf,GAA2BF,2BAAgBI,SAA3C,GAAuDJ,2BAAgBjD,IAA/E;UACD;;UAED,KAAKhD,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBoG,0BALnB,EAME;YACE9E,KAAK,EAALA,KADF;YAEE6D,UAAU,EAAES,OAAO,CAACV,MAAR,CAAeC,UAF7B;YAGEkB,YAAY,EAAET,OAAO,CAACV,MAAR,CAAemB;UAH/B,CANF;QAYD;;QAED,IAAIV,0BAAJ,EAAgC;UAC9B,IAAOW,mBAAP,GAA8BV,OAAO,CAACW,gBAAtC,CAAOD,mBAAP;UAEA,KAAKzG,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBwG,kCALnB,EAME;YACEF,mBAAmB,EAAnBA;UADF,CANF;QAUD;;QAED,KAAKrJ,QAAL,GAAgBA,QAAhB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,+BAAsBF,eAAtB,EAAuClB,IAAvC,EAA6C;MAC3C,IAAIkB,eAAe,IAAI,CAAC,uBAAQ,KAAKA,eAAb,EAA8BA,eAA9B,CAAxB,EAAwE;QACtE,KAAKA,eAAL,GAAuBA,eAAvB;QACA,KAAKjD,aAAL,CAAmB;UAACiD,eAAe,EAAfA;QAAD,CAAnB;MACD,CAHD,MAIK,IAAIlB,IAAI,IAAIA,IAAI,CAACkB,eAAb,IAAgC,CAAC,uBAAQ,KAAKA,eAAb,EAA8BlB,IAAI,CAACkB,eAAnC,CAArC,EAA0F;QAC7F,KAAKA,eAAL,GAAuBlB,IAAI,CAACkB,eAA5B;QACA,KAAKjD,aAAL,CAAmB;UAACiD,eAAe,EAAElB,IAAI,CAACkB;QAAvB,CAAnB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,uBAAcb,OAAd,EAAuB;MACrB,IAAIA,OAAO,IAAI,CAAC,uBAAQ,KAAKA,OAAb,EAAsBA,OAAtB,CAAhB,EAAgD;QAC9C,KAAKA,OAAL,GAAeA,OAAf;MACD;IACF;IAGD;AACF;AACA;AACA;AACA;;;;WACE,yBAAgBmB,SAAhB,EAA2B;MACzB,IAAIA,SAAS,IAAI,CAAC,uBAAQ,KAAKA,SAAb,EAAwBA,SAAxB,CAAlB,EAAsD;QACpD,IAAMoJ,MAAM,GAAGC,mBAAUC,YAAV,CAAuB,KAAKtJ,SAA5B,EAAuCA,SAAvC,CAAf;;QAEA,KAAKvD,aAAL,CAAmB2M,MAAM,CAACb,OAA1B;;QAEA,IAAIa,MAAM,CAACjB,OAAP,CAAeoB,qBAAnB,EAA0C;UACxC,KAAK/G,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiB6G,+BALnB,EAME;YACEC,aAAa,EAAEL,MAAM,CAACM,QAAP,IAAmBN,MAAM,CAACM,QAAP,CAAgBC,YADpD;YAEEC,YAAY,EAAER,MAAM,CAACb,OAAP,CAAeoB;UAF/B,CANF;QAWD;;QAED,IAAIP,MAAM,CAACjB,OAAP,CAAe0B,oBAAnB,EAAyC;UACvC,KAAKrH,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBmH,sBALnB,EAME;YACEzH,IAAI,EAAE+G,MAAM,CAACb,OAAP,CAAelG;UADvB,CANF;QAUD;;QACD,KAAKzF,WAAL,CAAiBoD,SAAjB,GAA6BoJ,MAAM,CAACb,OAApC;QACA,KAAKvI,SAAL,GAAiBA,SAAjB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,wBAAeK,IAAf,EAAqB;MACnB,IAAIA,IAAI,IAAI,CAAC,uBAAQ,KAAKA,IAAb,EAAmBA,IAAnB,CAAb,EAAuC;QACrC,IAAM0J,WAAW,GAAGC,mBAAUC,QAAV,CAAmB,KAAK5J,IAAxB,EAA8BA,IAA9B,CAApB;;QAEA,KAAK5D,aAAL,CAAmBsN,WAAW,CAACxB,OAA/B;QACA,KAAK3L,WAAL,CAAiByD,IAAjB,GAAwB0J,WAAW,CAACxB,OAApC;;QACA,IAAIwB,WAAW,CAAC5B,OAAZ,CAAoB+B,SAAxB,EAAmC;UACjC,KAAKnN,qBAAL,CAA2BiJ,kBAA3B,GAAgD,IAAhD;UACA,KAAKxD,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEC,kBAAOwH,sBALT,EAME;YACEC,OAAO,EAAEL,WAAW,CAACxB,OADvB;YAEE8B,OAAO,EAAEN,WAAW,CAACL;UAFvB,CANF;QAWD;;QACD,KAAKrJ,IAAL,GAAYA,IAAZ;MACD,CApBD,MAqBK;QACH,KAAKtD,qBAAL,CAA2BiJ,kBAA3B,GAAgD,KAAhD;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAAkBxH,IAAlB,EAAwB2B,IAAxB,EAA8B;MAC5B,IAAI3B,IAAI,IAAK,CAAC,uBAAQ,KAAKA,IAAb,EAAmBA,IAAnB,CAAd,EAAyC;QAAA;;QACvC,IAAM8L,KAAK,GAAGnK,IAAI,GAAGoK,mBAAUC,QAAV,CAAmBrK,IAAnB,CAAH,GAA8B,+BAAKvD,WAAL,CAAiBuD,IAAjB,gFAAuBmK,KAAvB,KAAgC,EAAhF;;QAEA,IAAMG,UAAU,GAAGC,mBAAUC,QAAV,CAAmB,KAAK/N,WAAL,CAAiB4B,IAApC,EAA0CA,IAA1C,EAAgD8L,KAAhD,CAAnB;;QAEA,KAAK9H,UAAL,CACE;UACEC,IAAI,EAAE,YADR;UAEEC,QAAQ,EAAE;QAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBiI,oBALnB,EAME;UAACpM,IAAI,EAAEiM,UAAU,CAAClC,OAAlB;UAA2BpI,IAAI,EAAJA;QAA3B,CANF;;QASA,IAAIsK,UAAU,CAACtC,OAAX,CAAmB0C,QAAvB,EAAiC;UAC/B,KAAKrI,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBmI,cALnB,EAMEtM,IANF;QAQD;;QACD,IAAIiM,UAAU,CAACtC,OAAX,CAAmB4C,UAAvB,EAAmC;UACjC,KAAKvI,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBqI,gBALnB,EAMExM,IANF;QAQD;;QAED,KAAKA,IAAL,GAAYA,IAAZ;QACA,KAAK5B,WAAL,CAAiB4B,IAAjB,GAAwBiM,UAAU,CAAClC,OAAnC,CApCuC,CAqCvC;;QACA,KAAK9L,aAAL,CAAmBgO,UAAU,CAAClC,OAA9B;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,2BAAkBhI,WAAlB,EAA+B;MAC7B,IAAIA,WAAW,IAAI,CAAC,uBAAQ,KAAKA,WAAb,EAA0BA,WAA1B,CAApB,EAA4D;QAC1D,IAAM0K,iBAAiB,GAAGC,0BAAiBC,cAAjB,CAAgC,KAAK5K,WAArC,EAAkDA,WAAlD,CAA1B;;QAEA,KAAK9D,aAAL,CAAmBwO,iBAAiB,CAAC1C,OAArC;QACA,KAAK/F,UAAL,CACE;UACEC,IAAI,EAAE,YADR;UAEEC,QAAQ,EAAE;QAFZ,CADF,EAKEC,kBAAOyI,8BALT,EAME;UACE7C,OAAO,EAAE0C,iBAAiB,CAAC1C,OAD7B;UAEEmB,QAAQ,EAAEuB,iBAAiB,CAACvB;QAF9B,CANF;QAWA,KAAK9M,WAAL,CAAiB2D,WAAjB,GAA+B0K,iBAAiB,CAAC1C,OAAjD;QACA,KAAKhI,WAAL,GAAmBA,WAAnB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,+BAAsBxB,eAAtB,EAAuC;MACrC,IAAIA,eAAe,IAAI,CAAC,uBAAQ,KAAKA,eAAb,EAA8BA,eAA9B,CAAxB,EAAwE;QACtE,KAAKA,eAAL,GAAuBA,eAAvB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,uBAAcmE,OAAd,EAAuB;MACrB,IAAIA,OAAO,IAAI,CAAC,uBAAQ,KAAKA,OAAb,EAAsBA,OAAtB,CAAhB,EAAgD;QAC9C,KAAKA,OAAL,GAAeA,OAAf;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,oBAAW/C,IAAX,EAAiBb,YAAjB,EAA+B;MAC7B,IAAIa,IAAI,IAAI,CAAC,uBAAQ,KAAKA,IAAb,EAAmBA,IAAnB,CAAb,EAAuC;QACrC,IAAMkL,YAAY,GAAGd,mBAAUe,SAAV,CAAoB,KAAKnL,IAAzB,EAA+BA,IAA/B,EAAqC,KAAKzD,KAAL,CAAW6O,QAAX,CAAoBC,MAApB,CAA2B1L,GAAhE,CAArB;;QAEA,KAAKrD,aAAL,CAAmB4O,YAAY,CAAC9C,OAAhC;QACA,KAAK3L,WAAL,CAAiBuD,IAAjB,GAAwBkL,YAAY,CAAC9C,OAArC;QAEA,IAAMkD,OAAO,GAAG,KAAK7O,WAAL,CAAiBC,MAAjB,CAAwB,KAAKD,WAAL,CAAiBC,MAAjB,CAAwB4G,MAAxB,GAAiC,CAAzD,CAAhB;;QAEA,IAAIgI,OAAO,KAAKJ,YAAY,CAAC9C,OAAb,CAAqBtE,KAArC,EAA4C;UAC1C,KAAKrH,WAAL,CAAiBC,MAAjB,CAAwB6K,IAAxB,CAA6B2D,YAAY,CAAC9C,OAAb,CAAqBtE,KAAlD;QACD,CAVoC,CAYrC;QACA;;;QACA,IAAMmF,MAAM,GAAGmB,mBAAUmB,SAAV,CAAoB,KAAK1H,eAAL,CAAqB1E,YAArB,EAAmCa,IAAnC,CAApB,EAA8D,KAAKvD,WAAL,CAAiBoD,SAAjB,CAA2BqC,IAAzF,EAA+F,KAAKzF,WAAL,CAAiB4B,IAAjB,CAAsBmN,MAArH,CAAf;;QAEA,IAAIvC,MAAM,CAACuC,MAAX,EAAmB;UACjB,KAAKlP,aAAL,CAAmB2M,MAAnB;QACD;;QAED,IAAIiC,YAAY,CAAClD,OAAb,CAAqByD,gBAAzB,EAA2C;UACzC,KAAK7O,qBAAL,CAA2BkJ,kBAA3B,GAAgD,IAAhD;QACD,CAFD,MAGK;UACH,KAAKlJ,qBAAL,CAA2BkJ,kBAA3B,GAAgD,KAAhD;QACD;;QAED,IAAIoF,YAAY,CAAClD,OAAb,CAAqB0D,yBAAzB,EAAoD;UAClD,KAAKrJ,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBmJ,4BALnB,EAME;YAACnH,MAAM,EAAExE,IAAI,CAACwE;UAAd,CANF;QAQD;;QAED,IAAI0G,YAAY,CAAClD,OAAb,CAAqByD,gBAAzB,EAA2C;UACzC,KAAKpJ,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBoJ,sBALnB,EAME5L,IANF;QAQD;;QACD,IAAIkL,YAAY,CAAClD,OAAb,CAAqB6D,gCAAzB,EAA2D;UACzD,KAAKxJ,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBsJ,qBALnB,EAME;YACEC,KAAK,EAAEb,YAAY,CAAC9C,OAAb,CAAqB4D,WAD9B;YAEEC,aAAa,EAAEf,YAAY,CAAC9C,OAAb,CAAqB6D;UAFtC,CANF;QAWD;;QACD,IAAIf,YAAY,CAAClD,OAAb,CAAqBkE,sBAAzB,EAAiD;UAC/C,KAAK7J,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiB2J,+BALnB,EAME;YACEJ,KAAK,EAAEb,YAAY,CAAC9C,OAAb,CAAqB4D,WAD9B;YAEEC,aAAa,EAAEf,YAAY,CAAC9C,OAAb,CAAqB6D;UAFtC,CANF;QAWD;;QACD,IAAIf,YAAY,CAAClD,OAAb,CAAqBoE,iCAAzB,EAA4D;UAC1D,KAAK/J,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiB6J,sBALnB,EAME,EANF;QAQD;;QACD,IAAInB,YAAY,CAAClD,OAAb,CAAqBsE,iBAAzB,EAA4C;UAC1C,KAAKjK,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiB+J,qBALnB,EAMEvM,IANF;QAQD;;QACD,IAAIkL,YAAY,CAAClD,OAAb,CAAqBwE,eAAzB,EAA0C;UACxC,KAAKnK,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBiK,mBALnB,EAMEzM,IANF;QAQD;;QAED,IAAIkL,YAAY,CAAClD,OAAb,CAAqB0E,eAAzB,EAA0C;UACxC,KAAKrK,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiBmK,gBALnB,EAMEvC,mBAAUwC,cAAV,CAAyB5M,IAAI,CAAC6M,aAA9B,CANF;QAQD;;QAED,IAAI3B,YAAY,CAAClD,OAAb,CAAqB8E,gBAArB,IAAyC5B,YAAY,CAAClD,OAAb,CAAqB+E,gBAA9D,IAAkF7B,YAAY,CAAClD,OAAb,CAAqBgF,gBAA3G,EAA6H;UAAA;;UAC3H,KAAK3K,UAAL,CACE;YACEC,IAAI,EAAE,YADR;YAEEC,QAAQ,EAAE;UAFZ,CADF,EAKEoG,qBAAUnG,MAAV,CAAiByK,mBALnB,EAME;YACEpG,WAAW,2BAAEqE,YAAY,CAAC9C,OAAb,CAAqB8E,kBAAvB,0DAAE,sBAAyCC,KADxD;YAEEpG,WAAW,4BAAEmE,YAAY,CAAC9C,OAAb,CAAqB8E,kBAAvB,2DAAE,uBAAyCE,KAFxD;YAGEC,WAAW,4BAAEnC,YAAY,CAAC9C,OAAb,CAAqB8E,kBAAvB,2DAAE,uBAAyCI;UAHxD,CANF;QAYD;;QAGD,KAAKjL,UAAL,CACE;UACEC,IAAI,EAAE,YADR;UAEEC,QAAQ,EAAE;QAFZ,CADF,EAKEC,kBAAO+K,sBALT,EAME;UACEC,OAAO,EAAEtC,YAAY,CAAC3B,QADxB;UAEEkE,OAAO,EAAEvC,YAAY,CAAC9C;QAFxB,CANF;QAWA,KAAK3L,WAAL,CAAiBuD,IAAjB,GAAwBkL,YAAY,CAAC9C,OAArC;QACA,KAAKpI,IAAL,GAAYA,IAAZ;MACD,CAjJD,MAkJK;QACH,KAAKpD,qBAAL,CAA2BkJ,kBAA3B,GAAgD,KAAhD;MACD;IACF;IAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,wBAAenG,GAAf,EAAoB;MAClB,IAAIA,GAAG,IAAI,KAAKA,GAAL,KAAaA,GAAxB,EAA6B;QAC3B,KAAKA,GAAL,GAAWA,GAAX;QACA,KAAKrD,aAAL,CAAmB;UAACuB,QAAQ,EAAE8B;QAAX,CAAnB;QACA,KAAK0C,UAAL,CACE;UACEC,IAAI,EAAE,YADR;UAEEC,QAAQ,EAAE;QAFZ,CADF,EAKEC,kBAAOkL,qBALT,EAME/N,GANF;MAQD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,sBAAab,MAAb,EAAqB;MACnB,IAAIA,MAAM,IAAI,CAAC,uBAAQ,KAAKA,MAAb,EAAqBA,MAArB,CAAf,EAA6C;QAC3C,KAAKA,MAAL,GAAcA,MAAd;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,0BAAiBC,YAAjB,EAA+B;MAC7B,IAAIA,YAAY,IAAI,CAAC,uBAAQ,KAAKA,YAAb,EAA2BA,YAA3B,CAArB,EAA+D;QAC7D,KAAKA,YAAL,GAAoBA,YAApB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,wBAAeC,QAAf,EAAyB;MACvB,IAAIA,QAAQ,IAAI,CAAC,uBAAQ,KAAKA,QAAb,EAAuBA,QAAvB,CAAjB,EAAmD;QACjD,KAAKA,QAAL,GAAgBA,QAAhB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,0BAAiBC,UAAjB,EAA6B;MAC3B,IAAIA,UAAU,IAAI,CAAC,uBAAQ,KAAKA,UAAb,EAAyBA,UAAzB,CAAnB,EAAyD;QACvD,KAAKA,UAAL,GAAkBA,UAAlB;MACD;IACF;IAED;AACF;AACA;AACA;AACA;;;;WACE,2BAAkBC,UAAlB,EAA8B;MAC5B,IAAIA,UAAU,IAAI,CAAC,uBAAQ,KAAKA,UAAb,EAAyBA,UAAzB,CAAnB,EAAyD;QACvD,KAAKA,UAAL,GAAkBA,UAAlB;MACD;IACF;;;EAnjCoCyO,oB"}
1
+ {"version":3,"names":["LocusInfo","updateMeeting","webex","meetingId","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","action","locus","meeting","loci","DESYNC","USE_CURRENT","USE_INCOMING","locusInfo","onDeltaLocus","locusDesync","needToGetFullLocus","meetingRequest","getFullLocus","desync","locusUrl","then","res","onFullLocus","body","resume","LoggerProxy","logger","info","onDeltaAction","parsedLoci","applyLocusDeltaData","onDeltaEvent","created","scheduledMeeting","participantsUrl","replaces","aclUrl","baseSequence","sequence","membership","identities","participants","deltaParticipants","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","updateLocusUrl","url","updateFullState","fullState","updateMeetingInfo","updateSelf","self","updateHostInfo","host","updateMediaShares","mediaShares","data","eventType","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","handleLocusDelta","scope","eventName","args","emit","error","updateParticipantDeltas","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","workingCopy","type","_CALL_","_SIP_BRIDGE_","emitScoped","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","length","find","participant","identity","_USER_","removed","partner","getLocusPartner","state","LOCUS","STATE","INACTIVE","warn","Metrics","postEvent","event","REMOTE_ENDED","DESTROY_MEETING","reason","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_REMOVED_REASON","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","findParticipant","collection","item","person","id","generateDelta","prevState","newState","deltas","audioStatus","videoSlidesStatus","videoStatus","forEach","key","reduce","existingParticipant","delta","status","changed","push","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","ControlsUtils","parse","getControls","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","current","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","LOCUSINFO","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","result","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","roles","SelfUtils","getRoles","parsedInfo","InfoUtils","getInfos","MEETING_INFO_UPDATED","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","internal","device","element","getSipUrl","sipUri","moderatorChanged","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","muted","remoteMuted","unmuteAllowed","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","isUnadmittedGuest","SELF_UNADMITTED_GUEST","isAdmittedGuest","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","MEDIA_STATUS_CHANGE","currentMediaStatus","audio","video","shareStatus","share","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","EventsScope"],"sources":["index.js"],"sourcesContent":["import {isEqual} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE\n} from '../constants';\nimport Metrics from '../metrics';\nimport {eventType} from '../metrics/config';\nimport InfoUtils from '../locus-info/infoUtils';\nimport FullState from '../locus-info/fullState';\nimport SelfUtils from '../locus-info/selfUtils';\nimport HostUtils from '../locus-info/hostUtils';\nimport ControlsUtils from '../locus-info/controlsUtils';\nimport MediaSharesUtils from '../locus-info/mediaSharesUtils';\nimport LocusDeltaParser from '../locus-info/parser';\n\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: []\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action, locus, meeting) {\n const {DESYNC, USE_CURRENT, USE_INCOMING} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n meeting.locusDesync = false;\n meeting.needToGetFullLocus = false;\n break;\n case DESYNC:\n meeting.meetingRequest.getFullLocus({\n desync: true,\n locusUrl: meeting.locusUrl\n }).then((res) => {\n meeting.locusInfo.onFullLocus(res.body);\n // Notify parser to resume processing delta events\n // now that we have full locus from DESYNC.\n this.locusParser.resume();\n });\n break;\n default:\n LoggerProxy.logger.info(`Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`);\n }\n }\n\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus, meeting) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n /**\n * Stored participant changes between the last event and the current event.\n * All previously stored events are overwritten between events.\n *\n * @instance\n * @type {Array<DeltaParticipant>}\n * @private\n * @member LocusInfo\n */\n this.deltaParticipants = [];\n\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self, locus.participants);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus) {\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting, data) {\n const {eventType} = data;\n\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(data.locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(data.locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(data.locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope, eventName, args) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {sting} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus, eventType) {\n if (!locus) {\n LoggerProxy.logger.error('Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.');\n }\n this.updateParticipantDeltas(locus.participants);\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n handleOneOnOneEvent(eventType) {\n if (this.parsedLocus.fullState.type === _CALL_ || this.parsedLocus.fullState.type === _SIP_BRIDGE_) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent'\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent'\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus) {\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n this.updateControls(locus.controls);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self, locus.participants);\n this.updateLocusUrl(locus.url);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants, self) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return participants.find((participant) =>\n (self && participant.identity !== self.identity) &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))) || this.partner;\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if ((this.parsedLocus.fullState.type === _CALL_) || (this.parsedLocus.fullState.type === _SIP_BRIDGE_)) {\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.');\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false\n }\n );\n }\n else\n if (partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave: this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_\n }\n );\n }\n else\n if (this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false\n }\n );\n }\n }\n else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (this.fullState && (this.fullState.state === LOCUS.STATE.INACTIVE || this.fullState.state === LOCUS.STATE.TERMINATING)) {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating');\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false\n }\n );\n }\n else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n Metrics.postEvent({\n event: eventType.REMOTE_ENDED,\n meetingId: this.meetingId\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive'\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false\n }\n );\n }\n }\n else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (this.compareAndUpdateFlags.compareSelfAndHost || this.compareAndUpdateFlags.compareHostAndSelf) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if ((this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId) && this.parsedLocus.self.moderator) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost'\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true\n }\n );\n }\n else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost'\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false\n }\n );\n }\n }\n\n /**\n * Update the deltaParticipants property of this object based on a list of\n * provided participants.\n *\n * @param {Array} [participants] - The participants to update against.\n * @returns {void}\n */\n updateParticipantDeltas(participants = []) {\n // Used to find a participant within a participants collection.\n const findParticipant = (participant, collection) =>\n collection.find((item) => item.person.id === participant.person.id);\n\n // Generates an object that indicates which state properties have changed.\n const generateDelta = (prevState = {}, newState = {}) => {\n // Setup deltas.\n const deltas = {\n audioStatus: prevState.audioStatus !== newState.audioStatus,\n videoSlidesStatus: prevState.videoSlidesStatus !== newState.videoSlidesStatus,\n videoStatus: prevState.videoStatus !== newState.videoStatus\n };\n\n // Clean the object\n Object.keys(deltas).forEach(\n (key) => {\n if (deltas[key] !== true) {\n delete deltas[key];\n }\n }\n );\n\n return deltas;\n };\n\n this.deltaParticipants = participants.reduce(\n (collection, participant) => {\n const existingParticipant = findParticipant(\n participant,\n this.participants || []\n ) || {};\n\n const delta = generateDelta(existingParticipant.status, participant.status);\n\n const changed = (Object.keys(delta).length > 0);\n\n if (changed) {\n collection.push({\n person: participant.person,\n delta\n });\n }\n\n return collection;\n }, []\n );\n }\n\n /**\n *\n * @param {Object} participants new participants object\n * @param {boolen} deltaParticpantFlag delta event\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants'\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId\n }\n );\n }\n\n /**\n * @param {Object} controls\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged\n },\n current\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n }\n else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n }\n else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls'\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls'\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls'\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing, caption\n }\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl, info) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n }\n else if (info && info.conversationUrl && !isEqual(this.conversationUrl, info.conversationUrl)) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState'\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState'\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo'\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous\n }\n );\n }\n this.host = host;\n }\n else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info, self) {\n if (info && (!isEqual(this.info, info))) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo'\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {info: parsedInfo.current, self}\n );\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo'\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo'\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n }\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares) {\n if (mediaShares && !isEqual(this.mediaShares, mediaShares)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares'\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous\n }\n );\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the locus.mediaShares property\n * @param {Array} participants the locus.participants property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self, participants) {\n if (self && !isEqual(this.self, self)) {\n const parsedSelves = SelfUtils.getSelves(this.self, self, this.webex.internal.device.url);\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri);\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n }\n else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.isUnadmittedGuest) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.isAdmittedGuest) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (parsedSelves.updates.audioStateChange || parsedSelves.updates.videoStateChange || parsedSelves.updates.shareStateChange) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share\n }\n );\n }\n\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf'\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n this.self = self;\n }\n else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl'\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n}\n"],"mappings":"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"}
@@ -1940,6 +1940,22 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1940
1940
  meetingContainerUrl: meetingContainerUrl
1941
1941
  });
1942
1942
  });
1943
+ this.locusInfo.on(_constants.LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED, function (_ref7) {
1944
+ var caption = _ref7.caption,
1945
+ transcribing = _ref7.transcribing;
1946
+
1947
+ if (transcribing && _this11.transcription && _this11.config.receiveTranscription) {
1948
+ _this11.receiveTranscription();
1949
+ } else if (!transcribing && _this11.transcription) {
1950
+ _triggerProxy.default.trigger(_this11, {
1951
+ file: 'meeting/index',
1952
+ function: 'setupLocusControlsListener'
1953
+ }, _constants.EVENT_TRIGGERS.MEETING_STOPPED_RECEIVING_TRANSCRIPTION, {
1954
+ caption: caption,
1955
+ transcribing: transcribing
1956
+ });
1957
+ }
1958
+ });
1943
1959
  }
1944
1960
  /**
1945
1961
  * Set up the locus info media shares listener
@@ -3666,10 +3682,10 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
3666
3682
  joinOptions = options.joinOptions,
3667
3683
  audioVideoOptions = options.audioVideoOptions;
3668
3684
  return this.join(joinOptions).then(function (joinResponse) {
3669
- return _this30.getMediaStreams(mediaSettings, audioVideoOptions).then(function (_ref7) {
3670
- var _ref8 = (0, _slicedToArray2.default)(_ref7, 2),
3671
- localStream = _ref8[0],
3672
- localShare = _ref8[1];
3685
+ return _this30.getMediaStreams(mediaSettings, audioVideoOptions).then(function (_ref8) {
3686
+ var _ref9 = (0, _slicedToArray2.default)(_ref8, 2),
3687
+ localStream = _ref9[0],
3688
+ localShare = _ref9[1];
3673
3689
 
3674
3690
  return _this30.addMedia({
3675
3691
  mediaSettings: mediaSettings,
@@ -3785,9 +3801,9 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
3785
3801
  }, {
3786
3802
  key: "isTranscriptionSupported",
3787
3803
  value: function isTranscriptionSupported() {
3788
- var _this$policy;
3804
+ var _this$locusInfo$contr;
3789
3805
 
3790
- if ((_this$policy = this.policy) !== null && _this$policy !== void 0 && _this$policy.WEBEX_ASSISTANT_STATUS_ACTIVE) {
3806
+ if ((_this$locusInfo$contr = this.locusInfo.controls.transcribe) !== null && _this$locusInfo$contr !== void 0 && _this$locusInfo$contr.transcribing) {
3791
3807
  return true;
3792
3808
  }
3793
3809
 
@@ -4062,7 +4078,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4062
4078
 
4063
4079
  return join;
4064
4080
  }).then( /*#__PURE__*/function () {
4065
- var _ref9 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(join) {
4081
+ var _ref10 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(join) {
4066
4082
  return _regenerator.default.wrap(function _callee3$(_context3) {
4067
4083
  while (1) {
4068
4084
  switch (_context3.prev = _context3.next) {
@@ -4107,7 +4123,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4107
4123
  }));
4108
4124
 
4109
4125
  return function (_x2) {
4110
- return _ref9.apply(this, arguments);
4126
+ return _ref10.apply(this, arguments);
4111
4127
  };
4112
4128
  }()).catch(function (error) {
4113
4129
  var _error$error;
@@ -4389,10 +4405,10 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4389
4405
  sendAudio: true,
4390
4406
  sendVideo: true,
4391
4407
  sendShare: false
4392
- }).then(function (_ref10) {
4393
- var _ref11 = (0, _slicedToArray2.default)(_ref10, 2),
4394
- localStream = _ref11[0],
4395
- localShare = _ref11[1];
4408
+ }).then(function (_ref11) {
4409
+ var _ref12 = (0, _slicedToArray2.default)(_ref11, 2),
4410
+ localStream = _ref12[0],
4411
+ localShare = _ref12[1];
4396
4412
 
4397
4413
  return _this38.updateMedia({
4398
4414
  mediaSettings: {
@@ -5720,9 +5736,9 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5720
5736
  sendVideo: this.mediaProperties.mediaDirection.sendVideo,
5721
5737
  sendShare: this.mediaProperties.mediaDirection.sendShare
5722
5738
  };
5723
- return this.getMediaStreams(mediaDirection, _constants.VIDEO_RESOLUTIONS[level]).then(function (_ref12) {
5724
- var _ref13 = (0, _slicedToArray2.default)(_ref12, 1),
5725
- localStream = _ref13[0];
5739
+ return this.getMediaStreams(mediaDirection, _constants.VIDEO_RESOLUTIONS[level]).then(function (_ref13) {
5740
+ var _ref14 = (0, _slicedToArray2.default)(_ref13, 1),
5741
+ localStream = _ref14[0];
5726
5742
 
5727
5743
  return _this53.updateVideo({
5728
5744
  sendVideo: true,
@@ -5938,9 +5954,9 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5938
5954
 
5939
5955
  }, {
5940
5956
  key: "handleMediaLogging",
5941
- value: function handleMediaLogging(_ref14) {
5942
- var audioTrack = _ref14.audioTrack,
5943
- videoTrack = _ref14.videoTrack;
5957
+ value: function handleMediaLogging(_ref15) {
5958
+ var audioTrack = _ref15.audioTrack,
5959
+ videoTrack = _ref15.videoTrack;
5944
5960
 
5945
5961
  _util.default.handleVideoLogging(videoTrack);
5946
5962