{"version":3,"sources":["vendor/ember-cli/app-prefix.js","connections-ui/adapter.js","connections-ui/adapters/application.js","connections-ui/adapters/call-forwarding.js","connections-ui/adapters/callv2.js","connections-ui/adapters/coded-geolocation.js","connections-ui/adapters/conversation.js","connections-ui/adapters/division.js","connections-ui/adapters/externalcontacts/contact.js","connections-ui/adapters/externalcontacts/external-organization.js","connections-ui/adapters/geolocation-settings.js","connections-ui/adapters/geolocation.js","connections-ui/adapters/grant.js","connections-ui/adapters/group-policy.js","connections-ui/adapters/group.js","connections-ui/adapters/library.js","connections-ui/adapters/location.js","connections-ui/adapters/meeting.js","connections-ui/adapters/person.js","connections-ui/adapters/public-api-user.js","connections-ui/adapters/purecloud-user.js","connections-ui/adapters/purecloud.js","connections-ui/adapters/queue.js","connections-ui/adapters/recorded-call.js","connections-ui/adapters/recording.js","connections-ui/adapters/response.js","connections-ui/adapters/role.js","connections-ui/adapters/station.js","connections-ui/adapters/user.js","connections-ui/adapters/voicemail-message.js","connections-ui/app.js","connections-ui/application-loading/template.js","connections-ui/attach-media-stream/util.js","connections-ui/audio-visualizer/component.js","connections-ui/authenticators/directory.js","connections-ui/authenticators/test.js","connections-ui/authorizers/directory.js","connections-ui/cldrs/ar.js","connections-ui/cldrs/cs.js","connections-ui/cldrs/da.js","connections-ui/cldrs/de.js","connections-ui/cldrs/en.js","connections-ui/cldrs/es.js","connections-ui/cldrs/fi.js","connections-ui/cldrs/fr.js","connections-ui/cldrs/he.js","connections-ui/cldrs/hi.js","connections-ui/cldrs/it.js","connections-ui/cldrs/ja.js","connections-ui/cldrs/ko.js","connections-ui/cldrs/nl.js","connections-ui/cldrs/no.js","connections-ui/cldrs/pl.js","connections-ui/cldrs/pt.js","connections-ui/cldrs/ru.js","connections-ui/cldrs/sv.js","connections-ui/cldrs/th.js","connections-ui/cldrs/tr.js","connections-ui/cldrs/uk.js","connections-ui/cldrs/zh.js","connections-ui/components/accessible-checkbox/component.js","connections-ui/components/admin-ui-modal/component.js","connections-ui/components/admin-ui-modal/template.js","connections-ui/components/alert-message/component.js","connections-ui/components/analog-clock/component.js","connections-ui/components/analog-clock/template.js","connections-ui/components/anchor-tag/component.js","connections-ui/components/anchor-tag/template.js","connections-ui/components/app-img/component.js","connections-ui/components/app-img/template.js","connections-ui/components/audio-player-v2/component.js","connections-ui/components/audio-player-v2/participant/component.js","connections-ui/components/audio-player-v2/timeline/component.js","connections-ui/components/audio-player-v2/waveform-graph/component.js","connections-ui/components/audio-player/component.js","connections-ui/components/audio-player/seek-bar/component.js","connections-ui/components/audio-player/seek-bar/template.js","connections-ui/components/audio-player/template.js","connections-ui/components/audio-recorder/component.js","connections-ui/components/audio-recorder/template.js","connections-ui/components/auth-loading/component.js","connections-ui/components/auth-loading/template.js","connections-ui/components/basic-dropdown.js","connections-ui/components/basic-dropdown/content-element.js","connections-ui/components/basic-dropdown/content.js","connections-ui/components/basic-dropdown/trigger.js","connections-ui/components/card-tree/card-tree-entry/component.js","connections-ui/components/card-tree/card-tree-entry/template.js","connections-ui/components/card-tree/component.js","connections-ui/components/card-tree/template.js","connections-ui/components/card-view/component.js","connections-ui/components/card-view/template.js","connections-ui/components/characters-used/component.js","connections-ui/components/characters-used/template.js","connections-ui/components/chat-settings/component.js","connections-ui/components/chat-settings/template.js","connections-ui/components/click-outside.js","connections-ui/components/create-entity-menu/component.js","connections-ui/components/create-entity-menu/template.js","connections-ui/components/date-picker/component.js","connections-ui/components/date-picker/template.js","connections-ui/components/desktop-notification/component.js","connections-ui/components/document-title.js","connections-ui/components/drag-drop-container/component.js","connections-ui/components/drag-drop-container/template.js","connections-ui/components/drag-drop-item/component.js","connections-ui/components/drag-drop-item/template.js","connections-ui/components/drop-down/component.js","connections-ui/components/dropdown-menu/component.js","connections-ui/components/dropdown-menu/template.js","connections-ui/components/duration-format/component.js","connections-ui/components/edit-profile-picture/component.js","connections-ui/components/edit-profile-picture/template.js","connections-ui/components/ember-modal-dialog-positioned-container.js","connections-ui/components/ember-modal-dialog/-basic-dialog.js","connections-ui/components/ember-modal-dialog/-in-place-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-dialog.js","connections-ui/components/ember-modal-dialog/-liquid-tether-dialog.js","connections-ui/components/ember-modal-dialog/-tether-dialog.js","connections-ui/components/ember-tether.js","connections-ui/components/ember-wormhole.js","connections-ui/components/emergency-location/component.js","connections-ui/components/emergency-location/template.js","connections-ui/components/emoji-dom/component.js","connections-ui/components/entity-contact-group-v2/component.js","connections-ui/components/entity-contact-group-v2/template.js","connections-ui/components/entity-contact-group/component.js","connections-ui/components/entity-contact-queue/component.js","connections-ui/components/entity-contact/component.js","connections-ui/components/entity-contact/template.js","connections-ui/components/entity-favorite/component.js","connections-ui/components/entity-field-section/-section-footer/template.js","connections-ui/components/entity-field-section/-section-header/template.js","connections-ui/components/entity-field-section/add-new/component.js","connections-ui/components/entity-field-section/add-new/template.js","connections-ui/components/entity-field-section/component.js","connections-ui/components/entity-field-section/entity-contact-info/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/component.js","connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.js","connections-ui/components/entity-field-section/entity-contact-info/contact-info-group.js","connections-ui/components/entity-field-section/entity-contact-info/template.js","connections-ui/components/entity-field-section/entity-education/component.js","connections-ui/components/entity-field-section/entity-groups/component.js","connections-ui/components/entity-field-section/entity-groups/template.js","connections-ui/components/entity-field-section/entity-location/component.js","connections-ui/components/entity-field-section/entity-relationships/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-group.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/component.js","connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.js","connections-ui/components/entity-field-section/entity-relationships/relationship-search/component.js","connections-ui/components/entity-field-section/entity-relationships/template.js","connections-ui/components/entity-field-section/template.js","connections-ui/components/entity-fields/address-field/component.js","connections-ui/components/entity-fields/address-field/template.js","connections-ui/components/entity-fields/boolean-field/component.js","connections-ui/components/entity-fields/boolean-field/template.js","connections-ui/components/entity-fields/date-field/component.js","connections-ui/components/entity-fields/date-field/template.js","connections-ui/components/entity-fields/email-field/component.js","connections-ui/components/entity-fields/email-field/template.js","connections-ui/components/entity-fields/history-field/component.js","connections-ui/components/entity-fields/history-field/template.js","connections-ui/components/entity-fields/image-field/component.js","connections-ui/components/entity-fields/location-field/component.js","connections-ui/components/entity-fields/location-field/template.js","connections-ui/components/entity-fields/multiline-text-field/component.js","connections-ui/components/entity-fields/multiline-text-field/template.js","connections-ui/components/entity-fields/person-field/component.js","connections-ui/components/entity-fields/person-field/template.js","connections-ui/components/entity-fields/phone-field/component.js","connections-ui/components/entity-fields/phone-field/template.js","connections-ui/components/entity-fields/select-field/component.js","connections-ui/components/entity-fields/select-field/template.js","connections-ui/components/entity-fields/tag-field/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/component.js","connections-ui/components/entity-fields/tag-field/tag-editor/template.js","connections-ui/components/entity-fields/tag-field/tag-wrapper/component.js","connections-ui/components/entity-fields/tag-field/template.js","connections-ui/components/entity-fields/text-field/component.js","connections-ui/components/entity-fields/text-field/template.js","connections-ui/components/entity-fields/validators.js","connections-ui/components/entity-fields/validators/address.js","connections-ui/components/entity-fields/validators/boolean.js","connections-ui/components/entity-fields/validators/date.js","connections-ui/components/entity-fields/validators/email.js","connections-ui/components/entity-fields/validators/history.js","connections-ui/components/entity-fields/validators/image.js","connections-ui/components/entity-fields/validators/location.js","connections-ui/components/entity-fields/validators/multiline-text.js","connections-ui/components/entity-fields/validators/person.js","connections-ui/components/entity-fields/validators/phone.js","connections-ui/components/entity-fields/validators/select.js","connections-ui/components/entity-fields/validators/tag.js","connections-ui/components/entity-fields/validators/text.js","connections-ui/components/entity-fields/validators/weblink.js","connections-ui/components/entity-fields/weblink-field/component.js","connections-ui/components/entity-fields/weblink-field/template.js","connections-ui/components/entity-hover-card-v2/component.js","connections-ui/components/entity-hover-card-v2/template.js","connections-ui/components/entity-hover-card/component.js","connections-ui/components/entity-image-v2/component.js","connections-ui/components/entity-image-v2/template.js","connections-ui/components/entity-image/component.js","connections-ui/components/entity-location/component.js","connections-ui/components/entity-mini/component.js","connections-ui/components/entity-mini/default/component.js","connections-ui/components/entity-mini/default/template.js","connections-ui/components/entity-mini/entity-details/component.js","connections-ui/components/entity-mini/entity-details/template.js","connections-ui/components/entity-mini/external-contact/component.js","connections-ui/components/entity-mini/external-contact/template.js","connections-ui/components/entity-mini/queue/component.js","connections-ui/components/entity-mini/queue/template.js","connections-ui/components/entity-mini/template.js","connections-ui/components/entity-picture-content/component.js","connections-ui/components/entity-picture-content/delete-pictures/component.js","connections-ui/components/entity-picture-content/delete-pictures/template.js","connections-ui/components/entity-picture-content/template.js","connections-ui/components/entity-profile/add-section/component.js","connections-ui/components/entity-profile/add-section/template.js","connections-ui/components/entity-profile/component.js","connections-ui/components/entity-profile/permissions.js","connections-ui/components/entity-profile/profiles/field-data.js","connections-ui/components/entity-profile/profiles/profile.js","connections-ui/components/entity-profile/profiles/section-info.js","connections-ui/components/entity-profile/section-icon/component.js","connections-ui/components/entity-profile/section-icon/template.js","connections-ui/components/entity-profile/template.js","connections-ui/components/entity-search/component.js","connections-ui/components/entity-search/template.js","connections-ui/components/entity-status/component.js","connections-ui/components/entity-status/template.js","connections-ui/components/entity-v2/activity-indicator/component.js","connections-ui/components/entity-v2/component.js","connections-ui/components/entity-v2/contact-group/component.js","connections-ui/components/entity-v2/favorite/component.js","connections-ui/components/entity-v2/hover-card/component.js","connections-ui/components/entity-v2/image/component.js","connections-ui/components/entity-v2/location/component.js","connections-ui/components/entity-v2/presence-indicator-dot/component.js","connections-ui/components/entity-v2/presence-label/component.js","connections-ui/components/entity-v2/presence-selector-dropdown/component.js","connections-ui/components/expander-plugin/component.js","connections-ui/components/expander-plugin/template.js","connections-ui/components/field-label/component.js","connections-ui/components/field-label/template.js","connections-ui/components/fixtable-column-header.js","connections-ui/components/fixtable-column-label.js","connections-ui/components/fixtable-empty-state.js","connections-ui/components/fixtable-footer.js","connections-ui/components/fixtable-grid.js","connections-ui/components/fixtable-row-toggle.js","connections-ui/components/fixtable-row.js","connections-ui/components/flashy-webrtc-troubleshooter/component.js","connections-ui/components/floorplan-editor/component.js","connections-ui/components/floorplan-editor/template.js","connections-ui/components/floorplan-popover/component.js","connections-ui/components/floorplan-popover/template.js","connections-ui/components/font-icon/component.js","connections-ui/components/group-contact-modal/component.js","connections-ui/components/group-contact-modal/inline-number-input/component.js","connections-ui/components/group-contact-modal/inline-number-input/template.js","connections-ui/components/group-contact-modal/template.js","connections-ui/components/group-profile/component.js","connections-ui/components/group-profile/dynamic-rules/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/component.js","connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.js","connections-ui/components/group-profile/dynamic-rules/condition-display/template.js","connections-ui/components/group-profile/dynamic-rules/template.js","connections-ui/components/group-profile/group-contact-panel/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/component.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.js","connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/component.js","connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.js","connections-ui/components/group-profile/group-contact-panel/template.js","connections-ui/components/group-profile/group-list/component.js","connections-ui/components/group-profile/group-list/list-item/component.js","connections-ui/components/group-profile/group-list/list-item/template.js","connections-ui/components/group-profile/group-list/template.js","connections-ui/components/group-profile/membership-entry/component.js","connections-ui/components/group-profile/membership-entry/template.js","connections-ui/components/group-profile/membership-listing/component.js","connections-ui/components/group-profile/membership-listing/template.js","connections-ui/components/group-profile/membership-rule-entry/component.js","connections-ui/components/group-profile/membership-rule-entry/template.js","connections-ui/components/group-profile/membership-search/component.js","connections-ui/components/group-profile/membership-search/template.js","connections-ui/components/group-profile/membership-tag-search/component.js","connections-ui/components/group-profile/membership-tag-search/template.js","connections-ui/components/group-profile/roles-edit/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/component.js","connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/component.js","connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/component.js","connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/component.js","connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/component.js","connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/component.js","connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.js","connections-ui/components/group-profile/roles-edit/template.js","connections-ui/components/group-profile/template.js","connections-ui/components/grouped-facet-term/component.js","connections-ui/components/grouped-facet-term/template.js","connections-ui/components/headset-status/component.js","connections-ui/components/headset-vendor-picker/component.js","connections-ui/components/horizontal-collection.js","connections-ui/components/icon-bootstrap/component.js","connections-ui/components/icon-bootstrap/template.js","connections-ui/components/in-viewport.js","connections-ui/components/infinite-scroll/component.ts","connections-ui/components/infinite-scroll/template.js","connections-ui/components/integration-badge/component.js","connections-ui/components/integration-badge/template.js","connections-ui/components/integration-badges/component.js","connections-ui/components/integration-badges/template.js","connections-ui/components/interaction-annotation/component.js","connections-ui/components/light-gallery-modal/component.js","connections-ui/components/light-gallery-modal/template.js","connections-ui/components/link-to-external.js","connections-ui/components/loading-indicator/component.js","connections-ui/components/loading-indicator/template.js","connections-ui/components/location-display/component.js","connections-ui/components/location-display/template.js","connections-ui/components/login-oauth/component.js","connections-ui/components/login-oauth/template.js","connections-ui/components/logoff-link/component.js","connections-ui/components/media-providers/video-dropdown/component.js","connections-ui/components/media-providers/video-dropdown/template.js","connections-ui/components/mini-card/component.js","connections-ui/components/mini-card/template.js","connections-ui/components/modal-component/component.js","connections-ui/components/modal-component/template.js","connections-ui/components/modal-dialog-overlay.js","connections-ui/components/modal-dialog.js","connections-ui/components/modal-dialog/component.js","connections-ui/components/navigation-sub-menu/component.js","connections-ui/components/new-group/component.js","connections-ui/components/new-group/template.js","connections-ui/components/occludable-area.js","connections-ui/components/pc-style-icon-example.js","connections-ui/components/person-card/component.js","connections-ui/components/person-card/template.js","connections-ui/components/person-graph/component.js","connections-ui/components/person-graph/template.js","connections-ui/components/person-icon/component.js","connections-ui/components/person-icon/template.js","connections-ui/components/pikaday-input.js","connections-ui/components/pikaday-inputless.js","connections-ui/components/popover-on-component.js","connections-ui/components/popover-on-element.js","connections-ui/components/power-select-multiple.js","connections-ui/components/power-select-multiple/trigger.js","connections-ui/components/power-select.js","connections-ui/components/power-select/before-options.js","connections-ui/components/power-select/options.js","connections-ui/components/power-select/placeholder.js","connections-ui/components/power-select/power-select-group.js","connections-ui/components/power-select/search-message.js","connections-ui/components/power-select/trigger.js","connections-ui/components/pre-render.js","connections-ui/components/presence-label/component.js","connections-ui/components/presence-label/person-activity/component.js","connections-ui/components/presence-selector-dropdown/component.js","connections-ui/components/profile-dropdown-menu/component.js","connections-ui/components/progress-underlay/component.js","connections-ui/components/queue-toggle-switch/component.js","connections-ui/components/radio-input/component.js","connections-ui/components/resizable-content/component.js","connections-ui/components/resizable-content/template.js","connections-ui/components/resize-detector.js","connections-ui/components/search-facet-group/component.js","connections-ui/components/search-facet-group/template.js","connections-ui/components/search-facet-term/component.js","connections-ui/components/search-facet-term/template.js","connections-ui/components/search-page/component.js","connections-ui/components/search-page/template.js","connections-ui/components/search-result-context/component.js","connections-ui/components/search-result-context/template.js","connections-ui/components/sms-message-icon/component.js","connections-ui/components/sms-message-icon/template.js","connections-ui/components/station-disassociate-link/component.js","connections-ui/components/tags-input/label/template.js","connections-ui/components/telephone-input/component.js","connections-ui/components/tether-dialog.js","connections-ui/components/tether-popover-on-component.js","connections-ui/components/tether-popover-on-element.js","connections-ui/components/tether-tooltip-on-component.js","connections-ui/components/tether-tooltip-on-element.js","connections-ui/components/time-elapsed/component.js","connections-ui/components/time-elapsed/template.js","connections-ui/components/time-machine-confirmation/component.js","connections-ui/components/time-machine-confirmation/template.js","connections-ui/components/toggle-switch/component.js","connections-ui/components/tooltip-on-component.js","connections-ui/components/tooltip-on-element.js","connections-ui/components/upload-picture/component.js","connections-ui/components/upload-picture/helpers.js","connections-ui/components/upload-picture/template.js","connections-ui/components/uploaded-image/component.js","connections-ui/components/uploaded-image/template.js","connections-ui/components/vertical-collection.js","connections-ui/components/vertical-item.js","connections-ui/components/volume-input/component.js","connections-ui/components/webrtc-debug-modal/component.js","connections-ui/components/webrtc-issues/component.js","connections-ui/components/webrtc-settings/component.js","connections-ui/components/webrtc-troubleshooter/component.js","connections-ui/components/wrap-urls.js","connections-ui/components/wrap-urls/link.js","connections-ui/components/wrap-urls/url.js","connections-ui/components/x-option.js","connections-ui/components/x-select.js","connections-ui/config/asset-manifest.js","connections-ui/controllers/admin.js","connections-ui/controllers/application.js","connections-ui/controllers/array.js","connections-ui/controllers/card/detail.js","connections-ui/controllers/card/tree.js","connections-ui/controllers/chat-room.js","connections-ui/controllers/chat/participants.js","connections-ui/controllers/contacts.js","connections-ui/controllers/engage/embedded.js","connections-ui/controllers/feedback.js","connections-ui/controllers/maintenance.ts","connections-ui/controllers/object.js","connections-ui/controllers/permissions.js","connections-ui/controllers/person/detail.js","connections-ui/controllers/region-chooser.js","connections-ui/controllers/relate/externalcontact.js","connections-ui/controllers/relate/externalorganization.js","connections-ui/controllers/relate/index.js","connections-ui/controllers/reset-password.js","connections-ui/controllers/search.js","connections-ui/controllers/time-machine.js","connections-ui/enums/plantronics-call-events.js","connections-ui/field-config/entities/external-contact.js","connections-ui/field-config/entities/group.js","connections-ui/field-config/entities/org.js","connections-ui/field-config/entities/person.js","connections-ui/field-config/field-config.js","connections-ui/field-config/field-object.js","connections-ui/field-config/field-section.js","connections-ui/field-config/field.js","connections-ui/formats.js","connections-ui/group/store-mixin.js","connections-ui/helpers/-label-for-activity.js","connections-ui/helpers/abs.js","connections-ui/helpers/acos.js","connections-ui/helpers/acosh.js","connections-ui/helpers/add.js","connections-ui/helpers/address-format.js","connections-ui/helpers/and.js","connections-ui/helpers/app-version.js","connections-ui/helpers/array-contains.js","connections-ui/helpers/asin.js","connections-ui/helpers/asinh.js","connections-ui/helpers/atan.js","connections-ui/helpers/atan2.js","connections-ui/helpers/atanh.js","connections-ui/helpers/await.js","connections-ui/helpers/can-add-group-ring-member.js","connections-ui/helpers/can-edit.js","connections-ui/helpers/cancel-all.js","connections-ui/helpers/cbrt.js","connections-ui/helpers/ceil.js","connections-ui/helpers/chat-time.js","connections-ui/helpers/clz32.js","connections-ui/helpers/cos.js","connections-ui/helpers/cosh.js","connections-ui/helpers/css-classify.js","connections-ui/helpers/dasherize.js","connections-ui/helpers/div.js","connections-ui/helpers/ember-power-select-is-group.js","connections-ui/helpers/ember-power-select-is-selected.js","connections-ui/helpers/ember-power-select-true-string-if-present.js","connections-ui/helpers/emoji-text.js","connections-ui/helpers/empty.js","connections-ui/helpers/eq.js","connections-ui/helpers/equals.js","connections-ui/helpers/escape.js","connections-ui/helpers/exp.js","connections-ui/helpers/expand-line-breaks.js","connections-ui/helpers/expm1.js","connections-ui/helpers/facet-label.js","connections-ui/helpers/facet-term-label.js","connections-ui/helpers/first.js","connections-ui/helpers/flair.js","connections-ui/helpers/floor.js","connections-ui/helpers/format-date.js","connections-ui/helpers/format-filesize.js","connections-ui/helpers/format-html-message.js","connections-ui/helpers/format-link.js","connections-ui/helpers/format-message.js","connections-ui/helpers/format-number.js","connections-ui/helpers/format-relative.js","connections-ui/helpers/format-time.js","connections-ui/helpers/fround.js","connections-ui/helpers/full-name.js","connections-ui/helpers/gcd.js","connections-ui/helpers/get-select-options.js","connections-ui/helpers/group-ring-name.js","connections-ui/helpers/gt.js","connections-ui/helpers/gte.js","connections-ui/helpers/has-group-number.js","connections-ui/helpers/help-article-icon.js","connections-ui/helpers/html-safe.js","connections-ui/helpers/hypot.js","connections-ui/helpers/icon-for-activity.js","connections-ui/helpers/ignore-children.js","connections-ui/helpers/imul.js","connections-ui/helpers/initial-letter.js","connections-ui/helpers/intl-get.js","connections-ui/helpers/is-after.js","connections-ui/helpers/is-array.js","connections-ui/helpers/is-before.js","connections-ui/helpers/is-between.js","connections-ui/helpers/is-empty.js","connections-ui/helpers/is-equal.js","connections-ui/helpers/is-favorite.js","connections-ui/helpers/is-fulfilled.js","connections-ui/helpers/is-pending.js","connections-ui/helpers/is-rejected.js","connections-ui/helpers/is-same-or-after.js","connections-ui/helpers/is-same-or-before.js","connections-ui/helpers/is-same.js","connections-ui/helpers/is-selected-call-route.js","connections-ui/helpers/join-strings.js","connections-ui/helpers/l.js","connections-ui/helpers/lcm.js","connections-ui/helpers/localize-realtime-presence.js","connections-ui/helpers/log-e.js","connections-ui/helpers/log10.js","connections-ui/helpers/log1p.js","connections-ui/helpers/log2.js","connections-ui/helpers/lt.js","connections-ui/helpers/lte.js","connections-ui/helpers/max.js","connections-ui/helpers/meeting-date.js","connections-ui/helpers/min.js","connections-ui/helpers/mod.js","connections-ui/helpers/moment-add.js","connections-ui/helpers/moment-calendar.js","connections-ui/helpers/moment-diff.js","connections-ui/helpers/moment-duration.js","connections-ui/helpers/moment-format.js","connections-ui/helpers/moment-from-now.js","connections-ui/helpers/moment-from.js","connections-ui/helpers/moment-subtract.js","connections-ui/helpers/moment-to-date.js","connections-ui/helpers/moment-to-now.js","connections-ui/helpers/moment-to.js","connections-ui/helpers/moment-unix.js","connections-ui/helpers/moment.js","connections-ui/helpers/mult.js","connections-ui/helpers/multi-line-value.js","connections-ui/helpers/not-eq.js","connections-ui/helpers/not.js","connections-ui/helpers/now.js","connections-ui/helpers/or.js","connections-ui/helpers/perform.js","connections-ui/helpers/phone-integrations.js","connections-ui/helpers/pluralize-text.js","connections-ui/helpers/pluralize.js","connections-ui/helpers/pow.js","connections-ui/helpers/promise-all.js","connections-ui/helpers/promise-hash.js","connections-ui/helpers/promise-rejected-reason.js","connections-ui/helpers/random.js","connections-ui/helpers/render-markdown.js","connections-ui/helpers/round.js","connections-ui/helpers/route-action.js","connections-ui/helpers/short-chat-time.js","connections-ui/helpers/show-emoji.js","connections-ui/helpers/sign.js","connections-ui/helpers/sin.js","connections-ui/helpers/singularize.js","connections-ui/helpers/sort-field-data.js","connections-ui/helpers/sqrt.js","connections-ui/helpers/string-or-promise.js","connections-ui/helpers/sub.js","connections-ui/helpers/sum.js","connections-ui/helpers/t.js","connections-ui/helpers/tag-lookup.js","connections-ui/helpers/tan.js","connections-ui/helpers/tanh.js","connections-ui/helpers/task.js","connections-ui/helpers/time-duration.js","connections-ui/helpers/title-for-entity-property.js","connections-ui/helpers/trunc.js","connections-ui/helpers/unix.js","connections-ui/helpers/utc.js","connections-ui/helpers/value-for-choice.js","connections-ui/helpers/xor.js","connections-ui/hosted-context/util.js","connections-ui/index.js","connections-ui/initializers/add-modals-container.js","connections-ui/initializers/app-version.js","connections-ui/initializers/application-service.js","connections-ui/initializers/authentication-setup.js","connections-ui/initializers/authenticators.js","connections-ui/initializers/chat-service.js","connections-ui/initializers/clock.js","connections-ui/initializers/component-styles.js","connections-ui/initializers/container-debug-adapter.js","connections-ui/initializers/data-adapter.js","connections-ui/initializers/device-profiles-v2-service.js","connections-ui/initializers/ember-concurrency.js","connections-ui/initializers/ember-data-change-tracker.js","connections-ui/initializers/ember-data.js","connections-ui/initializers/ember-simple-auth.js","connections-ui/initializers/engines.js","connections-ui/initializers/export-application-global.js","connections-ui/initializers/extend-ember-computed.js","connections-ui/initializers/field-config.js","connections-ui/initializers/injectStore.js","connections-ui/initializers/main.js","connections-ui/initializers/media-providers.js","connections-ui/initializers/phone-service.js","connections-ui/initializers/preferences-service.js","connections-ui/initializers/route-styles.js","connections-ui/initializers/service-discovery.js","connections-ui/initializers/session-service.js","connections-ui/initializers/set-application-theme.js","connections-ui/initializers/setup-webrtc-components.js","connections-ui/initializers/store.js","connections-ui/initializers/transforms.js","connections-ui/initializers/webrtc-sdk-service.js","connections-ui/initializers/webrtc-service.js","connections-ui/initializers/webrtc-settings-service.js","connections-ui/instance-initializers/attach-application-controller.js","connections-ui/instance-initializers/attach-application-session.js","connections-ui/instance-initializers/backburner-debug.js","connections-ui/instance-initializers/conversation-service.js","connections-ui/instance-initializers/embedded-service.js","connections-ui/instance-initializers/ember-data.js","connections-ui/instance-initializers/ember-intl.js","connections-ui/instance-initializers/ember-simple-auth.js","connections-ui/instance-initializers/ember-tooltips.js","connections-ui/instance-initializers/entity-contact-group.js","connections-ui/instance-initializers/entity-favorite.js","connections-ui/instance-initializers/entity-hover-card.js","connections-ui/instance-initializers/entity-image.js","connections-ui/instance-initializers/entity-location.js","connections-ui/instance-initializers/inject-owner.js","connections-ui/instance-initializers/load-asset-manifest.js","connections-ui/instance-initializers/presence-label.js","connections-ui/instance-initializers/recording-service.js","connections-ui/instance-initializers/reopen-component.js","connections-ui/instance-initializers/reopen-route.js","connections-ui/instance-initializers/set-application-service-values.js","connections-ui/instance-initializers/set-application-values.js","connections-ui/instance-initializers/setup-application.js","connections-ui/instance-initializers/setup-apps-api-handlers.js","connections-ui/instance-initializers/setup-error-handling.js","connections-ui/instance-initializers/webrtc.js","connections-ui/media-providers/provider.js","connections-ui/media-providers/purecloud.js","connections-ui/media-providers/teams.js","connections-ui/media-providers/utils/auth.js","connections-ui/media-providers/zoom.js","connections-ui/mixins/acd-attachment-url-mixin.js","connections-ui/mixins/acd-utilities.js","connections-ui/mixins/acd/after-call-work.js","connections-ui/mixins/acd/participants.js","connections-ui/mixins/acd/session-share.js","connections-ui/mixins/auth-controller.js","connections-ui/mixins/authenticated-authorized-route-mixin.js","connections-ui/mixins/batch-data-requests.js","connections-ui/mixins/cache-chat-rooms.js","connections-ui/mixins/change-serializer.js","connections-ui/mixins/chat-message-media.js","connections-ui/mixins/chat-message-mixin.js","connections-ui/mixins/chat-service/chat-events.js","connections-ui/mixins/chat-service/message-notifications.js","connections-ui/mixins/chat-service/message-splitting.js","connections-ui/mixins/chat-user.js","connections-ui/mixins/click-outside.js","connections-ui/mixins/conversation-analysis.js","connections-ui/mixins/conversation-uri-builder.js","connections-ui/mixins/conversation-v2/chats-service.js","connections-ui/mixins/conversation.js","connections-ui/mixins/create-group.js","connections-ui/mixins/device-enumeration.js","connections-ui/mixins/embedded-message-event-handler.js","connections-ui/mixins/entity-controller.js","connections-ui/mixins/entity-image-defaults.js","connections-ui/mixins/entity-presence.js","connections-ui/mixins/entity.js","connections-ui/mixins/evaluations.js","connections-ui/mixins/external-contacts.js","connections-ui/mixins/faxes.js","connections-ui/mixins/field-component.js","connections-ui/mixins/flag.js","connections-ui/mixins/in-viewport.js","connections-ui/mixins/interaction/session-share.js","connections-ui/mixins/interaction/tooltips.js","connections-ui/mixins/job.js","connections-ui/mixins/logger.js","connections-ui/mixins/model-route.js","connections-ui/mixins/paging.js","connections-ui/mixins/phone-service/active-call.js","connections-ui/mixins/phone-service/call-controls.js","connections-ui/mixins/phone-service/call-forward.js","connections-ui/mixins/phone-service/conversation-manager.js","connections-ui/mixins/phone-service/events.js","connections-ui/mixins/phone-service/notifications.js","connections-ui/mixins/phone-service/station.js","connections-ui/mixins/promise-loading.js","connections-ui/mixins/purecloud-model.js","connections-ui/mixins/relate/relate-features.js","connections-ui/mixins/search.js","connections-ui/mixins/searchV2.js","connections-ui/mixins/sort-chat-users.js","connections-ui/mixins/style-namespacing-extras.js","connections-ui/mixins/unprotected-route-mixin.js","connections-ui/mixins/viewport.js","connections-ui/mixins/webrtc-action-utils.js","connections-ui/models/annotation.js","connections-ui/models/app-api-call.js","connections-ui/models/app-instance.js","connections-ui/models/app-pool.js","connections-ui/models/app.js","connections-ui/models/call-communication.js","connections-ui/models/call-forwarding.js","connections-ui/models/callback-communication.js","connections-ui/models/callv2.ts","connections-ui/models/chat-communication.js","connections-ui/models/chat-message.js","connections-ui/models/chat-room.js","connections-ui/models/chat-video-participant.js","connections-ui/models/coaching-appointment.js","connections-ui/models/coded-geolocation.js","connections-ui/models/conversation-legacy.js","connections-ui/models/conversation.js","connections-ui/models/division.js","connections-ui/models/email-communication.js","connections-ui/models/ember-intl-translation.js","connections-ui/models/evaluation.js","connections-ui/models/external-contact.js","connections-ui/models/externalcontacts/channel-record.js","connections-ui/models/externalcontacts/channel.js","connections-ui/models/externalcontacts/contact.js","connections-ui/models/externalcontacts/external-organization.js","connections-ui/models/externalcontacts/facebook-id.js","connections-ui/models/externalcontacts/line-id.js","connections-ui/models/externalcontacts/twitter-id.js","connections-ui/models/externalcontacts/whatsapp-id.js","connections-ui/models/fax.js","connections-ui/models/geolocation-settings.js","connections-ui/models/geolocation.js","connections-ui/models/github-item.js","connections-ui/models/grant.js","connections-ui/models/group-policy.js","connections-ui/models/group.js","connections-ui/models/internally-hosted-app.js","connections-ui/models/library.js","connections-ui/models/location.js","connections-ui/models/meeting.js","connections-ui/models/message-communication.js","connections-ui/models/org.js","connections-ui/models/participant.js","connections-ui/models/person.js","connections-ui/models/presence.js","connections-ui/models/public-api-user.js","connections-ui/models/queue.js","connections-ui/models/recorded-call.js","connections-ui/models/recording.js","connections-ui/models/resource-article.js","connections-ui/models/response.js","connections-ui/models/role.js","connections-ui/models/screenshare-communication.js","connections-ui/models/social-communication.js","connections-ui/models/split-message.js","connections-ui/models/station.js","connections-ui/models/unrecoverable-app-failure.ts","connections-ui/models/user.js","connections-ui/models/video-communication.js","connections-ui/models/voicemail-message.js","connections-ui/models/wfm-notification.js","connections-ui/phone/template.js","connections-ui/resolver.js","connections-ui/router.js","connections-ui/routes/admin.js","connections-ui/routes/application.js","connections-ui/routes/card/detail.js","connections-ui/routes/card/tree.js","connections-ui/routes/custom-fields-contacts-redirect.js","connections-ui/routes/custom-fields-orgs-redirect.js","connections-ui/routes/group/detail.js","connections-ui/routes/index.js","connections-ui/routes/login-oauth.js","connections-ui/routes/login.js","connections-ui/routes/maintenance.ts","connections-ui/routes/no-access.js","connections-ui/routes/performance-summary-queues.js","connections-ui/routes/person/detail.js","connections-ui/routes/search.js","connections-ui/routes/third-party/app-embed.js","connections-ui/routes/time-machine.js","connections-ui/search/adapter-mixin.js","connections-ui/search/request-builder.js","connections-ui/search/service.js","connections-ui/search/store-mixin.js","connections-ui/serializers/application.js","connections-ui/serializers/call-communication.js","connections-ui/serializers/call-forwarding.js","connections-ui/serializers/callback-communication.js","connections-ui/serializers/callv2.js","connections-ui/serializers/chat-communication.js","connections-ui/serializers/coded-geolocation.js","connections-ui/serializers/conversation-v2.js","connections-ui/serializers/conversation.js","connections-ui/serializers/division.js","connections-ui/serializers/email-communication.js","connections-ui/serializers/externalcontacts/contact.js","connections-ui/serializers/externalcontacts/external-organization.js","connections-ui/serializers/externalcontacts/facebook-id.js","connections-ui/serializers/externalcontacts/line-id.js","connections-ui/serializers/externalcontacts/twitter-id.js","connections-ui/serializers/externalcontacts/whatsapp-id.js","connections-ui/serializers/geolocation-settings.js","connections-ui/serializers/geolocation.js","connections-ui/serializers/grant.js","connections-ui/serializers/group-policy.js","connections-ui/serializers/group.js","connections-ui/serializers/library.js","connections-ui/serializers/location.js","connections-ui/serializers/meeting.js","connections-ui/serializers/message-communication.js","connections-ui/serializers/participant.js","connections-ui/serializers/person.js","connections-ui/serializers/public-api-user.js","connections-ui/serializers/purecloud-user.js","connections-ui/serializers/purecloud.js","connections-ui/serializers/queue.js","connections-ui/serializers/recorded-call.js","connections-ui/serializers/recording.js","connections-ui/serializers/response.js","connections-ui/serializers/role.js","connections-ui/serializers/screenshare-communication.js","connections-ui/serializers/skillgroup.js","connections-ui/serializers/social-communication.js","connections-ui/serializers/station.js","connections-ui/serializers/user.js","connections-ui/serializers/video-communication.js","connections-ui/serializers/voicemail-message.js","connections-ui/services/addressformat.js","connections-ui/services/ajax.js","connections-ui/services/analytics.js","connections-ui/services/application.js","connections-ui/services/apps-api-handlers/directory-nav-handler.js","connections-ui/services/apps-api-handlers/toast-handler.js","connections-ui/services/apps.js","connections-ui/services/asset-loader.js","connections-ui/services/batch-data-requests.js","connections-ui/services/chat.js","connections-ui/services/clock.js","connections-ui/services/communication.js","connections-ui/services/conversation.js","connections-ui/services/cookies.js","connections-ui/services/device-profiles-v2.js","connections-ui/services/embedded.js","connections-ui/services/emergency-location.js","connections-ui/services/events.ts","connections-ui/services/external-contacts.js","connections-ui/services/favorites.js","connections-ui/services/feature.js","connections-ui/services/file-upload.js","connections-ui/services/fullscreen.js","connections-ui/services/geolocation.js","connections-ui/services/group-assigned-roles.js","connections-ui/services/headset.js","connections-ui/services/iframe-state.js","connections-ui/services/in-viewport.js","connections-ui/services/integrations-presence.js","connections-ui/services/interaction.js","connections-ui/services/interval.js","connections-ui/services/intl.js","connections-ui/services/media-providers.js","connections-ui/services/modal-dialog.js","connections-ui/services/moment.js","connections-ui/services/names.js","connections-ui/services/notification-proxy.js","connections-ui/services/notification.js","connections-ui/services/org-settings.js","connections-ui/services/permissions.js","connections-ui/services/phone-integrations.js","connections-ui/services/phone.js","connections-ui/services/pigeon.js","connections-ui/services/preferences.js","connections-ui/services/presence-subscription.js","connections-ui/services/presence.js","connections-ui/services/purecloud-oauth.js","connections-ui/services/relate.js","connections-ui/services/resize-detector.js","connections-ui/services/screen-media.ts","connections-ui/services/scroll-activity.js","connections-ui/services/session.js","connections-ui/services/settings.js","connections-ui/services/sound.js","connections-ui/services/stash-logger.js","connections-ui/services/store.js","connections-ui/services/streaming.js","connections-ui/services/text-measurer.js","connections-ui/services/user-activity.js","connections-ui/services/user-idle.js","connections-ui/services/validations.js","connections-ui/services/vendor-implementations/jabra-chrome.js","connections-ui/services/vendor-implementations/jabra-native.js","connections-ui/services/vendor-implementations/plantronics.js","connections-ui/services/vendor-implementations/sennheiser.js","connections-ui/services/video-activity.js","connections-ui/services/video-idle.js","connections-ui/services/webrtc-sdk.ts","connections-ui/services/webrtc-settings.ts","connections-ui/services/webrtc.js","connections-ui/session-stores/application.js","connections-ui/templates/agent-ui.js","connections-ui/templates/call-forwarding-partial.js","connections-ui/templates/card/detail.js","connections-ui/templates/card/tree.js","connections-ui/templates/chat-room.js","connections-ui/templates/components/document-title.js","connections-ui/templates/components/webhooks-collapsible.js","connections-ui/templates/components/webhooks.js","connections-ui/templates/components/x-select.js","connections-ui/templates/group/detail.js","connections-ui/templates/index.js","connections-ui/templates/login-oauth.js","connections-ui/templates/maintenance.js","connections-ui/templates/no-access.js","connections-ui/templates/partials/-no-station-notification.js","connections-ui/templates/person/detail.js","connections-ui/templates/purecloud/partials/conversation-controls-menu.js","connections-ui/templates/reset-password.js","connections-ui/templates/search.js","connections-ui/templates/third-party/app-embed.js","connections-ui/templates/time-machine.js","connections-ui/transforms/iso-date.js","connections-ui/transforms/json.js","connections-ui/transforms/object.js","connections-ui/types/agent-assist.type.js","connections-ui/types/conversation.type.js","connections-ui/types/index.ts","connections-ui/types/maybe.type.js","connections-ui/types/pigeon.type.js","connections-ui/types/webrtc-settings.type.js","connections-ui/utils/acd-ts.ts","connections-ui/utils/acd-v2.ts","connections-ui/utils/acd.js","connections-ui/utils/acdParticipantStatuses.js","connections-ui/utils/analytics-keys.js","connections-ui/utils/analytics-routing.ts","connections-ui/utils/app-provider.js","connections-ui/utils/apps-v2-api-handlers.ts","connections-ui/utils/apps.ts","connections-ui/utils/async.ts","connections-ui/utils/boolean-expressions.js","connections-ui/utils/browser.js","connections-ui/utils/code-utils.js","connections-ui/utils/conversation.ts","connections-ui/utils/dates.js","connections-ui/utils/debug-backburner.js","connections-ui/utils/debug-rsvp.js","connections-ui/utils/display-geolocation.js","connections-ui/utils/email-types/draft-type.js","connections-ui/utils/email-types/email-type.js","connections-ui/utils/email.js","connections-ui/utils/ember-types.js","connections-ui/utils/emergency-location-util.js","connections-ui/utils/emoji-json-helper-expanded.js","connections-ui/utils/emoji-json-helper-v1.js","connections-ui/utils/emoji-json-helper.js","connections-ui/utils/emoji.js","connections-ui/utils/entity-fields.js","connections-ui/utils/error-white-list.js","connections-ui/utils/escape.js","connections-ui/utils/exponential-interval-generator.js","connections-ui/utils/external-contact-messaging.js","connections-ui/utils/feature-toggles.ts","connections-ui/utils/file-extensions-type.ts","connections-ui/utils/focus-management.js","connections-ui/utils/geolocation.js","connections-ui/utils/giphy.js","connections-ui/utils/gsm7.js","connections-ui/utils/hosted-context.js","connections-ui/utils/instagram/instagram-properties.js","connections-ui/utils/intl-tel-input-options.js","connections-ui/utils/intl/missing-message.js","connections-ui/utils/jid-helpers.js","connections-ui/utils/keystroke.ts","connections-ui/utils/logger.js","connections-ui/utils/markdown.js","connections-ui/utils/masonry.js","connections-ui/utils/message-channels.js","connections-ui/utils/names.ts","connections-ui/utils/net.js","connections-ui/utils/newrelic-legacy.js","connections-ui/utils/newrelic.ts","connections-ui/utils/objects.js","connections-ui/utils/phone-number.ts","connections-ui/utils/presence-label-util.ts","connections-ui/utils/presence-utils.js","connections-ui/utils/presence.js","connections-ui/utils/promise-array.js","connections-ui/utils/query-parser.js","connections-ui/utils/queued-processing-chain.js","connections-ui/utils/request.ts","connections-ui/utils/routing-status.js","connections-ui/utils/safeSet.js","connections-ui/utils/serial-processing-chain.ts","connections-ui/utils/simple-cache.ts","connections-ui/utils/sms/sms-properties.js","connections-ui/utils/sound-recorder.js","connections-ui/utils/supported-messaging-subtypes.ts","connections-ui/utils/testing.ts","connections-ui/utils/theme-loader.js","connections-ui/utils/timeout-promise.js","connections-ui/utils/transform-panels.ts","connections-ui/utils/ttl-cache.ts","connections-ui/utils/twitter/twitter-properties.js","connections-ui/utils/types.ts","connections-ui/utils/uri-builder.ts","connections-ui/utils/uuid-generator.js","connections-ui/utils/uuid.js","connections-ui/utils/video-frame-checker.js","connections-ui/utils/webmessaging/webmessaging-properties.js","connections-ui/validators/alias.js","connections-ui/validators/belongs-to.js","connections-ui/validators/collection.js","connections-ui/validators/confirmation.js","connections-ui/validators/date.js","connections-ui/validators/dependent.js","connections-ui/validators/ds-error.js","connections-ui/validators/exclusion.js","connections-ui/validators/format.js","connections-ui/validators/has-many.js","connections-ui/validators/inclusion.js","connections-ui/validators/length.js","connections-ui/validators/messages.js","connections-ui/validators/number.js","connections-ui/validators/presence.js","connections-ui/video-participant-v2/model.js","connections-ui/video-participant/model.js","connections-ui/views/card/tree.js","connections-ui/webrtc-conversation/model.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"names":["f","exports","_typeof","module","define","amd","g","window","global","self","this","adapter","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","SDPUtils","writeMediaSection","transceiver","caps","type","stream","dtlsRole","sdp","writeRtpDescription","kind","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","trackId","_initialTrackId","track","id","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","parseInt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","name","toLowerCase","forEach","clockRate","JSON","parse","stringify","numChannels","Math","min","push","rtcpFeedback","filter","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","signalingState","offer","setLocalDescription","setRemoteDescription","answer","indexOf","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","find","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","description","NotSupportedError","InvalidStateError","InvalidAccessError","TypeError","undefined","OperationError","edgeVersion","addTrackToStreamAndFireEvent","addTrack","dispatchEvent","MediaStreamTrackEvent","fireAddTrack","pc","receiver","streams","trackEvent","Event","setTimeout","_dispatchEvent","RTCPeerConnection","config","_eventTarget","document","createDocumentFragment","method","bind","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","iceServers","hasTurn","server","urls","url","console","warn","isString","validTurn","filterIceServers","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","Object","defineProperty","prototype","configurable","get","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","event","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","s","_maybeFireNegotiationNeeded","RTCRtpSender","addStream","getTracks","clonedStream","clone","idx","clonedTrack","addEventListener","enabled","removeTrack","sender","stop","map","splice","removeStream","getSenders","getReceivers","_createIceGatherer","sdpMLineIndex","shift","value","writable","bufferedCandidateEvents","bufferCandidates","end","keys","state","_gather","onlocalcandidate","removeEventListener","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","assign","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","receive","sessionpart","Promise","reject","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","resolve","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","hasRtx","MediaStream","default","RTCRtpReceiver","getCapabilities","codec","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","new","closed","checking","connected","completed","disconnected","failed","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","desc","RTCSessionDescription","createAnswer","mediaSectionsInOffer","localTrack","getAudioTracks","getVideoTracks","reducedSize","addIceCandidate","candidateString","trim","getStats","selector","MediaStreamTrack","senderOrReceiver","promises","all","then","allStats","results","Map","stats","stat","set","ortcObjectName","obj","nativeGetstats","apply","nativeStats","mapStats","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","methods","nativeMethod","args","error","2","random","toString","blob","line","parts","part","index","prefix","substring","address","relatedAddress","relatedPort","tcpType","toUpperCase","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","parseFingerprint","algorithm","fingerprints","setupType","fp","concat","iceParameters","password","mline","rtpmapline","fmtps","maxptime","extension","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","rsize","mux","spec","planB","msidParts","sessId","sessVer","sessUser","sessionId","version","user","parseMLine","fmt","slice","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","charAt","3","adapterFactory","./adapter_factory.js","4","utils","dependencies","opts","options","shimChrome","shimFirefox","shimEdge","shimSafari","key","hasOwnProperty","logging","log","browserDetails","detectBrowser","chromeShim","edgeShim","firefoxShim","safariShim","commonShim","extractVersion","disableLog","disableWarnings","browser","shimPeerConnection","browserShim","shimCreateObjectURL","shimGetUserMedia","shimMediaStream","shimSourceObject","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimMaxMessageSize","shimSendThrowTypeError","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimReplaceTrack","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","./chrome/chrome_shim","./common_shim","./edge/edge_shim","./firefox/firefox_shim","./safari/safari_shim","./utils","5","filterStats","result","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","walkStats","base","resultSet","has","endsWith","webkitMediaStream","_ontrack","enumerable","origSetRemoteDescription","_ontrackpoly","te","wrapPeerConnectionEvent","shimSenderWithDtmf","dtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","senders","origGetReceivers","receivers","srcElement","origGetStats","err","DOMException","URL","HTMLMediaElement","_srcObject","src","revokeObjectURL","createObjectURL","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","replace","RegExp","replaceExternalStreamId","oldStream","isLegacyCall","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","target","shimGetDisplayMedia","getSourceId","navigator","getDisplayMedia","constraints","sourceId","video","chromeMediaSource","chromeMediaSourceId","maxFrameRate","frameRate","mediaDevices","getUserMedia","../utils.js","./getusermedia","6","constraintsToChrome_","cc","ideal","exact","max","oldname_","oc","mix","advanced","shimConstraints_","func","audio","remap","b","face","facingMode","matches","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","devices","d","dev","some","match","label","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","onSuccess","onError","webkitGetUserMedia","getUserMediaPromise_","kinds","getSources","device","groupId","echoCancellation","height","width","origGetUserMedia","cs","7","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","nativeCreateObjectURL","nativeRevokeObjectURL","newId","deprecated","delete","dsc","srcObject","nativeSetAttribute","setAttribute","RTCSctpTransport","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","data","size","byteLength","readyState","8","shimRTCPeerConnection","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","replaceTrack","setTrack","../utils","./filtericeservers","rtcpeerconnection-shim","9","10","catch","11","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newIceServers","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","DataChannel","RTCDataChannel","preferredMediaSource","mediaSource","12","InternalError","SecurityError","The operation is insecure.","getUserMedia_","constraintsToFF37_","mozGetUserMedia","orgEnumerateDevices","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","13","_localStreams","getStreamById","_remoteStreams","_addTrack","tracks","_onaddstream","_onaddstreampoly","failureCallback","withCallback","cb","errcb","OrigPeerConnection","RTCTransceiver","origCreateOffer","audioTransceiver","getTransceivers","setDirection","addTransceiver","videoTransceiver","14","logDisabled_","deprecationWarnings_","uastring","expr","pos","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","wrappedCallback","modifiedEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","oldMethod","newMethod","userAgent","versions","people","groups","locations","users","messages","notifications","ApplicationAdapter","DS","RESTAdapter","extend","SearchAdapterMixin","logger","Ember","inject","service","session","application","defaultSerializer","namespace","shouldReloadAll","shouldBackgroundReloadRecord","normalizeErrorResponse","status","headers","payload","errors","_super","modelFor","pathForType","modelName","String","camelize","_emberInflector","pluralize","createRecord","store","record","snapshot","_createSnapshot","serializerFor","serialize","includeId","ajax","buildURL","updateRecord","serializeIntoHash","attr","urlForUpdateRecord","_directoryUrl","findRecord","FULL_PERSON","fl","traditional","findQuery","query","entityEndpoint","path","modelEndpoint","apiVersion","host","findMultiEntity","requestType","limit","_entity","facets","returnFields","_toConsumableArray","BASE_PERSON","BASE_GROUP_FIELDS","performSearch","RSVP","findFavorites","findFavoritesPublicApiV2","_this","pcV2Uri","deferred","defer","_findFavoritesPublicApiV2","res","_handleFavorites","page","pageNumber","pageSize","cache","collection","_this2","entities","nextPage","currentCount","forwardVoicemail","voicemail","recipient","voicemailMessageId","userId","_findDirectReports","count","offset","_handleReports","_this3","findDirectReports","_this4","findSuperiors","computed","reads","serializer","adapterOptions","patch","urlForFindRecord","handleResponse","requestData","useExternalContactExpand","paging","queryDefaults","currentInterval","_dates","previousInterval","subtract","typeClass","findLatestCalls","_fetchLatestCalls","_fetchHistory","guid","interval","toISOString","add","getHistoryPath","meta","_","merge","incrementPageNumber","decrementWeek","pcUri","Geolocation","findAll","total","firstUri","lastUri","selfUri","pageCount","divisionLimit","sinceToken","snapshotRecordArray","objectCount","limitUrl","$","PurecloudAdapter","LoggerMixin","RelateFeaturesMixin","relate","addressformat","permissions","cannotViewExternalContacts","not","clearCachedAdapter","originator","urlAndModel","expand","timeout","deleteRecord","returnValue","queryParams","addressFormat","searchTerm","expandField","sortOrder","subType","hasValidSearchTerm","isValidPhoneNumber","isValidNumber","containsOnlyPhoneNumberChars","test","isExactSearch","_newrelic","addPageAction","orgId","formatAddress","useLookupService","lookupVal","term","encodeURI","q","decodeURI","bypassCache","findMatchingExternalContacts","getCachedAdapter","TIME_OUT","EXPAND","dataType","saveBulk","roleId","subjectIds","divisionIds","ajaxOptions","hash","ajaxSuccess","jqXHR","_baseUrl","groupPolicy","title","details","buildQuery","baseUrl","endpoint","urlForFindMany","urlForDeleteRecord","fields","gProfile","general","memberCount","individuals","owners","groupSerializer","group","policy","generateGroupProfilePayload","jIdNumber","getJidIdNumber","contactInfo","chat","jid","getDeletedGroup","findMany","ids","snapshots","uuids","jIds","urlWithAppendedIds","urlDeletedWithAppendedIds","activeResults","getDeletedGroups","deleteUrl","groupsResults","deletedGroups","normalizeDeletedGroup","_this5","getUrl","deletedGroup","adapterFor","findGroupMembership","ceil","json","vmPolicy","organizationId","mt","membershipDraft","needsCommit","exchangeSync","links","cleanGroupLinkIds","email","Array","isArray","groupNumber","phone","labelKey","hasGroupPhone","groupAlertType","numberInfo","hasNumber","number","hasExtension","groupType","jabberId","BASE_LOCATION_FIELDS","urlForHasMany","location","floors","init","urlForFindAll","meeting","meetingId","urlForQuery","urlForCreateRecord","ajaxService","integrationsPresenceSvc","usingIntegrationSource","integrationPresenceSource","snapshotsOrOptions","guids","jids","_findMany","superiors","mapBy","directReports","baseRequestData","_store","batchEntityIds","_defineProperty","raw","contentType","retry","_ref","_ref2","flat","integrationSource","_loadActivities","findBelongsTo","link","relationship","modelClass","snapshotOrQuery","detail","contextId","objId","_asyncToGenerator","regeneratorRuntime","mark","_callee","fetchDivisions","wrap","_context","prev","next","divisionAgnostic","myQueuesOnly","fetchDivisionsForTargetQueueSearch","sent","entity","divisionId","abrupt","getDivisionLimits","_callee2","_context2","permission","divisionAware","_exports","_recording","currentPage","currentPageSize","libraryId","head","aggregatePayload","records","_getPage","sort","roleA","roleB","UserAdapter","sortQueryParams","sortBy","_genesysSparkComponents","registerElements","iframeCoordinator","registerCustomElements","_loader","defineCustomElements","APP","LOG_RUNLOOP_STACKTRACE","run","backburner","DEBUG","LOG_BINDINGS","Application","_defineModifier","App","cookies","stashLogger","applicationService","customEvents","pageChanged","itemsPerPageChanged","favoriteEvent","contactEvent","navigateToProfileEvent","modulePrefix","podModulePrefix","Resolver","engines","emberEngineCustomFields","services","externalRoutes","personDetail","admin","entityTypes","currentRouteName","debug","initVersion","initContext","isImpersonating","proxyPersonId","read","iframed","top","libraries","register","ENV","LOG_VERSION","Logger","libs","forOwn","controllerFor","instance","lookup","serviceFor","componentFor","listAsync","resolveRegistration","logTimerQueue","logPendingPromises","promiseStackFor","lookupPromiseStack","_emberLoadInitializers","stackTraceLimit","HTMLBars","template","block","moduleName","_util","_component","oauthStoreParams","oauthStoreProps","Base","purecloudOauth","authClient","restore","accessToken","clientId","parent","access_token","_establishLocalSession","pick","Client","token_type","getToken","t0","failedStep","authenticate","scope","reason","deserializeRestoreState","finalOptions","expires_in","token_expiry_time_millis","_getCurrMillis","token_expiry_time_iso_string","Date","SESSION_BOOTSTRAP_ERROR_TYPE","authUrl","_buildAuthUrl","invalidate","allSettled","_destroyLocalSession","authorizer","getOwner","deauthorizeAllDomainRequests","extractAuthData","reduce","accumulator","currPair","tokens","currToken","decodeURIComponent","buildAuthorizeUrl","stateParam","org","buildLogoutUrl","cleanCustomBrowserStorage","clear","localSessionDeferred","authorizeAllDomainRequests","authenticateWithSession","removeAuthCookie","legacyInvalidSessionToken","ensureLogsSent","_x","ajaxGet","finally","login","stateParamValue","targetOrg","baseAuthUri","oauthParams","response_type","client_id","enableRegionSwitching","redirectUri","origin","pathname","lastIndex","redirect_uri","_this6","_callee3","_context3","immediateSaveLogs","now","DirectoryAuthenticator","SEMVER_PARSER","_authData","_ajaxPrefilters","_ajaxErrors","appContextHeaderTokens","headerTokens","semver","semverParseResult","exec","_semverParseResult","_slicedToArray","pkgVersion","buildNumber","gitBranch","gitCommit","curr","replaceAll","isHosted","Callbacks","ajaxPrefilter","fire","ajaxError","authorize","authData","fnToAuthorize","_buildHeaders","_addHeadersPrefilter","empty","original","crossDomain","_isWhitelistedUrl","_isAbsPathOfProxiedEnv","excludeAuthHeader","isFaxUpload","noAuthorizationHeader","Authorization","headerValue","headerName","setRequestHeader","_isGcPublicApiUrl","REQUEST_TELEMETRY_APP_SUBSECTIONS","subsection","subsectionTokens","remoteData","includes","pubApiBase","pubApiProxyBase","currBase","envDetails","environment","local","tgtEnvDetails","netUtils","getEnvDetails","env","unknownEnv","_handleUnauthorizedRequests","settings","thrownError","skipPurecloudUnauthorizedCheck","_sendXhrErrorDetails","unauthorized","ININ-Client-Path","_handleClientUnauthorizedError","msg","_sendErrorMessage","_errors","isUnauthorizedError","xhr","correlationId","getResponseHeader","messageData","post","beforeSend","app","appId","appVersion","traces","level","time","topic","locale","pluralRuleFunction","ord","n100","year","displayName","relative","0","-1","relativeTime","future","zero","one","two","few","many","other","past","month","day","-2","hour","minute","second","v0","parentLocale","n10","i10","i100","on","Component","classNames","notification","sendClose","sendAction","toast","notificationType","markdownToHtml","shouldShowPopup","shouldPlaySound","handleMessageEvent","sameHost","sameName","startMessageListener","elementId","stopMessageListener","off","classNameBindings","attributeBindings","intl","utcOffset","staticMoment","showSecondHand","autoIncrement","_analogSupported","Modernizr","csstransforms","_displayedMoment","_invalidTime","_currTimeLabel","_pendingTick","willRender","_cancelTimers","formatStr","invalid","isNaN","isValid","format","willDestroyElement","didRender","hourElement","minuteElement","secondAngle","minuteAngle","hourAngle","hourRule","minuteRule","secondRule","style","transform","secondElement","later","rerender","timerName","currTimer","cancel","AnchorTagComponent","tagName","httpRegex","ariaLabelledBy","decorateLabel","text","htmlSafe","Handlebars","Utils","escapeExpression","anchor","encodeURIComponent","observer","_email","isValidEmailAddress","IMG_TYPE_CFG_MAP","icon","assetBasePath","closestSizeMaxMultiplierDelta","minSupplimentalRes","maxSupplimentalRes","tile","RASTER_IMG_KEY_REG_EXP","TITLE_MODES","titleMode","assert","showTooltip","equal","appName","imgType","imgWidth","imgHeight","_sortedRasterMultipliers","cfg","allRasterImgs","rasterUrl","rasterKey","rasterMatch","currRasterWidth","currRasterMultiplier","multiplier","_vectorImgUrl","svgasimg","defaultImgUrl","vectorImgUrl","allRasters","lowestDelta","currDelta","abs","imgSrcSet","srcset","supImgs","reverse","svgSpriteHref","svgPropPath","imgClasses","classesPath","guxIcon","guxIconPropsPath","guxIconProps","Howl","Howler","clock","webrtc","attrs","source","markAsRead","playing","didEnd","loading","loadingError","registerStopVoicemailHandler","sound","playFromSelectedOutput","playbackVolume","callVolume","decimalValue","selectedOutputDevice","defaultOutputDevice","outputDeviceUpdate","restartSound","stopPlaying","newOutputDeviceId","setOutputDevice","play","actions","togglePlay","outputDeviceId","volume","pause","seek","seekSound","didReceiveAttrs","registerHandler","setupSound","paths","getAttr","sources","useHtml5","html5","duration","floor","currentTime","loadingAudio","howlOptions","defaultOptions","onload","onLoad","onplay","onPlay","onpause","onPause","onend","onEnd","_checkSoundDuration","Infinity","ontimeupdate","_duration","notifyPropertyChange","newAttrs","oldAttrs","position","left","css","click","offsetX","totalSeconds","recorder","startTime","showOptions","file","uploadImmediately","playerOptions","reset","audioFileReady","startRecording","stopRecording","hasSupport","and","audioBlob","audioSource","recording","hasMediaRecorder","MediaRecorder","showUploadButton","didInsertElement","scheduleOnce","setupRecording","destroy","didUpdateAttrs","Recorder","create","ownerInjection","_basicDropdown","_contentElement","_content","_trigger","canViewChat","person","isChild","isSuperior","toggleExpand","toggleProperty","children","PromiseArray","orderedPeople","getNextPerson","manager","getFieldValue","nextPerson","hasChildren","gt","hasSuperiors","directReportsLabel","showTotalReports","direct","totalReportsLabel","totalReports","attachTextInputListeners","removeTextInputListeners","stopPropagation","presenceSubscription","canMove","flipster","currentPerson","currentPersonId","selfAndSiblings","currentPosition","reportTracker","setCurrentPerson","moveToManager","currentPersonManager","content","getPosition","tracker","setHierarchy","makeCoverFlow","moveToReports","currentPersonDirectReports","isEmpty","trackedReport","setPerson","attachNavigationListener","willClearRender","removeListeners","allPeople","isFulfilled","promises2","haveScrolled","peerCount","siblings","_getPosition","contents","unwrap","removeClass","startPosition","itemContainer","itemSelector","fadeIn","spacing","scrollwheel","keyboard","touch","nav","buttons","onItemSwitch","to","debounce","changeCurrentPerson","toElem","card","entityId","findBy","onKeyDownHandler","_this7","ns","_keystroke","eventToString","is","isNavigation","model","maxCount","charactersUsed","characterCount","activeRoom","check","activeJid","muted","any","toggleRoomMute","roomJid","areNotificationsDisabled","setRoomMuted","ClickOutsideComponent","showCreateGroup","canInvitePeople","canCreateGroups","canCreateLocations","showMenu","or","adminModalSrc","trap","launchCreateGroup","cancelCreateGroup","showAdminModal","closeAdminModal","showDropdownObserver","modalContainer","focusTrap","createFocusTrap","clickOutsideDeactivates","onPostDeactivate","activate","deactivate","removeClassFromBody","minViewMode","days","months","years","srOnly","placeholder","minDate","maxDate","inputMode","minView","isoLocale","monthYearLocaleFormat","moment","localeFormat","creationData","longDateFormat","datepickerValue","dateObject","date","initDatepicker","removeBehavior","datepicker","changes","setupDatepicker","localeData","_longDateFormat","L","language","orientation","todayHighlight","clearBtn","container","startDate","toDate","endDate","dates","fn","selectedLanguage","setData","picker","addClass","val","str","valueOf","clearValue","view","_placeholder","DocumentTitle","dragClass","dragLeave","preventDefault","dragOver","drop","ariaLabel","draggable","dragStart","dataTransfer","toggleMenu","handleKeyDown","parents","targetOutside","targetInput","listItem","prop","editing","canUploadPicture","canEditProfilePicture","canEditInformalPicture","canEditAgentImage","showingProfile","showingInformal","openCaption","currentInformal","upload","select","changeType","showInformalPhotos","showProfilePictures","showAgentPhotos","uploadImage","selectUploadedImage","image","active","deleteUploadedImage","removeAgentImage","imageId","overwrite","forceBrowserNotification","tag","section","saveSection","scrollActiveImageIntoView","activeImg","picturesContainer","scrollTop","parentNode","offsetTop","setupTabListeners","tabId","originalEvent","activeTab","offsetParent","activeElement","blur","focus","teardownTabListeners","emptyProfilesText","emptyInformalsText","profileInstructionText","informalInstructionText","agentImage","x200","x800","x1024","_positionedContainer","_basicDialog","_inPlaceDialog","_liquidDialog","_liquidTetherDialog","_tetherDialog","_emberTether","_emberWormhole","COUNTRY_OPTIONS","editingElocation","eLocation","showTitle","showResetButton","showTitleIcons","showTitleInEditMode","personId","primaryVoice","saving","countryOptions","A","street1","street2","city","zipcode","country","street1ReadOnly","street2ReadOnly","cityReadOnly","stateReadOnly","zipcodeReadOnly","countryReadOnly","isAddressEmpty","showNumberInTitle","notEmpty","updatedAddress","previewAddress","previewAddressIsEligible","previewAddressError","toolTipArrowId","toolTipHelpId","toolTipAlertInfoId","isEligibleForE911","eLocationInlineWarning","hasELocationInlineWarning","setField","field","updateElocationOnChange","countryTranslated","entry","perform","setUpdatedAddress","_emberConcurrency","task","eLocationCopy","waitForQueue","_cloneDeep","restartable","layout","canViewVideo","videoTooltipTitle","linkProfile","showFavorite","showImages","compact","phoneServiceEnabled","phoneAvailable","isOneToOneOfflineOrBusy","isChatEnabled","isWebrtcEnabled","isVideoButtonEnabled","onContact","callEntity","toggleFavorite","useMediaProviders","makeCall","_lodash2","groupExtension","phoneNumber","bubbleAction","actionContext","startChat","sendLove","launchWebrtc","showGallery","navigateTo","isPerson","isGroup","linkToProfileRoute","isSelf","hasImages","personHasImage","groupHasImage","hasPhone","_lodash","PromiseObject","fieldPath","mailto","tel","rel","e164","emailEnabled","phoneEnabled","showPhone","entityData","isFavorite","isInUsersUIAdmin","_updateFavoriteAttributes","element","favoriteButton","querySelector","favoriteComponent","EntityContact","FlagMixin","phoneService","layoutName","makingCall","queue","callPromise","PersonModel","flagInteraction","flagInteractionAction","EntityContactComponent","PromiseLoadingMixin","favorites","showChat","showEmail","shouldTether","contact","callId","shouldDisplayDropdown","showDropdown","callConnecting","flaggingSupportEnabled","isRedial","_closingViaEscape","tether","toggleDropdown","skipFocus","focusTimer","dropdown","firstFocusable","first","recordRecentContact","sendToProfile","isEntityFavoriteDecompEnabled","readOnly","callConnected","activeCall","activeCallId","componentCallIsActiveCall","phoneNumberDetails","formatAddressForDisplay","chatEnabled","favoriteEnabled","isExternal","isExternalContact","setExternalContactInfo","setupGroupPhoneNumber","setGroupNumber","enableFavoriteEvent","personIsDeleted","hideChat","phones","getContactFieldValuesByType","emails","displayDropdown","hasEmail","canDisplay","isContact","callTitle","attachListeners","detectOutsideClick","setupTether","Tether","attachment","targetAttachment","pin","removeTether","remove","isDestroyed","isDestroying","isOutsideComponent","isOutsideTetheredDropdown","closest","once","_this8","keyCode","toggleButton","items","primary","primaryItem","notifyError","show","hideAfter","actionHandlers","reportError","fieldValues","disableDropdown","toggleAddValue","addNewEntry","hide","attachClickListener","removeClickListener","EXCLUDE_TYPES","filterExcludedField","excludedFields","tabindex","ariaLabelledby","sectionKey","sectionInfo","hideHeader","editingProfile","scrollOnAddNew","excludedEditingFields","removeSection","sectionName","editingSection","alias","showModal","cancelling","hideEmptyValues","showInstructionText","disableAddValueDropdown","showRemoveSectionModal","fallbackToEmptyLabel","hideFooterRemoveButton","timer","isEditing","toggleInstructionText","editSection","updateMasonry","readableFields","getReadableFieldPathsForSection","writeableFields","getEditableFieldPathsForSection","_focusManagement","doFocus","cancelEditElocation","animate","valueReference","pop","fieldData","FieldData","pushObject","scrollToNewField","removeEntry","removeEntryFromFieldData","removeContactSection","confirmRemoveSection","cancelRemoveSection","fieldList","_isEmpty","filterBy","getFieldPath","removeObject","_groupedFieldData","_newFields","sectionData","fullPath","setupCacheValues","setProperties","instructionTextTooltipOnInsert","isViewMode","ownProfile","profile","Profile","getProfileForModel","filteredFields","isSuper","excludedFieldsFilter","_curry","readableFieldPaths","addObjects","getFieldEntries","groupedFieldData","groupedData","_groupBy","_map","instructionText","getI18nKey","fieldValuesToAdd","fieldSectionHasData","canEditSection","hideAddNew","disableSave","validFields","_reject","showEditAction","showHeaderLock","showAddNew","onEditingChange","onValidityChange","disableModal","repeatable","values","v","handleEditingChange","reconcileNewFields","reload","info","statusCode","errorTitle","errorMessage","fieldPaths","currentValue","tempValues","tempId","_id","elem","parentTop","setupInstructionText","tooltip","placement","_updateMasonry","_masonry","rerunLayouts","currentTarget","keyForField","EntityFieldSection","updatedElocationAddress","previewAddressisEligible","_groupedContactInfo","editElocation","primaryContactSection","latestPrimaryContactInfo","reconcilePrimaryContact","errorField","saveElocation","refreshAllEmergencylocationInfo","errObject","softError","hardError","hardErrorMessage","defaultErrorMessage","groupKey","entries","lastEntry","last","focusable","remainingFieldsets","removePrimaryContact","groupFieldset","remainingEntries","addButton","setPrimaryCallback","getEmergencyLocation","EmergencyLocationUtil","getErrorString","setEditingSection","groupedContactInfo","handleData","missingData","missingFields","difference","chain","groupBy","setOwner","ContactInfoGroup","primaryContactCollection","rejectBy","_storePrimary","matchCount","fieldId","setPrimaryContact","fieldDataId","equalFieldIds","equalFieldPaths","snapshotFieldId","snapshotFieldPath","valueMatches","isObject","ref","valueNumber","primaryNumber","extensionMatches","numberMatches","currentLabel","fieldChoices","keyPath","addNewLabel","emptyFields","containsRepeatable","repeatableField","isPhone","isEmail","isIm","isAddress","showHeadings","canAddNew","empties","changeGroups","toggleMore","routeType","routeId","allKeys","activeKey","showMore","flowTabsInline","fieldConfig","hasOfficialField","getFieldByKey","hasSocialField","getGroups","flatten","tabs","titleWidth","tabWidth","tab","acc","activeGroups","shouldShowMore","_cachedGroupFieldData","_cachedLocations","currentEntry","locationId","viewingMore","_relationships","fieldValue","updatedField","relationshipGroup","fieldKey","addObject","removePerson","saveReports","clearDirectReportsCache","updatedLabel","management","assistants","defaultReports","defaultSiblings","relationships","cachedGroups","RelationshipGroup","otherRelationships","findByIds","allRelationships","otherRelationshipValues","labelkey","filteredReports","filteredSiblings","sibling","canAddMultiple","showingMore","onUpdateLabel","onUpdateField","selectPerson","addPerson","removeRelationship","shouldRemove","confirm","valuesToRemove","removeObjects","_forEachRight","toggleShowing","newLabel","oldLabel","_uniqBy","canEdit","canRemove","isManagerField","updatePeople","cachedPeople","relationshipKeyTrimAll","hasMore","haveManager","hideSection","reportsToSave","_lastPromise","lookupKey","isManagerRelationship","isReportRelationship","isAssistantsRelationship","isOtherRelationship","addManager","currentManager","removeManager","newManager","showLabelChoices","updateLabel","focusInput","selectLabel","toggleChoices","trigger","hideChoices","handleKeyDownOnDropdownArrow","handleKeyDownOnLabel","hasLabelChoices","canShowLabelChoices","labelChoices","i18nKey","labelKeys","setLabelKey","handleTooltip","input","focusOut","EntitySearch","searchLimit","selectResult","resultsLoaded","selectNext","nowSelected","nextSelected","eq","scrolling","selectPrevious","previousSelected","FieldComponentMixin","ensurePopulatedField","isFieldEmpty","setValues","complexField","complexValueFields","selectDate","getDate","getMonth","getFullYear","timers","populateFieldOnRender","isComplexFieldEmpty","copy","formattedValue","i18n","previousMonth","nextMonth","_months","weekdays","_weekdays","weekdaysShort","_weekdaysShort","dateFormat","currentTooltip","isActive","headingLevel","hasError","setPrimary","isPrimary","entryId","valid","canSetPrimary","saveHistoryEntry","cancelHistoryEntry","cancelAddNew","focusNewField","added","$input","ensureDateObjectsExist","where","calculateValidityOnInsert","validityChanged","resetData","cleanFieldForSave","useEducationLabels","isNewField","what","notes","whereLabel","datesLabel","whatLabel","notesLabel","whereErrorChanged","dateErrorChanged","TextField","parentLocation","floorLocation","googleMapsHref","showFloorplan","filterLocationsHelper","focusFieldOnInsert","selectParentLocation","selectFloorLocation","saveNewLocation","cancelNewLocation","selectLocation","coordinates","x","y","removeNewParentLocation","noop","toggleFloorplan","hideFloorplan","save","resp","responseText","parentLocationName","selectedFloor","haveParent","haveFloor","locationData","emptyPromise","locationAddress","isRichAddress","parentLocations","getRecord","canShowEdit","locationChoices","choiceText","selectedParentLocation","editText","attachmentId","setGoogleMapsLinkInfo","street","parentLocationUpdated","toggleFlash","locationIds","peekRecord","showFloorPlan","selectPersonFromPicker","requireFields","setPrimarySMS","toggleSMS","updateNumber","updateExtension","_setupData","addBehavior","setupTooltips","_setupInput","dialableNumber","isPrimarySMS","checkPrimaryForType","dialCode","initialCountry","intlTelInput","errorMsg","iso2LocaleCountry","iso2","errorCode","intlTelInputUtils","validationError","INVALID_COUNTRY_CODE","TOO_SHORT","TOO_LONG","NOT_A_NUMBER","isRequiredPhone","isRequiredError","isNumberError","errorClass","_setFieldDataValidity","hasErrorCode","hasClass","countryData","toLocaleUpperCase","emptyData","acceptsSMS","_intlTelInputOptions","setupIntlTelInputAccessibility","orgCountryCode","countryCode","normalized","buildIntlTelInputOptions","retries","choice","setValue","defaultValue","_find","allowedValues","translatedAllowedValue","translatedValue","valueKey","addTag","tags","removeTag","showDuplicateError","navigateToSearchTag","linkable","sortedTags","recordChange","search","tagValue","currentRequest","initTagInput","$typeahead","typeahead","highlight","hint","async","displayKey","syncResults","asyncResults","addTagFromTypeahead","clearInput","request","types","suggestions","suggestion","keyDown","abort","flash","flashTag","requiredFieldPaths","embedded","onProfile","isGeneralField","saveField","notifyUserGeneralFieldUpdated","showPlaceholder","textValidator","watchValidityToDisableModal","disable","placeholderText","setMinWidth","span","append","ensurePopulatedWhenEditing","setWidth","getFieldError","maxLength","history","boolean","weblink","multiline-text","multiline","cleanFieldForEntity","isGroupField","haveStartDate","haveEndDate","isMoment","isEmptyValue","isRequired","numberMaxLength","extensionMaxLength","isValidUrl","baseKey","_s","customLabel","validator","placeholderImages","isInitialized","isNameLatin","feature","hoverParent","applicationUrlPrefix","isPlaceholderImage","useInitialsPlaceholder","enableMiniCard","microCard","showMiniCard","showQueueToggle","showPresenceDropdown","showLogOffButton","isGeolocationEnabled","imageLoadError","isHoveringCard","isHoveringImage","hoverTimer","isFirstHover","haveMediaProviders","mediaProviderComponent","useIntegrationBadges","integrationBadgesComponent","tetherConstraints","hovercardOffset","triggerShowMiniCard","_displayHoverCard","mouseEnterCard","onHoverChanged","mouseLeaveCard","_attachListeners","_removeListeners","isHovering","isOnline","chatPresence","chatPresenceClass","tetherSelector","tetherElementId","uniqueId","entityType","cardImageUrl","getProfilePicture","nameInitials","commaIndex","spaceIndex","leftInitial","rightInitial","initialsPlaceholderSupported","isPlaceholderImageAndUseInitials","showPresenceAndChatEnabled","entityIsGroup","entityDeleted","isSelfEntity","placeholderImage","baseUri","profilePicture","deviceSize","sizeForDevice","exactMatch","sizes","ratio","devicePixelRatio","mouseEnter","mouseLeave","_createPopper","el","targetEl","cardEl","_popper","Popper","modifiers","flip","behavior","arrow","preventOverflow","padding","_destroyPopper","Image","scheduleUpdate","clickedHoverCard","checkHoverState","isLinkable","subscribeToPresence","showStatusQuote","showPresence","_managePresenceSubscription","$img","_removePresenceSubscription","managePresenceSubscription","displayStatusQuote","imageUrl","_animationRun","_currentPresence","isStatusAnimating","animateOnPresenceChange","nextPresence","prevPresence","entityIsContact","modifyPlaceholderImage","autoSubscribe","showDepartment","showActions","clickToProfile","isSearchResult","geolocation","phoneTooltip","entityTypeClass","dasherize","entityIsPerson","entityIsQueue","entityIsMe","canContactEntity","isPresenceLabelToggleEnabled","useInitials","showOrganization","entityRoutePath","isClickable","_subscribePresence","subscribe","conversationSummary","socialExpression","totalMessages","contactCenter","enterprise","_presenceLabelUtil","activityCounter","totalSocialExpression","region","selfLocation","entityLocationData","presenceLabelData","showStatus","showActivity","eActivityPresenceClass","totalCalls","totalChats","totalEmails","presenceLabel","eChatStatus","isShowingActivitySummary","ViewportMixin","requiredPermission","hasRequiredPermission","perms","agentHasOnQueue","agentHasRequiredPermission","isTesting","_subscribeToPresence","didEnterViewport","didExitViewport","_unsubscribeFromPresence","externalContact","showPhones","showEmails","showAcceptsSMS","acdOutboundWhatsApp","_getEmailTypes","modelKey","_getPhoneTypes","dropdownTitle","externalContactHasNoEmailAddresses","phoneType","canUseNonE164","phoneTypeTranslated","phoneTypeId","typeName","externalContactHasNoPhoneNumbers","emailType","hasMultipleEmails","hasMultiplePhoneRecords","selectEntityWithEmail","selectEntityWithPhone","onPreventClick","queueService","isDetailsLoaded","isDetailsLoading","canViewQueueDetails","getQueueData","waitTimePromise","getQueueEstimatedWaitTime","callWaiting","callbackWaiting","chatWaiting","emailWaiting","messageWaiting","joinedData","joinedPromise","waitTimeResults","getMetricCount","array","metricName","metricData","metric","getOnQueueCounts","routingStatus","partial","datum","qualifier","property","sum","joined","queueId","mediaType","callData","callbackData","chatData","emailData","onQueueCount","idleCount","waitStr","queueData","agentData","callCount","callbackCount","chatCount","emailCount","messageCount","bestWaitTime","bestTime","formula","estimatedWaitTimeSeconds","getWaitTime","wait","hr","hours","minutes","sec","seconds","waitTime","imageMappings","informal","activeProfilePictureSection","open","askToDelete","showUploadModal","uploadPicture","confirmUpload","pictures","picture","entityJid","edit","setProfilePicture","notifyUpdateProfileImage","firstObject","updatedSection","images","newImage","profilePictureSection","cancelUploadModal","cancelDeleteModal","doneDeleting","_showing","showing","isPersonOwner","hasAccessToPicture","canEditProfiles","done","selectImage","current","selected","currentSelection","deleteImages","imageType","uploads","currentSelected","imagesToSave","addingSection","emptySections","addSection","toggleAddingSection","_this$attrs","attachHandler","EntityControllerMixin","ProfilePermissionsMixin","mediaProviders","resizeDetector","emergencyLocation","emergencyLocationOn","editEmergencyLocation","lastEntity","showCardView","compactLayout","excludedContactFields","iconHoverText","scrollToBottom","scrollHeight","toggleEditProfile","editProfilePicture","editContactInfo","setContactInfo","$section","focusTarget","toggleCardView","componentUpdated","resize","handleResize","notify","allSections","canEditStatus","isPurecloudSource","_presenceUtils","department","fieldSections","emptyWriteableSections","sectionKeys","isEditingSection","videoProviders","getVideoProviders","haveVideoMediaProviders","_mediaProviders","hasSupplementalVideoProvider","profileChanged","editingSectionChange","handleProfileChange","lastId","handleEditingSectionChange","masonryEl","_useMasonry","enableMasonry","_masonryId","_isInDOM","fieldSectionsUpdate","attachMasonry","masonry","columnWidth","fitWidth","registerLayout","rerun","throttle","detachMasonry","deregisterLayout","startMasonry","stopMasonry","Mixin","canEditProfile","canEditName","canEditTitle","canEditDepartment","canReadHR","onOwnProfile","gallery","canReadGroups","groupsFieldConfig","getSectionByKey","canEditGeneralInfo","canEditContactInfo","canViewLocations","locationsField","canViewInformals","photos","PERMISSIONED_FIELD_PATHS","POSSIBLE_INTEGRATION_FIELDS","findIndex","generateGuid","_sectionLocation","fieldPathClass","writeable","BUILTIN_SECTIONS","myOwnProfile","customKeys","_profile","customSectionKeys","removeable","removable","integrationManaged","integration","Validators","isPrimaryField","primaryFieldId","isNewValue","PROFILE_CACHE","EXCLUDED_SECTIONS","ADMIN_SECTIONS","builtins","_cache","readWritePermissions","writeableSections","readableSections","canReadProfiles","write","profileSections","SectionInfo","canEditProfilePictures","canReadSection","reopenClass","owner","customSections","adding","componentName","hasCustomComponent","emptyValues","ThenableSearchMixin","filterFunction","searchQuery","userInput","debouncedScheduleQueryUpdate","disabled","ensurePluralType","_scheduleSearchQueryUpdate","maxWait","cancelInput","chooseSelected","setUserInput","_updateSearchQuery","submit","clearSearch","entityFilter","_buildResults","wrappedSearchResults","searchResults","haveResults","noResultsKey","plural","areaScroll","entityHeight","clearInputs","chosen","each","isEnter","presence","editable","savedStatus","isLoading","debounceTime","isInvalid","changeStatus","updateStatus","changeStatusEventually","setUsersStatus","showUpdateError","ExpanderPluginComponent","expandText","collapseText","$el","expander","userCollapseText","afterExpand","afterCollapse","fallbackToEmpty","showHistoryYearRange","choices","choicesHidden","customLabelText","labelFor","toggleChoicesView","selectChoice","setupCustomLabelText","hasCustomLabelKey","labelForHistoryField","customLabels","customLabelTextChanged","clickId","pickerParent","containerParent","attachTooltip","html","keyPress","classList","contains","choiceId","hasStartDate","hasEndDate","_locale","monthYearFmt","startDateFmt","endDateFmt","mStartDate","mEndDate","endOf","diff","humanize","formattedStartDate","formattedEndDate","_fixtableColumnHeader","_fixtableColumnLabel","_fixtableEmptyState","_fixtableFooter","FixtableGrid","_fixtableRowToggle","_fixtableRow","saveLocation","coordinatesRatio","selectFloorplan","setCurrentFloor","floorplans","currentLocation","saveFloorplan","closeFloorplan","loadInitialPinLocation","img","coords","getRatioCoordinates","attachPinForXY","floorplanImageUrl","resolution","imageUri","locationFloors","parentFloors","loadFloors","updateCoordinatesRatio","updateCoordinatesOnLocation","clientX","pageXOffset","offsetY","clientY","pageYOffset","operation","naturalHeight","naturalWidth","heightDiff","widthDiff","currentPin","floorSorter","sorted","hidePopover","popoverEl","attachClickHandler","removeHandlers","AUDIO_FORMAT","BrowserUtils","getSuggestedAudioTypeFrom","GroupContactModalComponent","fileUpload","saveContactInfo","originalExtension","voicemailFile","showVoicemailOptions","resetGreeting","rotateCallSecondsError","numberOfRotationsError","saveForm","updateRotateCalls","updateRotations","toggleVoicemail","toggleEmailNotification","toggleOptions","selectVoicemailFile","triggerUpload","chooseFile","fileReader","FileReader","onloadend","arr","Uint8Array","isOpus","isWav","isAiff","readAsArrayBuffer","isOggFileType","recordingReady","resetRecording","resetFile","resetCurrentGreeting","audioPlayerError","setupInput","initNumber","numberOfRotations","rotateCallSeconds","_voicemailOn","voicemailOn","emailNotificationOn","haveExtensionError","isExtensionResourceInUse","isExtensionNotInPool","editingVoicemailDisabled","ringTimeMs","rotations","_this$getProperties","getProperties","ext","invalidExtension","invalidPhoneNumber","haveNumberAndExtension","callNotice","showGroupEmail","greetingOptions","hasGreeting","greeting","greetingAudioSource","audioFile","formatId","mediaFileUri","showEmailNotification","setConfirmDisabled","fieldName","inputElem","extElem","updateSelectedCountryAriaLabel","uploadGreeting","uploadPath","uploadGreetingWithPreSigned","FormData","XMLHttpRequest","onreadystatechange","DONE","uploadComplete","_this$getProperties2","setNumberData","showExtensionErrorNotification","haveError","rotateCallsSecs","stopRingingAfterRotations","sendEmailNotifications","handler","update","disableInput","GroupProfileComponent","showContactInfo","saves","groupRoom","showMembers","showLinkDropdown","displayIndices","hasLinks","hasInformals","displayWarningModal","shouldFocusToggle","excludedFieldSections","excludedMembershipFields","toggleLoading","generalExcludedEditingFields","selectTab","toggleCallsEnabled","saveCallsEnabledState","toggleEditing","changeEditingMode","editGeneralInfo","cancelEditContactInfo","editPrivacyRules","toggleLinks","goToLink","href","confirmGeneral","closeAllModals","job","handleJob","cancelGeneral","metadataFor","deleteGroup","cancelDelete","confirmDelete","back","groupData","setHasLinks","confirmWarningModal","closeWarningModal","toggleGroupProfileEditPopover","getGrants","setupToggleAccessibility","setupKeyboardHandlers","teardownKeyboardHandlers","_handleEscapeKey","editButton","callsEnabledObserver","voicemailStateObserver","schedule","toggleInput","innerLabel","labelText","srText","prepend","labelId","toggleSelector","innerLabelSelector","mapping","toggle","setupConditionalToggleAccessibility","focusToggleAfterSwitch","callsEnabled","isShowingDeleteModal","isShowingPrivacyModal","isShowingGeneralModal","ensureCorrectLinksState","membersTabSelected","settingsTabSelected","generalFieldConfigSection","fieldSection","FieldSection","privacyFieldConfigSection","linksFieldSection","hasRules","phoneRef","groupVisibility","membershipVisible","includeOwners","groupTypeIcon","groupOwners","membershipHeader","groupRolesHeader","canEditLeftRailInfo","canEditInformation","namedPermissions","isOwner","canEditGroups","canEditGroupTelephonySettings","disableToggleCalls","canEditRoles","hasRolesView","hasPermissionAndDivision","hasGrantsEdit","hasPermission","canDeleteGroup","updateLinksChange","setHasInformals","informals","checkMembers","exclusions","inclusions","canEditMembership","disableAction","unloadRecord","_this9","setInterval","getJobData","_this10","jobId","retryJobId","clearInterval","commitRevertHandler","adapterDidCommit","showSaveModal","showCancelModal","previewValue","expressionDisplay","conditions","display","con","lastCondition","opAnd","saveDisabled","maximumExpressions","skills","numberPreview","addCondition","exp","condition","rules","skill","comparator","proficiency","lastRule","removeCondition","removeAt","conditionOperation","op","saveData","prepareExpression","success","skillConditions","put","previewUrl","preview","userCount","openCancelModal","closeCancelModal","parseExpression","closeSaveModal","output","routingSkillConditions","languageSkillConditions","rule","skillPropName","ruleType","newObj","childConditions","comparators","class","compPlace","updateConditionDisplay","addRule","removeRule","ruleOperation","skillChanged","_step","orWrap","_iterator","_createForOfIteratorHelper","skillResults","languageResults","showSearchResults","searchvalue","placeHolder","skillSelected","searchInputUpdated","updateSearchOnChange","attachOutsideHandler","removeOutsideHandler","runSearch","languageSearch","skillSearch","skl","langs","lang","LIST_TYPES","OWNERS","MEMBERS","slideInList","personSearch","orgVoicemailPolicy","listType","routeSelection","ringRotations","isSequential","isRotary","reasons","isMissing","loadOrgVoicemailPolicy","scheduleRemoveAnimation","appendSave","removeSave","rollbackAttributes","changeListType","toastTitle","toastMessage","voicemailGroupId","_state","greetingData","ringSequenceData","saveModelData","savePolicy","saveGreeting","callback","greetings","VOICEMAIL","recordingFile","orgIndividuals","addedDelta","removedDelta","addIndividuals","deleteIndividuals","individualsOperation","memberIds","_emberAjax","pigeon","originalNumber","showVoicemailGreetingOptions","pigeonEventHandler","disableReplaceOverflowBtn","disableRingInputs","forwardingOn","overflowGroup","duplicateNumberError","inputErrorClass","routeTypes","translation","routeSelectionType","routeDescription","selectedRouteType","rotateCallsDisplayText","stopRingingDisplayText","searchText","displaySpinner","enablesHipaa","disablesEmailNotifications","disablesPiiInEmailNotifications","disablesVMTranscription","disablesVoicemails","voicemails","transcriptionToggle","transcriptionDropDown","_getLanguagePreference","transcriptionLanguages","languagesObj","emailNotifications","piiInEmailNotifications","saveFunction","handlePigeonEvent","registerToPigeonTopic","_setupInputs","_setupToggleAriaLabels","previousEntity","rotationsChanged","toggleCallForwarding","selectOverflowGroup","replaceOverflowGroup","toggleVoicemails","toggleEmailNotifications","togglePiiInEmailNotifications","toggleTranscriptions","selectTranscriptionLanguage","badNumber","badExtension","editingObserver","groupTopic","registerPriorityTopic","overflowGroupId","finishedSaving","succeeded","setAriaLabel","contactInfoGroup","BatchDataRequestMixin","searchInput","sequenceContainer","resultsContainer","resizeListener","listDirty","_editing","isOwners","cachedEditing","sequenceList","individualsSequenceList","_sequenceListForPeople","ownersSequenceList","renderedList","_appendRotationListData","searchLabel","searchPlaceholder","addMemberPlaceholder","inputEntered","togglePersonSearch","handleListeners","listModified","_handleResizeEvent","listLength","listModel","beginningOutOfRange","outOfRange","endOutOfRange","popupDismissed","batchPromises","getUser","personArray","fuseOptions","shouldSort","threshold","distance","maxPatternLength","minMatchCharLength","getFn","groupList","selectedIndex","queryAvailable","Fuse","removeItem","_recalculateIndices","notifyParentOfListChange","changePosition","from","_changePosition","isInteger","groupArray","insertAt","input_value","hovercardArrowOffset","scrollIntoView","outOfRotationRange","displayRotationRangePopup","newIndex","popupTarget","indexChanged","changeIndex","dismissPopup","setIndexChanged","submitIndexChange","membership","deletePerson","handleDeleteKeyDown","isLoggedInUser","sessionPerson","cannotDeleteMember","isOwnerAndSelf","multipleOwners","canViewRules","visible","hasPermissions","memberType","isPersonIndividual","memberTypeList","isRule","isAddedIndividual","isCurrentMember","PagingMixin","JobMixin","searchService","filterChoices","string","inclusionFilter","exclusionFilter","showRules","loadedAll","ignoreScroll","rateLimited","currentlySearching","currentMembershipRequest","membershipQuery","memberListLimitSize","retryTimeout","retyTimeOutDuration","toggleRules","updateContentOnChange","selectFilter","updateSearch","searchCriteriaChanged","editMembership","selectKeyword","keyword","addKeyword","addedIndividuals","removedIndividuals","setRulesOnGroup","addJob","handleJobFinish","saveIndividuals","initMembership","loadMembershipList","loadMoreMembersOnInit","inclusionQueries","addedInclusions","exclusionQueries","addedExclusions","membershipRules","isEditingRules","expression","displayEditingFooter","rolesEnabled","isSearching","shouldShowRules","showingFilterChoices","editingFilterChoices","membershipCount","extraParams","generalQuery","queryGroup","cancelEditOnGroupChange","debouncedSearchCriteriaChanged","reloadPageOnGroupChange","loadMore","_args2","reloadPageOnGroupReload","_individualsOperation","Content-Type","loadOwners","loadPathFieldMembers","loadIndividuals","_callee4","_context4","displayClassification","isIndividual","addedRules","rels","personQuery","latestAdded","singularize","currentFilter","keypath","ruleData","loadContentOnScroll","_callee5","listing","scroll","filterKey","_context5","loadSearchMembers","newMembership","_meta","isLastPage","_this11","searchMembership","peopleIds","pushObjects","incrementProperty","_this12","member","filteredResults","isError","allMemberships","uniqBy","setObjects","_this13","updateOffset","aName","bName","loadRules","_callee6","isPending","_context6","loadAll","_callee7","_context7","builder","requestBuilder","addQuery","setPaging","performCustomSearch","listingEl","containerHeight","groupedRelationships","toggleRelationship","_$last","deleteRule","isKeyword","relationshipGroups","relationshipSelected","oid","graph","buildGraphFromRelationships","ancestors","descendants","SearchMixin","searchValue","mode","resetPersonSearch","querySelectorAll","totalItems","nextIndex","updateTabIndex","prevIndex","objectAt","isRules","iconClass","dismissed","currentIds","removeDuplicates","currentSearchRequestUpdated","resultsChanged","firstItem","previousFilter","performPersonSearch","focusIndex","resetSearch","editingStateChanged","addAggregations","aggregates","aggregate","SEARCH_FACET_KEYPATHS","groupAssignedRoles","isEditingRoles","displayRoleRemoveModal","rolesToDelete","displayRulesRolesWarningModel","unsavedGrants","roles","_hasUnsavedGrants","hasUnsavedGrants","grantId","grantModel","recalculateHasUnsavedGrants","addAllFutureDivisions","_ref3","removeAllFutureDivisions","grantMaps","grantMap","groupRolesViewColumns","nameColumn","header","cellClass","typeColumn","descriptionColumn","divisionsViewColumn","hideLabel","groupRolesEditColumns","divisionsEditColumn","assignmentColumn","editRoles","toggleRolesEnabled","_toggleRolesEnabled","_enableRoles","closeRulesRolesWarningModal","getGroupRoles","_getGroupRoles","deleteRoles","_deleteRoles","openConfirmModelSingleRole","grantRole","grantRoles","openConfirmModelMultipleRole","divisionRoles","divisionRole","rolesToUpdate","grantsToDelete","_ref4","undeletedGrant","destroyRecord","_stopEditingRoles","_isTooManyGrantsError","searchAssignedRoles","assignedRoles","filteredRoles","roleDivision","searchAllRoles","allRoles","updateUnsavedGrants","selectedDivisions","previouslySelectedDivisions","_updateUnsavedGrants","confirmHasRolesWarningModal","_disableRoles","closeHasRolesWarningModal","toggleRoleAssignment","isAssigned","addRole","removeRole","trySet","division","stillSelectedDivision","divisions","_removeRole","getRoleWithDivisions","grantRecord","previousVersion","attempt","grants","assignedRolesMap","unloadAll","grant","subjectId","normalize","setMap","turnOnRoles","_toggleRolesOn","_toggleRolesOff","hadRules","_setupAccessibility","_setupKeyboardNavigation","_removeKeyboardNavigation","contentDidChange","_setupFixtableAccessibility","allCheckboxes","checkbox","$checkbox","$headerRow","$toggleSwitch","$row","$roleNameCell","roleName","_setupButtonAccessibility","_setupTableHeaders","$removeButtons","button","$button","$otherButtons","buttonText","buttonTitle","$table","isEditMode","tableLabel","$allHeaderCells","th","$th","headerIds","headerId","rowIndex","row","$cells","cellIndex","cell","$cell","$filterInputs","$headerCell","headerText","$fixtable","selectionIsEmpty","selectedDataRows","isFirstPage","listedPages","totalPages","neighbors","pagesToFirst","pagesToLast","shortageL","shortageR","lowerIndex","upperIndex","pages","isCurrent","firstPageListed","secondPageListed","penultimatePageListed","finalPageListed","showPaginationControls","showRangeLabel","bulkAction","showPage","showNextPage","showPreviousPage","containsRole","rowHasToggled","wasAssigned","homeDivision","peekAll","_updateDivisions","previouslySelected","allFutureDivisionsSelected","updateDivisions","previousSelection","allFutureDivision","_loadDivisions","_setSelectedDivisions","roleDivisions","allDivisions","selectedDivision","rolesEditComponent","allDivisionsSelected","optionsWithoutSpecial","allFutureDivisions","_allFutureDivisionsObserver","powerSelectAPI","_selectAll","selectAll","deselectAll","removeObserver","addObserver","divisionsDisplayList","displayString","_setupKeyboardHandler","_removeKeyboardHandler","dash","firstItemIndex","lastItemIndex","isSingleItem","disabledMessage","_isInitialized","queryChanged","triggerSearch","positionSubclass","removeSelectedTerm","terms","removeSingleTerm","facet","isSingleTerm","facetName","_horizontalCollection","bootstrapIcons","_inViewport","hideScrollbars","scrollBottomThreshold","onscroll","onScroll","scrollBottom","clientHeight","scrollThreshold","checkInfiniteScroll","infiniteScroll","isSmall","useLightIcon","iconUri","phoneIntegrations","LightGalleryModal","escaped","initGallery","caption","lightGallery","loop","speed","closable","escKey","allPhotos","_linkToExternalComponent","isAuthenticated","offerMobileApp","onMobileOfferDecline","mobileOfferDeclined","room","attachTo","_displayDropdown","selectProvider","provider","providerId","launchVideoProviderWithPersonById","_targetEl","setup","arrowElement","handleClick","handleOutsideClick","isAttachTarget","componentParents","attachTargetParents","showingVideo","showingPurecloudVideo","showingMediaProvider","providers","chatRoom","isGroupRoom","MiniCardComponent","managerCount","isManager","managerCountText","translucentOverlay","containerClassNames","overlayClassNames","confirmText","cancelText","showHeader","showFooter","wrapContent","enforceModality","extraClassNames","confirmDisabled","noCancel","sendConfirm","ret","sendCancel","backdropDismiss","setText","confirmAction","cancelAction","attachClassToBody","modalContainerElement","escapeDeactivates","allowOutsideClick","_modalDialogOverlay","_modalDialog","ModalDialog","_initEscListener","CreateGroupMixin","setHandlers","setAttr","createGroup","checkNameLength","isTooLong","_occludableArea","_pcStyleIconExample","WebrtcActionUtilsMixin","EntityImageDefaults","needsServices","checkUnusedFields","entityContactGroupData","linkToProfile","emailAddress","telephoneNumber","initialFieldsCheck","moveToPerson","setEntityContactGroupData","router","profileId","transitionTo","openChat","openVideo","PersonGraphComponent","paper","mini","trueColor","trueStrokeColor","falseColor","falseStrokeColor","disabledColor","disabledStrokeColor","disabledSegments","baseAttrForPath","segmentChanged","segName","segment","attrForSegment","disabledSegmentsChanged","segs","setupGraph","drawGraphics","destroyGraphics","triggerAction","isDisabled","Raphael","drawSegment","renderfix","safari","xform","pathForSegment","stroke-width","node","fill","stroke","cursor","ancestorsPath","parentPath","selfPath","siblingsPath","childrenPath","descendantsPath","ancestorsSmallPath","parentSmallPath","selfSmallPath","siblingsSmallPath","childrenSmallPath","descendantsSmallPath","PersonIconComponent","PikadayInputComponent","_pikadayInputless","_popoverOnComponent","_popoverOnElement","_powerSelectMultiple","_powerSelect","_beforeOptions","_options","_powerSelectGroup","_searchMessage","_preRender","checked","onClick","ariaDescribedBy","isChecked","isMouseDown","minimized","minHeight","maxHeight","toggleSize","attachCurrentHeight","minimizedChanged","_resizeDetector","parentId","selectedTerms","accordianParentId","panelId","isSelected","selectTerm","selectedTermsChanged","keypathRegex","profileSkills","hobbies","interests","certifications","languages","FacetTerm","searchField","reverseLookup","View","attachScrollListener","loadNextPage","createDebouncedLoadNextPage","loadResultsToFillPage","scrollToTopOnPageZero","Controller","integrationsPresence","_searchQuery","queryFacets","saveHistory","totalResults","lastSearchFavoritesCount","onFavoriteChanged","runSearchQuery","changeSearchType","currentActive","termObj","notifyTooManySearchFilters","updateQueryOnTermsChange","changeTabButtons","atPageLimit","remainingResults","hasMoreResults","moreResults","groupedSelectedTerms","currentGroup","isGroups","isLocations","isExternalContacts","isExternalContactsEmpty","isFavoritesEmpty","haveSelectedTerms","displayFacets","updateQueryParameters","queryParameters","newHash","lastHash","sendNavigationEvent","searchInitial","searchOnChange","startsWith","termStrings","keywordStrings","_baseSearch","_baseAggregations","order","_valueQuery","_facetQuery","_baseSearchForEntity","aggregations","MULTI_ENTITY_FIELDS","BASE_PERSON_EXPANDS","BASE_PERSON_FIELDS","_buildSearch","favoriteIds","valueQuery","chunks","chunk","operator","_normalizeSearch","models","modelResults","_processFacets","rawFacets","keyOrder","getFavoriteIds","getLoadedFavorites","favorite","isLoadMore","iterations","numberOfFavoriteToSearch","fetch","buildSelectedTerms","conn-ui-fav-nb","_ref5","userResults","alterUsersWithIntegration","searchKeywords","addSelectedTerm","keywordFacetName","directedSearchTerms","directedSearch","_directedSearch$split","_directedSearch$split2","_toArray","searchSplit","SearchResultContextComponent","searchResultContextVisible","_scrollToPreviousTop","$messagePane","$lastMessage","targetHeight","outerHeight","closeOnContextSwitch","replyToMessage","loadHistoryAfterLast","loadMoreHistoryAfter","loadHistoryBeforeFirst","loadMoreHistoryBefore","subMessageTypeClass","subMessageType","_deprecatedTetherDialog","_tetherPopoverOnComponent","_tetherPopoverOnElement","_tetherTooltipOnComponent","_tetherTooltipOnElement","timeSince","_calculateElapsedTime","durationInMs","asDays","_formatDuration","unit","cnt","msSince","HOUR","MINUTE","tickingDuration","escapedBuildTag","rawBuildTag","isPresent","updRandTime","currTime","currMinutes","currBin","nextMinutes","nextBin","hourMultiplier","_tooltipOnComponent","_didUpdateTimeoutLength","TooltipOnElement","AutoSaveDevicesMixin","currentFile","currentFileInfo","currentCoords","currentXHR","currentImageId","selectedCamera","cameraPending","cameraError","startingMedia","imageUrlData","uploadingImageUrl","autoTakePicture","uploadType","createDropZone","uploadError","x2","y2","showPictures","addIndicatorForPromise","uploadImageUrl","_helpers","displayImage","setupFileFromUrl","clearImage","startCamera","attachMediaStream","mirror","takePicture","canvas","createElement","videoWidth","videoHeight","ctx","getContext","drawImage","dataUrl","toDataURL","asBlob","dataURLtoBlob","pictureInfo","fileName","asFile","File","onTookPicture","cancelCamera","cameraStream","switchCamera","updateDefaultDevices","camera","canUseCamera","getImageDataFromXhr","initCrop","aspectRatio","Jcrop","onSelect","handleCropChange","onChange","setSelect","santizedResult","normalizeSingleResponse","attributes","dimensions","fileInfo","$image","FileAPI","imageCategory","displaywidth","cropProportion","gId","imgData","boundingBox","groupImageType","formData","Blob","uId","userImageType","dataUri","getInfo","handleFileInfo","dropzone","Dropzone","acceptedFiles","uploadMultiple","maxFiles","clickable","autoProcessQueue","addRemoveLinks","maxFilesize","dictInvalidFileType","dictRemoveFile","dictFileTooBig","dictCancelUpload","dictUploadCanceled","files","removeFile","autoplay","disableContextMenu","oncontextmenu","styleName","isSafari","processData","profilePaths","editingCaption","canAddCaption","showImage","addCaption","saveCaption","imageList","initCaption","ownImage","isGroupOwner","closeCaption","canDelete","populated","imagePath","currentImage","getReferencedField","_verticalCollection","_verticalItem","_wrapUrls","_link","_url","XOption","XSelect","metaName","nodeName","_require","rawConfig","getAttribute","unescape","isNonEmptyStringQueryParam","paramStr","isBlank","appsService","panels","initialPanel","updateCurrentRouteName","panelsOverrideObject","panelsOverride","initialPanelOverride","transitionToRoute","openPreferencesModal","_default","managePresenceSubscriptions","subscribeTo","inviteUserToRoom","isOneToOneRoom","promoteToAdhocRoom","inviteToRoom","toggleParticipants","collapseChat","oneToOneTarget","makeNewEmptyRoom","ContactsController","favoritesNameFilter","personBinding","isOnlyFavorite","canSearch","removeFavorite","addFavorite","recents","apiEndpoint","getJSON","idOnly","setLocalFavorites","favoritesFilterChanged","debouncedFavoritesFilterChanged","createDebouncedFavoritesFilterChanged","_filterChanged","filtered","setFavorites","countFavorites","list","checkSearchVisibility","EngageController","engageService","route","replaceRoute","setEngageActive","setEngageInactive","navigationEvent","navRoute","engageRouteToCollaborateRoute","redirectEvent","newRoute","MaintenanceController","hasDesc","messageKeys","titleKey","descKey","actionKey","showMobile","loadingFieldSections","showGridMode","stackedMode","gridMode","treeMode","showStackedMode","showTreeMode","toggleLeftRail","queryParamObserver","syncQueryParamsWithHost","currentLocalHash","currentHostHash","updatedHostHash","desktopRegionId","chooseRegion","context","sendRegionToDesktop","defaultDesktopRegionId","PUBLIC_ENVS","desktopId","RelateExternalContactController","IndexController","RelateExternalOrganizationController","relateService","redirectRoute","SignupController","_heading","_button","_plantronicsCallEvents","FieldConfig","ExternalContactModel","GroupModel","OrgModel","KEY_BLACKLIST","GROUP_BLACKLIST","ORG_BLACKLIST","PROFILE_BLACKLIST","_initModelWithType","blacklist","reopen","unknownProperty","splitFieldPath","splitField","getFieldListByType","getFieldsByType","getAllowedValues","isFieldRepeatable","isFieldReference","isFieldChoice","groupFieldConfig","getFieldConfig","personFieldConfig","extra","createFieldConfig","attachComputedEntries","boundTo","boundToEach","getEntriesFromEntity","getEntityType","serverKey","exists","Field","maxRepeat","i18nLabel","getI18nLabelKey","elemId","cleanForEntity","requirejs","_eak_seen","className","factory","lookupFactory","hhmmss","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","DEFAULT_PARAMETERS","normalizeArrayResponse","activityMessages","sms","voice","Helper","compute","activity","ts","_abs","_acos","acos","_acosh","acosh","_add","formatOrLookupAddressForDisplay","_and","hideSha","versionRegExp","hideVersion","shaRegExp","helper","_arrayContains","arrayContains","_asin","asin","_asinh","asinh","_atan","atan","atan2","_atanh","atanh","_await","promiseArray","permissionsService","_cancelAll","cancelAll","_cbrt","cbrt","_ceil","_clz","clz32","_cos","cos","_cosh","cosh","cssClassify","_dasherize","_div","div","_emberPowerSelectIsGroup","emberPowerSelectIsGroup","_emberPowerSelectIsSelected","emberPowerSelectIsSelected","_emberPowerSelectTrueStringIfPresent","emberPowerSelectTrueStringIfPresent","_emoji","emojifyString","_equal","_equals","equals","escape","_exp","recompute","_escape","_expm","expm1","namedArgs","splitName","fieldObj","lookupPath","_flairRegEx","hideIfText","color","emojiText","_floor","_formatDate","bytes","units","converted","pow","decimals","toFixed","_formatHtmlMessage","_formatMessage","_formatNumber","_formatRelative","_formatTime","_fround","fround","fullNameHelper","externalProfile","fullName","_gcd","gcd","_getSelectOptions","getSelectOptions","hasRecordForId","recordForId","_gt","_gte","gte","_hypot","hypot","activityIcons","_ignoreChildren","ignoreChildren","_imul","imul","_intlGet","_isAfter","_isArray","_isBefore","_isBetween","right","_isFulfilled","_isPending","_isRejected","_isSameOrAfter","_isSameOrBefore","_isSame","routes","station","routeIds","joinStrings","joinCharacter","rest","_l","_lcm","lcm","_this$get","localizePresence","_logE","logE","_log","log10","_log1p","log1p","log2","_lt","lt","_lte","lte","_max","_moment","isSame","_min","_mod","mod","_momentAdd","_momentCalendar","_momentDiff","_momentDuration","_momentFormat","_momentFromNow","_momentFrom","_momentSubtract","_momentToDate","_momentToNow","_momentTo","_unix","_mult","mult","_markdown","_notEqual","notEq","_not","_now","_or","_perform","onIntegrationConfigChange","integrationContactInfo","integrationConfigs","includeBadge","_pow","_promiseAll","promiseAll","_promiseHash","promiseHash","_promiseRejectedReason","_random","renderMarkdown","_round","round","_routeAction","emoji","isUnicode","isUnicodeLookAhead","emojifyStringUnicode","_sign","sign","_sin","sin","sortFieldData","_orderBy","_sqrt","sqrt","_sub","sub","_sum","_tan","tan","_tanh","tanh","_task","padZero","num","willDestroy","_scheduleRecompute","endTime","shouldTick","_setupObserver","titleForEntityPropertyHelper","entityPropertyType","getPhoneTitleFor","getEmailTitleFor","_trunc","trunc","_utc","utc","extLabel","_xor","xor","INCOMING_CALL","TERMINATED_CALL","MISSED_CALL","STOPPED_RINGING","PHONE_CONNECTED","WEBRTC_CONNECTION_INCOMING","WEBRTC_CONNECTION_ANSWERED","WEBRTC_CONNECTION_DECLINED","WEBRTC_CONNECTION_STARTED","WEBRTC_CONNECTION_ENDED","_emberUuid","unparse","v1","v4","initialize","_initializerFactory","after","ApplicationService","before","Route","AuthenticatedAuthorizedRouteMixin","UnauthenticatedRouteMixin","beforeModel","AuthenticatedRouteMixin","deprecateJqueryCookie","jQueryCookieDeprecation","until","cookie","deprecate","removeCookie","oauthProps","_netUtils$getEnvDetai","runtime","loadOauthProps","ChatService","singleton","Clock","StyleNamespacingExtras","ContainerDebugAdapter","WebrtcSdkService","setupContainer","registry","baseURL","rootURL","Configuration","load","_setupSession","_setupSessionService","_engines","exportApplicationGlobal","theGlobal","globalName","classify","throttled","debounced","_register","PersonFieldConfig","GroupFieldConfig","OrgFieldConfig","ExternalContactFieldConfig","MainInitializer","Orgspan","Debug","registerDeprecationHandler","Provider","ZoomProvider","PureCloudProvider","TeamsProvider","PhoneService","PreferencesService","_routeStyles","deferReadiness","authUri","instanceProperties","runtimePublicDomainName","publicDomainName","purecloudV2BaseUri","cobrowseUri","purecloudAppsUri","streamingServiceUri","advanceReadiness","SessionService","_themeLoader","setThemeClass","loadTheme","regex","packages","WebrtcService","WebrtcSettings","_backburnerDebug","_conversationService","applicationInstance","initializeStoreService","instanceInitializer","Intl","polyfill","cldrs","addLocaleData","localeSplit","localeName","addTranslations","_setupSessionRestoration","LazyRenderWrapper","enableLazyRendering","EntityContactGroupComponent","EntityFavoriteComponent","EntityHoverCard","EntityImageComponent","EntityLocationComponent","pushManifest","manifest","PresenceLabelComponent","preferences","parentView","routeTitle","updateRouteTitle","routeName","appRoute","orgName","HostedContext","_net","parseRuntimeCustom","$target","urlPrefix","initializeEmojiRendering","initializeMarkdownRendering","apiHandlers","apiHandlerKeys","currHandlerKey","logout","_logged","nrOnError","URLSearchParams","hasQueryParam","TARGET_PRESENCE","freeze","BUSY","MEETING","OFFLINE","launchVideoImage","getTargetPresence","gcPresence","chatUserPresence","loadData","showRunErrorNotification","haveAccess","canRunAction","allowMultipleMeetings","getJid","originalAction","_action","_args","openChatRoomWithVideo","showingVideoChanged","apps","useCollaborateChat","haveEmbeddedClientAccess","meetingUrl","queryParamsToObject","keyValue","_keyValue","buildAuthUrl","authConfig","cancelTimer","iframe","body","appendChild","contentWindow","removeChild","clearTimeout","INTERNAL_DL_MATCHER","embeddedUrl","isExternalDomain","personGuid","modelSet","_displayApiError","fallbackMessageKey","_displayError","messageKey","messageKeyOption","_displayNotification","conversation","conversationIsDestroyed","getInteractionTypeFromCP","interaction","isCall","isFax","isChat","isCallback","isSms","myselfAgent","findLast","participants","party","partyIsUser","partyIsAgent","purpose","callbacks","calls","chats","handleMissedTimedBoxTimer","Interaction","conversationModel","tmpInteractionModel","interactionHasMissedTimer","windowInFocus","hosted","applicationHasFocus","hasFocus","timeDiff","timeCreated","selectedWrapupCode","wrapupNotSaved","oldWrapupCode","skipAfterCallWork","isAfterCallWorkTimerExpired","isWrapupCodeSet","isNotesSet","activeCallWorkCompleted","activeCallWorkNeeded","canUseCommunicationACW","canAgentRequestACW","useCommunicationACW","isAfterCallWorkCompleted","communicationMedia","communicationObj","isCommunicationAfterCallWorkCompleted","isCommunicationAfterCallWorkRequested","isAfterCallWorkMandatory","wrapupPrompt","isAfterCallWorkForcedTimeout","prompt","isAfterCallWorkTimeout","isNonDiscretionaryCompletion","isWrapupPromptAgentRequested","hasMissedTimer","MACHINE_PARTICIPANTS","CUSTOMER_PARTICIPANTS","MEDIA_TYPES","isCustomerParticipant","participant","isMachineParticipant","isAgentParticipant","isCurrentUserOrMachineParticipant","hostParticipant","customerParticipants","agentParticipants","otherParticipants","otherConnectedParticipants","isDisconnected","isMonitored","monitoredParticipantId","isCoached","coachedParticipantId","isBarged","bargedParticipantId","allHumanConnectedParticipants","allConferenceParticipants","connectingQueue","participantForCustomer","consultParticipantId","trueCustomerParticipant","participantCaller","customer","_findLast","isCurrentUser","isExternalCustomer","isInternalCustomer","nextConnectedParticipant","customerParticipant","_acd","getTrueCustomerIfMultipleCustomersExist","activeParticipantIds","externalContactId","participantsForCurrentUser","participantUserId","getFirstStuckParticipant","currentUserParticipants","stuckParticipant","hasActivePrimary","_doesParticipantHaveActivePrimaryMedia","hasActiveSessionShare","_doesParticipantHaveActiveSessionShare","participantForCurrentUser","lastAlertingParticipant","media","lastNonDisconnectedParticipant","lastCurrentUserNeedingWrapup","wrapupRequired","wrapup","_last","participantsForACD","participantForQueue","dialerParticipant","transferringToParticipant","activeTransfer","destination","PROVIDER_MEDIATYPE","aggregateMedia","screenShares","cobrowsesessions","videos","mediaObj","allMedia","getMediaObject","mediaArray","mediaWithlatestConnectedTime","_maxBy","connectedTime","unix","mediaWithlatestDisconnectedTime","disconnectedTime","maxConnectedTime","maxDisconnectedTime","activeMedia","isAfter","sessionShareCode","isSessionCodeRequired","isSessionSharing","isRequestingEndSessionShare","sessionShareDisconnectTimer","sessionShareExplicitlyInitiated","sessionShareActiveOnLoad","isCobrowseV2Disconnected","isCobrowseV2","canScreenShareOnCall","canScreenShareOnChat","canCobrowseOnCall","canCobrowseOnChat","isRequestingScreenShareOrCoBrowse","isRequestingVideo","sessionShareState","customerShareState","hasSessionShareCode","sessionShareActive","isRequestingSessionShare","isSessionShareConnected","isSessionShareDisconnected","isCustomerInSessionShare","isCustomerDisconnectedFromSharedSession","isAgentDisconnectedFromSharedSession","isWaitingForAgentToConnect","isWaitingForCustomerToConnect","hasCustomerJoinedSessionShareRoom","hasAgentJoinedSessionShareRoom","sessionShareRoomJid","_jidHelpers","isRoomJid","mostRecentAgentSessionShare","mediaObject","mostRecentCustomerSessionShare","sessionShareType","canScreenShare","canCobrowse","mediaTypeIsScreenShare","mediaTypeIsCobrowse","mediaTypeIsVideo","isScreenShare","isCoBrowse","isVideoShare","hasScreenSharePermissionError","hasCobrowsePermissionError","hasVideoPermissionError","hasShareError","sessionShareConnectedTime","sessionShareDuration","_privacyStatement","_securityDisclaimer","transition","BatchDataRequestsMixin","batchDataRequests","refreshUser","getChatUser","getGroup","useChatBetaCleanUp","initRoomCaching","getChatRoom","objectId","getEntityObjectId","isPersonJid","passedInJidIsPerson","isSupervisorJid","closeActiveRoom","personRoom","ChatRoom","rooms","setupRoomContextV2","setupRoomContext","roomMuted","addChatTargetAsParticipant","isGroupJid","loadGroup","addParticipantToRoom","loadRoomSubject","getStreamingRoomInfo","subject","updateRoomSubject","addRoomToCache","addAllParticipantsToRoom","participantJids","cachedParticipants","cachedParticipant","cachedParticipantJid","removeParticipantFromRoom","_keepOnlyChanged","imageRegex","timeStampRegex","audioRegex","giphyRegex","imgurRegex","youtubeRegex","vimeoRegex","ghGistRegex","ghRepoRegex","twitterRegex","googleSlidesRegex","soundcloudRegex","getImageShortName","pattern","parseTimeStamp","timeStamp","mediaItems","giphies","audios","gists","repos","tweets","googleSlides","soundcloud","union","getLinks","gifv","webm","mp4","identifier","youtubeLinks","videoUrl","vimeoLinks","modelData","GithubItemModel","gist","githubRepos","repo","tweetId","tweetInfo","tweet","acdChatUser","isYou","compareJids","isAcdChatUser","chatUserId","acdChatUserId","isLastMessage","messageTime","displayDateRelativeToToday","messageDisplay","correction","isCorrection","ChatEvents","Evented","initialDataLoaded","historyDirty","handleHiddenRooms","hiddenRooms","useChatSyncFix","MessageNotificationsMixin","sendMentionNotification","shouldShowMentionNotification","roomName","getRawDisplaySubject","soundId","getNotificationVolume","notificationOutputDeviceId","getNotificationOutputDeviceId","sendNotification","shouldShowNotification","messageBody","showPopup","playSound","getNotificationTitle","widgetType","rawMessage","sendEngageNotification","clickHandler","severity","isBusyUser","isDuplicate","duplicate","targetRoomIsMuted","isSupervisorRoom","messageAlreadySeen","fromLoggedInUser","groupNotificationsEnabled","coveredByMessageNotification","chatUser","personName","sendTestNotification","messageDelayDefault","messageDelay","maxDelay","_splitOverSizedMessage","messageQueue","_convertSplitMessagesToWidgets","_uuid","stanza","sendSplitMessageQueue","_delayedMessageSender","unsentMessageQueue","_addFailedMessagesToRoom","splitWidget","_manuallyCreateStanzaForFailedMessage","ChatMessage","widget","sendError","checkForMentions","setMessageReadState","addMessage","childName","childPayload","findMessageById","messageId","messageCache","pendingMessage","pending","failedMessage","splitMessageData","splitMessageParent","splitMessageCache","sendMessageToRoom","chatService","oneToOneRoom","presenceSubscriptionCounter","chatField","chatStatus","hasChatStatus","hasMedia","mediaInfo","listener","hasMediaInActiveChatRoom","ClickOutsideMixin","_webrtcConversationAnalysis","acdNormalizedMessages","callsUri","communicationUri","createCommunicationUri","communicationsUri","participantId","mediaId","participantUri","communicationsByTypeUri","consultUri","disconnectMediaTypeUri","getConversationUri","mediaRequestUri","monitorUri","participantsUri","participantDetailsUri","participantWrapupUri","sessionShareCodeUri","expireSessionShareCodeUri","securityKey","participantWrapupCodesUri","participantCommunicationWrapupUri","communicationId","replaceUri","getQueryStr","scheduleCallbackUri","tagsUri","wrapUpUri","wrapUpCodesUri","messagesUri","sendChatMessageUri","conversationId","sendTypingUri","sendMessagingTypingUri","draftUri","draftAttachmentUri","smsUri","smsHistoryUri","smsMessageDetailUri","smsMessageBatchUri","sendSMSMessageUri","createMediaAttachmentUri","getMediaAttachmentUri","copyMediaAttachmentUri","requestACWUri","interactionId","agentCommunicationId","getSupportedContentUri","getDeploymentConfigUri","deploymentId","getSupportedContent","getIntegrationConfigUri","integrationId","getConversationSummaryFeedbackUri","summaryId","arrayParameterCollection","forIn","answerChat","defaultLogLevel","makeRequest","logRequest","correlation","logLevel","captureRequest","resolveRequest","isSuccessResponse","groupName","groupTypeDefault","groupVisibilityDefault","groupMembershipDefault","groupModal","nameLengthExceeded","creatingGroup","visibility","vis","rulesVisible","newPublicApiGroupData","canCreateGroup","isAdmin","adminGroup","groupTypeI18nLabel","newGroupTypeChoices","lookupType","groupVisibilityI18nLabel","newGroupVisibilityChoices","_deviceEnumeration","messageEvent","messageOptions","triggerMessageAction","messageHandlers","lastUploadedImage","editingPictures","viewingGallery","cancelEditProfilePicture","cancelUpload","cancelEditPictures","viewLightGallery","cancelViewLightGallery","setInitialFieldSections","excludedSections","getReadableSections","WebrtcActionUtils","getProvidersForUser","isPresence","presenceMap","definition","apiValue","presenceMapping","systemPresence","presenceService","outOfOffice","acdDivisionPresenceProfileToggle","primaryPresence","presenceList","currentPresenceSource","integrationPresence","currentPresence","existingPresence","pres","presSource","existingPresenceDate","modifiedDate","activitiesPresenceDate","isExistingPresenceLatest","isGCOffline","presenceDefinition","presenceModel","presences","canViewPresenceDefinition","outOfBandPresence","outOfBandPresences","findPresence","matchingPrimaryPresence","newPresence","Presence","endOfTime","primaryPresenceSource","integrationLabel","secondaryPresenceLabel","secondaryPresence","fallbackLocale","languageLabels","_i","_Object$entries","_Object$entries$_i","formattedLocale","primaryStatusMessage","cityExists","regionExists","countryExists","hasGeolocation","isAvailable","isOffline","isAway","isBusy","isOutOfOffice","isOnQueue","isOfflineOrBusy","activityPresence","activityPresenceClass","profilePictureFieldKey","agent","missingFieldsCache","EntityMixin","_currentSection","_missingFieldsCache","volatile","pictureKey","profilePictureSizes","_sortBy","_keys","_parseInt","uploadedImages","stateString","_self","_missingFields","recordPropertyChange","changedSinceSave","changedProperties","referencedField","referencedLookup","fieldArray","reference","isFieldValueEmpty","removeFieldValue","currentFieldValue","object","currentState","stateName","onSaveSuccess","onSaveError","_internalModal","internal","_internalModel","responseJSON","publicApiError","currentVersion","newVersion","currentField","fieldDef","getPermissableSections","getWriteableSections","getReadableFieldsForSection","getWriteableFieldsForSection","deleteField","del","EvaluationsMixin","evaluationsAjax","getEvaluations","agentEvaluations","evaluatorEvaluations","assigneeEvaluations","agentId","evaluationState","userType","isAssigneeFeatureEnabled","isDisputesFeatureEnabled","evaluatorUri","agentFinishedUri","agentInReviewUri","assigneeUri","evaluatorRequest","requestAgentFinished","requestAgentInReview","requestAssignee","_ref$entities","evaluation","changedDate","calibration","dateAssigneeChanged","assignedDate","linkContext","EvaluationModel","_ref2$entities","releaseDate","_ref3$entities","_ref4$entities","evaluationIdSet","resultData","totalResult","queryResult","readEvaluation","evaluationIsAdminContext","externalContacts","externalContactProfiles","consultAgentParticipant","consultParticipant","hasMultipleExternalContactMatches","isIncomingFromExternalContacts","isConnectedWithExternalContact","hasExternalContactProfiles","hasOneExternalContactProfile","_nameForInheritor","componentClassName","externalContactFullName","FaxesMixin","getFaxes","fax","FaxModel","readFax","changeFaxReadState","contentUri","sharingUri","contentLocationUri","markFaxesRead","faxes","markFaxesUnread","renameFax","deleteFaxes","deleteFax","downloadFax","allFieldData","showLabel","savingField","attachObserversForComplexFields","fieldTypeClass","notifyComplexPropertyChange","performNotification","didFlag","flagOperationInProcess","flaggedSelves","myParticipants","myGuid","myFlaggedParticipants","flaggedReason","allowFlagChange","minutesPassed","flagCallHistoryInteraction","customerBrowserDetails","customerDetails","isChrome","isEdgeChromium","hasChromeExtension","isStandAloneApplication","canScreenshare","cobrowseType","isCustomerConfiguredForCobrowse","isCustomerConfiguredForScreenShare","screenShareMisconfiguration","cobrowseMisconfiguration","canCobrowseChat","canCobrowseCall","isAgentAllowedToCobrowseCall","isAgentAllowedToCobrowseChat","isAgentAllowedToCobrowse","isAgentAllowedToScreenShareCall","isAgentAllowedToScreenShareChat","isAgentAllowedToScreenShare","sessionShareStartVideoTooltip","sessionShareStartTooltip","canScreenShareViaHawk","webMessagingCobrowseStartTooltip","disableShareButtonReason","isConfigured","disableVideoButton","disableShareButton","shouldShowSessionShareButton","enableAcdSessionShare","isInternalProvider","acdVoicemailTooltip","holdTooltipTitle","muteTooltipTitle","scriptToolTip","skipACWTooltipTitle","currentJobs","finishedJobs","_currentJobs","_finishedJobs","_logger","errorState","cachedTotal","loadPage","prevPage","decrementProperty","ensureCorrectProperties","currentPageDisplay","hasNextPage","hasPrevPage","haveContent","letterUpdate","letter","directory","isHeld","isMuted","isRecording","isActiveCallACD","isOutsideCall","myself","onCall","setActiveCall","cleanupActiveCall","headset","webrtcSdkService","attemptingToCall","shouldPromptForMerge","callToMergeInto","mergeData","deviceMuteEvent","mute","deviceHoldEvent","holdRequested","hold","deviceCallRejectedEvent","sendToVoicemail","enableHeadsets","changeHeadsetSource","headsetSource","callVoicemail","_handleValidationError","webrtcPhoneWithIssues","_validateCall","callingPerson","onbehalfOfQueue","noStation","_throttledHoldOtherConversations","_holdOtherActiveConversations","_makeCall","formatSipAddress","callFromQueueId","showErrorNotification","startSoftphoneSession","updateActiveConversationEntry","outgoingCall","callArgs","callPersonById","mergeCalls","conversations","callsToMerge","conferences","conversationIds","recordings","makeMergeRequest","toVoicemail","_throttledHandlePhoneStatusChange","_args3","handlePhoneStatusChange","endCall","clearMergeData","makeConferenceCall","parties","bulkAddParticipants","blindTransfer","isNumber","myselfId","participantEntity","isQueue","_handleCallTransferred","conversationsMadeByClient","placedConversation","consultTransfer","currentCallId","otherPartyId","initiateTransfer","addressee","changeSpeakerForConsult","speakTo","otherParty","endConsult","generateConversationsUrl","dialDtmfNumber","digits","_throttledAnswerWebrtc","_answerWebrtc","_throttledAnswer","_answer","_throttledAnswerSoftphoneConversation","acceptPendingSession","answerSoftphoneConversation","_findPendingSessionsByConversationId","validateActionSucceeded","checkForNonACD","_throttledMute","_mute","setMute","skipHoldAll","_held","held","otherConversations","otherConversation","_throttledHeld","_callee8","_context8","setHold","_throttledRecord","_callee9","_context9","_record","_this14","flagActiveInteraction","_this15","isFlagged","_makeFlagChange","_this16","endCallForAll","endCallById","_throttledEndCall","_callee10","_context10","_endCall","_throttledEndCallForAll","_callee11","_context11","_endCallForAll","_this17","_callee12","_context12","conversationWithError","removeConversationFromConversations","_endWebrtcCall","_this18","_callee13","_context13","conversationType","webrtcConversationTypes","SOFTPHONE","notAfter","_throttledEndWebrtcCall","_callee14","_context14","endConversation","_this19","generateConversationUrl","callbackConnected","generateCommunicationUrl","handleOtherParticipantStatusChange","_this20","callForwardingActive","callForwardingNumber","callForwardingExtension","fetchCallForwarding","getCallForwarding","_updateCallForwarding","hasPhoneNumber","_contactObservers","activeConversations","onMultipleCalls","activeAcdCalls","conv","callState","webrtcConversation","getConversation","callIsAlreadyConnnected","hasPendingSession","webrtcSessions","atLeastOneWebrtcConversation","isDefinedAndLengthGreaterThan","activeNonAcdCalls","connectedConversations","dialingOrContactingOrAlertingConversationsToProceed","thisClientMadeTheCall","waitingForSession","recentTransfers","thisBrowserIsTheOneToAnswerFrom","isDialing","isOutbound","disconnectedConversations","eligibleCallsToMerge","onConference","thisCallIsConference","_handleActiveConversationsUpdates","_throttledHandleActiveConversations","handleActiveConversationsUpdates","hasActiveCall","connectedNonAcdCalls","dialingOrIncomingConversation","newActiveCall","activeCallOngoing","dialingOutboundConversations","hasOutboundConversation","activeCallErrors","errorInfo","hasIncomingConversations","_setHasIncomingConversations","hasActiveNonAcdCalls","incomingConversations","incomingNonAcdConversations","isOnConnectedCall","mostRecentlyConnectedConferenceCalls","isConferenceCall","isConnectedCall","myTime","onlyConnectedConversations","recentDisconnectedAgentCalls","isAgentCall","recentDisconnectedNonAcdCalls","userCallSessionsWithErrors","_shouldRemoveNonAcdConversation","conversationMarker","conversationsToRemove","callErrorToRemove","conversationModelTemp","ConversationModel","_throttledRemoveDisconnectedConversations","_removeDisconnectedConversations","participantOnUpdatedConversation","conversationHasErrors","conversationMadeByClient","conversationAcceptedOnClient","conversationWasMadeOrAcceptedOnClient","participantsForUser","updatedParticipantCall","getParticipantCall","conversationWasTerminatedNotDisconnected","disconnectedCalls","timeOutToRemove","stationIsWebrtc","thereArePendingSessions","_debouncedRemoveConversationFromConversations","thereIsAConnectedConversation","updateConversationArray","conversationDetails","conversationExists","monitoredConversationsForErrors","nonAcdCalls","usersCallSessions","callSessions","participantIsUserAgent","participantIsCurrentUser","userParticipant","callsWithErrors","disconnectReasons","thereAreDisconnectReasons","re","disconnectErrors","disconnectTypeIsError","disconnectType","ERROR_WHITE_LIST","registerCPTopics","topics","_updateStationEvent","conversationData","currentCallState","participantOnExistingConversation","participantCall","participantOnCall","participantIsNotVoicemail","isActiveOnCall","newCallState","answerCall","_logConversationDetails","_updateModelForConsult","IGNORED_ERRORS","useNotificationProfileOutput","displayIncomingNotification","notificationOptions","fallbackToInBrowser","EVENTS","handleParticipantCallError","endMoment","isRecent","hasThrownError","showSipError","messageText","phrase","translateServerErrors","messageParams","messageWithParams","fetchStation","stationId","newCode","showFeedbackErrorNotification","showNoStationSelected","isAcdCall","needStation","updateStationEventTimeout","freeSeatPreference","noStationSelected","defaultStation","associatedStationNotDefault","defaultStationNamePromise","selectedStation","guidFromUri","disassociateStation","disconnectPersistentConnection","endAllSoftphoneSessions","chooseDefault","chooseStation","doLoginAssociationLogic","isFreeSeatOrg","_loginAssociationFreeSeat","_loginAssociation","doLogoutAssociationLogic","associatedStation","lastAssociatedStation","lastAssociatedUser","defaultStationUser","userStationSettings","eventBody","_debouncedUpdateStationEvent","_handleUpdateStation","metadata","newStation","newStationId","currentStationIsNewStation","stationUri","_testIsStationWebrtc","PurecloudModelMixin","hasRelateAccess","canShowCustomFields","contactRoute","queueSearchRequest","requestArray","queuePermission","relatePermission","queueSearchData","searchIntegrationKey","queueSearchQuery","userRequest","resultArray","userIds","performTagSearch","searchQueue","searchQueueOnly","searchOnEmpty","pendingSearchRequest","currentSearchRequest","TagSearchMixin","tagSearchQuery","tagSearchRequest","tagSearchResults","HelpMixin","_performHelpSearch","excerpt","performHelpSearch","TIMEOUT","PrepareResults","parsedResults","retrySearch","searchUser","searchRelate","userSearchFailed","queueSearchFailed","relateSearchFailed","userPending","queuePending","relatePending","queueResults","relateResults","debouncedSearch","performReload","searchQueues","searchUsers","userRequests","queueRequests","relateRequests","leading","trailing","presenceToRadixMapping","available","busy","away","idle","offline","on_queue","out_of_office","radixMapping","mapUserToSortable","userName","mapRoomToSortable","radix","SortChatUsersMixin","sortChatUsers","usersList","sortOneToOneRooms","_styleNamespacingExtras","getScrollParent","comp","enableViewport","enteredViewport","rect","windowHeight","windowWidth","bottom","exitedViewport","_teardown","_setup","_bindEvents","_updateBoundingClientRect","innerHeight","documentElement","innerWidth","clientWidth","scrollParent","scrollParentRef","windowRef","$scrollParent","resizeHandler","scrollHandler","getBoundingClientRect","_updateWindowSize","_scrollHandler","requestAnimationFrame","_resizeHandler","streaming","sessionService","_fixTooltips","videoTooltipTitleSr","numberOfParticipants","oneToOneChat","webrtcTarget","videoMediaProviders","haveNonPurecloudMediaProvider","videoTooltipKey","videoButtonEnabled","_annotation","eventType","_assign","customPayload","typeOf","PROTOCOL_FIELD_NAME","OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME","currMetadataFieldName","messagePayload","requireProtocol","API_ACTION_FIELD_NAME","actionDetails","PROTOCOL_AGENT_FIELD_NAME","PROTOCOL_AGENT_VERSION_FIELD_NAME","fieldToPrune","AppApiCall","protocolAgentName","protocolAgentVersion","internalPcCall","srcApp","srcAppInstance","AppState","ordinal","compareTo","anotherState","getPrototypeOf","APP_STATES","LOADING","BOOTSTRAPPING","RUNNING","STOPPING","STOPPED","LIFECYCLE_HOOKS","BOOTSTRAP","FOCUS","BLUR","STOP","APP_LIFECYCLE_CALLBACKS","BOOTSTRAPPED","APP_UPDATED","APP_DELETED","LICENSE_UNAVAILABLE","STATE_CONFIGS","_STATE_CONFIGS","lifecycleDetails","maxDurationMillis","stateOptInPropName","broadcastHookName","appCallbackEventName","LIFECYCLE_ORDERED_APP_STATES","currStateName","state1","state2","AppInstance","instanceId","currState","_currStateStartTimestamp","problem","lastUserAccessTimestamp","_stateTimeoutTimer","attentionCount","guidFor","reportStoppedInteraction","_inAppInteraction","_appendAppInteraction","_startAppInteraction","_advanceState","loaded","bootstrapped","_triggerLifecycleHookEvent","stopped","setProblem","requestedState","requestedStateConfig","nextState","_getNextState","_convertStateToLifecycleEvent","_logInactiveAppStopped","hook","_monitorTransitionalState","currStateConfig","currStateEntryTimestamp","maxDuration","timeInState","currStateIndex","_interactionStartTimestamp","_latestInteractionTimestamp","lifecycleEvent","startTimestamp","_logAppInteraction","interactionStart","interactionDetails","timeSinceInteractionStart","timeSincePrevInteraction","interactionEnd","interactionDuration","commonAttrs","pcAppTypeId","pcAppId","pcAppInstanceId","pcAppDisplayType","pcAppInternallyHosted","InternallyHostedApp","pcAppFeatureCategory","pcAppProblemName","getURLTemplateQueryParams","queryParam","appState","POOL_STATES","IDLE","APP_NOT_FOUND","ALLOCATING_SPACE","SHOWING_APP","ALLOCATION_FAILED","LOAD_FAILED","AppPool","poolName","getMaxActive","fetchAppsFn","loadRetryBaseMillis","loadRetryMaxBackoffMillis","reloadAppsIntervalMillis","reloadAppsRetryBaseMillis","stoppedInstanceRemovalInterval","renderedAppInstances","_loadAppsPromise","_showFailureRestoreAppId","_loadRetryAttempts","_loadRetryScheduled","_reloadFailureCount","skipLongRunningTasks","appAttentionCounts","counts","runningInstances","_searchInstances","maxState","currInstance","totalAttentionCount","_apps","_renderedInstances","_fetchFailureLog","abortedCount","endpointFailureCount","instances","findAllApps","_loadApps","showApp","_findApp","_this3$_searchInstanc","_this3$_searchInstanc2","existingInstance","_setState","_allocateNewInstance","hideApp","_this4$_searchInstanc","_this4$_searchInstanc2","runningInstance","stopApp","_this5$_searchInstanc","_this5$_searchInstanc2","_monitorAppLifecycles","reloadApps","_reloadApps","internalLoadRetry","__fetchApps","latestApps","mergedApps","newApp","_isEqual","APP_PROBLEMS","currNewApp","_findIndex","loadResult","restoreAppId","_logPoolEvent","forceReload","autoLoadRetry","loadRetryAttempt","autoAttempt","_scheduleAppReload","autoRetry","loadRetryScheduled","_retryInitialAppLoad","retryBase","retryAttempts","retryInterval","maxRetryDuration","_loadRetryTask","timeoutVal","abortedAttempts","endpointAttempts","_decorateLogStatement","reloadInterval","reloadWait","reloadFailureCount","_reloadTimerTask","finish","typeOfApps","isAjaxError","isAbortError","pendingInstance","_allocateSpace","renderedInstances","existingInstances","sortedInstances","instanceToEvict","evictedAppId","_ref$instanceId","_ref$appId","_ref$states","_ref$maxState","instanceState","currInstanceState","specificInstance","_removeStopped","_monitorAppLifecyclesTask","stoppedInstances","logText","poolEvent","poolEventDetails","poolState","maxPoolSize","renderedApps","primitivePoolStateDetails","_omitBy","poolStateDetails","_reduce","_merge","Copyable","LIFECYCLE_DEFAULTS","ephemeral","hooks","bootstrap","STANDALONE","WIDGET","INTERAPPTION","DIRECTORY","CONTACT_CENTER_INSIGHTS","LANG_TAG_URL_REPLACEMENT_TOKEN","PC_ENV_URL_REPLACEMENT_TOKEN","PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_LANG_TAG_URL_REPLACEMENT_TOKEN","GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN","GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN","GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_HOST_ORIGIN_REPLACEMENT_TOKEN","GC_TARGET_ENV_REPLACEMENT_TOKEN","TOKEN_REPLACEMENTS","_TOKEN_REPLACEMENTS","queryParamName","replacementProp","replacementValue","interactionType","URL_REPLACEMENTS","replacementToken","_ref2$","regExp","INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS","INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS","INTERAPPTION_COMMUNICATION_TYPE_FILTERS","typeId","urlTemplate","langTag","envTld","usePopupAuth","displayType","featureCategory","permissionsPolicy","enabledQueueIds","enabledCommunicationTypes","gcHostOrigin","gcTargetEnv","currReplacement","rawValue","appUtils","buildLogMsg","deep","ownerMixin","sandbox","cloneDeep","assets","lifecycle","_callCommunication","Model","isExternalVoicemail","_callbackCommunication","hasSipErrors","codes","sipResponseCodes","conversationParticipants","conversationParties","missedCall","wasConference","wasCallback","wasOutboundCampaign","wentToVoicemail","callStart","sentToVoicemail","reachedVoicemail","callEnd","isMultiParty","allParticipants","myParticipant","nonVoicemail","me","internalParticipants","monitoredCallId","externalParticipants","ani","stationParticipants","voicemailParticipant","ivrParticipants","queueParticipants","otherParties","partyFromConversation","callParties","dnis","initiator","outboundParticipant","external","inboundExternal","disconnectReason","disconnectTypeKey","isIvrTransfer","isOutboundCampaign","isBlindTransfer","isConsultTransfer","isPersonalVoicemail","isQueueCall","invalidNumber","groupRingParticipant","isGroupRing","groupRingId","isOutboundGroupRing","groupRingGroup","backgroundReload","groupRingCaller","loadConversation","personParticipants","_chatCommunication","ChatMessageMedia","ChatMessageMixin","corrects","hasMentionLinks","unread","startOfBlock","endOfBlock","isYourLastMessage","splitMessageIndex","determineMessageEditability","isSplitMessage","isEditable","editableEndTime","meAction","startEditing","stopEditing","originalWidgetType","isEditableTimeout","animateChatIcon","rawSubject","pendingRoom","firstMessageTime","lastMessageTime","lastMessageTimeRadix","roomClosedTimeRadix","mentions","unseen","messageActivity","userActivity","loadingHistory","moreHistoryAvailable","moreForwardHistoryAvailable","activated","acdCustomerParticipant","inputCache","isInRoster","participantsVisible","invited","joinCallImmediately","joinScreenshareImmediately","deferredParticipants","roomOwners","setupProperties","authenticatedUserIsRoomOwner","resizeNewPopout","popout","resizeTo","moveTo","videoConversation","videoRoomFull","haveId","haveName","isApiFieldConfigName","mapCanRemoveParticipant","participantList","isMember","isRoomOwner","sortedParticipants","skipGroupDataCheckEnabled","isAdhocRoom","isAcdRoom","isAcdJid","isSoftphoneRoom","isSoftphoneJid","isOneToOne","allowUserRemoval","processRoomDetails","haveGroupData","clearMessageCache","pruneMessages","removeCachedItemsCount","takeRight","reconcileMessages","addHistoryMessages","processHistoryModels","filterSeenMessages","addSelfReference","insertHistory","sortChatMessages","processCorrections","processSplitMessageHistory","markConversationBlockBoundaries","updateFirstUnread","updateMessageTimes","bumpActivityCount","historyMessages","unshiftObjects","splitMessage","processSplitMessage","correctedMessage","m","shouldGroupMessages","splitMessageParentExists","SplitMessage","splitMessageId","addSplitMessage","msgId","isSupervisor","isAcd","lastMessage","yourLast","isBefore","oldMessage","newMessage","updateMessageTimeRadix","updateClosedTimeRadix","addParticipant","removeParticipant","clearUnreadMessages","isUserInRoom","userjid","clearPending","existingMessage","setSendError","addDeferredParticipant","loadDeferredParticipants","audioMuted","videoMuted","sharingScreen","major","domId","hasConnected","inLastN","screenStream","isV1","startedVideoMuted","associatedInteraction","zeroBitrateCount","positiveBitrateCount","noVideoTrack","speaking","mediaPresence","_getInteractionAvatarDisplay","showAvatar","noVideo","avatarDisplay","hasOfflinePresence","connectionStatus","canBeMuted","markedAsRead","actionType","dateStart","lengthInMinutes","appointment","isOverdue","maybeLowerCase","ExternalContactsMixin","maxParticipants","acwNotes","conversationIsAConsult","conversationInitiator","lastPartyTalkingTo","webrtcSession","hasDisplayedDesktopNotification","acceptedByClient","dialingTime","otherPartyJid","setOtherPartyJid","isOtherPartyPerson","connectedDuration","iAmInitiatorOfConsult","otherPartyThatIsNotTheInitiator","partyId","initiatorId","otherParticipantsThatAreNotTheInitiator","aniName","otherPartyThatIsNotTheInitiatorModel","_conversation","userGuidFromParticipant","setLastPartyTalkingTo","connectedParties","lastPartyTalkingToModel","consultOtherParty","initiatorModel","initiatorCall","initiatorConnected","otherPartyThatIsNotTheInitiatorCall","otherPartyThatIsNotTheInitiatorConnected","consultOtherPartyModel","participantModels","communication","isTerminated","isNotSelf","otherPartyModel","personFromStore","otherPartyNumber","doLookup","notTerminatedOrDisconnected","isMonitor","isCoach","isBarge","disconnectedParties","sortedDisconnectedParties","lastDisconnectedPartyModel","selfIsDisconnectedOrTerminated","myState","useDisconnectedParties","allParties","connectedOnConsult","confined","firstCall","sortedParties","callStateA","callStateB","arePartiesDisconnected","recomputeParties","otherDisconnectedParty","isConsult","isOngoing","isStation","isIvr","otherPartiesNoEndTime","otherDisconnectedPartyModel","isDisconnectedQueueCall","setConsultInitiator","nonInitiatorNumber","myConsultId","consultParty","nonInitiator","hasActiveAgent","isMe","isAgent","needsWrapup","isUser","isAlerting","myselfIsMonitor","myselfIsCoach","myselfIsBarged","bargedParticipant","myselfIsMCB","monitoredParticipant","coachedParticipant","monitoredParticipantPerson","coachedParticipantPerson","bargedParticipantPerson","isSelfMCB","peerDisconnectedCall","myselfDisconnectedCall","errorInfoMessage","isIncoming","isRinging","isDialingOrContacting","isContacting","justMyselfOnCall","iAmContacting","theOtherPartyWhileContacting","isMissed","segments","howEnded","lowType","endedWithDisconnect","isConfined","voicemailParties","isConnected","onConsult","others","consultParties","found","markCallAsConsult","consult","canUpdateConsult","consultInitiator","mostRecentEndTime","groupParticipant","currentTimestamp","_groupRingCaller","actualCaller","caller","connectedToStationAndNotConference","anotherPartyIsStation","isStandaloneStation","anotherPartyIsVoicemail","connectedMedia","conversationHasActiveSessionShare","hasActiveMedia","_emailCommunication","TranslationModel","addTranslation","getValue","agentHasRead","evaluationForm","evaluator","redacted","rescore","conversationDate","assignee","declinedReview","displayThumbnail","organization","channelIdProperty","isNewChannel","changesIgnoredByAgent","agentRespondedToPrompt","screenName","channelId","PreferredPhoneContactOrder","PreferredEmailContactOrder","schemaService","schemaType","externalDataSources","externalOrganizationId","createDate","modifyDate","firstName","middleName","lastName","workPhone","cellPhone","homePhone","otherPhone","workEmail","personalEmail","otherEmail","twitterId","lineId","facebookId","whatsAppId","surveyOptOut","schema","customFields","contactType","mergedTo","mergedFrom","canonicalContact","mergeSet","isCurated","isIdentified","canonicalId","divisionName","isCanonical","externalOrganization","belongsTo","externalSystemUrl","createdDate","lastUpdated","hasEmailAddresses","address1","address2","postalCode","twitter","isSalesForce","phoneName","featureKey","featureKeyExt","featureKeyAcceptsSMS","initials","bestEmailAddress","preferredEmailType","_bestEmailType","bestEmailType","bestPhoneNumber","_bestPhoneType","bestPhoneNumberDisplay","bestPhoneType","bestPhoneTypeKey","hasEmailAddress","externalDataSourcesAlert","externalDataSource","platform","salesforceLink","expandedSchema","getSchema","schemaTitle","schemaData","getSetter","websites","isOrganization","companyType","industry","primaryContactId","faxNumber","employeeCount","revenue","tickers","hasMany","website1","website2","Channel","dateCreated","dateModified","workspace","createdBy","contentLength","filename","thumbnails","callerAddress","receiverAddress","isDefaultName","faxName","faxFrom","faxFile","longitude","latitude","ISSUE_REGEX","showEmbedConfirmation","getPreference","showEmbed","isRepo","isGist","isIssue","issueNumber","issue","embedString","shouldEmbed","onSettingsChange","setEmbedPreference","pref","embed","setPreference","disableEmailPii","includeEmailTranscriptions","languagePreference","BASE_GROUP","COMPARATORS","EqualTo","NotEqualTo","GreaterThan","GreaterThanOrEqualTo","LessThan","LessThanOrEqualTo","PROFICIENCIES","acdSkills","lastSavedExpression","isDynamicGroup","_expression","groupTypeValue","actualType","profilePictureURL","activeProfilePicture","x128","placeholderImageForSize","uploadedProfilePictures","uploadedInformalPhotos","areOwnersIncluded","groupEmailAddress","membershipSearchQuery","compiledQuery","generalSearchQuery","isDeleted","chatJid","shortName","allowPermissionGroup","uniqueRoleCount","grantVersion","rolesMap","emailNotificationEnabled","voicemailEnabled","membershipChange","guidOwner","setIdForGroupEntity","existingId","idParts","individual","guidIndividual","ownerIds","profileImageSection","profileImage","deleteGrant","conOp","newCondition","newSkill","languageSkill","routingSkill","subdomain","getPcApplicationsSubdomain","currentDomainName","LibraryModel","responses","BASE_LOCATION","LocationModel","imageHistory","contactPersonId","sublocationOrder","floorplanImage","floorplanImageHistory","profileImages","imagex48","imagex96","imagex128","imagex200","x48","x96","floorCount","subs","isFloor","deleted","hasContactPerson","contactPerson","floorplan","_parent","containsRichAddress","setFloor","roomId","organizer","attendees","notifyAttendees","recurringType","meetingAttendees","_messageCommunication","hasUnifiedCommunications","comms","hasChatEnabled","hasHipaaEnabled","hipaa","_orgDetails","orgDefaultCountryCode","sessionUserOrgCountryCodeValue","orgDetails","defaultCountryCode","orgPreferences","parsedPreferences","_participant","permissionRoutes","updates","sectionValue","clearProperties","changedKeys","originalKeys","fieldKeys","pathKey","contactCenterCount","enterpriseCount","Internal","InternalModel","setupData","hasRecord","_changedKeys","_data","isReloading","pushedData","_notifyProperties","didInitializeData","ChatUserMixin","EntityPresenceMixin","_readWritePermissions","_directReports","_siblings","_superiors","roleIds","expands","_activities","activities","_activityCall","_activityCallback","_activityChat","_activityWebChat","_activityEmail","showConversationSummaryIndicator","onProfilePage","totalCallbacks","totalWebChats","activityValues","email_main","integrationPhone","otherPhones","agentName","socialGroups","getGroupsByType","officialGroups","distributionGroups","ownedGroups","managerId","managerSiblings","groupedOtherRelationships","persons","personEntry","adminAssistants","cachedData","cachedIds","sameIds","_loadingSuperiors","directReportCount","cachedReports","attemptedToLoad","dataDiscrepancy","noDirectReports","doNotLoad","cachedIsSame","isEqual","countHierarchyReports","isContentUser","isContentAdmin","isNotBusy","isCommunicateUser","updatePermissionsOnRouteChange","personDetailController","setPicture","setAgentPicture","imageSection","membershipIds","memberships","getFieldPathForFieldValue","actual","fieldType","filteredEntries","uniq","filteredPaths","_presence","primaryContactInfo","addresses","authorization","fieldConfigs","token","isTrustee","isCloned","userState","inviteLastSent","QueueModel","outboundMessagingAddresses","outboundEmailAddress","directRouting","cannedResponseLibraries","recordingRetryCountMap","callerName","durationMilliseconds","userRecordingDownload","mediaUri","fetchAudio","callRecordingUri","resultUri","resolver","pollingTimeout","apiName","userRecRetryCountKey","userRecRetryCurrent","recordingUri","_type","ResponseModel","texts","substitutions","responseType","messagingTemplate","isOpen","libraryName","isWhatsAppResponse","permissionPolicies","_screenshareCommunication","_socialCommunication","messageArray","mentionRegex","mention","failedMessages","StationModel","webrtcMediaDscp","webrtcForceTurn","persistentConnection","webRtcUserId","webRtcCallAppearances","webRtcRequireMediaHelper","isWebrtc","isRemoteStation","toCheck","isGeneralUnrecoverableAppFailure","isSessionBootstrapFailure","GeneralUnrecoverableAppFailureTypes","SessionBootstrapSteps","_types","hasKey","UserModel","welcomeSent","lastLogin","clientVersions","passwordSaved","_videoCommunication","_loadEPCConversation","VoicemailMessageModel","audioRecordingDurationSeconds","audioRecordingSizeBytes","callerUser","parentIds","note","copiedTo","copiedFrom","useVoicemailApp","loadParticipants","dateFromNow","fromNow","isGroupVoicemail","groupEntity","loadEPCConversation","_userId","fetchCallerName","mutableGroupId","shiftTrade","alternativeShift","timeOffRequest","agentNotification","otherNotificationIdsInGroup","adherenceExplanation","Router","locationType","titleDivider","isAborted","resetNamespace","intent","replaceWith","didTransition","gotoRoute","UnprotectedRouteMixin","ApplicationRouteMixin","onSessionInvalidationFailure","willTransition","postMessageRouteChange","transitionToEntityDetail","linkTo","targetName","performRecentSearch","recent","togglePanel","openPanel","closePanel","toggleCommunicationSidebarExpanded","ensureRouteVisibility","openChatRoom","startChatByJid","_arguments","launchVideoWithPersonById","startCallPersonById","startCallByNumber","originRoute","sessionAuthenticated","stateRestore","popRestoreState","sessionInvalidated","recordLogoutTime","CardDetailRoute","getUserId","person_id","isGuid","afterModel","sendPageData","helpPath","GroupDetailRoute","ModelRouteMixin","updateParentRoute","controller","group_id","currentModel","include","setupController","sidebar","IndexRoute","OAuth2LoginRoute","controllerName","authenticator","_authenticate","loadTranslations","resolvedModel","serializeRestoreState","rejectionDetails","authFailureReason","sensitive","LoginRoute","MaintenanceRoute","_unrecoverableAppFailure","_analytics","buildCommonTelemetryContext","intlService","reloadApp","_reloadApplication","EngageSupervisor","initialIntent","routing","generateURL","appsProblem","unknownApp","currAppName","appPool","app_id","buildStandaloneAppLogMsg","initPoolState","rejectionPoolState","routeAppId","targetRoute","refreshModel","redirectUrl","hashRoute","buildTag","currModel","DEFAULT_PARAMS","performSimpleKeywordSearch","suggest","queries","SEARCH_QUERY_OPERATORS","SEARCH_QUERY_TYPES","addQueries","addTagQuery","addAggregation","SEARCH_AGGREGATE_TYPES","aggregation","setTypes","setReturnFields","Service","resourceTypes","suggestEndpoint","_searchUrl","_suggestUrl","_docUrl","searchDocumentation","normObj","_this$requestBuilder$","defaultAggregations","entityRequest","facetsRequest","aggregateResults","processFacets","performSuggestSearch","orderKeys","RequestBuilder","_extractData","included","toRemove","OUR_COOL_REQUEST_TYPES","ApplicationSerializer","RESTSerializer","isNewSerializerAPI","primaryKey","isPrimaryType","primaryTypeClass","primaryModelClass","finalData","PurecloudSerializer","serialized","attrsToSerialize","changed","changedAttributes","JSONSerializer","convo","EMPTY_MODEL_OBJECTS","EmbeddedRecordsMixin","_normalizeContact","_getPojo","jsonProfile","normalizeDeleteRecordResponse","normalizedPayload","_fillEmptyPropertiesWithModelObjects","normalizeQueryResponse","filledEntities","contacts","externalcontacts/contacts","pageOffset","emptyModel","emptyOrgModel","EMPTY_ORGANIZATION_MODEL","getOwnPropertyNames","_fillPropertyIfNecessary","_step2","_iterator2","defaultData","payloadValue","Set","externalcontacts/external-organizations","_messageChannels","modelKeyFor","normalizeFindRecordResponse","jsonapiPayload","extractId","resourceHash","applyJabberIdFromChat","getJabberId","generateGroupLinkIds","orgGuid","search_key","groupLinks","uuid","generate","cleanFields","extractSectionData","_application","filterMissingFields","requireMediaHelper","extractMeta","payloadKeyFromModelName","serializeAttribute","wordCharsRegex","nonDigitRegex","removeLeadingPlusRegex","itemToFormat","formatFieldConfigEntry","subMsgType","getExtension","formatNumber","numberFormat","E164","addressParts","lookupAddressFormatResultId","fallback","displayText","existingRecord","resolveAddressFormatResult","isEntity","_addressFormat","formatSipAddressForDisplay","strict","formatRawNumber","RateLimitPromise","ObjectProxy","PromiseProxyMixin","isRateLimited","rateLimitResetTime","Symbol","shouldRetryRequest","retryStringToNumber","retryResetTime","headerRateLimit","AjaxService","_timers","enableRetryHeaderParsing","enableAPIDomainRewrites","trustedHosts","purecloudV2Host","_scheduleRequest","retryTime","scheduleTime","reqUrl","addApiDomainIfMissing","isRootAPIRequest","apiDomain","hostname","canParseHeaders","retryDisabled","promiseProxy","shouldRetry","_logPossibleRetryEvent","errorResponse","getAllResponseHeaders","generateDetailedMessage","urlObject","headerCorrelationId","foundKey","getHeader","payloadCorrelationId","commonCtxt","applicationVersion","uiLanguage","envName","isPopout","webDirAgent","platformJsBrowserName","PlatformJS","platformJsBrowserVersion","platformJsProduct","product","platformJsManufacturer","manufacturer","platformJsLayout","platformJsOperatingSystem","os","platformJsDescription","desktopOS","desktopVersion","BRIDGE_CONFIGURATION","deprecation","COOKIES","dragging","browserHidden","iframeFocused","urlprefix","orgspanBaseUri","purecloudBaseUri","realtimeScriptUri","hostedContext","isMobile","mobileQueryParameter","belowMobileThreshold","showLoader","trialSupportDisplayed","debugSettings","offerMobilePreference","offerMobilePreferenceRetreived","currentYear","orgShortName","checkForDebugMode","gatherEnvDetails","initIframeFocusListener","setVisibilityListener","sendEventToDesktop","hasRecentlyLostSubscriptions","_registerTopics","currentRouteClass","deprecatingAlias","systemLocale","setLocale","hidden","visibilityChange","mozHidden","msHidden","webkitHidden","pigeonUserSubscribed","loadStreamingService","authenticated","features","scriptUri","streamingService","getFeatureToggles","runAsMediaHelper","testMediaHelperMode","setupConnection","webrtcRelayOnly","signalIceConnected","disableEOCShortCircuit","referenceStanza","originAppName","APP_NAME","originAppVersion","originAppId","splitHawkAndRealtime","useServerSidePings","customHeaders","Genesys-App","streamingServiceConnect","adminUIContext","systemTopicType","notified","connect","csEnabled","csRunLater","checkContentSquare","csLoaderScript","crossOrigin","syncStreamingConnectionToAuthState","syncVideoChatStateToAdminContext","clearActiveRoomMessagesOnAppFocus","_delayedRefocusChatRoom","delay","refocusActiveRoom","displayTrialSupport","dismissTrialSupport","uvOptions","feedback_tab_name","primary_color","link_color","default_mode","forum_id","searchParams","publishMessage","postMessage","localGCBAUri","changePreferredLanguage","sendDiagnostics","_sendDiagnostics","sendFeedback","checkForMobile","isMobilePhone","showTinyNavMenu","showContextualHelp","isScreenRecordingPopout","isPef","isInteractionPopout","isAdminRoute","cast","setBridgeConfiguration","getQueryParams","debugCookie","buildDebugSettings","orgNameCookie","readOnlyCookie","masonryCookie","DirectoryNavHandler","routerService","canHandle","appApiCall","handle","_handleShowProfile","_handleShowGroup","_appApiCall$get","_appApiCall$get2","TOAST_MSG_PROPS","internalPropName","required","markdownMessage","showCloseButton","showNotificationEverywhere","TOAST_MSG_PROP_NAMES","REQUIRED_TOAST_MSG_PROP_NAMES","apiActionDetails","_this$_processToastPa","_processToastPayload","invalidProps","ignoredProps","validatedToastData","ignored","props","fullTag","requiredCount","filteredPickData","_pick","filteredData","_pickBy","_checkPropValid","_omit","_mapDataToInternalProperties","_mapKeys","isFinite","PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES","SHOW_PROFILE_APP_API_ACTION_NAME","SHOW_TOAST_APP_API_ACTION_NAME","APP_PROTOCOL_CHECK_REG_EXG","ALLOWED_SANDBOX_VALUES","ALLOWED_PERMISSION_VALUES","LIFECYCLE_HOOK_KEYS","LIFECYCLE_KEYS","INTERAPPTION_PROP_MAPPING_CONFIG","destPath","convert","valueIn","typeIn","lifecycleObj","valueType","trustedOnly","APP_ASSET_CATEGORIES","currCategory","standaloneAppPool","standaloneAppPoolVisible","widgetAppPool","externalUrlExemptIntegrationTypeIds","standaloneMaxActivePoolSize","widgetMaxActivePoolSize","_bypassAppCache","globalApiHandlers","REMOTE_APPS_CACHE_TTL_MILLIS","localMsgListener","appsSupported","handleAppApiCall","apiCall","contextualApiHandlers","_handleApiCall","isTrustedApp","appInstance","buildValidInterapption","trustedProvider","buildInterapptionsLogMsg","normalizedConfig","properties","APP_DISPLAY_TYPES","propError","configKeys","currKey","currValue","currPropConfig","_buildApp","_isValidApp","_handleLocalMsg","_isLocalMsg","_appApiCall","parseMessage","parseError","buildApiLogMsg","msgSource","asyncHandlerPromise","availHandler","currHandler","_instrumentApiCall","msgFailureDetails","ApiCall","pcAppProtocol","APPS_API_PROTOCOL","pcAppProtocolAgentName","pcAppProtocolAgentVersion","_addPageAction","apiAction","currPool","_findAllStandaloneApps","_fetchAppsByType","_findAllWidgetApps","findAllInterapptions","_fetchAppsByTypeRemote","_remoteAppPromise","_remoteAppRequestTimestamp","allAppsPromise","lastRequestTs","_accumulateApps","app1","app2","localeCompare","currApp","appsUrl","primaryLocale","_getPrimaryLocale","validAppObjs","currIntegration","internallyHosted","_isInternallyHostedApp","integrationType","effective","intlLocale","intlIsoLocale","appProps","_parseLangTagProp","_parseMultiValueProp","_parseProp","APP_FEATURE_CATEGORIES","ucIntegrationKey","pbxPermission","getCurrentWindowOrigin","isNone","NO_SUPPORTED_COMMUNICATION_TYPE_FILTER","currAssetCategory","currAssetCategoryCfg","currVector","vector","currRasters","_extractRasterImgs","raster","assetCategory","basePath","imgs","currImgKey","parseResult","appType","_validateApp","logMessage","logMessageAppType","fullLogMsg","appUrl","internalAppPath","internalAppSubdomain","subdomainType","internalAppQuery","externalUrl","invalidUrl","integrationTypeId","validItems","propVal","_parseBooleanProp","separator","validatedItems","_langTagRegExps","baseProp","langTagRelProp","baseObj","lenientLangTag","langTagRegExp","langKey","_assetLoader","isJid","peopleQueue","groupQueue","checkCacheForEntity","queueEntity","cachedModel","possibleCache","possibleJid","isDirectoryId","scheduleQueues","_scheduleQueues","_handleQueues","clearQueue","processQueue","FL","resolveResults","missingIds","keyId","respondingTimeout","preferencePaths","mixins","BatchDataRequests","CacheChatRoomsMixin","MessageSplitting","supportedChatWidgets","_Ember$Service","applicationController","widgets","firstRoomChosen","responding","popoutRoom","activeEmpty","messagesPerHistoryRequest","maxHistoryRequestSize","dashboardRooms","mutedRooms","roomHistoryStack","replyMessage","collabChatShowChatSplat","canCorrectMessages","initializePreferences","mutedRoomsValue","preference","roomHistoryStackValue","_chatNotificationVolume","chatNotificationVolume","_interactionNotificationVolume","interactionNotificationVolume","_initNotificationVolumes","_setupRateLimitListener","_startWatchVideoParticipantCount","setMessageReply","_handleRateLimit","requestingJids","_notifyRosterRateLimit","saveMutedRooms","saveRoomHistoryStack","addResponder","respondingTimeoutId","removeResponder","sendChatState","toggleRoomMuted","getRecents","clearRoomUnreadMessages","addRoomToDashboard","messageFailedToSend","_d","sendMessageProxy","setActive","timeoutIdentifier","sendCallback","sendMessage","sendVideoProviderNotification","removeAttachment","fileDescriptor","joinScreenShareRoomViaHawk","rejoiningRoom","_timeoutPromise","checkJid","joinRoom","joinRoomEvent","syncPendingRoomWithStreamingService","changeActiveRoom","joinAcdRoom","leaveAcdRoom","leaveRoom","newRoom","addEmptyRoomObserver","len","roomIsDirty","addPersonToRoom","requestHistory","historyOptions","getMessages","markAsHistory","loadUsersForHistory","setRoomSubject","setPresence","setOrganizationPresenceId","presenceId","setStatus","openRoom","oldOpenRoom","openChatRoomWithVideoForPersonById","openChatRoomForPersonById","loadChatRoom","syncUserChatData","roster","syncAllRoomsLastMessageTime","getAllBadgeCounts","loadRoomHistory","getActiveChatsFromRealtime","_this21","getActiveChats","activeRooms","_this22","activeChatsFromRealtime","checkActiveRoomAgainstHistory","historyStack","lastActiveRoom","mostRecent","selectHighestAppearingActiveRoom","_this23","_args6","clearRoomNotificationCounts","newActive","previousActiveRoom","_this24","attemptRoomChange","removeRoomFromHistoryStack","addRoomToHistoryStack","setRoomDetails","closeRoomAndClearCounts","_this25","_this26","deactivateRoom","setRoomInactive","replacementRoomJid","selectRoomPromise","_this27","getNextRoomFromActiveSection","selectedRoom","updateVolumes","deviceVolumes","_this28","activeRoomJid","newRoomJid","activateRoom","trackRoomChange","focusRoom","setFocused","loadRecentHistoryForAllActiveRooms","loadRecentRoomHistory","loadRoomHistoryWithOptions","loadMoreRoomHistory","loadMoreRoomHistoryAfter","loadContextualRoomHistory","afterDate","_this29","beforePromise","requestRoomHistory","afterPromise","combinedMessages","_addHistoryMessages","_this30","_updateRoomStatus","_this31","_processHistoryResults","_this32","_resolveRealtimeDependentCalls","_this33","deleteParticipantFromChatRoom","_this34","_this35","getRoomInfo","getTargetRoomJid","arg","loadRoomAndUser","userJid","processNewChatMessage","_this36","parseMessageBody","messageModel","parseWidgetData","_this37","child","isActiveRoom","isActiveRoomJid","isRoomVisible","isChatVisible","popoutChatRoom","handleXMPPReferenceMention","_this38","personJid","referenceChildren","handleMentionEvent","_this39","handleCollaborateChatMessage","_this40","isMention","incrementUnreadGroupMessage","_clock","INTERACTION_TYPE","UriBuilder","ConversationMixin","validationWaitTime","getAllActiveConversations","getAllActive","communicationType","addCall","phoneColumn","callNumber","scheduleCallback","callbackUserName","routingData","postData","participantStatus","CONNECTED","disconnectParticipant","DISCONNECTED","unhold","recordingState","unpause","requestAcw","afterCallWorkRequired","skipAcw","disconnect","isDialerCampaign","isSkippingPreviewCampaign","hasPlacedCallsInCallback","communicationWrapupSkipped","park","PARKED","disconnectCall","getWrapUpCodes","getProvisionalACWNotes","provisional","loadParticipantPerson","getParticipantNotes","getAllHistoricalACWNotes","currentParticipantId","_x2","saveProvisionalACW","monitor","transfer","transferType","TERMINATED","cancelTransfer","attributeToMonitor","expectedValue","requestUri","VALIDATION_INTERVAL","VALIDATION_TIMEOUT","interactions","newInteraction","actionHasSucceeded","actualValue","valResolve","destroyObserver","checkForSuccessUpdate","formattedExpectedValues","lowercaseValues","formatExpectedValue","actionSucceeded","createObserver","initiateConsult","customerId","consultBoth","consultConference","consultDestination","consultObject","cancelConsult","initiateSessionShare","sessionCodeUrl","sourceCommunicationId","addCommunicationCode","toId","fromId","mediaRequestOptions","toCommunicationId","fromCommunicationId","expireSessionShareCode","disconnectMediaType","createEmail","toAddress","initializeDraft","emailId","discardDraft","autoFill","discard","loadSMSHistory","messageIds","sendSMSMessage","normalizedMessage","mime","stickerIds","mediaIds","textBody","stickers","createMediaAttachment","createMessage","useExistingConversation","requestOptions","toAddressMessengerType","useUserFromAddress","getMediaAttachment","getSMSDetails","smsIds","getMessageSupportedContent","integrationUri","getDeploymentConfig","deploymentConfigUri","getMessagingSettings","integrationIdConfigUri","createConversationSummaryFeedback","CookiesService","arrayComparerByDeviceId","otherArray","itemInOtherArray","diffListsByDeviceId","existingList","newList","itemsRemoved","itemsAdded","removed","sanitizeDeviceLabel","deviceLabel","sanitizedLabel","webrtcSettings","selectedProfileId","vanillaProfiles","profiles","microphone","outputDevice","notificationDevice","incomingInvitations","deviceUpdateDelay","deviceChanges","recentlyConnectedDevices","allowDisableProfileNotifications","profileSettingsPromise","allowDefaultProfiles","initProfiles","_fetchProfiles","currentMediaState","_handleMediaStateChange","_updateVolumes","selectedProfile","defaultProfileId","defaultExists","directorySettings","mediaState","camerasDiff","microphonesDiff","outputDevicesDiff","isInitialUpdate","hasMicPermissions","videoDevices","audioDevices","outputDevices","cameras","microphones","_updateProfileAvailability","_maybeFixSelectedProfile","_updateRecentlyConnectedDevices","_conditionallyShowToastForAddedDevices","canBeSelected","matchingCamera","matchingOutputDevice","matchingMicrophone","matchingNotificationDevice","_findMatchingDevice","profileCameraIsNotDefault","validWithoutCamera","setProfile","mic","currentProfile","hasOutputDeviceSupport","profileCamera","profileMic","profileOutputDevice","profileNotificationDevice","cameraValid","outputValid","notificationsValid","profileValid","cameraMatches","micMatches","outputDeviceMatches","notificationDeviceMatches","newDevices","_showNotificationForCurrentProfileNoLongerValid","setDevices","outputDeviceVolumes","notificationDeviceVolumes","_getVolumesForDevice","setCallVolume","defaults","volumes","ringerVolume","volumeSettings","_getActionHandler","profileToSet","createProfile","_openPhoneSettingsTab","deviceList","foundDevice","deviceA","_deviceMatches","deviceB","hasSameId","formattedNameA","formattedNameB","hasSameName","addedDevices","filteredSelectableProfiles","disableProfileNotifications","cur","yes","openPreference","no","hasNonDefaultDevices","selectableProfiles","deviceConfig","skipProfileSave","updateSetting","deleteProfile","profileObj","settingsService","saveAndSelectProfile","_callee15","savedProfile","_context15","updateSettings","clearRecentlyConnectedDevices","embeddedStatus","urlSearchParams","isLocallyIntegrated","integrationContext","EmbeddedEvents","ENVIRONMENTAL_DATA","NOTIFICATION","DISMISS_NOTIFICATION","SHOW_NOTIFICATION","PAGE_DATA","LAUNCH_VIDEO_WITH_PERSON_BY_ID","LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID","START_CHAT_WITH_PERSON_BY_ID","UPDATE_PROFILE_IMAGE","START_CHAT_BY_JID","FAVORITE_ENTITY_BY_ID","START_CALL_PERSON_BY_ID","START_CALL_BY_NUMBER","USER_GENERAL_FIELD_UPDATED","EMERGENCY_ADDR_UPDATED","STREAMING_TOPIC_SUBSCRIBE","STREAMING_TOPIC_UNSUBSCRIBE","LISTENERS","NOTIFICATION_ACTION","ENTITY_FAVORITE_ACTION","STREAMING_TOPIC_MESSAGE","STREAMING_TOPIC_SUBSCRIBE_ERROR","IframeClientTimeoutError","_classCallCheck","isEmbedded","getHostOrigin","_newrelicLegacy","setCustomAttribute","checkForHostRedirect","initializeFrame","initializeClient","client","environmentalDataListener","hostOrigin","addListener","hostRootUrl","custom","registerEventHandlers","messaging","toastAction","_event$payload","handleNotificationAction","entityFavoriteAction","handleEntityFavoriteAction","streamingTopicMessage","onMessage","streamingTopicSubscribeError","onSubscriptionError","requestNotification","publish","dismissNotification","showNotification","notifyAcdCount","ACDCOUNT_EVENT","sendSidebarEvent","panel","SIDEBAR_EVENT","requestNavigation","startChatWithPersonById","notifyEmergencyAddrUpdated","favoriteEntityById","entityGeneralFieldUpdated","emergencyAdrUpdated","emergencyAdr","EMERGENCY_ADR_UPDATED","streamingTopicSubscribe","streamingTopicUnsubscribe","emergencyLocationData","loadUserPrimaryNumber","primaryPhoneObject","loadELocationEligibility","supported","clearElocation","did","refreshEmergencyLocation","defaultMessage","startPolling","pollingIntervalInMinutes","pollCounter","pollingIntervalId","_refreshAllEmergencylocationInfo","setElocation","newAddress","eventsService","triggerEvent","EventsService","EXPANDED_PARTICIPANT_PURPOSES","_trackedContacts","oneWay","_handleContactChanged","interactionModel","participantsToExpand","_loop","_ret","currParticipant","rawParticipant","_getContact","delegateYield","generalMessage","errorData","getCanonicalExternalContact","_arguments2","getCanonicalContactSync","contactId","addContactChangeListenersForInteraction","ModelBuilder","prevRaw","currInteraction","prevInteraction","previousContactId","removeContactChangeListener","addContactChangeListener","removeContactChangeListenersForInteraction","contactData","cause","validateDonutPermission","createContactPojo","_watchContactForChanges","contactCallbackData","_updateTrackedContactsAndTopics","_unwatchContactForChanges","unRegisterPriorityTopic","_invokeCallbacks","trackedContactIds","trackedContacts","_trackedContacts$obje","trackedIds","staleContact","staleCanonicalId","freshContact","freshCanonicalId","freshCanonicalContact","eventData","_callbacks","flatMap","_ref6","initialized","_favorites","favoritePromise","loadFavoritesForSessionPerson","initFavorites","getFavorites","peopleAndGroups","_handleHiddenGroups","favoriteStatus","favoriteEntity","unfavoriteEntity","loadedIds","_payload","_feature","urlPath","presignedUrl","presignedUrlResponse","ownerType","ownerId","greetingType","faxUploadWithHeaders","isFullScreen","handleFullScreenChange","fullScreen","webkitIsFullScreen","mozFullScreen","msFullscreenElement","endFullScreen","startFullScreen","requestingElem","messengerElement","orgspanApp","appendTo","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","geoUtil","isEnabled","isSwitchedOn","intervalReference","isStarted","setContext","_lastReport","lastReport","isGeolocationAvailable","_desktopStart","prefs","requestDesktopPromise","cmd","permission_geolocation","t1","_reportCurrentPosition","resultPosition","fetchCurrentPostion","refreshPublicApiUser","_isPrimary","_onPositionSaved","_onErrorSavingPosition","changeCount","roleWithDivisions","incrementChangeCount","_headset","_iframeState","newRelicNamespace","presencePollIntervalSec","presenceIntervalTimers","presenceErrors","presencePollInterval","reducePresencePolling","getFeatureToggle","useIntegrationPresenceDirectorySearch","alreadyTriggeredPresenceInterval","triggerPresenceInterval","presenceUpdateInterval","pollingEnabled","_managePolling","removeAllPresenceIntervals","pollIntervalSec","presenceTimer","_handlePresenceInterval","hasSession","intervals","timerKey","removePresenceInterval","updateSessionData","sessionData","fetchedSession","currentDate","filteredUsers","integrationUsers","integrationUsersIds","batchedIds","authError","_isPresenceStale","_handleBatchPresenceRequest","_handleAuthError","idParams","ucIntegrationId","requestLatest","presenceUserList","presenceResponse","_handleIndividualPresenceResponse","hasShownError","groupedUsers","presenceSources","_groupUsersByIntegration","presenceSource","phoneIntegration","usersGroupedByIntegration","integrationKey","integrationConfig","getIntegration","sendNewRelicAction","diffInMS","_isGCOffline","_entityPresence","_interval","addServerPrefix","safeString","rtlLangs","INTL_LANGUAGES","localeCookieOptions","expires","IntlService","loadedPromise","baseLocale","supportedLocales","_window$navigator","userLanguage","navLocale","isRTL","intlTelInputGlobals","getCountryData","isoRegionalLocale","_this$get$split","_this$get$split2","noEscape","_initialLocale","authLocale","_normalizeLocale","localeRootFallback","rootLocale","getWithServerKey","replacements","suppressError","_missingMessage","locales","validLocales","l","setPreferredLanguage","safeLocale","dynamicCookieOptions","domain","getEnvCookieDomain","secure","_shouldSendSameSiteNone","isSameSiteNoneCompatible","sameSite","isLocale12Hour","_loadedResolve","loadLanguage","translations","cached","setupServerTranslations","defaultRequest","localeRequest","defaultTranslationsResult","localeTranslationsResult","defaultTranslations","localeTranslations","server_translations","currProvider","INTERNAL_VIDEO_PROVIDER_ID","defaultVideoProviders","activeProvider","getProvider","usingVideoProvider","zoomMeetingsEnabled","teamsEnabled","handleLogout","blockLogoutCb","providerName","userHasVideoMediaProviders","computedFromConfig","hasEmberTether","hasLiquidWormhole","hasLiquidTether","destinationElementId","MomentService","defaultFormat","_getNamePart","namePart","_getNames","familyName","givenName","_this$_getNames","givenNameInitial","familyNameInitial","_this$_getNames2","optionalMiddleName","_notificationId","_actionHandles","_clickHandlers","nextNotificationId","currentNotificationId","_cleanUpHandlers","handles","clickHandlers","generatedIdentifier","clickHandlerFunction","handlers","_this$get2","_this$get3","dismiss","_notification","fetchOrgSettings","orgSettings","freeSeating","popoutAuthForIframes","isPermissionInList","targetList","inList","listItems","checkDonutPermission","permissionValue","allowedOrgPermissions","targetDivision","isAllowed","permissionsToValidate","targetDomain","targetEntity","targetAction","domainPermissionMap","isAllowedOrgPermission","actionSet","matchesEntity","matchesAction","matchesDivision","shouldAllowBasedOnDivision","rolePermissions","trusteeOrg","directoryPermissions","donutPermissions","validateAllPermissions","permissionsList","validateAnyPermissions","permissionsSet","hasDirectoryPermissions","hasDonutPermission","canDeleteGroups","canViewQueue","canViewQueueObservations","canViewAcdScreenShare","canViewAcdCoBrowseForCall","canViewAcdCoBrowseForChat","canViewBusinessChat","canViewCollaborateVideo","hasVoicemailAccess","canViewAnAgentsSchedule","hasAgentSupervisorAccess","hasExternalContactsViewContactAccess","legacyUnifiedCommunicationsPermission","canCall","conferenceEnabled","canCallForward","canRecord","isBusinessUserOrSupervisor","hasEngageAccess","hasContactCenter","canViewUsers","canViewGroups","canDeleteParticipantFromGroup","canViewZoomMeetings","canViewTeamsMeetings","canTargetUserSearchOutsideOfDivision","canTargetQueueSearchOutsideOfDivision","canViewIntegrationPresence","canViewUCIntegrations","canViewSummary","GENESYS_SEARCH_TAB","integrations","allApps","_isValidIntegrationTab","onAuthenticated","_fetchConfigs","configs","getIntegrationTabs","canViewThirdPartyPresence","getIntegrationFromSource","getIntegrationTransferTarget","addressObj","allConfigsPromise","_accumulateConfigs","configsUrl","_configs","validConfigObjs","_isValidIntegrationConfig","_mapIntegrationConfig","i10n","badgeIcons","light","dark","clientApp","hasUcIntegrationKey","permissionService","canViewPbxTab","AcdUtilitiesMixin","ActiveCallMixin","CallControlsMixin","CallForwardMixin","ConversationManagerMixin","EventsMixin","PhoneNotificationsMixin","StationMixin","UriBuilderMixin","_processingChain","_initializeProcessingChain","_process2","_process","interactionProcessingChain","QueuedProcessingChain","lifecycleContainer","setProcessingChain","process","eventSource","_getCallState","shouldUpdate","participantState","modelsToDestroy","buildModel","contactObserver","rawData","_onMyConversationEvent","enqueueEvent","_onPigeonConnect","fetchActiveCallConversations","convAPIVersion","onQueue","carrierPigeonConnected","phoneDisabled","phoneDisabledMessage","audioCallCapable","hasMicrophone","stationHasPersistentConnection","persistentConnectionActive","toggleBrowserAnswer","lastConversationError","lastIndexOf","logObject","table","isInteractionViewOpen","isShowCallControlsViewOpen","showFloatingCalls","showNavbarAlert","activeAcdCallState","hasIncomingNonAcdCalls","alertingCall","isAlertingCallACD","bootstrapPurecloudApiOnAuth","delayedNotification","handleMuteParticipants","muteAudio","unmuteAudio","transferToVoicemail","selectedUserUserId","voicemailPolicy","vmAdressString","topicPriority","conversationsummary","outofoffice","eventFromTopic","priorityTopics","customTopicNames","registerTopicsDebouncePeriod","prioritizedTopics","sortedTopics","topicA","topicB","getTopicPriority","priorities","publicApiUser","subscribeUrl","customName","customNames","registerTopic","unshiftObject","unRegisterTopic","_observeTopics","topicKeepAlive","triggerTopicEvent","eventName","carrierPigeonTopic","_emberCopy","topicName","namespaces","syncEnabled","deferredPersistRequests","settingsPath","registerNamespaces","localforage","storeName","getItem","_initializeNamespace","ready","_waitForAccessToken","_enableService","_disableService","_getPreference","persist","_setPreference","namespaceDelimiter","previousSet","setting","setItem","currentNamespaceObject","pendingSet","_safeSet","enableServicePromise","_isNotDead","_enableSync","settingsUrl","preferencesToSync","_saveSettingsFromServer","profileSyncSupport","userPreferences","allLocalPreferences","eventMap","trackedGuids","integrationpresence","events","subscribeToMyself","subscribeToConnection","_getPresenceDefinition","getPresence","getPresenceDefinition","testValue","_getTopicsForUser","_guidFromTopicName","StreamingService","streamingEvent","refreshPeopleActivityState","watchAuthForSubscribe","bulkSubscribeToPresence","callbackKey","previousCallback","newCallback","_alertDeletedPresence","removeDeletedPresence","changeRoutingStatus","doUserPresenceStatusChanged","statusUpdate","isSourceOnUsableList","existingPresenceIndex","existingPresenceObj","presenceListStored","doUserPrimaryPresenceSourceChanged","newSource","isThirdPartySource","handleIntegrationPresenceEvent","presenceEvent","startOfTime","rightAboutMeow","handleRoutingStatusError","conversationSummaryEvent","outOfOfficeEvent","outOfOfficeDef","routingStatusEvent","primaryPresenceEvent","geolocationEvent","_mapping","presenceDefinitions","outOfBandPresenceDefinitions","allPresences","secondary","allActivePresences","primaryPresences","secondaryPresences","allSecondaryPresences","secondaryPresenceDefinitions","loadPresences","definitions","loadAllPresenceDefinitions","definitionIds","currentId","loadPresenceDefinitions","handlePresenceData","presenceTimeout","testing","localizePresenceString","online","not_responding","meal","training","break","getPresenceMappings","presenceString","mapPresence","rawPresence","mapHasPresence","mapHasSystemPresence","getPresenceFallback","_intl","formatPresenceLanguageLabelLocale","languageLabel","presenceDef","_restoreState","inLogoutBounce","_isInLogoutBounce","_clearLogoutTime","baseLocation","searchString","internalRoute","prunedStateParamValue","firstChar","s3SafePathname","parsedStateParam","finalSearch","finalHash","cookieOptions","lastLogout","DEFAULT_ROUTE_MAP","relate-engine","organizations","VERIFICATION_RELEVANT_DATA_MESSAGE","command","adapterCache","isRelateActive","navigationRoute","navTree","helpURL","relateFrameOrigin","profileVerificationEventName","showProfileEventName","contactAssociationMap","contactDisassociationMap","registerSidebarState","getEngineHelp","contextHelpUrls","handleNavigation","navEvent","handleRedirect","propertyWillChange","propertyDidChange","registerNavEntries","navEntries","associateConversationWithInteraction","profileVerified","verificationInteractionData","displayNotification","shouldNotify","processFrameVerificationEvent","closeRelateFrame","isClosedInteraction","relateIframe","postVerificationRelevantDataV2","associatedContacts","hasActiveAssociation","verified","wasAutoVerified","verificationRelevantData","isVerified","activeProfileIsVerified","queryData","siz","errorType","interactionEnded","BrowserScreenRecordingError","ScreenMediaService","_getHostedContext","_isHosted","_stream","_track$getSettings","screens","metadatas","screen","_track","_debugScreenRecordingInBrowser","screenId","originX","originY","resolutionX","resolutionY","getShareableScreens","createMediaStream","getVideoTrackForScreenId","shareid","createTrackMetadata","attemptsRemaining","getHostedScreenMedia","screenInfo","isWindows","main","isMain","_scrollActivity","EsaSessionService","featureService","dataStore","roleNames","readWritePermissionsDeferred","enabledFeatures","products","authInProgress","logoutInProgress","singleSignOutInProgress","blockers","_timeAuthenticated","hasAppAccess","hasDirectoryUserViewPermission","perm","hasTrusteeAccess","hasDivision","hasDivisions","regEx","isPermission","isPermissionWithDivisions","permissionDivisions","foundPermission","useEmailDraftEvent","rewriteRootAPIRequests","createFieldConfigs","_Object$values","createPresences","loadAllowedOrgPermissions","loadOrgProducts","getOrganizationTranscriptSettings","transcriptSettings","settingsUri","forceDirectory","bootstrapStartTime","performance","_serialProcessingChain","executeChain","stepDesc","getFeatures","processSync","setThemeCookie","trusteeBootstrap","establishSession","setupCarrierPigeon","updateAppSession","hasAssistantsQueueViewPermission","loggingConfig","logMsgPrefix","bootstrapDuration","isChainStepFailure","origReason","legacyErrorCode","telemetryContext","loggableRequestFailureDetails","_request","getLoggableRequestFailureDetails","requestFailureDetails","setServerTimeOffset","setupStoreData","serverError","onLegacySessionInvalidation","LOGOUT_PROMISE_PROP_NAME","logoutPromise","addRemoveBlockers","blocker","proxyLogin","retrieveProxyLoginInfo","isFeatureEnabled","featureName","redirect","cookieProxyPerson","shouldReload","superPerson","hashIndex","forceUpdate","localFeatures","featureToggles","serverDate","t2","t3","clientSystemTimeSuspect","serverTimet1","clientTimet3","clientTimet0","offsetCalculated","subscription","xhrFields","withCredentials","baseExpands","resetPassword","newPassword","resetToken","currentPassword","oldPassword","verifyPassword","publicApiUserObserver","_setupSessionInvalidationFailed","_forwardSessionInvalidationFailedEvent","_teardownSessionInvalidationFailed","_isDesktop","_isDesktopUnifiedPreferences","supportsUnifiedPreferences","canShowChatPreference","canShowAgentGreeting","canShowGeneralPreference","canShowPasswordPreference","canShowNotificationsPreference","isIE","isDesktop","isUnified","canShowVoiceMailPinPreference","canShowDirectRoutingPreference","_commonPreferenceComponents","theme","direct_routing","agent_greeting","commonPreferences","components","canShow","getThemeList","commonPreferencesSortOrder","customPreferences","addPreference","existingPreference","newPreference","removePreference","otherPreferences","canOpenPreference","preferenceKey","openChatPreference","openGeneralPreference","openLanguagePreference","openNotificationsPreference","openPasswordPreference","openSoundPreference","openVideoPreference","openVoiceMailPinPreference","getUserVoicemailEmailNotification","_yield$_this2$get$aja","setUserVoicemailEmailNotification","_sound","GLOBAL_ERROR","SILENCED_ERRORS","statusText","lengthInUtf8Bytes","MAX_INTERNAL_LOG_ITEMS","internalLogs","logCounts","failureCount","_originalLogger","ExponentialIntervalGenerator","LOG_LEVELS","bindLogMethods","resetLogLimit","loggingOptions","serverLevel","localLevel","propertyToMatch","bufferLog","getOriginalLogger","restrictedTypeConverter","stack","currentRoute","timeSinceLogin","fullTypeConverter","createTrace","logItem","itemToLog","_restrictTraceData","clientTime","clientSessionId","allowedKeys","_itemToLog","keyFilter","_objects","extractRawData","maxDepth","_augmentSensitiveData","finalLogItem","wrappedSensitive","checkItemsAgainstOptions","logOption","itemsToLog","defaultAnswer","itemLogIndex","logResult","_len","_key","checkForSilence","SILENCED","silencedByStringMatch","silencedByRegex","silencedByMatcher","skipSumoSend","serverLogLevelIndex","logServer","logLocal","trace","shiftObject","decreaseLogLimit","currentLimit","maxTracesByteLength","getTracesToLog","logs","toLog","totalLogSize","logSize","saveLogs","_saveLogsTask","toSend","sendLogTraces","_resetLogsOnSuccessfulSave","fail","keepLatest","maxConcurrency","backOffTask","getInterval","batches","ApplicationStore","Store","GroupStoreMixin","SearchStoreMixin","applicationAdapter","promiseLabel","personResult","groupResult","latestCalls","batchLimit","batch","successfulRequests","failedRequests","mapLimit","bulkResults","didSaveRecord","internalModel","recordInfo","isSaving","updateGroup","connection","connectedV2","v2Deferred","v2Promise","connectionPromise","_textMeasurer","_userActivity","_userIdle","_jabraChrome","_jabraNative","_plantronics","_sennheiser","eventTypes","UserIdleService","IDLE_TIMEOUT","activeEvents","setListening","enableEvent","disableEvent","pendingSessions","conversationsToAutoAnswer","_instrumentSdkUsage","sdkFunction","pageActionName","_startParams","_devices","_volume","ensureVideoPermissions","ensureAudioPermissions","_params","rejectPendingSession","findRemainingSessionsBasedOnParams","_conversationId","_sessionType","endSession","_endSessionParams","_muteOptions","_heldOptions","getAllActiveSessions","defaultGeneralSettings","ringtoneSelection","advancedMicSettings","autoGain","noiseSuppression","defaultDirectorySettings","alwaysPopoutVideo","userSettingsPromise","failedSettingsFetch","_fetchSettingsPromise","_updatePromise","_fetchSettings","_checkAndFixSettings","_updateSettings","reallyWaitForToken","forceRefresh","retryOnFail","_settings","existingPromise","_this5$get","generalSettings","settingPath","pieces","topLevelKey","piece","_handleSettingsChanged","updatedSettings","_webrtc","BaseStore","LocalStorageStore","storageKey","currEnvDetails","storeProps","_xSelect","Transform","deserialize","deserialized","_json","_object","_maybe","_pigeon","assertNever","actionName","contactJSON","derived","hasMultipleCustomers","isCallOrCallback","communications","customerEndTime","lastParticipantEndTime","callsError","interactionMetadata","metadataClone","__interaction_metadata__","ALERTING","CONNECTING","CONTACTING","DIALING","OFFERING","TRANSMITTING","CHAT","EMAIL","VOICE","ABANDONED","ACW","ANSWERED","CUSTOMERS_WAITING","HANDLE","HELD","INTERACTING","IVR","OFFERED","OVERSLA","SERVICE_LEVEL","SERVICE_TARGET","TALK","TIME_IN_STATUS","TRANSFERRED","WAIT_TIME","ACTIVE_MEMBERS","queryParamSegments","keyValuePair","queryParamString","urlParams","interactionDetailPath","adminAgentSegment","_buildAppProviderComputed","providerConfig","_Ember","validProviders","validProvider","boolExpr","oldProvider","providerInstance","_booleanExpressions","buildSymbolMap","ft","keyName","evaluateProviderExpression","_buildProviderConfig","providerConfigMap","_boonJs","getEvaluator","currDependencies","_curr$value$split","_curr$value$split2","valueTag","portToValidate","defaultPort","portInt","isTrusted","renderedInstance","appDef","trustedDataPassing","isVisible","userVisible","_serviceDiscoveryWebInternal","isKnown","validationChecks","invalidReason","invalidReasons","validations","_validations","validation","validationConfig","SDK_REPO_URL","LOG_STANDALONE_APP_NAMESPACE","LOG_INTERAPPTIONS_NAMESPACE","LOG_ROOT_NAMESPACE","LOG_API_NAMESPACE","subNamespaces","currNamespace","_len2","_key2","_len3","_key3","buildStashLoggerDetails","logDetails","_objectSpread","remote","mask","buildViewId","isAppDefV2","isAppContext","buildV1IconAsset","asset","fromEntries","decorative","buildV2IconAsset","RASTER_PROP_PATTERN","rasterEntries","currProp","currRasterProp","currRasterValue","_images$","rej","symbolEvaluator","symbolMap","identifiers","currIdentifier","variable","nsSymbolEvaluator","expressionBuilder","_browser","_codeUtils","parseFloat","userUri","_debugBackburner","_debugRsvp","_displayGeolocation","API_ERROR_MESSAGES","messageType","smiles","defaultSkinTone","lightSkinTone","mediumLightSkinTone","mediumSkinTone","mediumDarkSkinTone","darkSkinTone","nature","objects","places","symbols","escapedString","k","isHTMLSafe","theString","HTMLChars","char","literal_string","maxInterval","baselineInterval","_failures","_baselineInterval","_maxAdditionalInterval","expInterval","generatedMaxInterval","KNOWN_INBOUND_MESSAGE_SUBTYPES","getMessengerType","messengerType","messagingChannelType","messagingChannelTypes","mct","isNewId","getIdsFromExternalContact","freshContactSnapshot","channelRecord","_getChannelRecordInfo","interactionChannel","getInteractionChannel","getMessageChannelType","interactionChannelProperties","idAttribute","idOrIDs","getChannelRecordInfo","CHANNEL_MODEL_TYPE","numberOfChanges","idPropertyName","setNewValuesInChannelRecord","channelRecordData","messagingChannelTypeFor","modelProperties","getIdFrom","contactChannelIds","notExcluded","CHANNEL_RECORD_PROPERTIES","updateChannelInfoPrompt","updateChannelInfoPromptPlural","updateAllChannelInfoPrompt","newChannelPrompt","pleaseWaitForFullContactInfo","propertyChanged","IDS","getIdentifier","getReverseWhitepagesLookupValue","getDisplayableName","displayOrScreenName","getDisplayOrScreenName","contactChannelIdValues","interactionIdValues","addedIds","newIdValues","idVal","addOrReplaceIdsInChannelRecord","acdHybridToastNoActiveQueue","acdSecurePause","acdTransferPermissions","ACT-1205","AGORA-137_connections-ui-contentsquare","ATLAS-536_EnableContentSquare","auraACWGadgets","comui-disable-legacy-api-url","conversationSummary3256","digitalFirstPURE2942","EC-760","enableUIAjaxRetryHeader","epcDecompPresenceLabel","gcucc-ui-PCUCC-3734","gcucc.ui.useIntegrationPresenceSourceDirectorySearch","groupProileNoIndividualsSave","hawkClientScreenShare","interactionNameQueueCallingQueue","notificationOutputPicker","PAUI-80.PeopleUiDecomposition","playRecordingFromSelectedOutput","PURE-3256_useConversationDetails","PURE-6186_Scripter_Gadget_GCUI","PURE-7064_search_favorites","PURE3301-dynamicGroups","qm.release.evaluation.assignee","qm.release.evaluation.disputes","relateDynamicSchema","showVideoInThumbnail","webrtcClientNetworkProbeAutoAdjust","webrtcDefaultDeviceProfile","webrtcDisableDeviceProfileNotifications","webrtcMMSDnsCheck","webrtcTrackBasedActions","webUiDarkTheme","_isSafeToFocus","currentSelectedElement","isSafe","GeolocationUtil","requiresNativeGeolocation","getCurrentPosition","watchPosition","onPositionChangedFn","onErrorFn","clearWatch","watcher","failure","Giphy","apiKey","api_key","rating","gsm7Chars","gsm7CharsExt","_applicationHasFocus","_hostType","_operatingSystem","_version","_hostRegion","_supportsRegions","_supportsUnifiedPreferences","_supportsJabra","_additionalPreferences","_requiresNativeGeolocation","previousPresence","isScreenLockedOrSleep","hasUserAlreadyReturn","desktopSleptAt","isHostedProp","getRegion","supportsRegions","supportsJabra","isMac","getAdditionalPreferences","doTerminateApplication","completion","_HostedContextFunctions","doesAppHaveFocus","showNativeNotification","setUnreadMessageCount","sendJabraEventToDesktop","deviceID","JABRA_EVENT","requestJabraDevices","getScreenMedia","matchedRegion","sCmd","cefQuery","persistent","onFailure","FILE_SIZE","MESSAGE_TYPE","CHARACTER_LIMIT","extraOptions","nationalMode","utilsScript","buildIntlTelInputI18n","I18N_FALLBACKS","translate","getLocalizedCountryName","fallbackName","DisplayNames","displayNames","of","buildSelectedCountryAriaLabel","selectedCountryLabel","countryName","selectedCountry","selectedFlag","selectedCountryAriaLabel","countryListAriaLabel","zeroSearchResults","oneSearchResult","multipleSearchResults","WHITE_SPACE_KEYCODES","TAB","ENTER","SPACE","WHITE_SPACE_KEYS","CAP_ALPHA_KEYCODES","LOW_ALPHA_KEYCODES","NUM_KEYCODES","NAV_KEYCODES","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","keyForKeyCode","isAlphabet","isWhitespace","isEscape","isTab","fromCharCode","isApplicationRoute","defaultRender","md","renderer","link_open","renderToken","targetIndex","attrIndex","attrGet","isMailTo","attrPush","attrSet","markdown","render","hljs","configure","markdownit","linkify","typographer","highlightAuto","layoutId","LAYOUTS","getRawAddress","_externalContactMessaging","getNameFrom","getModelProperties","idProperties","getDisplayablePhoneNumberFrom","INTERNATIONAL","_getChannelPropertiesFromInteraction","channelType","displayableName","twitterHandle","getChannelPropertiesFromExternalContact","getChannelPropertiesFromInteraction","present","hasCrucialChannelInfo","displayNameFrom","getTwitterDisplayNameFrom","svgIconKey","scopedId","nestedIdProperty","oldIdValue","newIdValue","initialsSupported","OnlyLatinChars","VALID_LOCAL_HOSTNAMES","ENV_TRANSITIONS","prod","DEPLOYMENT_ID_MAP","prod-apne1","prod-apne2","prod-aps1","prod-apse2","prod-cac1","prod-euc1","prod-euw1","prod-euw2","prod-usw2","REGION_TRANSLATION_KEY_MAP","getEnv","getDeploymentId","getRegionTranslationKey","getDesktopId","serviceDiscovery","getEnvironments","translationKey","envStatus","STABLE_PUBLIC_ENVS","parseRuntimeFromLocalPath","parseDeployedRuntime","_window","newrelic","actionNameType","attrType","reservedKeys","attrKey","keyType","persistType","ALLOWED_VALUE_TYPES","safeOptions","MAX_SAFE_INTEGER","excludeUnderscoreKeys","excludeEmberServices","excludeEmberApplications","valueFilter","inputType","myTypeOf","_extractRawDataHelper","contextStack","currStackItem","currLevel","currItem","currIndex","currStack","buildNewContextStack","customJsonValue","propertyName","wrappedJsonError","baseError","newStackItem","PHONE_NUMBER_REGEX","proxy","tap","MSG_NAMESPACE","_defaultLabel","_chain","_processingQueueMap","_buildErrorMessage","isValidProcessor","appendToChain","processor","_isLifecycleValid","workQueue","unshift","_checkForWork","emptyQueueIds","currQueueId","currQueue","activeWorkItem","_processEventThroughChain","_buildLoggerMessage","chainLabel","chainIndex","_chainHelper","processorResult","processorResultType","processorLabel","_safeLabel","AdapterError","adapterError","payloadDetails","statusInt","isUuid","getLoggableRequestFailureDetailsPartial","getAdapterErrorLoggableDetails","getAjaxErrorLoggableDetails","rawErrorResponse","UUID_REGEXP","_routingStatus","isSyncPromiseChainStep","chainLength","currChainStep","stepIndex","stepProgress","logPayload","SimpleCache","ttlMinutes","expirationTime","cachedItem","setupRecorder","clearStream","audioContext","suspend","mimeType","isTypeSupported","blobURL","getBlobUrl","loadEncoder","encoderPath","resume","_streamReady","_stoppedRecording","_onDataAvailable","initStream","resumeRecording","pauseRecording","createHowlFromBlob","blobUrl","_loadSoundRecorder","_loadWorker","getScript","currentTheme","_cookie$split","_cookie$split2","DEFAULT_THEME","_ref3$theme","THEME_CLASSES","LIGHT","_ref3$duration","_ref3$path","_ref3$protocol","_getCurrProtocol","_ref3$domain","_ref3$setCookie","setCookie","_setCookie","_ref3$userAgent","_getCurrUserAgent","cookieStmt","DARK","BASE","BASE_THEME_LIST","extraThemes","_ref2$theme","_ref2$element","NATIVE_PANELS","deprecatedConversationSummaryPanelIds","currPanelId","CONVERSATION_DETAILS_GADGET_PANEL_ID","WRAPUP_GADGET_PANEL_ID","transformationMaps","shouldTransformPanelSetting","panelSetting","transformPanelSetting","shouldTransformAppDefId","appDefId","addNativeProvider","transformAppDefId","dependentFeatureToggles","reverseDetails","reverseNotes","reverseWrapup","reverseResponses","reverseScheduleCallback","scripts","transformationDependentFeatureToggles","buildTransformationFtComputedDepKey","injectionPrefix","standardTransformationFtComputedDepKey","requiredTransform","srcNativePanelMatch","findNativePanel","toSearch","nativePanel","currNativePanel","includedNativeProvider","TtlCache","defaultTtl","normalizeTtl","cacheData","tearingDown","expiryCheck","_this$cacheData$key","ttl","currTimeMillis","effectiveTtl","expirationTimestamp","scheduleEviction","_this$cacheData$key2","removedExpirationTimestamp","nextExpirationTimestamp","clearEvictionTimer","timerRef","requestedTimestamp","getEarliestExpirationTimestamp","evictExpiredItems","cacheEntry","earliestExpiration","haystack","needle","_haystack","paramReplace","getAppsDownloadUri","downloadId","_uuidGenerator","_videoFrameChecker","_alias","_belongsTo","_collection","_confirmation","_date","_dependent","_dsError","_exclusion","_format","_hasMany","_inclusion","_length","_messages","_number","_videoParticipantV","_videoParticipant","templateName","_webrtcConversation","runningTests","@purecloud/ember-purecloud-components","@purecloud/ember-softphone-integration","ar","da","de","en-us","es","fi","fr-ca","fr","he","hi","it","ja","ko","nl","pl","pt-br","pt-pt","ru","sv","tr","uk","zh-cn","zh-tw"],"mappings":"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J,KAAK45N,EACD55N,EAAe;AACf;AACJ,KAAK45N,EACD55N,EAAe;AACf;AACJ,KAAK45N,EACD55N,EAAe,4CAI3B,OAAOA;;AC3BX,MAAuB,CACnB85N,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ9tQ,OAAQ,CACJ+tQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACvgCR,MAAuB,CACnBxuQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,WACA,WACA,cACA,cACA,cACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,MAEJquQ,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,QAEJC,QAAS,CACL,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA;;ACxnBR,MAAuB,CACnBV,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJ9tQ,OAAQ,CACJ+tQ,gBAAiB,CACb,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,QACA,QACA,QACA,QACA,QACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,MAEJC,cAAe,CACX,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,oBAAqB,CACjB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,eAAgB,CACZ,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,mBAAoB,CAChB,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,QAEJC,aAAc,CACV,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OACA,OACA,OACA,OACA,SAGRC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,QAAS,CACL,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEJC,OAAQ,CACJ,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OAC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AKi/B,QAAX,WACHnS,EAAO,CACTklC,IAAKl8B,EACLiyQ,QAAS/nS,KAAK8nS;AAElB,OAAO,EAAA9yL,EAAAjiG,SAAQxJ,EAAK,CAAEujB,KAAAA,IAAQ3W,MAAK,SAAAmhB,GAAG,OAAIA,GAAOA,EAAIxK,gDAI9C,IAAI+6Q,EAAM;;AClCzB,MAmIe,CAAEI,UAnIC,CACd,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAIwBC,aAFP,CAAC,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK;;ACpHrE,IAAIh6I,EAAgB96H,MAAM5oB,OAAOyoB,OAAOG,MAAMkwI,QAAS,CACnDz6H,mBAAoBzV,MAAMC,OAAOC,QAAQ,eACzCH,OAAQC,MAAMC,OAAOC,QAAQ,gBAC7BipN,sBAAuB,KAEvB4rD,sBAAsB,EACtBC,UAAW,KACXC,iBAAkB,GAClBC,SAAU,YAEVC,YAAa,KACbC,kBAAkB,EAClBC,6BAA6B,EAC7BC,gBAAgB,EAChBC,uBAAwB,GACxBC,4BAA4B,EAC5B/8D,kBAAkB,EAClBg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","file":"connections-ui.js","sourcesContent":["\"use strict\";\n\n\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.adapter = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n  return {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    var trackId = transceiver.rtpSender._initialTrackId ||\n        transceiver.rtpSender.track.id;\n    transceiver.rtpSender._initialTrackId = trackId;\n    // spec.\n    var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n        trackId + '\\r\\n';\n    sdp += 'a=' + msid;\n    // for Chrome. Legacy should no longer be required.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n\n    // RTX\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n  var commonCapabilities = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: []\n  };\n\n  var findCodecByPayloadType = function(pt, codecs) {\n    pt = parseInt(pt, 10);\n    for (var i = 0; i < codecs.length; i++) {\n      if (codecs[i].payloadType === pt ||\n          codecs[i].preferredPayloadType === pt) {\n        return codecs[i];\n      }\n    }\n  };\n\n  var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n    var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n    var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n    return lCodec && rCodec &&\n        lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n  };\n\n  localCapabilities.codecs.forEach(function(lCodec) {\n    for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n      var rCodec = remoteCapabilities.codecs[i];\n      if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n          lCodec.clockRate === rCodec.clockRate) {\n        if (lCodec.name.toLowerCase() === 'rtx' &&\n            lCodec.parameters && rCodec.parameters.apt) {\n          // for RTX we need to find the local rtx that has a apt\n          // which points to the same local codec as the remote one.\n          if (!rtxCapabilityMatches(lCodec, rCodec,\n              localCapabilities.codecs, remoteCapabilities.codecs)) {\n            continue;\n          }\n        }\n        rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n        // number of channels is the highest common number of channels\n        rCodec.numChannels = Math.min(lCodec.numChannels,\n            rCodec.numChannels);\n        // push rCodec so we reply with offerer payload type\n        commonCapabilities.codecs.push(rCodec);\n\n        // determine common feedback mechanisms\n        rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n          for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n            if (lCodec.rtcpFeedback[j].type === fb.type &&\n                lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n              return true;\n            }\n          }\n          return false;\n        });\n        // FIXME: also need to determine .parameters\n        //  see https://github.com/openpeer/ortc/issues/569\n        break;\n      }\n    }\n  });\n\n  localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n    for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n         i++) {\n      var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n      if (lHeaderExtension.uri === rHeaderExtension.uri) {\n        commonCapabilities.headerExtensions.push(rHeaderExtension);\n        break;\n      }\n    }\n  });\n\n  // FIXME: fecMechanisms\n  return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n  return {\n    offer: {\n      setLocalDescription: ['stable', 'have-local-offer'],\n      setRemoteDescription: ['stable', 'have-remote-offer']\n    },\n    answer: {\n      setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n      setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n    }\n  }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n  // Edge's internal representation adds some fields therefore\n  // not all fieldѕ are taken into account.\n  var alreadyAdded = iceTransport.getRemoteCandidates()\n      .find(function(remoteCandidate) {\n        return candidate.foundation === remoteCandidate.foundation &&\n            candidate.ip === remoteCandidate.ip &&\n            candidate.port === remoteCandidate.port &&\n            candidate.priority === remoteCandidate.priority &&\n            candidate.protocol === remoteCandidate.protocol &&\n            candidate.type === remoteCandidate.type;\n      });\n  if (!alreadyAdded) {\n    iceTransport.addRemoteCandidate(candidate);\n  }\n  return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n  var e = new Error(description);\n  e.name = name;\n  // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n  e.code = {\n    NotSupportedError: 9,\n    InvalidStateError: 11,\n    InvalidAccessError: 15,\n    TypeError: undefined,\n    OperationError: undefined\n  }[name];\n  return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n  // https://w3c.github.io/mediacapture-main/#mediastream\n  // Helper function to add the track to the stream and\n  // dispatch the event ourselves.\n  function addTrackToStreamAndFireEvent(track, stream) {\n    stream.addTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n        {track: track}));\n  }\n\n  function removeTrackFromStreamAndFireEvent(track, stream) {\n    stream.removeTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n        {track: track}));\n  }\n\n  function fireAddTrack(pc, track, receiver, streams) {\n    var trackEvent = new Event('track');\n    trackEvent.track = track;\n    trackEvent.receiver = receiver;\n    trackEvent.transceiver = {receiver: receiver};\n    trackEvent.streams = streams;\n    window.setTimeout(function() {\n      pc._dispatchEvent('track', trackEvent);\n    });\n  }\n\n  var RTCPeerConnection = function(config) {\n    var pc = this;\n\n    var _eventTarget = document.createDocumentFragment();\n    ['addEventListener', 'removeEventListener', 'dispatchEvent']\n        .forEach(function(method) {\n          pc[method] = _eventTarget[method].bind(_eventTarget);\n        });\n\n    this.canTrickleIceCandidates = null;\n\n    this.needNegotiation = false;\n\n    this.localStreams = [];\n    this.remoteStreams = [];\n\n    this._localDescription = null;\n    this._remoteDescription = null;\n\n    this.signalingState = 'stable';\n    this.iceConnectionState = 'new';\n    this.connectionState = 'new';\n    this.iceGatheringState = 'new';\n\n    config = JSON.parse(JSON.stringify(config || {}));\n\n    this.usingBundle = config.bundlePolicy === 'max-bundle';\n    if (config.rtcpMuxPolicy === 'negotiate') {\n      throw(makeError('NotSupportedError',\n          'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n    } else if (!config.rtcpMuxPolicy) {\n      config.rtcpMuxPolicy = 'require';\n    }\n\n    switch (config.iceTransportPolicy) {\n      case 'all':\n      case 'relay':\n        break;\n      default:\n        config.iceTransportPolicy = 'all';\n        break;\n    }\n\n    switch (config.bundlePolicy) {\n      case 'balanced':\n      case 'max-compat':\n      case 'max-bundle':\n        break;\n      default:\n        config.bundlePolicy = 'balanced';\n        break;\n    }\n\n    config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n    this._iceGatherers = [];\n    if (config.iceCandidatePoolSize) {\n      for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n        this._iceGatherers.push(new window.RTCIceGatherer({\n          iceServers: config.iceServers,\n          gatherPolicy: config.iceTransportPolicy\n        }));\n      }\n    } else {\n      config.iceCandidatePoolSize = 0;\n    }\n\n    this._config = config;\n\n    // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n    // everything that is needed to describe a SDP m-line.\n    this.transceivers = [];\n\n    this._sdpSessionId = SDPUtils.generateSessionId();\n    this._sdpSessionVersion = 0;\n\n    this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n    this._isClosed = false;\n  };\n\n  Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n    configurable: true,\n    get: function() {\n      return this._localDescription;\n    }\n  });\n  Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n    configurable: true,\n    get: function() {\n      return this._remoteDescription;\n    }\n  });\n\n  // set up event handlers on prototype\n  RTCPeerConnection.prototype.onicecandidate = null;\n  RTCPeerConnection.prototype.onaddstream = null;\n  RTCPeerConnection.prototype.ontrack = null;\n  RTCPeerConnection.prototype.onremovestream = null;\n  RTCPeerConnection.prototype.onsignalingstatechange = null;\n  RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n  RTCPeerConnection.prototype.onconnectionstatechange = null;\n  RTCPeerConnection.prototype.onicegatheringstatechange = null;\n  RTCPeerConnection.prototype.onnegotiationneeded = null;\n  RTCPeerConnection.prototype.ondatachannel = null;\n\n  RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n    if (this._isClosed) {\n      return;\n    }\n    this.dispatchEvent(event);\n    if (typeof this['on' + name] === 'function') {\n      this['on' + name](event);\n    }\n  };\n\n  RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n    var event = new Event('icegatheringstatechange');\n    this._dispatchEvent('icegatheringstatechange', event);\n  };\n\n  RTCPeerConnection.prototype.getConfiguration = function() {\n    return this._config;\n  };\n\n  RTCPeerConnection.prototype.getLocalStreams = function() {\n    return this.localStreams;\n  };\n\n  RTCPeerConnection.prototype.getRemoteStreams = function() {\n    return this.remoteStreams;\n  };\n\n  // internal helper to create a transceiver object.\n  // (which is not yet the same as the WebRTC 1.0 transceiver)\n  RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n    var hasBundleTransport = this.transceivers.length > 0;\n    var transceiver = {\n      track: null,\n      iceGatherer: null,\n      iceTransport: null,\n      dtlsTransport: null,\n      localCapabilities: null,\n      remoteCapabilities: null,\n      rtpSender: null,\n      rtpReceiver: null,\n      kind: kind,\n      mid: null,\n      sendEncodingParameters: null,\n      recvEncodingParameters: null,\n      stream: null,\n      associatedRemoteMediaStreams: [],\n      wantReceive: true\n    };\n    if (this.usingBundle && hasBundleTransport) {\n      transceiver.iceTransport = this.transceivers[0].iceTransport;\n      transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n    } else {\n      var transports = this._createIceAndDtlsTransports();\n      transceiver.iceTransport = transports.iceTransport;\n      transceiver.dtlsTransport = transports.dtlsTransport;\n    }\n    if (!doNotAdd) {\n      this.transceivers.push(transceiver);\n    }\n    return transceiver;\n  };\n\n  RTCPeerConnection.prototype.addTrack = function(track, stream) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call addTrack on a closed peerconnection.');\n    }\n\n    var alreadyExists = this.transceivers.find(function(s) {\n      return s.track === track;\n    });\n\n    if (alreadyExists) {\n      throw makeError('InvalidAccessError', 'Track already exists.');\n    }\n\n    var transceiver;\n    for (var i = 0; i < this.transceivers.length; i++) {\n      if (!this.transceivers[i].track &&\n          this.transceivers[i].kind === track.kind) {\n        transceiver = this.transceivers[i];\n      }\n    }\n    if (!transceiver) {\n      transceiver = this._createTransceiver(track.kind);\n    }\n\n    this._maybeFireNegotiationNeeded();\n\n    if (this.localStreams.indexOf(stream) === -1) {\n      this.localStreams.push(stream);\n    }\n\n    transceiver.track = track;\n    transceiver.stream = stream;\n    transceiver.rtpSender = new window.RTCRtpSender(track,\n        transceiver.dtlsTransport);\n    return transceiver.rtpSender;\n  };\n\n  RTCPeerConnection.prototype.addStream = function(stream) {\n    var pc = this;\n    if (edgeVersion >= 15025) {\n      stream.getTracks().forEach(function(track) {\n        pc.addTrack(track, stream);\n      });\n    } else {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      // Fixed in 15025 (or earlier)\n      var clonedStream = stream.clone();\n      stream.getTracks().forEach(function(track, idx) {\n        var clonedTrack = clonedStream.getTracks()[idx];\n        track.addEventListener('enabled', function(event) {\n          clonedTrack.enabled = event.enabled;\n        });\n      });\n      clonedStream.getTracks().forEach(function(track) {\n        pc.addTrack(track, clonedStream);\n      });\n    }\n  };\n\n  RTCPeerConnection.prototype.removeTrack = function(sender) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call removeTrack on a closed peerconnection.');\n    }\n\n    if (!(sender instanceof window.RTCRtpSender)) {\n      throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n          'does not implement interface RTCRtpSender.');\n    }\n\n    var transceiver = this.transceivers.find(function(t) {\n      return t.rtpSender === sender;\n    });\n\n    if (!transceiver) {\n      throw makeError('InvalidAccessError',\n          'Sender was not created by this connection.');\n    }\n    var stream = transceiver.stream;\n\n    transceiver.rtpSender.stop();\n    transceiver.rtpSender = null;\n    transceiver.track = null;\n    transceiver.stream = null;\n\n    // remove the stream from the set of local streams\n    var localStreams = this.transceivers.map(function(t) {\n      return t.stream;\n    });\n    if (localStreams.indexOf(stream) === -1 &&\n        this.localStreams.indexOf(stream) > -1) {\n      this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n    }\n\n    this._maybeFireNegotiationNeeded();\n  };\n\n  RTCPeerConnection.prototype.removeStream = function(stream) {\n    var pc = this;\n    stream.getTracks().forEach(function(track) {\n      var sender = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (sender) {\n        pc.removeTrack(sender);\n      }\n    });\n  };\n\n  RTCPeerConnection.prototype.getSenders = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpSender;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpSender;\n    });\n  };\n\n  RTCPeerConnection.prototype.getReceivers = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpReceiver;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpReceiver;\n    });\n  };\n\n\n  RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n      usingBundle) {\n    var pc = this;\n    if (usingBundle && sdpMLineIndex > 0) {\n      return this.transceivers[0].iceGatherer;\n    } else if (this._iceGatherers.length) {\n      return this._iceGatherers.shift();\n    }\n    var iceGatherer = new window.RTCIceGatherer({\n      iceServers: this._config.iceServers,\n      gatherPolicy: this._config.iceTransportPolicy\n    });\n    Object.defineProperty(iceGatherer, 'state',\n        {value: 'new', writable: true}\n    );\n\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n    this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n      var end = !event.candidate || Object.keys(event.candidate).length === 0;\n      // polyfill since RTCIceGatherer.state is not implemented in\n      // Edge 10547 yet.\n      iceGatherer.state = end ? 'completed' : 'gathering';\n      if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n        pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n      }\n    };\n    iceGatherer.addEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    return iceGatherer;\n  };\n\n  // start gathering from an RTCIceGatherer.\n  RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n    var pc = this;\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer.onlocalcandidate) {\n      return;\n    }\n    var bufferedCandidateEvents =\n      this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n    iceGatherer.removeEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    iceGatherer.onlocalcandidate = function(evt) {\n      if (pc.usingBundle && sdpMLineIndex > 0) {\n        // if we know that we use bundle we can drop candidates with\n        // ѕdpMLineIndex > 0. If we don't do this then our state gets\n        // confused since we dispose the extra ice gatherer.\n        return;\n      }\n      var event = new Event('icecandidate');\n      event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n      var cand = evt.candidate;\n      // Edge emits an empty object for RTCIceCandidateComplete‥\n      var end = !cand || Object.keys(cand).length === 0;\n      if (end) {\n        // polyfill since RTCIceGatherer.state is not implemented in\n        // Edge 10547 yet.\n        if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n          iceGatherer.state = 'completed';\n        }\n      } else {\n        if (iceGatherer.state === 'new') {\n          iceGatherer.state = 'gathering';\n        }\n        // RTCIceCandidate doesn't have a component, needs to be added\n        cand.component = 1;\n        // also the usernameFragment. TODO: update SDP to take both variants.\n        cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n        var serializedCandidate = SDPUtils.writeCandidate(cand);\n        event.candidate = Object.assign(event.candidate,\n            SDPUtils.parseCandidate(serializedCandidate));\n\n        event.candidate.candidate = serializedCandidate;\n        event.candidate.toJSON = function() {\n          return {\n            candidate: event.candidate.candidate,\n            sdpMid: event.candidate.sdpMid,\n            sdpMLineIndex: event.candidate.sdpMLineIndex,\n            usernameFragment: event.candidate.usernameFragment\n          };\n        };\n      }\n\n      // update local description.\n      var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n      if (!end) {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=' + event.candidate.candidate + '\\r\\n';\n      } else {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=end-of-candidates\\r\\n';\n      }\n      pc._localDescription.sdp =\n          SDPUtils.getDescription(pc._localDescription.sdp) +\n          sections.join('');\n      var complete = pc.transceivers.every(function(transceiver) {\n        return transceiver.iceGatherer &&\n            transceiver.iceGatherer.state === 'completed';\n      });\n\n      if (pc.iceGatheringState !== 'gathering') {\n        pc.iceGatheringState = 'gathering';\n        pc._emitGatheringStateChange();\n      }\n\n      // Emit candidate. Also emit null candidate when all gatherers are\n      // complete.\n      if (!end) {\n        pc._dispatchEvent('icecandidate', event);\n      }\n      if (complete) {\n        pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n        pc.iceGatheringState = 'complete';\n        pc._emitGatheringStateChange();\n      }\n    };\n\n    // emit already gathered candidates.\n    window.setTimeout(function() {\n      bufferedCandidateEvents.forEach(function(e) {\n        iceGatherer.onlocalcandidate(e);\n      });\n    }, 0);\n  };\n\n  // Create ICE transport and DTLS transport.\n  RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n    var pc = this;\n    var iceTransport = new window.RTCIceTransport(null);\n    iceTransport.onicestatechange = function() {\n      pc._updateIceConnectionState();\n      pc._updateConnectionState();\n    };\n\n    var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n    dtlsTransport.ondtlsstatechange = function() {\n      pc._updateConnectionState();\n    };\n    dtlsTransport.onerror = function() {\n      // onerror does not set state to failed by itself.\n      Object.defineProperty(dtlsTransport, 'state',\n          {value: 'failed', writable: true});\n      pc._updateConnectionState();\n    };\n\n    return {\n      iceTransport: iceTransport,\n      dtlsTransport: dtlsTransport\n    };\n  };\n\n  // Destroy ICE gatherer, ICE transport and DTLS transport.\n  // Without triggering the callbacks.\n  RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n      sdpMLineIndex) {\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer) {\n      delete iceGatherer.onlocalcandidate;\n      delete this.transceivers[sdpMLineIndex].iceGatherer;\n    }\n    var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n    if (iceTransport) {\n      delete iceTransport.onicestatechange;\n      delete this.transceivers[sdpMLineIndex].iceTransport;\n    }\n    var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n    if (dtlsTransport) {\n      delete dtlsTransport.ondtlsstatechange;\n      delete dtlsTransport.onerror;\n      delete this.transceivers[sdpMLineIndex].dtlsTransport;\n    }\n  };\n\n  // Start the RTP Sender and Receiver for a transceiver.\n  RTCPeerConnection.prototype._transceive = function(transceiver,\n      send, recv) {\n    var params = getCommonCapabilities(transceiver.localCapabilities,\n        transceiver.remoteCapabilities);\n    if (send && transceiver.rtpSender) {\n      params.encodings = transceiver.sendEncodingParameters;\n      params.rtcp = {\n        cname: SDPUtils.localCName,\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.recvEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpSender.send(params);\n    }\n    if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n      // remove RTX field in Edge 14942\n      if (transceiver.kind === 'video'\n          && transceiver.recvEncodingParameters\n          && edgeVersion < 15019) {\n        transceiver.recvEncodingParameters.forEach(function(p) {\n          delete p.rtx;\n        });\n      }\n      if (transceiver.recvEncodingParameters.length) {\n        params.encodings = transceiver.recvEncodingParameters;\n      } else {\n        params.encodings = [{}];\n      }\n      params.rtcp = {\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.rtcpParameters.cname) {\n        params.rtcp.cname = transceiver.rtcpParameters.cname;\n      }\n      if (transceiver.sendEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpReceiver.receive(params);\n    }\n  };\n\n  RTCPeerConnection.prototype.setLocalDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setLocalDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set local ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var sections;\n    var sessionpart;\n    if (description.type === 'offer') {\n      // VERY limited support for SDP munging. Limited to:\n      // * changing the order of codecs\n      sections = SDPUtils.splitSections(description.sdp);\n      sessionpart = sections.shift();\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var caps = SDPUtils.parseRtpParameters(mediaSection);\n        pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n      });\n\n      pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n        pc._gather(transceiver.mid, sdpMLineIndex);\n      });\n    } else if (description.type === 'answer') {\n      sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n      sessionpart = sections.shift();\n      var isIceLite = SDPUtils.matchPrefix(sessionpart,\n          'a=ice-lite').length > 0;\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        var iceGatherer = transceiver.iceGatherer;\n        var iceTransport = transceiver.iceTransport;\n        var dtlsTransport = transceiver.dtlsTransport;\n        var localCapabilities = transceiver.localCapabilities;\n        var remoteCapabilities = transceiver.remoteCapabilities;\n\n        // treat bundle-only as not-rejected.\n        var rejected = SDPUtils.isRejected(mediaSection) &&\n            SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n        if (!rejected && !transceiver.rejected) {\n          var remoteIceParameters = SDPUtils.getIceParameters(\n              mediaSection, sessionpart);\n          var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n              mediaSection, sessionpart);\n          if (isIceLite) {\n            remoteDtlsParameters.role = 'server';\n          }\n\n          if (!pc.usingBundle || sdpMLineIndex === 0) {\n            pc._gather(transceiver.mid, sdpMLineIndex);\n            if (iceTransport.state === 'new') {\n              iceTransport.start(iceGatherer, remoteIceParameters,\n                  isIceLite ? 'controlling' : 'controlled');\n            }\n            if (dtlsTransport.state === 'new') {\n              dtlsTransport.start(remoteDtlsParameters);\n            }\n          }\n\n          // Calculate intersection of capabilities.\n          var params = getCommonCapabilities(localCapabilities,\n              remoteCapabilities);\n\n          // Start the RTCRtpSender. The RTCRtpReceiver for this\n          // transceiver has already been started in setRemoteDescription.\n          pc._transceive(transceiver,\n              params.codecs.length > 0,\n              false);\n        }\n      });\n    }\n\n    pc._localDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-local-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setRemoteDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set remote ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var streams = {};\n    pc.remoteStreams.forEach(function(stream) {\n      streams[stream.id] = stream;\n    });\n    var receiverList = [];\n    var sections = SDPUtils.splitSections(description.sdp);\n    var sessionpart = sections.shift();\n    var isIceLite = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-lite').length > 0;\n    var usingBundle = SDPUtils.matchPrefix(sessionpart,\n        'a=group:BUNDLE ').length > 0;\n    pc.usingBundle = usingBundle;\n    var iceOptions = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-options:')[0];\n    if (iceOptions) {\n      pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n          .indexOf('trickle') >= 0;\n    } else {\n      pc.canTrickleIceCandidates = false;\n    }\n\n    sections.forEach(function(mediaSection, sdpMLineIndex) {\n      var lines = SDPUtils.splitLines(mediaSection);\n      var kind = SDPUtils.getKind(mediaSection);\n      // treat bundle-only as not-rejected.\n      var rejected = SDPUtils.isRejected(mediaSection) &&\n          SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n      var protocol = lines[0].substr(2).split(' ')[2];\n\n      var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n      var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n      var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n      // Reject datachannels which are not implemented yet.\n      if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n          protocol === 'UDP/DTLS/SCTP'))) {\n        // TODO: this is dangerous in the case where a non-rejected m-line\n        //     becomes rejected.\n        pc.transceivers[sdpMLineIndex] = {\n          mid: mid,\n          kind: kind,\n          protocol: protocol,\n          rejected: true\n        };\n        return;\n      }\n\n      if (!rejected && pc.transceivers[sdpMLineIndex] &&\n          pc.transceivers[sdpMLineIndex].rejected) {\n        // recycle a rejected transceiver.\n        pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n      }\n\n      var transceiver;\n      var iceGatherer;\n      var iceTransport;\n      var dtlsTransport;\n      var rtpReceiver;\n      var sendEncodingParameters;\n      var recvEncodingParameters;\n      var localCapabilities;\n\n      var track;\n      // FIXME: ensure the mediaSection has rtcp-mux set.\n      var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n      var remoteIceParameters;\n      var remoteDtlsParameters;\n      if (!rejected) {\n        remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters.role = 'client';\n      }\n      recvEncodingParameters =\n          SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n      var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n      var isComplete = SDPUtils.matchPrefix(mediaSection,\n          'a=end-of-candidates', sessionpart).length > 0;\n      var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n          .map(function(cand) {\n            return SDPUtils.parseCandidate(cand);\n          })\n          .filter(function(cand) {\n            return cand.component === 1;\n          });\n\n      // Check if we can use BUNDLE and dispose transports.\n      if ((description.type === 'offer' || description.type === 'answer') &&\n          !rejected && usingBundle && sdpMLineIndex > 0 &&\n          pc.transceivers[sdpMLineIndex]) {\n        pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n        pc.transceivers[sdpMLineIndex].iceGatherer =\n            pc.transceivers[0].iceGatherer;\n        pc.transceivers[sdpMLineIndex].iceTransport =\n            pc.transceivers[0].iceTransport;\n        pc.transceivers[sdpMLineIndex].dtlsTransport =\n            pc.transceivers[0].dtlsTransport;\n        if (pc.transceivers[sdpMLineIndex].rtpSender) {\n          pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n        if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n          pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n      }\n      if (description.type === 'offer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex] ||\n            pc._createTransceiver(kind);\n        transceiver.mid = mid;\n\n        if (!transceiver.iceGatherer) {\n          transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n              usingBundle);\n        }\n\n        if (cands.length && transceiver.iceTransport.state === 'new') {\n          if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n            transceiver.iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n        // filter RTX until additional stuff needed for RTX is implemented\n        // in adapter.js\n        if (edgeVersion < 15019) {\n          localCapabilities.codecs = localCapabilities.codecs.filter(\n              function(codec) {\n                return codec.name !== 'rtx';\n              });\n        }\n\n        sendEncodingParameters = transceiver.sendEncodingParameters || [{\n          ssrc: (2 * sdpMLineIndex + 2) * 1001\n        }];\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        var isNewTrack = false;\n        if (direction === 'sendrecv' || direction === 'sendonly') {\n          isNewTrack = !transceiver.rtpReceiver;\n          rtpReceiver = transceiver.rtpReceiver ||\n              new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n          if (isNewTrack) {\n            var stream;\n            track = rtpReceiver.track;\n            // FIXME: does not work with Plan B.\n            if (remoteMsid && remoteMsid.stream === '-') {\n              // no-op. a stream id of '-' means: no associated stream.\n            } else if (remoteMsid) {\n              if (!streams[remoteMsid.stream]) {\n                streams[remoteMsid.stream] = new window.MediaStream();\n                Object.defineProperty(streams[remoteMsid.stream], 'id', {\n                  get: function() {\n                    return remoteMsid.stream;\n                  }\n                });\n              }\n              Object.defineProperty(track, 'id', {\n                get: function() {\n                  return remoteMsid.track;\n                }\n              });\n              stream = streams[remoteMsid.stream];\n            } else {\n              if (!streams.default) {\n                streams.default = new window.MediaStream();\n              }\n              stream = streams.default;\n            }\n            if (stream) {\n              addTrackToStreamAndFireEvent(track, stream);\n              transceiver.associatedRemoteMediaStreams.push(stream);\n            }\n            receiverList.push([track, rtpReceiver, stream]);\n          }\n        } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n          transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n            var nativeTrack = s.getTracks().find(function(t) {\n              return t.id === transceiver.rtpReceiver.track.id;\n            });\n            if (nativeTrack) {\n              removeTrackFromStreamAndFireEvent(nativeTrack, s);\n            }\n          });\n          transceiver.associatedRemoteMediaStreams = [];\n        }\n\n        transceiver.localCapabilities = localCapabilities;\n        transceiver.remoteCapabilities = remoteCapabilities;\n        transceiver.rtpReceiver = rtpReceiver;\n        transceiver.rtcpParameters = rtcpParameters;\n        transceiver.sendEncodingParameters = sendEncodingParameters;\n        transceiver.recvEncodingParameters = recvEncodingParameters;\n\n        // Start the RTCRtpReceiver now. The RTPSender is started in\n        // setLocalDescription.\n        pc._transceive(pc.transceivers[sdpMLineIndex],\n            false,\n            isNewTrack);\n      } else if (description.type === 'answer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex];\n        iceGatherer = transceiver.iceGatherer;\n        iceTransport = transceiver.iceTransport;\n        dtlsTransport = transceiver.dtlsTransport;\n        rtpReceiver = transceiver.rtpReceiver;\n        sendEncodingParameters = transceiver.sendEncodingParameters;\n        localCapabilities = transceiver.localCapabilities;\n\n        pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n            recvEncodingParameters;\n        pc.transceivers[sdpMLineIndex].remoteCapabilities =\n            remoteCapabilities;\n        pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n        if (cands.length && iceTransport.state === 'new') {\n          if ((isIceLite || isComplete) &&\n              (!usingBundle || sdpMLineIndex === 0)) {\n            iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        if (!usingBundle || sdpMLineIndex === 0) {\n          if (iceTransport.state === 'new') {\n            iceTransport.start(iceGatherer, remoteIceParameters,\n                'controlling');\n          }\n          if (dtlsTransport.state === 'new') {\n            dtlsTransport.start(remoteDtlsParameters);\n          }\n        }\n\n        // If the offer contained RTX but the answer did not,\n        // remove RTX from sendEncodingParameters.\n        var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n        var hasRtx = commonCapabilities.codecs.filter(function(c) {\n          return c.name.toLowerCase() === 'rtx';\n        }).length;\n        if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n          delete transceiver.sendEncodingParameters[0].rtx;\n        }\n\n        pc._transceive(transceiver,\n            direction === 'sendrecv' || direction === 'recvonly',\n            direction === 'sendrecv' || direction === 'sendonly');\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        if (rtpReceiver &&\n            (direction === 'sendrecv' || direction === 'sendonly')) {\n          track = rtpReceiver.track;\n          if (remoteMsid) {\n            if (!streams[remoteMsid.stream]) {\n              streams[remoteMsid.stream] = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n            receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n          } else {\n            if (!streams.default) {\n              streams.default = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams.default);\n            receiverList.push([track, rtpReceiver, streams.default]);\n          }\n        } else {\n          // FIXME: actually the receiver should be created later.\n          delete transceiver.rtpReceiver;\n        }\n      }\n    });\n\n    if (pc._dtlsRole === undefined) {\n      pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n    }\n\n    pc._remoteDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-remote-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n    Object.keys(streams).forEach(function(sid) {\n      var stream = streams[sid];\n      if (stream.getTracks().length) {\n        if (pc.remoteStreams.indexOf(stream) === -1) {\n          pc.remoteStreams.push(stream);\n          var event = new Event('addstream');\n          event.stream = stream;\n          window.setTimeout(function() {\n            pc._dispatchEvent('addstream', event);\n          });\n        }\n\n        receiverList.forEach(function(item) {\n          var track = item[0];\n          var receiver = item[1];\n          if (stream.id !== item[2].id) {\n            return;\n          }\n          fireAddTrack(pc, track, receiver, [stream]);\n        });\n      }\n    });\n    receiverList.forEach(function(item) {\n      if (item[2]) {\n        return;\n      }\n      fireAddTrack(pc, item[0], item[1], []);\n    });\n\n    // check whether addIceCandidate({}) was called within four seconds after\n    // setRemoteDescription.\n    window.setTimeout(function() {\n      if (!(pc && pc.transceivers)) {\n        return;\n      }\n      pc.transceivers.forEach(function(transceiver) {\n        if (transceiver.iceTransport &&\n            transceiver.iceTransport.state === 'new' &&\n            transceiver.iceTransport.getRemoteCandidates().length > 0) {\n          console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n              'an end-of-candidates notification');\n          transceiver.iceTransport.addRemoteCandidate({});\n        }\n      });\n    }, 4000);\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.close = function() {\n    this.transceivers.forEach(function(transceiver) {\n      /* not yet\n      if (transceiver.iceGatherer) {\n        transceiver.iceGatherer.close();\n      }\n      */\n      if (transceiver.iceTransport) {\n        transceiver.iceTransport.stop();\n      }\n      if (transceiver.dtlsTransport) {\n        transceiver.dtlsTransport.stop();\n      }\n      if (transceiver.rtpSender) {\n        transceiver.rtpSender.stop();\n      }\n      if (transceiver.rtpReceiver) {\n        transceiver.rtpReceiver.stop();\n      }\n    });\n    // FIXME: clean up tracks, local streams, remote streams, etc\n    this._isClosed = true;\n    this._updateSignalingState('closed');\n  };\n\n  // Update the signaling state.\n  RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n    this.signalingState = newState;\n    var event = new Event('signalingstatechange');\n    this._dispatchEvent('signalingstatechange', event);\n  };\n\n  // Determine whether to fire the negotiationneeded event.\n  RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n    var pc = this;\n    if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n      return;\n    }\n    this.needNegotiation = true;\n    window.setTimeout(function() {\n      if (pc.needNegotiation) {\n        pc.needNegotiation = false;\n        var event = new Event('negotiationneeded');\n        pc._dispatchEvent('negotiationneeded', event);\n      }\n    }, 0);\n  };\n\n  // Update the ice connection state.\n  RTCPeerConnection.prototype._updateIceConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      checking: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n    });\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.checking > 0) {\n      newState = 'checking';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    } else if (states.completed > 0) {\n      newState = 'completed';\n    }\n\n    if (newState !== this.iceConnectionState) {\n      this.iceConnectionState = newState;\n      var event = new Event('iceconnectionstatechange');\n      this._dispatchEvent('iceconnectionstatechange', event);\n    }\n  };\n\n  // Update the connection state.\n  RTCPeerConnection.prototype._updateConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      connecting: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n      states[transceiver.dtlsTransport.state]++;\n    });\n    // ICETransport.completed and connected are the same for this purpose.\n    states.connected += states.completed;\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.connecting > 0) {\n      newState = 'connecting';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    }\n\n    if (newState !== this.connectionState) {\n      this.connectionState = newState;\n      var event = new Event('connectionstatechange');\n      this._dispatchEvent('connectionstatechange', event);\n    }\n  };\n\n  RTCPeerConnection.prototype.createOffer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createOffer after close'));\n    }\n\n    var numAudioTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'audio';\n    }).length;\n    var numVideoTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'video';\n    }).length;\n\n    // Determine number of audio and video tracks we need to send/recv.\n    var offerOptions = arguments[0];\n    if (offerOptions) {\n      // Reject Chrome legacy constraints.\n      if (offerOptions.mandatory || offerOptions.optional) {\n        throw new TypeError(\n            'Legacy mandatory/optional constraints not supported.');\n      }\n      if (offerOptions.offerToReceiveAudio !== undefined) {\n        if (offerOptions.offerToReceiveAudio === true) {\n          numAudioTracks = 1;\n        } else if (offerOptions.offerToReceiveAudio === false) {\n          numAudioTracks = 0;\n        } else {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n      }\n      if (offerOptions.offerToReceiveVideo !== undefined) {\n        if (offerOptions.offerToReceiveVideo === true) {\n          numVideoTracks = 1;\n        } else if (offerOptions.offerToReceiveVideo === false) {\n          numVideoTracks = 0;\n        } else {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n    }\n\n    pc.transceivers.forEach(function(transceiver) {\n      if (transceiver.kind === 'audio') {\n        numAudioTracks--;\n        if (numAudioTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      } else if (transceiver.kind === 'video') {\n        numVideoTracks--;\n        if (numVideoTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      }\n    });\n\n    // Create M-lines for recvonly streams.\n    while (numAudioTracks > 0 || numVideoTracks > 0) {\n      if (numAudioTracks > 0) {\n        pc._createTransceiver('audio');\n        numAudioTracks--;\n      }\n      if (numVideoTracks > 0) {\n        pc._createTransceiver('video');\n        numVideoTracks--;\n      }\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      // For each track, create an ice gatherer, ice transport,\n      // dtls transport, potentially rtpsender and rtpreceiver.\n      var track = transceiver.track;\n      var kind = transceiver.kind;\n      var mid = transceiver.mid || SDPUtils.generateIdentifier();\n      transceiver.mid = mid;\n\n      if (!transceiver.iceGatherer) {\n        transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n            pc.usingBundle);\n      }\n\n      var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n      // filter RTX until additional stuff needed for RTX is implemented\n      // in adapter.js\n      if (edgeVersion < 15019) {\n        localCapabilities.codecs = localCapabilities.codecs.filter(\n            function(codec) {\n              return codec.name !== 'rtx';\n            });\n      }\n      localCapabilities.codecs.forEach(function(codec) {\n        // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n        // by adding level-asymmetry-allowed=1\n        if (codec.name === 'H264' &&\n            codec.parameters['level-asymmetry-allowed'] === undefined) {\n          codec.parameters['level-asymmetry-allowed'] = '1';\n        }\n\n        // for subsequent offers, we might have to re-use the payload\n        // type of the last offer.\n        if (transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.codecs) {\n          transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n            if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n                codec.clockRate === remoteCodec.clockRate) {\n              codec.preferredPayloadType = remoteCodec.payloadType;\n            }\n          });\n        }\n      });\n      localCapabilities.headerExtensions.forEach(function(hdrExt) {\n        var remoteExtensions = transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.headerExtensions || [];\n        remoteExtensions.forEach(function(rHdrExt) {\n          if (hdrExt.uri === rHdrExt.uri) {\n            hdrExt.id = rHdrExt.id;\n          }\n        });\n      });\n\n      // generate an ssrc now, to be used later in rtpSender.send\n      var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n        ssrc: (2 * sdpMLineIndex + 1) * 1001\n      }];\n      if (track) {\n        // add RTX\n        if (edgeVersion >= 15019 && kind === 'video' &&\n            !sendEncodingParameters[0].rtx) {\n          sendEncodingParameters[0].rtx = {\n            ssrc: sendEncodingParameters[0].ssrc + 1\n          };\n        }\n      }\n\n      if (transceiver.wantReceive) {\n        transceiver.rtpReceiver = new window.RTCRtpReceiver(\n            transceiver.dtlsTransport, kind);\n      }\n\n      transceiver.localCapabilities = localCapabilities;\n      transceiver.sendEncodingParameters = sendEncodingParameters;\n    });\n\n    // always offer BUNDLE and dispose on return if not supported.\n    if (pc._config.bundlePolicy !== 'max-compat') {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n          'offer', transceiver.stream, pc._dtlsRole);\n      sdp += 'a=rtcp-rsize\\r\\n';\n\n      if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n          (sdpMLineIndex === 0 || !pc.usingBundle)) {\n        transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n          cand.component = 1;\n          sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n        });\n\n        if (transceiver.iceGatherer.state === 'completed') {\n          sdp += 'a=end-of-candidates\\r\\n';\n        }\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'offer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.createAnswer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer after close'));\n    }\n\n    if (!(pc.signalingState === 'have-remote-offer' ||\n        pc.signalingState === 'have-local-pranswer')) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer in signalingState ' + pc.signalingState));\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    if (pc.usingBundle) {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    var mediaSectionsInOffer = SDPUtils.getMediaSections(\n        pc._remoteDescription.sdp).length;\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n        return;\n      }\n      if (transceiver.rejected) {\n        if (transceiver.kind === 'application') {\n          if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n            sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n          } else {\n            sdp += 'm=application 0 ' + transceiver.protocol +\n                ' webrtc-datachannel\\r\\n';\n          }\n        } else if (transceiver.kind === 'audio') {\n          sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n              'a=rtpmap:0 PCMU/8000\\r\\n';\n        } else if (transceiver.kind === 'video') {\n          sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n              'a=rtpmap:120 VP8/90000\\r\\n';\n        }\n        sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n            'a=inactive\\r\\n' +\n            'a=mid:' + transceiver.mid + '\\r\\n';\n        return;\n      }\n\n      // FIXME: look at direction.\n      if (transceiver.stream) {\n        var localTrack;\n        if (transceiver.kind === 'audio') {\n          localTrack = transceiver.stream.getAudioTracks()[0];\n        } else if (transceiver.kind === 'video') {\n          localTrack = transceiver.stream.getVideoTracks()[0];\n        }\n        if (localTrack) {\n          // add RTX\n          if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n              !transceiver.sendEncodingParameters[0].rtx) {\n            transceiver.sendEncodingParameters[0].rtx = {\n              ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n            };\n          }\n        }\n      }\n\n      // Calculate intersection of capabilities.\n      var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n      var hasRtx = commonCapabilities.codecs.filter(function(c) {\n        return c.name.toLowerCase() === 'rtx';\n      }).length;\n      if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n        delete transceiver.sendEncodingParameters[0].rtx;\n      }\n\n      sdp += writeMediaSection(transceiver, commonCapabilities,\n          'answer', transceiver.stream, pc._dtlsRole);\n      if (transceiver.rtcpParameters &&\n          transceiver.rtcpParameters.reducedSize) {\n        sdp += 'a=rtcp-rsize\\r\\n';\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'answer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n    var pc = this;\n    var sections;\n    if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n        candidate.sdpMid)) {\n      return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n    }\n\n    // TODO: needs to go into ops queue.\n    return new Promise(function(resolve, reject) {\n      if (!pc._remoteDescription) {\n        return reject(makeError('InvalidStateError',\n            'Can not add ICE candidate without a remote description'));\n      } else if (!candidate || candidate.candidate === '') {\n        for (var j = 0; j < pc.transceivers.length; j++) {\n          if (pc.transceivers[j].rejected) {\n            continue;\n          }\n          pc.transceivers[j].iceTransport.addRemoteCandidate({});\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[j] += 'a=end-of-candidates\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n          if (pc.usingBundle) {\n            break;\n          }\n        }\n      } else {\n        var sdpMLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < pc.transceivers.length; i++) {\n            if (pc.transceivers[i].mid === candidate.sdpMid) {\n              sdpMLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        if (transceiver) {\n          if (transceiver.rejected) {\n            return resolve();\n          }\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n            return resolve();\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component && cand.component !== 1) {\n            return resolve();\n          }\n          // when using bundle, avoid adding candidates to the wrong\n          // ice transport. And avoid adding candidates added in the SDP.\n          if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n              transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n            if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n              return reject(makeError('OperationError',\n                  'Can not add ICE candidate'));\n            }\n          }\n\n          // update the remoteDescription.\n          var candidateString = candidate.candidate.trim();\n          if (candidateString.indexOf('a=') === 0) {\n            candidateString = candidateString.substr(2);\n          }\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[sdpMLineIndex] += 'a=' +\n              (cand.type ? candidateString : 'end-of-candidates')\n              + '\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n        } else {\n          return reject(makeError('OperationError',\n              'Can not add ICE candidate'));\n        }\n      }\n      resolve();\n    });\n  };\n\n  RTCPeerConnection.prototype.getStats = function(selector) {\n    if (selector && selector instanceof window.MediaStreamTrack) {\n      var senderOrReceiver = null;\n      this.transceivers.forEach(function(transceiver) {\n        if (transceiver.rtpSender &&\n            transceiver.rtpSender.track === selector) {\n          senderOrReceiver = transceiver.rtpSender;\n        } else if (transceiver.rtpReceiver &&\n            transceiver.rtpReceiver.track === selector) {\n          senderOrReceiver = transceiver.rtpReceiver;\n        }\n      });\n      if (!senderOrReceiver) {\n        throw makeError('InvalidAccessError', 'Invalid selector.');\n      }\n      return senderOrReceiver.getStats();\n    }\n\n    var promises = [];\n    this.transceivers.forEach(function(transceiver) {\n      ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n          'dtlsTransport'].forEach(function(method) {\n            if (transceiver[method]) {\n              promises.push(transceiver[method].getStats());\n            }\n          });\n    });\n    return Promise.all(promises).then(function(allStats) {\n      var results = new Map();\n      allStats.forEach(function(stats) {\n        stats.forEach(function(stat) {\n          results.set(stat.id, stat);\n        });\n      });\n      return results;\n    });\n  };\n\n  // fix low-level stat names and return Map instead of object.\n  var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n    'RTCIceTransport', 'RTCDtlsTransport'];\n  ortcObjects.forEach(function(ortcObjectName) {\n    var obj = window[ortcObjectName];\n    if (obj && obj.prototype && obj.prototype.getStats) {\n      var nativeGetstats = obj.prototype.getStats;\n      obj.prototype.getStats = function() {\n        return nativeGetstats.apply(this)\n        .then(function(nativeStats) {\n          var mapStats = new Map();\n          Object.keys(nativeStats).forEach(function(id) {\n            nativeStats[id].type = fixStatsType(nativeStats[id]);\n            mapStats.set(id, nativeStats[id]);\n          });\n          return mapStats;\n        });\n      };\n    }\n  });\n\n  // legacy callback shims. Should be moved to adapter.js some days.\n  var methods = ['createOffer', 'createAnswer'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[0] === 'function' ||\n          typeof args[1] === 'function') { // legacy\n        return nativeMethod.apply(this, [arguments[2]])\n        .then(function(description) {\n          if (typeof args[0] === 'function') {\n            args[0].apply(null, [description]);\n          }\n        }, function(error) {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function' ||\n          typeof args[2] === 'function') { // legacy\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        }, function(error) {\n          if (typeof args[2] === 'function') {\n            args[2].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  // getStats is special. It doesn't have a spec legacy method yet we support\n  // getStats(something, cb) without error callbacks.\n  ['getStats'].forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function') {\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  return RTCPeerConnection;\n};\n\n},{\"sdp\":2}],2:[function(require,module,exports){\n /* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(function(line) {\n    return line.trim();\n  });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  var parts = blob.split('\\nm=');\n  return parts.map(function(part, index) {\n    return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n  });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  sections.shift();\n  return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(function(line) {\n    return line.indexOf(prefix) === 0;\n  });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n  var parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  var candidate = {\n    foundation: parts[0],\n    component: parseInt(parts[1], 10),\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    address: parts[4], // address is an alias for ip.\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7]\n  };\n\n  for (var i = 8; i < parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      case 'ufrag':\n        candidate.ufrag = parts[i + 1]; // for backward compability.\n        candidate.usernameFragment = parts[i + 1];\n        break;\n      default: // extension handling, in particular ufrag\n        candidate[parts[i]] = parts[i + 1];\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n  var sdp = [];\n  sdp.push(candidate.foundation);\n  sdp.push(candidate.component);\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.address || candidate.ip);\n  sdp.push(candidate.port);\n\n  var type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' && candidate.relatedAddress &&\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress);\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort);\n  }\n  if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  if (candidate.usernameFragment || candidate.ufrag) {\n    sdp.push('ufrag');\n    sdp.push(candidate.usernameFragment || candidate.ufrag);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n  return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  var parts = line.substr(9).split(' ');\n  var parsed = {\n    payloadType: parseInt(parts.shift(), 10) // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  // legacy alias, got renamed back to channels in ORTC.\n  parsed.numChannels = parsed.channels;\n  return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  var channels = codec.channels || codec.numChannels || 1;\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n    uri: parts[1]\n  };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n      (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n          ? '/' + headerExtension.direction\n          : '') +\n      ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  var parsed = {};\n  var kv;\n  var parts = line.substr(line.indexOf(' ') + 1).split(';');\n  for (var j = 0; j < parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  var line = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters && Object.keys(codec.parameters).length) {\n    var params = [];\n    Object.keys(codec.parameters).forEach(function(param) {\n      if (codec.parameters[param]) {\n        params.push(param + '=' + codec.parameters[param]);\n      } else {\n        params.push(param);\n      }\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' ')\n  };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  var lines = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(function(fb) {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  var sp = line.indexOf(' ');\n  var parts = {\n    ssrc: parseInt(line.substr(7, sp - 7), 10)\n  };\n  var colon = line.indexOf(':', sp);\n  if (colon > -1) {\n    parts.attribute = line.substr(sp + 1, colon - sp - 1);\n    parts.value = line.substr(colon + 1);\n  } else {\n    parts.attribute = line.substr(sp + 1);\n  }\n  return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n  var parts = line.substr(13).split(' ');\n  return {\n    semantics: parts.shift(),\n    ssrcs: parts.map(function(ssrc) {\n      return parseInt(ssrc, 10);\n    })\n  };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n  var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n  if (mid) {\n    return mid.substr(6);\n  }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n  var parts = line.substr(14).split(' ');\n  return {\n    algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n    value: parts[1]\n  };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n      'a=fingerprint:');\n  // Note: a=setup line is ignored since we use the 'auto' role.\n  // Note2: 'algorithm' is not case sensitive except in Edge.\n  return {\n    role: 'auto',\n    fingerprints: lines.map(SDPUtils.parseFingerprint)\n  };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  var sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(function(fp) {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  // Search in session part, too.\n  lines = lines.concat(SDPUtils.splitLines(sessionpart));\n  var iceParameters = {\n    usernameFragment: lines.filter(function(line) {\n      return line.indexOf('a=ice-ufrag:') === 0;\n    })[0].substr(12),\n    password: lines.filter(function(line) {\n      return line.indexOf('a=ice-pwd:') === 0;\n    })[0].substr(10)\n  };\n  return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  var description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: []\n  };\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n    var pt = mline[i];\n    var rtpmapline = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      var codec = SDPUtils.parseRtpMap(rtpmapline);\n      var fmtps = SDPUtils.matchPrefix(\n          mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:<pt> is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n          mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  var sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' UDP/TLS/RTP/SAVPF ';\n  sdp += caps.codecs.map(function(codec) {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(function(codec) {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  var maxptime = 0;\n  caps.codecs.forEach(function(codec) {\n    if (codec.maxptime > maxptime) {\n      maxptime = codec.maxptime;\n    }\n  });\n  if (maxptime > 0) {\n    sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n  }\n  sdp += 'a=rtcp-mux\\r\\n';\n\n  if (caps.headerExtensions) {\n    caps.headerExtensions.forEach(function(extension) {\n      sdp += SDPUtils.writeExtmap(extension);\n    });\n  }\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  var encodingParameters = [];\n  var description = SDPUtils.parseRtpParameters(mediaSection);\n  var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(parts) {\n    return parts.attribute === 'cname';\n  });\n  var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n  var secondarySsrc;\n\n  var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n  .map(function(line) {\n    var parts = line.substr(17).split(' ');\n    return parts.map(function(part) {\n      return parseInt(part, 10);\n    });\n  });\n  if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(function(codec) {\n    if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n      var encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10)\n      };\n      if (primarySsrc && secondarySsrc) {\n        encParam.rtx = {ssrc: secondarySsrc};\n      }\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: primarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 && primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      // use formula from JSEP to convert b=AS to TIAS value.\n      bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n          - (50 * 40 * 8);\n    } else {\n      bandwidth = undefined;\n    }\n    encodingParameters.forEach(function(params) {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n  var rtcpParameters = {};\n\n  // Gets the first SSRC. Note tha with RTX there might be multiple\n  // SSRCs.\n  var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n      .map(function(line) {\n        return SDPUtils.parseSsrcMedia(line);\n      })\n      .filter(function(obj) {\n        return obj.attribute === 'cname';\n      })[0];\n  if (remoteSsrc) {\n    rtcpParameters.cname = remoteSsrc.value;\n    rtcpParameters.ssrc = remoteSsrc.ssrc;\n  }\n\n  // Edge uses the compound attribute instead of reducedSize\n  // compound is !reducedSize\n  var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n  rtcpParameters.reducedSize = rsize.length > 0;\n  rtcpParameters.compound = rsize.length === 0;\n\n  // parses the rtcp-mux attrіbute.\n  // Note that Edge does not support unmuxed RTCP.\n  var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n  rtcpParameters.mux = mux.length > 0;\n\n  return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n  var parts;\n  var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n  if (spec.length === 1) {\n    parts = spec[0].substr(7).split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n  var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(msidParts) {\n    return msidParts.attribute === 'msid';\n  });\n  if (planB.length > 0) {\n    parts = planB[0].value.split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n  return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n  var sessionId;\n  var version = sessVer !== undefined ? sessVer : 2;\n  if (sessId) {\n    sessionId = sessId;\n  } else {\n    sessionId = SDPUtils.generateSessionId();\n  }\n  var user = sessUser || 'thisisadapterortc';\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=' + user + ' ' + sessionId + ' ' + version +\n        ' IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.direction) {\n    sdp += 'a=' + transceiver.direction + '\\r\\n';\n  } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    // spec.\n    var msid = 'msid:' + stream.id + ' ' +\n        transceiver.rtpSender.track.id + '\\r\\n';\n    sdp += 'a=' + msid;\n\n    // for Chrome.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  var lines = SDPUtils.splitLines(mediaSection);\n  for (var i = 0; i < lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substr(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n  return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var parts = lines[0].substr(2).split(' ');\n  return {\n    kind: parts[0],\n    port: parseInt(parts[1], 10),\n    protocol: parts[2],\n    fmt: parts.slice(3).join(' ')\n  };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n  var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n  var parts = line.substr(2).split(' ');\n  return {\n    username: parts[0],\n    sessionId: parts[1],\n    sessionVersion: parseInt(parts[2], 10),\n    netType: parts[3],\n    addressType: parts[4],\n    address: parts[5]\n  };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n  if (typeof blob !== 'string' || blob.length === 0) {\n    return false;\n  }\n  var lines = SDPUtils.splitLines(blob);\n  for (var i = 0; i < lines.length; i++) {\n    if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n      return false;\n    }\n    // TODO: check the modifier a bit more.\n  }\n  return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n  module.exports = SDPUtils;\n}\n\n},{}],3:[function(require,module,exports){\n(function (global){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar adapterFactory = require('./adapter_factory.js');\nmodule.exports = adapterFactory({window: global.window});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./adapter_factory.js\":4}],4:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar utils = require('./utils');\n// Shimming starts here.\nmodule.exports = function(dependencies, opts) {\n  var window = dependencies && dependencies.window;\n\n  var options = {\n    shimChrome: true,\n    shimFirefox: true,\n    shimEdge: true,\n    shimSafari: true,\n  };\n\n  for (var key in opts) {\n    if (hasOwnProperty.call(opts, key)) {\n      options[key] = opts[key];\n    }\n  }\n\n  // Utils.\n  var logging = utils.log;\n  var browserDetails = utils.detectBrowser(window);\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = require('./chrome/chrome_shim') || null;\n  var edgeShim = require('./edge/edge_shim') || null;\n  var firefoxShim = require('./firefox/firefox_shim') || null;\n  var safariShim = require('./safari/safari_shim') || null;\n  var commonShim = require('./common_shim') || null;\n\n  // Export to the adapter global object visible in the browser.\n  var adapter = {\n    browserDetails: browserDetails,\n    commonShim: commonShim,\n    extractVersion: utils.extractVersion,\n    disableLog: utils.disableLog,\n    disableWarnings: utils.disableWarnings\n  };\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection ||\n          !options.shimChrome) {\n        logging('Chrome shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = chromeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      chromeShim.shimGetUserMedia(window);\n      chromeShim.shimMediaStream(window);\n      chromeShim.shimSourceObject(window);\n      chromeShim.shimPeerConnection(window);\n      chromeShim.shimOnTrack(window);\n      chromeShim.shimAddTrackRemoveTrack(window);\n      chromeShim.shimGetSendersWithDtmf(window);\n      chromeShim.shimSenderReceiverGetStats(window);\n      chromeShim.fixNegotiationNeeded(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n          !options.shimFirefox) {\n        logging('Firefox shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = firefoxShim;\n      commonShim.shimCreateObjectURL(window);\n\n      firefoxShim.shimGetUserMedia(window);\n      firefoxShim.shimSourceObject(window);\n      firefoxShim.shimPeerConnection(window);\n      firefoxShim.shimOnTrack(window);\n      firefoxShim.shimRemoveStream(window);\n      firefoxShim.shimSenderGetStats(window);\n      firefoxShim.shimReceiverGetStats(window);\n      firefoxShim.shimRTCDataChannel(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n        logging('MS edge shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = edgeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      edgeShim.shimGetUserMedia(window);\n      edgeShim.shimPeerConnection(window);\n      edgeShim.shimReplaceTrack(window);\n\n      // the edge shim implements the full RTCIceCandidate object.\n\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'safari':\n      if (!safariShim || !options.shimSafari) {\n        logging('Safari shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = safariShim;\n      commonShim.shimCreateObjectURL(window);\n\n      safariShim.shimRTCIceServerUrls(window);\n      safariShim.shimCreateOfferLegacy(window);\n      safariShim.shimCallbacksAPI(window);\n      safariShim.shimLocalStreamsAPI(window);\n      safariShim.shimRemoteStreamsAPI(window);\n      safariShim.shimTrackEventTransceiver(window);\n      safariShim.shimGetUserMedia(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    default:\n      logging('Unsupported browser!');\n      break;\n  }\n\n  return adapter;\n};\n\n},{\"./chrome/chrome_shim\":5,\"./common_shim\":7,\"./edge/edge_shim\":8,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":13,\"./utils\":14}],5:[function(require,module,exports){\n\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n  if (!base || resultSet.has(base.id)) {\n    return;\n  }\n  resultSet.set(base.id, base);\n  Object.keys(base).forEach(function(name) {\n    if (name.endsWith('Id')) {\n      walkStats(stats, stats.get(base[name]), resultSet);\n    } else if (name.endsWith('Ids')) {\n      base[name].forEach(function(id) {\n        walkStats(stats, stats.get(id), resultSet);\n      });\n    }\n  });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n  var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n  var filteredResult = new Map();\n  if (track === null) {\n    return filteredResult;\n  }\n  var trackStats = [];\n  result.forEach(function(value) {\n    if (value.type === 'track' &&\n        value.trackIdentifier === track.id) {\n      trackStats.push(value);\n    }\n  });\n  trackStats.forEach(function(trackStat) {\n    result.forEach(function(stats) {\n      if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n        walkStats(result, stats, filteredResult);\n      }\n    });\n  });\n  return filteredResult;\n}\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimMediaStream: function(window) {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n          }\n          this.addEventListener('track', this._ontrack = f);\n        },\n        enumerable: true,\n        configurable: true\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!pc._ontrackpoly) {\n          pc._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === te.track.id;\n                });\n              } else {\n                receiver = {track: te.track};\n              }\n\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === track.id;\n                });\n              } else {\n                receiver = {track: track};\n              }\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n          };\n          pc.addEventListener('addstream', pc._ontrackpoly);\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    } else {\n      // even if RTCRtpTransceiver is in window, it is only used and\n      // emitted in unified-plan. Unfortunately this means we need\n      // to unconditionally wrap the event.\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        if (!e.transceiver) {\n          Object.defineProperty(e, 'transceiver',\n            {value: {receiver: e.receiver}});\n        }\n        return e;\n      });\n    }\n  },\n\n  shimGetSendersWithDtmf: function(window) {\n    // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        !('getSenders' in window.RTCPeerConnection.prototype) &&\n        'createDTMFSender' in window.RTCPeerConnection.prototype) {\n      var shimSenderWithDtmf = function(pc, track) {\n        return {\n          track: track,\n          get dtmf() {\n            if (this._dtmf === undefined) {\n              if (track.kind === 'audio') {\n                this._dtmf = pc.createDTMFSender(track);\n              } else {\n                this._dtmf = null;\n              }\n            }\n            return this._dtmf;\n          },\n          _pc: pc\n        };\n      };\n\n      // augment addTrack when getSenders is not available.\n      if (!window.RTCPeerConnection.prototype.getSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          this._senders = this._senders || [];\n          return this._senders.slice(); // return a copy of the internal state.\n        };\n        var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n        window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n          var pc = this;\n          var sender = origAddTrack.apply(pc, arguments);\n          if (!sender) {\n            sender = shimSenderWithDtmf(pc, track);\n            pc._senders.push(sender);\n          }\n          return sender;\n        };\n\n        var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n        window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n          var pc = this;\n          origRemoveTrack.apply(pc, arguments);\n          var idx = pc._senders.indexOf(sender);\n          if (idx !== -1) {\n            pc._senders.splice(idx, 1);\n          }\n        };\n      }\n      var origAddStream = window.RTCPeerConnection.prototype.addStream;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origAddStream.apply(pc, [stream]);\n        stream.getTracks().forEach(function(track) {\n          pc._senders.push(shimSenderWithDtmf(pc, track));\n        });\n      };\n\n      var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origRemoveStream.apply(pc, [stream]);\n\n        stream.getTracks().forEach(function(track) {\n          var sender = pc._senders.find(function(s) {\n            return s.track === track;\n          });\n          if (sender) {\n            pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender\n          }\n        });\n      };\n    } else if (typeof window === 'object' && window.RTCPeerConnection &&\n               'getSenders' in window.RTCPeerConnection.prototype &&\n               'createDTMFSender' in window.RTCPeerConnection.prototype &&\n               window.RTCRtpSender &&\n               !('dtmf' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = this._pc.createDTMFSender(this.track);\n            } else {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n  },\n\n  shimSenderReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender && window.RTCRtpReceiver)) {\n      return;\n    }\n\n    // shim sender stats.\n    if (!('getStats' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      if (origGetSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          var pc = this;\n          var senders = origGetSenders.apply(pc, []);\n          senders.forEach(function(sender) {\n            sender._pc = pc;\n          });\n          return senders;\n        };\n      }\n\n      var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n      if (origAddTrack) {\n        window.RTCPeerConnection.prototype.addTrack = function() {\n          var sender = origAddTrack.apply(this, arguments);\n          sender._pc = this;\n          return sender;\n        };\n      }\n      window.RTCRtpSender.prototype.getStats = function() {\n        var sender = this;\n        return this._pc.getStats().then(function(result) {\n          /* Note: this will include stats of all senders that\n           *   send a track with the same id as sender.track as\n           *   it is not possible to identify the RTCRtpSender.\n           */\n          return filterStats(result, sender.track, true);\n        });\n      };\n    }\n\n    // shim receiver stats.\n    if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n      var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n      if (origGetReceivers) {\n        window.RTCPeerConnection.prototype.getReceivers = function() {\n          var pc = this;\n          var receivers = origGetReceivers.apply(pc, []);\n          receivers.forEach(function(receiver) {\n            receiver._pc = pc;\n          });\n          return receivers;\n        };\n      }\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        e.receiver._pc = e.srcElement;\n        return e;\n      });\n      window.RTCRtpReceiver.prototype.getStats = function() {\n        var receiver = this;\n        return this._pc.getStats().then(function(result) {\n          return filterStats(result, receiver.track, false);\n        });\n      };\n    }\n\n    if (!('getStats' in window.RTCRtpSender.prototype &&\n        'getStats' in window.RTCRtpReceiver.prototype)) {\n      return;\n    }\n\n    // shim RTCPeerConnection.getStats(track).\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var pc = this;\n      if (arguments.length > 0 &&\n          arguments[0] instanceof window.MediaStreamTrack) {\n        var track = arguments[0];\n        var sender;\n        var receiver;\n        var err;\n        pc.getSenders().forEach(function(s) {\n          if (s.track === track) {\n            if (sender) {\n              err = true;\n            } else {\n              sender = s;\n            }\n          }\n        });\n        pc.getReceivers().forEach(function(r) {\n          if (r.track === track) {\n            if (receiver) {\n              err = true;\n            } else {\n              receiver = r;\n            }\n          }\n          return r.track === track;\n        });\n        if (err || (sender && receiver)) {\n          return Promise.reject(new DOMException(\n            'There are more than one sender or receiver for the track.',\n            'InvalidAccessError'));\n        } else if (sender) {\n          return sender.getStats();\n        } else if (receiver) {\n          return receiver.getStats();\n        }\n        return Promise.reject(new DOMException(\n          'There is no sender or receiver for the track.',\n          'InvalidAccessError'));\n      }\n      return origGetStats.apply(pc, arguments);\n    };\n  },\n\n  shimSourceObject: function(window) {\n    var URL = window && window.URL;\n\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return undefined;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimAddTrackRemoveTrackWithNative: function(window) {\n    // shim addTrack/removeTrack with native variants in order to make\n    // the interactions with legacy getLocalStreams behave as in other browsers.\n    // Keeps a mapping stream.id => [stream, rtpsenders...]\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      return Object.keys(this._shimmedLocalStreams).map(function(streamId) {\n        return pc._shimmedLocalStreams[streamId][0];\n      });\n    };\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      if (!stream) {\n        return origAddTrack.apply(this, arguments);\n      }\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      var sender = origAddTrack.apply(this, arguments);\n      if (!this._shimmedLocalStreams[stream.id]) {\n        this._shimmedLocalStreams[stream.id] = [stream, sender];\n      } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n        this._shimmedLocalStreams[stream.id].push(sender);\n      }\n      return sender;\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      var existingSenders = pc.getSenders();\n      origAddStream.apply(this, arguments);\n      var newSenders = pc.getSenders().filter(function(newSender) {\n        return existingSenders.indexOf(newSender) === -1;\n      });\n      this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      delete this._shimmedLocalStreams[stream.id];\n      return origRemoveStream.apply(this, arguments);\n    };\n\n    var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      if (sender) {\n        Object.keys(this._shimmedLocalStreams).forEach(function(streamId) {\n          var idx = pc._shimmedLocalStreams[streamId].indexOf(sender);\n          if (idx !== -1) {\n            pc._shimmedLocalStreams[streamId].splice(idx, 1);\n          }\n          if (pc._shimmedLocalStreams[streamId].length === 1) {\n            delete pc._shimmedLocalStreams[streamId];\n          }\n        });\n      }\n      return origRemoveTrack.apply(this, arguments);\n    };\n  },\n\n  shimAddTrackRemoveTrack: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n    // shim addTrack and removeTrack.\n    if (window.RTCPeerConnection.prototype.addTrack &&\n        browserDetails.version >= 65) {\n      return this.shimAddTrackRemoveTrackWithNative(window);\n    }\n\n    // also shim pc.getLocalStreams when addTrack is shimmed\n    // to return the original streams.\n    var origGetLocalStreams = window.RTCPeerConnection.prototype\n        .getLocalStreams;\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      var nativeStreams = origGetLocalStreams.apply(this);\n      pc._reverseStreams = pc._reverseStreams || {};\n      return nativeStreams.map(function(stream) {\n        return pc._reverseStreams[stream.id];\n      });\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      // Add identity mapping for consistency with addTrack.\n      // Unless this is being used with a stream from addTrack.\n      if (!pc._reverseStreams[stream.id]) {\n        var newStream = new window.MediaStream(stream.getTracks());\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        stream = newStream;\n      }\n      origAddStream.apply(pc, [stream]);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);\n      delete pc._reverseStreams[(pc._streams[stream.id] ?\n          pc._streams[stream.id].id : stream.id)];\n      delete pc._streams[stream.id];\n    };\n\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      var streams = [].slice.call(arguments, 1);\n      if (streams.length !== 1 ||\n          !streams[0].getTracks().find(function(t) {\n            return t === track;\n          })) {\n        // this is not fully correct but all we can manage without\n        // [[associated MediaStreams]] internal slot.\n        throw new DOMException(\n          'The adapter.js addTrack polyfill only supports a single ' +\n          ' stream which is associated with the specified track.',\n          'NotSupportedError');\n      }\n\n      var alreadyExists = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n      var oldStream = pc._streams[stream.id];\n      if (oldStream) {\n        // this is using odd Chrome behaviour, use with caution:\n        // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n        // Note: we rely on the high-level addTrack/dtmf shim to\n        // create the sender with a dtmf sender.\n        oldStream.addTrack(track);\n\n        // Trigger ONN async.\n        Promise.resolve().then(function() {\n          pc.dispatchEvent(new Event('negotiationneeded'));\n        });\n      } else {\n        var newStream = new window.MediaStream([track]);\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        pc.addStream(newStream);\n      }\n      return pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n    };\n\n    // replace the internal stream id with the external one and\n    // vice versa.\n    function replaceInternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n            externalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    function replaceExternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n            internalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = window.RTCPeerConnection.prototype[method];\n      window.RTCPeerConnection.prototype[method] = function() {\n        var pc = this;\n        var args = arguments;\n        var isLegacyCall = arguments.length &&\n            typeof arguments[0] === 'function';\n        if (isLegacyCall) {\n          return nativeMethod.apply(pc, [\n            function(description) {\n              var desc = replaceInternalStreamId(pc, description);\n              args[0].apply(null, [desc]);\n            },\n            function(err) {\n              if (args[1]) {\n                args[1].apply(null, err);\n              }\n            }, arguments[2]\n          ]);\n        }\n        return nativeMethod.apply(pc, arguments)\n        .then(function(description) {\n          return replaceInternalStreamId(pc, description);\n        });\n      };\n    });\n\n    var origSetLocalDescription =\n        window.RTCPeerConnection.prototype.setLocalDescription;\n    window.RTCPeerConnection.prototype.setLocalDescription = function() {\n      var pc = this;\n      if (!arguments.length || !arguments[0].type) {\n        return origSetLocalDescription.apply(pc, arguments);\n      }\n      arguments[0] = replaceExternalStreamId(pc, arguments[0]);\n      return origSetLocalDescription.apply(pc, arguments);\n    };\n\n    // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n    var origLocalDescription = Object.getOwnPropertyDescriptor(\n        window.RTCPeerConnection.prototype, 'localDescription');\n    Object.defineProperty(window.RTCPeerConnection.prototype,\n        'localDescription', {\n          get: function() {\n            var pc = this;\n            var description = origLocalDescription.get.apply(this);\n            if (description.type === '') {\n              return description;\n            }\n            return replaceInternalStreamId(pc, description);\n          }\n        });\n\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      // We can not yet check for sender instanceof RTCRtpSender\n      // since we shim RTPSender. So we check if sender._pc is set.\n      if (!sender._pc) {\n        throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n            'does not implement interface RTCRtpSender.', 'TypeError');\n      }\n      var isLocal = sender._pc === pc;\n      if (!isLocal) {\n        throw new DOMException('Sender was not created by this connection.',\n            'InvalidAccessError');\n      }\n\n      // Search for the native stream the senders track belongs to.\n      pc._streams = pc._streams || {};\n      var stream;\n      Object.keys(pc._streams).forEach(function(streamid) {\n        var hasTrack = pc._streams[streamid].getTracks().find(function(track) {\n          return sender.track === track;\n        });\n        if (hasTrack) {\n          stream = pc._streams[streamid];\n        }\n      });\n\n      if (stream) {\n        if (stream.getTracks().length === 1) {\n          // if this is the last track of the stream, remove the stream. This\n          // takes care of any shimmed _senders.\n          pc.removeStream(pc._reverseStreams[stream.id]);\n        } else {\n          // relying on the same odd chrome behaviour as above.\n          stream.removeTrack(sender.track);\n        }\n        pc.dispatchEvent(new Event('negotiationneeded'));\n      }\n    };\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        // Translate iceTransportPolicy to iceTransports,\n        // see https://code.google.com/p/webrtc/issues/detail?id=4869\n        // this was fixed in M56 along with unprefixing RTCPeerConnection.\n        logging('PeerConnection');\n        if (pcConfig && pcConfig.iceTransportPolicy) {\n          pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n        }\n\n        return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.webkitRTCPeerConnection.prototype;\n      // wrap static methods. Currently just generateCertificate.\n      if (window.webkitRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.webkitRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n    }\n\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(selector,\n        successCallback, errorCallback) {\n      var pc = this;\n      var args = arguments;\n\n      // If selector is a function then we are in the old style stats so just\n      // pass back the original getStats format to avoid breaking old users.\n      if (arguments.length > 0 && typeof selector === 'function') {\n        return origGetStats.apply(this, arguments);\n      }\n\n      // When spec-style getStats is supported, return those when called with\n      // either no arguments or the selector argument is null.\n      if (origGetStats.length === 0 && (arguments.length === 0 ||\n          typeof arguments[0] !== 'function')) {\n        return origGetStats.apply(this, []);\n      }\n\n      var fixChromeStats_ = function(response) {\n        var standardReport = {};\n        var reports = response.result();\n        reports.forEach(function(report) {\n          var standardStats = {\n            id: report.id,\n            timestamp: report.timestamp,\n            type: {\n              localcandidate: 'local-candidate',\n              remotecandidate: 'remote-candidate'\n            }[report.type] || report.type\n          };\n          report.names().forEach(function(name) {\n            standardStats[name] = report.stat(name);\n          });\n          standardReport[standardStats.id] = standardStats;\n        });\n\n        return standardReport;\n      };\n\n      // shim getStats with maplike support\n      var makeMapStats = function(stats) {\n        return new Map(Object.keys(stats).map(function(key) {\n          return [key, stats[key]];\n        }));\n      };\n\n      if (arguments.length >= 2) {\n        var successCallbackWrapper_ = function(response) {\n          args[1](makeMapStats(fixChromeStats_(response)));\n        };\n\n        return origGetStats.apply(this, [successCallbackWrapper_,\n          arguments[0]]);\n      }\n\n      // promise-support\n      return new Promise(function(resolve, reject) {\n        origGetStats.apply(pc, [\n          function(response) {\n            resolve(makeMapStats(fixChromeStats_(response)));\n          }, reject]);\n      }).then(successCallback, errorCallback);\n    };\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = window.RTCPeerConnection.prototype[method];\n            window.RTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var pc = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(pc, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // promise support for createOffer and createAnswer. Available (without\n    // bugs) since M52: crbug/619289\n    if (browserDetails.version < 52) {\n      ['createOffer', 'createAnswer'].forEach(function(method) {\n        var nativeMethod = window.RTCPeerConnection.prototype[method];\n        window.RTCPeerConnection.prototype[method] = function() {\n          var pc = this;\n          if (arguments.length < 1 || (arguments.length === 1 &&\n              typeof arguments[0] === 'object')) {\n            var opts = arguments.length === 1 ? arguments[0] : undefined;\n            return new Promise(function(resolve, reject) {\n              nativeMethod.apply(pc, [resolve, reject, opts]);\n            });\n          }\n          return nativeMethod.apply(this, arguments);\n        };\n      });\n    }\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n  },\n\n  fixNegotiationNeeded: function(window) {\n    utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function(e) {\n      var pc = e.target;\n      if (pc.signalingState !== 'stable') {\n        return;\n      }\n      return e;\n    });\n  },\n\n  shimGetDisplayMedia: function(window, getSourceId) {\n    if ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    // getSourceId is a function that returns a promise resolving with\n    // the sourceId of the screen/window/tab to be shared.\n    if (typeof getSourceId !== 'function') {\n      console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n          'a function');\n      return;\n    }\n    navigator.getDisplayMedia = function(constraints) {\n      return getSourceId(constraints)\n        .then(function(sourceId) {\n          constraints.video = {\n            mandatory: {\n              chromeMediaSource: 'desktop',\n              chromeMediaSourceId: sourceId,\n              maxFrameRate: constraints.video.frameRate || 3\n            }\n          };\n          return navigator.mediaDevices.getUserMedia(constraints);\n        });\n    };\n  }\n};\n\n},{\"../utils.js\":14,\"./getusermedia\":6}],6:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    if (browserDetails.version >= 61) {\n      return func(constraints);\n    }\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && typeof constraints.audio === 'object') {\n      var remap = function(obj, a, b) {\n        if (a in obj && !(b in obj)) {\n          obj[b] = obj[a];\n          delete obj[a];\n        }\n      };\n      constraints = JSON.parse(JSON.stringify(constraints));\n      remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n      remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile & surface pro.\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n      var getSupportedFacingModeLies = browserDetails.version < 66;\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode &&\n            !getSupportedFacingModeLies)) {\n        delete constraints.video.facingMode;\n        var matches;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          matches = ['back', 'rear'];\n        } else if (face.exact === 'user' || face.ideal === 'user') {\n          matches = ['front'];\n        }\n        if (matches) {\n          // Look for matches in label, or use last cam for back (typical).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var dev = devices.find(function(d) {\n              return matches.some(function(match) {\n                return d.label.toLowerCase().indexOf(match) !== -1;\n              });\n            });\n            if (!dev && devices.length && matches.indexOf('back') !== -1) {\n              dev = devices[devices.length - 1]; // more likely the back cam\n            }\n            if (dev) {\n              constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n                                                        {ideal: dev.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    if (browserDetails.version >= 64) {\n      return e;\n    }\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        PermissionDismissedError: 'NotAllowedError',\n        InvalidStateError: 'NotAllowedError',\n        DevicesNotFoundError: 'NotFoundError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError',\n        TrackStartError: 'NotReadableError',\n        MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n        MediaDeviceKillSwitchOn: 'NotAllowedError',\n        TabCaptureError: 'AbortError',\n        ScreenCaptureError: 'AbortError',\n        DeviceCaptureError: 'AbortError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint || e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        if (onError) {\n          onError(shimError_(e));\n        }\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return window.MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                kind: kinds[device.kind],\n                deviceId: device.id,\n                groupId: ''};\n            }));\n          });\n        });\n      },\n      getSupportedConstraints: function() {\n        return {\n          deviceId: true, echoCancellation: true, facingMode: true,\n          frameRate: true, height: true, width: true\n        };\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).then(function(stream) {\n          if (c.audio && !stream.getAudioTracks().length ||\n              c.video && !stream.getVideoTracks().length) {\n            stream.getTracks().forEach(function(track) {\n              track.stop();\n            });\n            throw new DOMException('', 'NotFoundError');\n          }\n          return stream;\n        }, function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n\n},{\"../utils.js\":14}],7:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\nvar utils = require('./utils');\n\nmodule.exports = {\n  shimRTCIceCandidate: function(window) {\n    // foundation is arbitrarily chosen as an indicator for full support for\n    // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n    if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n        window.RTCIceCandidate.prototype)) {\n      return;\n    }\n\n    var NativeRTCIceCandidate = window.RTCIceCandidate;\n    window.RTCIceCandidate = function(args) {\n      // Remove the a= which shouldn't be part of the candidate string.\n      if (typeof args === 'object' && args.candidate &&\n          args.candidate.indexOf('a=') === 0) {\n        args = JSON.parse(JSON.stringify(args));\n        args.candidate = args.candidate.substr(2);\n      }\n\n      if (args.candidate && args.candidate.length) {\n        // Augment the native candidate with the parsed fields.\n        var nativeCandidate = new NativeRTCIceCandidate(args);\n        var parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n        var augmentedCandidate = Object.assign(nativeCandidate,\n            parsedCandidate);\n\n        // Add a serializer that does not serialize the extra attributes.\n        augmentedCandidate.toJSON = function() {\n          return {\n            candidate: augmentedCandidate.candidate,\n            sdpMid: augmentedCandidate.sdpMid,\n            sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n            usernameFragment: augmentedCandidate.usernameFragment,\n          };\n        };\n        return augmentedCandidate;\n      }\n      return new NativeRTCIceCandidate(args);\n    };\n    window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n    // Hook up the augmented candidate in onicecandidate and\n    // addEventListener('icecandidate', ...)\n    utils.wrapPeerConnectionEvent(window, 'icecandidate', function(e) {\n      if (e.candidate) {\n        Object.defineProperty(e, 'candidate', {\n          value: new window.RTCIceCandidate(e.candidate),\n          writable: 'false'\n        });\n      }\n      return e;\n    });\n  },\n\n  // shimCreateObjectURL must be called before shimSourceObject to avoid loop.\n\n  shimCreateObjectURL: function(window) {\n    var URL = window && window.URL;\n\n    if (!(typeof window === 'object' && window.HTMLMediaElement &&\n          'srcObject' in window.HTMLMediaElement.prototype &&\n        URL.createObjectURL && URL.revokeObjectURL)) {\n      // Only shim CreateObjectURL using srcObject if srcObject exists.\n      return undefined;\n    }\n\n    var nativeCreateObjectURL = URL.createObjectURL.bind(URL);\n    var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);\n    var streams = new Map(), newId = 0;\n\n    URL.createObjectURL = function(stream) {\n      if ('getTracks' in stream) {\n        var url = 'polyblob:' + (++newId);\n        streams.set(url, stream);\n        utils.deprecated('URL.createObjectURL(stream)',\n            'elem.srcObject = stream');\n        return url;\n      }\n      return nativeCreateObjectURL(stream);\n    };\n    URL.revokeObjectURL = function(url) {\n      nativeRevokeObjectURL(url);\n      streams.delete(url);\n    };\n\n    var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,\n                                              'src');\n    Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {\n      get: function() {\n        return dsc.get.apply(this);\n      },\n      set: function(url) {\n        this.srcObject = streams.get(url) || null;\n        return dsc.set.apply(this, [url]);\n      }\n    });\n\n    var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;\n    window.HTMLMediaElement.prototype.setAttribute = function() {\n      if (arguments.length === 2 &&\n          ('' + arguments[0]).toLowerCase() === 'src') {\n        this.srcObject = streams.get(arguments[1]) || null;\n      }\n      return nativeSetAttribute.apply(this, arguments);\n    };\n  },\n\n  shimMaxMessageSize: function(window) {\n    if (window.RTCSctpTransport || !window.RTCPeerConnection) {\n      return;\n    }\n    var browserDetails = utils.detectBrowser(window);\n\n    if (!('sctp' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n        get: function() {\n          return typeof this._sctp === 'undefined' ? null : this._sctp;\n        }\n      });\n    }\n\n    var sctpInDescription = function(description) {\n      var sections = SDPUtils.splitSections(description.sdp);\n      sections.shift();\n      return sections.some(function(mediaSection) {\n        var mLine = SDPUtils.parseMLine(mediaSection);\n        return mLine && mLine.kind === 'application'\n            && mLine.protocol.indexOf('SCTP') !== -1;\n      });\n    };\n\n    var getRemoteFirefoxVersion = function(description) {\n      // TODO: Is there a better solution for detecting Firefox?\n      var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n      if (match === null || match.length < 2) {\n        return -1;\n      }\n      var version = parseInt(match[1], 10);\n      // Test for NaN (yes, this is ugly)\n      return version !== version ? -1 : version;\n    };\n\n    var getCanSendMaxMessageSize = function(remoteIsFirefox) {\n      // Every implementation we know can send at least 64 KiB.\n      // Note: Although Chrome is technically able to send up to 256 KiB, the\n      //       data does not reach the other peer reliably.\n      //       See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n      var canSendMaxMessageSize = 65536;\n      if (browserDetails.browser === 'firefox') {\n        if (browserDetails.version < 57) {\n          if (remoteIsFirefox === -1) {\n            // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n            // fragmentation.\n            canSendMaxMessageSize = 16384;\n          } else {\n            // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n            // messages. Thus, supporting ~2 GiB when sending.\n            canSendMaxMessageSize = 2147483637;\n          }\n        } else if (browserDetails.version < 60) {\n          // Currently, all FF >= 57 will reset the remote maximum message size\n          // to the default value when a data channel is created at a later\n          // stage. :(\n          // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n          canSendMaxMessageSize =\n            browserDetails.version === 57 ? 65535 : 65536;\n        } else {\n          // FF >= 60 supports sending ~2 GiB\n          canSendMaxMessageSize = 2147483637;\n        }\n      }\n      return canSendMaxMessageSize;\n    };\n\n    var getMaxMessageSize = function(description, remoteIsFirefox) {\n      // Note: 65536 bytes is the default value from the SDP spec. Also,\n      //       every implementation we know supports receiving 65536 bytes.\n      var maxMessageSize = 65536;\n\n      // FF 57 has a slightly incorrect default remote max message size, so\n      // we need to adjust it here to avoid a failure when sending.\n      // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n      if (browserDetails.browser === 'firefox'\n           && browserDetails.version === 57) {\n        maxMessageSize = 65535;\n      }\n\n      var match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:');\n      if (match.length > 0) {\n        maxMessageSize = parseInt(match[0].substr(19), 10);\n      } else if (browserDetails.browser === 'firefox' &&\n                  remoteIsFirefox !== -1) {\n        // If the maximum message size is not present in the remote SDP and\n        // both local and remote are Firefox, the remote peer can receive\n        // ~2 GiB.\n        maxMessageSize = 2147483637;\n      }\n      return maxMessageSize;\n    };\n\n    var origSetRemoteDescription =\n        window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n      var pc = this;\n      pc._sctp = null;\n\n      if (sctpInDescription(arguments[0])) {\n        // Check if the remote is FF.\n        var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n        // Get the maximum message size the local peer is capable of sending\n        var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n        // Get the maximum message size of the remote peer.\n        var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n        // Determine final maximum message size\n        var maxMessageSize;\n        if (canSendMMS === 0 && remoteMMS === 0) {\n          maxMessageSize = Number.POSITIVE_INFINITY;\n        } else if (canSendMMS === 0 || remoteMMS === 0) {\n          maxMessageSize = Math.max(canSendMMS, remoteMMS);\n        } else {\n          maxMessageSize = Math.min(canSendMMS, remoteMMS);\n        }\n\n        // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n        // attribute.\n        var sctp = {};\n        Object.defineProperty(sctp, 'maxMessageSize', {\n          get: function() {\n            return maxMessageSize;\n          }\n        });\n        pc._sctp = sctp;\n      }\n\n      return origSetRemoteDescription.apply(pc, arguments);\n    };\n  },\n\n  shimSendThrowTypeError: function(window) {\n    if (!(window.RTCPeerConnection &&\n        'createDataChannel' in window.RTCPeerConnection.prototype)) {\n      return;\n    }\n\n    // Note: Although Firefox >= 57 has a native implementation, the maximum\n    //       message size can be reset for all data channels at a later stage.\n    //       See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n    function wrapDcSend(dc, pc) {\n      var origDataChannelSend = dc.send;\n      dc.send = function() {\n        var data = arguments[0];\n        var length = data.length || data.size || data.byteLength;\n        if (dc.readyState === 'open' &&\n            pc.sctp && length > pc.sctp.maxMessageSize) {\n          throw new TypeError('Message too large (can send a maximum of ' +\n            pc.sctp.maxMessageSize + ' bytes)');\n        }\n        return origDataChannelSend.apply(dc, arguments);\n      };\n    }\n    var origCreateDataChannel =\n      window.RTCPeerConnection.prototype.createDataChannel;\n    window.RTCPeerConnection.prototype.createDataChannel = function() {\n      var pc = this;\n      var dataChannel = origCreateDataChannel.apply(pc, arguments);\n      wrapDcSend(dataChannel, pc);\n      return dataChannel;\n    };\n    utils.wrapPeerConnectionEvent(window, 'datachannel', function(e) {\n      wrapDcSend(e.channel, e.target);\n      return e;\n    });\n  }\n};\n\n},{\"./utils\":14,\"sdp\":2}],8:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar filterIceServers = require('./filtericeservers');\nvar shimRTCPeerConnection = require('rtcpeerconnection-shim');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (window.RTCIceGatherer) {\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n      // this adds an additional event listener to MediaStrackTrack that signals\n      // when a tracks enabled property was changed. Workaround for a bug in\n      // addStream, see below. No longer required in 15025+\n      if (browserDetails.version < 15025) {\n        var origMSTEnabled = Object.getOwnPropertyDescriptor(\n            window.MediaStreamTrack.prototype, 'enabled');\n        Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n          set: function(value) {\n            origMSTEnabled.set.call(this, value);\n            var ev = new Event('enabled');\n            ev.enabled = value;\n            this.dispatchEvent(ev);\n          }\n        });\n      }\n    }\n\n    // ORTC defines the DTMF sender a bit different.\n    // https://github.com/w3c/ortc/issues/714\n    if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = new window.RTCDtmfSender(this);\n            } else if (this.track.kind === 'video') {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n    // Edge currently only implements the RTCDtmfSender, not the\n    // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n    if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n      window.RTCDTMFSender = window.RTCDtmfSender;\n    }\n\n    var RTCPeerConnectionShim = shimRTCPeerConnection(window,\n        browserDetails.version);\n    window.RTCPeerConnection = function(config) {\n      if (config && config.iceServers) {\n        config.iceServers = filterIceServers(config.iceServers);\n      }\n      return new RTCPeerConnectionShim(config);\n    };\n    window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n  },\n  shimReplaceTrack: function(window) {\n    // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n    if (window.RTCRtpSender &&\n        !('replaceTrack' in window.RTCRtpSender.prototype)) {\n      window.RTCRtpSender.prototype.replaceTrack =\n          window.RTCRtpSender.prototype.setTrack;\n    }\n  }\n};\n\n},{\"../utils\":14,\"./filtericeservers\":9,\"./getusermedia\":10,\"rtcpeerconnection-shim\":1}],9:[function(require,module,exports){\n/*\n *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nmodule.exports = function(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n};\n\n},{\"../utils\":14}],10:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var navigator = window && window.navigator;\n\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n\n},{}],11:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.transceiver = {receiver: event.receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        },\n        enumerable: true,\n        configurable: true\n      });\n    }\n    if (typeof window === 'object' && window.RTCTrackEvent &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        !('transceiver' in window.RTCTrackEvent.prototype)) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function(window) {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new window.mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (window.mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = window.mozRTCSessionDescription;\n      window.RTCIceCandidate = window.mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim getStats with maplike support\n    var makeMapStats = function(stats) {\n      var map = new Map();\n      Object.keys(stats).forEach(function(key) {\n        map.set(key, stats[key]);\n        map[key] = stats[key];\n      });\n      return map;\n    };\n\n    var modernStatsTypes = {\n      inboundrtp: 'inbound-rtp',\n      outboundrtp: 'outbound-rtp',\n      candidatepair: 'candidate-pair',\n      localcandidate: 'local-candidate',\n      remotecandidate: 'remote-candidate'\n    };\n\n    var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(\n      selector,\n      onSucc,\n      onErr\n    ) {\n      return nativeGetStats.apply(this, [selector || null])\n        .then(function(stats) {\n          if (browserDetails.version < 48) {\n            stats = makeMapStats(stats);\n          }\n          if (browserDetails.version < 53 && !onSucc) {\n            // Shim only promise getStats with spec-hyphens in type names\n            // Leave callback version alone; misc old uses of forEach before Map\n            try {\n              stats.forEach(function(stat) {\n                stat.type = modernStatsTypes[stat.type] || stat.type;\n              });\n            } catch (e) {\n              if (e.name !== 'TypeError') {\n                throw e;\n              }\n              // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n              stats.forEach(function(stat, i) {\n                stats.set(i, Object.assign({}, stat, {\n                  type: modernStatsTypes[stat.type] || stat.type\n                }));\n              });\n            }\n          }\n          return stats;\n        })\n        .then(onSucc, onErr);\n    };\n  },\n\n  shimSenderGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n      return;\n    }\n    var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    if (origGetSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n    }\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    if (origAddTrack) {\n      window.RTCPeerConnection.prototype.addTrack = function() {\n        var sender = origAddTrack.apply(this, arguments);\n        sender._pc = this;\n        return sender;\n      };\n    }\n    window.RTCRtpSender.prototype.getStats = function() {\n      return this.track ? this._pc.getStats(this.track) :\n          Promise.resolve(new Map());\n    };\n  },\n\n  shimReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n      return;\n    }\n    var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n    if (origGetReceivers) {\n      window.RTCPeerConnection.prototype.getReceivers = function() {\n        var pc = this;\n        var receivers = origGetReceivers.apply(pc, []);\n        receivers.forEach(function(receiver) {\n          receiver._pc = pc;\n        });\n        return receivers;\n      };\n    }\n    utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n      e.receiver._pc = e.srcElement;\n      return e;\n    });\n    window.RTCRtpReceiver.prototype.getStats = function() {\n      return this._pc.getStats(this.track);\n    };\n  },\n\n  shimRemoveStream: function(window) {\n    if (!window.RTCPeerConnection ||\n        'removeStream' in window.RTCPeerConnection.prototype) {\n      return;\n    }\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      utils.deprecated('removeStream', 'removeTrack');\n      this.getSenders().forEach(function(sender) {\n        if (sender.track && stream.getTracks().indexOf(sender.track) !== -1) {\n          pc.removeTrack(sender);\n        }\n      });\n    };\n  },\n\n  shimRTCDataChannel: function(window) {\n    // rename DataChannel to RTCDataChannel (native fix in FF60):\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n    if (window.DataChannel && !window.RTCDataChannel) {\n      window.RTCDataChannel = window.DataChannel;\n    }\n  },\n\n  shimGetDisplayMedia: function(window, preferredMediaSource) {\n    if ('getDisplayMedia' in window.navigator) {\n      return;\n    }\n    navigator.getDisplayMedia = function(constraints) {\n      if (!(constraints && constraints.video)) {\n        var err = new DOMException('getDisplayMedia without video ' +\n            'constraints is undefined');\n        err.name = 'NotFoundError';\n        // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n        err.code = 8;\n        return Promise.reject(err);\n      }\n      if (constraints.video === true) {\n        constraints.video = {mediaSource: preferredMediaSource};\n      } else {\n        constraints.video.mediaSource = preferredMediaSource;\n      }\n      return navigator.mediaDevices.getUserMedia(constraints);\n    };\n  }\n};\n\n},{\"../utils\":14,\"./getusermedia\":12}],12:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n  var MediaStreamTrack = window && window.MediaStreamTrack;\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        InternalError: 'NotReadableError',\n        NotSupportedError: 'TypeError',\n        PermissionDeniedError: 'NotAllowedError',\n        SecurityError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).then(function(stream) {\n        // Work around https://bugzil.la/802326\n        if (c.audio && !stream.getAudioTracks().length ||\n            c.video && !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(function(track) {\n            track.stop();\n          });\n          throw new DOMException('The object can not be found here.',\n                                 'NotFoundError');\n        }\n        return stream;\n      }, function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  if (!(browserDetails.version > 55 &&\n      'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n    var remap = function(obj, a, b) {\n      if (a in obj && !(b in obj)) {\n        obj[b] = obj[a];\n        delete obj[a];\n      }\n    };\n\n    var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      if (typeof c === 'object' && typeof c.audio === 'object') {\n        c = JSON.parse(JSON.stringify(c));\n        remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n        remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n      }\n      return nativeGetUserMedia(c);\n    };\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n      var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n      MediaStreamTrack.prototype.getSettings = function() {\n        var obj = nativeGetSettings.apply(this, arguments);\n        remap(obj, 'mozAutoGainControl', 'autoGainControl');\n        remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n        return obj;\n      };\n    }\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n      var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n      MediaStreamTrack.prototype.applyConstraints = function(c) {\n        if (this.kind === 'audio' && typeof c === 'object') {\n          c = JSON.parse(JSON.stringify(c));\n          remap(c, 'autoGainControl', 'mozAutoGainControl');\n          remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n        }\n        return nativeApplyConstraints.apply(this, [c]);\n      };\n    }\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    utils.deprecated('navigator.getUserMedia',\n        'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n\n},{\"../utils\":14}],13:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimLocalStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getLocalStreams = function() {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        return this._localStreams;\n      };\n    }\n    if (!('getStreamById' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getStreamById = function(id) {\n        var result = null;\n        if (this._localStreams) {\n          this._localStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        if (this._remoteStreams) {\n          this._remoteStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        return result;\n      };\n    }\n    if (!('addStream' in window.RTCPeerConnection.prototype)) {\n      var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        if (this._localStreams.indexOf(stream) === -1) {\n          this._localStreams.push(stream);\n        }\n        var pc = this;\n        stream.getTracks().forEach(function(track) {\n          _addTrack.call(pc, track, stream);\n        });\n      };\n\n      window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n        if (stream) {\n          if (!this._localStreams) {\n            this._localStreams = [stream];\n          } else if (this._localStreams.indexOf(stream) === -1) {\n            this._localStreams.push(stream);\n          }\n        }\n        return _addTrack.call(this, track, stream);\n      };\n    }\n    if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        var index = this._localStreams.indexOf(stream);\n        if (index === -1) {\n          return;\n        }\n        this._localStreams.splice(index, 1);\n        var pc = this;\n        var tracks = stream.getTracks();\n        this.getSenders().forEach(function(sender) {\n          if (tracks.indexOf(sender.track) !== -1) {\n            pc.removeTrack(sender);\n          }\n        });\n      };\n    }\n  },\n  shimRemoteStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getRemoteStreams = function() {\n        return this._remoteStreams ? this._remoteStreams : [];\n      };\n    }\n    if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n        get: function() {\n          return this._onaddstream;\n        },\n        set: function(f) {\n          if (this._onaddstream) {\n            this.removeEventListener('addstream', this._onaddstream);\n          }\n          this.addEventListener('addstream', this._onaddstream = f);\n        }\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!this._onaddstreampoly) {\n          this.addEventListener('track', this._onaddstreampoly = function(e) {\n            e.streams.forEach(function(stream) {\n              if (!pc._remoteStreams) {\n                pc._remoteStreams = [];\n              }\n              if (pc._remoteStreams.indexOf(stream) >= 0) {\n                return;\n              }\n              pc._remoteStreams.push(stream);\n              var event = new Event('addstream');\n              event.stream = stream;\n              pc.dispatchEvent(event);\n            });\n          });\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    }\n  },\n  shimCallbacksAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    var prototype = window.RTCPeerConnection.prototype;\n    var createOffer = prototype.createOffer;\n    var createAnswer = prototype.createAnswer;\n    var setLocalDescription = prototype.setLocalDescription;\n    var setRemoteDescription = prototype.setRemoteDescription;\n    var addIceCandidate = prototype.addIceCandidate;\n\n    prototype.createOffer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createOffer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    prototype.createAnswer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createAnswer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    var withCallback = function(description, successCallback, failureCallback) {\n      var promise = setLocalDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setLocalDescription = withCallback;\n\n    withCallback = function(description, successCallback, failureCallback) {\n      var promise = setRemoteDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setRemoteDescription = withCallback;\n\n    withCallback = function(candidate, successCallback, failureCallback) {\n      var promise = addIceCandidate.apply(this, [candidate]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.addIceCandidate = withCallback;\n  },\n  shimGetUserMedia: function(window) {\n    var navigator = window && window.navigator;\n\n    if (!navigator.getUserMedia) {\n      if (navigator.webkitGetUserMedia) {\n        navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n      } else if (navigator.mediaDevices &&\n          navigator.mediaDevices.getUserMedia) {\n        navigator.getUserMedia = function(constraints, cb, errcb) {\n          navigator.mediaDevices.getUserMedia(constraints)\n          .then(cb, errcb);\n        }.bind(navigator);\n      }\n    }\n  },\n  shimRTCIceServerUrls: function(window) {\n    // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n    var OrigPeerConnection = window.RTCPeerConnection;\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      if (pcConfig && pcConfig.iceServers) {\n        var newIceServers = [];\n        for (var i = 0; i < pcConfig.iceServers.length; i++) {\n          var server = pcConfig.iceServers[i];\n          if (!server.hasOwnProperty('urls') &&\n              server.hasOwnProperty('url')) {\n            utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n            server = JSON.parse(JSON.stringify(server));\n            server.urls = server.url;\n            delete server.url;\n            newIceServers.push(server);\n          } else {\n            newIceServers.push(pcConfig.iceServers[i]);\n          }\n        }\n        pcConfig.iceServers = newIceServers;\n      }\n      return new OrigPeerConnection(pcConfig, pcConstraints);\n    };\n    window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n    // wrap static methods. Currently just generateCertificate.\n    if ('generateCertificate' in window.RTCPeerConnection) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return OrigPeerConnection.generateCertificate;\n        }\n      });\n    }\n  },\n  shimTrackEventTransceiver: function(window) {\n    // Add event.transceiver member over deprecated event.receiver\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        // can't check 'transceiver' in window.RTCTrackEvent.prototype, as it is\n        // defined for some reason even when window.RTCTransceiver is not.\n        !window.RTCTransceiver) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimCreateOfferLegacy: function(window) {\n    var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n    window.RTCPeerConnection.prototype.createOffer = function(offerOptions) {\n      var pc = this;\n      if (offerOptions) {\n        if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n        }\n        var audioTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'audio';\n        });\n        if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n          if (audioTransceiver.direction === 'sendrecv') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly');\n            } else {\n              audioTransceiver.direction = 'sendonly';\n            }\n          } else if (audioTransceiver.direction === 'recvonly') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive');\n            } else {\n              audioTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveAudio === true &&\n            !audioTransceiver) {\n          pc.addTransceiver('audio');\n        }\n\n\n        if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n        }\n        var videoTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'video';\n        });\n        if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n          if (videoTransceiver.direction === 'sendrecv') {\n            videoTransceiver.setDirection('sendonly');\n          } else if (videoTransceiver.direction === 'recvonly') {\n            videoTransceiver.setDirection('inactive');\n          }\n        } else if (offerOptions.offerToReceiveVideo === true &&\n            !videoTransceiver) {\n          pc.addTransceiver('video');\n        }\n      }\n      return origCreateOffer.apply(pc, arguments);\n    };\n  }\n};\n\n},{\"../utils\":14}],14:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n  var match = uastring.match(expr);\n  return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  var proto = window.RTCPeerConnection.prototype;\n  var nativeAddEventListener = proto.addEventListener;\n  proto.addEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap) {\n      return nativeAddEventListener.apply(this, arguments);\n    }\n    var wrappedCallback = function(e) {\n      var modifiedEvent = wrapper(e);\n      if (modifiedEvent) {\n        cb(modifiedEvent);\n      }\n    };\n    this._eventMap = this._eventMap || {};\n    this._eventMap[cb] = wrappedCallback;\n    return nativeAddEventListener.apply(this, [nativeEventName,\n      wrappedCallback]);\n  };\n\n  var nativeRemoveEventListener = proto.removeEventListener;\n  proto.removeEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap || !this._eventMap\n        || !this._eventMap[cb]) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    var unwrappedCb = this._eventMap[cb];\n    delete this._eventMap[cb];\n    return nativeRemoveEventListener.apply(this, [nativeEventName,\n      unwrappedCb]);\n  };\n\n  Object.defineProperty(proto, 'on' + eventNameToWrap, {\n    get: function() {\n      return this['_on' + eventNameToWrap];\n    },\n    set: function(cb) {\n      if (this['_on' + eventNameToWrap]) {\n        this.removeEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap]);\n        delete this['_on' + eventNameToWrap];\n      }\n      if (cb) {\n        this.addEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap] = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n}\n\n// Utility methods.\nmodule.exports = {\n  extractVersion: extractVersion,\n  wrapPeerConnectionEvent: wrapPeerConnectionEvent,\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  /**\n   * Disable or enable deprecation warnings\n   * @param {!boolean} bool set to true to disable warnings.\n   */\n  disableWarnings: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    deprecationWarnings_ = !bool;\n    return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Shows a deprecation warning suggesting the modern and spec-compatible API.\n   */\n  deprecated: function(oldMethod, newMethod) {\n    if (!deprecationWarnings_) {\n      return;\n    }\n    console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n        ' instead.');\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser and version\n   *     properties.\n   */\n  detectBrowser: function(window) {\n    var navigator = window && window.navigator;\n\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    if (navigator.mozGetUserMedia) { // Firefox.\n      result.browser = 'firefox';\n      result.version = extractVersion(navigator.userAgent,\n          /Firefox\\/(\\d+)\\./, 1);\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera.\n      // Version matches Chrome/WebRTC version.\n      result.browser = 'chrome';\n      result.version = extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/(\\d+)\\./, 2);\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n      result.browser = 'edge';\n      result.version = extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n    } else if (window.RTCPeerConnection &&\n        navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n      result.browser = 'safari';\n      result.version = extractVersion(navigator.userAgent,\n          /AppleWebKit\\/(\\d+)\\./, 1);\n    } else { // Default fallthrough: not supported.\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    return result;\n  }\n};\n\n},{}]},{},[3])(3)\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport { BASE_GROUP_FIELDS } from '../models/group';\nimport { BASE_PERSON, FULL_PERSON } from '../models/person';\nimport SearchAdapterMixin from '../search/adapter-mixin';\n\nconst versions = {\n    people: 'v2',\n    groups: 'v2',\n    locations: 'v1',\n    users: 'v1',\n    messages: 'v1',\n    notifications: 'v1'\n};\n\nconst ApplicationAdapter = DS.RESTAdapter.extend(SearchAdapterMixin, {\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    defaultSerializer: 'application',\n\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    pathForType(type) {\n        if (type.modelName) {\n            type = type.modelName;\n        }\n\n        type = Ember.String.camelize(type);\n        return pluralize(type);\n    },\n\n    createRecord(store, type, record) {\n        var snapshot = record._createSnapshot();\n        var data = store.serializerFor(type.modelName).serialize(snapshot, { includeId: true });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'POST', { data: data });\n    },\n\n    buildURL(type, id) {\n        return this._directoryUrl(type, id);\n    },\n\n    findRecord(store, type, id, snapshot) {\n        let data = {};\n        const traditional = true;\n\n        if (type.modelName === 'person') {\n            data = Object.assign({}, data, FULL_PERSON);\n        } else {\n            data = Object.assign({}, data, { fl: '*' });\n        }\n\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET', { data, traditional });\n    },\n\n    findQuery() {\n        return this.query(...arguments);\n    },\n\n    entityEndpoint(path, type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let host = !!this.host ? this.host : '';\n        if (type === 'person') {\n            return `${host}/platform/directory/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n        }\n\n        return `${host}/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n    },\n\n    findMultiEntity(store, params, requestType) {\n        if (!params) {\n            params = { limit: 25, fl: '*', _entity: 'all', facets: '*' };\n        }\n\n        if (requestType === 'search') {\n            // new style search instead of query\n            params = Object.assign({}, params, {\n                returnFields: [...BASE_PERSON.fl.split(','), ...BASE_GROUP_FIELDS]\n            });\n            return this.performSearch(params);\n        }\n\n        return Ember.RSVP.reject(new Error('old style search has been removed. Please update to new search'));\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2();\n    },\n\n    findFavoritesPublicApiV2() {\n        const url = this.get('application').pcV2Uri('api/v2/users/favorites');\n        const deferred = Ember.RSVP.defer();\n        this._findFavoritesPublicApiV2(url)\n            .then(res => {\n                this._handleFavorites(res, [], deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error trying to find favorites:', error);\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    _findFavoritesPublicApiV2(url, page = 1) {\n        return this.ajax(url, 'GET', {\n            data: {\n                pageNumber: page,\n                pageSize: 25\n            },\n            cache: false\n        });\n    },\n\n    _handleFavorites(data, collection, deferred, url) {\n        const results = data.entities;\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = collection.concat(results);\n\n        const nextPage = data.page + 1;\n        return this._findFavoritesPublicApiV2(url, nextPage)\n            .then(data => {\n                return this._handleFavorites(data, collection, deferred, url);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading favorites:', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    forwardVoicemail(voicemail, recipient, type, params = {}) {\n        let host = !!this.host ? this.host : '';\n        const url = `${host}/platform/${this.namespace}/v2/voicemail/messages`;\n        params = Object.assign({}, params, {\n            voicemailMessageId: voicemail,\n            userId: type === 'person' ? recipient : null,\n            groupId: type === 'group' ? recipient : null\n        });\n        return this.ajax(url, 'POST', { data: params, cache: false });\n    },\n\n    _findDirectReports(url, page = 1) {\n        const count = 25;\n        const offset = count * (page - 1);\n        return this.ajax(url, 'GET', {\n            data: { count, offset, fl: BASE_PERSON.fl }\n        });\n    },\n\n    _handleReports(data, collection, deferred, url, page) {\n        const results = data.res;\n\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = [].concat(collection, results);\n\n        const nextPage = page + 1;\n        return this._findDirectReports(url, nextPage)\n            .then(data => {\n                return this._handleReports(data, collection, deferred, url, nextPage);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while loading directs report page', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    findDirectReports(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        const deferred = Ember.RSVP.defer();\n        const url = this.entityEndpoint('directReports', type, id);\n        this._findDirectReports(url, 1)\n            .then(data => {\n                return this._handleReports(data, [], deferred, url, 1);\n            })\n            .catch(error => {\n                this.get('logger').error('Error while attempting to find reports', {\n                    error,\n                    id\n                });\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    findSuperiors(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        var url = this.entityEndpoint('superiors', type, id);\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    urlForUpdateRecord(id, type) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    },\n\n    _directoryUrl(type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (type === 'person') {\n            url = `/platform/directory${url}`;\n        }\n\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    }\n});\n\nexport default ApplicationAdapter;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    updateRecord(store, type, snapshot) {\n        const data = {};\n        const serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        let method = 'PUT';\n        if (snapshot.adapterOptions && snapshot.adapterOptions.patch) {\n            method = 'PATCH';\n        }\n\n        return this.ajax(url, method, { data: data });\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.get('host')}/${this.get('namespace')}/users/${id}/callforwarding`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.urlForFindRecord(id);\n    },\n\n    // Typically we wouldnt rewrite this private function, but we need to modify how errors are extracted\n    // See: https://github.com/emberjs/data/issues/4934\n    handleResponse(status, headers, payload, requestData) {\n        let data = {};\n        if (payload && status !== 200) {\n            data.errors = [payload];\n        } else {\n            data = payload;\n        }\n        return this._super(status, headers, data, requestData);\n    }\n});\n","import Ember from 'ember';\nimport ApplicationAdapter from './application';\nimport moment from '../utils/dates';\nimport _ from 'lodash';\n\nconst {\n    inject: { service }\n} = Ember;\n\nexport default ApplicationAdapter.extend({\n    session: service(),\n    application: service(),\n\n    useExternalContactExpand: true,\n\n    paging: {\n        pageSize: 25,\n        pageNumber: 1\n    },\n    queryDefaults: {\n        currentInterval: moment(),\n        previousInterval: moment().subtract(1, 'week')\n    },\n\n    query(store, typeClass, query) {\n        if (query.findLatestCalls) {\n            return this._fetchLatestCalls(...arguments);\n        }\n        return this._fetchHistory(...arguments);\n    },\n\n    /**\n     * _fetchLatestCalls - Fetch the latest calls\n     * @return Promise\n     */\n    _fetchLatestCalls() {\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return Ember.RSVP.resolve([]);\n        }\n        const data = {\n            interval: `${moment().subtract(2, 'hours').toISOString()}/${moment().add(2, 'hours').toISOString()}`\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data });\n    },\n\n    /**\n     * _fetchHistory - Fetch the history in a given interval. This method handles paging and adjusting the interval parameter\n     * depending on how many entities are returned so that subsequent calls will fetch previous conversations.\n     * @param  {Object}  query     The default query passed in.\n     * @return {Promise}\n     */\n    _fetchHistory(...params) {\n        let query = params[2];\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return Ember.RSVP.resolve([]);\n        }\n        const queryDefaults = this.get('queryDefaults');\n        const meta = _.merge(queryDefaults, query);\n        const paging = this.get('paging');\n        const data = {\n            interval: `${meta.previousInterval.toISOString()}/${meta.currentInterval.toISOString()}`,\n            pageSize: paging.pageSize,\n            pageNumber: paging.pageNumber\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data }).then(data => {\n            if (data.entities && data.entities.length === this.get('paging.pageSize')) {\n                this.incrementPageNumber();\n            } else {\n                this.decrementWeek();\n            }\n            return data;\n        });\n    },\n\n    /**\n     * incrementPageNumber - Increments the page number\n     */\n    incrementPageNumber() {\n        this.set('paging.pageNumber', this.get('paging.pageNumber') + 1);\n    },\n\n    /**\n     * decrementWeek - Modifies interval to previous week\n     */\n    decrementWeek() {\n        this.set('paging.pageNumber', 1);\n        let currentInterval = this.get('queryDefaults.currentInterval');\n        let previousInterval = this.get('queryDefaults.previousInterval');\n        this.set('queryDefaults.currentInterval', currentInterval.subtract(1, 'week'));\n        this.set('queryDefaults.previousInterval', previousInterval.subtract(1, 'week'));\n    },\n\n    /**\n     * getHistoryPath - Generates history uri for xhr\n     */\n    getHistoryPath() {\n        if (this.get('useExternalContactExpand')) {\n            return this.get('application').pcUri('api/v2/conversations/calls/history?expand=externalcontact');\n        }\n        return this.get('application').pcUri('api/v2/conversations/calls/history');\n    }\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nexport default ApplicationAdapter.extend({\n    findAll() {\n        return Ember.RSVP.resolve({\n            entities: [],\n            pageSize: 0,\n            pageNumber: 1,\n            total: 0,\n            firstUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            lastUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            selfUri: '/api/v2/conversations?pageSize=0&pageNumber=1',\n            pageCount: 0\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    namespace: 'api/v2/authorization',\n    host: computed.reads('application.purecloudV2BaseUri'),\n    divisionLimit: null,\n\n    pathForType(modelName) {\n        return pluralize(modelName);\n    },\n\n    // custom findAll method sets pageSize equal to division limit\n    findAll(store, type, sinceToken, snapshotRecordArray) {\n        let objectCount = Ember.get(snapshotRecordArray, 'adapterOptions.objectCount');\n        let url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n        const limitPath = 'api/v2/authorization/divisions/limit';\n        const limitUrl = this.get('application').pcV2Uri(limitPath);\n        return Ember.RSVP.resolve(\n            this.get('divisionLimit') ||\n                Ember.$.ajax({\n                    type: 'GET',\n                    url: limitUrl\n                })\n        ).then(divisionLimit => {\n            this.set('divisionLimit', divisionLimit);\n            return this.ajax(url, 'GET', {\n                data: {\n                    pageSize: divisionLimit,\n                    objectCount: objectCount ? true : false\n                }\n            });\n        });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nimport { addPageAction } from 'connections-ui/utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nconst { computed, inject } = Ember;\n\nconst STRICT = true;\nconst EXPAND = 'externalOrganization,externalDataSources,division';\nconst PHONE_LOOKUP_EXPAND = 'contacts.externalOrganization,externalDataSources';\nconst TIME_OUT = 15000; // public API takes 10 seconds to time out - but adding a little more than 10 as fudge factor\nconst QUERY_MAX_LENGTH = 256;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend(LoggerMixin, RelateFeaturesMixin, {\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    relate: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n\n    namespace: 'api/v2',\n\n    defaultSerializer: 'externalcontacts/contact',\n\n    pathForType: function () {\n        return 'externalcontacts/contacts';\n    },\n\n    cannotViewExternalContacts: computed.not('permissions.hasExternalContactsViewContactAccess'),\n\n    createRecord(store, type, record) {\n        this.get('relate').clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const addressFormat = this.get('addressformat');\n\n        let { searchTerm, pageNumber, pageSize, expandField, sortOrder, originator, subType } = queryParams;\n        const hasValidSearchTerm = searchTerm && typeof searchTerm === 'string';\n        const isValidPhoneNumber = addressFormat.isValidNumber(searchTerm, null, STRICT);\n\n        // only attempt to phone format search strings that look like phone numbers and contain only phone number like characters\n        const containsOnlyPhoneNumberChars = /^(\\+|\\d|\\)|\\(|\\.|-|\\s)+$/gim.test(searchTerm);\n\n        // only mutate search if not wrapped in \"\"\n        const isExactSearch = /^\"(.*)\"$/.test(searchTerm);\n        if (isExactSearch) {\n            // Log exact search occurrences for tracking usage\n            addPageAction('externalContactExactSearch', {\n                userId: this.get('session.user.id'),\n                orgId: this.get('session.org.guid')\n            });\n        } else if (containsOnlyPhoneNumberChars && isValidPhoneNumber) {\n            searchTerm = addressFormat.formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        if (subType) {\n            data.subType = subType;\n        }\n        let url = this.buildURL(type.modelName);\n\n        if (this.get('cannotViewExternalContacts')) {\n            // Logging a failure of the permissions check here is unnecessary because this is merely the ultimate\n            // backstop to catch unpermitted external contaxts service calls. It's the responsibility of the caller\n            // to handle the response and either log and/or alert the user.  See RELATE-1776\n            return Ember.RSVP.resolve({});\n        }\n\n        if (queryParams.useLookupService) {\n            // Use the \"reverse whitepages\" search endpoint\n            url = this.get('application').pcUri(`api/v2/externalcontacts/reversewhitepageslookup`);\n\n            data.lookupVal = searchTerm;\n            if (expandField) {\n                data.expand = PHONE_LOOKUP_EXPAND;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        } else {\n            if (hasValidSearchTerm) {\n                const term = encodeURI(searchTerm.replace('tel:', ''));\n\n                try {\n                    if (term.length > QUERY_MAX_LENGTH) {\n                        throw new Error('Query length limit encountered');\n                    }\n                } catch (error) {\n                    this.get('logger').error(\n                        `ACD: Attempted to send query larger than limit. From: ${originator} `,\n                        error\n                    );\n                }\n\n                data.q = decodeURI(term.substr(0, QUERY_MAX_LENGTH)); // remove characters beyond limit\n            }\n            if (pageNumber) {\n                data.pageNumber = pageNumber;\n            }\n            if (pageSize) {\n                data.pageSize = pageSize;\n            }\n            if (sortOrder) {\n                data.sortOrder = sortOrder;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        }\n        if (queryParams.bypassCache) {\n            return this.get('relate').findMatchingExternalContacts(\n                searchTerm,\n                pageNumber,\n                pageSize,\n                expandField,\n                originator\n            );\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from '../purecloud';\nconst EXPAND = 'externalDataSources';\n\nconst TIME_OUT = 10000;\nconst ORIGINATOR = 'connections-ui';\n\nexport default PurecloudAdapter.extend({\n    relate: Ember.inject.service(),\n\n    namespace: 'api/v2',\n    defaultSerializer: 'externalcontacts/organizations',\n\n    pathForType: function () {\n        return 'externalcontacts/organizations';\n    },\n\n    createRecord(store, type, record) {\n        this.get('relate').clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${Ember.$.param({ expand: EXPAND })}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT }); // msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n    },\n\n    updateRecord(store, type, snapshot) {\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName) + '/' + id;\n        const dataType = 'json';\n        const data = Object.assign(this.serialize(snapshot, { includeId: true }), { originator: ORIGINATOR });\n\n        return this.ajax(url, 'PUT', { dataType, data });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.get('relate').clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const url = this.buildURL(type.modelName);\n        let searchTerm = queryParams.searchTerm;\n        let pageNumber = queryParams.pageNumber;\n        let pageSize = queryParams.pageSize;\n        let originator = queryParams.originator;\n\n        let data = {};\n        data.expand = EXPAND;\n\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageNumber) {\n            data.pageNumber = pageNumber;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        return this.get('relate').getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n\n    urlForFindRecord() {\n        return this.get('application').pcV2Uri(`api/v2/geolocations/settings`);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    updateRecord(store, type, snapshot) {\n        var data = {};\n        var serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        var id = snapshot.id;\n        var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        if (url.indexOf('undefined') !== -1 || !this.get('session.person.guid')) {\n            // ignore this by resolving undefined. something trying to save geolocation when not authenticated\n            return Ember.RSVP.resolve();\n        }\n\n        return this.ajax(url, 'PATCH', { data: data });\n    },\n\n    urlForUpdateRecord(id) {\n        return this.get('application').pcV2Uri(`api/v2/users/${this.get('session.person.guid')}/geolocations/${id}`);\n    },\n\n    handleResponse(status) {\n        let response = this._super(...arguments);\n        if (response && response.name && response.name === 'Error') {\n            response.code = status;\n        }\n        return response;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    application: inject.service(),\n    createRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            dataType: 'text'\n        });\n    },\n\n    deleteRecord(store, type, snapshot) {\n        const path = `api/v2/authorization/subjects/${snapshot.record.get('subjectId')}/divisions/${snapshot.record.get(\n            'division.id'\n        )}/roles/${snapshot.record.get('role.id')}`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'DELETE');\n    },\n\n    saveBulk(roleId, subjectIds, divisionIds) {\n        const path = `api/v2/authorization/roles/${roleId}?subjectType=PC_GROUP`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'POST', {\n            data: {\n                subjectIds,\n                divisionIds\n            }\n        });\n    },\n\n    ajaxOptions(url, type, options) {\n        // get the default RESTAdapter 'ajaxOptions'\n        let hash = this._super(url, type, options);\n        if (type === 'DELETE' || type === 'POST') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    ajaxSuccess(jqXHR, data) {\n        if (typeof data === 'string') {\n            // return an empty object so the Serializer\n            // handles it correctly\n            return {};\n        } else {\n            return data;\n        }\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // force json-api error format\n        let data = {};\n        data.errors = [payload];\n        return this._super(status, headers, data);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: `api/v2`,\n\n    urlForFindRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    urlForUpdateRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        let serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        let id = snapshot.id;\n        let url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        return this.ajax(url, 'PATCH', { data: data.groupPolicy });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    },\n\n    _baseUrl(guid) {\n        return `${this.get('host')}/${this.get('namespace')}/voicemail/groups/${guid}/policy`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject } = Ember;\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n    store: Ember.inject.service(),\n\n    buildQuery() {\n        return {\n            fl: '*'\n        };\n    },\n\n    baseUrl() {\n        return this.get('application').pcV2Uri('api/v2/groups');\n    },\n\n    urlForFindRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    entityEndpoint(endpoint, type, id) {\n        return `${this.baseUrl()}/${id}/${endpoint}`;\n    },\n\n    urlForFindMany() {\n        return this.get('application').pcV2Uri('api/v2/profiles/groups');\n    },\n\n    urlForDeleteRecord(id) {\n        return `${this.baseUrl()}/${id}`;\n    },\n\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const traditional = true;\n        const data = Object.assign({}, data, { fields: '*' });\n        return this.ajax(url, 'GET', { data, traditional }).then(gProfile => {\n            if (snapshot.record.get('version') && gProfile.version !== snapshot.attr('version')) {\n                snapshot.record.set('version', gProfile.version);\n            }\n\n            /*\n                Is this a new Group?\n                When creating a group by default there is only one owner so\n                the member count will always be 1 on a create.  The bevy service\n                is eventually consistent so we may have a member count of 0\n                after our next GET.  Therefore we set the memberCount to 1\n                by default.\n            */\n            if (\n                gProfile.general.memberCount[0].value === 0 &&\n                gProfile.individuals.individuals.length === 0 &&\n                gProfile.owners.owners.length === 1\n            ) {\n                gProfile.general.memberCount[0].value = 1;\n            }\n\n            return gProfile;\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isn't key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        const groupSerializer = store.serializerFor(type.modelName);\n        groupSerializer.serializeIntoHash(data, type, snapshot);\n\n        if (this.get('session.features.groupProileNoIndividualsSave') && data.group.individuals) {\n            return this.get('store')\n                .findRecord('group-policy', data.group.guid)\n                .then(policy => {\n                    data = this.generateGroupProfilePayload(groupSerializer, data, policy);\n\n                    if (data[type.modelName]) {\n                        data = data[type.modelName];\n                    }\n                    return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n                });\n        } else {\n            data = this.generateGroupProfilePayload(groupSerializer, data);\n\n            if (data[type.modelName]) {\n                data = data[type.modelName];\n            }\n            return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n        }\n    },\n\n    deleteRecord(store, type, snapshot) {\n        let id = snapshot.id;\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), 'DELETE', {\n            dataType: 'text'\n        }).then(() => {\n            // After a delete using the public API we need to go get that deleted group\n            // to keep ember-data happy.\n            const jIdNumber = this.getJidIdNumber(snapshot.record.data.contactInfo.chat[0].value.jid);\n            return this.getDeletedGroup(jIdNumber);\n        });\n    },\n\n    ajaxOptions(url, type) {\n        const hash = this._super(...arguments);\n        // Our apis are silly...\n        if (type && type.toLowerCase() === 'delete') {\n            hash.dataType = 'text';\n        }\n        return hash;\n    },\n\n    findMany(store, type, ids, snapshots) {\n        const url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n\n        let uuids = '';\n        let jIds = '';\n        let urlWithAppendedIds = '';\n        let urlDeletedWithAppendedIds = `${this.baseUrl()}/bulk/deleted?jabberId=`;\n\n        ids.forEach(id => {\n            // accepts jIds or ids\n            if (id.indexOf('-') > -1) {\n                uuids = uuids.concat(id, ',');\n            } else {\n                id = this.getJidIdNumber(id);\n                jIds = jIds.concat(id, ',');\n            }\n        });\n\n        if (uuids.length > 0) {\n            uuids = uuids.substring(0, uuids.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('id=', uuids);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n        } else if (jIds.length > 0) {\n            jIds = jIds.substring(0, jIds.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('jabberId=', jIds);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n            urlDeletedWithAppendedIds = urlDeletedWithAppendedIds.concat(jIds);\n        } else {\n            urlWithAppendedIds = `${url}`;\n        }\n\n        /*\n            When using public API / bevy deleted groups are not returned yet they are needed.\n            We need to make speical request to get those deleted groups.  WebRtc provides a list\n            that is used to fill out is roster...in the form of jabberIds.  As part of this\n            we need to evaluate the jabberIds that are missing in the initial GET request,\n            find the missing deleted ones and make a request to get those deleted groups.\n        */\n        if (jIds.length > 0) {\n            return this.ajax(urlWithAppendedIds, 'GET').then(activeResults => {\n                return this.getDeletedGroups(urlDeletedWithAppendedIds, activeResults);\n            });\n        }\n\n        return this.ajax(urlWithAppendedIds, 'GET');\n    },\n\n    getDeletedGroups(deleteUrl, groupsResults) {\n        return new Ember.RSVP.Promise(resolve => {\n            this.ajax(deleteUrl, 'GET').then(deletedGroups => {\n                deletedGroups.entities.forEach(g => {\n                    groupsResults.entities.push(this.normalizeDeletedGroup(g));\n                });\n                return resolve(groupsResults);\n            });\n        });\n    },\n\n    getDeletedGroup(id) {\n        const getUrl = `${this.baseUrl()}/bulk/deleted?jabberId=${id}`;\n        return new Ember.RSVP.Promise(resolve => {\n            this.ajax(getUrl, 'GET').then(deletedGroup => {\n                return resolve(deletedGroup);\n            });\n        });\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findGroupMembership(id, params) {\n        const query = params;\n\n        if (typeof params.offset === 'number' && params.limit) {\n            query.pageNumber = 1 + Math.ceil(params.offset / params.limit);\n            query.pageSize = params.limit;\n        }\n        const url = `${this.baseUrl()}/${id}/members`;\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    generateGroupProfilePayload(groupSerializer, json, vmPolicy) {\n        let gProfile = json.group;\n\n        gProfile.organizationId = this.get('session.org.guid');\n        gProfile.id = gProfile.guid;\n        delete gProfile.guid;\n\n        if (gProfile.mt) {\n            delete gProfile.mt;\n        }\n\n        if (gProfile.meta) {\n            delete gProfile.meta;\n        }\n\n        delete gProfile.membershipDraft;\n\n        if (gProfile.general.needsCommit) {\n            delete gProfile.general.needsCommit;\n        }\n\n        if (gProfile.general.exchangeSync) {\n            delete gProfile.general.exchangeSync;\n        }\n\n        if (gProfile.general.links && gProfile.general.links.length > 0) {\n            groupSerializer.cleanGroupLinkIds(gProfile.general.links);\n        }\n\n        if (\n            gProfile.contactInfo.email &&\n            gProfile.contactInfo.email.length > 0 &&\n            gProfile.contactInfo.email[0].value == ''\n        ) {\n            delete gProfile.contactInfo.email;\n        }\n\n        if (!Array.isArray(gProfile.contactInfo.groupNumber)) {\n            delete gProfile.contactInfo.groupNumber;\n        }\n\n        if (gProfile.contactInfo.phone) {\n            delete gProfile.contactInfo.phone;\n        }\n\n        if (gProfile.contactInfo.groupNumber && gProfile.contactInfo.groupNumber.length > 0) {\n            if (gProfile.contactInfo.groupNumber[0].labelKey) {\n                delete gProfile.contactInfo.groupNumber[0].labelKey;\n            }\n\n            if (!this.hasGroupPhone(gProfile.contactInfo.groupNumber[0])) {\n                delete gProfile.contactInfo.groupNumber;\n            }\n        }\n\n        // The members API already adds individuals to groups,  we\n        // do not send the individuals to keep the request size down.\n        if (this.get('session.features.groupProileNoIndividualsSave') && gProfile.individuals) {\n            // The exception is when a voicemail policy of SEQUENTIAL is in place,\n            // then the individuals must be sent to maintain the order of individuals.\n            if (!vmPolicy || vmPolicy.data.groupAlertType !== 'SEQUENTIAL') {\n                delete gProfile.individuals;\n            }\n        }\n\n        return gProfile;\n    },\n\n    hasGroupPhone(numberInfo) {\n        const hasNumber = numberInfo.value && numberInfo.value.number && numberInfo.value.number !== '';\n        const hasExtension = numberInfo.value && numberInfo.value.extension && numberInfo.value.extension !== '';\n\n        if (hasNumber || hasExtension) {\n            return true;\n        }\n\n        return false;\n    },\n\n    getJidIdNumber(jid) {\n        return jid.indexOf('@') > -1 ? jid.split('@')[0] : jid;\n    },\n\n    normalizeDeletedGroup(deletedGroup) {\n        deletedGroup.general = {\n            name: [\n                {\n                    value: deletedGroup.name,\n                    labelKey: 'name'\n                }\n            ],\n            groupType: [\n                {\n                    value: deletedGroup.type === 'offical' ? 'groups.offical' : deletedGroup.type,\n                    labelKey: 'groupType'\n                }\n            ],\n            memberCount: [\n                {\n                    value: deletedGroup.memberCount,\n                    labelKey: 'memberCount'\n                }\n            ]\n        };\n        deletedGroup.contactInfo = {\n            chat: [\n                {\n                    value: {\n                        jid: deletedGroup.chat.jabberId\n                    },\n                    labelKey: 'chat'\n                }\n            ]\n        };\n        delete deletedGroup.name;\n        delete deletedGroup.chat;\n        delete deletedGroup.groupType;\n        delete deletedGroup.memberCount;\n\n        return deletedGroup;\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/responsemanagement/libraries';\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { BASE_LOCATION_FIELDS } from '../models/location';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            expand: BASE_LOCATION_FIELDS.join(',')\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('namespace')}/locations/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.baseUrl(id);\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return this.baseUrl(id);\n    },\n\n    urlForHasMany(id) {\n        return `${this.baseUrl(id)}/sublocations`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const query = this.buildQuery(snapshot);\n        return Ember.RSVP.hash({\n            location: this.ajax(url, 'GET', { data: query }),\n            floors: this.ajax(this.urlForHasMany(id), 'GET', { data: query }).catch(() => Ember.RSVP.resolve({}))\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed } = Ember;\n\nexport default DS.RESTAdapter.extend({\n    session: inject.service(),\n    application: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    urlForFindAll() {\n        const userId = this.get('session.person.guid');\n        return `${this.get('host')}/${this.get('namespace')}/users/${userId}/meetings`;\n    },\n\n    urlForFindRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (meeting) {\n            const meetingId = meeting.id;\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n    },\n\n    urlForQuery() {\n        return this.urlForFindAll();\n    },\n\n    urlForUpdateRecord(id, modelName, snapshot) {\n        if (!!Ember.get(snapshot, 'adapterOptions.updateSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n        const meetingId = snapshot.attr('meeting').id;\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    },\n\n    urlForCreateRecord() {\n        return `${this.get('host')}/${this.get('namespace')}/meetings`;\n    },\n\n    urlForDeleteRecord(id, modelName, snapshot) {\n        const meeting = snapshot.attr('meeting');\n        if (!meeting) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${id}`;\n        }\n\n        const meetingId = meeting.id;\n        if (!!Ember.get(snapshot, 'adapterOptions.deleteSeries')) {\n            return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}`;\n        }\n        return `${this.get('host')}/${this.get('namespace')}/meetings/${meetingId}/occurrences/${id}`;\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nimport { batchEntityIds } from '../services/store';\nimport { BASE_PERSON } from '../models/person';\n\nconst { inject, computed } = Ember;\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    ajaxService: inject.service('ajax'),\n    session: inject.service(),\n    application: inject.service(),\n    integrationsPresenceSvc: inject.service('integrations-presence'),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n\n    namespace: 'api/v2',\n\n    buildQuery() {\n        return {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.get('host')}/${this.get('namespace')}/users/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindMany() {\n        return `${this.get('host')}/${this.get('namespace')}/profiles/users`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, options) {\n        const url = this.buildURL(type.modelName, id, options, 'findRecord');\n        const query = this.buildQuery(options);\n\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            query.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            query.expand = `${query.expand},integrationPresence`;\n        }\n\n        return this.ajax(url, 'GET', { data: query });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        Ember.set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    // allows looking up by jid or by guid, but not both\n    findMany(store, type, ids, snapshotsOrOptions) {\n        const url = this.buildURL(type.modelName, ids, snapshotsOrOptions, 'findMany');\n\n        const guids = ids.filter(id => id.indexOf('@') === -1);\n        const jids = ids.filter(id => id.indexOf('@') > -1);\n\n        if (jids.length > 0 && guids.length > 0) {\n            return Ember.RSVP.reject(new Error('Mixed jid and guid person lookup'));\n        }\n        if (jids.length > 0) {\n            return this._findMany(url, jids, 'jids', snapshotsOrOptions);\n        }\n        if (guids.length > 0) {\n            return this._findMany(url, guids, 'guids', snapshotsOrOptions);\n        }\n\n        return Ember.RSVP.reject(new Error('findMany person without ids'));\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findSuperiors(store, id, params) {\n        const url = `${this.baseUrl(id)}/superiors`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(superiors => {\n            if (!superiors || !superiors.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', superiors.mapBy('id'));\n        });\n    },\n\n    findDirectReports(store, id, params) {\n        const url = `${this.baseUrl(id)}/directreports`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(directReports => {\n            if (!directReports || !directReports.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', directReports.mapBy('id'));\n        });\n    },\n\n    _findMany(url, ids, type, options) {\n        let key = 'id';\n        if (type === 'jids') {\n            key = 'jid';\n        }\n        let baseRequestData = {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n        let batchAmount = 25;\n        // use the provided presence source\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            baseRequestData.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            baseRequestData.expand = `${baseRequestData.expand},integrationPresence`;\n        }\n        const promises = batchEntityIds(ids, batchAmount).map(ids => {\n            const requestData = Object.assign({}, baseRequestData, {\n                [key]: ids.join(',')\n            });\n            if (this.get('session.features.enableUIAjaxRetryHeader')) {\n                let promise = this.get('ajaxService').raw(url, {\n                    method: 'GET',\n                    contentType: 'application/json',\n                    data: requestData,\n                    dataType: 'json',\n                    retry: true\n                });\n                return promise\n                    .then(({ response }) => Ember.RSVP.resolve(response))\n                    .catch(({ response }) => Ember.RSVP.reject(response));\n            } else {\n                return this.ajax(url, 'GET', {\n                    data: requestData\n                });\n            }\n        });\n        return Ember.RSVP.all(promises).then(res => {\n            let data = {\n                entities: res.map(d => d.entities).flat()\n            };\n            if (usingIntegrationSource) {\n                data.meta = {\n                    integrationSource:\n                        options && options.adapterOptions && options.adapterOptions.integrationPresenceSource,\n                    usingIntegrationSource: true\n                };\n            }\n            return data;\n        });\n    },\n\n    _loadActivities(id) {\n        const url = `${this.get('host')}/${this.get('namespace')}/users/${id}`;\n        return this.ajax(url, 'GET', {\n            data: {\n                expand: BASE_PERSON.expand\n            }\n        });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\nconst { computed, inject } = Ember;\n\nexport default PurecloudAdapter.extend({\n    session: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery(snapshot) {\n        let query = {\n            state: 'deleted'\n        };\n\n        if (snapshot.adapterOptions && snapshot.adapterOptions.expand) {\n            query.expand = snapshot.adapterOptions.expand;\n        }\n\n        return query;\n    },\n\n    urlForQuery() {\n        if (this.get('permissions.canTargetUserSearchOutsideOfDivision')) {\n            return `${this.get('host')}/${this.namespace}/users/search/conversation/target`;\n        } else {\n            return `${this.get('host')}/${this.namespace}/users/search`;\n        }\n    },\n\n    findBelongsTo(store, snapshot, link, relationship) {\n        // We only support person belongsTo relationship for profiles\n        const adapter = this.store.adapterFor(relationship.type);\n        return adapter.findRecord(store, store.modelFor('person'), snapshot.id, snapshot);\n    },\n\n    buildURL(modelName, id, modelClass, requestType, snapshotOrQuery) {\n        if (requestType === 'query') {\n            return this.urlForQuery(id, 'public-api-user', snapshotOrQuery);\n        }\n        const host = this.get('host') ? this.get('host') : '';\n        return `${host}/${this.namespace}/${this.pathForType('users')}/${id}`;\n    },\n\n    /**\n     * Overridden to support our custom seach API\n     * This is copied directly from the ember-data codebase:\n     * https://github.com/emberjs/data/blob/v2.16.0/addon/adapters/rest.js#L541\n     */\n    query(store, type, query) {\n        let url = this.buildURL(type.modelName, null, null, 'query', query);\n        return this.ajax(url, 'POST', { data: query });\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.RESTAdapter.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    defaultSerializer: 'purecloud',\n\n    host: '/platform',\n    namespace: 'api',\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        if (payload && typeof payload === 'object') {\n            return [\n                {\n                    status: `${status}`,\n                    title: payload.code,\n                    detail: {\n                        message: payload.message,\n                        contextId: payload.contextId\n                    }\n                }\n            ];\n        }\n\n        return [{ status, payload }];\n    },\n\n    ajaxOptions(url, type, hash) {\n        // https://github.com/emberjs/data/issues/1398\n        // https://github.com/emberjs/data/blob/v2.7.0/addon/adapters/rest.js#L1065\n        hash = this._super(url, type, hash);\n\n        if (type === 'DELETE') {\n            hash.dataType = 'text';\n        }\n\n        return hash;\n    },\n\n    // TODO: replace this private function with request type hooks\n    buildURL(modelName, id, snapshot, requestType) {\n        if (requestType === 'query' && modelName === 'voicemail-message') {\n            return this._super(...arguments);\n        }\n\n        const objId = id ? `/${id}` : '';\n        const path = `${this.get('namespace')}/${this.pathForType(modelName)}${objId}`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return url;\n    },\n\n    updateRecord(store, type, record) {\n        var data = this.serialize(record, {\n            includeId: true\n        });\n        var id = Ember.get(record, 'id');\n\n        if (type.modelName === 'voicemail-message') {\n            return this.ajax(this.buildURL(type.modelName, id), 'PATCH', { data: data });\n        }\n        return this.ajax(this.buildURL(type.modelName, id), 'PUT', { data: data });\n    },\n\n    deleteRecord(store, type, record) {\n        const id = Ember.get(record, 'id');\n        const url = this.buildURL(type.modelName, id);\n        return this.ajax(url, 'DELETE', { dataType: 'text' });\n    }\n});\n","import Ember from 'ember';\nimport PurecloudAdapter from './purecloud';\n\nconst TARGET_QUEUE_SEARCH_PERMISSION = 'conversation:communication:target';\nconst DIVISION_PERMITTED_URL = 'api/v2/authorization/divisionspermitted/paged/me';\nconst DIVISION_LIMIT_URL = 'api/v2/authorization/divisions/limit';\n\nconst { inject, computed, RSVP } = Ember;\n\nexport default PurecloudAdapter.extend({\n    application: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    host: computed.reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    divisionLimit: null,\n\n    pathForType: function (type) {\n        switch (type) {\n            case 'divisionAgnostic':\n                return 'routing/queues/divisionviews';\n            case 'myQueues':\n                return 'routing/queues/me';\n            default:\n                return 'routing/queues';\n        }\n    },\n\n    async query(store, type, query) {\n        let fetchDivisions = false;\n        let path = this.buildURL(type);\n        query.name = query.name ? query.name.toLowerCase() : '';\n\n        if (query.divisionAgnostic) {\n            path = this.buildURL('divisionAgnostic');\n            delete query.divisionAgnostic;\n            if (this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n                fetchDivisions = true;\n            }\n        } else if (!this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n            // Handle case where permission is actually false\n            // When permission is false revert back to fetching across all divisions\n            path = this.buildURL('divisionAgnostic');\n            delete query.divisionAgnostic;\n        }\n\n        if (query.myQueuesOnly) {\n            path = `${this.buildURL('myQueues')}`;\n            fetchDivisions = false;\n        }\n\n        if (fetchDivisions) {\n            const response = await this.fetchDivisionsForTargetQueueSearch();\n            const results = response && response.entities ? response.entities : [];\n            const divisionIds = results.map(entity => entity.id);\n            if (divisionIds.length > 0) {\n                query.divisionId = divisionIds.join(',');\n            }\n        }\n\n        return this.ajax(path, 'GET', { data: query });\n    },\n\n    getDivisionLimits() {\n        const url = this.get('application').pcV2Uri(DIVISION_LIMIT_URL);\n        return RSVP.resolve(this.get('divisionLimit') || this.ajax(url, 'GET'));\n    },\n\n    async fetchDivisionsForTargetQueueSearch() {\n        const divisionLimit = await this.getDivisionLimits();\n        const pageSize = divisionLimit || 25;\n        this.set('divisionLimit', pageSize);\n        const url = this.get('application').pcV2Uri(DIVISION_PERMITTED_URL);\n        return this.ajax(url, 'GET', {\n            data: {\n                pageSize,\n                permission: TARGET_QUEUE_SEARCH_PERMISSION\n            }\n        });\n    },\n\n    findRecord(store, type, id, snapshot) {\n        if (snapshot.adapterOptions && snapshot.adapterOptions.divisionAware) {\n            const path = this.buildURL('divisionAgnostic');\n            return this.ajax(path, 'GET', { data: { id } });\n        }\n        return this._super(...arguments);\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/userrecordings';\n    },\n\n    findAll: function (store, type) {\n        return this.ajax(this.buildURL(type.modelName) + '?expand=conversation', 'GET');\n    }\n});\n","define(\"connections-ui/adapters/recording\", [\"exports\", \"ember-purecloud-components/adapters/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import PurecloudAdapter from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudAdapter.extend({\n    defaultSerializer: 'response',\n\n    pathForType: function () {\n        return 'v2/responsemanagement/responses';\n    },\n\n    query: function (store, type, query) {\n        return this.ajax(`${this.buildURL(type)}/query`, 'POST', { data: query });\n    },\n\n    findMany: function (store, type, ids, pageNumber, pageSize) {\n        const currentPage = pageNumber || 1,\n            currentPageSize = pageSize || 25;\n\n        const query = {\n            pageSize: currentPageSize,\n            pageNumber: currentPage,\n            libraryId: _.head(ids)\n        };\n\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n","import ApplicationAdapter from './application';\nimport Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default ApplicationAdapter.extend({\n    application: inject.service(),\n\n    buildURL(type, id) {\n        const modelEndpoint = this.pathForType(type);\n        const path = `api/v2/authorization/${modelEndpoint}` + id ? `/${id}` : '';\n        return this.get('application').pcV2Uri(path);\n    },\n\n    findAll() {\n        const initialPage = 1;\n        const pageSize = 100;\n        let records = [];\n        let aggregatePayload;\n        return this._getPage(initialPage, pageSize)\n            .then(result => {\n                aggregatePayload = result;\n                records.concat(result.entities);\n                let promises = [];\n                for (let page = 2; page <= result.pageCount; page++) {\n                    promises.push(this._getPage(page, pageSize));\n                }\n                return Ember.RSVP.all(promises);\n            })\n            .then(results => {\n                results.forEach(result => {\n                    aggregatePayload.entities = aggregatePayload.entities.concat(result.entities);\n                });\n                aggregatePayload.entities.sort(function (roleA, roleB) {\n                    if (roleA.name < roleB.name) {\n                        return -1;\n                    } else if (roleA.name > roleB.name) {\n                        return 1;\n                    } else {\n                        return 0;\n                    }\n                });\n                return aggregatePayload;\n            });\n    },\n\n    _getPage(pageNumber, pageSize) {\n        const path = `api/v2/authorization/roles?pageSize=${pageSize}&pageNumber=${pageNumber}&userCount=false`;\n        const url = this.get('application').pcV2Uri(path);\n        return this.ajax(url, 'GET');\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/stations';\n    }\n});\n","import ApplicationAdapter from './application';\n\nvar UserAdapter = ApplicationAdapter.extend({\n    findQuery: function (store, type, query) {\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n\nexport default UserAdapter;\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType() {\n        return 'v2/voicemail/messages';\n    },\n\n    urlForQuery() {\n        return `${this.host}/${this.namespace}/v2/voicemail/search`;\n    },\n\n    updateRecord() {\n        return this._super(...arguments);\n    },\n\n    // Override private function (copying default impl)\n    // so we can 'POST' to the API\n    // TODO: Remove ds-improved-ajax lands\n    query(store, type, query) {\n        const url = this.buildURL(type.modelName, null, null, 'query', query);\n\n        if (this.sortQueryParams) {\n            query = this.sortQueryParams(query);\n        }\n\n        return this.ajax(url, 'POST', { data: query });\n    },\n\n    // Use this in place of:\n    //   methodForRequest\n    //   dataForRequest\n    // TODO: Remove ds-improved-ajax lands\n    sortQueryParams(query) {\n        return {\n            pageSize: query.pageSize || 15,\n            pageNumber: query.pageNumber || 1,\n            sortOrder: 'DESC',\n            sortBy: 'createdTime',\n            query: [\n                {\n                    type: 'EXACT',\n                    fields: ['owner'],\n                    value: 'ALL'\n                },\n                {\n                    type: 'EXACT',\n                    fields: ['deleted'],\n                    value: 'false'\n                }\n            ]\n        };\n    }\n});\n","import Ember from 'ember';\nimport Resolver from './resolver';\nimport defineModifier from 'ember-concurrency-test-waiter/define-modifier';\nimport loadInitializers from 'ember-load-initializers';\nimport config from './config/environment';\nimport _ from 'lodash';\n\nimport { registerElements } from 'genesys-spark-components';\nregisterElements();\n\n// Polyfills for iframe-coordinator\nimport 'custom-event-polyfill/polyfill';\n/* eslint-disable no-unused-vars */\n// These imports shouldn't need to be assigned to variables, but without\n// importing this way, babel 6 will load them in after the iframe-coordinator\n// module, defeating the point of the polyfills.\nimport shim from '@webcomponents/custom-elements/src/native-shim';\nimport elements from '@webcomponents/custom-elements';\n/* eslint-enable no-unused-vars */\nimport iframeCoordinator from 'iframe-coordinator';\n\n// Enable the iframe-coordinator custom elements\niframeCoordinator.registerCustomElements();\n\nimport { defineCustomElements } from '@genesys/genesys-cloud-webcomponents/dist/loader';\ndefineCustomElements();\n\n/* eslint-disable */\n\nimport HostedContext from './utils/hosted-context';\n\n/* eslint-enable */\n\nif (config.APP && config.APP.LOG_RUNLOOP_STACKTRACE) {\n    Ember.run.backburner.DEBUG = true;\n}\n\nif (config.APP && config.APP.LOG_BINDINGS) {\n    Ember.LOG_BINDINGS = true;\n}\n\nconst { inject, Application } = Ember;\n\n// allows ember concurrency tasks to use withTestWaiter()\ndefineModifier();\n\nconst App = Application.extend(config.APP, {\n    cookies: inject.service('cookies'),\n    stashLogger: inject.service('stash-logger'),\n    applicationService: inject.service('application'),\n    customEvents: {\n        // Pagination events from inbox-v2\n        pageChanged: 'pageChanged',\n        itemsPerPageChanged: 'itemsPerPageChanged',\n        // GCW Events\n        favoriteEvent: 'favoriteEvent',\n        contactEvent: 'contactEvent',\n        navigateToProfileEvent: 'navigateToProfileEvent'\n    },\n\n    modulePrefix: config.modulePrefix,\n    podModulePrefix: config.podModulePrefix,\n    Resolver,\n\n    engines: {\n        emberEngineCustomFields: {\n            dependencies: {\n                services: [\n                    'application',\n                    'intl',\n                    'session',\n                    'stash-logger',\n                    'ajax',\n                    'store',\n                    'notification',\n                    'permissions',\n                    'schema'\n                ],\n                externalRoutes: {\n                    personDetail: 'person.detail',\n                    admin: 'admin'\n                }\n            }\n        }\n    },\n\n    entityTypes: ['person', 'group'], //TODO - 10/12/14 - Is this used anymore?\n\n    currentRouteName: null, // Set by ApplicationController\n\n    debug: false,\n\n    init() {\n        this.initVersion();\n        this.initContext();\n        return this._super(...arguments);\n    },\n\n    isImpersonating: Ember.computed('session.person.id', function () {\n        var proxyPersonId = this.get('cookies').read('proxyPerson');\n\n        if (proxyPersonId) {\n            return proxyPersonId === this.get('session.person.id');\n        }\n\n        return false;\n    }),\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (e) {\n            return true;\n        }\n    },\n\n    initVersion() {\n        Ember.libraries.register('PureCloud Collaborate', this.get('semver'));\n\n        if (!Ember.ENV.LOG_VERSION) {\n            Ember.Logger.debug('PureCloud Collaborate', this.get('semver'));\n        }\n\n        const libs = this.libs || {};\n        _.forOwn(libs, (version, key) => {\n            Ember.libraries.register(key, version);\n            if (!Ember.ENV.LOG_VERSION) {\n                Ember.Logger.debug(key, version);\n            }\n        });\n    },\n\n    initContext() {\n        this.set('context', 'directory');\n    },\n\n    // Debugging utility functions...not for use in app logic\n    controllerFor(name) {\n        return this.instance.lookup(`controller:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    serviceFor(name) {\n        return this.instance.lookup(`service:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    componentFor(id) {\n        return this.instance.lookup('-view-registry:main')[id];\n    },\n\n    listAsync() {\n        this.resolveRegistration('util:debug-backburner').logTimerQueue();\n        this.resolveRegistration('util:debug-rsvp').logPendingPromises();\n    },\n\n    promiseStackFor(id) {\n        this.resolveRegistration('util:debug-rsvp').lookupPromiseStack(id);\n    }\n});\n\nloadInitializers(App, config.modulePrefix);\n\nError.stackTraceLimit = 100;\n\nexport default App;\n","export default Ember.HTMLBars.template({\"id\":\"d+F87FRd\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"application-loading\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/application-loading/template.hbs\"}});","define(\"connections-ui/attach-media-stream/util\", [\"exports\", \"ember-webrtc-components/attach-media-stream/util\"], function (_exports, _util) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _util.default;\n    }\n  });\n});\n","define(\"connections-ui/audio-visualizer/component\", [\"exports\", \"ember-audio-visualizer/components/audio-visualizer/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Base from 'ember-simple-auth/authenticators/base';\nimport _ from 'lodash';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from '../services/session';\nimport { Client } from '@genesys/gc-mfe-auth';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { RSVP } = Ember;\n\nconst authLoginPath = '/oauth/authorize';\nconst oauthStoreParams = ['access_token', 'token_type', 'expires_in'];\nconst oauthStoreProps = [...oauthStoreParams, 'token_expiry_time_millis', 'token_expiry_time_iso_string'];\nconst authLogoutPath = '/logout';\n\nconst AUTH_COOKIE_NAME = 'ININ-Auth-Api';\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    cookies: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    purecloudOauth: Ember.inject.service(),\n    applicationService: Ember.inject.service('application'),\n\n    authClient: null,\n\n    // Check existing authentication\n    async restore(data) {\n        if (window === window.parent) {\n            // Not in an iframe. For the standalone mode for development.\n            var accessToken = null;\n            if (data && typeof data === 'object') {\n                accessToken = data.access_token;\n            }\n\n            if (!accessToken) {\n                throw new Error('No token');\n            } else {\n                await this._establishLocalSession(accessToken);\n                await _.pick(data, oauthStoreProps);\n            }\n        } else {\n            // In an iframe, in WebDirectory?\n            if (!this.authClient) {\n                const clientId = this.get('oauthProps.clientId');\n                this.authClient = new Client(clientId);\n            }\n\n            data.token_type = 'bearer';\n            try {\n                data.access_token = await this.authClient.getToken(); // Get the token from the host.\n            } catch (error) {\n                this.get('stashLogger').error(\n                    `Unable to get token from host iframe: ${error && error.message ? error.message : '?'}`\n                );\n                addPageAction('sessionBootstrapFailure', {\n                    failedStep: 'getTokenFailure'\n                });\n                throw error;\n            }\n            await this._establishLocalSession(data.access_token);\n            await _.pick(data, oauthStoreProps);\n        }\n    },\n\n    // Attempt user authentication\n    authenticate(options) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (options && (options.error === 'access_denied' || options.scope)) {\n                // Rejecting if the user didn't grant access\n                // Also rejecting if the user granted limited states (for now)\n\n                // No need to redirect to oauth; action will handle\n                reject({ reason: 'noAccess' });\n            } else if (options && options.access_token) {\n                this._establishLocalSession(options.access_token)\n                    .then(() => {\n                        // Internal OAuth2 Auth Successful\n\n                        if (options.state) {\n                            this.get('purecloudOauth').deserializeRestoreState(options.state);\n                        }\n\n                        /* pick oauth props from the url */\n                        const finalOptions = _.pick(options, oauthStoreParams);\n\n                        /* add expiry time before persisting to storage */\n                        if (finalOptions && finalOptions.expires_in) {\n                            finalOptions.token_expiry_time_millis =\n                                this._getCurrMillis() + finalOptions.expires_in * 1000;\n                            finalOptions.token_expiry_time_iso_string = new Date(\n                                finalOptions.token_expiry_time_millis\n                            ).toISOString();\n                        }\n\n                        resolve(finalOptions);\n                    })\n                    .catch(reason => {\n                        if (reason && reason.type === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                            reject({\n                                reason: reason.type,\n                                failedStep: reason.failedStep,\n                                status: reason.status\n                            });\n                            return;\n                        }\n\n                        reject({ reason: 'localSessionFailure' });\n                    });\n            } else {\n                // Initiate OAuth2 Authentication\n                try {\n                    let authUrl = this._buildAuthUrl(true, options ? options.state : undefined);\n\n                    reject({\n                        authUrl,\n                        reason: 'noToken'\n                    });\n                } catch (err) {\n                    reject({\n                        reason: err && err.message ? err.message : 'invalidAuthEndpoint'\n                    });\n                }\n            }\n        });\n    },\n\n    // Logout\n    invalidate() {\n        // If and when the returned promise is resolved, the token store will be cleaned automatically by ESA\n        return new RSVP.Promise(resolve => {\n            RSVP.allSettled([this._destroyLocalSession(), this._super()]).then(() => {\n                const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n                if (authorizer) {\n                    authorizer.deauthorizeAllDomainRequests();\n                }\n\n                resolve();\n            });\n        });\n    },\n\n    /**\n     * Extracts the authData from the provided string (or defaults to window.location.hash)\n     *\n     * @returns an object containing the decoded values from the escaped, encoded,\n     * query string style hash params returned by the PC OAuth endpoint.\n     */\n    extractAuthData(hash) {\n        if (typeof hash === 'undefined' && window && window.location) {\n            hash = window.location.hash;\n        }\n\n        if (!hash) {\n            return {};\n        }\n\n        hash = decodeURI(hash.trim());\n        if (hash.indexOf('#') === 0) {\n            hash = hash.slice(1);\n        }\n\n        return hash.split('&').reduce((accumulator, currPair) => {\n            let tokens = currPair.split('=').map(currToken => window.decodeURIComponent(currToken));\n\n            if (tokens[0] && tokens[0].trim().length > 0) {\n                accumulator[tokens[0]] = tokens.length > 1 ? tokens[1] : undefined;\n            }\n\n            return accumulator;\n        }, {});\n    },\n\n    buildAuthorizeUrl(stateParam, org) {\n        return this._buildAuthUrl(true, stateParam, org);\n    },\n\n    buildLogoutUrl() {\n        return this._buildAuthUrl(false);\n    },\n\n    /**\n     * Clean any browser storage (cookies, localStorage, etc) that is not\n     * managed by ESA.\n     */\n    cleanCustomBrowserStorage() {\n        // TECHDEBT: Clear any legacy, pre-oauth, pre-PC cookies\n        this.get('cookies').clear(this.get('application.cookies.session'));\n    },\n\n    _establishLocalSession(accessToken) {\n        if (this.localSessionDeferred) {\n            return this.localSessionDeferred.promise;\n        }\n\n        this.localSessionDeferred = RSVP.defer();\n\n        const authorizer = Ember.getOwner(this).lookup('authorizer:directory');\n        if (authorizer) {\n            authorizer.authorizeAllDomainRequests({ access_token: accessToken });\n        } else {\n            Ember.Logger.error('Failed to locate authorizer in container');\n            this.localSessionDeferred.reject('missingAuthorizer');\n        }\n\n        this.set('session.accessToken', accessToken);\n        this.get('session')\n            .authenticateWithSession()\n            .then(() => {\n                return this.get('session.publicApiUser') ? true : RSVP.reject('unknownSessionId');\n            })\n            .catch(details => {\n                if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                    Ember.Logger.warn('Session Bootstrap failed for superuser.  Granting access but please diagnose.');\n                    return true;\n                }\n\n                return RSVP.reject(details);\n            })\n            .then(() => {\n                // Remove them all for good measure\n                this.removeAuthCookie();\n                this.localSessionDeferred.resolve();\n            })\n            .catch(async details => {\n                // Attempt to log the error immediately; unless we know the access token is invalid\n                if (\n                    !details ||\n                    details.type !== SESSION_BOOTSTRAP_ERROR_TYPE ||\n                    (!details.legacyInvalidSessionToken && details.status !== 403)\n                ) {\n                    await this.ensureLogsSent();\n                }\n\n                this.set('session.hasAppAccess', false);\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n\n                authorizer.deauthorizeAllDomainRequests();\n                this.localSessionDeferred.reject(details);\n            });\n\n        return this.localSessionDeferred.promise;\n    },\n\n    _destroyLocalSession() {\n        return RSVP.resolve()\n            .then(() => {\n                if (!this.get('session.features.disassociate-redux')) {\n                    return this.get('ajax').ajaxGet('/api/v1/logout', { dataType: 'text' });\n                }\n            })\n            .finally(() => {\n                this.set('session.accessToken', null);\n                this.cleanCustomBrowserStorage();\n            });\n    },\n\n    _buildAuthUrl(login, stateParamValue, targetOrg) {\n        const baseAuthUri = this.get('applicationService.authUri');\n        const clientId = this.get('oauthProps.clientId');\n\n        if (!baseAuthUri || baseAuthUri.trim().length === 0) {\n            throw new Error('missingAuthUri');\n        }\n\n        if (!clientId || clientId.trim().length === 0) {\n            throw new Error('unknownClientId');\n        }\n\n        var oauthParams = {\n            response_type: 'token',\n            client_id: clientId,\n            enableRegionSwitching: true\n        };\n\n        // redirect_uri param\n        let redirectUri = window.location.origin;\n        if (!redirectUri) {\n            redirectUri = `${window.location.protocol}//${window.location.host}`;\n        }\n\n        /*\n         * Force pathname to include a trailing slash.  If not, safari will not\n         * recognize the hash params in the redirect.\n         *\n         * Good:                                   Bad:\n         * https://foo.com/#access_token=...       https://foo.com#access_token=...\n         * https://foo.com/bar/#access_token=...   https://foo.com/bar#access_token=...\n         *\n         * http://stackoverflow.com/questions/18663410/safari-ignoring-removing-hashatags-when-clicking-hyperlinks\n         * https://bugs.webkit.org/show_bug.cgi?id=24175\n         */\n        let pathname = window.location.pathname;\n        const lastIndex = pathname.length - 1;\n\n        if (lastIndex >= 0 && pathname.charAt(lastIndex) !== '/') {\n            pathname += '/';\n        }\n        redirectUri += pathname;\n        oauthParams.redirect_uri = redirectUri;\n\n        // state param\n        if (login && stateParamValue) {\n            oauthParams.state = stateParamValue;\n        }\n\n        // target used for proxy login\n        if (targetOrg) {\n            oauthParams.target = targetOrg;\n        }\n\n        // Build Auth URL\n        let authUrl = baseAuthUri;\n        authUrl += login === true ? authLoginPath : authLogoutPath;\n\n        if (authUrl.indexOf('?') === -1) {\n            authUrl += '?';\n        } else {\n            authUrl += '&';\n        }\n\n        authUrl += Ember.$.param(oauthParams, true);\n\n        return authUrl;\n    },\n\n    /**\n     * These cookies are extremely legacy and pre-date even oauth.\n     * Our backend services \"should not\" still be honoring them but we'll continue to force delete them in case a legacy client logs in.\n     * If/When ININ-Auth-Api support is fully removed, we should be safe to finally kill this off\n     */\n    removeAuthCookie() {\n        const cookies = this.get('cookies');\n        // Clean up any previously-set, now invalid cookies\n        cookies.clear(AUTH_COOKIE_NAME);\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/' });\n        cookies.clear(AUTH_COOKIE_NAME, { path: '/realtime' });\n    },\n\n    /*\n     * Attempt to immediately flush all queued logs\n     */\n    async ensureLogsSent() {\n        // Logs need to go out when the session screws up, before anything else\n        // happens, but ignore errors from this itself\n        // As long as its not an invalid sesson...\n        try {\n            await this.get('stashLogger').immediateSaveLogs();\n        } catch (_e) {\n            // We are ignoring this, continue with rejection\n        }\n    },\n\n    // exposed for test mocking\n    _getCurrMillis() {\n        return Date.now();\n    }\n});\n","import Ember from 'ember';\nimport DirectoryAuthenticator from './directory';\n\nconst { RSVP } = Ember;\n\nexport default DirectoryAuthenticator.extend({\n    restore(data) {\n        return RSVP.resolve(data);\n    },\n\n    // Fake out user authentication\n    authenticate(options) {\n        return this._super(options);\n    }\n});\n","import Ember from 'ember';\nimport netUtils from '../utils/net';\nimport config from '../config/environment';\nimport Base from 'ember-simple-auth/authorizers/base';\nimport _ from 'lodash';\nimport { isUnauthorizedError } from 'ember-ajax/errors';\nimport { REQUEST_TELEMETRY_APP_SUBSECTIONS } from 'connections-ui/services/ajax';\n\nconst HASH_LENGTH_LIMIT = 4976;\n\nconst SEMVER_PARSER = /^([^\\+]+)\\+(\\d+)-(.+)-([a-zA-Z0-9]+)$/;\n\nexport default Base.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _authData: null,\n    _ajaxPrefilters: null,\n    _ajaxErrors: null,\n\n    appContextHeaderTokens: Ember.computed(\n        'application.semver',\n        'application.hostedContext.isHostedProp',\n        'application.isPopout',\n        function () {\n            // This is similar to our service name, directory-webui, with the `-`\n            // replaced by `_` since PAPI enums use java identifiers and can't include dashes.\n            const headerTokens = ['connections-ui-webui'];\n\n            // web-dir version\n            const semver = this.get('application.semver');\n            if (typeof semver === 'string') {\n                const semverParseResult = SEMVER_PARSER.exec(semver.trim());\n                if (semverParseResult && semverParseResult.length === 5) {\n                    // Production build semver format\n                    const [, pkgVersion, buildNumber, gitBranch, gitCommit] = semverParseResult;\n                    // Reduce the size of the release details to keep the overall header length down\n                    // packageVersion-gitBranch[0,24)-buildNumber-gitCommit[0,8)\n                    // 25 branch chars accounts for our standard branch prefixes, jira teams/numbers, and a bit of desc\n                    // 8 chars of git sha should be more than sufficient\n                    headerTokens.push(\n                        [pkgVersion, gitBranch.slice(0, 25), buildNumber, gitCommit.slice(0, 8)]\n                            .map(curr => curr.trim().replaceAll('-', '_'))\n                            .filter(curr => curr)\n                            .join('-')\n                    );\n                } else {\n                    // Dev/Unparsable semver - just use it as is and truncated to 25 chars\n                    headerTokens.push(semver.trim().slice(0, 25));\n                }\n            }\n\n            // Desktop vs Browser\n            const isHosted = this.get('application.hostedContext.isHostedProp');\n            headerTokens.push(isHosted ? 'desktop' : 'browser');\n\n            // Popout (PEF, chat, etc)\n            // Popout is not a 1:1 mapping to PEF, but, it is one of the cases that manifests as isPopout\n            if (this.get('application.isPopout')) {\n                headerTokens.push('popout');\n            }\n\n            return headerTokens;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this._ajaxPrefilters = $.Callbacks();\n        Ember.$.ajaxPrefilter('+*', this._ajaxPrefilters.fire);\n        this._ajaxErrors = $.Callbacks();\n        Ember.$(document).ajaxError(this._ajaxErrors.fire);\n    },\n\n    authorize: function (authData, fnToAuthorize) {\n        if (authData && authData.access_token) {\n            fnToAuthorize(this._buildHeaders(authData));\n        }\n    },\n\n    authorizeAllDomainRequests: function (authData) {\n        this.set('_authData', authData);\n\n        this._ajaxPrefilters.add(this._addHeadersPrefilter.bind(this));\n        this._ajaxErrors.add(Ember.run.bind(this, '_handleUnauthorizedRequests'));\n    },\n\n    deauthorizeAllDomainRequests: function () {\n        this.set('_authData', null);\n\n        this._ajaxPrefilters.empty();\n        this._ajaxErrors.empty();\n    },\n\n    _addHeadersPrefilter(options, original, jqXHR) {\n        if (!options.crossDomain || this._isWhitelistedUrl(options.url) || this._isAbsPathOfProxiedEnv(options.url)) {\n            const excludeAuthHeader = this.isFaxUpload(options.url) || options.noAuthorizationHeader;\n            const headers = this._buildHeaders(this.get('_authData'));\n\n            if (excludeAuthHeader && headers.Authorization) {\n                // fax or others upload using Darth service has its own authentication headers\n                delete headers.Authorization;\n            }\n\n            _.forEach(headers, (headerValue, headerName) => {\n                jqXHR.setRequestHeader(headerName, headerValue);\n            });\n        }\n\n        if (this._isGcPublicApiUrl(options.url)) {\n            const headerTokens = [...this.get('appContextHeaderTokens')];\n\n            // App Subsection\n            // Read the `original` options param which are the unmodified options from the caller\n            if (\n                original &&\n                typeof original === 'object' &&\n                Object.prototype.hasOwnProperty.call(original, REQUEST_TELEMETRY_APP_SUBSECTIONS)\n            ) {\n                const subsection = original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n                // Delete this prop so it doesn't get sent with the request\n                delete original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n\n                let subsectionTokens = Array.isArray(subsection)\n                    ? subsection\n                    : typeof subsection === 'string'\n                    ? [subsection]\n                    : null;\n\n                if (!subsectionTokens || subsectionTokens.some(curr => typeof curr !== 'string')) {\n                    // log and ignore when encountering any invalid subsection types\n                    this.get('logger').error('Received invalid subsection for Genesys-App header', {\n                        remoteData: {\n                            type: typeof subsection,\n                            subsection\n                        }\n                    });\n                } else {\n                    // This check is strictly for dev logging\n                    // We drop slashes when building the final header value\n                    if (subsectionTokens.some(currToken => currToken.includes('/'))) {\n                        this.get('logger').warn('Dropping invalid \"/\" char found in Genesys-App header subsection', {\n                            remoteData: {\n                                type: typeof subsection,\n                                subsection\n                            }\n                        });\n                    }\n                    headerTokens.push(...subsectionTokens);\n                }\n            }\n\n            // Escape `/` with `_` as slashes are our token separators\n            jqXHR.setRequestHeader('Genesys-App', headerTokens.map(curr => curr.trim().replaceAll('/', '_')).join('/'));\n        }\n    },\n\n    _isWhitelistedUrl(url) {\n        return !!url && url.indexOf(this.get('application.purecloudV2BaseUri')) === 0;\n    },\n\n    _isGcPublicApiUrl(url) {\n        if (!url) {\n            return false;\n        }\n\n        const pubApiBase = this.get('application.purecloudV2BaseUri');\n        const pubApiProxyBase = this.get('application.purecloudBaseUri');\n        return [pubApiBase, pubApiProxyBase].some(currBase => {\n            return currBase && typeof currBase === 'string' && url.indexOf(currBase) === 0;\n        });\n    },\n\n    isFaxUpload(url) {\n        return !!url && url.indexOf('fax-uploads') > -1;\n    },\n\n    /**\n     * Returns true if:\n     * The current environment is development\n     * The current environment is proxied to a PC deployed env\n     * The provided url is on or a sub-domain of the PC TLD.\n     *\n     * Currently, this utility doesn't require that the provided url be remote.\n     * This allows you to be serving locally off of `localhost.mypurcloud.com:4300`\n     * and append the auth token to a `localhost:4300/sca` url.\n     */\n    _isAbsPathOfProxiedEnv(url) {\n        if (!url) {\n            return false;\n        }\n\n        let result = false;\n\n        let envDetails = this.get('application.envDetails');\n        if (config.environment === 'development' && envDetails && envDetails.local) {\n            // Currently proxying.  Test if url is our tgt env\n            try {\n                let tgtEnvDetails = netUtils.getEnvDetails(url);\n\n                result = envDetails.env === tgtEnvDetails.env;\n            } catch (unknownEnv) {\n                result = false;\n            }\n        }\n\n        return result;\n    },\n\n    _handleUnauthorizedRequests(event, jqXHR, settings, thrownError) {\n        /*\n         * isAuthenticated/logoutInProgress checks avoid handling expected 401s and logging false positives in sumo.\n         *\n         * Ex:\n         *   Attempting restore with an expired token\n         *   Ajax request failing after logout requested\n         */\n        if (\n            jqXHR.status === 401 &&\n            !jqXHR.skipPurecloudUnauthorizedCheck &&\n            !!this.get('session.isAuthenticated') &&\n            !this.get('session.logoutInProgress') &&\n            (settings.crossDomain === false ||\n                this._isWhitelistedUrl(settings.url) ||\n                this._isAbsPathOfProxiedEnv(settings.url))\n        ) {\n            /*\n             * Attempt to log this 401 immediately.  If it succeeds, we have a service that is throwing a\n             * 401 that is out of sync with public-api wrt authentication.  The log will make it to\n             * sumo and will not be a false positive.  If it fails due to rate limiting, we're reloading\n             * unconditionally at the moment, so no need to buffer it.\n             */\n            this._sendXhrErrorDetails(settings, thrownError, jqXHR).finally(() => {\n                // Request a new token (remember me) or logout\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            });\n        }\n    },\n\n    _buildHeaders(authData) {\n        /* eslint-disable dot-notation */\n        let hash = window.location.hash;\n\n        hash = hash.length > HASH_LENGTH_LIMIT ? hash.slice(0, HASH_LENGTH_LIMIT) : hash;\n\n        const headers = {\n            'ININ-Client-Path': hash\n        };\n\n        if (authData && authData.access_token) {\n            headers['Authorization'] = `bearer ${authData.access_token}`;\n        }\n\n        /* eslint-enable dot-notation */\n        return headers;\n    },\n\n    _handleClientUnauthorizedError(clientId) {\n        let msg = `${clientId} reported invalid 401 event. Not logout will be triggered.`;\n        return this._sendErrorMessage({ message: msg }).catch(error => {\n            // Checking if the session is actually invalid.\n            if (isUnauthorizedError(error)) {\n                this.get('session').invalidate({\n                    unauthorized: true\n                });\n            }\n        });\n    },\n\n    _sendXhrErrorDetails(settings, thrownError = '', xhr = {}) {\n        const message =\n            '401 encountered while trying to access URL. Automatically requesting new token for user. Check local machine logs.';\n\n        // eslint-disable-next-line no-console\n        console.error(message, {\n            settings,\n            thrownError\n        });\n\n        // Don't log to sumo in dev mode\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const correlationId = xhr.getResponseHeader('inin-correlation-id');\n\n        const data = JSON.stringify({\n            message,\n            correlationId\n        });\n\n        return this._sendErrorMessage(data);\n    },\n\n    _sendErrorMessage(messageData) {\n        const url = this.get('application').pcV2Uri('api/v2/diagnostics/trace');\n        return this.get('ajax').post(url, {\n            beforeSend: jqXHR => {\n                // Add a flag to this request to bypass infinite 401 checking\n                jqXHR.skipPurecloudUnauthorizedCheck = true;\n            },\n            dataType: 'text',\n            data: JSON.stringify({\n                app: {\n                    appId: 'connections-ui-webui',\n                    appVersion: this.get('version')\n                },\n                traces: [\n                    {\n                        level: 'ERROR',\n                        time: new Date().toString(),\n                        message: messageData,\n                        topic: 'connections-ui.service:session'\n                    }\n                ]\n            })\n        });\n    }\n});\n","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ar\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n,n100=t0&&s[0].slice(-2);if(ord)return\"other\";return n==0?\"zero\":n==1?\"one\":n==2?\"two\":n100>=3&&n100<=10?\"few\":n100>=11&&n100<=99?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"السنة\",\"relative\":{\"0\":\"السنة الحالية\",\"1\":\"السنة التالية\",\"-1\":\"السنة الماضية\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} سنة\",\"one\":\"خلال سنة واحدة\",\"two\":\"خلال سنتين\",\"few\":\"خلال {0} سنوات\",\"many\":\"خلال {0} سنة\",\"other\":\"خلال {0} سنة\"},\"past\":{\"zero\":\"قبل {0} سنة\",\"one\":\"قبل سنة واحدة\",\"two\":\"قبل سنتين\",\"few\":\"قبل {0} سنوات\",\"many\":\"قبل {0} سنة\",\"other\":\"قبل {0} سنة\"}}},\"month\":{\"displayName\":\"الشهر\",\"relative\":{\"0\":\"هذا الشهر\",\"1\":\"الشهر التالي\",\"-1\":\"الشهر الماضي\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} شهر\",\"one\":\"خلال شهر واحد\",\"two\":\"خلال شهرين\",\"few\":\"خلال {0} أشهر\",\"many\":\"خلال {0} شهرًا\",\"other\":\"خلال {0} شهر\"},\"past\":{\"zero\":\"قبل {0} شهر\",\"one\":\"قبل شهر واحد\",\"two\":\"قبل شهرين\",\"few\":\"قبل {0} أشهر\",\"many\":\"قبل {0} شهرًا\",\"other\":\"قبل {0} شهر\"}}},\"day\":{\"displayName\":\"يوم\",\"relative\":{\"0\":\"اليوم\",\"1\":\"غدًا\",\"2\":\"بعد الغد\",\"-2\":\"أول أمس\",\"-1\":\"أمس\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} يوم\",\"one\":\"خلال يوم واحد\",\"two\":\"خلال يومين\",\"few\":\"خلال {0} أيام\",\"many\":\"خلال {0} يومًا\",\"other\":\"خلال {0} يوم\"},\"past\":{\"zero\":\"قبل {0} يوم\",\"one\":\"قبل يوم واحد\",\"two\":\"قبل يومين\",\"few\":\"قبل {0} أيام\",\"many\":\"قبل {0} يومًا\",\"other\":\"قبل {0} يوم\"}}},\"hour\":{\"displayName\":\"الساعات\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ساعة\",\"one\":\"خلال ساعة واحدة\",\"two\":\"خلال ساعتين\",\"few\":\"خلال {0} ساعات\",\"many\":\"خلال {0} ساعة\",\"other\":\"خلال {0} ساعة\"},\"past\":{\"zero\":\"قبل {0} ساعة\",\"one\":\"قبل ساعة واحدة\",\"two\":\"قبل ساعتين\",\"few\":\"قبل {0} ساعات\",\"many\":\"قبل {0} ساعة\",\"other\":\"قبل {0} ساعة\"}}},\"minute\":{\"displayName\":\"الدقائق\",\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} دقيقة\",\"one\":\"خلال دقيقة واحدة\",\"two\":\"خلال دقيقتين\",\"few\":\"خلال {0} دقائق\",\"many\":\"خلال {0} دقيقة\",\"other\":\"خلال {0} دقيقة\"},\"past\":{\"zero\":\"قبل {0} دقيقة\",\"one\":\"قبل دقيقة واحدة\",\"two\":\"قبل دقيقتين\",\"few\":\"قبل {0} دقائق\",\"many\":\"قبل {0} دقيقة\",\"other\":\"قبل {0} دقيقة\"}}},\"second\":{\"displayName\":\"الثواني\",\"relative\":{\"0\":\"الآن\"},\"relativeTime\":{\"future\":{\"zero\":\"خلال {0} ثانية\",\"one\":\"خلال ثانية واحدة\",\"two\":\"خلال ثانيتين\",\"few\":\"خلال {0} ثوانِ\",\"many\":\"خلال {0} ثانية\",\"other\":\"خلال {0} ثانية\"},\"past\":{\"zero\":\"قبل {0} ثانية\",\"one\":\"قبل ثانية واحدة\",\"two\":\"قبل ثانيتين\",\"few\":\"قبل {0} ثوانِ\",\"many\":\"قبل {0} ثانية\",\"other\":\"قبل {0} ثانية\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"cs\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":i>=2&&i<=4&&v0?\"few\":!v0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"tento rok\",\"1\":\"příští rok\",\"-1\":\"minulý rok\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} roky\",\"many\":\"za {0} roku\",\"other\":\"za {0} let\"},\"past\":{\"one\":\"před {0} rokem\",\"few\":\"před {0} lety\",\"many\":\"před {0} rokem\",\"other\":\"před {0} lety\"}}},\"month\":{\"displayName\":\"měsíc\",\"relative\":{\"0\":\"tento měsíc\",\"1\":\"příští měsíc\",\"-1\":\"minulý měsíc\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} měsíc\",\"few\":\"za {0} měsíce\",\"many\":\"za {0} měsíce\",\"other\":\"za {0} měsíců\"},\"past\":{\"one\":\"před {0} měsícem\",\"few\":\"před {0} měsíci\",\"many\":\"před {0} měsícem\",\"other\":\"před {0} měsíci\"}}},\"day\":{\"displayName\":\"den\",\"relative\":{\"0\":\"dnes\",\"1\":\"zítra\",\"2\":\"pozítří\",\"-2\":\"předevčírem\",\"-1\":\"včera\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} den\",\"few\":\"za {0} dny\",\"many\":\"za {0} dne\",\"other\":\"za {0} dní\"},\"past\":{\"one\":\"před {0} dnem\",\"few\":\"před {0} dny\",\"many\":\"před {0} dnem\",\"other\":\"před {0} dny\"}}},\"hour\":{\"displayName\":\"hodina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} hodinu\",\"few\":\"za {0} hodiny\",\"many\":\"za {0} hodiny\",\"other\":\"za {0} hodin\"},\"past\":{\"one\":\"před {0} hodinou\",\"few\":\"před {0} hodinami\",\"many\":\"před {0} hodinou\",\"other\":\"před {0} hodinami\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutu\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minuty\",\"other\":\"za {0} minut\"},\"past\":{\"one\":\"před {0} minutou\",\"few\":\"před {0} minutami\",\"many\":\"před {0} minutou\",\"other\":\"před {0} minutami\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"nyní\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundu\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekundy\",\"other\":\"za {0} sekund\"},\"past\":{\"one\":\"před {0} sekundou\",\"few\":\"před {0} sekundami\",\"many\":\"před {0} sekundou\",\"other\":\"před {0} sekundami\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"da\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],t0=Number(s[0])==n;if(ord)return\"other\";return n==1||!t0&&(i==0||i==1)?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"næste år\",\"-1\":\"sidste år\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"for {0} år siden\",\"other\":\"for {0} år siden\"}}},\"month\":{\"displayName\":\"måned\",\"relative\":{\"0\":\"denne måned\",\"1\":\"næste måned\",\"-1\":\"sidste måned\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} måned\",\"other\":\"om {0} måneder\"},\"past\":{\"one\":\"for {0} måned siden\",\"other\":\"for {0} måneder siden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgen\",\"2\":\"i overmorgen\",\"-2\":\"i forgårs\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dage\"},\"past\":{\"one\":\"for {0} dag siden\",\"other\":\"for {0} dage siden\"}}},\"hour\":{\"displayName\":\"time\",\"relativeTime\":{\"future\":{\"one\":\"om {0} time\",\"other\":\"om {0} timer\"},\"past\":{\"one\":\"for {0} time siden\",\"other\":\"for {0} timer siden\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minutter\"},\"past\":{\"one\":\"for {0} minut siden\",\"other\":\"for {0} minutter siden\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"for {0} sekund siden\",\"other\":\"for {0} sekunder siden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"de\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Jahr\",\"relative\":{\"0\":\"dieses Jahr\",\"1\":\"nächstes Jahr\",\"-1\":\"letztes Jahr\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Jahr\",\"other\":\"in {0} Jahren\"},\"past\":{\"one\":\"vor {0} Jahr\",\"other\":\"vor {0} Jahren\"}}},\"month\":{\"displayName\":\"Monat\",\"relative\":{\"0\":\"diesen Monat\",\"1\":\"nächsten Monat\",\"-1\":\"letzten Monat\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Monat\",\"other\":\"in {0} Monaten\"},\"past\":{\"one\":\"vor {0} Monat\",\"other\":\"vor {0} Monaten\"}}},\"day\":{\"displayName\":\"Tag\",\"relative\":{\"0\":\"heute\",\"1\":\"morgen\",\"2\":\"übermorgen\",\"-2\":\"vorgestern\",\"-1\":\"gestern\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Tag\",\"other\":\"in {0} Tagen\"},\"past\":{\"one\":\"vor {0} Tag\",\"other\":\"vor {0} Tagen\"}}},\"hour\":{\"displayName\":\"Stunde\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Stunde\",\"other\":\"in {0} Stunden\"},\"past\":{\"one\":\"vor {0} Stunde\",\"other\":\"vor {0} Stunden\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} Minute\",\"other\":\"in {0} Minuten\"},\"past\":{\"one\":\"vor {0} Minute\",\"other\":\"vor {0} Minuten\"}}},\"second\":{\"displayName\":\"Sekunde\",\"relative\":{\"0\":\"jetzt\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} Sekunde\",\"other\":\"in {0} Sekunden\"},\"past\":{\"one\":\"vor {0} Sekunde\",\"other\":\"vor {0} Sekunden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"en-US\",\"parentLocale\":\"en\"},{\"locale\":\"en\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?\"one\":n10==2&&n100!=12?\"two\":n10==3&&n100!=13?\"few\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} year\",\"other\":\"in {0} years\"},\"past\":{\"one\":\"{0} year ago\",\"other\":\"{0} years ago\"}}},\"month\":{\"displayName\":\"month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} month\",\"other\":\"in {0} months\"},\"past\":{\"one\":\"{0} month ago\",\"other\":\"{0} months ago\"}}},\"day\":{\"displayName\":\"day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} day\",\"other\":\"in {0} days\"},\"past\":{\"one\":\"{0} day ago\",\"other\":\"{0} days ago\"}}},\"hour\":{\"displayName\":\"hour\",\"relativeTime\":{\"future\":{\"one\":\"in {0} hour\",\"other\":\"in {0} hours\"},\"past\":{\"one\":\"{0} hour ago\",\"other\":\"{0} hours ago\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"in {0} minute\",\"other\":\"in {0} minutes\"},\"past\":{\"one\":\"{0} minute ago\",\"other\":\"{0} minutes ago\"}}},\"second\":{\"displayName\":\"second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"one\":\"in {0} second\",\"other\":\"in {0} seconds\"},\"past\":{\"one\":\"{0} second ago\",\"other\":\"{0} seconds ago\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"es\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"año\",\"relative\":{\"0\":\"este año\",\"1\":\"el próximo año\",\"-1\":\"el año pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} año\",\"other\":\"dentro de {0} años\"},\"past\":{\"one\":\"hace {0} año\",\"other\":\"hace {0} años\"}}},\"month\":{\"displayName\":\"mes\",\"relative\":{\"0\":\"este mes\",\"1\":\"el próximo mes\",\"-1\":\"el mes pasado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mes\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"hace {0} mes\",\"other\":\"hace {0} meses\"}}},\"day\":{\"displayName\":\"día\",\"relative\":{\"0\":\"hoy\",\"1\":\"mañana\",\"2\":\"pasado mañana\",\"-2\":\"anteayer\",\"-1\":\"ayer\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} día\",\"other\":\"dentro de {0} días\"},\"past\":{\"one\":\"hace {0} día\",\"other\":\"hace {0} días\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"hace {0} hora\",\"other\":\"hace {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"hace {0} minuto\",\"other\":\"hace {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"ahora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"hace {0} segundo\",\"other\":\"hace {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fi\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"vuosi\",\"relative\":{\"0\":\"tänä vuonna\",\"1\":\"ensi vuonna\",\"-1\":\"viime vuonna\"},\"relativeTime\":{\"future\":{\"one\":\"{0} vuoden päästä\",\"other\":\"{0} vuoden päästä\"},\"past\":{\"one\":\"{0} vuosi sitten\",\"other\":\"{0} vuotta sitten\"}}},\"month\":{\"displayName\":\"kuukausi\",\"relative\":{\"0\":\"tässä kuussa\",\"1\":\"ensi kuussa\",\"-1\":\"viime kuussa\"},\"relativeTime\":{\"future\":{\"one\":\"{0} kuukauden päästä\",\"other\":\"{0} kuukauden päästä\"},\"past\":{\"one\":\"{0} kuukausi sitten\",\"other\":\"{0} kuukautta sitten\"}}},\"day\":{\"displayName\":\"päivä\",\"relative\":{\"0\":\"tänään\",\"1\":\"huomenna\",\"2\":\"ylihuomenna\",\"-2\":\"toissa päivänä\",\"-1\":\"eilen\"},\"relativeTime\":{\"future\":{\"one\":\"{0} päivän päästä\",\"other\":\"{0} päivän päästä\"},\"past\":{\"one\":\"{0} päivä sitten\",\"other\":\"{0} päivää sitten\"}}},\"hour\":{\"displayName\":\"tunti\",\"relativeTime\":{\"future\":{\"one\":\"{0} tunnin päästä\",\"other\":\"{0} tunnin päästä\"},\"past\":{\"one\":\"{0} tunti sitten\",\"other\":\"{0} tuntia sitten\"}}},\"minute\":{\"displayName\":\"minuutti\",\"relativeTime\":{\"future\":{\"one\":\"{0} minuutin päästä\",\"other\":\"{0} minuutin päästä\"},\"past\":{\"one\":\"{0} minuutti sitten\",\"other\":\"{0} minuuttia sitten\"}}},\"second\":{\"displayName\":\"sekunti\",\"relative\":{\"0\":\"nyt\"},\"relativeTime\":{\"future\":{\"one\":\"{0} sekunnin päästä\",\"other\":\"{0} sekunnin päästä\"},\"past\":{\"one\":\"{0} sekunti sitten\",\"other\":\"{0} sekuntia sitten\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"fr-CA\",\"parentLocale\":\"fr\",\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"Dans {0} an\",\"other\":\"Dans {0} ans\"},\"past\":{\"one\":\"Il y a {0} an\",\"other\":\"Il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"Dans {0} minute\",\"other\":\"Dans {0} minutes\"},\"past\":{\"one\":\"Il y a {0} minute\",\"other\":\"Il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}},{\"locale\":\"fr\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":\"other\";return n>=0&&n<2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"année\",\"relative\":{\"0\":\"cette année\",\"1\":\"l’année prochaine\",\"-1\":\"l’année dernière\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} an\",\"other\":\"dans {0} ans\"},\"past\":{\"one\":\"il y a {0} an\",\"other\":\"il y a {0} ans\"}}},\"month\":{\"displayName\":\"mois\",\"relative\":{\"0\":\"ce mois-ci\",\"1\":\"le mois prochain\",\"-1\":\"le mois dernier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} mois\",\"other\":\"dans {0} mois\"},\"past\":{\"one\":\"il y a {0} mois\",\"other\":\"il y a {0} mois\"}}},\"day\":{\"displayName\":\"jour\",\"relative\":{\"0\":\"aujourd’hui\",\"1\":\"demain\",\"2\":\"après-demain\",\"-2\":\"avant-hier\",\"-1\":\"hier\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} jour\",\"other\":\"dans {0} jours\"},\"past\":{\"one\":\"il y a {0} jour\",\"other\":\"il y a {0} jours\"}}},\"hour\":{\"displayName\":\"heure\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} heure\",\"other\":\"dans {0} heures\"},\"past\":{\"one\":\"il y a {0} heure\",\"other\":\"il y a {0} heures\"}}},\"minute\":{\"displayName\":\"minute\",\"relativeTime\":{\"future\":{\"one\":\"dans {0} minute\",\"other\":\"dans {0} minutes\"},\"past\":{\"one\":\"il y a {0} minute\",\"other\":\"il y a {0} minutes\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"maintenant\"},\"relativeTime\":{\"future\":{\"one\":\"dans {0} seconde\",\"other\":\"dans {0} secondes\"},\"past\":{\"one\":\"il y a {0} seconde\",\"other\":\"il y a {0} secondes\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"he\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1);if(ord)return\"other\";return n==1&&v0?\"one\":i==2&&v0?\"two\":v0&&(n<0||n>10)&&t0&&n10==0?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"שנה\",\"relative\":{\"0\":\"השנה\",\"1\":\"השנה הבאה\",\"-1\":\"השנה שעברה\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנה\",\"two\":\"בעוד שנתיים\",\"many\":\"בעוד {0} שנה\",\"other\":\"בעוד {0} שנים\"},\"past\":{\"one\":\"לפני שנה\",\"two\":\"לפני שנתיים\",\"many\":\"לפני {0} שנה\",\"other\":\"לפני {0} שנים\"}}},\"month\":{\"displayName\":\"חודש\",\"relative\":{\"0\":\"החודש\",\"1\":\"החודש הבא\",\"-1\":\"החודש שעבר\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד חודש\",\"two\":\"בעוד חודשיים\",\"many\":\"בעוד {0} חודשים\",\"other\":\"בעוד {0} חודשים\"},\"past\":{\"one\":\"לפני חודש\",\"two\":\"לפני חודשיים\",\"many\":\"לפני {0} חודשים\",\"other\":\"לפני {0} חודשים\"}}},\"day\":{\"displayName\":\"יום\",\"relative\":{\"0\":\"היום\",\"1\":\"מחר\",\"2\":\"מחרתיים\",\"-2\":\"שלשום\",\"-1\":\"אתמול\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד יום {0}\",\"two\":\"בעוד יומיים\",\"many\":\"בעוד {0} ימים\",\"other\":\"בעוד {0} ימים\"},\"past\":{\"one\":\"לפני יום {0}\",\"two\":\"לפני יומיים\",\"many\":\"לפני {0} ימים\",\"other\":\"לפני {0} ימים\"}}},\"hour\":{\"displayName\":\"שעה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד שעה\",\"two\":\"בעוד שעתיים\",\"many\":\"בעוד {0} שעות\",\"other\":\"בעוד {0} שעות\"},\"past\":{\"one\":\"לפני שעה\",\"two\":\"לפני שעתיים\",\"many\":\"לפני {0} שעות\",\"other\":\"לפני {0} שעות\"}}},\"minute\":{\"displayName\":\"דקה\",\"relativeTime\":{\"future\":{\"one\":\"בעוד דקה\",\"two\":\"בעוד שתי דקות\",\"many\":\"בעוד {0} דקות\",\"other\":\"בעוד {0} דקות\"},\"past\":{\"one\":\"לפני דקה\",\"two\":\"לפני שתי דקות\",\"many\":\"לפני {0} דקות\",\"other\":\"לפני {0} דקות\"}}},\"second\":{\"displayName\":\"שנייה\",\"relative\":{\"0\":\"עכשיו\"},\"relativeTime\":{\"future\":{\"one\":\"בעוד שנייה\",\"two\":\"בעוד שתי שניות\",\"many\":\"בעוד {0} שניות\",\"other\":\"בעוד {0} שניות\"},\"past\":{\"one\":\"לפני שנייה\",\"two\":\"לפני שתי שניות\",\"many\":\"לפני {0} שניות\",\"other\":\"לפני {0} שניות\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"hi\",\"pluralRuleFunction\":function(n,ord){if(ord)return n==1?\"one\":n==2||n==3?\"two\":n==4?\"few\":n==6?\"many\":\"other\";return n>=0&&n<=1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"वर्ष\",\"relative\":{\"0\":\"इस वर्ष\",\"1\":\"अगला वर्ष\",\"-1\":\"पिछला वर्ष\"},\"relativeTime\":{\"future\":{\"one\":\"{0} वर्ष में\",\"other\":\"{0} वर्ष में\"},\"past\":{\"one\":\"{0} वर्ष पहले\",\"other\":\"{0} वर्ष पहले\"}}},\"month\":{\"displayName\":\"माह\",\"relative\":{\"0\":\"इस माह\",\"1\":\"अगला माह\",\"-1\":\"पिछला माह\"},\"relativeTime\":{\"future\":{\"one\":\"{0} माह में\",\"other\":\"{0} माह में\"},\"past\":{\"one\":\"{0} माह पहले\",\"other\":\"{0} माह पहले\"}}},\"day\":{\"displayName\":\"दिन\",\"relative\":{\"0\":\"आज\",\"1\":\"कल\",\"2\":\"परसों\",\"-2\":\"बीता परसों\",\"-1\":\"कल\"},\"relativeTime\":{\"future\":{\"one\":\"{0} दिन में\",\"other\":\"{0} दिन में\"},\"past\":{\"one\":\"{0} दिन पहले\",\"other\":\"{0} दिन पहले\"}}},\"hour\":{\"displayName\":\"घंटा\",\"relativeTime\":{\"future\":{\"one\":\"{0} घंटे में\",\"other\":\"{0} घंटे में\"},\"past\":{\"one\":\"{0} घंटे पहले\",\"other\":\"{0} घंटे पहले\"}}},\"minute\":{\"displayName\":\"मिनट\",\"relativeTime\":{\"future\":{\"one\":\"{0} मिनट में\",\"other\":\"{0} मिनट में\"},\"past\":{\"one\":\"{0} मिनट पहले\",\"other\":\"{0} मिनट पहले\"}}},\"second\":{\"displayName\":\"सेकंड\",\"relative\":{\"0\":\"अब\"},\"relativeTime\":{\"future\":{\"one\":\"{0} सेकंड में\",\"other\":\"{0} सेकंड में\"},\"past\":{\"one\":\"{0} सेकंड पहले\",\"other\":\"{0} सेकंड पहले\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"it\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return n==11||n==8||n==80||n==800?\"many\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"anno\",\"relative\":{\"0\":\"quest’anno\",\"1\":\"anno prossimo\",\"-1\":\"anno scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} anno\",\"other\":\"tra {0} anni\"},\"past\":{\"one\":\"{0} anno fa\",\"other\":\"{0} anni fa\"}}},\"month\":{\"displayName\":\"mese\",\"relative\":{\"0\":\"questo mese\",\"1\":\"mese prossimo\",\"-1\":\"mese scorso\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} mese\",\"other\":\"tra {0} mesi\"},\"past\":{\"one\":\"{0} mese fa\",\"other\":\"{0} mesi fa\"}}},\"day\":{\"displayName\":\"giorno\",\"relative\":{\"0\":\"oggi\",\"1\":\"domani\",\"2\":\"dopodomani\",\"-2\":\"l’altro ieri\",\"-1\":\"ieri\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} giorno\",\"other\":\"tra {0} giorni\"},\"past\":{\"one\":\"{0} giorno fa\",\"other\":\"{0} giorni fa\"}}},\"hour\":{\"displayName\":\"ora\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} ora\",\"other\":\"tra {0} ore\"},\"past\":{\"one\":\"{0} ora fa\",\"other\":\"{0} ore fa\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"tra {0} minuto\",\"other\":\"tra {0} minuti\"},\"past\":{\"one\":\"{0} minuto fa\",\"other\":\"{0} minuti fa\"}}},\"second\":{\"displayName\":\"Secondo\",\"relative\":{\"0\":\"ora\"},\"relativeTime\":{\"future\":{\"one\":\"tra {0} secondo\",\"other\":\"tra {0} secondi\"},\"past\":{\"one\":\"{0} secondo fa\",\"other\":\"{0} secondi fa\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ja\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"翌年\",\"-1\":\"昨年\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 年後\"},\"past\":{\"other\":\"{0} 年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"今月\",\"1\":\"翌月\",\"-1\":\"先月\"},\"relativeTime\":{\"future\":{\"other\":\"{0} か月後\"},\"past\":{\"other\":\"{0} か月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今日\",\"1\":\"明日\",\"2\":\"明後日\",\"-2\":\"一昨日\",\"-1\":\"昨日\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 日後\"},\"past\":{\"other\":\"{0} 日前\"}}},\"hour\":{\"displayName\":\"時\",\"relativeTime\":{\"future\":{\"other\":\"{0} 時間後\"},\"past\":{\"other\":\"{0} 時間前\"}}},\"minute\":{\"displayName\":\"分\",\"relativeTime\":{\"future\":{\"other\":\"{0} 分後\"},\"past\":{\"other\":\"{0} 分前\"}}},\"second\":{\"displayName\":\"秒\",\"relative\":{\"0\":\"今すぐ\"},\"relativeTime\":{\"future\":{\"other\":\"{0} 秒後\"},\"past\":{\"other\":\"{0} 秒前\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ko\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"년\",\"relative\":{\"0\":\"올해\",\"1\":\"내년\",\"-1\":\"작년\"},\"relativeTime\":{\"future\":{\"other\":\"{0}년 후\"},\"past\":{\"other\":\"{0}년 전\"}}},\"month\":{\"displayName\":\"월\",\"relative\":{\"0\":\"이번 달\",\"1\":\"다음 달\",\"-1\":\"지난달\"},\"relativeTime\":{\"future\":{\"other\":\"{0}개월 후\"},\"past\":{\"other\":\"{0}개월 전\"}}},\"day\":{\"displayName\":\"일\",\"relative\":{\"0\":\"오늘\",\"1\":\"내일\",\"2\":\"모레\",\"-2\":\"그저께\",\"-1\":\"어제\"},\"relativeTime\":{\"future\":{\"other\":\"{0}일 후\"},\"past\":{\"other\":\"{0}일 전\"}}},\"hour\":{\"displayName\":\"시\",\"relativeTime\":{\"future\":{\"other\":\"{0}시간 후\"},\"past\":{\"other\":\"{0}시간 전\"}}},\"minute\":{\"displayName\":\"분\",\"relativeTime\":{\"future\":{\"other\":\"{0}분 후\"},\"past\":{\"other\":\"{0}분 전\"}}},\"second\":{\"displayName\":\"초\",\"relative\":{\"0\":\"지금\"},\"relativeTime\":{\"future\":{\"other\":\"{0}초 후\"},\"past\":{\"other\":\"{0}초 전\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"nl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"jaar\",\"relative\":{\"0\":\"dit jaar\",\"1\":\"volgend jaar\",\"-1\":\"vorig jaar\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} jaar\",\"other\":\"over {0} jaar\"},\"past\":{\"one\":\"{0} jaar geleden\",\"other\":\"{0} jaar geleden\"}}},\"month\":{\"displayName\":\"maand\",\"relative\":{\"0\":\"deze maand\",\"1\":\"volgende maand\",\"-1\":\"vorige maand\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} maand\",\"other\":\"over {0} maanden\"},\"past\":{\"one\":\"{0} maand geleden\",\"other\":\"{0} maanden geleden\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"vandaag\",\"1\":\"morgen\",\"2\":\"overmorgen\",\"-2\":\"eergisteren\",\"-1\":\"gisteren\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} dag\",\"other\":\"over {0} dagen\"},\"past\":{\"one\":\"{0} dag geleden\",\"other\":\"{0} dagen geleden\"}}},\"hour\":{\"displayName\":\"Uur\",\"relativeTime\":{\"future\":{\"one\":\"over {0} uur\",\"other\":\"over {0} uur\"},\"past\":{\"one\":\"{0} uur geleden\",\"other\":\"{0} uur geleden\"}}},\"minute\":{\"displayName\":\"minuut\",\"relativeTime\":{\"future\":{\"one\":\"over {0} minuut\",\"other\":\"over {0} minuten\"},\"past\":{\"one\":\"{0} minuut geleden\",\"other\":\"{0} minuten geleden\"}}},\"second\":{\"displayName\":\"seconde\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"over {0} seconde\",\"other\":\"over {0} seconden\"},\"past\":{\"one\":\"{0} seconde geleden\",\"other\":\"{0} seconden geleden\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"no\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Year\",\"relative\":{\"0\":\"this year\",\"1\":\"next year\",\"-1\":\"last year\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} y\"},\"past\":{\"other\":\"-{0} y\"}}},\"month\":{\"displayName\":\"Month\",\"relative\":{\"0\":\"this month\",\"1\":\"next month\",\"-1\":\"last month\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} m\"},\"past\":{\"other\":\"-{0} m\"}}},\"day\":{\"displayName\":\"Day\",\"relative\":{\"0\":\"today\",\"1\":\"tomorrow\",\"-1\":\"yesterday\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} d\"},\"past\":{\"other\":\"-{0} d\"}}},\"hour\":{\"displayName\":\"Hour\",\"relativeTime\":{\"future\":{\"other\":\"+{0} h\"},\"past\":{\"other\":\"-{0} h\"}}},\"minute\":{\"displayName\":\"Minute\",\"relativeTime\":{\"future\":{\"other\":\"+{0} min\"},\"past\":{\"other\":\"-{0} min\"}}},\"second\":{\"displayName\":\"Second\",\"relative\":{\"0\":\"now\"},\"relativeTime\":{\"future\":{\"other\":\"+{0} s\"},\"past\":{\"other\":\"-{0} s\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pl\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return n==1&&v0?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i!=1&&(i10==0||i10==1)||v0&&(i10>=5&&i10<=9)||v0&&(i100>=12&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"rok\",\"relative\":{\"0\":\"w tym roku\",\"1\":\"w przyszłym roku\",\"-1\":\"w zeszłym roku\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} rok\",\"few\":\"za {0} lata\",\"many\":\"za {0} lat\",\"other\":\"za {0} roku\"},\"past\":{\"one\":\"{0} rok temu\",\"few\":\"{0} lata temu\",\"many\":\"{0} lat temu\",\"other\":\"{0} roku temu\"}}},\"month\":{\"displayName\":\"miesiąc\",\"relative\":{\"0\":\"w tym miesiącu\",\"1\":\"w przyszłym miesiącu\",\"-1\":\"w zeszłym miesiącu\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} miesiąc\",\"few\":\"za {0} miesiące\",\"many\":\"za {0} miesięcy\",\"other\":\"za {0} miesiąca\"},\"past\":{\"one\":\"{0} miesiąc temu\",\"few\":\"{0} miesiące temu\",\"many\":\"{0} miesięcy temu\",\"other\":\"{0} miesiąca temu\"}}},\"day\":{\"displayName\":\"dzień\",\"relative\":{\"0\":\"dzisiaj\",\"1\":\"jutro\",\"2\":\"pojutrze\",\"-2\":\"przedwczoraj\",\"-1\":\"wczoraj\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} dzień\",\"few\":\"za {0} dni\",\"many\":\"za {0} dni\",\"other\":\"za {0} dnia\"},\"past\":{\"one\":\"{0} dzień temu\",\"few\":\"{0} dni temu\",\"many\":\"{0} dni temu\",\"other\":\"{0} dnia temu\"}}},\"hour\":{\"displayName\":\"godzina\",\"relativeTime\":{\"future\":{\"one\":\"za {0} godzinę\",\"few\":\"za {0} godziny\",\"many\":\"za {0} godzin\",\"other\":\"za {0} godziny\"},\"past\":{\"one\":\"{0} godzinę temu\",\"few\":\"{0} godziny temu\",\"many\":\"{0} godzin temu\",\"other\":\"{0} godziny temu\"}}},\"minute\":{\"displayName\":\"minuta\",\"relativeTime\":{\"future\":{\"one\":\"za {0} minutę\",\"few\":\"za {0} minuty\",\"many\":\"za {0} minut\",\"other\":\"za {0} minuty\"},\"past\":{\"one\":\"{0} minutę temu\",\"few\":\"{0} minuty temu\",\"many\":\"{0} minut temu\",\"other\":\"{0} minuty temu\"}}},\"second\":{\"displayName\":\"sekunda\",\"relative\":{\"0\":\"teraz\"},\"relativeTime\":{\"future\":{\"one\":\"za {0} sekundę\",\"few\":\"za {0} sekundy\",\"many\":\"za {0} sekund\",\"other\":\"za {0} sekundy\"},\"past\":{\"one\":\"{0} sekundę temu\",\"few\":\"{0} sekundy temu\",\"many\":\"{0} sekund temu\",\"other\":\"{0} sekundy temu\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"pt-br\",\"parentLocale\":\"pt\"},{\"locale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),t0=Number(s[0])==n;if(ord)return\"other\";return t0&&n>=0&&n<=2&&n!=2?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} ano\",\"other\":\"em {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} mês\",\"other\":\"em {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} dia\",\"other\":\"em {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"em {0} hora\",\"other\":\"em {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"em {0} minuto\",\"other\":\"em {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"em {0} segundo\",\"other\":\"em {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}},{\"locale\":\"pt-PT\",\"parentLocale\":\"pt\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1];if(ord)return\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"ano\",\"relative\":{\"0\":\"este ano\",\"1\":\"próximo ano\",\"-1\":\"ano passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} ano\",\"other\":\"dentro de {0} anos\"},\"past\":{\"one\":\"há {0} ano\",\"other\":\"há {0} anos\"}}},\"month\":{\"displayName\":\"mês\",\"relative\":{\"0\":\"este mês\",\"1\":\"próximo mês\",\"-1\":\"mês passado\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} mês\",\"other\":\"dentro de {0} meses\"},\"past\":{\"one\":\"há {0} mês\",\"other\":\"há {0} meses\"}}},\"day\":{\"displayName\":\"dia\",\"relative\":{\"0\":\"hoje\",\"1\":\"amanhã\",\"2\":\"depois de amanhã\",\"-2\":\"anteontem\",\"-1\":\"ontem\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} dia\",\"other\":\"dentro de {0} dias\"},\"past\":{\"one\":\"há {0} dia\",\"other\":\"há {0} dias\"}}},\"hour\":{\"displayName\":\"hora\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} hora\",\"other\":\"dentro de {0} horas\"},\"past\":{\"one\":\"há {0} hora\",\"other\":\"há {0} horas\"}}},\"minute\":{\"displayName\":\"minuto\",\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} minuto\",\"other\":\"dentro de {0} minutos\"},\"past\":{\"one\":\"há {0} minuto\",\"other\":\"há {0} minutos\"}}},\"second\":{\"displayName\":\"segundo\",\"relative\":{\"0\":\"agora\"},\"relativeTime\":{\"future\":{\"one\":\"dentro de {0} segundo\",\"other\":\"dentro de {0} segundos\"},\"past\":{\"one\":\"há {0} segundo\",\"other\":\"há {0} segundos\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"ru\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],i10=i.slice(-1),i100=i.slice(-2);if(ord)return\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"год\",\"relative\":{\"0\":\"в этом году\",\"1\":\"в следующем году\",\"-1\":\"в прошлом году\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} год\",\"few\":\"через {0} года\",\"many\":\"через {0} лет\",\"other\":\"через {0} года\"},\"past\":{\"one\":\"{0} год назад\",\"few\":\"{0} года назад\",\"many\":\"{0} лет назад\",\"other\":\"{0} года назад\"}}},\"month\":{\"displayName\":\"месяц\",\"relative\":{\"0\":\"в этом месяце\",\"1\":\"в следующем месяце\",\"-1\":\"в прошлом месяце\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} месяц\",\"few\":\"через {0} месяца\",\"many\":\"через {0} месяцев\",\"other\":\"через {0} месяца\"},\"past\":{\"one\":\"{0} месяц назад\",\"few\":\"{0} месяца назад\",\"many\":\"{0} месяцев назад\",\"other\":\"{0} месяца назад\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сегодня\",\"1\":\"завтра\",\"2\":\"послезавтра\",\"-2\":\"позавчера\",\"-1\":\"вчера\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дня\",\"many\":\"через {0} дней\",\"other\":\"через {0} дней\"},\"past\":{\"one\":\"{0} день назад\",\"few\":\"{0} дня назад\",\"many\":\"{0} дней назад\",\"other\":\"{0} дня назад\"}}},\"hour\":{\"displayName\":\"час\",\"relativeTime\":{\"future\":{\"one\":\"через {0} час\",\"few\":\"через {0} часа\",\"many\":\"через {0} часов\",\"other\":\"через {0} часа\"},\"past\":{\"one\":\"{0} час назад\",\"few\":\"{0} часа назад\",\"many\":\"{0} часов назад\",\"other\":\"{0} часа назад\"}}},\"minute\":{\"displayName\":\"минута\",\"relativeTime\":{\"future\":{\"one\":\"через {0} минуту\",\"few\":\"через {0} минуты\",\"many\":\"через {0} минут\",\"other\":\"через {0} минуты\"},\"past\":{\"one\":\"{0} минуту назад\",\"few\":\"{0} минуты назад\",\"many\":\"{0} минут назад\",\"other\":\"{0} минуты назад\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"сейчас\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунды\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунды\"},\"past\":{\"one\":\"{0} секунду назад\",\"few\":\"{0} секунды назад\",\"many\":\"{0} секунд назад\",\"other\":\"{0} секунды назад\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"sv\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return(n10==1||n10==2)&&n100!=11&&n100!=12?\"one\":\"other\";return n==1&&v0?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"år\",\"relative\":{\"0\":\"i år\",\"1\":\"nästa år\",\"-1\":\"i fjol\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} år\",\"other\":\"om {0} år\"},\"past\":{\"one\":\"för {0} år sedan\",\"other\":\"för {0} år sedan\"}}},\"month\":{\"displayName\":\"månad\",\"relative\":{\"0\":\"denna månad\",\"1\":\"nästa månad\",\"-1\":\"förra månaden\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} månad\",\"other\":\"om {0} månader\"},\"past\":{\"one\":\"för {0} månad sedan\",\"other\":\"för {0} månader sedan\"}}},\"day\":{\"displayName\":\"dag\",\"relative\":{\"0\":\"i dag\",\"1\":\"i morgon\",\"2\":\"i övermorgon\",\"-2\":\"i förrgår\",\"-1\":\"i går\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} dag\",\"other\":\"om {0} dagar\"},\"past\":{\"one\":\"för {0} dag sedan\",\"other\":\"för {0} dagar sedan\"}}},\"hour\":{\"displayName\":\"timme\",\"relativeTime\":{\"future\":{\"one\":\"om {0} timme\",\"other\":\"om {0} timmar\"},\"past\":{\"one\":\"för {0} timme sedan\",\"other\":\"för {0} timmar sedan\"}}},\"minute\":{\"displayName\":\"minut\",\"relativeTime\":{\"future\":{\"one\":\"om {0} minut\",\"other\":\"om {0} minuter\"},\"past\":{\"one\":\"för {0} minut sedan\",\"other\":\"för {0} minuter sedan\"}}},\"second\":{\"displayName\":\"sekund\",\"relative\":{\"0\":\"nu\"},\"relativeTime\":{\"future\":{\"one\":\"om {0} sekund\",\"other\":\"om {0} sekunder\"},\"past\":{\"one\":\"för {0} sekund sedan\",\"other\":\"för {0} sekunder sedan\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"th\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"ปี\",\"relative\":{\"0\":\"ปีนี้\",\"1\":\"ปีหน้า\",\"-1\":\"ปีที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ปี\"},\"past\":{\"other\":\"{0} ปีที่แล้ว\"}}},\"month\":{\"displayName\":\"เดือน\",\"relative\":{\"0\":\"เดือนนี้\",\"1\":\"เดือนหน้า\",\"-1\":\"เดือนที่แล้ว\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} เดือน\"},\"past\":{\"other\":\"{0} เดือนที่ผ่านมา\"}}},\"day\":{\"displayName\":\"วัน\",\"relative\":{\"0\":\"วันนี้\",\"1\":\"พรุ่งนี้\",\"2\":\"มะรืนนี้\",\"-2\":\"เมื่อวานซืน\",\"-1\":\"เมื่อวาน\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วัน\"},\"past\":{\"other\":\"{0} วันที่ผ่านมา\"}}},\"hour\":{\"displayName\":\"ชั่วโมง\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} ชั่วโมง\"},\"past\":{\"other\":\"{0} ชั่วโมงที่ผ่านมา\"}}},\"minute\":{\"displayName\":\"นาที\",\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} นาที\"},\"past\":{\"other\":\"{0} นาทีที่ผ่านมา\"}}},\"second\":{\"displayName\":\"วินาที\",\"relative\":{\"0\":\"ขณะนี้\"},\"relativeTime\":{\"future\":{\"other\":\"ในอีก {0} วินาที\"},\"past\":{\"other\":\"{0} วินาทีที่ผ่านมา\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"tr\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return n==1?\"one\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"Yıl\",\"relative\":{\"0\":\"bu yıl\",\"1\":\"gelecek yıl\",\"-1\":\"geçen yıl\"},\"relativeTime\":{\"future\":{\"one\":\"{0} yıl sonra\",\"other\":\"{0} yıl sonra\"},\"past\":{\"one\":\"{0} yıl önce\",\"other\":\"{0} yıl önce\"}}},\"month\":{\"displayName\":\"Ay\",\"relative\":{\"0\":\"bu ay\",\"1\":\"gelecek ay\",\"-1\":\"geçen ay\"},\"relativeTime\":{\"future\":{\"one\":\"{0} ay sonra\",\"other\":\"{0} ay sonra\"},\"past\":{\"one\":\"{0} ay önce\",\"other\":\"{0} ay önce\"}}},\"day\":{\"displayName\":\"Gün\",\"relative\":{\"0\":\"bugün\",\"1\":\"yarın\",\"2\":\"öbür gün\",\"-2\":\"evvelsi gün\",\"-1\":\"dün\"},\"relativeTime\":{\"future\":{\"one\":\"{0} gün sonra\",\"other\":\"{0} gün sonra\"},\"past\":{\"one\":\"{0} gün önce\",\"other\":\"{0} gün önce\"}}},\"hour\":{\"displayName\":\"Saat\",\"relativeTime\":{\"future\":{\"one\":\"{0} saat sonra\",\"other\":\"{0} saat sonra\"},\"past\":{\"one\":\"{0} saat önce\",\"other\":\"{0} saat önce\"}}},\"minute\":{\"displayName\":\"Dakika\",\"relativeTime\":{\"future\":{\"one\":\"{0} dakika sonra\",\"other\":\"{0} dakika sonra\"},\"past\":{\"one\":\"{0} dakika önce\",\"other\":\"{0} dakika önce\"}}},\"second\":{\"displayName\":\"Saniye\",\"relative\":{\"0\":\"şimdi\"},\"relativeTime\":{\"future\":{\"one\":\"{0} saniye sonra\",\"other\":\"{0} saniye sonra\"},\"past\":{\"one\":\"{0} saniye önce\",\"other\":\"{0} saniye önce\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"uk\",\"pluralRuleFunction\":function(n,ord){var s=String(n).split(\".\"),i=s[0],v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2),i10=i.slice(-1),i100=i.slice(-2);if(ord)return n10==3&&n100!=13?\"few\":\"other\";return v0&&i10==1&&i100!=11?\"one\":v0&&(i10>=2&&i10<=4)&&(i100<12||i100>14)?\"few\":v0&&i10==0||v0&&(i10>=5&&i10<=9)||v0&&(i100>=11&&i100<=14)?\"many\":\"other\"},\"fields\":{\"year\":{\"displayName\":\"рік\",\"relative\":{\"0\":\"цього року\",\"1\":\"наступного року\",\"-1\":\"торік\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} рік\",\"few\":\"через {0} роки\",\"many\":\"через {0} років\",\"other\":\"через {0} року\"},\"past\":{\"one\":\"{0} рік тому\",\"few\":\"{0} роки тому\",\"many\":\"{0} років тому\",\"other\":\"{0} року тому\"}}},\"month\":{\"displayName\":\"місяць\",\"relative\":{\"0\":\"цього місяця\",\"1\":\"наступного місяця\",\"-1\":\"минулого місяця\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} місяць\",\"few\":\"через {0} місяці\",\"many\":\"через {0} місяців\",\"other\":\"через {0} місяця\"},\"past\":{\"one\":\"{0} місяць тому\",\"few\":\"{0} місяці тому\",\"many\":\"{0} місяців тому\",\"other\":\"{0} місяця тому\"}}},\"day\":{\"displayName\":\"день\",\"relative\":{\"0\":\"сьогодні\",\"1\":\"завтра\",\"2\":\"післязавтра\",\"-2\":\"позавчора\",\"-1\":\"учора\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} день\",\"few\":\"через {0} дні\",\"many\":\"через {0} днів\",\"other\":\"через {0} дня\"},\"past\":{\"one\":\"{0} день тому\",\"few\":\"{0} дні тому\",\"many\":\"{0} днів тому\",\"other\":\"{0} дня тому\"}}},\"hour\":{\"displayName\":\"година\",\"relativeTime\":{\"future\":{\"one\":\"через {0} годину\",\"few\":\"через {0} години\",\"many\":\"через {0} годин\",\"other\":\"через {0} години\"},\"past\":{\"one\":\"{0} годину тому\",\"few\":\"{0} години тому\",\"many\":\"{0} годин тому\",\"other\":\"{0} години тому\"}}},\"minute\":{\"displayName\":\"хвилина\",\"relativeTime\":{\"future\":{\"one\":\"через {0} хвилину\",\"few\":\"через {0} хвилини\",\"many\":\"через {0} хвилин\",\"other\":\"через {0} хвилини\"},\"past\":{\"one\":\"{0} хвилину тому\",\"few\":\"{0} хвилини тому\",\"many\":\"{0} хвилин тому\",\"other\":\"{0} хвилини тому\"}}},\"second\":{\"displayName\":\"секунда\",\"relative\":{\"0\":\"зараз\"},\"relativeTime\":{\"future\":{\"one\":\"через {0} секунду\",\"few\":\"через {0} секунди\",\"many\":\"через {0} секунд\",\"other\":\"через {0} секунди\"},\"past\":{\"one\":\"{0} секунду тому\",\"few\":\"{0} секунди тому\",\"many\":\"{0} секунд тому\",\"other\":\"{0} секунди тому\"}}}}}];","/*jslint eqeq: true*/\nexport default [{\"locale\":\"zh-cn\",\"parentLocale\":\"zh\"},{\"locale\":\"zh\",\"pluralRuleFunction\":function(n,ord){if(ord)return\"other\";return\"other\"},\"fields\":{\"year\":{\"displayName\":\"年\",\"relative\":{\"0\":\"今年\",\"1\":\"明年\",\"-1\":\"去年\"},\"relativeTime\":{\"future\":{\"other\":\"{0}年后\"},\"past\":{\"other\":\"{0}年前\"}}},\"month\":{\"displayName\":\"月\",\"relative\":{\"0\":\"本月\",\"1\":\"下个月\",\"-1\":\"上个月\"},\"relativeTime\":{\"future\":{\"other\":\"{0}个月后\"},\"past\":{\"other\":\"{0}个月前\"}}},\"day\":{\"displayName\":\"日\",\"relative\":{\"0\":\"今天\",\"1\":\"明天\",\"2\":\"后天\",\"-2\":\"前天\",\"-1\":\"昨天\"},\"relativeTime\":{\"future\":{\"other\":\"{0}天后\"},\"past\":{\"other\":\"{0}天前\"}}},\"hour\":{\"displayName\":\"小时\",\"relativeTime\":{\"future\":{\"other\":\"{0}小时后\"},\"past\":{\"other\":\"{0}小时前\"}}},\"minute\":{\"displayName\":\"分钟\",\"relativeTime\":{\"future\":{\"other\":\"{0}分钟后\"},\"past\":{\"other\":\"{0}分钟前\"}}},\"second\":{\"displayName\":\"秒钟\",\"relative\":{\"0\":\"现在\"},\"relativeTime\":{\"future\":{\"other\":\"{0}秒钟后\"},\"past\":{\"other\":\"{0}秒钟前\"}}}}},{\"locale\":\"zh-tw\",\"parentLocale\":\"zh\"}];","define(\"connections-ui/components/accessible-checkbox/component\", [\"exports\", \"ember-purecloud-components/components/accessible-checkbox/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { on, inject, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['admin-ui-modal'],\n\n    application: inject.service(),\n    session: inject.service(),\n    notification: inject.service(),\n\n    src: '',\n    name: 'admin-ui-modal',\n\n    sendClose() {\n        this.sendAction('closeAdminModal');\n    },\n\n    toast(data) {\n        let notificationType = 'info';\n        if (data.type === 'success' || data.type === 'error') {\n            notificationType = data.type;\n        }\n\n        this.get('notification')[notificationType](\n            data.title,\n            data.message,\n            Object.assign(\n                {},\n                {\n                    markdownToHtml: false,\n                    shouldShowPopup: true,\n                    shouldPlaySound: false\n                },\n                data\n            )\n        );\n    },\n\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            if (!event) {\n                return;\n            }\n            try {\n                const sameHost = Ember.get(event, 'originalEvent.source.document.location.host') === location.host;\n                const sameName = Ember.get(event, 'originalEvent.source.name') === this.get('name');\n                if (!(sameHost & sameName)) {\n                    return;\n                }\n                const message = Ember.get(event, 'originalEvent.data');\n                if (message.type === 'modal:close') {\n                    this.sendClose();\n                } else if (message.type === 'content:route:changed') {\n                    if (!message.data.hash.match(/^\\/directory\\/people\\/(add|import|link)/)) {\n                        const hash = `#/admin${message.data.hash}`;\n                        location.hash = hash;\n                    }\n                } else if (message.type === 'toast') {\n                    this.toast(message.data);\n                }\n            } catch (error) {\n                if (error && error.name === 'SecurityError') {\n                    return;\n                }\n                this.logger.error('error handling frame message', {\n                    error\n                });\n            }\n        });\n    },\n\n    startMessageListener: on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, this.handleMessageEvent.bind(this));\n    }),\n\n    stopMessageListener: on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"lfPaatln\",\"block\":\"{\\\"statements\\\":[[11,\\\"iframe\\\",[]],[16,\\\"title\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"name\\\",[34,[[26,[\\\"name\\\"]]]]],[16,\\\"src\\\",[34,[[26,[\\\"src\\\"]]]]],[15,\\\"role\\\",\\\"presentation\\\"],[15,\\\"seamless\\\",\\\"\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/admin-ui-modal/template.hbs\"}});","define(\"connections-ui/components/alert-message/component\", [\"exports\", \"ember-purecloud-components/components/alert-message/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: 'analog-clock',\n    classNameBindings: ['_analogSupported:analog-supported:analog-unsupported', '_invalidTime:invalid-time'],\n    attributeBindings: ['_currTimeLabel:title', '_currTimeLabel:aria-label'],\n\n    intl: inject.service(),\n\n    // Attrs\n    utcOffset: null,\n    staticMoment: null,\n    showSecondHand: true,\n    autoIncrement: true,\n\n    _analogSupported: Modernizr.csstransforms,\n    _displayedMoment: null,\n    _invalidTime: computed.not('_displayedMoment'),\n    _currTimeLabel: null,\n    _pendingTick: null,\n\n    willRender() {\n        this._cancelTimers();\n\n        let time = moment(this.get('staticMoment') || undefined);\n        let formatStr = 'LTS';\n        let invalid = false;\n\n        try {\n            if (this.get('utcOffset')) {\n                time.utcOffset(this.get('utcOffset'));\n                formatStr += ' Z';\n            }\n        } catch (e) {\n            invalid = true;\n        }\n\n        if (invalid || isNaN(time) || !time.isValid()) {\n            this.set('_displayedMoment', null);\n            this.set('_currTimeLabel', this.get('intl').t('components.analogClock.invalidTime'));\n        } else {\n            this.set('_displayedMoment', time);\n            this.set('_currTimeLabel', time.format(formatStr));\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._cancelTimers();\n        this._super(...arguments);\n    },\n\n    didRender() {\n        this._super(...arguments);\n\n        let time = this.get('_displayedMoment');\n\n        if (time && this.get('_analogSupported')) {\n            const hourElement = this.$('.hour-hand')[0];\n            const minuteElement = this.$('.minute-hand')[0];\n\n            let hour = time.hour(),\n                minute = time.minute(),\n                second = time.second(),\n                secondAngle = second * 6,\n                minuteAngle = minute * 6 + secondAngle / 60,\n                hourAngle = ((hour % 12) / 12) * 360 + 90 + minute / 12,\n                hourRule = `rotate(${hourAngle}deg)`,\n                minuteRule = `rotate(${minuteAngle}deg)`,\n                secondRule = `rotate(${secondAngle}deg)`;\n\n            hourElement.style.transform = hourRule;\n            minuteElement.style.transform = minuteRule;\n            if (this.get('showSecondHand')) {\n                const secondElement = this.$('.second-hand')[0];\n                secondElement.style.transform = secondRule;\n            }\n        }\n\n        if (!this.get('staticMoment') && this.get('autoIncrement') && !this.get('_invalidTime')) {\n            this.set(\n                '_pendingTick',\n                Ember.run.later(\n                    this,\n                    () => {\n                        this.rerender();\n                    },\n                    1000\n                )\n            );\n        }\n    },\n\n    _cancelTimers() {\n        ['_pendingTick'].forEach(timerName => {\n            let currTimer = this.get(timerName);\n            if (currTimer) {\n                Ember.run.cancel(currTimer);\n                this.set(timerName, null);\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"jPusaeLb\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"_analogSupported\\\"]],[33,[\\\"not\\\"],[[28,[\\\"_invalidTime\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clock-face\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hour-hand\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"minute-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSecondHand\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"second-hand\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"_currTimeLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/analog-clock/template.hbs\"}});","import Ember from 'ember';\nimport { isValidEmailAddress } from 'ember-purecloud-components/utils/email';\n\nvar AnchorTagComponent = Ember.Component.extend({\n    tagName: 'span',\n\n    intl: Ember.inject.service(),\n\n    httpRegex: /(http|https):\\/\\/(?:www\\.)?(.*)/i,\n\n    // Anchor tag text body: <a>{{label}}</a>\n    label: null,\n\n    //href components: <a href=\"{{protocol & value}}\">{{label}}</a>\n    value: null, //email address, phone number, URL\n    protocol: null, //protocol of the href in the case of mailto, tel, sms, etc.\n\n    title: null,\n    target: '_blank',\n\n    ariaLabelledBy: null,\n\n    init: function () {\n        this._super();\n\n        this.decorateLabel();\n    },\n\n    text: Ember.computed('value', 'label', function () {\n        var label = this.get('label');\n        if (label) {\n            return label;\n        }\n\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        // If the value already has a protocol for http, gods be good lets not waste space showing it.\n        if (value && value.match(this.get('httpRegex'))) {\n            value = value.replace(this.get('httpRegex'), '$2');\n        }\n\n        if (protocol === 'map') {\n            value = Ember.String.htmlSafe(Ember.Handlebars.Utils.escapeExpression(value).replace(/\\n/g, '<br />'));\n        }\n\n        return value;\n    }),\n\n    anchor: Ember.computed('value', 'protocol', function () {\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        if (protocol === 'map' && value) {\n            this.set('target', '_new');\n            return 'https://maps.google.com/?q=' + window.encodeURIComponent(value);\n        }\n\n        //mailto:, tel:, sms:\n        if (protocol && value) {\n            return `${protocol}:${value}`;\n        }\n\n        if (value && value.match(this.get('httpRegex'))) {\n            return value;\n        }\n        // No protocol assumes plain http:// unless the value already has it set.\n        return `http://${value}`;\n    }),\n\n    decorateLabel: Ember.observer('value', function () {\n        var value = this.get('value'),\n            protocol = this.get('protocol');\n\n        if (protocol === 'mailto' && value) {\n            this.set('target', null);\n\n            // TODO: [Glimmer] fix this value issue\n            value = value.toString();\n\n            if (!isValidEmailAddress(value)) {\n                return this.set('label', this.get('intl').t('purecloud.acdInteraction.relate.validation.invalidEmail'));\n            }\n\n            this.set('label', value);\n        }\n    })\n});\n\nexport default AnchorTagComponent;\n","export default Ember.HTMLBars.template({\"id\":\"cDg6eSfO\",\"block\":\"{\\\"statements\\\":[[11,\\\"a\\\",[]],[16,\\\"href\\\",[26,[\\\"anchor\\\"]],null],[16,\\\"title\\\",[26,[\\\"title\\\"]],null],[16,\\\"target\\\",[26,[\\\"target\\\"]],null],[16,\\\"aria-labelledby\\\",[26,[\\\"ariaLabelledBy\\\"]],null],[13],[1,[26,[\\\"text\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/anchor-tag/template.hbs\"}});","/* globals Modernizr */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Component, computed, get } = Ember;\n\nconst DEFAULT_IMG_TYPE = 'icon';\n\n// Possible Future Types: smallIcon (16x16), notificationIcon, launcherIcon, splashIcon (512x512)\nconst IMG_TYPE_CFG_MAP = {\n    icon: {\n        width: 24,\n        height: 24,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    },\n    tile: {\n        width: 128,\n        height: 128,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    }\n};\n\nconst VECTOR_IMG_PROP_NAME = 'vector';\nconst RASTER_IMGS_PROP_NAME = 'raster';\nconst RASTER_IMG_KEY_REG_EXP = /^x(\\d+)$/i;\nconst CLASS_NAMES_PROP_NAME = 'classNames';\nconst SVG_PATH_PROP_NAME = 'svgSpriteHref';\nconst GUX_ICON_PROPS_PATH = 'guxIcon';\n\nconst NO_TITLE_MODE = 'none';\nconst NATIVE_TITLE_MODE = 'native';\nconst TOOLTIP_TITLE_MODE = 'tooltip';\nconst DEFAULT_TITLE_MODE = TOOLTIP_TITLE_MODE;\nconst TITLE_MODES = [NO_TITLE_MODE, NATIVE_TITLE_MODE, TOOLTIP_TITLE_MODE];\n\n/**\n * Generates the image markup for the specified app that is best suited\n * for the specified imgType.  imgType dictates the target environment for\n * the image display while the app's assets contain the dictionary of\n * image categories (icon, launcher, splash, etc.) and sizes (x16, x24, x512, etc.)\n *\n * In general, this algorithm is:\n * <ul>\n *   <li>Utilize the app assets appropriate for the imgType<li>\n *   <li>Use vector (svg) if in config and supported by browser</li>\n *   <li>Use exact or closest (within threshold) sized raster img for src</li>\n *   <li>\n *      Add any supplimental urls (with multiplier > 1 and within threshold)\n *      to srcset attribute if supported by browser\n *   <li>\n *   <li>If no applicable image can be found, use classNames</li>\n *   <li>If no classNames are configured, use the no-img placeholder</li>\n * </ul>\n */\nexport default Component.extend({\n    tagName: 'div',\n    classNames: ['app-img'],\n    classNameBindings: ['imgType'],\n    attributeBindings: ['title'],\n\n    app: null,\n\n    titleMode: computed({\n        get: () => DEFAULT_TITLE_MODE,\n        set(key, value) {\n            if (TITLE_MODES.indexOf(value) < 0) {\n                Ember.assert(`app-img Invalid titleMode: ${value}`);\n            }\n\n            return value;\n        }\n    }),\n\n    showTooltip: computed.equal('titleMode', TOOLTIP_TITLE_MODE),\n\n    title: computed('titleMode', 'app.name', function () {\n        let result = '';\n\n        const appName = this.get('app.name');\n        const titleMode = this.get('titleMode');\n\n        if (appName && appName.trim().length > 0 && titleMode === NATIVE_TITLE_MODE) {\n            result = appName;\n        }\n\n        return result;\n    }),\n\n    imgType: computed({\n        get: () => DEFAULT_IMG_TYPE,\n        set(key, value) {\n            if (Object.prototype.hasOwnProperty.call(IMG_TYPE_CFG_MAP, value)) {\n                return value;\n            } else {\n                Ember.assert(`Invalid app-img type ${value}`);\n            }\n        }\n    }),\n\n    imgWidth: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].width;\n    }),\n\n    imgHeight: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.get('imgType')].height;\n    }),\n\n    _sortedRasterMultipliers: computed('app', 'imgType', function () {\n        let result = [];\n\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasterImgs = get(this, `app.${cfg.assetBasePath}.${RASTER_IMGS_PROP_NAME}`);\n\n        if (allRasterImgs && typeof allRasterImgs === 'object') {\n            _.forEach(allRasterImgs, (rasterUrl, rasterKey) => {\n                let rasterMatch = RASTER_IMG_KEY_REG_EXP.exec(rasterKey);\n                if (rasterMatch) {\n                    let currRasterWidth = parseInt(rasterMatch[1], 10);\n                    if (currRasterWidth && currRasterWidth > 0) {\n                        let currRasterMultiplier = currRasterWidth / cfg.width;\n\n                        result.push({\n                            url: rasterUrl,\n                            multiplier: currRasterMultiplier\n                        });\n                    }\n                }\n            });\n        }\n\n        return result.sort((a, b) => a.multiplier - b.multiplier);\n    }),\n\n    /**\n     * Returns the vectorImgUrl if one exists in the app config\n     * and if vector images are supported as img src in the current\n     * environment\n     */\n    _vectorImgUrl: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        if (app && Modernizr.svgasimg) {\n            result = Ember.get(app, `${cfg.assetBasePath}.${VECTOR_IMG_PROP_NAME}`) || null;\n        }\n\n        return result;\n    }),\n\n    defaultImgUrl: computed('imgType', '_vectorImgUrl', '_sortedRasterMultipliers', function () {\n        let vectorImgUrl = this.get('_vectorImgUrl');\n        if (vectorImgUrl) {\n            return vectorImgUrl;\n        }\n\n        let result = null;\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n\n        let allRasters = this.get('_sortedRasterMultipliers');\n        if (allRasters.length > 0) {\n            let lowestDelta = null;\n\n            for (let index = 0; index < allRasters.length; index++) {\n                let curr = allRasters[index];\n                let currDelta = Math.abs(1 - curr.multiplier);\n\n                if (lowestDelta === null || currDelta < lowestDelta) {\n                    lowestDelta = currDelta;\n                    result = curr.url;\n                }\n            }\n\n            // Ensure the best size default img is within the threshold\n            if (cfg.closestSizeMaxMultiplierDelta && lowestDelta > cfg.closestSizeMaxMultiplierDelta) {\n                result = null;\n            }\n        }\n\n        return result;\n    }),\n\n    imgSrcSet: computed('imgType', '_vectorImgUrl', 'defaultImgUrl', '_sortedRasterMultipliers', function () {\n        let result = '';\n\n        let vectorImgUrl = this.get('_vectorImgUrl');\n        let defaultImgUrl = this.get('defaultImgUrl');\n        let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n        let allRasters = this.get('_sortedRasterMultipliers');\n\n        if (Modernizr.srcset && !vectorImgUrl && defaultImgUrl && allRasters.length > 0) {\n            let supImgs = [];\n\n            allRasters.forEach(({ url, multiplier }) => {\n                if (\n                    url !== defaultImgUrl &&\n                    multiplier > 1 &&\n                    (!cfg.minSupplimentalRes || multiplier >= cfg.minSupplimentalRes) &&\n                    (!cfg.maxSupplimentalRes || multiplier <= cfg.maxSupplimentalRes)\n                ) {\n                    supImgs.push({\n                        url,\n                        multiplier\n                    });\n                }\n            });\n\n            if (supImgs.length > 0) {\n                // Sort the images by descending multiplier so the best one is choosen\n                supImgs.reverse();\n                result = supImgs.map(curr => `${curr.url} ${curr.multiplier}x`).join(',');\n            }\n        }\n\n        return result;\n    }),\n\n    svgSpriteHref: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let svgPropPath = `${cfg.assetBasePath}.${SVG_PATH_PROP_NAME}`;\n\n            let svgSpriteHref = app.get(svgPropPath);\n            if (svgSpriteHref) {\n                result = svgSpriteHref;\n            }\n        }\n\n        return result;\n    }),\n\n    imgClasses: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let classesPath = `${cfg.assetBasePath}.${CLASS_NAMES_PROP_NAME}`;\n\n            let classNames = app.get(classesPath);\n            if (classNames && Ember.isArray(classNames)) {\n                result = classNames.join(' ');\n            }\n        }\n\n        return result;\n    }),\n\n    guxIcon: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.get('app');\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.get('imgType')];\n            let guxIconPropsPath = `${cfg.assetBasePath}.${GUX_ICON_PROPS_PATH}`;\n\n            let guxIconProps = app.get(guxIconPropsPath);\n            if (\n                guxIconProps &&\n                Object.prototype.hasOwnProperty.call(guxIconProps, 'name') &&\n                guxIconProps.hasOwnProperty('decorative')\n            ) {\n                result = guxIconProps;\n            }\n        }\n\n        return result;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"jh1kqPQo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"defaultImgUrl\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"src\\\",[34,[[26,[\\\"defaultImgUrl\\\"]]]]],[16,\\\"srcset\\\",[34,[[26,[\\\"imgSrcSet\\\"]]]]],[16,\\\"alt\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[16,\\\"width\\\",[34,[[26,[\\\"imgWidth\\\"]]]]],[16,\\\"height\\\",[34,[[26,[\\\"imgHeight\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"imgClasses\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"imgClasses\\\"]]]]],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"svgSpriteHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"svg\\\",[]],[15,\\\"class\\\",\\\"svg-icon\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"use\\\",[]],[16,\\\"href\\\",[26,[\\\"svgSpriteHref\\\"]],null],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"guxIcon\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"icon-name\\\",[28,[\\\"guxIcon\\\",\\\"name\\\"]],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-external-apps-unknown\\\"],[16,\\\"aria-label\\\",[34,[[28,[\\\"app\\\",\\\"name\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showTooltip\\\"]],[28,[\\\"app\\\",\\\"name\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"targetOffset\\\"],[\\\"-10px 0\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[28,[\\\"app\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/app-img/template.hbs\"}});","define(\"connections-ui/components/audio-player-v2/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/participant/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/participant/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/timeline/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/timeline/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/audio-player-v2/waveform-graph/component\", [\"exports\", \"ember-purecloud-components/components/audio-player-v2/waveform-graph/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Howler from 'howler-but-with-updates';\n\nconst Howl = Howler.Howl;\n\nconst { get, inject, computed, observer, RSVP, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-player-v2'],\n\n    clock: inject.service(),\n    logger: inject.service('stash-logger'),\n    webrtc: inject.service(),\n    phone: inject.service(),\n\n    attrs: {\n        source: null,\n        options: {},\n        markAsRead: () => {},\n        onError: () => {}\n    },\n\n    playing: false,\n    didEnd: false,\n    loading: false,\n    loadingError: false,\n    registerStopVoicemailHandler: null,\n    sound: null,\n\n    playFromSelectedOutput: computed.reads('webrtc.session.features.playRecordingFromSelectedOutput'),\n\n    playbackVolume: computed('phone.callVolume', function () {\n        const callVolume = this.get('phone.callVolume');\n        const decimalValue = callVolume / 100;\n        return decimalValue;\n    }),\n\n    selectedOutputDevice: computed('webrtc.defaultOutputDevice', function () {\n        let deviceId;\n        let defaultOutputDevice = this.get('webrtc.defaultOutputDevice');\n        if (defaultOutputDevice) {\n            deviceId = defaultOutputDevice.get('deviceId');\n        }\n\n        return deviceId;\n    }),\n\n    outputDeviceUpdate: observer('webrtc.defaultOutputDevice', function () {\n        if (!this.get('sound') || !this.get('playFromSelectedOutput')) {\n            return;\n        }\n\n        let restartSound = false;\n        if (this.get('playing')) {\n            this.stopPlaying();\n            restartSound = true;\n        }\n\n        const newOutputDeviceId = this.get('selectedOutputDevice');\n        this.sound.setOutputDevice(newOutputDeviceId);\n\n        if (restartSound) {\n            this.sound.play();\n        }\n    }),\n\n    actions: {\n        togglePlay() {\n            if (this.get('playFromSelectedOutput')) {\n                const outputDeviceId = this.get('webrtc.defaultOutputDevice.deviceId');\n                if (outputDeviceId) {\n                    this.sound.setOutputDevice(outputDeviceId);\n                }\n\n                this.sound.volume(this.get('playbackVolume'));\n            }\n\n            if (this.get('playing')) {\n                this.sound.pause();\n            } else {\n                if (this.get('didEnd')) {\n                    this.sound.seek(0);\n                }\n                this.sound.play();\n            }\n        },\n\n        seekSound(value) {\n            this.sound.seek(value);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        const registerHandler = this.get('registerStopVoicemailHandler');\n        if (registerHandler && typeof registerHandler === 'function') {\n            registerHandler(this.stopPlaying.bind(this));\n        }\n\n        this.setupSound();\n    },\n\n    willDestroyElement() {\n        if (this.sound) {\n            this.sound.off();\n            this.sound.pause();\n        }\n\n        this._super(...arguments);\n    },\n\n    setupSound() {\n        this.set('loading', true);\n\n        const paths = this.getAttr('source');\n        const promise = RSVP.resolve(paths);\n        promise\n            .then(sources => {\n                if (sources && !Array.isArray(sources)) {\n                    return [sources];\n                }\n                return null;\n            })\n            .then(sources => {\n                const useHtml5 = this.get('playFromSelectedOutput');\n\n                if (sources) {\n                    const options = this.get('howlOptions');\n                    options.src = sources;\n                    options.html5 = useHtml5;\n                    this.sound = new Howl(options);\n                } else {\n                    this.set('loading', false);\n                    this.set('loadingError', true);\n\n                    this.get('logger').warn('There were no audio sources passed into the audio-player');\n\n                    this.attrs.onError();\n                }\n            })\n            .catch(err => {\n                this.set('loading', false);\n                this.set('loadingError', true);\n\n                this.get('logger').error('There was an error loading recorded audio', err);\n\n                this.attrs.onError(err);\n            });\n    },\n\n    duration: computed('loading', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.duration() * 1000);\n    }),\n\n    currentTime: computed('clock.second', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.seek() * 1000);\n    }),\n\n    loadingAudio: computed(function () {\n        return false;\n    }),\n\n    howlOptions: computed('options', function () {\n        const defaultOptions = {\n            onload: this.onLoad.bind(this),\n            onplay: this.onPlay.bind(this),\n            onpause: this.onPause.bind(this),\n            onend: this.onEnd.bind(this)\n        };\n        return _.merge({}, defaultOptions, this.get('options'));\n    }),\n\n    onLoad() {\n        this.set('loading', false);\n\n        this._checkSoundDuration();\n    },\n\n    onPlay() {\n        this.set('playing', true);\n    },\n\n    onPause() {\n        this.set('playing', false);\n    },\n\n    onEnd() {\n        this.set('playing', false);\n        this.set('didEnd', true);\n        if (this.attrs.markAsRead) {\n            this.attrs.markAsRead();\n        }\n    },\n\n    stopPlaying() {\n        this.sound && this.sound.pause();\n    },\n\n    _checkSoundDuration() {\n        const sound = this.sound;\n        if (!sound) {\n            return;\n        }\n\n        const audio = get(sound, '_sounds.0._node');\n        if (audio && audio.duration === Infinity) {\n            // We are dealing with a recording here\n            // See: http://stackoverflow.com/a/39971175\n            audio.currentTime = 1e101;\n            audio.ontimeupdate = () => {\n                audio.ontimeupdate = () => {};\n                audio.currentTime = 0;\n                sound._duration = audio.duration;\n\n                this.notifyPropertyChange('duration');\n            };\n        } else {\n            this.notifyPropertyChange('duration');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['seek-bar', 'clickable'],\n\n    clock: inject.service(),\n\n    attrs: {\n        sound: null,\n        duration: null,\n        currentTime: null\n    },\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        this._super(...arguments);\n\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (newAttrs.currentTime.value !== oldAttrs.currentTime.value) {\n            const position = this.get('position');\n            let left = position * 100;\n            if (left > 100) {\n                left = 100;\n            }\n            Ember.run(() => {\n                this.$('.progress-bar').css('margin-left', `${left}%`);\n            });\n        }\n    },\n\n    click(event) {\n        const seek = event.offsetX / this.$().width();\n        const totalSeconds = this.getAttr('duration') / 1000;\n        this.sendAction('didSeek', seek * totalSeconds);\n    },\n\n    position: computed('sound', 'currentTime', 'duration', function () {\n        const sound = this.getAttr('sound');\n        if (!sound) {\n            return 0;\n        }\n\n        return this.getAttr('currentTime') / this.getAttr('duration');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"wuEWTVpp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"progress-bar\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/seek-bar/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SXvTXLcA\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loadingError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioPlayer.loadingError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link play-toggle\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"playing\\\"]],[33,[\\\"t\\\"],[\\\"common.pause\\\"],null],[33,[\\\"t\\\"],[\\\"common.play\\\"],null]],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePlay\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"playing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-hold\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-play\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[1,[33,[\\\"audio-player/seek-bar\\\"],null,[[\\\"sound\\\",\\\"duration\\\",\\\"currentTime\\\",\\\"didSeek\\\"],[[28,[\\\"sound\\\"]],[28,[\\\"duration\\\"]],[28,[\\\"currentTime\\\"]],\\\"seekSound\\\"]]],false],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"duration-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"current-time\\\",[28,[\\\"currentTime\\\"]]]]],false],[0,\\\"\\\\n            |\\\\n            \\\"],[1,[33,[\\\"duration-format\\\"],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"total-time\\\",[28,[\\\"duration\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-player/template.hbs\"}});","import Ember from 'ember';\n\nimport Recorder from '../../utils/sound-recorder';\nimport moment from '../../utils/dates';\n\nconst { run, inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['audio-recorder'],\n\n    webrtc: inject.service(),\n\n    recorder: null,\n    startTime: null,\n    showOptions: false,\n\n    attrs: {\n        file: null, // comes from parent, used for notifications\n\n        uploadImmediately: false,\n        playerOptions: {},\n        reset: () => {},\n        audioFileReady: () => {}\n    },\n\n    actions: {\n        startRecording() {\n            this.get('recorder').reset();\n            this.get('recorder').startRecording();\n            this.set('startTime', moment());\n        },\n\n        stopRecording() {\n            this.get('recorder').stopRecording();\n            this.set('startTime', null);\n        },\n\n        reset() {\n            this.get('recorder').reset();\n            this.attrs.reset();\n        }\n    },\n\n    hasSupport: computed.and('webrtc.audioCallCapable', 'hasMediaRecorder'),\n\n    audioBlob: computed.reads('recorder.blob'),\n    audioSource: computed.reads('recorder.blobURL'),\n    recording: computed.reads('recorder.recording'),\n\n    hasMediaRecorder: computed(function () {\n        return window.MediaRecorder !== undefined;\n    }),\n\n    showUploadButton: computed('audioSource', 'uploadImmediately', function () {\n        return !!this.get('audioSource') && !this.get('uploadImmediately');\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('hasSupport')) {\n            run.scheduleOnce('afterRender', this, this.setupRecording);\n        } else {\n            run.scheduleOnce('afterRender', this, this.set, 'loaded', true);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const recorder = this.get('recorder');\n        if (recorder) {\n            recorder.destroy();\n        }\n    },\n\n    didUpdateAttrs({ newAttrs }) {\n        if (newAttrs && newAttrs.file) {\n            if (!newAttrs.file.value) {\n                this.get('recorder').reset();\n            }\n        }\n    },\n\n    setupRecording() {\n        const recorder = Recorder.create(Ember.getOwner(this).ownerInjection());\n        this.set('recorder', recorder);\n\n        recorder.on('blobready', () => {\n            Ember.run(() => this.attrs.audioFileReady(this.get('audioBlob')));\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"X7NdLJyg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasSupport\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"recording-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"recording\\\"]],\\\"recording\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"stop-recording\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"stopRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-stop\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"start-recording\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"startRecording\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-record\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"audioSource\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\"],[[28,[\\\"audioSource\\\"]],[28,[\\\"playerOptions\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"audio-source-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"recording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.recordingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"startTime\\\"],[[28,[\\\"startTime\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noAudio\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-support\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.noSupport\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/audio-recorder/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['auth-loading']\n});\n","export default Ember.HTMLBars.template({\"id\":\"hjOUEo9q\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"logo\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-body\\\"],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-page-loading-spinner\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/auth-loading/template.hbs\"}});","define(\"connections-ui/components/basic-dropdown\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown\"], function (_exports, _basicDropdown) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDropdown.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content-element\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content-element\"], function (_exports, _contentElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _contentElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/content\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/content\"], function (_exports, _content) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _content.default;\n    }\n  });\n});\n","define(\"connections-ui/components/basic-dropdown/trigger\", [\"exports\", \"ember-basic-dropdown/components/basic-dropdown/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-entry'],\n    classNameBindings: ['hasChildren'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    person: null,\n\n    isChild: false,\n    isSuperior: false,\n\n    expand: false,\n\n    actions: {\n        toggleExpand() {\n            if (!this.get('isSuperior')) {\n                this.toggleProperty('expand');\n            }\n        }\n    },\n\n    loading: computed('children.isPending', 'superiors.isPending', function () {\n        return this.get('children.isPending') && this.get('superiors.isPending');\n    }),\n\n    children: computed('person', function () {\n        const children = this.get('person.directReports') || [];\n        const promise = Ember.RSVP.resolve(children);\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    superiors: computed('person', 'isChild', function () {\n        if (this.get('isChild')) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n        const superiors = this.get('person.superiors');\n        const promise = superiors.then(people => {\n            const orderedPeople = [];\n\n            return new Ember.RSVP.Promise(resolve => {\n                function getNextPerson(person) {\n                    if (person && person.get('id')) {\n                        orderedPeople.push(person);\n                        const manager = person.getFieldValue('relationships.manager');\n                        if (!manager) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        const nextPerson = people.find(p => {\n                            return p.get('id') === manager.guid;\n                        });\n\n                        if (!nextPerson) {\n                            resolve(orderedPeople);\n                            return;\n                        }\n                        return getNextPerson(nextPerson);\n                    }\n\n                    resolve(orderedPeople);\n                }\n                this.get('person.manager')\n                    .then(getNextPerson)\n                    .catch(() => resolve(people));\n            });\n        });\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    hasChildren: computed.gt('children.content.length', 0),\n    hasSuperiors: computed.gt('superiors.content.length', 0),\n\n    directReportsLabel: computed('children.content.length', function () {\n        const intl = this.get('intl');\n        const directReports = this.get('children.content.length');\n        if (directReports > 1) {\n            return intl.lookup('components.cardTree.directReports', { directReports });\n        }\n        return intl.lookup('components.cardTree.directReport');\n    }),\n\n    showTotalReports: computed(\n        'person.totalReports.isFulfilled',\n        'person.totalReports.content',\n        'children.isFulfilled',\n        'children.content.length',\n        function () {\n            if (!this.get('person.totalReports.isFulfilled') || !this.get('children.isFulfilled')) {\n                return false;\n            }\n            const total = this.get('person.totalReports.content');\n            const direct = this.get('children.content.length');\n            return typeof total === 'number' && total > direct;\n        }\n    ),\n\n    totalReportsLabel: computed('person.totalReports.content', function () {\n        const intl = this.get('intl');\n        const totalReports = this.get('person.totalReports.content');\n        if (totalReports > 1) {\n            return intl.lookup('components.cardTree.totalReports', { totalReports });\n        }\n        return intl.lookup('components.cardTree.totalReport');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"7YOgXSV/\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasSuperiors\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"isChild\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"superiors\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isSuperior\\\",\\\"expand\\\"],[[28,[\\\"superiors\\\",\\\"firstObject\\\"]],true,true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expander\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpand\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"hasChildren\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"isLinkable\\\",\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"size\\\"],[true,[28,[\\\"person\\\"]],true,true,true,[28,[\\\"canViewChat\\\"]],96]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                -\\\\n                \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasChildren\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"directReportsLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"direct-reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTotalReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        -\\\\n                        \\\"],[1,[26,[\\\"totalReportsLabel\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"children\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSuperior\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"expand\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[33,[\\\"await\\\"],[[28,[\\\"children\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"isChild\\\"],[[28,[\\\"child\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"child\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/card-tree-entry/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    didInsertElement() {\n        this.attachTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this.removeTextInputListeners();\n    },\n\n    attachTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown', event => event.stopPropagation());\n    },\n\n    removeTextInputListeners() {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off('keydown');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"cLGJxA+O\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row heading\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.treeView\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"model\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-tree/card-tree-entry\\\"],null,[[\\\"person\\\",\\\"classNames\\\",\\\"expand\\\"],[[28,[\\\"model\\\"]],\\\"parent-entry\\\",true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-tree/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { eventToString, isNavigation } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['card-detail-view'],\n\n    intl: inject.service(),\n    presenceSubscription: inject.service(),\n\n    entity: null,\n\n    canMove: true,\n\n    flipster: null,\n    currentPerson: null,\n    currentPersonId: computed.reads('currentPerson.id'),\n\n    selfAndSiblings: null,\n    currentPosition: 0,\n    reportTracker: {},\n\n    attrs: {\n        setCurrentPerson() {}\n    },\n\n    actions: {\n        moveToManager() {\n            const currentPersonManager = this.get('currentPerson.manager');\n            if (!currentPersonManager || !currentPersonManager.content) {\n                return;\n            }\n            currentPersonManager\n                .then(manager => {\n                    if (manager && manager.get) {\n                        var name = manager.get('name');\n                        var position = this.getPosition(this.get('currentPerson'));\n                        var tracker = this.get('reportTracker');\n\n                        if (tracker === null) {\n                            tracker = {};\n                        }\n                        tracker[name] = position;\n                        this.set('reportTracker', tracker);\n\n                        return this.setHierarchy(manager);\n                    }\n                })\n                .then(() => {\n                    this.set('didPeersLoad', true);\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        moveToReports(report) {\n            const currentPersonDirectReports = this.get('currentPerson.directReports');\n            if (!currentPersonDirectReports || !currentPersonDirectReports.content) {\n                return;\n            }\n            currentPersonDirectReports\n                .then(reports => {\n                    if (reports && !_.isEmpty(reports)) {\n                        var trackedReport = this.get('reportTracker')[this.get('currentPerson.name')];\n                        if (report) {\n                            return this.setHierarchy(report);\n                        } else if (trackedReport) {\n                            return this.setHierarchy(reports[trackedReport]);\n                        } else {\n                            return this.setHierarchy(reports[0]);\n                        }\n                    }\n                })\n                .then(() => {\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        this.makeCoverFlow();\n                    });\n                });\n        },\n\n        setPerson(person) {\n            this.set('currentPerson', person);\n            this.attrs.setCurrentPerson(person);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachTextInputListeners();\n        this.attachNavigationListener();\n    },\n\n    willClearRender() {\n        this._super(...arguments);\n        this.removeTextInputListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeListeners();\n    },\n\n    allPeople: computed('entity', function () {\n        const entity = this.get('entity');\n        if (entity.id === this.get('currentPerson.id')) {\n            return { isFulfilled: true };\n        }\n        const promises = Ember.RSVP.all([\n            entity.get('directReports'),\n            entity.get('manager'),\n            entity.get('managerSiblings')\n        ]);\n        const promises2 = [this.setHierarchy(this.get('entity')), promises];\n        Ember.RSVP.all(promises2).then(() => {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                Ember.run.next(this, this.makeCoverFlow);\n            });\n        });\n        return DS.PromiseArray.create({\n            promise: promises\n        });\n    }),\n\n    haveScrolled: computed('currentPersonId', 'entity.id', function () {\n        return this.get('currentPersonId') === this.get('entity.id');\n    }),\n\n    peerCount: computed('currentPerson.selfAndSiblings.length', function () {\n        var count = this.get('currentPerson.selfAndSiblings.length') - 1;\n        if (count === -1) {\n            count = 0;\n        }\n        if (count === 1) {\n            return this.get('intl').lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return this.get('intl').lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    setHierarchy(person) {\n        this.set('didPeersLoad', false);\n\n        const promises = [person.get('selfAndSiblings'), person.get('directReports'), person.get('manager')];\n\n        return Ember.RSVP.all(promises).then(([siblings, directReports, manager]) => {\n            let selfAndSiblings = siblings;\n\n            if (_.isEmpty(siblings)) {\n                selfAndSiblings = [person];\n            }\n\n            if (_.isEmpty(directReports)) {\n                directReports = [];\n            }\n\n            this.set('currentPerson', person);\n            this.get('setCurrentPerson')(person);\n\n            this.set('currentPosition', this._getPosition(selfAndSiblings, person));\n            this.set('selfAndSiblings', selfAndSiblings);\n            this.set('didPeersLoad', true);\n\n            if (selfAndSiblings.length === 1 && directReports.length === 0 && _.isEmpty(manager)) {\n                this.set('canMove', false);\n            } else {\n                this.set('canMove', true);\n            }\n        });\n    },\n\n    makeCoverFlow() {\n        if (_.isEmpty(this.$('li')) || !this.$('.flipster')) {\n            return;\n        }\n\n        if (!_.isEmpty(this.$('.flipster__container'))) {\n            // if we already have flipster elements\n            this.$('.flip-content').contents().unwrap();\n        }\n\n        this.$('.flipster').removeClass('flipster--active');\n\n        const startPosition = this.get('currentPosition');\n\n        let flipster = this.$('.flipster').flipster({\n            itemContainer: 'ul',\n            itemSelector: 'li',\n            style: 'flat',\n            start: startPosition,\n            fadeIn: 0,\n            spacing: -0.3,\n            scrollwheel: false,\n            keyboard: false,\n            touch: false,\n            nav: false, // If true, flipster will insert an unordered list of the slides\n            buttons: false, // If true, flipster will insert Previous / Next buttons\n            onItemSwitch: function (to /*, from*/) {\n                Ember.run.debounce(this, this.changeCurrentPerson, to, 300);\n            }.bind(this)\n        });\n\n        this.set('flipster', flipster);\n    },\n\n    changeCurrentPerson(toElem) {\n        Ember.run.scheduleOnce('afterRender', () => {\n            const card = Ember.$(toElem).find('.card');\n            const entityId = card.data('entity-id');\n\n            if (entityId) {\n                const entity = this.get('selfAndSiblings').findBy('id', entityId);\n                this.set('currentPerson', entity);\n                this.attrs.setCurrentPerson(entity);\n            }\n        });\n    },\n\n    _getPosition(selfAndSiblings, person) {\n        if (_.isEmpty(selfAndSiblings)) {\n            return 0;\n        }\n        for (var position = 0; position < selfAndSiblings.length; position++) {\n            if (selfAndSiblings[position].get('id') === person.get('id')) {\n                return position;\n            }\n        }\n    },\n\n    getPosition(person) {\n        return this._getPosition(this.get('selfAndSiblings'), person);\n    },\n\n    attachNavigationListener() {\n        const event = `keydown.${this.elementId}`;\n        Ember.$(document).on(event, event => Ember.run(() => this.onKeyDownHandler(event)));\n    },\n\n    attachTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.on('keydown' + ns, event => {\n            Ember.run(() => {\n                var key = eventToString(event);\n                if (key === 'DOWN_ARROW' || key === 'UP_ARROW' || key === 'RIGHT_ARROW' || key === 'LEFT_ARROW') {\n                    if (key === 'LEFT_ARROW' || key === 'RIGHT_ARROW') {\n                        event.stopPropagation();\n                    }\n                }\n            });\n        });\n        fields\n            .on('focus' + ns, () => {\n                Ember.run(() => this.set('canMove', false));\n            })\n            .on('focusout' + ns, () => {\n                Ember.run(() => this.set('canMove', true));\n            });\n    },\n\n    removeTextInputListeners() {\n        var ns = '.' + this.get('elementId');\n        var fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        fields.off(ns);\n        Ember.$(document).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    removeListeners() {\n        const ns = `.${this.elementId}`;\n        Ember.$(document).off(ns);\n        Ember.$(window).off(ns);\n        Ember.$(window).off('.flipster');\n    },\n\n    onKeyDownHandler(event) {\n        const key = eventToString(event);\n\n        if (Ember.$(event.target).is('textarea')) {\n            return;\n        }\n\n        if (isNavigation(event) && this.get('canMove')) {\n            if (key === 'LEFT_ARROW') {\n                this.get('flipster').flipster('prev');\n            } else if (key === 'RIGHT_ARROW') {\n                if (this.$('.flipster > ul > li:not(.empty)').length > 1) {\n                    this.get('flipster').flipster('next');\n                }\n            } else if (key === 'UP_ARROW') {\n                this.send('moveToManager');\n            } else if (key === 'DOWN_ARROW') {\n                this.send('moveToReports');\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"zKRAcuTd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"allPeople\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"manager-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"manager \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"managerCount\\\",\\\"action\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"siblings\\\",\\\"length\\\"]],\\\"moveToManager\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"cards \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"no-manager\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-up \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"manager\\\",\\\"content\\\",\\\"id\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"peer-count\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"peerCount\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"didPeersLoad\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flipster\\\"],[15,\\\"id\\\",\\\"flipster\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"flip-items\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"selfAndSiblings\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-card\\\"],null,[[\\\"entity\\\",\\\"setPerson\\\",\\\"actionOpenChatRoom\\\",\\\"actionOpenVideoCall\\\"],[[28,[\\\"person\\\"]],\\\"setPerson\\\",[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\"],null],[33,[\\\"route-action\\\"],[\\\"openChatRoomWithVideo\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"selfAndSiblings\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"arrow arrow-down \\\",[33,[\\\"unless\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\",\\\"content\\\"]],\\\"hidden\\\"],null]]]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"reports\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"currentPerson\\\",\\\"directReports\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"mini-card\\\"],null,[[\\\"entity\\\",\\\"currentPerson\\\",\\\"action\\\"],[[28,[\\\"report\\\"]],[28,[\\\"entity\\\"]],\\\"moveToReports\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"report\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/card-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    tagName: 'p',\n    classNames: ['character-counter', 'small', 'help-block'],\n\n    intl: Ember.inject.service(),\n\n    model: null,\n    maxCount: 0,\n\n    charactersUsed: Ember.computed('model.length', function () {\n        const length = this.get('model.length') || 0;\n        if (length > 1) {\n            return this.get('intl').lookup('components.navMenu.feedback.charactersUsed', {\n                characterCount: length,\n                maxCount: this.get('maxCount')\n            });\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"C6bOpZUm\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"charactersUsed\\\"]],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/characters-used/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['chat-settings'],\n\n    activeRoom: null,\n\n    chat: Ember.inject.service(),\n\n    check: Ember.computed('activeRoom.jid', 'chat.mutedRooms.[]', function () {\n        const activeJid = this.get('activeRoom.jid');\n        const muted = this.get('chat.mutedRooms');\n\n        return activeJid && muted && muted.any(jid => jid === activeJid);\n    }),\n\n    actions: {\n        toggleRoomMute() {\n            const roomJid = this.get('activeRoom.jid');\n            if (roomJid) {\n                const areNotificationsDisabled = this.toggleProperty('check');\n                this.get('chat').setRoomMuted(roomJid, areNotificationsDisabled);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yvV8FFZW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-drop-down\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"notifications-description\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettings\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"check\\\"]],\\\"toggleRoomMute\\\"]]],false],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpText\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"small\\\",[]],[15,\\\"class\\\",\\\"text-muted mention-notifications\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"chat.notificationSettingsHelpTextMentions\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/chat-settings/template.hbs\"}});","import ClickOutsideComponent from 'ember-click-outside/components/click-outside';\nexport default ClickOutsideComponent;\n","import Ember from 'ember';\nimport * as focusTrap from 'focus-trap';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':create-entity-menu', 'showMenu::hidden'],\n\n    application: inject.service(),\n    permissions: inject.service(),\n    showCreateGroup: false,\n\n    canInvitePeople: computed.reads('permissions.canInvitePeople'),\n    canCreateGroups: computed.reads('permissions.canCreateGroups'),\n\n    canCreateLocations: computed(() => false),\n\n    showMenu: computed.or('canInvitePeople', 'canCreateGroups', 'canCreateLocations'),\n\n    adminModalSrc: '/admin/#/directory/people/add',\n\n    trap: null,\n\n    actions: {\n        launchCreateGroup() {\n            this.set('showCreateGroup', true);\n        },\n\n        cancelCreateGroup() {\n            this.set('showCreateGroup', false);\n        },\n        showAdminModal() {\n            this.set('showAdminModal', true);\n        },\n\n        closeAdminModal() {\n            this.set('showAdminModal', false);\n        }\n    },\n\n    showDropdownObserver: Ember.observer('showDropdown', function () {\n        if (this.get('showDropdown')) {\n            if (!this.trap) {\n                const modalContainer = this.$('ul.dropdown-menu');\n                if (modalContainer.length) {\n                    this.trap = focusTrap.createFocusTrap(modalContainer[0], {\n                        clickOutsideDeactivates: true,\n                        onPostDeactivate: () => {\n                            this.set('showDropdown', false);\n                        }\n                    });\n                }\n            }\n            if (this.trap) {\n                setTimeout(() => {\n                    this.trap.activate();\n                });\n            }\n        } else {\n            if (this.trap) {\n                this.trap.deactivate();\n            }\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"WQbIfDVj\",\"block\":\"{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"create-entity-menu\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.newEntity.title\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-add-call\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canInvitePeople\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-person\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAdminModal\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.person\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchCreateGroup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.group\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canCreateLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"menu-item create-location\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.filter.newEntity.location\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCreateGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"headerText\\\",\\\"confirmText\\\",\\\"cancel\\\"],[[33,[\\\"t\\\"],[\\\"groups.admin.newGroup\\\"],null],[33,[\\\"t\\\"],[\\\"common.create\\\"],null],\\\"cancelCreateGroup\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"new-group\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"disable\\\",\\\"setAttribute\\\"],[[28,[\\\"confirmAction\\\"]],\\\"cancelCreateGroup\\\",[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[28,[\\\"setAttribute\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\",\\\"setAttribute\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAdminModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"showFooter\\\",\\\"showHeader\\\"],[\\\"closeAdminModal\\\",false,false]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"admin-ui-modal\\\"],null,[[\\\"closeAdminModal\\\",\\\"src\\\"],[\\\"closeAdminModal\\\",[28,[\\\"adminModalSrc\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/create-entity-menu/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nvar minViewMode = {\n    days: 0,\n    months: 1,\n    years: 2\n};\n\nexport default Ember.Component.extend({\n    classNames: ['date-picker'],\n    label: null,\n    srOnly: false,\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    // now takes moment.js format\n    value: null,\n\n    placeholder: null,\n\n    minDate: null,\n    maxDate: null,\n\n    inputMode: false,\n\n    format: null,\n    minView: 'days', //months\n\n    isoLocale: Ember.computed.reads('intl.isoLocale'),\n\n    /**\n     * Some dates need to be displayed as just Month and Year.\n     * The ordering and separator depends on user's locale (e.g., Japanese (ja) should display YYYY/M and German (de) would prefer M.YYYY)\n     * Moment does not provide an api to do this.\n     */\n    monthYearLocaleFormat: Ember.computed('value', function () {\n        moment.locale(this.get('isoLocale'));\n        let now = moment();\n        let localeFormat = now.creationData().locale.longDateFormat('L');\n        const regex = /DD\\W|\\WDD/g;\n        localeFormat = localeFormat.replace(regex, '');\n        return localeFormat.replace(/MM/, 'M');\n    }),\n\n    // Used to populate the bootstrap datepicker in setupDatepicker below.\n    datepickerValue: Ember.computed('value', function () {\n        let monthYearLocaleFormat = 'L';\n        if (this.get('format') === 'monthYear') {\n            monthYearLocaleFormat = this.get('monthYearLocaleFormat');\n        }\n\n        let value = this.get('value');\n        let dateObject = moment();\n        if (!_.isEmpty(value)) {\n            const year = Ember.get(value, 'year');\n            const month = Ember.get(value, 'month') - 1;\n            const day = Ember.get(value, 'day');\n\n            // We don't chain calls in case year or month is empty/null\n            dateObject.year(year);\n            dateObject.month(month);\n            dateObject.date(day);\n        }\n\n        if (_.isEmpty(this.get('value'))) {\n            return '';\n        }\n\n        var view = this.get('minView');\n        if (view === 'months') {\n            return dateObject.format(monthYearLocaleFormat);\n        }\n        return dateObject.format(monthYearLocaleFormat);\n    }),\n\n    initDatepicker: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupDatepicker');\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$('.datepicker').datepicker('remove');\n    }),\n\n    didUpdateAttrs(changes) {\n        this._super(...arguments);\n\n        if (changes.newAttrs.entity.value !== changes.oldAttrs.entity.value) {\n            this.$('.datepicker').datepicker('update', this.get('datepickerValue'));\n        }\n    },\n\n    // This is called when editing the field. It initializes the bootstrap datepicker and passes in the values from the datepickerValue computed.\n    setupDatepicker() {\n        if (!this.get('inputMode')) {\n            return;\n        }\n\n        // lowercase because bootstrap datepicker expects mm instead of MM\n        let format = this.get('format') || moment.localeData()._longDateFormat.L.toLowerCase();\n        // if the format is monthYear then get the localized format and pass that to the datepicker\n        let monthYearLocaleFormat = format === 'monthYear' ? this.get('monthYearLocaleFormat').toLowerCase() : format;\n\n        let minView = Ember.get(minViewMode, this.get('minView'));\n\n        const language = this.get('intl.isoRegionalLocale');\n\n        let options = {\n            orientation: 'left bottom',\n            format: monthYearLocaleFormat,\n            minViewMode: minView,\n            todayHighlight: true,\n            clearBtn: true,\n            language: language,\n            container: `#${this.get('elementId')}`\n        };\n\n        let minDate = this.get('minDate');\n        if (minDate) {\n            options = Object.assign({}, options, {\n                startDate: moment(minDate).toDate()\n            });\n        }\n\n        let maxDate = this.get('maxDate');\n        if (maxDate) {\n            options = Object.assign({}, options, {\n                endDate: moment(maxDate).toDate()\n            });\n        }\n\n        // Some bootstrapper-datepicker languages do not include a\n        // translation for the \"Clear\" button\n        let dates = $.fn.datepicker.dates;\n        if (dates[language] && !dates[language].clear) {\n            const selectedLanguage = this.get('intl.isoLocale');\n            if (selectedLanguage == language) {\n                dates[language].clear = this.get('intl').t('common.clear');\n            }\n        }\n\n        // bootstrap datepicker is setup with datePickerValue from above.\n        this.$('.datepicker')\n            .datepicker(options)\n            .on('changeDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('clearDate', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('hide', event => {\n                Ember.run(() => this.setData(event));\n            })\n            .on('show', () => {\n                Ember.run(() => {\n                    let classNames = this.get('classNames');\n                    let datepicker = this.$('.datepicker').data('datepicker');\n                    if (datepicker && datepicker.picker) {\n                        datepicker.picker.addClass(classNames.join(' '));\n                    }\n                });\n            })\n            .datepicker('update', this.get('datepickerValue'));\n\n        if (_.isEmpty(this.get('value')) || (!this.get('value.month') && !this.get('value.year'))) {\n            this.$('input').val('');\n        }\n    },\n\n    setData(event) {\n        let date;\n        let str = this.$('input').val();\n        moment.locale(this.get('intl.isoLocale'));\n        if (event.date && !_.isEmpty(str)) {\n            date = moment(event.date);\n        } else {\n            date = moment(str);\n\n            if (_.isEmpty(str) || isNaN(date.valueOf())) {\n                return this.clearValue();\n            }\n        }\n\n        let value = {};\n\n        let view = this.get('minView');\n\n        let day = date.date();\n        let month = date.month() + 1;\n        let year = date.year();\n\n        if (view === 'days') {\n            Ember.set(value, 'day', day);\n            Ember.set(value, 'month', month);\n        } else if (view === 'months') {\n            Ember.set(value, 'month', month);\n        }\n\n        Ember.set(value, 'year', year);\n\n        this.set('value', value);\n    },\n\n    clearValue() {\n        if (_.isEmpty(this.get('value'))) {\n            return;\n        }\n\n        if (this.get('outOfOffice')) {\n            // TODO: remove check for outOfOffice feature toggle when on in all environments\n            this.set('value', null);\n        } else {\n            this.set('value.day', null);\n            this.set('value.month', null);\n            this.set('value.year', null);\n        }\n    },\n\n    _placeholder: Ember.computed('placeholder', function () {\n        var placeholder = this.get('placeholder');\n        if (placeholder) {\n            return this.get('intl').lookup(placeholder, null, true).toString();\n        }\n        return '';\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"SED20YyW\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"label\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"srOnly\\\"]],\\\"sr-only\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[[28,[\\\"label\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"inputMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"class\\\",[34,[\\\"form-control datepicker \\\",[33,[\\\"if\\\"],[[28,[\\\"error\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"placeholder\\\",[26,[\\\"_placeholder\\\"]],null],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-date-picker\\\"],null]]]],[15,\\\"class\\\",\\\"datepicker\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/date-picker/template.hbs\"}});","define(\"connections-ui/components/desktop-notification/component\", [\"exports\", \"ember-purecloud-components/components/desktop-notification/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import DocumentTitle from \"ember-document-title/components/document-title\";\n\nexport default DocumentTitle;\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-dropzone', 'clear'],\n    classNameBindings: ['dragClass'],\n    dragClass: 'deactivated',\n    data: null,\n\n    dragLeave(event) {\n        event.preventDefault();\n        this.set('dragClass', 'deactivated');\n    },\n\n    dragOver(event) {\n        event.preventDefault();\n        this.set('dragClass', 'activated');\n    },\n\n    drop(event) {\n        this.set('dragClass', 'deactivated');\n        this.sendAction('dropped', event);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"22Vbwxkd\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-container/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['draggable-item'],\n    attributeBindings: ['draggable', 'ariaLabel'],\n    ariaLabel: Ember.computed(function () {\n        return this.get('intl').lookup('components.inbox.actions.selectCall');\n    }),\n    draggable: 'true',\n    dataType: 'text',\n\n    data: null,\n\n    intl: Ember.inject.service(),\n\n    dragStart(event) {\n        event.dataTransfer.setData(this.get('dataType'), this.get('data'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KQqsaW/F\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/drag-drop-item/template.hbs\"}});","define(\"connections-ui/components/drop-down/component\", [\"exports\", \"ember-purecloud-components/components/drop-down/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['dropdown-menu-view'],\n\n    showMenu: false,\n\n    actions: {\n        toggleMenu() {\n            this.toggleProperty('showMenu');\n        },\n        handleKeyDown(e) {\n            if (e.code === 'Escape' || e.code === 'Enter') {\n                this.set('showMenu', false);\n            }\n        }\n    },\n\n    didInsertElement() {\n        const id = this.get('elementId');\n        Ember.$(window).on(`click.${id}`, event => {\n            Ember.run(() => {\n                const target = $(event.target);\n                const parents = target.parents('.dropdown-menu-view');\n                const targetOutside = !parents.length || id !== parents.attr('id');\n                const targetInput = target.parent('.input').length;\n                const listItem = target.prop('tagName') === 'LI';\n                if (targetOutside || targetInput || listItem) {\n                    this.set('showMenu', false);\n                }\n            });\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"qyhLFnOs\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-purecloud\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleMenu\\\"],null]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[1,[26,[\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu list-unstyled \\\",[33,[\\\"if\\\"],[[28,[\\\"showMenu\\\"]],\\\"show\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\"],null],null],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/dropdown-menu/template.hbs\"}});","define(\"connections-ui/components/duration-format/component\", [\"exports\", \"ember-purecloud-components/components/duration-format/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Component.extend({\n    classNames: ['edit-profile-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    entity: null,\n    editing: false,\n    canUploadPicture: true,\n    canEditProfilePicture: true,\n    canEditInformalPicture: true,\n    canEditAgentImage: false,\n\n    showingProfile: true,\n    showingInformal: false,\n\n    openCaption: null,\n    currentInformal: null,\n\n    attrs: {\n        upload() {},\n        select() {},\n        delete() {},\n        changeType() {}\n    },\n\n    actions: {\n        showInformalPhotos: function () {\n            this.set('showingProfile', false);\n            this.set('showingInformal', true);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('informal');\n        },\n\n        showProfilePictures: function () {\n            this.set('showingProfile', true);\n            this.set('showingInformal', false);\n            this.set('showingAgent', false);\n\n            this.get('changeType')('profile');\n        },\n\n        showAgentPhotos() {\n            this.set('showingProfile', false);\n            this.set('showingInformal', false);\n            this.set('showingAgent', true);\n\n            this.get('changeType')('agent');\n        },\n\n        uploadImage(type) {\n            this.get('upload')(type);\n        },\n\n        selectUploadedImage(type, image, active) {\n            this.get('select')(type, image, active);\n        },\n\n        deleteUploadedImage(type, image, active) {\n            this.get('delete')(type, image, active);\n        },\n\n        removeAgentImage() {\n            const entity = this.get('entity');\n\n            if (this.get('entity.type') === 'person') {\n                const userId = entity.id;\n                const imageId = this.get('entity.agent.profileImage.firstObject._id');\n                if (!imageId) return;\n\n                this.get('ajax')\n                    .delete(Ember.get(this, 'application').pcV2Uri(`api/v2/users/${userId}/images/${imageId}`))\n                    .then(() => {\n                        this.get('store')\n                            .findRecord('person', userId)\n                            .then(() => {\n                                entity.set('agent.profileImage', [], { overwrite: true });\n                            });\n                    })\n                    .catch(err => {\n                        const intl = this.get('intl');\n                        this.logger.error('failed to upload image', { error: err });\n                        this.get('notification').error(\n                            intl.lookup('notification.titles.profileSaveError').toString(),\n                            intl.lookup('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                        return;\n                    });\n            } else {\n                entity.set('agent.profileImage', [], { overwrite: true });\n                let section = entity.get('fieldConfig.agent');\n                entity.saveSection(section);\n            }\n        }\n    },\n\n    scrollActiveImageIntoView: Ember.on('didInsertElement', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var activeImg = this.$('img.active'),\n                picturesContainer = this.$('.pictures');\n            if (activeImg.length > 0 && picturesContainer.length > 0) {\n                var target = activeImg[0],\n                    parent = picturesContainer[0];\n\n                parent.scrollTop = target.parentNode.offsetTop;\n            }\n        });\n    }),\n\n    setupTabListeners: Ember.on('didInsertElement', function () {\n        const component = this;\n\n        // Listen for guxactivetabchange event on gux-tabs element\n        this.$('gux-tabs').on('guxactivetabchange', function (event) {\n            Ember.run(function () {\n                const tabId = event.originalEvent.detail;\n\n                if (tabId === 'informal') {\n                    component.send('showInformalPhotos');\n                } else if (tabId === 'profile') {\n                    component.send('showProfilePictures');\n                } else if (tabId === 'agent') {\n                    component.send('showAgentPhotos');\n                }\n                // Set focus on the active tab\n                Ember.run.later(\n                    component,\n                    function () {\n                        const activeTab = component.$('.gux-tab.gux-active')[0];\n                        if (activeTab && activeTab.offsetParent !== null) {\n                            // Blur any currently focused element (likely the close button)\n                            if (document.activeElement) {\n                                document.activeElement.blur();\n                            }\n                            // Focus the active tab\n                            activeTab.focus();\n                        }\n                    },\n                    50\n                );\n            });\n        });\n    }),\n\n    teardownTabListeners: Ember.on('willDestroyElement', function () {\n        this.$('gux-tabs').off('guxactivetabchange');\n    }),\n\n    emptyProfilesText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyProfile';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyProfile';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyProfile';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    emptyInformalsText: Ember.computed('entity.type', 'application.session.person.id', 'entity.id', function () {\n        var lookup = 'images.upload.yourEmptyInformal';\n        if (this.get('entity.type') === 'group') {\n            lookup = 'images.upload.groupsEmptyInformal';\n        } else if (this.get('application.session.person.id') !== this.get('entity.id')) {\n            lookup = 'images.upload.othersEmptyInformal';\n        }\n        return this.get('intl').lookup(lookup);\n    }),\n\n    profileInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_profile_instructionText')) {\n            return this.get('intl').lookup('person_images_profile_instructionText').toString();\n        }\n        return '';\n    }),\n\n    informalInstructionText: Ember.computed(function () {\n        if (this.get('intl').query('person_images_informal_instructionText')) {\n            return this.get('intl').lookup('person_images_informal_instructionText').toString();\n        }\n        return '';\n    }),\n\n    agentImage: Ember.computed('entity.agent.profileImage.@each.value', function () {\n        let image = this.get('entity').getFieldValue('agent.profileImage');\n        if (_.isEmpty(image) || _.isEmpty(image.value)) {\n            return null;\n        }\n\n        return image.value.x200 || image.value.x800 || image.value.x1024;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O7zPMaH7\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-tabs\\\",{\\\"attrs\\\":[[16,\\\"active-tab\\\",[26,[\\\"changeType\\\"]],null],[15,\\\"guxactivetabchange\\\",\\\"imageSelectTypeSwitchChange($event)\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-tab-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"class\\\",\\\"nav\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"profile-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"profile-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingProfile\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.uploads_images\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"informal-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"informal-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingInformal\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.images_informal\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-tab\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"agent-picture-tab\\\"],[16,\\\"class\\\",[34,[\\\"agent-picture-tab \\\",[33,[\\\"if\\\"],[[28,[\\\"showingAgent\\\"]],\\\"active\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.extendedProfile.imageCollections.agent_profileImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"profile\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current current-profile-picture\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"entity\\\"]],400]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-profile\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"profile\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.newImageBtn\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfilePicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"instructionText\\\"],[13],[1,[26,[\\\"profileInstructionText\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedProfilePictures\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],96,[28,[\\\"editing\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"canUploadPicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[26,[\\\"emptyProfilesText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"informal\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"instruction-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"informalInstructionText\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformalPicture\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"informal-button\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture-button upload-picture-informal\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"informal\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"pictures informal \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"center\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"entity\\\",\\\"uploadedInformalPhotos\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"size\\\",\\\"type\\\",\\\"editing\\\",\\\"canEdit\\\",\\\"showingInformal\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"image\\\"]],150,\\\"informal\\\",[28,[\\\"editing\\\"]],[28,[\\\"canEditInformalPicture\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"emptyInformalsText\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n    \\\"],[9,\\\"gux-tab-panel\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"agent\\\"],[15,\\\"class\\\",\\\"picture-panel\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pictures-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditAgentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current agent-image current-agent-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-image\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[15,\\\"class\\\",\\\"full-width-image\\\"],[16,\\\"src\\\",[34,[[26,[\\\"agentImage\\\"]]]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"agent-buttons\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default upload-picture upload-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\",\\\"agent\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadBtn\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"agentImage\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-danger remove-picture-agent\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeAgentImage\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"]]}],[0,\\\"\\\\n\\\"]]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/edit-profile-picture/template.hbs\"}});","define(\"connections-ui/components/ember-modal-dialog-positioned-container\", [\"exports\", \"ember-modal-dialog/components/positioned-container\"], function (_exports, _positionedContainer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _positionedContainer.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-basic-dialog\", [\"exports\", \"ember-modal-dialog/components/basic-dialog\"], function (_exports, _basicDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _basicDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-in-place-dialog\", [\"exports\", \"ember-modal-dialog/components/in-place-dialog\"], function (_exports, _inPlaceDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inPlaceDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-dialog\"], function (_exports, _liquidDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-liquid-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/liquid-tether-dialog\"], function (_exports, _liquidTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _liquidTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-modal-dialog/-tether-dialog\", [\"exports\", \"ember-modal-dialog/components/tether-dialog\"], function (_exports, _tetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-tether\", [\"exports\", \"ember-tether/components/ember-tether\"], function (_exports, _emberTether) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberTether.default;\n    }\n  });\n});\n","define(\"connections-ui/components/ember-wormhole\", [\"exports\", \"ember-wormhole/components/ember-wormhole\"], function (_exports, _emberWormhole) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberWormhole.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport cloneDeep from 'lodash/cloneDeep';\n\nconst { computed } = Ember;\n\nconst COUNTRY_OPTIONS = [\n    {\n        displayName: 'emergencyLocation.country.usa',\n        value: 'US'\n    },\n    {\n        displayName: 'emergencyLocation.country.canada',\n        value: 'CA'\n    }\n];\n\nexport default Ember.Component.extend({\n    classNames: ['emergency-location'],\n    classNameBindings: ['saving:saving-emergency-location'],\n    intl: Ember.inject.service(),\n\n    editingElocation: false,\n    eLocation: computed.reads('emergencyLocationData.eLocation'),\n    showTitle: false,\n    showResetButton: false,\n    showTitleIcons: true,\n    showTitleInEditMode: true,\n    personId: null,\n    primaryVoice: computed.reads('emergencyLocationData.primaryVoice'),\n    saving: false,\n    countryOptions: Ember.A([]),\n\n    street1: computed.reads('updatedAddress.street1'),\n    street2: computed.reads('updatedAddress.street2'),\n    city: computed.reads('updatedAddress.city'),\n    state: computed.reads('updatedAddress.state'),\n    zipcode: computed.reads('updatedAddress.zipcode'),\n    country: computed('updatedAddress.country', 'countryOptions.[]', function () {\n        return this.get('updatedAddress.country') || '';\n    }),\n\n    street1ReadOnly: computed.reads('eLocation.address.street1'),\n    street2ReadOnly: computed.reads('eLocation.address.street2'),\n    cityReadOnly: computed.reads('eLocation.address.city'),\n    stateReadOnly: computed.reads('eLocation.address.state'),\n    zipcodeReadOnly: computed.reads('eLocation.address.zipcode'),\n    countryReadOnly: computed.reads('eLocation.address.country'),\n\n    isAddressEmpty(address) {\n        if (!address) {\n            return true;\n        }\n        return (\n            !Ember.get(address, 'street1') ||\n            !Ember.get(address, 'city') ||\n            !Ember.get(address, 'zipcode') ||\n            !Ember.get(address, 'country')\n        );\n    },\n\n    isEmpty: computed('eLocation.address.{street1,street2,city,zipcode,country}', function () {\n        return this.isAddressEmpty(this.get('eLocation.address'));\n    }),\n\n    showNumberInTitle: computed.notEmpty('primaryVoice.number'),\n\n    // updatedAddess is used to bind to input values while in edit mode\n    // it is initialized with either eLocationAddress or previewAddress\n    // and is updated by user typed in values while in edit mode.\n    // This is the object that is used when saving the address to the endpoint\n    // This should not be passed down by parent component\n    updatedAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    // previewAddress contains the address that is passed down by the parent component\n    // This address is copied over to the updatedAddress to be seen in the address form.\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressIsEligible: true,\n    previewAddressError: '',\n\n    toolTipArrowId: computed('elementId', function () {\n        return `arrow-id-${this.get('elementId')}`;\n    }),\n\n    toolTipHelpId: computed('elementId', function () {\n        return `help-id-${this.get('elementId')}`;\n    }),\n\n    toolTipAlertInfoId: computed('elementId', function () {\n        return `alert-info-id-${this.get('elementId')}`;\n    }),\n\n    isEligibleForE911: computed.reads('emergencyLocationData.isEligibleForE911'),\n    eLocationInlineWarning: computed.reads('emergencyLocationData.eLocationInlineWarning'),\n\n    hasELocationInlineWarning: computed.notEmpty('eLocationInlineWarning'),\n\n    actions: {\n        setField(field, event) {\n            if (!event || !event.target || (!event.target.value && !this.get(`${field}`))) return;\n            this.set(`updatedAddress.${field}`, event.target.value);\n\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(this.get('updatedAddress'));\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        const countryTranslated = COUNTRY_OPTIONS.map(entry => {\n            return {\n                value: entry.value,\n                displayName: this.get('intl').lookup(entry.displayName).toString()\n            };\n        });\n        this.set('countryOptions', countryTranslated);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.get('setUpdatedAddress').perform();\n    },\n\n    setUpdatedAddress: task(function* () {\n        yield waitForQueue('actions');\n        if (this.get('eLocation') && this.get('editingElocation') && !this.get('saving')) {\n            const eLocationCopy = cloneDeep(this.get('previewAddress'));\n            this.set('updatedAddress', eLocationCopy);\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(cloneDeep(this.get('updatedAddress')));\n            }\n        }\n    }).restartable()\n});\n","export default Ember.HTMLBars.template({\"id\":\"p7JEF6x8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"edit-mode \\\",[33,[\\\"unless\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleInEditMode\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section-edit\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipAlertInfoId\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"alert-info-edit\\\"],[15,\\\"icon-name\\\",\\\"alert-info\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipAlertInfoId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.alertInfo\\\"],null],false]]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"previewAddressIsEligible\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[15,\\\"name\\\",\\\"street1\\\"],[15,\\\"class\\\",\\\"address-street1\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street1\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address1Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street1\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street1\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address1Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[15,\\\"name\\\",\\\"street2\\\"],[15,\\\"class\\\",\\\"address-street2\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"street2\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.address2Placeholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"street2\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-street2\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.address2Label\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[15,\\\"name\\\",\\\"city\\\"],[15,\\\"class\\\",\\\"address-city\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"city\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.cityPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"city\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-city\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.cityLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[15,\\\"name\\\",\\\"state\\\"],[15,\\\"class\\\",\\\"address-state\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"state\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.statePlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"state\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-state\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.stateLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-text-like\\\",{\\\"attrs\\\":[[15,\\\"label-position\\\",\\\"above\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"slot\\\",\\\"input\\\"],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[15,\\\"name\\\",\\\"zipcode\\\"],[15,\\\"class\\\",\\\"address-zipcode\\\"],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[26,[\\\"zipcode\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.zipPlaceholder\\\"],null],null],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"zipcode\\\"],null],null],[13],[14],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-address-zipcode\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.zipLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-form-field-dropdown\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setField\\\",\\\"country\\\"],null],null],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[15,\\\"name\\\",\\\"country\\\"],[15,\\\"class\\\",\\\"address-country\\\"],[16,\\\"value\\\",[26,[\\\"country\\\"]],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.addressSection.countryPlaceholder\\\"],null]]]],[15,\\\"filterable\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"countryOptions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"country\\\",\\\"value\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[28,[\\\"country\\\",\\\"displayName\\\"]],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"country\\\"]},null],[0,\\\"                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"slot\\\",\\\"label\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-country\\\"]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.addressLabels.countryLabel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"previewAddressError\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"non-edit-mode \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emergency-address-title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.title\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showTitleIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipArrowId\\\"]]]]],[15,\\\"class\\\",\\\"edit-emergency-location-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"personId\\\"]],[33,[\\\"query-params\\\"],null,[[\\\"editEmergencyLocation\\\"],[\\\"true\\\"]]]],[[\\\"tabindex\\\",\\\"class\\\"],[\\\"0\\\",\\\"to-profile\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"edit\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipArrowId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.update\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"toolTipHelpId\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],null],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-help\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[16,\\\"for\\\",[26,[\\\"toolTipHelpId\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.help\\\"],null],false]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showNumberInTitle\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-for-number\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.titleForNumber\\\"],[[\\\"number\\\"],[[28,[\\\"primaryVoice\\\",\\\"display\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasELocationInlineWarning\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-general-elocation-error\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"eLocationInlineWarning\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isEligibleForE911\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-not-eligible-number\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-for-empty-address\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.emptyAddress\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street1\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street1ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field street2\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"street2ReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field city-state-zip\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"cityReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"stateReadOnly\\\"]],false],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"zipcodeReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emergency-address-field country\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"countryReadOnly\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showResetButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null]]]],[15,\\\"accent\\\",\\\"tertiary\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"resetElocation\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"emergencyLocation.buttonTitles.reset\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/emergency-location/template.hbs\"}});","define(\"connections-ui/components/emoji-dom/component\", [\"exports\", \"ember-purecloud-components/components/emoji-dom/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import { equal, notEmpty } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\nimport DS from 'ember-data';\nimport isEmpty from 'lodash.isempty';\nimport debounce from 'lodash.debounce';\nimport { inject as service } from '@ember/service';\nimport Ember from 'ember';\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-contact-group-v2'],\n    classNameBindings: ['compact'],\n    intl: service(),\n    session: service(),\n    application: service(),\n    canViewChat: true,\n    canViewVideo: true,\n    entity: null,\n    videoTooltipTitle: '',\n    linkProfile: false,\n    showFavorite: false,\n    showImages: true,\n    compact: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isChatEnabled: false,\n    isWebrtcEnabled: false,\n    isVideoButtonEnabled: false,\n    onContact() {},\n    callEntity() {},\n    toggleFavorite() {},\n\n    useMediaProviders: false,\n\n    actions: {\n        makeCall: debounce(function () {\n            if (this.get('isGroup')) {\n                const groupNumber = this.get('entity.contactInfo.groupNumber.firstObject.value.number');\n                const groupExtension = this.get('entity.contactInfo.groupNumber.firstObject.value.extension');\n                const phoneNumber = groupNumber || groupExtension;\n                this.bubbleAction({\n                    action: 'startCallByNumber',\n                    actionContext: [phoneNumber]\n                });\n            } else {\n                this.bubbleAction({\n                    action: 'startCallPersonById',\n                    actionContext: [this.get('entity.id')]\n                });\n            }\n\n            this.get('onContact')();\n        }, 250),\n\n        startChat() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [entity]\n            });\n\n            this.get('onContact')();\n        },\n\n        sendLove() {\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'sendLove',\n                actionContext: [entity]\n            });\n\n            this.get('onContact')();\n        },\n\n        launchWebrtc() {\n            if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                return;\n            }\n\n            const entity = this.get('entity');\n            this.bubbleAction({\n                action: 'openChatRoomWithVideo',\n                actionContext: [entity.get('id'), this.get('useMediaProviders')]\n            });\n\n            this.get('onContact')();\n        },\n\n        showGallery() {\n            this.sendAction('viewLightGallery');\n\n            this.get('onContact')();\n        },\n\n        navigateTo() {\n            this.get('application').navigateTo(this.get('entity.type'), this.get('entity.id'));\n        }\n    },\n\n    isPerson: equal('entity.type', 'person'),\n    isGroup: equal('entity.type', 'group'),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    isSelf: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    hasImages: computed(\n        'entity.uploadedInformalPhotos.[]',\n        'entity.images.informal.[]',\n        'entity.images.gallery.[]',\n        function () {\n            if (!this.get('showImages')) {\n                return false;\n            }\n\n            const personHasImage = this.get('entity.type') === 'person' && !!this.get('entity.images.informal.length');\n            const groupHasImage = this.get('entity.type') === 'group' && !!this.get('entity.images.gallery.length');\n            return personHasImage || groupHasImage;\n        }\n    ),\n\n    hasPhone: computed('entity.phone', 'entity.contactInfo.groupNumber', function () {\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('entity.contactInfo.groupNumber'));\n        }\n        return !isEmpty(this.get('entity.phone'));\n    }),\n\n    email: computed('entity.primaryContactInfo.email.firstObject.value.fieldId', 'isPerson', function () {\n        if (!this.get('isPerson')) {\n            return;\n        }\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n        let email = entity.getFieldValue('primaryContactInfo.email');\n        return email.value;\n    }),\n    phone: computed(\n        'entity.primaryContactInfo.voice.firstObject.value.fieldId',\n        'isPerson',\n        'entity.contactInfo.groupNumber.firstObject.value.fieldId',\n        'isGroup',\n        function () {\n            if (!this.get('isPerson') && !this.get('isGroup')) {\n                return;\n            }\n            let entity = this.get('entity');\n            if (entity instanceof DS.PromiseObject) {\n                entity = entity.get('content');\n            }\n            if (!entity) {\n                return;\n            }\n            let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n            if (this.get('isGroup')) {\n                phone = entity.getFieldValue('contactInfo.groupNumber', true);\n            }\n            if (phone && phone.value && phone.value.fieldPath) {\n                return entity.getFieldValue(phone.value.fieldPath);\n            }\n            return phone;\n        }\n    ),\n\n    mailto: computed('email', 'emailEnabled', function () {\n        if (this.get('emailEnabled')) {\n            return `mailto:${this.get('email')}`;\n        }\n        return '';\n    }),\n\n    tel: computed('phone', function () {\n        const phone = this.get('phone');\n        if (phone.rel) {\n            return `tel:${phone.rel.e164}`;\n        }\n    }),\n\n    emailEnabled: notEmpty('email'),\n\n    // Phone button enabled if a phone is available or the entity has a phone number to use for a tel: link\n    phoneEnabled: computed('phoneServiceEnabled', 'phoneAvailable', 'phone', function () {\n        return (this.get('phoneServiceEnabled') && this.get('phoneAvailable')) || !isEmpty(this.get('phone'));\n    }),\n\n    showPhone: computed('phoneServiceEnabled', 'phone', 'isGroup', function () {\n        if (!this.get('phoneServiceEnabled')) {\n            return false;\n        }\n        if (this.get('isGroup')) {\n            return !isEmpty(this.get('phone'));\n        } else {\n            return true;\n        }\n    }),\n\n    entityData: computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    didRender() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this._updateFavoriteAttributes);\n    },\n\n    _updateFavoriteAttributes() {\n        const entity = this.get('entity');\n        if (!entity) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        if (!intl) {\n            return;\n        }\n\n        const isFavorite = entity.get('isFavorite');\n        const name = entity.get('name') || '';\n        const title = isFavorite ? intl.t('common.unMarkFavorite', { name }) : intl.t('common.markFavorite', { name });\n\n        // Find the entity-favorite component in this component's DOM\n        const element = this.element;\n        if (!element) {\n            return;\n        }\n\n        // Find the button (it might be the root element or inside)\n        let favoriteButton = element.querySelector('button.entity-favorite, button.person-favorite');\n        if (!favoriteButton) {\n            const favoriteComponent = element.querySelector('.entity-favorite');\n            if (favoriteComponent) {\n                favoriteButton =\n                    favoriteComponent.tagName === 'BUTTON'\n                        ? favoriteComponent\n                        : favoriteComponent.querySelector('button');\n            }\n        }\n\n        if (favoriteButton && title) {\n            // Set title on the button element\n            favoriteButton.setAttribute('title', title);\n            favoriteButton.title = title;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+JHLGccX\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"showPhone\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"tel\\\"]]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"font-icon\\\"],null,[[\\\"class\\\"],[\\\"pc-moon pc-phone\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"isPerson\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.emailSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],null],[15,\\\"class\\\",\\\"icon\\\"],[16,\\\"href\\\",[34,[[26,[\\\"mailto\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-email\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.email\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"isChatEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact chat\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-chat\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"contact webrtc \\\",[33,[\\\"if\\\"],[[28,[\\\"isVideoButtonEnabled\\\"]],\\\"enabled\\\",\\\"disabled\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.openVideoCallSr\\\"],[[\\\"tooltip\\\",\\\"name\\\"],[[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"launchWebrtc\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-video\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[26,[\\\"videoTooltipTitle\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isLoveEnabled\\\"]],[33,[\\\"not\\\"],[[28,[\\\"isSelf\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact purelove\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.propsSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendLove\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-love\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.props\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasImages\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact gallery\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.goToGallerySr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showGallery\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-picture\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToGallery\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"linkProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact profile\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"icon\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null],[28,[\\\"showFavorite\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"import-data\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.importLinkedinSr\\\"],[[\\\"name\\\"],[[28,[\\\"entity\\\",\\\"name\\\"]]]]]]]],[15,\\\"class\\\",\\\"icon\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showLinkedInImport\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"class\\\",\\\"pc pc-linkedin\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[[33,[\\\"if\\\"],[[28,[\\\"useMediaProviders\\\"]],\\\"top\\\",\\\"bottom\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"components.entities.importLinkedin\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"contact-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-favorite\\\"],null,[[\\\"entity\\\",\\\"toggleFavorite\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact-group-v2/template.hbs\"}});","define(\"connections-ui/components/entity-contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport PersonModel from '../../models/person';\nimport EntityContact from '../entity-contact/component';\n\nexport default EntityContact.extend(FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n    session: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n\n    layoutName: 'components/entity-contact',\n\n    makingCall: false,\n    queue: null,\n    phoneNumber: null,\n    call: null,\n\n    actions: {\n        makeCall: function () {\n            if (!this.get('makingCall')) {\n                const person = this.get('otherParty.content') || this.get('person');\n\n                const queue = this.get('queue.content');\n                const phoneNumber = this.get('phoneNumber');\n\n                let callPromise;\n                this.set('makingCall', true);\n\n                if (this.get('call.isAcdCall')) {\n                    if (person instanceof PersonModel) {\n                        callPromise = this.phoneService.makeCall(person, null, queue);\n                    } else if (this.get('person') && _.isEmpty(phoneNumber)) {\n                        this.set('makingCall', false);\n                        this._super();\n                        return;\n                    } else {\n                        callPromise = this.phoneService.makeCall(phoneNumber, null, queue);\n                    }\n                } else {\n                    callPromise = this.phoneService.makeCall(queue, null, false);\n                }\n\n                callPromise.finally(() => {\n                    this.set('makingCall', false);\n                });\n            }\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport debounce from 'lodash.debounce';\n\nimport PromiseLoadingMixin from '../../mixins/promise-loading';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport * as focusTrap from 'focus-trap';\n\nvar EntityContactComponent = Ember.Component.extend(PromiseLoadingMixin, FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressformat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    showPhone: false,\n    showChat: false,\n    showEmail: false,\n    showFavorite: false,\n    shouldTether: false,\n    contact: null,\n    phoneNumber: null,\n    email: null,\n    callId: null,\n\n    shouldDisplayDropdown: true,\n    showDropdown: false,\n    callConnecting: false,\n    flaggingSupportEnabled: false,\n    isRedial: false,\n    _closingViaEscape: false,\n\n    tether: null,\n\n    trap: null,\n\n    actions: {\n        toggleFavorite: function () {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        },\n\n        toggleDropdown: function (skipFocus) {\n            this.toggleProperty('showDropdown');\n\n            if (this.get('showDropdown') && !skipFocus && !this.get('_closingViaEscape')) {\n                let tether = this.get('tether');\n                if (this.get('shouldTether') && !_.isEmpty(tether)) {\n                    Ember.run.scheduleOnce('afterRender', tether, tether.position);\n                }\n                // Focus first focusable element when dropdown opens\n                Ember.run.scheduleOnce('afterRender', this, function () {\n                    // Use a small delay to ensure tethered dropdown is positioned\n                    const focusTimer = Ember.run.later(\n                        this,\n                        function () {\n                            if (this.get('_closingViaEscape') || !this.get('showDropdown')) {\n                                return;\n                            }\n                            // Check both regular and tethered dropdown menus\n                            const dropdown =\n                                this.$('.dropdown-menu.show').length > 0\n                                    ? this.$('.dropdown-menu.show')\n                                    : Ember.$('.entity-contact-dropdown-menu.show');\n\n                            const firstFocusable = dropdown\n                                .find('a, button, [tabindex=\"0\"]')\n                                .filter(':visible')\n                                .first();\n\n                            if (firstFocusable.length > 0) {\n                                firstFocusable.focus();\n                            }\n                        },\n                        50\n                    );\n                    this.set('_focusTimer', focusTimer);\n                });\n            }\n        },\n\n        makeCall: debounce(function (address) {\n            if (this.get('session.features.digitalFirstPURE2942') && !this.get('permissions.phoneEnabled')) {\n                return;\n            }\n            this.set('showDropdown', false);\n\n            this.get('person').then(person => {\n                if (address) {\n                    // Prefer action supplied phone number entry to makeCall.\n                    // User has clicked dropdown and selected a specific number.\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [address]\n                    });\n                } else if (!_.isEmpty(person) && !(this.get('isExternalContact') || this.get('isGroup'))) {\n                    // Or call person by their guid\n                    // Calling a person back at their preferred number.\n                    this.bubbleAction({\n                        action: 'startCallPersonById',\n                        actionContext: [this.get('person.id')]\n                    });\n                } else {\n                    // Otherwise call person by specified phone number to the component.\n                    // (call-history-entry, active-call-entry components)\n                    this.bubbleAction({\n                        action: 'startCallByNumber',\n                        actionContext: [this.get('phoneNumber')]\n                    });\n                }\n            });\n        }, 250),\n\n        recordRecentContact: function (type, value) {\n            if (type === 'email') {\n                window.top.location = 'mailto:' + value.data.value;\n            } else if (type === 'voice' && !this.get('phone.enabled')) {\n                if (this.get('session.features.digitalFirstPURE2942')) {\n                    return;\n                }\n                window.top.location = 'tel:' + value.data.rel.e164;\n            }\n        },\n\n        startChat: function () {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [this.get('contact')]\n            });\n            this.set('showDropdown', false);\n        },\n\n        sendToProfile: function () {\n            this.get('person').then(person => {\n                this.bubbleAction({\n                    action: 'transitionToEntityDetail',\n                    actionContext: [person]\n                });\n\n                this.set('showDropdown', false);\n            });\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    },\n\n    entityData: Ember.computed('contact.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('contact.id'),\n            name: this.get('contact.name'),\n            isFavorite: this.get('contact.isFavorite'),\n            type: this.get('contact.type')\n        };\n    }),\n\n    isEntityFavoriteDecompEnabled: Ember.computed.readOnly('session.features.epcDecompEntityFavorite'),\n\n    callConnected: Ember.observer('phone.activeCall', function () {\n        const activeCall = this.get('phone.activeCall');\n\n        if (activeCall) {\n            const activeCallId = Ember.get(activeCall, 'id');\n            const componentCallIsActiveCall = activeCallId === this.get('callId');\n            if (componentCallIsActiveCall) {\n                this.set('callConnecting', false);\n            }\n        }\n    }),\n\n    phoneNumberDetails: Ember.computed('phoneNumber', 'person', function () {\n        if (this.get('person.name')) {\n            return this.get('person.name');\n        }\n        return this.get('addressformat').formatAddressForDisplay(this.get('phoneNumber'));\n    }),\n\n    phoneServiceEnabled: Ember.computed('phone.{enabled,phoneDisabled,noStationSelected}', function () {\n        return this.get('phone.enabled') && !this.get('phone.noStationSelected') && !this.get('phone.phoneDisabled');\n    }),\n\n    phoneEnabled: Ember.computed('showPhone', 'isExternalContact', 'phoneNumber', 'phone.phoneDisabled', function () {\n        if (this.get('phone.phoneDisabled') || this.get('personIsDeleted')) {\n            return false;\n        }\n        return (\n            this.get('showPhone') ||\n            ((this.get('isExternalContact') || this.get('isGroup')) && !!this.get('phoneNumber'))\n        );\n    }),\n\n    chatEnabled: Ember.computed('showChat', 'isExternalContact', 'permissions.canViewBusinessChat', function () {\n        return this.get('permissions.canViewBusinessChat') && this.get('showChat') && !this.get('isExternalContact');\n    }),\n\n    emailEnabled: Ember.computed('showEmail', 'isExternalContact', 'email', function () {\n        return this.get('showEmail') || (this.get('isExternalContact') && !!this.get('email'));\n    }),\n\n    favoriteEnabled: Ember.computed('showFavorite', 'isExternalContact', 'favorites.enabled', function () {\n        return this.get('showFavorite') && !this.get('isExternalContact') && this.get('favorites.enabled');\n    }),\n\n    isExternal: Ember.computed('contact.participantType', function () {\n        if (this.get('contact.type') === 'person' || this.get('isExternalContact')) {\n            return false;\n        }\n        return (\n            !this.get('contact.purpose') ||\n            this.get('contact.purpose').toLowerCase() === 'external' ||\n            _.isEmpty(this.get('contact.userId'))\n        );\n    }),\n\n    isExternalContact: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'externalContact';\n    }),\n\n    isGroup: Ember.computed('contact.type', function () {\n        return this.get('contact.type') === 'group';\n    }),\n\n    setExternalContactInfo: Ember.on('didInsertElement', function () {\n        if (this.get('isExternalContact')) {\n            var phone = this.get('contact.contactInfo.phone');\n            if (phone) {\n                this.set('phoneNumber', `tel:${phone[0].rel.e164}`);\n            }\n\n            var email = this.get('contact.contactInfo.email');\n            if (email) {\n                this.set('email', `mailto:${email[0].value}`);\n            }\n        }\n    }),\n\n    setupGroupPhoneNumber: Ember.on('didInsertElement', function () {\n        if (this.get('isGroup')) {\n            Ember.run.scheduleOnce('afterRender', this, this.setGroupNumber);\n        }\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('person').then(person => {\n                this.get('favorites').toggleFavorite(person);\n            });\n        });\n    }),\n\n    person: Ember.computed('contact.{userId,type,id}', function () {\n        var type = this.get('contact.type');\n        var id = this.get('contact.id');\n        var userId = this.get('contact.userId');\n        if (type && id) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(this.get('contact'))\n            });\n        } else if (userId) {\n            // This fall through will not be needed after public api v3 -- this looks up a user by GUID\n            return this.store.find('person', userId);\n        }\n        return Ember.RSVP.resolve({});\n    }),\n\n    personIsDeleted: Ember.computed.equal('person.state', 'deleted'),\n\n    hideChat: Ember.computed('contact.{id,userId}', 'session.person.id', function () {\n        let id = this.get('contact.id') || this.get('contact.userId');\n        return id === this.get('session.person.id');\n    }),\n\n    jid: Ember.computed('person.jid', 'contact.jid', function () {\n        if (this.get('contact.type') === 'group') {\n            return this.get('contact.jid');\n        }\n\n        return this.get('person.jid');\n    }),\n\n    phones: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.phone');\n        } else {\n            var promise = this.get('person').then(person => {\n                return this.getContactFieldValuesByType(person, 'voice');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    emails: Ember.computed('person', 'isExternalContact', function () {\n        if (this.get('isExternalContact')) {\n            return this.get('contact.contactInfo.email');\n        } else {\n            var promise = this.get('person').then(person => {\n                this.getContactFieldValuesByType(person, 'email');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    displayDropdown: Ember.computed('shouldDisplayDropdown', 'phones', 'emails', 'isExternalContact', function () {\n        var hasEmail = !_.isEmpty(this.get('emails'));\n        var hasPhone = !_.isEmpty(this.get('phones'));\n        var canDisplay = this.get('shouldDisplayDropdown');\n        var isContact = this.get('isExternalContact');\n\n        return canDisplay && (!isContact || hasEmail || hasPhone);\n    }),\n\n    callTitle: Ember.computed(function () {\n        return this.get('intl').t('tooltip.contactIcon.phone').toString();\n    }),\n\n    attachListeners: Ember.on('didInsertElement', function () {\n        var id = this.get('elementId');\n\n        Ember.$(window).on('click.' + id, Ember.run.bind(this, this.detectOutsideClick));\n        // Use keyup instead of keydown to avoid conflicts\n        Ember.$(document).on('keyup.' + id, Ember.run.bind(this, this.handleKeyDown));\n    }),\n\n    setupTether: Ember.on('didInsertElement', function () {\n        if (!this.get('shouldTether')) {\n            return;\n        }\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let tether = new window.Tether({\n                element: this.$('.dropdown-menu')[0],\n                target: this.$('.show-more')[0],\n                attachment: 'top right',\n                targetAttachment: 'bottom right',\n                constraints: [\n                    {\n                        to: 'scrollParent',\n                        attachment: 'together',\n                        pin: true\n                    }\n                ]\n            });\n\n            this.set('tether', tether);\n        });\n    }),\n\n    showDropdownObserver: Ember.observer('showDropdown', function () {\n        if (this.get('showDropdown')) {\n            if (!this.trap) {\n                const modalContainer = this.$('ul.dropdown-menu');\n                if (modalContainer.length) {\n                    this.trap = focusTrap.createFocusTrap(modalContainer[0], {\n                        clickOutsideDeactivates: true,\n                        onPostDeactivate: () => {\n                            this.set('showDropdown', false);\n                        }\n                    });\n                }\n            }\n            if (this.trap) {\n                setTimeout(() => {\n                    this.trap.activate();\n                });\n            }\n        } else {\n            if (this.trap) {\n                this.trap.deactivate();\n            }\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    removeTether() {\n        let tether = this.get('tether');\n        if (tether) {\n            tether.destroy();\n            if (tether.element) {\n                tether.element.remove();\n            }\n        }\n    },\n\n    removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    willDestroyElement() {\n        this.removeListeners();\n        this.removeTether();\n\n        this._super(...arguments);\n    },\n\n    detectOutsideClick: function (event) {\n        var id = this.get('elementId');\n        var target = Ember.$(event.target);\n\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        // Check if click is outside component and outside tethered dropdown\n        const isOutsideComponent = id && !target.parents('#' + id).length;\n        const isOutsideTetheredDropdown = !target.closest('.entity-contact-dropdown-menu').length;\n\n        if (isOutsideComponent && isOutsideTetheredDropdown) {\n            Ember.run.once(this, this.set, 'showDropdown', false);\n        }\n    },\n\n    handleKeyDown: function (event) {\n        const key = event.key || event.keyCode;\n\n        // Close dropdown on Escape\n        if ((key === 'Escape' || key === 'Esc' || key === 27) && this.get('showDropdown')) {\n            // Cancel any pending focus timer\n            const focusTimer = this.get('_focusTimer');\n            if (focusTimer) {\n                Ember.run.cancel(focusTimer);\n                this.set('_focusTimer', null);\n            }\n\n            // Set flag to prevent auto-focus\n            this.set('_closingViaEscape', true);\n\n            // Store reference to toggle button\n            const toggleButton = this.$('.show-more');\n\n            // Close dropdown\n            this.set('showDropdown', false);\n\n            // Return focus to toggle button\n            if (toggleButton && toggleButton.length > 0) {\n                toggleButton.focus();\n            }\n\n            // Reset flag after a delay\n            Ember.run.later(() => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('_closingViaEscape', false);\n                }\n            }, 200);\n\n            return false;\n        }\n    },\n\n    getContactFieldValuesByType: function (person, type) {\n        if (!person.getContactFieldValuesByType) {\n            return [];\n        }\n        var items = person.getContactFieldValuesByType(type).map(function (item) {\n            return { data: item };\n        });\n        var primary = person.getFieldValue(`primaryContactInfo.${type}`, true);\n        if (!_.isEmpty(primary)) {\n            var primaryItem = _.find(items, function (item) {\n                return Ember.get(item.data, '_id') === Ember.get(primary, 'value.fieldId');\n            });\n            if (primaryItem) {\n                primaryItem.primary = true;\n            }\n        }\n        return _.sortBy(items, function (item) {\n            return item.primary;\n        });\n    },\n\n    notifyError: function (key) {\n        this.get('notification').show({\n            target: this.get('phone.applicationController'),\n            tag: 'callHistory',\n            message: this.get('intl').t(key),\n            type: 'error',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').t('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    setGroupNumber() {\n        const data = this.get('contact').getFieldValue('contactInfo.groupNumber');\n        if (!_.isEmpty(data)) {\n            const number = this.get('addressformat').format(data);\n            this.set('phoneNumber', `tel:${number}`);\n        }\n    }\n});\n\nexport default EntityContactComponent;\n","export default Ember.HTMLBars.template({\"id\":\"rqw6vXEG\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isRedial\\\"]],[33,[\\\"t\\\"],[\\\"components.callHistory.redial\\\"],null],[33,[\\\"t\\\"],[\\\"components.entities.makeCallSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone make-call \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disablePhoneButton\\\"]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.makeCall\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPhoneSpinner\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-phone \\\",[33,[\\\"unless\\\"],[[28,[\\\"phoneEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[16,\\\"target\\\",[34,[[26,[\\\"phoneNumber\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-chat \\\",[33,[\\\"unless\\\"],[[28,[\\\"chatEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"route-action\\\"],[\\\"openChatRoom\\\",[28,[\\\"contact\\\"]]],null]]],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"emailEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"a\\\",[]],[16,\\\"class\\\",[34,[\\\"icon btn btn-link btn-email \\\",[33,[\\\"unless\\\"],[[28,[\\\"emailEnabled\\\"]],\\\"hide\\\"],null]]]],[16,\\\"href\\\",[26,[\\\"email\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"favoriteEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"contact\\\",\\\"isFavorite\\\"]],[33,[\\\"t\\\"],[\\\"common.unMarkFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],[33,[\\\"t\\\"],[\\\"common.markFavorite\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-expanded\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"true\\\",\\\"false\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.moreActionSr\\\"],[[\\\"name\\\"],[[28,[\\\"contact\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.more\\\"],null],null],[16,\\\"class\\\",[34,[\\\"btn btn-link btn-dropdown show-more \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null],\\\"hide\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isExternal\\\"]],[33,[\\\"not\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"shouldTether\\\"]],\\\"entity-contact-dropdown-menu\\\"],null]]]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.phone\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"digitalFirstPURE2942\\\"]],[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"phoneEnabled\\\"]]],null]],null],\\\"disable-call\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\",\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"data\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry \\\",[33,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneServiceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"voice\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[26,[\\\"callTitle\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\",[28,[\\\"phone\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"phone\\\",\\\"rel\\\",\\\"e164\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"phone\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phone\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"list-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.email\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isExternalContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"entry email \\\",[33,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"primary\\\"]],\\\"primary\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"recordRecentContact\\\",\\\"email\\\",[28,[\\\"email\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"data\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],[[\\\"key\\\"],[\\\"@index\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entry email primary\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"email\\\",\\\"value\\\"]],\\\"mailto\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isExternalContact\\\"]]],null],[33,[\\\"or\\\"],[[28,[\\\"chatEnabled\\\"]],[28,[\\\"person\\\",\\\"id\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"action-buttons\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"chatEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.chatContact\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"class\\\",[34,[\\\"btn btn-default action-button \\\",[33,[\\\"if\\\"],[[28,[\\\"hideChat\\\"]],\\\"hidden\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"components.entities.chat\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"startChat\\\"]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"toolbar-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.chat\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"personIsDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-deleted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"person.deleted\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfileSr\\\"],[[\\\"name\\\"],[[28,[\\\"person\\\",\\\"name\\\"]]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],null],[15,\\\"class\\\",\\\"btn btn-default action-button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendToProfile\\\"]],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flex\\\"],[13],[0,\\\"\\\\n                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"person.profile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"flaggingSupportEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-actions\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flagInteraction\\\",[33,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]],\\\"unflag\\\",\\\"flag\\\"],null]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"flagOperationInProcess\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"didFlag\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"flag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-contact/template.hbs\"}});","define(\"connections-ui/components/entity-favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"/IJ0Gtoh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"saving\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.saveObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"save-section\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[16,\\\"disabled\\\",[26,[\\\"disableSave\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveSection\\\"],null],null],[16,\\\"data-t\\\",[34,[\\\"btn-save-\\\",[26,[\\\"sectionKey\\\"]]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.saveObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"cancelling\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.cancelEditObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"cancel-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.cancelEditObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"hideFooterRemoveButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"remove-section\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmRemoveSection\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-footer/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"IcVORgWW\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-header \\\",[33,[\\\"if\\\"],[[28,[\\\"showInstructionText\\\"]],\\\"show-instruction-text\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[28,[\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[15,\\\"class\\\",\\\"title\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"3\\\"],[13],[1,[26,[\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEditAction\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-action\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.editObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"sectionName\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.section\\\"],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"editSection\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showHeaderLock\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"lock\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lock\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showAddNew\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/add-new\\\"],null,[[\\\"section\\\",\\\"fieldValues\\\",\\\"disableDropdown\\\",\\\"modal\\\",\\\"addNewEntry\\\",\\\"toggleAddValue\\\"],[[28,[\\\"section\\\"]],[28,[\\\"fieldValuesToAdd\\\"]],[28,[\\\"disableAddValueDropdown\\\"]],[28,[\\\"modal\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/-section-header/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { on, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-new'],\n    classNameBindings: ['hide'],\n\n    attrs: {\n        section: null,\n\n        fieldValues: [],\n        disableDropdown: false,\n\n        toggleAddValue: null,\n        addNewEntry: () => {}\n    },\n\n    fieldValues: [],\n\n    showDropdown: false,\n\n    actions: {\n        addNewEntry(value) {\n            this.attrs.addNewEntry(value);\n            this.set('showDropdown', false);\n        },\n\n        toggleAddValue() {\n            if (this.get('disableDropdown')) {\n                this.attrs.toggleAddValue();\n            } else {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    hide: computed('fieldValues.[]', function () {\n        return _.isEmpty(this.get('fieldValues'));\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-new').length) {\n                    this.set('showDropdown', false);\n                }\n            });\n        });\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"7sTvc25t\",\"block\":\"{\\\"statements\\\":[[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"add-new-button\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddValue\\\"],null],null],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"disableDropdown\\\"]],[33,[\\\"t\\\"],[\\\"common.addNewObjectToList\\\"],[[\\\"name\\\",\\\"list\\\"],[[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]],[33,[\\\"t\\\"],[\\\"fieldSection.selectTypeToAddToList\\\"],[[\\\"list\\\"],[[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.addNew\\\"],null],false],[0,\\\"\\\\n\\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu add-new-dropdown \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldValues\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"entity-list-item\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"add-new-entity-\\\",[28,[\\\"fieldValue\\\",\\\"fieldPathClass\\\"]]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.addNewObjectToList\\\"],[[\\\"name\\\",\\\"list\\\"],[[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"fieldValue\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"fieldValue\\\",\\\"i18nLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldValue\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/add-new/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport curry from 'lodash/curry';\nimport groupBy from 'lodash/groupBy';\nimport isEmpty from 'lodash/isEmpty';\nimport map from 'lodash/map';\nimport reject from 'lodash/reject';\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { rerunLayouts } from '../../utils/masonry';\nimport FieldData from '../entity-profile/profiles/field-data';\nimport Profile from '../entity-profile/profiles/profile';\n\nconst { on, run, inject, getOwner, computed, observer, Component } = Ember;\n\nconst EXCLUDE_TYPES = ['image', 'reference'];\n\nfunction filterExcludedField(excludedFields, field) {\n    if (!excludedFields) {\n        return true;\n    }\n    return EXCLUDE_TYPES.indexOf(field.type) === -1 && excludedFields.indexOf(field.key) === -1;\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['entity-field-section', 'content'],\n    classNameBindings: ['section.key', 'editing'],\n    attributeBindings: ['tabindex:tabindex', 'ariaLabelledby:aria-labelledby'],\n    tabindex: '-1',\n    ariaLabelledby: computed('section.key', function () {\n        const sectionKey = this.get('section.key');\n        return sectionKey ? `${sectionKey}-section` : null;\n    }),\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    // required\n    entity: null,\n    sectionInfo: null,\n\n    // public\n    hideHeader: false,\n    editingProfile: false,\n    scrollOnAddNew: true,\n    excludedFields: [],\n    excludedEditingFields: [],\n\n    attrs: {\n        entity: null,\n        sectionInfo: null,\n\n        hideHeader: false,\n        editingProfile: false,\n        excludedFields: [],\n        excludedEditingFields: [],\n\n        removeSection: () => {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n    sectionName: computed.reads('section.sectionName'),\n    sectionKey: computed.reads('sectionInfo.section.key'),\n    editingSection: computed.alias('sectionInfo.editingSection'),\n\n    editing: computed.and('editingSection', 'editingProfile'),\n\n    // others\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: computed.reads('permissions.canViewCollaborateVideo'),\n    saving: false,\n    showModal: false,\n    cancelling: false,\n    hideEmptyValues: true,\n    showInstructionText: false,\n    disableAddValueDropdown: false,\n\n    showRemoveSectionModal: false,\n\n    fallbackToEmptyLabel: false,\n\n    hideFooterRemoveButton: false,\n\n    timer: null,\n\n    // legacy support\n    isEditing: computed.alias('editing'),\n\n    actions: {\n        toggleInstructionText() {\n            this.toggleProperty('showInstructionText');\n        },\n\n        editSection() {\n            this.set('editingSection', true);\n            this.updateMasonry();\n\n            if (this.get('hideFooterRemoveButton')) {\n                return;\n            }\n\n            const key = this.get('section.key');\n            if (this.get('profile.writeableSections').includes(key)) {\n                const readableFields = this.get('profile').getReadableFieldPathsForSection(this.get('section'));\n                const writeableFields = this.get('profile').getEditableFieldPathsForSection(this.get('section'));\n\n                this.set('hideFooterRemoveButton', readableFields.length !== writeableFields.length);\n            }\n        },\n\n        saveSection() {\n            this.saveSection()\n                .then(() => {\n                    this.set('editingSection', false);\n                    this.updateMasonry();\n                })\n                .catch(err => {\n                    this.logger.error('Error saving field section:', { err });\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    Ember.run.once(this, 'reconcileNewFields');\n                    const focusTarget = '.add-section button:first';\n                    doFocus(Ember, focusTarget);\n                });\n        },\n\n        cancel() {\n            this.set('cancelling', true);\n\n            this.reset().finally(\n                Ember.run.bind(this, () => {\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    this.set('editingSection', false);\n                    this.set('cancelling', false);\n\n                    if (this.cancelEditElocation) {\n                        this.cancelEditElocation();\n                    }\n\n                    Ember.run.scheduleOnce('afterRender', this, function () {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n\n                        let top = this.$().position().top;\n                        Ember.$('#orgspan').animate(\n                            {\n                                scrollTop: top\n                            },\n                            600\n                        );\n\n                        this.updateMasonry();\n                        const focusTarget = '.add-section button:first';\n                        doFocus(Ember, focusTarget);\n                    });\n                })\n            );\n        },\n\n        addNewEntry(field) {\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n\n            entity.set(path, '');\n\n            const valueReference = [].concat(entity.get(path)).pop();\n\n            const fieldData = FieldData.create({\n                entity,\n                field,\n                valueReference,\n                session: this.get('session')\n            });\n\n            this.get('fieldData').pushObject(fieldData);\n            this.get('_newFields').pushObject(fieldData);\n\n            this.notifyPropertyChange('groupedFieldData');\n\n            if (this.get('scrollOnAddNew')) {\n                Ember.run.scheduleOnce('afterRender', this, this.scrollToNewField, fieldData);\n            }\n\n            this.updateMasonry();\n        },\n\n        removeEntry(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        removeContactSection(fieldData) {\n            this.removeEntryFromFieldData(fieldData);\n        },\n\n        confirmRemoveSection() {\n            this.set('showRemoveSectionModal', true);\n            const focusTarget = '.remove-section-confirmation button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        cancelRemoveSection() {\n            this.set('showRemoveSectionModal', false);\n            const focusTarget = '.add-section button:first';\n            doFocus(Ember, focusTarget);\n        },\n\n        removeSection() {\n            let entity = this.get('entity');\n            let fieldList = this.get('section.fieldList');\n            fieldList.forEach(field => {\n                let path = field.get('fieldPath');\n                if (entity.get(path) && !field.get('required')) {\n                    entity.set(path, [], { overwrite: true });\n                }\n            });\n\n            return this.saveSection().then(() => {\n                this.set('sectionInfo.adding', false);\n                this.set('sectionInfo.editingSection', false);\n\n                if (isEmpty(fieldList.filterBy('required'))) {\n                    this.attrs.removeSection(this.get('sectionInfo'));\n                }\n\n                this.send('cancelRemoveSection');\n            });\n        },\n\n        toggleAddValue: () => {}\n    },\n\n    removeEntryFromFieldData(fieldData) {\n        let entity = this.get('entity');\n        let field = fieldData.get('field');\n        let entry = fieldData.get('entry');\n        let path = field.getFieldPath();\n\n        this.get('fieldData').removeObject(fieldData);\n        this.get('_newFields').removeObject(fieldData);\n\n        entity.getFieldValue(path).removeObject(entry);\n        this.updateMasonry();\n    },\n\n    _groupedFieldData: null,\n    _newFields: null,\n\n    init() {\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        // Ensure section exists\n        if (section && section.key) {\n            if (entity.get(section.key) === undefined) {\n                entity.set(section.key, {});\n            }\n\n            const sectionData = entity.get(section.key);\n            const fieldPath = this.get('field') && this.get('field.key');\n\n            if (fieldPath && !Ember.get(sectionData, fieldPath)) {\n                const fullPath = `${section.key}.${fieldPath}`;\n                Ember.run.once(entity, entity.set, fullPath, [], { overwrite: true });\n            }\n        }\n\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        Ember.run.cancel(this.timer);\n    },\n\n    setupCacheValues: on('init', function () {\n        this.setProperties({\n            _groupedFieldData: [],\n            _newFields: []\n        });\n    }),\n\n    instructionTextTooltipOnInsert: on('didInsertElement', function () {\n        this.timer = run.scheduleOnce('afterRender', this, 'setupInstructionText');\n    }),\n\n    isViewMode: computed.not('editingProfile'),\n\n    ownProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    filteredFields: computed('entity.id', 'section', 'excludedFields.[]', 'profile.readableSections.[]', function () {\n        let section = this.get('section');\n        let fieldList = section.get('fieldList');\n        let isSuper = this.get('session.user.isAdmin') && !this.get('session.user.personId');\n\n        let fields = [],\n            filteredFields = [];\n        let excludedFields = this.get('excludedFields');\n        let excludedFieldsFilter = curry(filterExcludedField)(excludedFields);\n\n        if (isSuper) {\n            filteredFields = fieldList.filter(excludedFieldsFilter);\n        } else {\n            let readableFieldPaths = this.get('profile').getReadableFieldPathsForSection(section);\n\n            filteredFields = fieldList\n                .filter(excludedFieldsFilter)\n                .filter(field => {\n                    let section = this.get('section');\n                    let fieldPath = field.get('fieldPath');\n                    if (!section) {\n                        return false;\n                    }\n                    return readableFieldPaths.indexOf(fieldPath) !== -1;\n                })\n                .filter(field => {\n                    return field.type !== 'group';\n                });\n        }\n\n        fields.addObjects(filteredFields);\n\n        return fields;\n    }),\n\n    fieldData: computed('entity.id', 'filteredFields.[]', 'editingSection', '_newFields.[]', function () {\n        const filteredFields = this.get('filteredFields');\n        return this.getFieldEntries(filteredFields);\n    }),\n\n    groupedFieldData: computed('fieldData.[]', 'fieldData.length', function () {\n        const fieldData = this.get('fieldData');\n        const groupedData = groupBy(fieldData, data => data.get('field.key'));\n        return map(groupedData, (data, key) => ({ key, fieldData: data }));\n    }),\n\n    instructionText: computed('intl.isoLocale', function () {\n        const intl = this.get('intl');\n        const section = this.get('section').getI18nKey();\n        const key = `${section}_instructionText`;\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('section.instructionText');\n        }\n    }),\n\n    fieldValuesToAdd: computed('filteredFields.[]', function () {\n        let fields = this.get('filteredFields');\n        return fields.filterBy('repeatable');\n    }),\n\n    fieldSectionHasData: computed('fields.@each.isEmpty', 'editing', function () {\n        if (this.get('editing')) {\n            return true;\n        }\n\n        const fields = this.get('fieldData') || [];\n        return fields.some(field => !field.get('isEmpty'));\n    }),\n\n    canEditSection: computed(\n        'editingProfile',\n        'entity.id',\n        'session.user.isAdmin',\n        'profile.writeableSections.[]',\n        function () {\n            let editingProfile = this.get('editingProfile');\n            let permissions = this.get('profile.writeableSections');\n\n            if (this.get('session.user.isAdmin') && editingProfile) {\n                return true;\n            }\n\n            return permissions.indexOf(this.get('section.key')) !== -1 && editingProfile;\n        }\n    ),\n\n    hideAddNew: computed('section.key', 'section.fieldList', function () {\n        const sections = ['location', 'education', 'bio'];\n        return (\n            !sections.includes(this.get('section.key')) && isEmpty(this.get('section.fieldList').filterBy('repeatable'))\n        );\n    }),\n\n    disableSave: computed('entity.type', 'fieldData.@each.{isValid,isEmpty}', function () {\n        const fieldData = this.get('fieldData');\n        const isGroup = this.get('entity.type') === 'group';\n        const validFields = fieldData.map(data => {\n            const emptyCheck = ['weblink', 'email'];\n\n            if (emptyCheck.includes(data.get('field.type')) && !isGroup) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return reject(validFields).length > 0;\n    }),\n\n    showEditAction: computed('canEditSection', 'editingProfile', 'editingSection', function () {\n        const canEditSection = this.get('canEditSection');\n        const editingProfile = this.get('editingProfile');\n        const editingSection = this.get('editingSection');\n\n        return canEditSection && editingProfile && !editingSection;\n    }),\n\n    showHeaderLock: computed('editingProfile', 'canEditSection', function () {\n        return this.get('editingProfile') && !this.get('canEditSection');\n    }),\n\n    showAddNew: computed('editing', 'hideAddNew', function () {\n        return this.get('editing') && !this.get('hideAddNew');\n    }),\n\n    onEditingChange: observer('editingProfile', function () {\n        Ember.run.once(this, 'handleEditingChange');\n    }),\n\n    onValidityChange: observer('disableSave', function () {\n        const disableModal = this.get('disableModal');\n        if (disableModal) {\n            Ember.run.once(this, disableModal, this.get('disableSave'));\n        }\n    }),\n\n    getFieldEntries(fields) {\n        return fields\n            .map(field => {\n                const entity = this.get('entity');\n                const path = field.get('fieldPath');\n                const repeatable = Ember.get(field, 'repeatable');\n\n                let values = this.get('entity').getFieldValue(path) || [];\n\n                if (isEmpty(values) && !this.get('hideEmptyValues')) {\n                    entity.set(path, '');\n                    values = entity.get(path);\n                }\n\n                if (repeatable) {\n                    return values.map(valueReference =>\n                        FieldData.create({\n                            entity,\n                            field,\n                            valueReference,\n                            session: this.get('session'),\n                            permissions: this.get('permissions')\n                        })\n                    );\n                }\n\n                return FieldData.create({\n                    entity,\n                    field,\n                    valueReference: values,\n                    session: this.get('session'),\n                    permissions: this.get('permissions')\n                });\n            })\n            .flat()\n            .filter(v => !!v);\n    },\n\n    handleEditingChange() {\n        this.set('editingSection', false);\n    },\n\n    reconcileNewFields() {\n        this.set('_newFields', []);\n    },\n\n    saveSection(reload = true) {\n        const intl = this.get('intl');\n        const notification = this.get('notification');\n        const entity = this.get('entity');\n        const section = this.get('section');\n\n        this.set('saving', true);\n\n        return entity\n            .saveSection(section)\n            .then(() => {\n                if (reload) {\n                    entity.reload();\n                }\n\n                if (Ember.get(section, 'key') === 'contactInfo' && this.get('session.features.emergencyLocation')) {\n                    return;\n                }\n                const title = intl.lookup('notification.titles.profileSave');\n                const message = intl.lookup('notification.fieldSection.saved');\n\n                notification.info(title, message, { markdownToHtml: false, tag: 'profile' });\n            })\n            .catch(response => {\n                const errors = response.errors || response.payload;\n                const error = !isEmpty(errors) && errors[0];\n\n                this.set('saving', false);\n\n                if (!error) {\n                    return Ember.RSVP.reject(response);\n                }\n\n                if (error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                    return Ember.RSVP.resolve();\n                }\n\n                const statusCode = error.code || error.status;\n                if (statusCode) {\n                    const errorTitle = intl.lookup('notification.titles.profileSaveError');\n                    let errorMessage =\n                        error && error.detail ? error.detail : intl.lookup('notification.fieldSection.error');\n                    if (statusCode === 403) {\n                        errorMessage = intl.lookup('notification.fieldSection.forbidden');\n                    } else if (statusCode === 500 || statusCode === 400) {\n                        const title = error.title || (error.details && error.details.title);\n                        if (title) {\n                            // Check if its a duplicate error and let the user know\n                            const regex = /Duplicate value (?:.*) (.*)=[\\S]+/;\n                            const match = title.match(regex);\n                            if (match && match[1]) {\n                                const field = match[1];\n                                if (field === 'contactInfo.email_main') {\n                                    errorMessage = intl.lookup('notification.fieldSection.duplicateEmailError');\n                                }\n                            }\n                        }\n                    }\n\n                    notification.error(errorTitle, errorMessage, { markdownToHtml: false, tag: 'profile' });\n\n                    this.reset();\n                }\n\n                return Ember.RSVP.reject(response);\n            });\n    },\n\n    reset() {\n        return this.get('entity')\n            .reload()\n            .then(() => {\n                this.notifyPropertyChange('section');\n\n                let entity = this.get('entity');\n                let fieldPaths = this.get('section.fieldList').mapBy('fieldPath');\n                fieldPaths.forEach(path => {\n                    let currentValue = entity.getFieldValue(path);\n                    if (Array.isArray(currentValue)) {\n                        const tempValues = currentValue.filter(value => !!value.tempId);\n                        if (tempValues.length && currentValue.length) {\n                            entity.set(path, [], { overwrite: true });\n                        } else if (tempValues.length) {\n                            tempValues.forEach(value => {\n                                currentValue.removeObject(value);\n                            });\n                        }\n                    } else if (currentValue.tempId && !currentValue._id) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n            });\n    },\n\n    scrollToNewField(fieldData) {\n        let elem = this.$().find(`[data-field-id=${fieldData.get('fieldId')}]`);\n        let parent = elem.parents('.field-section');\n        if (!isEmpty(elem)) {\n            let top = elem.position().top;\n            let parentTop = parent.position().top;\n            Ember.$('#orgspan').animate(\n                {\n                    scrollTop: top + parentTop\n                },\n                600\n            );\n        }\n    },\n\n    setupInstructionText() {\n        let text = this.get('instructionText');\n        if (text) {\n            this.$('.title').tooltip({\n                title: text,\n                placement: 'right'\n            });\n        }\n    },\n\n    _updateMasonry() {\n        rerunLayouts();\n    },\n\n    updateMasonry() {\n        Ember.run(() => Ember.run.scheduleOnce('afterRender', this, this._updateMasonry));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.delete[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport EmergencyLocationUtil from 'connections-ui/utils/emergency-location-util';\n\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nimport ContactInfoGroup from './contact-info-group';\n\nconst { inject, computed } = Ember;\n\nfunction keyForField(field) {\n    let type = field.type;\n    let key = field.key;\n\n    if (_.includes(['email', 'phone', 'address'], type)) {\n        return type;\n    } else if (_.includes(['im', 'address'], key) || type === 'multiline-text') {\n        return key;\n    } else {\n        return 'other';\n    }\n}\n\nexport default EntityFieldSection.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    hideAddNew: false,\n    hideEmptyValues: true,\n    hideFooterRemoveButton: true,\n    updatedElocationAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressisEligible: false,\n\n    excludedFields: ['chat', 'voicemailEnabled'],\n\n    _groupedContactInfo: null,\n\n    actions: {\n        editSection() {\n            if (this.editElocation && this.get('session.features.emergencyLocation')) {\n                this.editElocation();\n            }\n            this._super(...arguments);\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const entity = this.get('entity');\n            const primaryContactSection = this.get('entity.fieldConfig.primaryContactInfo');\n            const latestPrimaryContactInfo = _.clone(this.get('entity.primaryContactInfo'));\n\n            this.logger.debug('[contact-info] saveSection: captured latest primary contact snapshot (deep clone)');\n\n            this.set('saving', true);\n\n            this.saveSection(false)\n                .then(() => {\n                    this.logger.debug('[contact-info] saveSection: contactInfo saved');\n\n                    // cant set non-existent fields as primary...so delay primary saving\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('saving', false);\n                        this.set('editingSection', false);\n                    }\n                    return this.reconcilePrimaryContact(latestPrimaryContactInfo);\n                })\n                .then(() => {\n                    this.logger.debug('[contact-info] saveSection: about to save primaryContactInfo section');\n                    return entity.saveSection(primaryContactSection);\n                })\n                .then(() => {\n                    const errorField = this.get('_newFields').find(field => {\n                        return !_.isEmpty(field.get('value.rel.errorCode'));\n                    });\n\n                    if (errorField) {\n                        const title = intl.lookup('notification.titles.profileContactInfoError');\n                        const message = intl.lookup('notification.fieldSection.contactInfoError');\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    entity.reload();\n\n                    Ember.run.once(this, 'reconcileNewFields');\n\n                    if (this.get('session.features.emergencyLocation')) {\n                        const isAddressEmpty =\n                            !this.get('updatedElocationAddress.city') &&\n                            !this.get('updatedElocationAddress.street1') &&\n                            !this.get('updatedElocationAddress.street2') &&\n                            !this.get('updatedElocationAddress.state') &&\n                            !this.get('updatedElocationAddress.zipcode');\n\n                        if (this.saveElocation && !isAddressEmpty) {\n                            return this.saveElocation(this.get('updatedElocationAddress'));\n                        } else if (this.refreshAllEmergencylocationInfo) {\n                            //Should run this in case user changes from a primary number that is not E911 capable to one that is.\n                            return this.refreshAllEmergencylocationInfo(true); //notify=true\n                        }\n                    } else {\n                        return Ember.RSVP.resolve();\n                    }\n                })\n                .then(() => {\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('notification.titles.profileSave');\n                        const message = intl.lookup('notification.fieldSection.saved');\n                        this.get('notification').info(title, message, { markdownToHtml: false, tag: 'profile' });\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                    }\n                })\n                .catch(errObject => {\n                    if (errObject.softError && !errObject.hardError) {\n                        //If only inline custom errors\n                        //softError are handled in the service\n                        if (this.cancelEditElocation) {\n                            this.cancelEditElocation();\n                        }\n                        this.set('editingSection', false);\n                        return;\n                    }\n                    if (this.get('session.features.emergencyLocation')) {\n                        const title = intl.lookup('emergencyLocation.errors.title');\n                        const hardErrorMessage = errObject.hardError ? errObject.hardError : '';\n                        const defaultErrorMessage = intl.lookup('emergencyLocation.errors.e911LocationSet');\n\n                        const message = hardErrorMessage || defaultErrorMessage;\n                        this.get('notification').error(title, message);\n                    }\n                })\n                .finally(() => {\n                    this.set('saving', false);\n                    if (!this.get('session.features.emergencyLocation')) {\n                        this.set('editingSection', false);\n                    }\n                });\n        },\n\n        updateElocationOnChange(updatedAddress) {\n            this.set('updatedElocationAddress', updatedAddress);\n        },\n\n        addNewEntry(group) {\n            const field = group.get('field') || group.get('repeatableField') || group;\n            this._super(field);\n\n            // Move focus to the newly added entry's first focusable element\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                const groupKey = group.get('key');\n                const entries = this.$(`fieldset.contact-info-${groupKey}-type .group-values .field-entry`);\n                if (entries && entries.length) {\n                    const lastEntry = entries.last();\n                    const focusable = lastEntry.find('input, select, textarea, [tabindex=\"0\"]').first();\n                    if (focusable.length) {\n                        focusable.focus();\n                    }\n                }\n            });\n        },\n\n        removeContactSection(fieldData, group) {\n            _.forEach(fieldData, field => {\n                this._super(field);\n            });\n\n            const groupedFieldData = this.get('_groupedContactInfo');\n            if (groupedFieldData) {\n                groupedFieldData.removeObject(group);\n            }\n\n            // After removing a section, move focus to the next available group or the section heading\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                // Try to focus the next fieldset's first focusable element\n                const remainingFieldsets = this.$('fieldset.field-entries:not(.empty-group)');\n                if (remainingFieldsets && remainingFieldsets.length) {\n                    const focusable = remainingFieldsets\n                        .first()\n                        .find('input, select, textarea, button, [tabindex=\"0\"]')\n                        .first();\n                    if (focusable.length) {\n                        focusable.focus();\n                        return;\n                    }\n                }\n                // Fallback: focus the section itself\n                if (this.$()) {\n                    this.$().focus();\n                }\n            });\n        },\n\n        removeEntry(fieldData) {\n            let key = keyForField(fieldData.get('field'));\n            let group = this.get('groupedContactInfo').findBy('key', key);\n            if (group) {\n                group.get('fieldData').removeObject(fieldData);\n\n                if (fieldData.get('isPrimaryField')) {\n                    this.removePrimaryContact(fieldData);\n                }\n\n                this._super(...arguments);\n\n                // After removing, move focus to the group's \"Add New\" button or the next remaining entry\n                Ember.run.scheduleOnce('afterRender', this, function () {\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n                    const groupFieldset = this.$(`fieldset.contact-info-${key}-type`);\n                    if (groupFieldset && groupFieldset.length) {\n                        // Try focusing the next remaining entry's remove button or input\n                        const remainingEntries = groupFieldset.find('.group-values .field-entry');\n                        if (remainingEntries.length) {\n                            const focusable = remainingEntries\n                                .last()\n                                .find('input, select, textarea, button, [tabindex=\"0\"]')\n                                .first();\n                            if (focusable.length) {\n                                focusable.focus();\n                                return;\n                            }\n                        }\n                        // Fallback: focus the \"Add New\" button for this group\n                        const addButton = groupFieldset.find('.add-new-value button');\n                        if (addButton.length) {\n                            addButton.focus();\n                            return;\n                        }\n                    }\n                    // Final fallback: focus the section itself\n                    if (this.$()) {\n                        this.$().focus();\n                    }\n                });\n            }\n        },\n        setPrimaryCallback(phoneNumber) {\n            if (!this.get('session.features.emergencyLocation')) {\n                return;\n            }\n            if (this.getEmergencyLocation) {\n                this.getEmergencyLocation(phoneNumber)\n                    .then(response => {\n                        this.set('previewAddressIsEligible', true);\n                        this.set('previewAddress', response.address);\n                    })\n                    .catch(err => {\n                        this.set('previewAddressIsEligible', false);\n                        this.set('previewAddress', {\n                            street1: '',\n                            street2: '',\n                            city: '',\n                            state: '',\n                            zipcode: '',\n                            country: ''\n                        });\n\n                        const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                        this.set('previewAddressError', errorMessage);\n                    });\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_groupedContactInfo', []);\n    },\n\n    didReceiveAttrs() {\n        const editingElocation = this.get('editingElocation');\n        if (this.get('session.features.emergencyLocation') && editingElocation) {\n            this.get('setEditingSection').perform(editingElocation);\n        }\n    },\n\n    setEditingSection: task(function* (editingElocation) {\n        yield waitForQueue('actions');\n        this.set('editingSection', editingElocation);\n        const phoneNumber =\n            this.get('emergencyLocationData.primaryVoice.number') ||\n            this.get('emergencyLocationData.primaryVoice.display');\n        if (phoneNumber) {\n            this.get('actions.setPrimaryCallback').call(this, phoneNumber);\n        }\n    }).restartable(),\n\n    groupedContactInfo: computed('entity.id', 'fieldData', 'fieldData.[]', 'fieldData.@each.', function () {\n        return this.handleData(this.get('fieldData'));\n    }),\n\n    missingData: computed('filteredFields.[]', 'fieldData.[]', function () {\n        let fields = this.get('filteredFields');\n        let fieldData = this.get('fieldData');\n        let missingFields = _.difference(fields, fieldData.mapBy('field'));\n        return _.reject(missingFields, field => {\n            let type = field.get('type');\n            return fieldData.filterBy('field.type', type).length > 0;\n        });\n    }),\n\n    fieldValuesToAdd: computed('missingData.[]', function () {\n        let fields = this.get('missingData');\n        return fields.filterBy('repeatable');\n    }),\n\n    disableSave: computed('groupedContactInfo.@each.disableSave', function () {\n        const fieldData = this.get('groupedContactInfo');\n        const disableSave = fieldData.mapBy('disableSave');\n        return _.filter(disableSave).length > 0;\n    }),\n\n    handleData(data) {\n        return _.chain(data)\n            .groupBy(fieldData => {\n                return keyForField(fieldData.get('field'));\n            })\n            .map((fieldData, key) => {\n                let data = {\n                    key,\n                    fieldData,\n                    section: this.get('section')\n                };\n\n                Ember.setOwner(data, Ember.getOwner(this));\n\n                return ContactInfoGroup.create(data);\n            })\n            .filter()\n            .value();\n    },\n\n    removePrimaryContact(fieldData) {\n        let entity = this.get('entity');\n        let type = fieldData.get('field.type');\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        entity.set(path, [], { overwrite: true });\n    },\n\n    reconcilePrimaryContact(latestPrimaryContactInfo) {\n        let fields = this.get('fieldData');\n        let entity = this.get('entity');\n        let primaryContactCollection = [];\n        fields.rejectBy('isEmpty').forEach(fieldData => {\n            let type = fieldData.get('field.type');\n            if (type === 'phone') {\n                type = 'voice';\n            }\n\n            let primary = Ember.get(latestPrimaryContactInfo, type);\n            this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            if (type === 'voice') {\n                // run the voice primary checks for SMS as well\n                type = 'sms';\n                primary = Ember.get(latestPrimaryContactInfo, type);\n                this._storePrimary(primary, type, fieldData, primaryContactCollection);\n            }\n        });\n\n        this.logger.debug('[contact-info] reconcilePrimaryContact: matched primary contacts to re-apply after reload', {\n            matchCount: primaryContactCollection.length,\n            matches: primaryContactCollection.map(c => ({\n                type: c.type,\n                fieldPath: c.fieldPath,\n                fieldId: c.fieldData && c.fieldData.get('fieldId')\n            }))\n        });\n\n        return entity.reload().then(() => {\n            this.logger.debug('[contact-info] reconcilePrimaryContact: entity reloaded, before re-apply');\n\n            _.forEach(primaryContactCollection, contact => {\n                entity.setPrimaryContact(contact.type, contact.value, contact.fieldPath, contact.fieldData);\n            });\n\n            this.logger.debug('[contact-info] reconcilePrimaryContact: re-applied primary after reload');\n        });\n    },\n\n    _storePrimary(primary, type, fieldData, collection) {\n        if (_.isEmpty(primary)) {\n            return;\n        }\n        let fieldPath = fieldData.get('field.fieldPath');\n        let fieldDataId = fieldData.get('fieldId');\n        primary = primary[0];\n\n        let equalFieldIds = primary.value.fieldId === fieldDataId;\n        let equalFieldPaths = primary.value.fieldPath === fieldPath;\n\n        this.logger.debug('[contact-info] _storePrimary: evaluating field against snapshot primary', {\n            type,\n            fieldPath,\n            fieldDataId,\n            snapshotFieldId: primary.value.fieldId,\n            snapshotFieldPath: primary.value.fieldPath,\n            equalFieldIds,\n            equalFieldPaths\n        });\n\n        // When the field ids don't match but the field paths do, we need to fall back to matching by\n        // value. This happens for:\n        //  - Brand new fields, which have a temp id generated using Ember.generateGuid ('ember...')\n        //  - Existing fields whose _id was regenerated by the server during the contactInfo save\n        //    (the snapshot captured the old _id, so it no longer equals the reloaded entry's _id)\n        if (!equalFieldIds && equalFieldPaths) {\n            const value = fieldData.get('value.value');\n            let valueMatches = false;\n\n            if (_.isObject(primary.ref) && _.isObject(value)) {\n                // Phone-style values: compare by number and/or extension\n                let valueNumber = value.number;\n                let primaryNumber = primary.ref.number;\n\n                // Sometimes we will have formatting\n                if (valueNumber && valueNumber.replace) {\n                    valueNumber = valueNumber.replace(/[-\\s]/gi, '');\n                }\n                if (primaryNumber && primaryNumber.replace) {\n                    primaryNumber = primaryNumber.replace(/[-\\s]/gi, '');\n                }\n\n                // Only match by extension when the primary actually has an extension. Otherwise two\n                // entries that both lack an extension ('' === '') would falsely match.\n                const extensionMatches = !!primary.ref.extension && primary.ref.extension === value.extension;\n                const numberMatches = !!primaryNumber && primaryNumber === valueNumber;\n                valueMatches = extensionMatches || numberMatches;\n            } else {\n                // Simple string values (e.g. email): compare directly\n                valueMatches = !_.isEmpty(primary.ref) && primary.ref === value;\n            }\n\n            if (valueMatches) {\n                this.logger.debug('[contact-info] _storePrimary: matched field by value', {\n                    type,\n                    fieldPath\n                });\n                collection.push({\n                    type,\n                    fieldPath,\n                    fieldData,\n                    value: fieldData.get('value')\n                });\n            } else {\n                this.logger.debug('[contact-info] _storePrimary: field did not match by value; primary may be lost', {\n                    type,\n                    fieldPath\n                });\n            }\n        } else if (primary.value && equalFieldPaths && equalFieldIds) {\n            this.logger.debug('[contact-info] _storePrimary: matched existing field by id + path', {\n                type,\n                fieldPath,\n                fieldDataId\n            });\n            collection.push({\n                type,\n                fieldPath,\n                fieldData,\n                value: fieldData.get('value')\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['contact-group-choices'],\n\n    entity: null,\n\n    field: null,\n    entry: null,\n\n    showDropdown: false,\n\n    currentLabel: computed.reads('field.i18nLabel'),\n\n    fieldChoices: computed('field', 'entry', function () {\n        let keys = this.get('field.labelKeys');\n        let entity = this.get('entity');\n        let field = this.get('field');\n        let path = field.get('fieldPath').replace(/\\./gi, '_');\n        return _.map(keys, function (key) {\n            return {\n                field,\n                keyPath: `${entity.get('type')}_${path}_labelKey_${key}`\n            };\n        });\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"a/PgzvrS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showDropdown\\\"]],\\\"entity-field-section.entity-contact-info.contact-group-choices\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"menu-selector dropdown-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"show\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clickable\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"choice\\\",\\\"keyPath\\\"]]],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"currentLabel\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/contact-group-choices/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    key: null,\n    field: null,\n    section: null,\n    fieldData: [],\n\n    label: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.name`);\n    }),\n\n    addNewLabel: computed('key', function () {\n        return this.get('intl').lookup(`entity.fieldTypes.${this.get('key')}.addNew`);\n    }),\n\n    isEmpty: computed('fieldData', 'fieldData.@each.isEmpty', 'field', function () {\n        let emptyFields = this.get('fieldData').mapBy('isEmpty');\n        return emptyFields && _.reject(emptyFields).length === 0;\n    }),\n\n    containsRepeatable: computed('fieldData.[]', 'field', 'repeatableField', function () {\n        let field = this.get('field') || this.get('repeatableField');\n        if (field) {\n            return field.get('repeatable');\n        }\n\n        return this.get('fieldData').filterBy('field.repeatable').length > 0;\n    }),\n\n    repeatableField: computed('fieldData.[]', 'key', 'section', function () {\n        let key = this.get('key');\n        return this.get('section.fieldList')\n            .filterBy('repeatable')\n            .find(function (field) {\n                return field.get('key') === key || field.get('type') === key;\n            });\n    }),\n\n    disableSave: computed('fieldData.[]', 'fieldData.@each.isValid', function () {\n        const fieldData = this.get('fieldData');\n        let validFields = fieldData.map(data => {\n            let emptyCheck = ['weblink', 'email'];\n\n            if (_.includes(emptyCheck, data.get('field.type'))) {\n                return data.get('isValid') && !data.get('isEmpty');\n            }\n\n            return data.get('isValid');\n        });\n\n        return _.reject(validFields).length > 0;\n    }),\n\n    isPhone: computed.equal('key', 'phone'),\n    isEmail: computed.equal('key', 'email'),\n    isIm: computed.equal('key', 'im'),\n    isAddress: computed.equal('key', 'address'),\n\n    showHeadings: computed('isPhone', 'isEmail', 'permissions.canEditProfiles', function () {\n        if (this.get('isEmail')) {\n            return this.get('permissions.canEditProfiles');\n        }\n        return this.get('isPhone');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ceACQLuN\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedContactInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries contact-info-\\\",[28,[\\\"group\\\",\\\"key\\\"]],\\\"-type\\\\n                    \\\",[33,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isEmpty\\\"]],\\\"empty-group\\\"],null],\\\"\\\\n                    \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"group\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label sr-only\\\"],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"group\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isIm\\\"]],[28,[\\\"group\\\",\\\"isAddress\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label remove-section clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"group\\\",\\\"label\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeContactSection\\\",[28,[\\\"group\\\",\\\"fieldData\\\"]],[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"showHeadings\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"headings\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"primary\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isPhone\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[\\\"primary-sms-\\\",[28,[\\\"group\\\",\\\"key\\\"]]]]],[15,\\\"class\\\",\\\"accept-sms\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-values entry-values\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"fieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry\\\\n                                \\\",[28,[\\\"fieldData\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"fieldData\\\",\\\"fieldId\\\"]]]]],[13],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[33,[\\\"eq\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]],\\\"entity-fields/phone-field\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\",\\\"headingLevel\\\",\\\"setPrimaryCallback\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true,5,[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimaryCallback\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"showLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"fieldData\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"and\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"repeatable\\\"]],[28,[\\\"editing\\\"]]],null],[28,[\\\"fieldData\\\",\\\"removable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\",\\\"value\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\",\\\"i18nLabel\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"fieldData\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-value\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"fieldData\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"group\\\",\\\"containsRepeatable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-new-value\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-flat btn-sm add-new-value\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addNewEntry\\\",[28,[\\\"group\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"+\\\"],[14],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"addNewLabel\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"emergencyLocationOn\\\"]],[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content emergency-location-section\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-group entries field-entries\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry text-field \\\",[33,[\\\"if\\\"],[[28,[\\\"editingElocation\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"emergency-location\\\"],null,[[\\\"emergencyLocationData\\\",\\\"editingElocation\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"showTitle\\\",\\\"showTitleIcons\\\",\\\"previewAddress\\\",\\\"previewAddressIsEligible\\\",\\\"previewAddressError\\\",\\\"saving\\\",\\\"updateElocationOnChange\\\"],[[28,[\\\"emergencyLocationData\\\"]],[28,[\\\"editingElocation\\\"]],false,[28,[\\\"personId\\\"]],true,false,[28,[\\\"previewAddress\\\"]],[28,[\\\"previewAddressIsEligible\\\"]],[28,[\\\"previewAddressError\\\"]],[28,[\\\"saving\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateElocationOnChange\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-contact-info/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    layout: template,\n\n    disableAddValueDropdown: true,\n\n    fallbackToEmptyLabel: true,\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        }\n    },\n\n    canAddNew: computed('fieldData.[]', function () {\n        let fieldData = this.get('fieldData');\n        let empties = fieldData.filterBy('isEmpty', true);\n        return empties.length < 1;\n    }),\n\n    disableSave: computed('fieldData.@each.{isValid,isEmpty}', function () {\n        let fieldData = this.get('fieldData');\n        let validFields = fieldData.map(field => {\n            return field.get('isValid') && !field.get('isEmpty');\n        });\n\n        return _.reject(validFields).length > 0;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityFieldSection from '../component';\n\nconst { inject, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-groups'],\n\n    session: inject.service(),\n    application: inject.service(),\n\n    actions: {\n        changeGroups(group) {\n            this.set('showMore', false);\n            this.set('activeKey', group);\n        },\n\n        toggleMore() {\n            this.toggleProperty('showMore');\n        },\n\n        navigateTo(routeType, routeId) {\n            this.get('application').navigateTo(routeType, routeId);\n        }\n    },\n\n    allKeys: null,\n    activeKey: null,\n\n    showMore: false,\n    flowTabsInline: true,\n\n    init() {\n        this._super(...arguments);\n\n        const entity = this.get('entity');\n        const fieldConfig = entity.get('fieldConfig');\n\n        const hasOfficialField = !!fieldConfig.getFieldByKey('groups.official');\n        const hasSocialField = !!fieldConfig.getFieldByKey('groups.social');\n\n        const allKeys = [];\n        if (hasOfficialField) {\n            allKeys.push('official');\n        }\n        if (hasSocialField) {\n            allKeys.push('social');\n        }\n\n        let activeKey = 'official';\n        if (!hasOfficialField) {\n            activeKey = hasSocialField ? 'social' : 'owned';\n        }\n\n        this.setProperties({\n            allKeys,\n            activeKey,\n            hasSocialField,\n            hasOfficialField\n        });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        let section = this.get('sectionInfo');\n        let promises = this.get('allKeys').map(key => this.getGroups(key));\n\n        Ember.RSVP.all(promises).then(function (results) {\n            let groups = _.flatten(results);\n            section.set('isEmpty', groups.length === 0);\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            const title = this.$('.title');\n            const tabs = this.$('.nav-tabs li');\n            if (title && !_.isEmpty(tabs)) {\n                const titleWidth = title.width();\n                const tabWidth = _.chain(tabs)\n                    .map(tab => Ember.$(tab).width())\n                    .reduce((acc, val) => val + acc, 0);\n                this.set('flowTabsInline', tabWidth + titleWidth < this.$().width());\n            }\n        });\n    },\n\n    canEditSection: computed(function () {\n        return false;\n    }),\n\n    activeGroups: computed('entity.id', 'activeKey', 'showMore', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            if (!this.get('showMore')) {\n                return _.slice(groups, 0, 4);\n            }\n            return groups;\n        });\n\n        return DS.PromiseArray.create({ promise });\n    }),\n\n    section: computed('entity.fieldConfig.groups', function () {\n        return this.get('entity.fieldConfig.groups');\n    }),\n\n    shouldShowMore: computed('activeKey', function () {\n        let promise = this.getGroups(this.get('activeKey')).then(groups => {\n            return groups.length > 4;\n        });\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    getGroups(key) {\n        return this.get(`entity.${key}Groups`);\n    },\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"XzRWnkV8\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content tab-container\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs nav-tabs-flex\\\"],[15,\\\"role\\\",\\\"tablist\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasOfficialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-official active\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#official\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"official\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"official\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_official\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"hasSocialField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-social\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#social\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"social\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"social\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"server_translations.group_general_groupType_labelKey_groups_social\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owned\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owned\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[33,[\\\"eq\\\"],[[28,[\\\"activeKey\\\"]],\\\"owned\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeGroups\\\",\\\"owned\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owned\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"activeGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group \\\",[28,[\\\"group\\\",\\\"groupType\\\"]]]]],[16,\\\"title\\\",[28,[\\\"group\\\",\\\"name\\\"]],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"size\\\",\\\"entity\\\",\\\"isLinkable\\\",\\\"enableMiniCard\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[96,[28,[\\\"group\\\"]],true,true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\",\\\"group\\\",[28,[\\\"group\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"group.detail\\\",[28,[\\\"group\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"name\\\"]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupMemberships\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"error\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message error\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.loadError\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-message group-loading-message\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"shouldShowMore\\\"]],[28,[\\\"activeGroups\\\",\\\"isFulfilled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[\\\"show-more-less \\\",[33,[\\\"if\\\"],[[28,[\\\"showMore\\\"]],\\\"showing-more\\\",\\\"showing-less\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleMore\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-groups/template.hbs\"}});","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nimport EntityFieldSection from '../component';\nimport template from '../template';\n\nconst { computed } = Ember;\n\nexport default EntityFieldSection.extend(LoggerMixin, {\n    layout: template,\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    _cachedGroupFieldData: [],\n    _cachedLocations: [],\n\n    actions: {\n        toggleAddValue() {\n            this.send('addNewEntry', this.get('section.fieldList.0'));\n        },\n\n        removeEntry(fieldData) {\n            let entity = this.get('entity');\n            let field = fieldData.get('field');\n            let entry = fieldData.get('entry');\n            let location = fieldData.get('_sectionLocation');\n            let path = field.getFieldPath();\n            let fields = this.get('fieldData');\n            let currentEntry = fields.findBy('_sectionLocation', location);\n\n            fields.removeObject(currentEntry);\n            entity.getFieldValue(path).removeObject(entry);\n        }\n    },\n\n    disableSave: computed(function () {\n        return false;\n    }),\n\n    getFieldEntries() {\n        const entries = this._super(...arguments);\n        return entries.filter(entry => {\n            const value = entry.get('value');\n            if (value.value) {\n                const location = value.value;\n                if (location && !location.locationId) {\n                    this.logger.warn('Location without id encountered. Removing.');\n                    return false;\n                }\n            }\n            return true;\n        });\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport Profile from '../../entity-profile/profiles/profile';\nimport EntityFieldSection from '../component';\n\nimport { BASE_PERSON } from '../../../models/person';\n\nimport RelationshipGroup from './relationship-group';\n\nconst { inject, getOwner, computed } = Ember;\n\nexport default EntityFieldSection.extend({\n    classNames: ['entity-relationships'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    scrollOnAddNew: false,\n    disableAddValueDropdown: true,\n\n    viewingMore: { siblings: false, reports: false },\n\n    _relationships: null,\n\n    actions: {\n        toggleAddValue() {\n            const field = this.get('repeatableField');\n            this.send('addNewEntry', field);\n        },\n\n        addNewEntry(field) {\n            this._super(...arguments);\n\n            const entity = this.get('entity');\n            const path = field.get('fieldPath');\n            const fieldValue = _.last(entity.get(path));\n\n            const count = this.get('otherRelationships.length');\n            const key = this.get('intl').t('person.relationships.relationship', { count: !!count ? count : count + 1 });\n\n            Ember.set(fieldValue, 'labelKey', key);\n            this.set('otherRelationships.lastObject.key', key);\n\n            this.notifyPropertyChange('otherRelationshipValues');\n        },\n\n        updatedField(relationshipGroup) {\n            let excludedFields = this.get('excludedFields');\n            let fieldPath = relationshipGroup.get('fieldPath');\n            if (!fieldPath || relationshipGroup.get('isOtherRelationship')) {\n                return;\n            }\n\n            let fieldKey = fieldPath.split('.')[1];\n            if (relationshipGroup.get('people.length') === 0) {\n                excludedFields.removeObject(fieldKey);\n            } else {\n                excludedFields.addObject(fieldKey);\n            }\n        },\n\n        removeSection() {\n            let reports = this.get('relationships').findBy('key', 'defaultReports');\n            let promise = Ember.RSVP.resolve();\n            if (reports && reports.get('promise')) {\n                promise = reports.get('promise').then(people => {\n                    if (people) {\n                        people.forEach(person => {\n                            reports.removePerson(person);\n                        });\n                    }\n                });\n            }\n\n            return promise.then(() => {\n                let entity = this.get('entity');\n                let fieldList = this.get('section.fieldList');\n                fieldList.forEach(field => {\n                    let path = field.get('fieldPath');\n                    if (entity.get(path)) {\n                        entity.set(path, [], { overwrite: true });\n                    }\n                });\n\n                return this.saveReports()\n                    .then(() => this.saveSection())\n                    .then(() => {\n                        this.set('sectionInfo.adding', false);\n                        this.set('sectionInfo.editingSection', false);\n\n                        this.attrs.removeSection(this.get('sectionInfo'));\n\n                        this.send('cancelRemoveSection');\n                    });\n            });\n        },\n\n        saveSection() {\n            const intl = this.get('intl');\n            const notification = this.get('notification');\n\n            this.set('saving', true);\n\n            this.saveReports()\n                .then(() => this.saveSection())\n                .then(() => {\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n                })\n                .then(() => {\n                    // Cache bust!\n                    this.get('entity').clearDirectReportsCache();\n                })\n                .catch(err => {\n                    const title = intl.lookup('notification.titles.profileSaveError');\n                    const message = intl.lookup('notification.fieldSection.error');\n                    notification.error(title, message);\n\n                    this.set('saving', false);\n                    this.set('editingSection', false);\n\n                    this.reset().then(() => {\n                        this.notifyPropertyChange('allRelationships');\n                    });\n\n                    return Ember.RSVP.reject(err);\n                });\n        },\n\n        updatedLabel() {\n            const fields = this.get('otherRelationships').filter(field => {\n                return _.isEmpty(field.get('label'));\n            });\n            this.set('disableSave', fields.length !== 0);\n        }\n    },\n\n    section: computed('entity.fieldConfig.relationships', function () {\n        return this.get('entity.fieldConfig.relationships');\n    }),\n\n    manager: computed.reads('entity.manager'),\n    management: computed.reads('entity.superiors'),\n    assistants: computed.reads('entity.adminAssistants'),\n    defaultReports: computed.reads('filteredReports'),\n    defaultSiblings: computed.reads('filteredSiblings'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_relationships', []);\n    },\n\n    relationships: computed('entity.id', 'otherRelationships.[]', 'assistants.[]', 'management.[]', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        const cachedGroups = this.get('_relationships');\n        if (cachedGroups && cachedGroups.length > 0) {\n            // Set relationship promise so that reloads can happen if necessary\n            cachedGroups.forEach(group => {\n                const key = group.get('key');\n                const promise = this.get(key);\n                group.set('promise', promise);\n            });\n            return cachedGroups;\n        }\n\n        const groups = relationshipKeys.map(key => {\n            let entity = this.get('entity');\n            let relationship = this.get(key);\n\n            if (!relationship) {\n                return;\n            }\n\n            let data = {\n                key: key,\n                entity: entity,\n                promise: relationship\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n\n        this.set('_relationships', groups);\n\n        return groups;\n    }),\n\n    otherRelationships: computed('otherRelationshipValues', function () {\n        const entity = this.get('entity');\n        const values = this.get('otherRelationshipValues');\n        return Object.keys(values).map(key => {\n            const value = values[key];\n            let promise = Ember.RSVP.resolve([]);\n            const ids = value.mapBy('value').reject(id => !id);\n            if (ids && !_.isEmpty(ids) && ids[0]) {\n                promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n            }\n\n            let data = {\n                key,\n                promise,\n                entity: entity\n            };\n\n            Ember.setOwner(data, Ember.getOwner(this));\n\n            return RelationshipGroup.create(data);\n        });\n    }),\n\n    allRelationships: computed('otherRelationships.[]', function () {\n        return [].concat(this.get('relationships'), this.get('otherRelationships'));\n    }),\n\n    otherRelationshipValues: computed('entity.relationships.relationships.[]', function () {\n        const entity = this.get('entity');\n        const values = entity.getFieldValue('relationships.relationships');\n        // Fallback to incorrect form of \"labelkey\" due to directory bug\n        return _.groupBy(values, v => v.labelKey || v.labelkey);\n    }),\n\n    filteredReports: computed.reads('entity.directReports'),\n    filteredSiblings: computed('entity.siblings', function () {\n        let promise = this.get('entity.siblings').then(siblings => {\n            return siblings.filter(sibling => {\n                return sibling.get('id') !== this.get('entity.id');\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    readableFieldPaths: computed('entity.id', function () {\n        let profile = Profile.getProfileForModel(this.get('entity'), getOwner(this));\n        return profile.getReadableFieldPathsForSection(this.get('section'));\n    }),\n\n    repeatableField: computed('filteredFields.[]', function () {\n        return this.get('filteredFields')\n            .filter(field => {\n                return field.get('repeatable') && field.get('customLabels');\n            })\n            .find(field => {\n                const key = field.get('key');\n                return key === 'relationships';\n            });\n    }),\n\n    hideAddNew: computed('repeatableField', function () {\n        return _.isEmpty(this.get('repeatableField'));\n    }),\n\n    canAddMultiple: computed('repeatableField', function () {\n        return this.get('repeatableField.customLabels');\n    }),\n\n    excludedFields: computed('relationships.[]', function () {\n        return ['directReportCount'];\n    }),\n\n    saveReports() {\n        let promise = Ember.RSVP.resolve();\n        let reports = this.get('relationships').findBy('key', 'defaultReports');\n\n        if (reports && reports.get('reportsToSave')) {\n            let people = reports.get('reportsToSave');\n            let section = this.get('section');\n            let promises = people.map(person => {\n                // we have to load permissions before saving...this is unconventional\n                return person.get('readWritePermissions').then(() => person.saveSection(section));\n            });\n            promise = Ember.RSVP.all(promises);\n\n            reports.set('reportsToSave', []);\n        }\n\n        return promise;\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport forEachRight from 'lodash/forEachRight';\nimport isEmpty from 'lodash/isEmpty';\nimport uniqBy from 'lodash/uniqBy';\n\nconst { set, inject, computed, observer, Component } = Ember;\n\nconst LIMIT = 15;\n\nfunction getNextPerson(orderedPeople, people, person) {\n    if (person && person.get && person.get('id')) {\n        orderedPeople.pushObject(person);\n        const manager = person.getFieldValue('relationships.manager');\n        if (!manager) {\n            return;\n        }\n        const nextPerson = people.find(p => {\n            return p.get('id') === manager.guid;\n        });\n\n        if (!nextPerson) {\n            return;\n        }\n        return getNextPerson(orderedPeople, people, nextPerson);\n    }\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['field-component', 'relationship-field'],\n\n    intl: inject.service(),\n\n    entity: null,\n    editing: false,\n    relationship: null,\n    fieldValuesToAdd: [],\n\n    showingMore: false,\n\n    people: null,\n\n    attrs: {\n        onUpdateLabel: () => {},\n        onUpdateField: () => {}\n    },\n\n    actions: {\n        selectPerson(person) {\n            const relationship = this.get('relationship');\n            relationship.addPerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removePerson(person) {\n            const relationship = this.get('relationship');\n            relationship.removePerson(person);\n            this.get('onUpdateField')(relationship);\n        },\n\n        removeRelationship() {\n            let shouldRemove = true;\n            if (this.get('relationship.people.length')) {\n                const message = this.get('intl').lookup('person.relationships.confirmRemove').toString();\n                shouldRemove = confirm(message);\n            }\n\n            if (shouldRemove) {\n                const relationship = this.get('relationship');\n                if (relationship.get('isOtherRelationship')) {\n                    const key = this.get('relationship.key');\n                    const values = this.get('entity.relationships.relationships');\n                    const valuesToRemove = values.filter(value => value.labelKey === key);\n                    values.removeObjects(valuesToRemove);\n                } else {\n                    const people = relationship.get('people');\n                    forEachRight(people, person => relationship.removePerson(person));\n                }\n\n                this.get('onUpdateField')(relationship);\n            }\n        },\n\n        toggleShowing() {\n            this.toggleProperty('showingMore');\n        },\n\n        onUpdateLabel(newLabel, oldLabel) {\n            const people = this.get('people');\n            const ids = people.mapBy('id');\n            const values = this.get('entity.relationships.relationships').filter(\n                value => (value.labelKey === oldLabel || value.labelkey === oldLabel) && ids.includes(value.value)\n            );\n\n            uniqBy(values, 'value').forEach(value => {\n                set(value, 'labelKey', newLabel);\n            });\n\n            this.get('onUpdateLabel')(...arguments);\n        }\n    },\n\n    canEdit: computed.and('editing', 'relationship.canEdit'),\n    canRemove: computed('canEdit', 'people.[]', 'manager', function () {\n        const canEdit = this.get('canEdit');\n        if (this.get('isManagerField')) {\n            return canEdit && !isEmpty(this.get('manager'));\n        }\n        return canEdit && !isEmpty(this.get('people'));\n    }),\n\n    manager: computed.reads('entity.manager.content'),\n    isManagerField: computed.equal('relationship.key', 'management'),\n\n    updatePeople: observer('relationship.people.[]', 'showingMore', 'isManagerField', function () {\n        const people = this.get('relationship.people') || Ember.A([]);\n\n        if (this.get('isManagerField')) {\n            const cachedPeople = this.get('people');\n            if (cachedPeople && people && cachedPeople.length > 0 && people.length === cachedPeople.length) {\n                return;\n            }\n            const orderedPeople = Ember.A([]);\n            this.get('entity.manager')\n                .then(getNextPerson.bind(this, orderedPeople, people))\n                .catch(err => {\n                    this.logger.error('Error loading managers:', { err });\n                    this.set('people', people);\n                })\n                .finally(() => this.set('people', orderedPeople));\n        }\n\n        if (this.get('showingMore')) {\n            this.set('people', people);\n            return;\n        }\n\n        this.set('people', people.slice(0, LIMIT));\n    }),\n\n    relationshipKeyTrimAll: computed('relationship.key', function () {\n        const key = this.get('relationship.key');\n        return key ? key.replace(/\\s/g, '') : '';\n    }),\n\n    hasMore: computed('relationship.people.[]', function () {\n        return this.get('relationship.people.length') > LIMIT;\n    }),\n\n    haveManager: computed('manager', function () {\n        return !isEmpty(this.get('manager'));\n    }),\n\n    hideSection: computed('editing', 'canEdit', 'relationship.people.[]', function () {\n        const editing = this.get('editing');\n        const canEdit = this.get('canEdit');\n        if (editing) {\n            return !canEdit;\n        }\n\n        return !this.get('relationship.people.length');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"t0ksefmz\",\"block\":\"{\\\"statements\\\":[[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group \\\",[28,[\\\"relationship\\\",\\\"key\\\"]],\\\"-relationship relationship-container \\\",[33,[\\\"if\\\"],[[28,[\\\"hideSection\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-labelledby\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-entry field-entries\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-label\\\"],null,[[\\\"entity\\\",\\\"relationship\\\",\\\"editing\\\",\\\"onUpdateLabel\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onUpdateLabel\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values field-value \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEdit\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-field-section/entity-relationships/relationship-search\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"select\\\",\\\"relationship\\\"],[[28,[\\\"entity\\\"]],\\\"person\\\",\\\"selectPerson\\\",[28,[\\\"relationship\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"isManagerRelationship\\\"]],\\\"is-manager\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"unless\\\"],[[33,[\\\"can-edit\\\"],[[28,[\\\"result\\\"]],\\\"relationships.manager\\\"],null],\\\"disabled\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canEdit\\\"]],[28,[\\\"isManagerField\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveManager\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"manager\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"manager\\\",\\\"name\\\"]],\\\"\\\",[28,[\\\"relationship\\\",\\\"label\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"relationship\\\",\\\"loading\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.loading\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"people\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"person\\\",\\\"componentUpdated\\\"],[[28,[\\\"person\\\"]],[28,[\\\"componentUpdated\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"person\\\",\\\"name\\\"]],\\\"\\\",[28,[\\\"relationship\\\",\\\"label\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removePerson\\\",[28,[\\\"person\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isManagerField\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"divider-icon ion-ios-arrow-right\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"person\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"toggle-showing\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleShowing\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showingMore\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showLess\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.showMore\\\"],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRemove\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-relationship\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"relationship\\\",\\\"label\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRelationship\\\"]],[13],[0,\\\"                                        \\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n\n    key: null,\n    entity: null,\n    promise: null,\n    cache: null,\n\n    reportsToSave: [],\n\n    loading: computed('promise.isPending', 'people.[]', function () {\n        return this.get('promise.isPending') && this.get('people.length') === 0;\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('cache', []);\n    },\n\n    people: computed('promise', function () {\n        let cache = this.get('cache');\n        let promise = this.get('promise');\n\n        // Clear cache if promise changed\n        if (this._lastPromise !== promise) {\n            cache.clear();\n            this._lastPromise = promise;\n        }\n\n        promise.then(people => {\n            if (people) {\n                if (cache.length === 0 || cache.length !== people.length) {\n                    cache.clear();\n                    cache.addObjects(people);\n                }\n            }\n        });\n        return cache;\n    }),\n\n    label: computed('key', 'isOtherRelationship', function () {\n        const intl = this.get('intl');\n        const key = this.get('key');\n        if (this.get('isOtherRelationship')) {\n            const field = this.get('session.person.fieldConfig.relationships.relationships');\n            const fieldKey = field.getI18nKey();\n            const lookupKey = `${fieldKey}_labelKey_${key}`;\n            if (intl.query(lookupKey)) {\n                return intl.lookup(lookupKey);\n            }\n            return key;\n        }\n\n        return intl.lookup(`person.relationships.${key}`).toString();\n    }),\n\n    canEdit: computed('key', function () {\n        let key = this.get('key');\n        if (key === 'management' || key === 'assistants') {\n            return this.get('permissions.canEditProfiles');\n        } else if (_.includes(key.toLowerCase(), 'siblings')) {\n            return false;\n        }\n\n        return true;\n    }),\n\n    isManagerRelationship: computed.equal('key', 'management'),\n\n    isReportRelationship: computed('key', function () {\n        let key = this.get('key');\n        return _.includes(key.toLowerCase(), 'reports');\n    }),\n\n    isAssistantsRelationship: computed.equal('key', 'assistants'),\n\n    isOtherRelationship: computed('key', function () {\n        let relationshipKeys = ['management', 'defaultReports', 'defaultSiblings', 'assistants'];\n\n        return !_.includes(relationshipKeys, this.get('key'));\n    }),\n\n    fieldPath: computed('key', 'isOtherRelationship', function () {\n        let key = this.get('key');\n        if (key === 'assistants') {\n            return 'relationships.administrativeAssistant';\n        } else if (_.includes(key, 'reports')) {\n            return 'children';\n        } else if (key === 'otherRelationships' || this.get('isOtherRelationship')) {\n            return 'relationships.relationships';\n        }\n    }),\n\n    values: computed('entity', 'fieldPath', function () {\n        let entity = this.get('entity');\n        let fieldPath = this.get('fieldPath');\n        if (fieldPath) {\n            return entity.getFieldValue(fieldPath);\n        }\n        return null;\n    }),\n\n    addPerson(person) {\n        const entity = this.get('entity');\n        const fieldPath = this.get('fieldPath');\n        const key = this.get('key');\n        const intl = this.get('intl');\n\n        if (this.get('isManagerRelationship')) {\n            this.addManager(entity, person);\n        } else {\n            this.get('people').addObject(person);\n            if (this.get('isReportRelationship')) {\n                const personId = person.get('id');\n                const currentManager = entity.getFieldValue('relationships.manager');\n                if (currentManager && currentManager.value === personId) {\n                    this.get('people').removeObject(person);\n                    this.get('notification').error(\n                        intl.lookup('notification.titles.profileDataError').toString(),\n                        intl.lookup('notification.person.managerReportError').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'relationship'\n                        }\n                    );\n                } else {\n                    this.addManager(person, entity);\n                    this.get('reportsToSave').addObject(person);\n                }\n            } else {\n                let fieldValue = _.find(entity.get(fieldPath), value => _.isEmpty(value.value));\n\n                if (_.isEmpty(fieldValue)) {\n                    entity.set(fieldPath, person.get('id'));\n                    fieldValue = _.last(entity.get(fieldPath));\n                } else {\n                    Ember.set(fieldValue, 'value', person.get('id'));\n                }\n\n                Ember.set(fieldValue, 'labelKey', key);\n            }\n        }\n    },\n\n    removePerson(person) {\n        let fieldPath = this.get('fieldPath');\n        if (this.get('isManagerRelationship')) {\n            this.removeManager(this.get('entity'));\n        } else {\n            this.get('people').removeObject(person);\n            let values = this.get('entity').getFieldValue(fieldPath);\n            if (!_.isEmpty(values)) {\n                let value = values.findBy('value', person.get('id'));\n                values.removeObject(value);\n            } else if (this.get('isReportRelationship')) {\n                this.removeManager(person);\n                this.get('reportsToSave').addObject(person);\n            }\n        }\n    },\n\n    addManager(person, newManager) {\n        this.removeManager(person);\n        person.set('relationships.manager', newManager.get('id'));\n    },\n\n    removeManager(person) {\n        if (!person) {\n            person = this.get('entity');\n        }\n\n        let manager = person.getFieldValue('relationships.manager');\n        if (!_.isEmpty(manager)) {\n            person.get('relationships.manager').removeObject(manager);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['relationship-label'],\n\n    intl: inject.service(),\n\n    attrs: {\n        onUpdateLabel: () => {}\n    },\n\n    entity: null,\n    editing: false,\n    relationship: null,\n\n    showLabelChoices: false,\n\n    actions: {\n        updateLabel(event) {\n            Ember.run(this, this.updateLabel, event.target.value);\n        },\n\n        focusInput() {\n            this.set('showLabelChoices', true);\n        },\n\n        selectLabel({ key }) {\n            this.updateLabel(key);\n            this.set('showLabelChoices', false);\n        },\n\n        toggleChoices() {\n            this.toggleProperty('showLabelChoices');\n            if (this.get('showLabelChoices')) {\n                this.$('input').trigger('focus');\n            }\n        },\n\n        hideChoices() {\n            this.set('showLabelChoices', false);\n        },\n\n        handleKeyDownOnDropdownArrow(event) {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                event.preventDefault();\n                this.send('toggleChoices');\n            }\n        },\n\n        handleKeyDownOnLabel(event) {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        }\n    },\n\n    isOtherRelationship: computed.reads('relationship.isOtherRelationship'),\n\n    hasLabelChoices: computed.gt('labelChoices.length', 0),\n\n    canShowLabelChoices: computed.and('editing', 'showLabelChoices', 'isOtherRelationship', 'hasLabelChoices'),\n\n    field: computed(function () {\n        return this.get('entity.fieldConfig.relationships.relationships');\n    }),\n\n    labelChoices: computed('field.labelKeys.[]', function () {\n        const intl = this.get('intl');\n        const i18nKey = this.get('field.i18nKey');\n        const labelKeys = this.get('field.labelKeys');\n        return labelKeys.map(key => {\n            return {\n                key,\n                text: intl.lookup(`${i18nKey}_labelKey_${key}`)\n            };\n        });\n    }),\n\n    relationshipKeyTrimAll: computed('relationship.key', function () {\n        const key = this.get('relationship.key');\n        return key ? key.replace(/\\s/g, '') : '';\n    }),\n\n    didInsertElement() {\n        if (!this.get('isOtherRelationship')) {\n            return;\n        }\n\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                const target = Ember.$(event.target);\n                if (!target.parents(`#${this.elementId}`).length) {\n                    this.set('showLabelChoices', false);\n                }\n            });\n        });\n\n        this.$().on('focusout', () => {\n            Ember.run.later(() => {\n                if (!this.$().is(':focus-within')) {\n                    this.set('showLabelChoices', false);\n                }\n            }, 100);\n        });\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n        this.$().off('focusout');\n    },\n\n    updateLabel(newLabel) {\n        const relationship = this.get('relationship');\n        const oldLabel = relationship.get('key');\n\n        relationship.set('key', newLabel);\n\n        this.setLabelKey(newLabel, oldLabel);\n    },\n\n    setLabelKey(newLabel, oldLabel) {\n        this.attrs.onUpdateLabel(newLabel, oldLabel);\n        this.handleTooltip(newLabel);\n    },\n\n    handleTooltip(label) {\n        const message = this.get('intl').lookup('person.relationships.emptyLabel');\n        const input = this.$('input');\n        if (_.isEmpty(label)) {\n            input\n                .tooltip({\n                    title: message.toString(),\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n        } else {\n            input.tooltip('destroy');\n        }\n    },\n\n    focusOut() {\n        this.hideChoices();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPuRGndo\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isOtherRelationship\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-relationship\\\"]]],[16,\\\"value\\\",[34,[[28,[\\\"relationship\\\",\\\"label\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateLabel\\\"],null],null],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focusInput\\\"],null],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLabelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDownOnDropdownArrow\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoices\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[\\\"heading-label-\\\",[26,[\\\"relationshipKeyTrimAll\\\"]]]]],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"label-choices \\\",[33,[\\\"unless\\\"],[[28,[\\\"canShowLabelChoices\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"label-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDownOnLabel\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectLabel\\\",[28,[\\\"choice\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"choice\\\",\\\"text\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[14],[0,\\\"   \\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/relationship-label/template.hbs\"}});","import Ember from 'ember';\n\nimport EntitySearch from '../../../entity-search/component';\nimport layout from '../../../entity-search/template';\n\nconst { on, run, inject, RSVP } = Ember;\n\nexport default EntitySearch.extend({\n    classNames: ['relationship-search'],\n    layout,\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n\n    entity: null,\n    relationship: null,\n    searchLimit: 6,\n\n    actions: {\n        selectResult(result) {\n            const isOtherRelationship =\n                this.get('relationship.isOtherRelationship') || this.get('relationship.isAssistantsRelationship');\n            const entity = this.get('entity');\n            let canEdit = this.get('permissions.canEditProfiles');\n            if (isOtherRelationship) {\n                canEdit = entity.get('id') === this.get('session.person.id') || canEdit;\n            }\n\n            if (canEdit) {\n                this.set('searchQuery', '');\n                this.set('userInput', '');\n\n                this.sendAction('select', result);\n            }\n        }\n    },\n\n    resultsLoaded: on('didRender', function () {\n        if (!this.get('currentSearchRequest.isFulfilled')) {\n            return false;\n        }\n\n        this.get('currentSearchRequest')\n            .then(([people]) => {\n                // Lets be safe...\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n\n                this.$('.disabled').tooltip('destroy');\n\n                return RSVP.all(people.map(person => person.get('readWritePermissions')));\n            })\n            .then(() => {\n                run.scheduleOnce('afterRender', this, function () {\n                    // ...doubly safe\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    if (this.get('relationship.isManagerRelationship')) {\n                        this.$('.disabled').tooltip({\n                            title: this.get('intl').lookup('person.relationships.cantModify').toString(),\n                            placement: 'top',\n                            trigger: 'hover',\n                            container: `#${this.elementId} .search-results`\n                        });\n                    }\n                });\n            });\n    }),\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        if (!entities || entities.length === 0) return;\n\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n\n        if (nextSelected < entities.length) {\n            // Remove selected class from current\n            if (nowSelected >= 0) {\n                this.$('.result-container').eq(nowSelected).removeClass('selected');\n            }\n            // Add selected class to next\n            this.$('.result-container').eq(nextSelected).addClass('selected');\n\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults.content');\n        if (!entities || entities.length === 0) return;\n\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected - 1;\n\n        if (previousSelected >= 0) {\n            // Remove selected class from current\n            this.$('.result-container').eq(nowSelected).removeClass('selected');\n            // Add selected class to previous\n            this.$('.result-container').eq(previousSelected).addClass('selected');\n\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MAcLLPE/\",\"block\":\"{\\\"statements\\\":[[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"field-section-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"allRelationships\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section/entity-relationships/relationship-field\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"relationship\\\",\\\"componentUpdated\\\",\\\"onUpdateField\\\",\\\"onUpdateLabel\\\",\\\"sectionName\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"relationship\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedField\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updatedLabel\\\"],null],[28,[\\\"sectionName\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/entity-relationships/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"f95OPLsQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hideHeader\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-header\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"sectionInfo\\\",\\\"empty\\\"]],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"fieldSectionHasData\\\"]],\\\"hidden\\\",\\\"no-data\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.sectionEmpty\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section-content \\\",[33,[\\\"if\\\"],[[28,[\\\"ownProfile\\\"]],\\\"own-profile\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedFieldData\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-group entries field-entries field-group-\\\",[28,[\\\"groupedData\\\",\\\"key\\\"]],\\\"\\\\n                    num-entries-\\\",[28,[\\\"groupedData\\\",\\\"fieldData\\\",\\\"length\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"sort-field-data\\\"],[[28,[\\\"groupedData\\\",\\\"fieldData\\\"]]],[[\\\"group\\\"],[[28,[\\\"groupedData\\\"]]]]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"and\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"isViewMode\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"fieldset\\\",[]],[16,\\\"class\\\",[34,[\\\"field-entry-container field-entry\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"fieldPathClass\\\"]],\\\"\\\\n                                \\\",[28,[\\\"data\\\",\\\"field\\\",\\\"type\\\"]],\\\"-field\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]],\\\"new-field-entry\\\"],null],\\\"\\\\n                                \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]],\\\"repeatable\\\"],null]]]],[16,\\\"data-field-id\\\",[34,[[28,[\\\"data\\\",\\\"fieldId\\\"]]]]],[16,\\\"aria-labelledby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label-tag\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entry-label\\\"],[15,\\\"role\\\",\\\"heading\\\"],[15,\\\"aria-level\\\",\\\"4\\\"],[16,\\\"aria-labelledby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label-tag\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"editing\\\",\\\"field\\\",\\\"entry\\\",\\\"writeable\\\",\\\"showHistoryYearRange\\\",\\\"fallbackToEmpty\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\",\\\"field\\\"]],[28,[\\\"data\\\",\\\"fieldValue\\\"]],[28,[\\\"data\\\",\\\"writeable\\\"]],false,[28,[\\\"fallbackToEmptyLabel\\\"]]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entry-values \\\",[33,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],\\\"empty\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"componentName\\\"]]],[[\\\"id\\\",\\\"entity\\\",\\\"editing\\\",\\\"fieldData\\\",\\\"allFieldData\\\",\\\"cancelAddNew\\\",\\\"componentUpdated\\\",\\\"sectionName\\\"],[[28,[\\\"data\\\",\\\"fieldId\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"data\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\"],null],[28,[\\\"componentUpdated\\\"]],[28,[\\\"sectionName\\\"]]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"data\\\",\\\"field\\\",\\\"repeatable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"data\\\",\\\"isEmpty\\\"]],[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"data\\\",\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"data\\\",\\\"isNewValue\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[28,[\\\"data\\\",\\\"fieldValue\\\",\\\"i18nLabel\\\"]],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"sectionName\\\"]]]]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"removeEntry\\\",[28,[\\\"data\\\"]]]],[13],[0,\\\"\\\\n                                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-remove-section\\\"],[13],[14],[0,\\\"\\\\n                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n                                            \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"data\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupedData\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRemoveSectionModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\"],[\\\"remove-section-confirmation\\\",false,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],[33,[\\\"t\\\"],[\\\"common.confirm\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelRemoveSection\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.removeSectionWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[19,\\\"components/entity-field-section/-section-footer\\\"],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-field-section/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.scheduleOnce('afterRender', this, this.setValues);\n        }\n    }),\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"39ssHkh9\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\",\\\"ariaLabelledBy\\\"],[\\\"map\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/address-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    didInsertElement() {\n        this._super(...arguments);\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entity = this.get('entity');\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n\n        if (_.isEmpty(entry) || entry.value === undefined) {\n            entity.set(path, false);\n        }\n\n        // Make sure things get bound correctly for input checkbox changes\n        this.set('entry', entity.getFieldValue(path));\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"ZN7jpTBV\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"type\\\",\\\"id\\\",\\\"name\\\",\\\"checked\\\"],[\\\"checkbox\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-entry-value\\\"],null],\\\"entry.value\\\",[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"label \\\",[33,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],\\\"label-success\\\",\\\"label-danger\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-check-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-true\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.boolean.checked-false\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/boolean-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, observer, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.year', 'entry.value.month', 'entry.value.day'],\n\n    actions: {\n        selectDate(date) {\n            if (!date) {\n                this.set('entry.value', null);\n            } else {\n                const day = date.getDate();\n                const month = date.getMonth() + 1;\n                const year = date.getFullYear();\n                const value = { day, month, year };\n\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: observer('canEdit', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    value: computed('entry.value', function () {\n        let entry = this.get('entry');\n\n        if (!this.isComplexFieldEmpty()) {\n            let copy = Ember.copy(entry, true);\n            copy.value.month -= 1;\n\n            return moment(copy.value).toDate();\n        }\n\n        return null;\n    }),\n\n    formattedValue: computed('value', function () {\n        const date = this.get('value');\n        if (!date) {\n            return '';\n        }\n        return moment(date).format('L');\n    }),\n\n    options: computed('intl.locale', function () {\n        const localeData = moment.localeData();\n        return {\n            i18n: {\n                previousMonth: this.get('intl').t('chat.presence.outOfOffice.picker.previousMonth').toString(),\n                nextMonth: this.get('intl').t('chat.presence.outOfOffice.picker.nextMonth').toString(),\n                months: localeData._months,\n                weekdays: localeData._weekdays,\n                weekdaysShort: localeData._weekdaysShort\n            }\n        };\n    }),\n\n    dateFormat: computed('intl.iosLocale', function () {\n        let locale = this.get('intl.isoLocale');\n        if (locale === 'no') {\n            // moment uses nb as its Norwegian locale\n            locale = 'nb';\n        }\n        return moment.localeData(locale)._longDateFormat.L;\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n        const path = this.get('field.fieldPath');\n\n        if (_.isEmpty(entry)) {\n            entity.set(path, entry);\n        } else {\n            entity.set(path, [entry], { overwrite: true });\n        }\n\n        if (_.isEmpty(entry.value)) {\n            let value = {\n                year: null,\n                month: null,\n                day: null\n            };\n\n            Ember.set(entry, 'value', value);\n        }\n\n        this.set('entry', entity.getFieldValue(path));\n    },\n\n    isComplexFieldEmpty: function () {\n        let entry = this.get('entry');\n        if (!entry || !entry.value) {\n            return true;\n        }\n\n        return (\n            typeof entry.value.year !== 'number' &&\n            typeof entry.value.month !== 'number' &&\n            typeof entry.value.day !== 'number'\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"CiFxiWqE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"pikaday-input\\\"],null,[[\\\"value\\\",\\\"classNames\\\",\\\"format\\\",\\\"placeholder\\\",\\\"firstDay\\\",\\\"onSelection\\\",\\\"options\\\"],[[28,[\\\"value\\\"]],\\\"form-control\\\",[28,[\\\"dateFormat\\\"]],\\\"\\\",0,[33,[\\\"action\\\"],[[28,[null]],\\\"selectDate\\\"],null],[28,[\\\"options\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"formattedValue\\\"]],true],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty-value\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/date-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-value'],\n\n    intl: inject.service(),\n    permissions: inject.service(),\n\n    currentTooltip: null,\n    isActive: false,\n    headingLevel: null,\n    hasError: computed.not('isValid'),\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const entry = this.get('entry');\n        let empty;\n        if (!entry) {\n            empty = true;\n        } else {\n            empty = _.isEmpty(entry.value);\n        }\n\n        if (empty) {\n            const timer = Ember.run.scheduleOnce('afterRender', this, this.setValues);\n            this.timers.push(timer);\n        }\n    },\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', 'isEmpty', {\n        get() {\n            let entryId = this.get('entry._id');\n            let fieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n            return fieldId && fieldId === entryId && !this.get('isEmpty');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(\n                type,\n                this.get('entry'),\n                this.get('fieldData.field.fieldPath'),\n                this.get('fieldData')\n            );\n\n            return value;\n        }\n    }),\n\n    errorMessage: computed('isValid', 'entry.value', 'entity.type', function () {\n        const intl = this.get('intl');\n        const valid = this.get('isValid');\n        const empty = _.isEmpty(this.get('entry.value'));\n        const isGroup = this.get('entity.type') === 'group';\n\n        if (empty && !isGroup) {\n            return intl.lookup('tooltip.fields.email.blankError').toString();\n        }\n\n        if (!valid && !empty) {\n            return intl.lookup('tooltip.fields.email.invalidError').toString();\n        }\n    }),\n\n    canSetPrimary: computed.reads('permissions.canEditProfiles'),\n\n    focusOut() {\n        this.set('isActive', false);\n    },\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"KvjQxAMU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"email-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"has-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\",\\\"focus-in\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"hasError\\\"]],\\\"validation-error\\\"],null],\\\"focus\\\"]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"protocol\\\",\\\"value\\\",\\\"title\\\",\\\"ariaLabelledBy\\\"],[\\\"mailto\\\",[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"canSetPrimary\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\",\\\"ariaDescribedBy\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryMail\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.primary\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"common.primary\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/email-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNames: ['history'],\n\n    intl: inject.service(),\n\n    complexField: true,\n    complexValueFields: [\n        'entry.value.where',\n        'entry.value.startDate.month',\n        'entry.value.startDate.year',\n        'entry.value.endDate.month',\n        'entry.value.endDate.year'\n    ],\n\n    errors: null,\n    isActive: false,\n\n    actions: {\n        saveHistoryEntry() {\n            this.set('isNewField', false);\n            this.set('isEmpty', false);\n        },\n\n        cancelHistoryEntry() {\n            this.attrs.cancelAddNew(this.get('fieldData'));\n        },\n\n        focus() {\n            this.set('isActive', true);\n        }\n    },\n\n    focusOut: function () {\n        this.set('isActive', false);\n    },\n\n    showTooltip: computed('isValid', 'entry.value.where', 'isActive', function () {\n        let active = this.get('isActive');\n        let valid = this.get('isValid');\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        return !active && (empty || !valid);\n    }),\n\n    focusNewField() {\n        let empty = _.isEmpty(this.get('entry.value.where'));\n        let added = this.get('entry.isAdded');\n\n        if (empty && !added) {\n            let $input = this.$('.where input');\n            this.set('entry.isAdded', true);\n            $input.trigger('focus');\n        }\n    },\n\n    ensureDateObjectsExist() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n\n        if (typeof entry.value !== 'object') {\n            Ember.set(entry, 'value', {});\n        }\n\n        if (!entry.value.endDate) {\n            Ember.set(entry, 'value.endDate', {\n                month: null,\n                year: null\n            });\n        }\n\n        if (!entry.value.startDate) {\n            Ember.set(entry, 'value.startDate', {\n                month: null,\n                year: null\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('errors', {\n            where: false,\n            date: false\n        });\n\n        Ember.run.once(this, this.ensureDateObjectsExist);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.delete[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n        Ember.run.scheduleOnce('afterRender', this, this.focusNewField);\n        Ember.run.scheduleOnce('afterRender', this, this.calculateValidityOnInsert);\n    },\n\n    calculateValidityOnInsert() {\n        this.validityChanged();\n    },\n\n    resetData: on('willDestroyElement', function () {\n        this.cleanFieldForSave();\n    }),\n\n    section: computed.reads('fieldData.field.section'),\n    useEducationLabels: computed.equal('section.key', 'education'),\n\n    isNewField: computed('entry._id', 'entry.tempId', function () {\n        return !this.get('entry._id') && this.get('entry.tempId');\n    }),\n\n    where: computed('entry.value.where', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.where');\n    }),\n\n    what: computed('entry.value.what', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.what');\n    }),\n\n    notes: computed('entry.value.notes', 'entity.bio.workHistory.[]', function () {\n        return this.get('entry.value.notes');\n    }),\n\n    whereLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhere');\n        }\n        return intl.lookup('entity.fieldTypes.history.where').toString();\n    }),\n\n    datesLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationDates');\n        }\n        return intl.lookup('entity.fieldTypes.history.dates').toString();\n    }),\n\n    whatLabel: computed('useEducationLabels', function () {\n        const intl = this.get('intl');\n        if (this.get('useEducationLabels')) {\n            return intl.lookup('entity.fieldTypes.history.educationWhat');\n        }\n        return intl.lookup('entity.fieldTypes.history.what').toString();\n    }),\n\n    notesLabel: computed(function () {\n        return this.get('intl').lookup('entity.fieldTypes.history.notes');\n    }),\n\n    validityChanged: observer('showTooltip', 'isEmpty', function () {\n        let isValid = this.get('isValid');\n        let isEmpty = this.get('isEmpty');\n\n        Ember.run.scheduleOnce('afterRender', this, this.whereErrorChanged, isEmpty);\n        Ember.run.scheduleOnce('afterRender', this, this.dateErrorChanged, !isValid);\n    }).on('init'),\n\n    whereErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n        let showTooltip = this.get('showTooltip');\n\n        var input = this.get('whereInput');\n        if (error && showTooltip) {\n            var elem = this.$('.where input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.whereError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('whereInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    dateErrorChanged(error) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (!this.get('editing')) {\n            return;\n        }\n\n        var input = this.get('dateInput');\n        if (error) {\n            var elem = this.$('.from-date input');\n            if (!input && elem.length) {\n                input = elem.tooltip({\n                    placement: 'top',\n                    title: this.get('intl').lookup('entity.fieldTypes.history.validation.dateError').toString(),\n                    trigger: 'manual'\n                });\n\n                this.set('dateInput', input);\n            }\n\n            if (input) {\n                input.tooltip('show');\n            }\n        } else {\n            if (input) {\n                input.tooltip('hide');\n            }\n        }\n    },\n\n    isComplexFieldEmpty: function () {\n        // only required field is `where`\n        var where = this.get('entry.value.where');\n        return where === undefined || _.isEmpty(where.trim());\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PbnyqSd4\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]],\\\"new-field\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"field-error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs where-and-dates\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-where\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"whereLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"focus-in\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-where\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"where\\\"]],\\\"form-control\\\",\\\"focus\\\",[33,[\\\"if\\\"],[[28,[\\\"errors\\\",\\\"where\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-range\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"datesLabel\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"date-pickers\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-from-date-picker\\\"]]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.from\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"from-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"error\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-from\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"startDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minStartDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxStartDate\\\"]],[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-to-date-picker\\\"]]],[15,\\\"class\\\",\\\"to\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.history.to\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"to-date\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"date-picker\\\"],null,[[\\\"id\\\",\\\"entity\\\",\\\"value\\\",\\\"format\\\",\\\"minView\\\",\\\"inputMode\\\",\\\"minDate\\\",\\\"maxDate\\\",\\\"placeholder\\\",\\\"error\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-to\\\"],null],[28,[\\\"entity\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"endDate\\\"]],\\\"monthYear\\\",\\\"months\\\",true,[28,[\\\"field\\\",\\\"params\\\",\\\"minEndDate\\\"]],[28,[\\\"field\\\",\\\"params\\\",\\\"maxEndDate\\\"]],\\\"entity.fieldTypes.history.toPlaceholder\\\",[28,[\\\"errors\\\",\\\"date\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs what\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-what\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"whatLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-what\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"what\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"inputs note\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-notes\\\"]]],[15,\\\"class\\\",\\\"history-field-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"notesLabel\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-notes\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"notes\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isNewField\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"delete remove-new-field\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObjectFromList\\\"],[[\\\"name\\\",\\\"type\\\",\\\"list\\\"],[[33,[\\\"t\\\"],[\\\"fieldSection.historyEntry\\\"],null],[33,[\\\"t\\\"],[\\\"fieldSection.entry\\\"],null],[28,[\\\"section\\\",\\\"sectionName\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"cancelHistoryEntry\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"where\\\"],[13],[1,[26,[\\\"where\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"what\\\"],[13],[1,[26,[\\\"what\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"notes\\\"]]],null,{\\\"statements\\\":[[6,[\\\"expander-plugin\\\"],null,null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"notes\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dates\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"fallbackToEmpty\\\",\\\"showInstructionText\\\"],[[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],true,false]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/history-field/template.hbs\"}});","import TextField from '../text-field/component';\n\nexport default TextField.extend();\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { inject, computed, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n\n    location: null,\n    parentLocation: null,\n    floorLocation: null,\n\n    googleMapsHref: '',\n\n    showFloorplan: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('location', this.get('locationData'));\n        this.set('filterLocations', this.filterLocationsHelper.bind(this));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.focusFieldOnInsert);\n    },\n\n    focusFieldOnInsert() {\n        const input = this.$('input');\n        if (input) {\n            input.trigger('focus');\n        }\n    },\n\n    actions: {\n        selectParentLocation(location) {\n            this.set('parentLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', true);\n        },\n\n        selectFloorLocation(location) {\n            this.set('floorLocation', location);\n            this.send('selectLocation', location);\n            this.set('isEmpty', false);\n        },\n\n        saveNewLocation() {\n            let parentLocation = this.get('parentLocation');\n            let floorLocation = this.get('floorLocation');\n            if (floorLocation) {\n                this.send('selectLocation', floorLocation);\n            } else {\n                this.send('selectLocation', parentLocation);\n            }\n        },\n\n        cancelNewLocation() {\n            this.get('cancelAddNew')(this.get('fieldData'));\n        },\n\n        selectLocation(location) {\n            let entry = this.get('entry');\n            let id = location.get('id');\n\n            let value = {\n                locationId: id,\n                coordinates: {},\n                notes: ''\n            };\n\n            if (location.get('floorplanImage') && location.get('floorplanImage.length') > 0) {\n                value.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', value);\n            this.set('location', this.get('locationData'));\n        },\n\n        removeNewParentLocation() {\n            this.set('parentLocation', null);\n        },\n\n        noop() {},\n\n        toggleFloorplan() {\n            Ember.run.once(this, this.toggleProperty, 'showFloorplan');\n        },\n\n        hideFloorplan() {\n            this.set('showFloorplan', false);\n            this.set('location', this.get('locationData'));\n        },\n\n        confirm() {\n            var location = this.get('location');\n            var entity = this.get('entity');\n\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            if (entity === undefined) {\n                entity = this.get('modal.entity');\n            }\n\n            return location\n                .then(() => entity.save())\n                .then(() => entity.reload())\n                .catch(resp => {\n                    if (resp.responseText) {\n                        var json = JSON.parse(resp.responseText);\n                        var code = Ember.get(json, 'payload.code');\n                        if (code === 'VERSION_MISMATCH') {\n                            this.bubbleAction({\n                                action: 'confirm'\n                            });\n                        }\n                    }\n                });\n        },\n\n        cancel() {\n            var location = this.get('location');\n            if (location === undefined) {\n                location = Ember.RSVP.resolve(this.get('modal.location'));\n            }\n\n            location.then(location => {\n                this.get('modal.controller.entity').reset();\n                location.reload();\n            });\n        }\n    },\n\n    parentLocationName: computed('location.parent.name', function () {\n        return this.get('intl').lookup('field.in', {\n            location: this.get('location.parent.name')\n        });\n    }),\n\n    isValid: computed('entry.value.locationId', 'parentLocation', function () {\n        var entry = this.get('entry');\n\n        var selectedFloor = !_.isEmpty(Ember.get(entry, 'value')) && !_.isEmpty(Ember.get(entry, 'value.locationId'));\n        var haveParent = !_.isEmpty(this.get('parentLocation'));\n\n        return haveParent || selectedFloor;\n    }),\n\n    haveFloor: computed('editing', 'location', 'locationData', 'parentLocation', 'selectedFloor', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        if (!this.get('editing')) {\n            return true;\n        }\n\n        if (this.get('parentLocation') && !this.get('selectedFloor')) {\n            return false;\n        }\n        return location || this.get('selectedFloor');\n    }),\n\n    locationData: computed('entry.value.locationId', 'editing', function () {\n        let id = this.get('entry.value.locationId');\n        let emptyPromise = DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n\n        if (this.get('parentLocation') && !this.get('floorLocation')) {\n            return emptyPromise;\n        } else if (id) {\n            return this.get('store').findRecord('location', id);\n        }\n\n        return emptyPromise;\n    }),\n\n    locationAddress: computed('location', 'locationData', function () {\n        let location;\n        if (!this.get('location')) {\n            location = this.get('locationData');\n        } else {\n            location = this.get('location');\n        }\n        let promise = location.then(location => {\n            if (!location) {\n                return '';\n            }\n\n            if (location.get('isFloor')) {\n                return location.get('parent.address');\n            }\n\n            return location.get('address');\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    isRichAddress: computed('locationAddress', function () {\n        let promise = this.get('locationAddress').then(address => {\n            return typeof address !== 'string';\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    parentLocations: computed(function () {\n        var promise = this.store.findAll('location').then(function (locations) {\n            return _.filter(\n                locations.content.map(x => x.getRecord()),\n                function (location) {\n                    return (\n                        location.get('state') !== 'deleted' &&\n                        location.get('type') !== 'floor' &&\n                        location.get('id') !== null\n                    );\n                }\n            );\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    canShowEdit: computed('editing', 'location', function () {\n        return this.get('editing') && !_.isEmpty(this.get('location.content.parent.content.sublocationOrder'));\n    }),\n\n    locationChoices: computed('parentLocation', function () {\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        return this.get('parentLocation.floors');\n    }),\n\n    choiceText: computed('parentLocation', function () {\n        const intl = this.get('intl');\n        var parentLocation = this.get('parentLocation');\n        if (!parentLocation) {\n            return intl.lookup('locations.selectLocation');\n        }\n\n        return `${intl.lookup('locations.selectFloor')}${parentLocation.get('name')}`;\n    }),\n\n    selectedParentLocation: computed('parentLocation', function () {\n        return !_.isEmpty(this.get('parentLocation'));\n    }),\n\n    editText: computed('location', 'location.isFloor', function () {\n        const intl = this.get('intl');\n        if (this.get('location.isFloor')) {\n            return intl.lookup('locations.selectOfficeShort');\n        }\n\n        return intl.lookup('locations.editLocation');\n    }),\n\n    attachmentId: computed('elementId', function () {\n        return `attachment-${this.elementId}`;\n    }),\n\n    setGoogleMapsLinkInfo: observer('location.parent', function () {\n        var parent = this.get('location.parent');\n\n        if (parent) {\n            parent.then(\n                Ember.run.bind(this, parentLocation => {\n                    if (this.get('_state') === 'inDOM') {\n                        var address;\n                        if (parentLocation) {\n                            address = parentLocation.get('address');\n                        } else if (!parentLocation) {\n                            address = this.get('location.address');\n                        }\n\n                        if (typeof address === 'string') {\n                            address = address.replace(/^\\s+|\\s+$/g, '').replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        } else if (address && typeof address === 'object') {\n                            let street1 = address.street1 || '';\n                            let street2 = address.street2 || '';\n                            let street = street1 && street2 ? `${street1} ${street2}` : street1;\n                            let city = address.city || '';\n                            let state = address.state || '';\n                            let zipcode = address.zipcode || '';\n                            let country = address.country || '';\n                            address = `${street} ${city}, ${state}, ${zipcode}, ${country}`\n                                .replace(/^\\s+|\\s+$/g, '')\n                                .replace('\\n', ' ');\n                            if (address.length > 0) {\n                                this.set('googleMapsHref', `https://maps.google.com/?q=${address}`);\n                            }\n                        }\n                    }\n                })\n            );\n        }\n    }),\n\n    parentLocationUpdated: observer('parentLocation', function () {\n        if (this.get('parentLocation')) {\n            var dropdown = this.$('.dropdown-menu-view');\n\n            if (dropdown) {\n                dropdown.addClass('flash');\n\n                Ember.run.scheduleOnce('afterRender', this, this.toggleFlash, dropdown);\n            }\n        }\n    }),\n\n    filterLocationsHelper(data) {\n        let entity = this.get('entity');\n        let fieldPath = this.get('field.fieldPath');\n        let locationIds = entity.getFieldValue(fieldPath).mapBy('value.locationId');\n        let locations = _.filter(\n            locationIds.map(id => {\n                if (!id) {\n                    return;\n                }\n\n                let location = this.get('store').peekRecord('location', id);\n                if (!location) {\n                    return;\n                }\n                if (location.get('parent.id')) {\n                    return location.get('parent.content');\n                }\n                return location;\n            })\n        );\n\n        return _.reject(data, location => {\n            return _.includes(locations.mapBy('id'), location.get('id')) || location.get('isFloor');\n        });\n    },\n\n    toggleFlash(dropdown) {\n        Ember.run.later(\n            this,\n            function () {\n                dropdown.removeClass('flash');\n            },\n            150\n        );\n    },\n\n    showFloorPlan() {\n        this.set('showFloorplan', true);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"yVVZmAiU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\"]],[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"location\\\",\\\"isPending\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information location-details\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h5\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"parent\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[26,[\\\"parentLocationName\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationAddress\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"isRichAddress\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.address\\\"],[[\\\"street1\\\",\\\"street2\\\",\\\"city\\\",\\\"state\\\",\\\"country\\\",\\\"zipcode\\\"],[[28,[\\\"locationAddress\\\",\\\"street1\\\"]],[28,[\\\"locationAddress\\\",\\\"street2\\\"]],[28,[\\\"locationAddress\\\",\\\"city\\\"]],[28,[\\\"locationAddress\\\",\\\"state\\\"]],[28,[\\\"locationAddress\\\",\\\"country\\\"]],[28,[\\\"locationAddress\\\",\\\"zipcode\\\"]]]]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"locationAddress\\\",\\\"content\\\"]]],null],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editing\\\"]],[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],[28,[\\\"location\\\",\\\"floorplan\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat floorplan-action\\\"],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"id\\\",[34,[[26,[\\\"attachmentId\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleFloorplan\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-floor-plan\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.editFloor\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.floorplan\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"floorplan-popover\\\"],null,[[\\\"show\\\",\\\"attachmentId\\\",\\\"hidePopover\\\"],[[28,[\\\"showFloorplan\\\"]],[28,[\\\"attachmentId\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"hideFloorplan\\\"],null]]],{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"floorplan-editor\\\"],null,[[\\\"entity\\\",\\\"location\\\",\\\"editing\\\",\\\"parentLocation\\\",\\\"field\\\",\\\"fieldData\\\",\\\"saveLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"locationData\\\",\\\"content\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"location\\\",\\\"parent\\\"]],[28,[\\\"field\\\"]],[28,[\\\"fieldData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"googleMapsHref\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"map\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-sm btn-flat\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[16,\\\"href\\\",[26,[\\\"googleMapsHref\\\"]],null],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-map\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.location.map\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-location\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"parent-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"parentLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"address\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"expand-line-breaks\\\"],[[28,[\\\"parentLocation\\\",\\\"address\\\"]]],null],true],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"floorLocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"floor-location \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"floorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"parentLocation\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"class\\\"],[[28,[\\\"location\\\"]],96,\\\"location-image\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"floorLocation\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"location-container dropdown\\\\n                            \\\",[33,[\\\"if\\\"],[[28,[\\\"selectedParentLocation\\\"]],\\\"selected-parent\\\"],null],\\\"\\\\n                            \\\",[33,[\\\"unless\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"dropdown-menu\\\"],null,[[\\\"title\\\"],[[28,[\\\"choiceText\\\"]]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"locationChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"parent-location floor-choice\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFloorLocation\\\",[28,[\\\"location\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],96]]],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[11,\\\"strong\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                            \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"location\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"location\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"field.noFloors\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"filterFunction\\\",\\\"select\\\",\\\"class\\\"],[\\\"locations\\\",[28,[\\\"filterLocations\\\"]],\\\"selectParentLocation\\\",[33,[\\\"concat\\\"],[[33,[\\\"if\\\"],[[28,[\\\"parentLocation\\\"]],\\\"hide\\\"],null],\\\" \\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/location-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, run, set } = Ember;\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isValid::invalid-text'],\n\n    ensurePopulatedField: on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            run(() => {\n                const timer = run.once(this, this.setValues);\n                this.timers.pushObject(timer);\n            });\n        }\n    }),\n\n    isFieldEmpty() {\n        let field = this.get('field');\n        let entity = this.get('entity');\n\n        if (field && entity) {\n            let path = this.get('field').getFieldPath();\n            let value = this.get('entity').getFieldValue(path);\n\n            return _.isEmpty(value);\n        }\n    },\n\n    setValues() {\n        let entity = this.get('entity');\n        let path = this.get('field').getFieldPath();\n        let entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            set(entry, 'value', '');\n            entity.set(path, [entry], { overwrite: true });\n        } else {\n            entity.set(path, '');\n        }\n\n        let value = entity.getFieldValue(path);\n        if (Array.isArray(value)) {\n            value = value[0];\n        }\n\n        this.set('entry', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pGASiGw8\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxFieldWithLength\\\"],[[\\\"length\\\"],[[28,[\\\"field\\\",\\\"params\\\",\\\"maxLength\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"multi-line-value\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]]],[[\\\"id\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/multiline-text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    actions: {\n        selectPersonFromPicker: function (person) {\n            this.set('entry.value', person.get('id'));\n        }\n    },\n\n    person: Ember.computed('entry.value', function () {\n        var value = this.get('entry.value');\n        if (value) {\n            return this.store.find('person', value);\n        }\n\n        return undefined;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"u4vyWJcp\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"person-icon\\\"],null,[[\\\"personId\\\"],[[28,[\\\"person\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/person-field/template.hbs\"}});","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\nimport { buildIntlTelInputOptions, setupIntlTelInputAccessibility } from '../../../utils/intl-tel-input-options';\n\nconst { get, inject, computed, observer, Component } = Ember;\n\nlet requireFields = ['contactInfo.phone_other'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNameBindings: ['isNumberError:invalid-value', 'hasErrorCode:has-error-code'],\n\n    intl: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    complexField: true,\n    complexValueFields: ['entry.value.number', 'entry.value.extension', 'entry.value.acceptSMS'],\n\n    isActive: false,\n    headingLevel: null,\n\n    entry: computed.alias('fieldData.value'),\n\n    timers: null,\n\n    actions: {\n        setPrimary() {\n            this.set('isPrimary', true);\n            if (\n                this.get('session.features.emergencyLocation') &&\n                this.get('entry.value.number') &&\n                this.setPrimaryCallback\n            ) {\n                this.setPrimaryCallback(this.get('entry.value.number'));\n            }\n        },\n\n        setPrimarySMS() {\n            this.set('isPrimarySMS', true);\n            this.set('entry.value.acceptsSMS', true);\n        },\n\n        toggleSMS(event) {\n            this.toggleProperty('entry.value.acceptsSMS');\n\n            if (event) {\n                event.stopPropagation();\n            }\n        },\n\n        makeCall: debounce(function () {\n            var phoneNumber = this.get('entry');\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [phoneNumber]\n            });\n        }, 250),\n\n        focus() {\n            this.set('isActive', true);\n        },\n\n        updateNumber(event) {\n            this.set('entry.value.number', event.target.value);\n        },\n\n        updateExtension(value) {\n            this.set('entry.value.extension', value);\n        }\n    },\n\n    init() {\n        this.set('timers', []);\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.ensurePopulatedField();\n    },\n\n    ensurePopulatedField: observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setupData);\n        this.get('timers').addObject(timer);\n    }),\n\n    addBehavior: observer('editing', function () {\n        let timer;\n        if (!this.get('editing')) {\n            timer = Ember.run.scheduleOnce('afterRender', this, this.setupTooltips);\n            this.get('timers').addObject(timer);\n\n            return;\n        }\n\n        timer = Ember.run.scheduleOnce('afterRender', this, this._setupInput);\n        this.get('timers').addObject(timer);\n    }).on('didInsertElement'),\n\n    dialableNumber: computed('entry.rel.e164', 'entry.value.{number,extension}', function () {\n        var e164 = this.get('entry.rel.e164');\n        if (e164) {\n            return e164;\n        }\n\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n\n        number = number ? number.replace(/\\D/g, '') : number;\n        extension = extension ? extension.replace(/\\D/g, '') : extension;\n\n        if (number) {\n            number = this.get('addressformat').formatAddress(number);\n            if (extension) {\n                return `${number};ext=${extension}`;\n            } else {\n                return number;\n            }\n        } else if (extension) {\n            return extension;\n        }\n    }),\n\n    isPrimarySMS: computed('entry._id', 'entity.primaryContactInfo.sms', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('sms');\n        },\n\n        set(key, value) {\n            const entity = this.get('entity');\n            const type = 'sms';\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    isPrimary: computed('entry._id', 'entity.primaryContactInfo.voice', 'isEmpty', {\n        get() {\n            return this.checkPrimaryForType('voice');\n        },\n\n        set(key, value) {\n            let entity = this.get('entity');\n            let type = this.get('fieldData.field.type');\n\n            entity.setPrimaryContact(type, this.get('entry'), this.get('field.fieldPath'));\n\n            return value;\n        }\n    }),\n\n    dialCode: computed('entry.value.number', function () {\n        let $input = this.get('$input');\n        let initialCountry = !_.isEmpty($input) ? $input.intlTelInput('getSelectedCountryData') : null;\n        if (_.isEmpty(initialCountry) && this.get('intl.iso2LocaleCountry')) {\n            initialCountry = this.get('intl.iso2LocaleCountry');\n        }\n        return initialCountry.dialCode;\n    }),\n\n    errorMsg: computed('entry.value.{number,extension}', function () {\n        const intl = this.get('intl');\n        const number = this.get('entry.value.number');\n        const extension = this.get('entry.value.extension');\n        const $input = this.get('$input');\n\n        let iso2LocaleCountry, initialCountry;\n\n        if (this.get('intl.iso2LocaleCountry')) {\n            iso2LocaleCountry = this.get('intl.iso2LocaleCountry.iso2');\n        }\n\n        if ($input.intlTelInput('getSelectedCountryData')) {\n            initialCountry = $input.intlTelInput('getSelectedCountryData').iso2;\n        }\n\n        if (!initialCountry) {\n            $input.intlTelInput('setCountry', iso2LocaleCountry);\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return null;\n        }\n\n        // https://github.com/Bluefieldscom/intl-tel-input/blob/master/lib/libphonenumber/src/utils.js#L175\n        let errorCode = $input.intlTelInput('getValidationError');\n        let message = '';\n        switch (errorCode) {\n            case intlTelInputUtils.validationError.INVALID_COUNTRY_CODE:\n                message = intl.lookup('entity.fieldTypes.phone.validation.invalidCountryCode');\n                break;\n            case intlTelInputUtils.validationError.TOO_SHORT:\n                message = intl.lookup('entity.fieldTypes.phone.validation.tooShort');\n                break;\n            case intlTelInputUtils.validationError.TOO_LONG:\n                // I don't understand this error.  This occurs on U.S. numbers as you type them in with an area code.  Using 'Not a number' instead of too long message.\n                // this.set('errorMsg', lookup('entity.fieldTypes.phone.validation.tooLong'));\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            case intlTelInputUtils.validationError.NOT_A_NUMBER:\n                message = intl.lookup('entity.fieldTypes.phone.validation.notANumber');\n                break;\n            default:\n                message = null;\n        }\n\n        return message;\n    }),\n\n    isRequiredPhone: computed('field', function () {\n        let path = this.get('field').getFieldPath();\n        return Ember.A(requireFields).includes(path);\n    }),\n\n    isRequiredError: computed('entry.value.{number,extension}', 'isRequiredPhone', function () {\n        if (!this.get('isRequiredPhone')) {\n            return false;\n        }\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    isNumberError: computed('entry.value.{number,extension}', '$input', 'isRequiredPhone', function () {\n        let number = this.get('entry.value.number');\n        let extension = this.get('entry.value.extension');\n        if (!this.get('isRequiredPhone') && _.isEmpty(number)) {\n            return false;\n        } else if (this.get('isRequiredPhone') && _.isEmpty(number) && !_.isEmpty(extension)) {\n            // Any extension is allowed because we dont know what the extension pool contains\n            return false;\n        }\n        const $input = this.get('$input');\n        if (!$input || !$input.intlTelInput) {\n            return false;\n        }\n        return !$input.intlTelInput('isValidNumber', false);\n    }),\n\n    errorClass: computed('isRequiredError', 'isNumberError', function () {\n        if (this.get('isRequiredError')) {\n            return 'has-error';\n        }\n        if (this.get('isNumberError')) {\n            return 'has-warning';\n        }\n        return '';\n    }),\n\n    isValid: computed('entry.value.{number,extension}', 'isRequiredError', function () {\n        if (!this.get('editing') || this.isDestroyed || this.isDestroying) {\n            return true;\n        }\n\n        const isRequiredError = this.get('isRequiredError');\n        const isValid = this.get('isRequiredPhone') ? !isRequiredError : true;\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this._setFieldDataValidity, isValid);\n        this.get('timers').addObject(timer);\n\n        return isValid;\n    }),\n\n    hasError: computed.not('isValid'),\n    hasErrorCode: computed('entry.rel.errorCode', function () {\n        return !_.isEmpty(this.get('entry.rel.errorCode'));\n    }),\n\n    errorMessage: computed('entry.rel.errorCode', function () {\n        const errorCode = this.get('entry.rel.errorCode');\n        const key = `purecloud.error.api.${errorCode}`;\n        return this.get('intl').lookup(key, null, errorCode.replace(/_/g, ' ')).toString();\n    }),\n\n    didUpdateAttrs({ newAttrs }) {\n        if (!get(newAttrs, 'editing.value') && !this.get('isValid')) {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    willDestroyElement() {\n        this.get('timers').forEach(timer => Ember.run.cancel(timer));\n\n        const $input = this.$('.phone-input');\n        if ($input.length && typeof $input.intlTelInput === 'function' && $input.parent().hasClass('iti')) {\n            $input.intlTelInput('destroy');\n        }\n\n        this._super(...arguments);\n    },\n\n    checkPrimaryForType(type) {\n        let entryId = this.get('entry._id');\n        let fieldId = this.get(`entity.primaryContactInfo.${type}.firstObject.value.fieldId`);\n        return fieldId && fieldId === entryId && !this.get('isEmpty');\n    },\n\n    focusOut() {\n        this._super(...arguments);\n\n        this.set('isActive', false);\n\n        const value = this.get('entry.value.number');\n        if (value === '+1') {\n            this.set('entry.value.number', '');\n        }\n    },\n\n    focusNewField() {\n        let empty = this.get('isEmpty');\n        let added = this.get('entry.isAdded');\n\n        if (added) {\n            return;\n        }\n\n        this.set('entry.isAdded', true);\n        if (empty) {\n            this.$('.phone-input').trigger('focus');\n        }\n    },\n\n    cleanFieldForSave() {\n        if (this.get('entry.value') && this.get('$input')) {\n            var countryData = this.get('$input').intlTelInput('getSelectedCountryData');\n            if (countryData && countryData.iso2) {\n                this.set('entry.value.countryCode', countryData.iso2.toLocaleUpperCase());\n            }\n        }\n    },\n\n    isComplexFieldEmpty() {\n        var number = this.get('entry.value.number');\n        var extension = this.get('entry.value.extension');\n        return (\n            ((typeof number === 'string' && number.length === 0) || number === undefined) &&\n            ((typeof extension === 'string' && extension.length === 0) || extension === undefined)\n        );\n    },\n\n    setupTooltips() {\n        this.$('[data-toggle=\"tooltip\"]').tooltip();\n    },\n\n    _setupData() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        let entry = this.get('entry');\n        let entity = this.get('entity');\n        let emptyData = {\n            number: '',\n            extension: '',\n            acceptsSMS: false\n        };\n\n        if (_.isEmpty(entry) || (_.isEmpty(entry.value) && !this.get('field.repeatable'))) {\n            let path = this.get('field').getFieldPath();\n            entity.set(path, emptyData);\n            this.set('entry', _.last(entity.get(path)));\n        } else if (!_.isEmpty(entry) && _.isEmpty(entry.value)) {\n            Ember.set(entry, 'value', emptyData);\n        }\n    },\n\n    _setupInput() {\n        if (!this.get('editing') || this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        let $input = this.$('.phone-input');\n        if (!$input.length) {\n            // Input may not be in the DOM yet (e.g. canEdit still rendering) — retry a few times\n            const retries = this.get('_intlTelInputSetupRetries') || 0;\n            if (retries >= 5) {\n                return;\n            }\n            this.set('_intlTelInputSetupRetries', retries + 1);\n            const timer = Ember.run.scheduleOnce('afterRender', this, this._setupInput);\n            this.get('timers').addObject(timer);\n            return;\n        }\n        this.set('_intlTelInputSetupRetries', 0);\n\n        // Already initialised — still refresh accessible name (includes phone type)\n        if ($input.parent().hasClass('iti') || $input.closest('.iti').length) {\n            this.set('$input', $input);\n            setupIntlTelInputAccessibility($input, this.get('intl'), this.get('field.i18nLabel'));\n            return;\n        }\n\n        if (typeof $input.intlTelInput !== 'function') {\n            this.logger.error('intlTelInput jQuery plugin is not available');\n            return;\n        }\n\n        const orgCountryCode = this.get('session.org.orgDefaultCountryCode');\n        let countryCode = 'us';\n        if (orgCountryCode && typeof orgCountryCode === 'string') {\n            const normalized = orgCountryCode.toLowerCase();\n            // intl-tel-input expects an iso2 code; invalid values throw during init\n            if (/^[a-z]{2}$/.test(normalized)) {\n                countryCode = normalized;\n            }\n        }\n\n        try {\n            $input.intlTelInput(\n                buildIntlTelInputOptions(this.get('intl'), this.get('application'), {\n                    initialCountry: countryCode\n                })\n            );\n            setupIntlTelInputAccessibility($input, this.get('intl'), this.get('field.i18nLabel'));\n\n            $input.on('blur', function () {\n                //Let the Ember input binding know that the plugin updated the value after blur event.\n                $input.trigger('change');\n            });\n\n            this.set('$input', $input);\n            this.notifyPropertyChange('isValid');\n        } catch (err) {\n            this.logger.error('Failed to initialise intlTelInput', { err });\n        }\n    },\n\n    _setFieldDataValidity(value) {\n        this.set('fieldData.isValid', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"pA8qbsDD\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"labelFor\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"headingLevel\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"headingLevel\\\"]],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"phone-field-content \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value \\\",[26,[\\\"errorClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-number\\\"],null]]]],[15,\\\"type\\\",\\\"tel\\\"],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]],[16,\\\"class\\\",[34,[\\\"phone-input form-control phone-number \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"onfocus\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"focus\\\"],[[\\\"on\\\"],[\\\"focus\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-extension\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extensionLabel\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"key-up\\\",\\\"classNames\\\",\\\"class\\\",\\\"placeholder\\\",\\\"type\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-extension\\\"],null],[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"updateExtension\\\",\\\"form-control phone-extension\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-warning\\\"],null],[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],\\\"tel\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRequiredError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error help-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.validation.notANumber\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isNumberError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warn help-block\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.sms.errors.invalidNumberFormat\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasErrorCode\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[15,\\\"data-toggle\\\",\\\"tooltip\\\"],[15,\\\"data-placement\\\",\\\"right\\\"],[15,\\\"data-trigger\\\",\\\"hover\\\"],[16,\\\"title\\\",[34,[[26,[\\\"errorMessage\\\"]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\",\\\"ariaLabelledBy\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label-tag\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]],[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"value-type \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"primary-phone-choice\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimary\\\"],null],\\\"primaryPhone\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"isPrimary\\\"]],[28,[\\\"isPrimarySMS\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoiceSMS\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimary\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primaryVoice\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isPrimarySMS\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"label label-default\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null]]]],[13],[1,[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"value-type primary-sms-choice\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"radio-input\\\"],null,[[\\\"checked\\\",\\\"disabled\\\",\\\"onClick\\\",\\\"name\\\",\\\"ariaLabel\\\"],[[28,[\\\"isPrimarySMS\\\"]],[28,[\\\"isEmpty\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setPrimarySMS\\\"],null],\\\"primarySms\\\",[33,[\\\"t\\\"],[\\\"field.primaryFieldRadioAriaLabel\\\"],[[\\\"label\\\",\\\"name\\\",\\\"value\\\"],[[33,[\\\"t\\\"],[\\\"field.primarySMS\\\"],null],[28,[\\\"field\\\",\\\"i18nLabel\\\"]],[28,[\\\"entry\\\",\\\"value\\\",\\\"number\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loading-indicator\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/phone-field/template.hbs\"}});","import Ember from 'ember';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nexport default Ember.Component.extend(FieldComponentMixin, {\n    intl: Ember.inject.service(),\n\n    choice: Ember.computed.alias('entry.value'),\n\n    actions: {\n        setValue(value) {\n            if (!value) {\n                value = this.get('defaultValue.id');\n            }\n\n            this.set('choice', value);\n            Ember.set(this, 'entry.value', value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    },\n\n    populateFieldOnRender: Ember.observer('editing', function () {\n        const timer = Ember.run.scheduleOnce('afterRender', this, 'ensurePopulatedField');\n        this.timers.pushObject(timer);\n    }),\n\n    ensurePopulatedField() {\n        if (!this.get('editing')) {\n            return;\n        }\n\n        const path = this.get('field').getFieldPath();\n        const entry = this.get('entry');\n        const entity = this.get('entity');\n\n        if (this.isFieldEmpty()) {\n            let value = this.get('field.params.allowedValues')[0];\n\n            if (!value) {\n                value = '';\n            }\n\n            if (!isEmpty(entry)) {\n                Ember.set(entry, 'value', value);\n                entity.set(path, [entry], { overwrite: true });\n            } else {\n                entity.set(path, value);\n            }\n\n            this.set('entry', entity.getFieldValue(path));\n        }\n    },\n\n    defaultValue: Ember.computed('content', 'entry.value', function () {\n        const value = this.get('entry.value');\n        if (!isEmpty(value)) {\n            const defaultValue = find(this.get('content'), 'id', value);\n            if (!isEmpty(defaultValue)) {\n                return defaultValue;\n            }\n        }\n\n        return this.get('content.0.id');\n    }),\n\n    content: Ember.computed('field.params.allowedValues', function () {\n        const allowedValues = this.get('field.params.allowedValues') || [];\n        return allowedValues.map(value => {\n            const label = this.translatedAllowedValue(value).toString();\n            return {\n                id: value,\n                label\n            };\n        });\n    }),\n\n    translatedValue: Ember.computed('entry.value', function () {\n        const value = this.get('entry.value');\n        if (value) {\n            const fieldKey = this.get('field').getI18nKey();\n            const valueKey = value.replace(/\\./g, '_');\n            const key = `${fieldKey}_value_${valueKey}`;\n\n            if (this.get('intl').query(key)) {\n                return this.get('intl').lookup(key);\n            }\n        }\n        return value;\n    }),\n\n    translatedAllowedValue(value) {\n        const fieldKey = this.get('field').getI18nKey();\n        const valueKey = value.replace(/\\./g, '_');\n        const key = `${fieldKey}_value_${valueKey}`;\n\n        if (this.get('intl').query(key)) {\n            return this.get('intl').lookup(key);\n        }\n\n        return valueKey;\n    },\n\n    isFieldEmpty() {\n        const field = this.get('field');\n        const entity = this.get('entity');\n\n        if (field && entity) {\n            const path = this.get('field').getFieldPath();\n            const value = this.get('entity').getFieldValue(path);\n\n            return isEmpty(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Qv4n7ECK\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-10\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"select\\\",[]],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setValue\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"content\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"option\\\",[]],[16,\\\"value\\\",[28,[\\\"item\\\",\\\"id\\\"]],null],[16,\\\"selected\\\",[33,[\\\"eq\\\"],[[28,[\\\"choice\\\"]],[28,[\\\"item\\\",\\\"id\\\"]]],null],null],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"item\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"item\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"translatedValue\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/select-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\nimport { rerunLayouts } from '../../../utils/masonry';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['tags'],\n    classNameBindings: ['field.fieldPathClass'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n\n    actions: {\n        addTag(tag) {\n            let tags = this.get('entry.value');\n            if (!_.isEmpty(tag) || (typeof tag === 'string' && !_.isEmpty(tag.trim()))) {\n                if (tags.indexOf(tag) !== -1) {\n                    this.send('showDuplicateError', tag);\n                }\n                tags.addObject(tag);\n                rerunLayouts();\n            }\n        },\n\n        removeTag(tag) {\n            this.get('entry.value').removeObject(tag);\n            rerunLayouts();\n        },\n\n        showDuplicateError(tag) {\n            let addTag = this.$('.add-tag');\n\n            addTag\n                .tooltip({\n                    title: this.get('intl').lookup('tooltip.fields.tags.duplicate', { tag }).toString(),\n                    placement: 'bottom',\n                    trigger: 'manual'\n                })\n                .tooltip('show');\n\n            Ember.run.later(function () {\n                addTag.tooltip('destroy');\n            }, 3000);\n        },\n\n        navigateToSearchTag(queryParams) {\n            this.get('application').navigateTo('search', undefined, queryParams.values);\n        }\n    },\n\n    linkable: computed('field.fieldPath', function () {\n        const fieldPath = this.get('field.fieldPath');\n        return _.includes(['skills.skills', 'skills.certs'], fieldPath);\n    }),\n\n    sortedTags: computed('entry.value.[]', function () {\n        let tags = this.get('entry.value') || [];\n        return _.sortBy(tags, tag => tag.toLowerCase());\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    ensurePopulatedField: Ember.on('didRender', function () {\n        if (!this.get('editing') || this.isDestroyed) {\n            return;\n        }\n\n        const timer = Ember.run.once(this, this.setValues);\n        this.timers.pushObject(timer);\n    }),\n\n    setValues() {\n        let entry = this.get('entry');\n        let fieldPath = this.get('field').getFieldPath();\n        let entity = this.get('entity');\n\n        if (entity && (!entry || typeof entry.value !== 'object')) {\n            entity.set(fieldPath, [], { recordChange: true });\n            this.set('entry', entity.getFieldValue(fieldPath));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Handle keyboard events for remove buttons\n        this.$().on('keydown', '.remove-tag[role=\"button\"]', event => {\n            if (event.code === 'Enter' || event.code === 'Space') {\n                // ENTER or SPACE\n                event.preventDefault();\n                event.currentTarget.click();\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { on, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['tag-editor'],\n\n    ajax: inject.service(),\n    search: inject.service(),\n\n    attrs: {\n        field: null,\n        addTag() {}\n    },\n\n    tagValue: null,\n\n    currentRequest: null,\n\n    initTagInput: on('didInsertElement', function () {\n        let $typeahead = this.$('input').typeahead(\n            { highlight: true, hint: false },\n            {\n                name: 'tags',\n                async: true,\n                limit: 100,\n                displayKey: 'text',\n                source: Ember.run.bind(this, (query, syncResults, asyncResults) => {\n                    Ember.run.debounce(this, this.performSearch.bind(this, query, asyncResults), 300);\n                })\n            }\n        );\n\n        $typeahead.on('typeahead:selected', this.addTagFromTypeahead.bind(this));\n        $typeahead.on('typeahead:change', this.clearInput.bind(this));\n\n        this.$('input').on('blur', this.clearInput.bind(this));\n    }),\n\n    removeBehavior: on('willDestroyElement', function () {\n        this.$('input').typeahead('destroy');\n    }),\n\n    performSearch(query, cb) {\n        let type = 'purecloud.skills';\n        const fieldPath = this.get('field').getFieldPath();\n        if (fieldPath === 'skills.spokenLanguages') {\n            type = 'purecloud.languages';\n        }\n        const request = this.get('search').search({\n            types: ['tags'],\n            query: [\n                {\n                    type: 'TERM',\n                    value: type,\n                    fields: ['namespace']\n                },\n                {\n                    type: 'STARTS_WITH',\n                    value: query,\n                    fields: ['name']\n                }\n            ],\n            returnFields: ['key']\n        });\n        this.set('currentRequest', request);\n        return request\n            .then(data => {\n                let tags = data.results;\n                let suggestions = Ember.A(tags).map(function (tag) {\n                    return {\n                        value: tag.key,\n                        text: tag.key\n                    };\n                });\n\n                cb(suggestions);\n            })\n            .catch(() => {\n                cb([]);\n            });\n    },\n\n    addTagFromTypeahead(event, suggestion /*, dataset*/) {\n        Ember.run(() => {\n            this.attrs.addTag(suggestion.value);\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n        });\n    },\n\n    clearInput() {\n        Ember.run(() => {\n            if (!this.get('tagValue')) {\n                this.$('input').val('');\n            }\n        });\n    },\n\n    keyDown(event) {\n        if (eventToString(event) === 'ENTER') {\n            this.attrs.addTag(this.get('tagValue'));\n            this.set('tagValue', '');\n\n            this.$('input').typeahead('close');\n\n            let currentRequest = this.get('currentRequest');\n            if (currentRequest && currentRequest.abort) {\n                currentRequest.abort();\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"c9aPS9VM\",\"block\":\"{\\\"statements\\\":[[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-tag-add\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.add\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[1,[33,[\\\"input\\\"],null,[[\\\"class\\\",\\\"id\\\",\\\"value\\\",\\\"placeholder\\\"],[\\\"form-control tag-editor-input\\\",[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-tag-add\\\"],null],[28,[\\\"tagValue\\\"]],[33,[\\\"t\\\"],[\\\"common.add\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"add\\\"],[13],[0,\\\"+\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/tag-editor/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'span',\n    classNames: ['tag', 'tag-label', 'label-default'],\n    classNameBindings: ['flash'],\n\n    flash: false,\n\n    timers: [],\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const timer = Ember.run.scheduleOnce('afterRender', this, this.flashTag);\n        this.timers.pushObject(timer);\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    flashTag() {\n        this.set('flash', true);\n\n        const timer = Ember.run.later(\n            this,\n            () => {\n                this.set('flash', false);\n            },\n            500\n        );\n        this.timers.pushObject(timer);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"K7sP69JX\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-tag\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-fields/tag-field/tag-editor\\\"],null,[[\\\"field\\\",\\\"addTag\\\"],[[28,[\\\"field\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addTag\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-fields/tag-field/tag-wrapper\\\"],null,null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                        ×\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"sortedTags\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"linkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]]]]],[15,\\\"class\\\",\\\"tag tag-label label-default clickable\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateToSearchTag\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                                ×\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"search\\\",[33,[\\\"query-params\\\"],null,[[\\\"query\\\",\\\"entity\\\",\\\"queryFacets\\\"],[\\\"\\\",\\\"people\\\",[33,[\\\"join-strings\\\"],[\\\":\\\",[28,[\\\"field\\\",\\\"fieldPath\\\"]],[28,[\\\"tag\\\"]]],null]]]]],[[\\\"title\\\",\\\"classNames\\\"],[[33,[\\\"t\\\"],[\\\"search.forTag\\\"],[[\\\"tag\\\"],[[28,[\\\"tag\\\"]]]]],\\\"tag tag-label label-default clickable\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                                ×\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"tag tag-label label-default\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text\\\"],[13],[1,[28,[\\\"tag\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"remove-tag clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.remove\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.removeObject\\\"],[[\\\"name\\\",\\\"type\\\"],[[28,[\\\"tag\\\"]],\\\"\\\"]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeTag\\\",[28,[\\\"tag\\\"]]]],[13],[0,\\\"\\\\n                            ×\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"tag\\\"]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/tag-field/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport textValidator from '../../entity-fields/validators/text';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nconst { on, inject, observer, computed, Component } = Ember;\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['text-field'],\n    classNameBindings: ['canEdit:editing', 'onProfile:on-profile'],\n\n    intl: inject.service(),\n    embedded: inject.service(),\n\n    attrs: {\n        onProfile: false\n    },\n\n    onProfile: false,\n    isGeneralField: false,\n\n    actions: {\n        saveField(event) {\n            const value = event.target.value;\n            if (this.get('onProfile') && this.get('canEdit')) {\n                if (event.type === 'keyup' && event.keyCode !== 13) {\n                    return;\n                }\n                this.saveField(value);\n\n                if (this.get('isGeneralField')) {\n                    // notifyUserGeneralFieldUpdated will trigger a userGeneralFieldUpdated event to Web-Directory if entity is current user.\n                    const embedded = this.get('embedded');\n                    embedded.notifyUserGeneralFieldUpdated(this.get('entity.id'));\n                }\n            } else if (this.get('canEdit')) {\n                this.set('entry.value', value);\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    showPlaceholder: computed.reads('onProfile'),\n\n    isValid: computed('entry.value', function () {\n        let fieldData = this.get('fieldData');\n\n        if (fieldData) {\n            return fieldData.get('isValid');\n        } else {\n            let entry = this.get('entry');\n            let field = this.get('field');\n            return textValidator.isValid(entry, field);\n        }\n    }),\n\n    watchValidityToDisableModal: observer('isValid', function () {\n        const disable = this.get('disableModal');\n        if (typeof disable === 'function') {\n            Ember.run.next(null, disable, !this.get('isValid'));\n        }\n    }),\n\n    isEmpty: computed('entry.value', function () {\n        return this.isFieldEmpty();\n    }),\n\n    placeholderText: computed('showPlaceholder', function () {\n        if (this.get('showPlaceholder')) {\n            return this.get('field.i18nLabel');\n        }\n\n        return '';\n    }),\n\n    setMinWidth: observer('canEdit', 'entry.value', function () {\n        // self sizing behavior...\n        if (this.get('onProfile') && this.get('canEdit') && _.isEmpty(this.get('entry.value'))) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                let span = Ember.$('<span class=\"off-page\"></span>');\n                let placeholder = this.get('placeholderText');\n                span.text(placeholder);\n                this.$().append(span);\n                this.$('input').css('min-width', span.width() + 15);\n                span.remove();\n            });\n        }\n    }).on('didInsertElement'),\n\n    ensurePopulatedWhenEditing: observer('editing', 'canEdit', function () {\n        Ember.run.once(this, this.ensurePopulatedField);\n    }).on('didInsertElement'),\n\n    ensurePopulatedField() {\n        if ((!this.get('editing') || this.isDestroyed) && !this.get('isGeneralField')) {\n            return;\n        }\n        if (this.isFieldEmpty()) {\n            Ember.run.once(this, this.setValues);\n        }\n    },\n\n    setWidth: on('didRender', function () {\n        if (this.get('onProfile') && this.get('canEdit')) {\n            let span = this.$('span');\n            this.$('input').width(span.width() + 5);\n        }\n    }),\n\n    setValues() {\n        const entity = this.get('entity');\n        const field = this.get('field');\n        const path = field.getFieldPath();\n        const entry = this.get('entry');\n\n        if (!_.isEmpty(entry)) {\n            Ember.set(entry, 'value', '');\n\n            if (!field.get('repeatable')) {\n                entity.set(path, [entry], { overwrite: true });\n            }\n        } else {\n            entity.set(path, '');\n        }\n\n        if (!field.get('repeatable')) {\n            let value = entity.getFieldValue(path);\n            if (Array.isArray(value)) {\n                value = value[0];\n            }\n            this.set('entry', value);\n        }\n    },\n\n    isFieldEmpty() {\n        let entry = this.get('entry');\n\n        if (!entry) {\n            return true;\n        }\n\n        return _.isEmpty(entry.value);\n    },\n\n    getFieldError() {\n        const intl = this.get('intl');\n        let value = this.get('entry.value');\n        let maxLength = this.get('field.params.maxLength');\n        let fieldPath = this.get('field.fieldPath');\n        if (_.isEmpty(value) && _.includes(requiredFieldPaths, fieldPath)) {\n            return intl.lookup('tooltip.fields.text.requiredError').toString();\n        }\n\n        return intl.lookup('tooltip.fields.text.lengthError', { length: maxLength }).toString();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"20qjoxwv\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"field-label\\\"],null,[[\\\"id\\\",\\\"field\\\",\\\"entry\\\",\\\"entity\\\",\\\"editing\\\",\\\"writeable\\\",\\\"canEdit\\\",\\\"for\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-label\\\"],null],[28,[\\\"fieldData\\\",\\\"field\\\"]],[28,[\\\"entry\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"canEdit\\\"]],[28,[\\\"canEdit\\\"]],[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"placeholderText\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-text-field-label\\\"],null]]]],[13],[1,[26,[\\\"placeholderText\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholderText\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"aria-describedby\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-text-field-label\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],[16,\\\"value\\\",[34,[[28,[\\\"entry\\\",\\\"value\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"saveField\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.requiredField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"fieldSection.maxField\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"entry-value\\\"],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-field-value\\\"],null]]]],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"off-page\\\"],[13],[1,[28,[\\\"entry\\\",\\\"value\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/text-field/template.hbs\"}});","import Ember from 'ember';\n\nimport email from './validators/email';\nimport tag from './validators/tag';\nimport history from './validators/history';\nimport text from './validators/text';\nimport location from './validators/location';\nimport date from './validators/date';\nimport phone from './validators/phone';\nimport boolean from './validators/boolean';\nimport address from './validators/address';\nimport select from './validators/select';\nimport multiline from './validators/multiline-text';\nimport person from './validators/person';\nimport weblink from './validators/weblink';\nimport image from './validators/image';\n\nconst { getOwner, computed } = Ember;\n\nexport default Ember.Object.extend({\n    fieldConfig: computed(function () {\n        return getOwner(this).lookup('field-config:person');\n    }),\n\n    default: {\n        isValid() {\n            return false;\n        },\n\n        isEmpty() {\n            return true;\n        }\n    },\n    tag,\n    text,\n    date,\n    email,\n    phone,\n    image,\n    person,\n    select,\n    history,\n    boolean,\n    address,\n    location,\n    weblink,\n    'multiline-text': multiline\n}).create();\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(entry, field) {\n        var maxLength = field.get('params.maxLength');\n        if (entry && _.isEmpty(entry.value)) {\n            return true;\n        }\n        return !!(entry && entry.value && Ember.get(entry, 'value.length') <= maxLength);\n    },\n\n    isEmpty(entry) {\n        let value = entry.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","export default {\n    isValid(bool) {\n        let value = bool.value;\n        return (value !== undefined && value !== null) || value === '';\n    },\n\n    isEmpty(bool) {\n        let value = bool.value;\n        return value === undefined || value === null || value === '';\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(date, field) {\n        if (field.get('required')) {\n            let value = date.value;\n            return !_.isEmpty(value) && value.day && value.month && value.year;\n        }\n\n        return true;\n    },\n\n    isEmpty(date) {\n        if (!date) {\n            return true;\n        }\n\n        let value = date.value;\n        return _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let value = Ember.get(entry, 'value');\n        let path = field.getFieldPath();\n\n        if (value) {\n            if (typeof value.year !== 'number') {\n                delete value.year;\n            }\n\n            if (typeof value.month !== 'number') {\n                delete value.month;\n            }\n\n            if (typeof value.day !== 'number') {\n                delete value.day;\n            }\n\n            if (!value.year && !value.month && !value.day) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            let data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidEmail(email) {\n    let reg =\n        /^(([^<>()\\[\\]\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\]\\.,;:\\s@\"]+\\.)+[^<>()[\\]\\.,;:\\s@\"]{2,})$/;\n    return email.match(reg);\n}\n\nfunction isEmpty(email) {\n    let value = email && email.value;\n    return !!(value === undefined || value === null || _.isEmpty(value));\n}\n\nexport default {\n    isEmpty,\n\n    isValid(entry, field) {\n        const isGroupField = field.get('section.fieldConfig.entityType') === 'group';\n        if (isEmpty(entry) && isGroupField) {\n            return true;\n        }\n        var maxLength = field.get('params.maxLength');\n\n        return !!(entry && entry.value && entry.value.length <= maxLength && !!isValidEmail(entry.value));\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\n\nexport default {\n    isValid(history) {\n        if (history && history.value) {\n            let startDate = history.value.startDate;\n            let endDate = history.value.endDate;\n\n            let haveStartDate = !!(startDate && startDate.month && startDate.year);\n            let haveEndDate = !!(endDate && endDate.month && endDate.year);\n\n            if (!haveStartDate && !haveEndDate) {\n                return true;\n            } else if (!haveStartDate && haveEndDate) {\n                return false;\n            } else if (haveStartDate && !haveEndDate) {\n                return true;\n            } else {\n                if (startDate.year < endDate.year) {\n                    return true;\n                } else if (startDate.year > endDate.year) {\n                    return false;\n                } else {\n                    return startDate.month <= endDate.month;\n                }\n            }\n        }\n\n        return history;\n    },\n\n    isEmpty(history) {\n        let value = history.value;\n        // only required field is `where`\n        var where = Ember.get(value, 'where');\n        return where === undefined || _.isEmpty(where.trim());\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        let month, year, day;\n        let startDate = Ember.get(entry, 'value.startDate');\n        let endDate = Ember.get(entry, 'value.endDate');\n\n        if (moment.isMoment(startDate)) {\n            startDate = {\n                month: Ember.get(entry, 'value.startDate').format('M'),\n                year: Ember.get(entry, 'value.startDate').format('YYYY')\n            };\n        }\n\n        if (moment.isMoment(endDate)) {\n            endDate = {\n                month: Ember.get(entry, 'value.endDate').format('M'),\n                year: Ember.get(entry, 'value.endDate').format('YYYY')\n            };\n        }\n\n        if (startDate) {\n            day = parseInt(startDate.day);\n            month = parseInt(startDate.month);\n            year = parseInt(startDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete startDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete startDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete startDate.year;\n            }\n        } else if (startDate === undefined) {\n            startDate = {};\n        }\n\n        if (endDate) {\n            day = parseInt(endDate.day);\n            month = parseInt(endDate.month);\n            year = parseInt(endDate.year);\n\n            if (typeof day !== 'number' || isNaN(day)) {\n                delete endDate.day;\n            }\n            if (typeof month !== 'number' || isNaN(month)) {\n                delete endDate.month;\n            }\n            if (typeof year !== 'number' || isNaN(year)) {\n                delete endDate.year;\n            }\n        } else if (endDate === undefined) {\n            endDate = {};\n        }\n\n        if (entry.value) {\n            Ember.set(entry, 'value.startDate', startDate);\n            Ember.set(entry, 'value.endDate', endDate);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text !== undefined;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(location) {\n        if (!location) {\n            return false;\n        }\n\n        let value = location.value;\n        return !_.isEmpty(value.locationId);\n    },\n\n    isEmpty(location) {\n        if (!location) {\n            return true;\n        }\n\n        let value = location.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if (maxLength && text.value) {\n            return text.value.length <= maxLength;\n        }\n\n        if (field.get('required')) {\n            return !_.isEmpty(text);\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        if (!text) {\n            return true;\n        }\n\n        let value = text.value;\n        return _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid(text) {\n        return text;\n    },\n\n    isEmpty(person) {\n        if (!person) {\n            return true;\n        }\n        let value = person.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst requireFields = ['contactInfo.phone_other'];\n\nfunction isEmptyValue(value) {\n    return value === undefined || value === null || _.isEmpty(value.trim());\n}\n\nexport default {\n    isValid(entry, field, intl, $input) {\n        if (arguments.length !== 4 || !entry || !field || !$input || !intl) {\n            return true;\n        }\n\n        const path = field.getFieldPath();\n        const params = Ember.get(field, 'params');\n        const number = Ember.get(entry, 'value.number');\n        const extension = Ember.get(entry, 'value.extension');\n\n        const isRequired = _.includes(requireFields, path);\n        if (_.isEmpty(number) && _.isEmpty(extension)) {\n            return !isRequired;\n        }\n\n        if (_.isEmpty(number) && !_.isEmpty(extension)) {\n            return true;\n        }\n\n        let isValid = number.length <= params.numberMaxLength;\n\n        if (extension && extension.length) {\n            isValid = isValid && extension.length <= params.extensionMaxLength && !!number;\n        }\n\n        return isValid;\n    },\n\n    isEmpty(phone) {\n        if (!phone || !phone.value) {\n            return true;\n        }\n\n        let value = phone.value;\n        let number = Ember.get(value, 'number');\n        let extension = Ember.get(value, 'extension');\n        return isEmptyValue(number) && isEmptyValue(extension);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (value) {\n            if (_.isEmpty(value.number)) {\n                delete value.number;\n            }\n\n            if (_.isEmpty(value.extension)) {\n                delete value.extension;\n            }\n\n            if (!value.number && !value.extension) {\n                value = {};\n            }\n        }\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    isValid(select) {\n        if (!select) {\n            return false;\n        }\n\n        return !!(select && select.value);\n    },\n\n    isEmpty(select) {\n        let value = select.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    },\n\n    cleanFieldForEntity(entity, field, entry) {\n        if (!entry) {\n            return;\n        }\n\n        var value = Ember.get(entry, 'value');\n        var path = field.getFieldPath();\n\n        if (_.isEmpty(value)) {\n            var data = entity.get(path);\n            if (data) {\n                data.removeObject(entry);\n            }\n        } else {\n            Ember.set(entry, 'value', value);\n        }\n    }\n};\n","import _ from 'lodash';\n\nexport default {\n    isValid() {\n        return true;\n    },\n\n    isEmpty(tags) {\n        let value = tags.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import _ from 'lodash';\n\nconst requiredFieldPaths = ['general.name', 'contactInfo.im'];\n\nfunction isEmpty(text) {\n    if (typeof text === 'string') {\n        return _.isEmpty(text);\n    } else {\n        let value = text.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n}\n\nexport default {\n    isValid(text, field) {\n        if (!text) {\n            return false;\n        }\n\n        const maxLength = field.get('params.maxLength');\n        if ((maxLength && text.value && text.value.length > maxLength) || (!text.value && text.length > maxLength)) {\n            return false;\n        }\n\n        if ((field.get('required') || _.includes(requiredFieldPaths, field.getFieldPath())) && isEmpty(text)) {\n            return false;\n        }\n\n        return text !== undefined && text !== null;\n    },\n\n    isEmpty(text) {\n        return isEmpty(text);\n    }\n};\n","import _ from 'lodash';\n\nfunction isValidUrl(url) {\n    var reg =\n        /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/;\n    return reg.test(url);\n}\n\nexport default {\n    isValid(url) {\n        if (url && Object.prototype.hasOwnProperty.call(url, 'value')) {\n            url = url.value;\n        }\n\n        return _.isEmpty(url) || isValidUrl(url);\n    },\n\n    isEmpty(url) {\n        let value = url.value;\n        return value === undefined || value === null || _.isEmpty(value);\n    }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldComponentMixin from '../../../mixins/field-component';\n\nimport validator from '../validators/weblink';\n\nconst { inject, observer, Component } = Ember;\n\nexport default Component.extend(FieldComponentMixin, {\n    classNames: ['web-link'],\n\n    intl: inject.service(),\n\n    tooltip: null,\n\n    labelChoices: Ember.computed(function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(\n            this.get('field.labelKeys'),\n            function (labelKey) {\n                return {\n                    id: labelKey,\n                    label: this._s(`${baseKey}_labelKey_${labelKey}`)\n                };\n            },\n            this\n        );\n    }),\n\n    customLabel: Ember.computed(function () {\n        return '<i class=\"ion-link\"></i>';\n    }),\n\n    isValid: Ember.computed('entry.value', function () {\n        let entry = this.get('entry');\n        return entry && this.isValidUrl(entry);\n    }),\n\n    validityChanged: observer('isValid', 'isEmpty', function () {\n        Ember.run.scheduleOnce('afterRender', this, 'setupTooltips');\n    }).on('didInsertElement'),\n\n    isValidUrl(url) {\n        return validator.isValid(url);\n    },\n\n    isFieldEmpty() {\n        return _.isEmpty(this.get('entry.value'));\n    },\n\n    setupTooltips() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        let input = this.$('input');\n        if (this.get('isValid') && !this.get('isEmpty')) {\n            input.tooltip('destroy');\n            this.set('tooltip', null);\n        } else {\n            if (this.get('tooltip')) {\n                return;\n            }\n\n            let title = this.get('intl').lookup('tooltip.fields.weblink.error');\n            let tooltip = input\n                .attr('title', title)\n                .tooltip({\n                    placement: 'right',\n                    trigger: 'manual'\n                })\n                .tooltip('fixTitle')\n                .tooltip('show');\n            this.set('tooltip', tooltip);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"hik8w8PJ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-value values \\\",[28,[\\\"entry\\\",\\\"_id\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-link\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.webLink.name\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"classNames\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-link\\\"],null],[28,[\\\"entry\\\",\\\"value\\\"]],\\\"form-control\\\",[33,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]],\\\"validation-error\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"url\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"value\\\",\\\"title\\\"],[[28,[\\\"entry\\\",\\\"value\\\"]],[28,[\\\"entry\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-fields/weblink-field/template.hbs\"}});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { not, or, reads } from '@ember/object/computed';\nimport { bind, cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport $ from 'jquery';\nimport Popper from 'popper.js';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.get('applicationUrlPrefix') + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-mini-card-container'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials'\n    ],\n\n    feature: service(),\n    permissions: service(),\n    presenceSubscription: service(),\n    session: service(),\n    application: service(),\n\n    entity: null,\n    user: null,\n    size: 200,\n    self: null,\n    hoverParent: null,\n    type: 'profile',\n    applicationUrlPrefix: '',\n    showFavorite: true,\n    isPlaceholderImage: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    microCard: false,\n    showMiniCard: false,\n    showQueueToggle: false,\n    showPresenceDropdown: false,\n    showLogOffButton: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    imageLoadError: false,\n    isHoveringCard: false,\n    isHoveringImage: false,\n    hoverTimer: null,\n    isFirstHover: true,\n    canViewChat: true,\n    canViewVideo: true,\n\n    // Extensions for third-party UCC affordances\n    useMediaProviders: false,\n    haveMediaProviders: false,\n    mediaProviderComponent: null,\n    useIntegrationBadges: false,\n    integrationBadgesComponent: null,\n\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            attachment: 'together',\n            pin: ['left', 'right']\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    toggleFavorite() {},\n    callEntity() {},\n\n    actions: {\n        triggerShowMiniCard() {\n            once(this, this._displayHoverCard);\n            return false;\n        },\n        mouseEnterCard() {\n            this.set('isHoveringCard', true);\n            this.onHoverChanged();\n        },\n        mouseLeaveCard() {\n            this.set('isHoveringCard', false);\n            this.onHoverChanged();\n        },\n        onContact() {\n            run.next(() => this.set('showMiniCard', false));\n        },\n        navigateTo() {\n            this.get('application').navigateTo(this.get('entity.type'), this.get('entity.id'));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._attachListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n    },\n\n    isHovering: or('isHoveringCard', 'isHoveringImage'),\n    isOnline: not('entity.isOffline'),\n\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    tetherSelector: computed('elementId', function () {\n        return `#${this.get('elementId')}`;\n    }),\n\n    tetherElementId: computed('elementId', function () {\n        return `entity-mini-card-${this.get('elementId')}`;\n    }),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-mini-card`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    cardImageUrl: computed(\n        'entity',\n        'entity.isLoaded',\n        'entity.profilePicture',\n        'entity.profilePictureSizes',\n        function () {\n            if (this.get('type') === 'profile') {\n                return this.getProfilePicture(75);\n            } else {\n                return '';\n            }\n        }\n    ),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.get('initialsPlaceholderSupported') && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('showPresence') && this.get('entity.type') === 'person';\n    }),\n\n    entityIsGroup: computed('entity.type', function () {\n        return this.get('entity.type') === 'group';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    isSelfEntity: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    isInUsersUIAdmin: computed('application.adminUIContext', 'session.features', function () {\n        return (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        );\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', true);\n        return this.placeholderImage(this.get('entity'));\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('size');\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    mouseEnter() {\n        this.set('isHoveringImage', true);\n        this.onHoverChanged();\n    },\n\n    mouseLeave() {\n        this.set('isHoveringImage', false);\n        this.onHoverChanged();\n    },\n\n    _createPopper() {\n        const el = this.element;\n        if (!el) {\n            return;\n        }\n\n        const targetEl = el.querySelector('.mini-card-component-wrapper');\n        const cardEl = el.querySelector('.entity-mini-card');\n\n        this._popper = new Popper(targetEl, cardEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                offset: {\n                    offset: '40%p,10px'\n                },\n                arrow: {\n                    element: '.arrow'\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _displayHoverCard() {\n        if (!this.get('showMiniCard') && this.get('_state') === 'inDOM' && this.get('enableMiniCard')) {\n            this.set('showMiniCard', true);\n            scheduleOnce('afterRender', this, function () {\n                this._createPopper();\n\n                const image = new Image();\n                image.src = this.get('cardImageUrl');\n                image.onload = () => {\n                    this.set('imageLoadError', false);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n                image.onerror = () => {\n                    this.set('imageLoadError', true);\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                };\n            });\n        }\n    },\n\n    onHoverChanged() {\n        const hoverTimeout = 800;\n        const isHovering = this.get('isHovering');\n        let timer = this.get('hoverTimer');\n\n        cancel(timer);\n\n        if (isHovering) {\n            if (!this.get('enableMiniCard')) {\n                return;\n            }\n\n            timer = later(() => {\n                this._displayHoverCard();\n            }, hoverTimeout);\n        } else {\n            timer = later(() => {\n                if (!this.get('isHovering') && this.get('_state') === 'inDOM') {\n                    scheduleOnce('afterRender', this, () => {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                    });\n                }\n            }, hoverTimeout);\n        }\n\n        this.set('hoverTimer', timer);\n    },\n\n    _attachListeners() {\n        let id = this.get('uniqueId');\n\n        $(window).on(\n            'click.' + id,\n            bind(this, function (event) {\n                if (!event) {\n                    return;\n                }\n                let target = $(event.target);\n\n                let clickedHoverCard = target.parents('#' + id).length || target.parents('.entity-mini-card').length;\n                let checkHoverState = !clickedHoverCard;\n\n                if (checkHoverState) {\n                    if (this.get('showMiniCard')) {\n                        this.set('showMiniCard', false);\n                        this._destroyPopper();\n                        event.preventDefault();\n                    }\n                }\n            })\n        );\n    },\n\n    _removeListeners() {\n        const id = this.get('elementId');\n        const uniqueId = this.get('uniqueId');\n        this.$().off(`.${id}`);\n        $(window).off(`.${uniqueId}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Bw0eX6lh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"mini-card-component-wrapper\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerShowMiniCard\\\"]],[13],[0,\\\"\\\\n    \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"enableMiniCard\\\"]],[28,[\\\"showMiniCard\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"entity-mini-card visible\\\\n        \\\",[26,[\\\"tetherElementId\\\"]],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"microCard\\\"]],\\\"micro-card\\\"],null],\\\"\\\\n        \\\",[33,[\\\"if\\\"],[[28,[\\\"imageLoadError\\\"]],\\\"image-load-error\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseEnterCard\\\"],[[\\\"on\\\"],[\\\"mouseEnter\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"mouseLeaveCard\\\"],[[\\\"on\\\"],[\\\"mouseLeave\\\"]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"arrow\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"left-bar chat-presence \\\",[26,[\\\"chatPresenceClass\\\"]]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityDeleted\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],[[\\\"classNames\\\"],[\\\"image-link\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[26,[\\\"name\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"name\\\"]],null],[16,\\\"src\\\",[34,[[26,[\\\"cardImageUrl\\\"]]]]],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"useIntegrationBadges\\\"]],[28,[\\\"integrationBadgesComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"integrationBadgesComponent\\\"]]],[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"entityIsGroup\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"wrap\\\",\\\"showStatus\\\",\\\"isChatEnabled\\\"],[[28,[\\\"entity\\\"]],true,false,[28,[\\\"isChatEnabled\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"isGeolocationEnabled\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"isGeolocationEnabled\\\"]],\\\"entity-geolocation align-center\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-selector-dropdown\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-bar\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"name-header\\\"],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasChatStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"presence-label-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-quote-left blockquote-start\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showQueueToggle\\\"]],[28,[\\\"permissions\\\",\\\"canViewSupervisorStatusControls\\\"]],[28,[\\\"isOnline\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"queue-toggle-switch\\\"],null,[[\\\"dataOn\\\",\\\"dataOff\\\",\\\"entity\\\",\\\"continueOnQueue\\\"],[\\\"toggle.onQueue\\\",\\\"toggle.offQueue\\\",[28,[\\\"entity\\\"]],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showLogOffButton\\\"]],[28,[\\\"permissions\\\",\\\"canLogOffAgents\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"logoff-link\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isSelfEntity\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"linkProfile\\\",\\\"showFavorite\\\",\\\"compact\\\",\\\"showImages\\\",\\\"phoneServiceEnabled\\\",\\\"phoneAvailable\\\",\\\"isOneToOneOfflineOrBusy\\\",\\\"isChatEnabled\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"onContact\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"useMediaProviders\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entityDeleted\\\"]]],null],[28,[\\\"showFavorite\\\"]],true,false,[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isOneToOneOfflineOrBusy\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"onContact\\\"],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"useMediaProviders\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"user\\\"]],[28,[\\\"useMediaProviders\\\"]],[28,[\\\"mediaProviderComponent\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"mediaProviderComponent\\\"]]],[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isInUsersUIAdmin\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[15,\\\"class\\\",\\\"image-link\\\"],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"navigateTo\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"components.entities.goToProfile\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-hover-card-v2/template.hbs\"}});","define(\"connections-ui/components/entity-hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { and, reads } from '@ember/object/computed';\nimport { cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport $ from 'jquery';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.get('applicationUrlPrefix') + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-image'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndChatEnabled:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials',\n        'entityIsContact:external-contact'\n    ],\n\n    presenceSubscription: service(),\n\n    // parameters used by entity image\n    entity: null,\n    size: 200,\n    type: 'profile',\n    isLinkable: false,\n    applicationUrlPrefix: '',\n    subscribeToPresence: false,\n    showStatusQuote: false,\n    imageLoadError: false,\n    isPlaceholderImage: true,\n    showPresence: false,\n    canViewChat: true,\n    canViewVideo: true,\n    // parameters passed through to entity hover card\n    self: null,\n    showFavorite: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    isVideoButtonEnabled: false,\n    // entity image logic\n\n    init() {\n        this._super(...arguments);\n        once(this, this._managePresenceSubscription);\n    },\n\n    callEntity() {},\n    toggleFavorite() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.on('load', () => {\n                const func = this.get('componentUpdated');\n                if (func && typeof func === 'function') {\n                    run(() => this.get('componentUpdated')());\n                }\n            });\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removePresenceSubscription();\n        const $img = this.$(`#${this.get('uniqueId')}`);\n        if ($img && $img.length) {\n            $img.off();\n        }\n\n        if (this.get('_animationRun')) {\n            cancel(this.get('_animationRun'));\n        }\n    },\n\n    managePresenceSubscription: observer(\n        'isChatEnabled',\n        'entity.type',\n        'entity.jid',\n        'subscribeToPresence',\n        function () {\n            once(this, this._managePresenceSubscription);\n        }\n    ),\n\n    displayStatusQuote: and('showPresenceAndChatEnabled', 'showStatusQuote', 'entity.hasChatStatus'),\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.get('elementId')}-entity-image`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    linkToProfileRoute: computed('entity.type', function () {\n        if (this.get('entity.type') === 'person') {\n            return 'person.detail';\n        } else if (this.get('entity.type') === 'group') {\n            return 'group.detail';\n        }\n        return 'person.detail';\n    }),\n\n    imageUrl: computed('entity', 'entity.isLoaded', 'entity.profilePicture', 'entity.profilePictureSizes', function () {\n        if (this.get('type') === 'profile') {\n            return this.getProfilePicture();\n        } else {\n            return '';\n        }\n    }),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.get('initialsPlaceholderSupported') && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.get('useInitialsPlaceholder') && this.get('isPlaceholderImage') && !!this.get('nameInitials');\n        }\n    ),\n\n    _animationRun: null,\n    _currentPresence: null,\n    isStatusAnimating: false,\n    animateOnPresenceChange: observer('chatPresence', function () {\n        const nextPresence = this.get('chatPresence');\n        const prevPresence = this.get('_currentPresence');\n        this.set('_currentPresence', nextPresence);\n        if (nextPresence !== prevPresence) {\n            this.set('isStatusAnimating', true);\n            const animationPeriod = 1250;\n            if (this.get('_animationRun')) {\n                cancel(this.get('_animationRun'));\n            }\n            this.set(\n                '_animationRun',\n                later(() => {\n                    if (!this.isDestroying && !this.isDestroyed) {\n                        this.set('isStatusAnimating', false);\n                        this.set('_animationRun', null);\n                    }\n                }, animationPeriod)\n            );\n        }\n    }),\n\n    showPresenceAndChatEnabled: computed('isChatEnabled', 'showPresence', 'entity.type', function () {\n        return this.get('isChatEnabled') && this.get('showPresence') && this.get('entity.type') === 'person';\n    }),\n\n    entityIsContact: computed('entity.type', function () {\n        return this.get('entity.type') === 'externalContact';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.modifyPlaceholderImage, false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.modifyPlaceholderImage, true);\n        return this.placeholderImage(this.get('entity'));\n    },\n\n    modifyPlaceholderImage(value) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        this.set('isPlaceholderImage', value);\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.get('size');\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    _removePresenceSubscription() {\n        if (this.get('subscribeToPresence')) {\n            this.get('presenceSubscription').autoSubscribe(null, this);\n        }\n    },\n\n    _managePresenceSubscription() {\n        if (this.get('subscribeToPresence') && this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"N/zSf8dm\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"self\\\",\\\"hoverParent\\\",\\\"showFavorite\\\",\\\"isChatEnabled\\\",\\\"phoneAvailable\\\",\\\"isWebrtcEnabled\\\",\\\"enableMiniCard\\\",\\\"isOneToOneOffline\\\",\\\"videoTooltipTitle\\\",\\\"phoneServiceEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"applicationUrlPrefix\\\",\\\"showPresenceDropdown\\\",\\\"showLogOffButton\\\",\\\"showQueueToggle\\\",\\\"callEntity\\\",\\\"toggleFavorite\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"self\\\"]],[28,[\\\"elementId\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"isChatEnabled\\\"]],[28,[\\\"phoneAvailable\\\"]],[28,[\\\"isWebrtcEnabled\\\"]],[28,[\\\"enableMiniCard\\\"]],[28,[\\\"isOneToOneOffline\\\"]],[28,[\\\"videoTooltipTitle\\\"]],[28,[\\\"phoneServiceEnabled\\\"]],[28,[\\\"isVideoButtonEnabled\\\"]],[28,[\\\"applicationUrlPrefix\\\"]],[28,[\\\"showPresenceDropdown\\\"]],[28,[\\\"showLogOffButton\\\"]],[28,[\\\"showQueueToggle\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"callEntity\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleFavorite\\\"]]],null],[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"displayStatusQuote\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc-moon pc-quote-right status-quote \\\",[26,[\\\"chatPresence\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isLinkable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"enableMiniCard\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"linkToProfileRoute\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"external-contact-icon\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"top\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"center\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"bottom\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-initials-icon\\\"],[13],[1,[26,[\\\"nameInitials\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"isStatusAnimating\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-status\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-radiate chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"animated-pulse chat-presence-bg-color\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"img\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"uniqueId\\\"]]]]],[15,\\\"alt\\\",\\\"\\\"],[15,\\\"role\\\",\\\"presentation\\\"],[16,\\\"class\\\",[34,[\\\"full-width-image \\\",[26,[\\\"entityType\\\"]]]]],[16,\\\"src\\\",[26,[\\\"imageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[18,\\\"default\\\",[[28,[\\\"elementId\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-image-v2/template.hbs\"}});","define(\"connections-ui/components/entity-image/component\", [\"exports\", \"ember-purecloud-components/components/entity-image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-location/component\", [\"exports\", \"ember-purecloud-components/components/entity-location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini'],\n    classNameBindings: ['entityTypeClass', 'isClickable:clickable'],\n\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    // fallback to `showPresence` when this is undefined\n    subscribeToPresence: undefined,\n\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    actions: {\n        sendToProfile: function () {\n            let person = this.get('entity');\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [person]\n            });\n        }\n    },\n\n    phoneTooltip: Ember.computed(function () {\n        return this.get('intl').lookup('tooltip.contactIcon.phone');\n    }),\n\n    entityTypeClass: Ember.computed('entity.type', function () {\n        if (!this.get('entity.type')) {\n            return 'empty-type';\n        }\n\n        return Ember.String.dasherize(this.get('entity.type'));\n    }),\n\n    entityIsPerson: Ember.computed.equal('entity.type', 'person'),\n\n    entityIsQueue: Ember.computed.equal('entity.type', 'queue'),\n\n    entityIsMe: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityIsGroup: Ember.computed.equal('entity.type', 'group'),\n\n    entityIsContact: Ember.computed.equal('entity.type', 'externalContact'),\n\n    canContactEntity: Ember.computed('entityIsGroup', 'entityIsPerson', 'entityIsContact', function () {\n        return this.get('entityIsPerson') || this.get('entityIsGroup') || this.get('entityIsContact');\n    }),\n\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    useInitials: Ember.computed.reads('entityIsContact'),\n\n    showOrganization: Ember.computed('entityIsContact', function () {\n        return this.get('entityIsContact') && !!this.get('entity.organization');\n    }),\n\n    entityRoutePath: Ember.computed('entity.type', function () {\n        let type = this.get('entity.type');\n        if (type === 'floor') {\n            type = 'location';\n        }\n\n        return `${type}.detail`;\n    }),\n\n    isClickable: Ember.computed('entity._entity', 'entity.type', function () {\n        const type = this.get('entity.type');\n        if (type === 'floor' || type === 'location' || type === 'externalContact') {\n            return false;\n        }\n        const entity = this.get('entity._entity');\n        return entity !== 'locations' && this.get('clickToProfile');\n    }),\n\n    _subscribePresence: Ember.computed('showPresence', 'subscribeToPresence', function () {\n        const subscribe = this.get('subscribeToPresence');\n        if (subscribe === undefined) {\n            return this.get('showPresence');\n        }\n\n        return subscribe;\n    }),\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    click: function (event) {\n        if (!this.get('isClickable')) {\n            return;\n        }\n        const target = Ember.$(event.target);\n        if (target.is('a') || target.is('i') || target.parents().is('.entity-contact')) {\n            // Defer to link-to or primary contact icon action\n            //event.stopPropagation();\n            //event.preventDefault();\n            return;\n        }\n\n        if (this.get('isSearchResult')) {\n            // When this is a search result, only allow the link-to elements for transitioning due to the extra realestate.\n            return false;\n        }\n\n        if (!target.is('a')) {\n            this.send('sendToProfile');\n        }\n    },\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            if (!this.get('entity')) return;\n\n            return {\n                wrap: false,\n                showStatus: true,\n                showActivity: true,\n                eActivityPresenceClass: Ember.get(this.entity, 'activityPresenceClass'),\n                totalCalls: Ember.get(this.entity, 'activityValues.calls'),\n                totalChats: Ember.get(this.entity, 'activityValues.chats'),\n                totalEmails: Ember.get(this.entity, 'activityValues.emails'),\n                totalMessages: Ember.get(this, 'totalMessages'),\n                totalSocialExpression: Ember.get(this, 'totalSocialExpression'),\n                presenceLabel: Ember.get(this.entity, 'presenceLabel'),\n                eChatStatus: Ember.get(this.entity, 'chatStatus'),\n                isShowingActivitySummary: Ember.get(this.entity, 'showConversationSummaryIndicator')\n            };\n        }\n    )\n});\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport ViewportMixin from '../../../mixins/viewport';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend(ViewportMixin, {\n    classNameBindings: ['enteredViewport:in-viewport:outside-viewport', 'hasRequiredPermission::no-permission'],\n\n    session: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n    requiredPermission: null,\n\n    hasRequiredPermission: Ember.computed(\n        'requiredPermission.[]',\n        'entity.extends.authorization.permissions',\n        function () {\n            const requiredPermission = this.get('requiredPermission') || [];\n            const perms = this.get('entity.expands.authorization.permissions') || [];\n            if (requiredPermission.length && perms.length) {\n                const agentHasOnQueue = perms.includes(`routing:agent:onqueue`);\n                const agentHasRequiredPermission = !!requiredPermission.find(permission => {\n                    return perms.includes(permission);\n                });\n                return agentHasRequiredPermission || !agentHasOnQueue;\n            }\n            return true;\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!isTesting) {\n            run.join(this, this._subscribeToPresence);\n        }\n    },\n\n    didEnterViewport() {\n        run(() => run.once(this, this._subscribeToPresence));\n        this._super(...arguments);\n    },\n\n    didExitViewport() {\n        // A run loop is needed here because the mixin invokes this\n        // function using request animation frame as opposed to Ember\n        // backburner.\n        run(() => run.once(this, this._unsubscribeFromPresence));\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._unsubscribeFromPresence();\n        this._super(...arguments);\n    },\n\n    _subscribeToPresence() {\n        if (this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.get('presenceSubscription').autoSubscribe([this.get('entity')], this);\n        }\n    },\n\n    _unsubscribeFromPresence() {\n        this.get('presenceSubscription').autoSubscribe(null, this);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"gyhZ7ZGJ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"showFavorite\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"isSearchResult\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"showFavorite\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],[28,[\\\"isSearchResult\\\"]]]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"chat\\\",\\\"enabled\\\"]],[28,[\\\"showFavorite\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/default/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-details'],\n\n    // Child of entity-mini display only all attributes are inherited\n    entityIsPerson: false,\n    entityIsContact: false,\n    entityIsMe: false,\n    showDepartment: true,\n    showOrganization: false,\n    showPresence: false,\n    isPresenceLabelToggleEnabled: false,\n    subscribeToPresence: false,\n    canContactEntity: false,\n    useInitials: false,\n    isClickable: false,\n    entity: null,\n    entityLocationData: null,\n    presenceLabelData: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"cu2qwlzH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]],\\\"external-contact-image\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"isClickable\\\"]],\\\"not-clickable\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"useInitialsPlaceholder\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"_subscribePresence\\\"]],[28,[\\\"useInitials\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"information \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"is-me\\\"],null],\\\" \\\",[33,[\\\"unless\\\"],[[28,[\\\"showActions\\\"]],\\\"actions-hide\\\"],null]]]],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]],\\\"-1\\\",\\\"0\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[18,\\\"default\\\",[\\\"details\\\"]],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showDepartment\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsContact\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"organization\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"description\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"entity\\\",\\\"description\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entityIsGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"group-type \\\",[28,[\\\"entity\\\",\\\"groupType\\\"]]]]],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"entity\\\",\\\"groupType\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"hasGeolocation\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"geolocation-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-geolocation\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"entityIsPerson\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"item\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/entity-details/template.hbs\"}});","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport default Ember.Component.extend(RelateFeaturesMixin, {\n    classNames: ['external-contact'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    externalContact: null,\n    showPhones: true,\n    showEmails: false,\n    showAcceptsSMS: true,\n    acdOutboundWhatsApp: true,\n\n    _getEmailTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return /.*Email$/.test(modelKey);\n        });\n    },\n\n    _getPhoneTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return this.get('acdOutboundWhatsApp') ? /.*Phone$|whatsAppId/.test(modelKey) : /.*Phone$/.test(modelKey);\n        });\n    },\n\n    dropdownTitle: Ember.computed('phones', function () {\n        return this.get('intl').t('purecloud.acdInteraction.relate.titles.selectPhone');\n    }),\n\n    externalContactHasNoEmailAddresses: Ember.computed.not('externalContact.hasEmailAddresses'),\n\n    phones: Ember.computed(function () {\n        if (!this.get('showPhones')) {\n            return [];\n        }\n        return this._getPhoneTypes().reduce((phones, phoneType) => {\n            if (this.get(`externalContact.${phoneType}.display`)) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.phoneTypes.${phoneType}`\n                );\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.display`),\n                    e164: this.get(`externalContact.${phoneType}.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.acceptsSMS`),\n                    canUseNonE164\n                });\n            } else if (\n                this.get('acdOutboundWhatsApp') &&\n                this.get(`externalContact.${phoneType}.phoneNumber.display`)\n            ) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const typeName = phoneType.replace(/Id/, '').toLowerCase();\n                const phoneTypeTranslated = this.get('intl').t(\n                    `purecloud.acdInteraction.relate.channelTypes.${typeName}`\n                );\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.phoneNumber.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.phoneNumber.display`),\n                    e164: this.get(`externalContact.${phoneType}.phoneNumber.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.phoneNumber.acceptsSMS`),\n                    canUseNonE164\n                });\n            }\n            return phones;\n        }, []);\n    }),\n\n    externalContactHasNoPhoneNumbers: Ember.computed.empty('phones'),\n\n    emails: Ember.computed(function () {\n        if (!this.get('showEmails')) {\n            return [];\n        }\n        return this._getEmailTypes().reduce((email, emailType) => {\n            if (this.get(`externalContact.${emailType}`)) {\n                return email.concat({\n                    type: this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`),\n                    address: this.get(`externalContact.${emailType}`)\n                });\n            }\n            return email;\n        }, []);\n    }),\n\n    hasMultipleEmails: Ember.computed.gt('emails.length', 1),\n\n    hasMultiplePhoneRecords: Ember.computed.gt('phones.length', 1),\n\n    actions: {\n        selectEntityWithEmail(email, emailType, event) {\n            this.set('externalContact.email', email);\n            this.set('externalContact.emailType', emailType);\n            if (typeof this.get('onSelectEmail') === 'function') {\n                this.get('onSelectEmail')(email, emailType, event);\n            }\n        },\n\n        selectEntityWithPhone(phoneNumber, phoneType, event) {\n            this.set('externalContact.phoneNumber', phoneNumber);\n            this.set('externalContact.phoneType', phoneType);\n            if (typeof this.get('onSelectPhone') === 'function') {\n                this.get('onSelectPhone')(phoneNumber, phoneType, event);\n            }\n        },\n\n        onPreventClick(event) {\n            event.stopPropagation();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Ao/YabLy\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-mini external-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profileImage\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"defaultWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"initials\\\"],[13],[1,[28,[\\\"externalContact\\\",\\\"initials\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information contactWrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"onPreventClick\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"external-contact-name\\\"],[13],[1,[33,[\\\"full-name\\\"],[[28,[\\\"externalContact\\\"]]],null],false],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"viewDetails\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[[28,[\\\"contactRoute\\\"]],[28,[\\\"externalContact\\\"]]],[[\\\"bubbles\\\"],[[28,[\\\"preventExternalContactDefault\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.viewExternalContactDetails\\\"],null],null],[15,\\\"class\\\",\\\"fa fa-arrow-up\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canShowCustomFields\\\"]],[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"schema-title\\\"],[13],[1,[33,[\\\"await\\\"],[[28,[\\\"externalContact\\\",\\\"schemaTitle\\\"]]],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"organization\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"externalContact\\\",\\\"externalOrganization\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.relateExternalContactDetails.atOrg\\\"],null],false],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"externalContact\\\",\\\"externalOrganization\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information phones phonesWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phones\\\"]],[28,[\\\"showPhones\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"externalContactHasNoPhoneNumbers\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phonesExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"phones\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"canUseNonE164\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithPhone\\\",[33,[\\\"or\\\"],[[28,[\\\"phone\\\",\\\"e164\\\"]],[28,[\\\"phone\\\",\\\"number\\\"]]],null],[28,[\\\"phone\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phone\\\"],[13],[0,\\\"\\\\n                                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"number-container\\\"],[13],[0,\\\"\\\\n                                                \\\"],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"phone\\\",\\\"acceptsSMS\\\"]],[28,[\\\"showAcceptsSMS\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"keepInWindow\\\",\\\"setPin\\\",\\\"side\\\",\\\"target\\\"],[true,true,\\\"top\\\",[33,[\\\"concat\\\"],[\\\"#list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon-container\\\"],[13],[0,\\\"\\\\n                                                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[\\\"list-phone-sms-\\\",[28,[\\\"phone\\\",\\\"phoneTypeId\\\"]]],null]]]],[15,\\\"class\\\",\\\"svg-icon accept-sms\\\"],[15,\\\"icon-name\\\",\\\"device-cellphone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"phoneType\\\"],[13],[1,[28,[\\\"phone\\\",\\\"type\\\"]],false],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"div\\\",[]],[13],[1,[28,[\\\"phone\\\",\\\"number\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"phone\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showPhones\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noPhones\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information emails emailsWrapper\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"emailsExpanded\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"selectable\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectEntityWithEmail\\\",[28,[\\\"email\\\",\\\"address\\\"]],[28,[\\\"email\\\",\\\"type\\\"]]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"emailType\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"type\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"email ellipsis\\\"],[16,\\\"tooltip\\\",[34,[[28,[\\\"email\\\",\\\"address\\\"]]]]],[15,\\\"tooltip-popup-delay\\\",\\\"500\\\"],[15,\\\"tooltip-placement\\\",\\\"bottom\\\"],[13],[0,\\\"\\\\n                                        \\\"],[1,[28,[\\\"email\\\",\\\"address\\\"]],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"email\\\"]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEmails\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"noEmails\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.acdInteraction.relate.search.emailNotProvided\\\"],null],false],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/external-contact/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\n\nexport default Ember.Component.extend({\n    classNames: ['entity-mini-queue'],\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    queueService: Ember.inject.service('queue'),\n    permissions: Ember.inject.service(),\n\n    makingCall: false,\n    isDetailsLoaded: false,\n    isDetailsLoading: false,\n\n    queue: null,\n    clickToProfile: false,\n    showActions: false,\n\n    canViewQueueDetails: Ember.computed.bool('permissions.canViewQueueObservations'),\n\n    actions: {\n        getQueueData: function () {\n            const id = this.get('queue.id');\n\n            // Ultimately, UX wants to show the following:\n            //   - Active agents\n            //   - Waiting customers by media type\n            //   - Longest wait time (AR-1102)\n            //   - Queue description  (CW-724 is the closest JIRA that mentions this, https://projects.invisionapp.com/share/545F0JYVS#/screens/124326256)\n\n            if (id) {\n                this.set('isDetailsLoading', true);\n                let promises = {\n                    waitTimePromise: this.get('queueService').getQueueEstimatedWaitTime(id, this.get('interactionType'))\n                };\n\n                Ember.RSVP.hash(promises)\n                    .then(hash => {\n                        const joinedData = hash.joinedPromise;\n                        const waitTimeResults = hash.waitTimePromise.results;\n                        const getMetricCount = function (array, metricName) {\n                            const metricData = _.find(array, { metric: metricName });\n                            return metricData.stats.count;\n                        };\n\n                        const getOnQueueCounts = function (array, routingStatus) {\n                            const getRoutingStatusCount = function (datum, routingStatus) {\n                                if (routingStatus) {\n                                    return datum.metric === 'oOnQueueUsers' && datum.qualifier === routingStatus;\n                                }\n                                return datum.metric === 'oOnQueueUsers';\n                            };\n                            return _.chain(array)\n                                .filter(_.partial(getRoutingStatusCount, _, routingStatus))\n                                .map(_.property('stats.count'))\n                                .filter(value => typeof value === 'number')\n                                .sum()\n                                .value();\n                        };\n\n                        const getWaitTime = function (array) {\n                            const bestTime = _.find(array, { formula: 'BEST' });\n                            if (bestTime) {\n                                return bestTime.estimatedWaitTimeSeconds;\n                            }\n                        };\n\n                        const joined = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === undefined;\n                        });\n                        const callData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'voice';\n                        });\n\n                        const callbackData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'callback';\n                        });\n\n                        const chatData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'chat';\n                        });\n\n                        const emailData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'email';\n                        });\n\n                        const messageData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'message';\n                        });\n\n                        let onQueueCount = 0;\n                        let idleCount = 0;\n                        if (joined) {\n                            onQueueCount = getOnQueueCounts(joined.data);\n                            idleCount = getOnQueueCounts(joined.data, 'IDLE');\n                        }\n\n                        let callWaiting;\n                        if (callData) {\n                            callWaiting = getMetricCount(callData.data, 'oWaiting');\n                        }\n\n                        let callbackWaiting;\n                        if (callbackData) {\n                            callbackWaiting = getMetricCount(callbackData.data, 'oWaiting');\n                        }\n\n                        let chatWaiting;\n                        if (chatData) {\n                            chatWaiting = getMetricCount(chatData.data, 'oWaiting');\n                        }\n\n                        let emailWaiting;\n                        if (emailData) {\n                            emailWaiting = getMetricCount(emailData.data, 'oWaiting');\n                        }\n\n                        let messageWaiting;\n                        if (messageData) {\n                            messageWaiting = getMetricCount(messageData.data, 'oWaiting');\n                        }\n\n                        let queueData = {\n                            agentData: `${idleCount}/${onQueueCount}`,\n                            callCount: callWaiting,\n                            callbackCount: callbackWaiting,\n                            chatCount: chatWaiting,\n                            emailCount: emailWaiting,\n                            messageCount: messageWaiting\n                        };\n\n                        let waitStr;\n                        const bestWaitTime = getWaitTime(waitTimeResults);\n                        if (bestWaitTime !== undefined) {\n                            // show estimated wait time\n                            const wait = moment.duration(bestWaitTime * 1000); // convert from sec to ms\n\n                            const intl = this.get('intl');\n                            let hr = wait.hours(),\n                                min = wait.minutes(),\n                                sec = wait.seconds();\n                            if (hr) {\n                                // use hours, minutes, & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.hoursMinutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString(),\n                                    hours: hr.toString()\n                                });\n                            } else if (min) {\n                                // use minutes & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.minutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString()\n                                });\n                            } else {\n                                // use seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.seconds', { seconds: sec.toString() });\n                            }\n                            queueData.waitTime = waitStr;\n                        }\n\n                        this.set('queue.queueDetails', queueData);\n                        this.set('isDetailsLoaded', true);\n                    })\n                    .finally(() => this.set('isDetailsLoading', false));\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"9e9+NV5j\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-mini\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"isSearchResult\\\"],[[28,[\\\"queue\\\"]],[28,[\\\"showActions\\\"]],[28,[\\\"clickToProfile\\\"]],false,false,false,false]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"details\\\"],null],[28,[\\\"canViewQueueDetails\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin loading-icon\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isDetailsLoaded\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.agents\\\"],[[\\\"ratio\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"agentData\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.waitingCount\\\"],null],false],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"callbackCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"phone-outbound\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"chatCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"roster-chat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"emailCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"queue-metric\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"messageCount\\\"]],false],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"sms-message-icon\\\"],null,[[\\\"subMessageType\\\"],[\\\"sms\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"queue-analytics\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.estimatedWait\\\"],[[\\\"wait\\\"],[[28,[\\\"queue\\\",\\\"queueDetails\\\",\\\"waitTime\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"get-queue-data\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"getQueueData\\\",[28,[\\\"entity\\\"]]],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.entity.queueDetails.view\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"section\\\"]],\\\"actions\\\"],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-contact-queue\\\"],null,[[\\\"queue\\\"],[[28,[\\\"queue\\\"]]]]],false],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"section\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/queue/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"s3GYSE14\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isClickable\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[[28,[\\\"entityRoutePath\\\"]],[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-mini/entity-details\\\"],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"isPresenceLabelToggleEnabled\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"],[[28,[\\\"entityIsPerson\\\"]],[28,[\\\"entityIsContact\\\"]],[28,[\\\"entityIsMe\\\"]],[28,[\\\"showDepartment\\\"]],[28,[\\\"showOrganization\\\"]],[28,[\\\"showPresence\\\"]],[28,[\\\"isPresenceLabelToggleEnabled\\\"]],[28,[\\\"subscribeToPresence\\\"]],[28,[\\\"canContactEntity\\\"]],[28,[\\\"useInitials\\\"]],[28,[\\\"isClickable\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"entityLocationData\\\"]],[28,[\\\"presenceLabelData\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showActions\\\"]],[28,[\\\"canContactEntity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"actions \\\",[33,[\\\"if\\\"],[[28,[\\\"entityIsMe\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\",[\\\"actions\\\"]],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-mini/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nexport const imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        profileInstructionText: 'images.profile',\n        informal: 'images.informal',\n        activeProfilePictureSection: 'images'\n    },\n\n    group: {\n        profile: 'images.profilePictures',\n        profileInstructionText: 'images.activeProfilePicture',\n        informal: 'images.gallery',\n        activeProfilePictureSection: 'images'\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['entity-picture-content'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    embedded: Ember.inject.service(),\n\n    attrs: {\n        open() {},\n        close() {},\n\n        entity: null,\n        askToDelete: false\n    },\n\n    type: 'profile', // or 'informal'\n\n    askToDelete: false,\n    showUploadModal: false,\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        },\n\n        uploadPicture() {\n            this.attrs.close();\n\n            this.set('showUploadModal', true);\n        },\n\n        confirmUpload() {\n            let type = this.get('type');\n            let entity = this.get('entity');\n\n            entity.notifyPropertyChange('uploadedProfilePictures');\n            entity.notifyPropertyChange('uploadedInformalPhotos');\n\n            const pictures = entity.get('uploadedProfilePictures');\n            const picture = pictures[pictures.length - 1];\n            if (!picture) {\n                return;\n            }\n\n            if (type === 'profile') {\n                this.send('selectUploadedImage', type, picture, false);\n            }\n\n            this.send('cancelUploadModal');\n        },\n\n        selectUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityJid = entity.get('jid');\n            const tag = 'profile-success';\n            const edit = this.get('canEditProfilePicture');\n            let section = entity.get('fieldConfig.images');\n\n            if (!edit || active) {\n                return;\n            }\n\n            type = type || this.get('type');\n\n            if (entity.type === 'person') {\n                // When adding and remove images using the public API it updates the group.\n                // Each time it updates the group its version number increases, we go out and get the group\n                // to make sure we have the latest version.  Once venue is release we will not\n                // need to do this since it doesn't require a version like directory did.\n                entity\n                    .reload()\n                    .then(user => {\n                        section['version'] = user.version;\n                        if (type === 'profile') {\n                            entity.setProfilePicture(image);\n                            section = entity.get('fieldConfig.images');\n                        }\n                        return section;\n                    })\n                    .then(updatedSection => {\n                        entity.saveSection(updatedSection);\n                    })\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = _.head(errors);\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            } else {\n                if (type === 'profile') {\n                    entity.setProfilePicture(image);\n                }\n                return entity\n                    .saveSection(section)\n                    .then(() => {\n                        this.get('embedded').notifyUpdateProfileImage(image, entityJid);\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    })\n                    .catch(err => {\n                        if (err && (err.errors || err.payload)) {\n                            const errors = err.errors || err.payload;\n                            let error = errors.firstObject;\n                            if (error && error.payload && error.payload.code === 'VERSION_MISMATCH') {\n                                return;\n                            }\n                        }\n\n                        this.get('notification').error(\n                            this.get('intl').lookup('notification.titles.profileSaveError'),\n                            this.get('intl').lookup('notification.fieldSection.error'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5\n                            }\n                        );\n                        entity.reload();\n                    })\n                    .finally(() => {\n                        this.get('notification').info(\n                            this.get('intl').lookup('notification.titles.profileSave'),\n                            this.get('intl').lookup('notification.fieldSection.saved'),\n                            {\n                                forceBrowserNotification: true,\n                                hideAfter: 5,\n                                tag: tag\n                            }\n                        );\n                    });\n            }\n        },\n\n        deleteUploadedImage(type, image, active) {\n            const entity = this.get('entity');\n            const entityType = entity.get('type');\n\n            let promise = Ember.RSVP.resolve();\n\n            if (active) {\n                const images = entity.get('uploadedImages');\n\n                if (!_.isEmpty(images)) {\n                    const newImage = images[0];\n\n                    if (newImage) {\n                        const profilePictureSection = entity.get(\n                            `fieldConfig.${imageMappings[entityType].activeProfilePictureSection}`\n                        );\n                        entity.setProfilePicture(newImage);\n                        promise = entity.saveSection(profilePictureSection);\n                    }\n                }\n            }\n\n            const fieldPath = imageMappings[entityType][type];\n            const path = `entity.${fieldPath}`;\n\n            this.get(path).removeObject(image);\n            if (entityType === 'person') {\n                return this.entity.reload();\n            }\n\n            promise\n                .then(() => {\n                    const sectionKey = fieldPath.split('.')[0];\n                    const section = entity.get(`fieldConfig.${sectionKey}`);\n                    return entity.saveSection(section);\n                })\n                .catch(() => this.get(path).addObject(image));\n        },\n\n        cancelUploadModal() {\n            this.set('showUploadModal', false);\n            this.attrs.open();\n        },\n\n        cancelDeleteModal() {\n            this.set('askToDelete', false);\n            this.set('showing', false);\n        },\n\n        changeType(type) {\n            this.set('type', type);\n        },\n\n        doneDeleting() {\n            this.set('askToDelete', false);\n            this.set('showing', true);\n        }\n    },\n\n    _showing: false,\n    showing: computed('canEditProfilePicture', {\n        get() {\n            return this._showing;\n        },\n\n        set(key, value) {\n            this._showing = value;\n            return value;\n        }\n    }),\n\n    canUploadPicture: Ember.computed(\n        'session.user.isAdmin',\n        'entity.{readWritePermissions,type}',\n        'entity.uploadedImages.[]',\n        'entity.fieldConfig.uploads.images.maxRepeat',\n        'type',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            return this.hasAccessToPicture('uploads.images');\n        }\n    ),\n\n    canEditProfilePicture: Ember.computed(\n        'session.{user.isAdmin,features,person}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditInformalPicture: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.{readWritePermissions,id}',\n        'profile.canEditProfilePictures',\n        function () {\n            if (this.get('session.user.isAdmin')) {\n                return true;\n            }\n\n            if (this.get('entity.type') === 'group' && this.get('entity').isPersonOwner) {\n                return this.get('entity').isPersonOwner(this.get('session.person'));\n            }\n\n            // Profile can be null, but if its set and this call is true, then lets return true\n            if (this.get('profile.canEditProfilePictures')) {\n                return true;\n            }\n\n            return this.get('session.person.id') === this.get('entity.id');\n        }\n    ),\n\n    canEditAgentImage: Ember.computed(\n        'entity.{readWritePermissions,id}',\n        'entity.fieldConfig.agent.profileImage',\n        'permissions.hasEngageAccess',\n        function () {\n            let field = this.get('entity.fieldConfig.agent.profileImage');\n            if (_.isEmpty(field)) {\n                return false;\n            }\n\n            return this.hasAccessToPicture('agent.profileImage') && this.get('permissions.hasEngageAccess');\n        }\n    ),\n\n    hasAccessToPicture(path) {\n        let isSelf = this.get('session.person.id') === this.get('entity.id');\n        let canEditProfiles = this.get('permissions.canEditProfiles');\n        if (path === 'agent.profileImage') {\n            return canEditProfiles;\n        }\n        if (path === 'uploads.images') {\n            return isSelf || canEditProfiles;\n        }\n        return isSelf;\n    }\n});\n","import Ember from 'ember';\n\nimport { imageMappings } from '../component';\n\nconst { set, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['delete-pictures'],\n\n    type: null,\n    entity: null,\n\n    confirm: () => {},\n    disable: () => {},\n    done: () => {},\n\n    actions: {\n        selectImage(upload) {\n            const current = upload.selected;\n            set(upload, 'selected', !current);\n\n            const limit = this.get('number');\n            const total = this.get('uploads.length');\n            const currentSelection = this.get('currentSelected.length');\n\n            this.attrs.disable(currentSelection < total - limit);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.disable(true);\n        this.set('confirm', this.deleteImages.bind(this));\n    },\n\n    number: computed(function () {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const imageType = this.get('type');\n        const field = entity.get(`fieldConfig.${imageMappings[entityType][imageType]}`);\n        return field.get('maxRepeat');\n    }),\n\n    uploads: computed('entity.uploadedImages.[]', function () {\n        const images = this.get('entity.uploadedImages') || [];\n        return images.map(image => {\n            return {\n                image,\n                selected: false\n            };\n        });\n    }),\n\n    currentSelected: computed('uploads.@each.selected', function () {\n        return this.get('uploads').filterBy('selected');\n    }),\n\n    imagesToSave: computed('uploads.@each.selected', function () {\n        return this.get('uploads').rejectBy('selected');\n    }),\n\n    deleteImages() {\n        const entity = this.get('entity');\n        const entityType = entity.get('type');\n        const type = this.get('type');\n        const fieldPath = imageMappings[entityType][type];\n        const images = this.get('imagesToSave').mapBy('image');\n        entity.set(fieldPath, images, { overwrite: true });\n        return entity.save().then(() => {\n            this.attrs.done();\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Nb8kFlFf\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"explain\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.delete.explanation\\\"],[[\\\"number\\\"],[[28,[\\\"number\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"images\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"uploads\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"upload\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"uploaded-image\\\"],null,[[\\\"entity\\\",\\\"image\\\",\\\"isActive\\\",\\\"type\\\",\\\"canEdit\\\",\\\"editing\\\",\\\"size\\\",\\\"select\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"upload\\\",\\\"image\\\"]],[28,[\\\"upload\\\",\\\"selected\\\"]],[28,[\\\"type\\\"]],true,true,96,[33,[\\\"action\\\"],[[28,[null]],\\\"selectImage\\\",[28,[\\\"upload\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"upload\\\"]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/delete-pictures/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"1F/33ouu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showing\\\"]],[33,[\\\"not\\\"],[[28,[\\\"askToDelete\\\"]]],null]],null]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"targetAttachment\\\"],[\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.done\\\"],null],[28,[\\\"targetAttachment\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"edit-profile-picture\\\"],null,[[\\\"entity\\\",\\\"editing\\\",\\\"canUploadPicture\\\",\\\"canEditProfilePicture\\\",\\\"canEditInformalPicture\\\",\\\"canEditAgentImage\\\",\\\"changeType\\\",\\\"upload\\\",\\\"select\\\",\\\"delete\\\"],[[28,[\\\"entity\\\"]],true,[28,[\\\"canUploadPicture\\\"]],[28,[\\\"canEditProfilePicture\\\"]],[28,[\\\"canEditInformalPicture\\\"]],[28,[\\\"canEditAgentImage\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"changeType\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"uploadPicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"askToDelete\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[\\\"cancelDeleteModal\\\",[33,[\\\"t\\\"],[\\\"images.delete.title\\\"],null],[33,[\\\"t\\\"],[\\\"common.delete\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-picture-content/delete-pictures\\\"],null,[[\\\"entity\\\",\\\"type\\\",\\\"confirm\\\",\\\"disable\\\",\\\"done\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"doneDeleting\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showUploadModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"enforceModality\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null],\\\"cancelUploadModal\\\",[33,[\\\"t\\\"],[\\\"person.modals.uploadPicture\\\"],null],null,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"upload-picture\\\"],null,[[\\\"entity\\\",\\\"uploadType\\\",\\\"confirm\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"type\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"confirmUpload\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-picture-content/template.hbs\"}});","import Ember from 'ember';\nimport { doFocus } from 'connections-ui/utils/focus-management';\n\nconst { run, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['add-section'],\n\n    addingSection: false,\n\n    attrs: {\n        sections: null,\n        emptySections: null,\n\n        addSection() {}\n    },\n\n    actions: {\n        toggleAddingSection() {\n            this.toggleProperty('addingSection');\n            if (this.get('addingSection')) {\n                const focusTarget = '.add-section .name a:first';\n                Ember.run.later(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            }\n        },\n\n        addSection() {\n            this.attrs.addSection(...arguments);\n\n            this.set('addingSection', false);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachHandler);\n    },\n\n    willDestroyElement() {\n        Ember.$(window).off(`.${this.elementId}`);\n\n        this._super(...arguments);\n    },\n\n    attachHandler() {\n        Ember.$(window).on(`click.${this.elementId}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.add-section').length) {\n                    this.set('addingSection', false);\n                }\n            });\n        });\n\n        Ember.$(window).on(`keydown.${this.elementId}`, event => {\n            if (event.key === 'Escape' && this.get('addingSection')) {\n                // ESC key when new-sections is displayed\n                Ember.run(() => {\n                    this.set('addingSection', false);\n                });\n            }\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"XG0aXktB\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"add-new-section \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleAddingSection\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"ic-add-bold\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSection\\\"],null],false],[0,\\\"\\\\n    \\\"]]}],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"new-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"addingSection\\\"]],\\\"adding-section\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"emptySections\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/section-icon\\\"],null,[[\\\"sectionInfo\\\",\\\"addSection\\\"],[[28,[\\\"sectionInfo\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.addNewSectionEmpty\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/add-section/template.hbs\"}});","import Ember from 'ember';\nimport isEmpty from 'lodash/isEmpty';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport Profile from './profiles/profile';\n\nimport { doFocus } from 'connections-ui/utils/focus-management';\nimport { deregisterLayout, registerLayout } from '../../utils/masonry';\nimport { isPurecloudSource } from '../../utils/presence-utils';\nimport ProfilePermissionsMixin from './permissions';\nimport { hasSupplementalVideoProvider } from 'connections-ui/services/media-providers';\nimport { activityCounter } from 'connections-ui/utils/presence-label-util';\n\nconst { run, inject, getOwner, computed, observer, Component } = Ember;\n\nexport default Component.extend(EntityControllerMixin, ProfilePermissionsMixin, {\n    classNames: ['entity-profile', 'person-detail', 'profile', 'entity'],\n    classNameBindings: ['isEditingSection:editing-section', 'onOwnProfile:own-profile', 'compactLayout:compact-layout'],\n\n    intl: inject.service(),\n    session: inject.service(),\n    permissions: inject.service(),\n    mediaProviders: inject.service(),\n    favorites: Ember.inject.service(),\n\n    resizeDetector: inject.service(),\n    application: inject.service(),\n    emergencyLocation: Ember.inject.service('emergency-location'),\n    emergencyLocationOn: Ember.computed.reads('session.features.emergencyLocation'),\n    editEmergencyLocation: false,\n    isPresenceLabelToggleEnabled: Ember.computed.readOnly('session.features.epcDecompPresenceLabel'),\n    eLocation: Ember.computed.reads('emergencyLocation.eLocation'),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    canViewChat: computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: computed.bool('permissions.canViewCollaborateVideo'),\n    attrs: {\n        entity: null,\n\n        setEditingSection() {}\n    },\n\n    entity: null,\n    lastEntity: null,\n\n    editing: false,\n    showCardView: false,\n\n    compactLayout: false,\n\n    excludedContactFields: ['chat'],\n\n    excludedEditingFields: ['chat'],\n    conversationSummary: Ember.computed.readOnly('entity.activities.conversationSummary'),\n    message: Ember.computed.readOnly('conversationSummary.message'),\n    socialExpression: Ember.computed.readOnly('conversationSummary.socialExpression'),\n    totalMessages: Ember.computed(\n        'message.{contactCenter,enterprise}',\n        'message.contactCenter.active',\n        'message.enterprise.active',\n        function () {\n            const contactCenter = this.get('message.contactCenter');\n            const enterprise = this.get('message.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    totalSocialExpression: Ember.computed(\n        'socialExpression.{contactCenter,enterprise}',\n        'socialExpression.contactCenter.active',\n        'socialExpression.enterprise.active',\n        function () {\n            const contactCenter = this.get('socialExpression.contactCenter');\n            const enterprise = this.get('socialExpression.enterprise');\n            return activityCounter(contactCenter, enterprise);\n        }\n    ),\n    presenceLabelData: Ember.computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            return {\n                wrap: true,\n                showStatus: false,\n                showActivity: true,\n                eActivityPresenceClass: this.entity.get('activityPresenceClass'),\n                totalCalls: this.entity.get('activityValues.calls'),\n                totalChats: this.entity.get('activityValues.chats'),\n                totalEmails: this.entity.get('activityValues.emails'),\n                totalMessages: this.get('totalMessages'),\n                totalSocialExpression: this.get('totalSocialExpression'),\n                presenceLabel: this.entity.get('presenceLabel'),\n                eChatStatus: this.entity.get('chatStatus'),\n                isShowingActivitySummary: this.entity.get('showConversationSummaryIndicator')\n            };\n        }\n    ),\n    location: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('location', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('location'),\n            selfLocation: this.get('selfLocation'),\n            iconHoverText: this.get('intl').t('components.navMenu.userDropdown.setViaGeolocation')\n        };\n    }),\n\n    scrollToBottom() {\n        const parentNode = this.get('element.parentNode');\n        parentNode.scrollTop = parentNode.scrollHeight; //Scroll to very bottom\n    },\n\n    actions: {\n        toggleEditProfile() {\n            const editing = this.get('editingProfile');\n\n            if (editing) {\n                if (!this.get('entity.isSaving')) {\n                    this.get('entity').reload();\n                }\n            }\n\n            this.toggleProperty('editingProfile');\n\n            if (\n                this.get('emergencyLocationOn') &&\n                !this.get('editingProfile') &&\n                this.get('emergencyLocation').cancelEditElocation\n            ) {\n                this.get('emergencyLocation').cancelEditElocation();\n            }\n            this.updateMasonry();\n        },\n\n        editProfilePicture: function (event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            if (this.get('editingProfile') && this.get('canEditProfilePicture')) {\n                this.set('editingPictures', true);\n            }\n        },\n\n        editContactInfo() {\n            this.get('contactInfoSection').send('showModal');\n        },\n\n        setContactInfo(section) {\n            this.set('contactInfoSection', section);\n        },\n\n        addSection(sectionInfo) {\n            sectionInfo.set('adding', true);\n\n            run.scheduleOnce('afterRender', this, function () {\n                let key = sectionInfo.get('section.key');\n                let $section = this.$(`.${key}`);\n                let top = $section.position().top;\n                Ember.$('#orgspan').animate(\n                    {\n                        scrollTop: top\n                    },\n                    600\n                );\n                this.updateMasonry();\n                const focusTarget = this.$(`.${key}:first`);\n                run.debounce(\n                    this,\n                    function () {\n                        doFocus(Ember, focusTarget);\n                    },\n                    250\n                );\n            });\n        },\n\n        removeSection(sectionInfo) {\n            this.get('fieldSections').removeObject(sectionInfo);\n            this.updateMasonry();\n        },\n\n        toggleCardView() {\n            this.toggleProperty('showCardView');\n        },\n\n        componentUpdated() {\n            this.updateMasonry();\n        },\n\n        noop() {},\n\n        resize(data) {\n            Ember.run.once(this, this.handleResize, data);\n        },\n\n        saveElocation(updatedElocationAddress) {\n            return this.get('emergencyLocation').saveElocation(updatedElocationAddress);\n        },\n        editElocation() {\n            this.set('editEmergencyLocation', true);\n        },\n        cancelEditElocation() {\n            this.set('editEmergencyLocation', false);\n        },\n        refreshAllEmergencylocationInfo(notify) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').refreshAllEmergencylocationInfo(notify);\n            }\n        },\n        getEmergencyLocation(phoneNumber) {\n            if (this.get('session.features.emergencyLocation')) {\n                return this.get('emergencyLocation').getEmergencyLocation(phoneNumber);\n            }\n        }\n    },\n\n    allSections: computed.reads('profile.profileSections'),\n    canEditStatus: computed.and('onOwnProfile', 'isPurecloudSource'),\n\n    isPurecloudSource: computed(\n        'session.features.acdHybridToastNoActiveQueue',\n        'session.user.presence.source',\n        function () {\n            if (this.get('session.features.acdHybridToastNoActiveQueue')) {\n                return isPurecloudSource(this.get('session.user.presence.source'));\n            }\n            return true;\n        }\n    ),\n    editingProfile: computed('editing', 'canEditProfile', {\n        get() {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n            return this.get('editing');\n        },\n\n        set(key, value) {\n            if (!this.get('canEditProfile')) {\n                return false;\n            }\n\n            return value;\n        }\n    }),\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    profile: computed('entity.id', function () {\n        let entity = this.get('entity');\n        return Profile.getProfileForModel(entity, getOwner(this));\n    }),\n\n    emptySections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => sectionInfo.get('isEmpty') && !sectionInfo.get('adding'));\n    }),\n\n    fieldSections: computed('allSections.[]', 'allSections.@each.{adding,isEmpty}', function () {\n        let sections = this.get('allSections');\n        return sections.filter(sectionInfo => !sectionInfo.get('isEmpty') || sectionInfo.get('adding'));\n    }),\n\n    emptyWriteableSections: computed('emptySections.[]', 'profile.writeableSections.[]', function () {\n        let sections = this.get('emptySections');\n        let sectionKeys = this.get('profile.writeableSections');\n        return sections.filter(sectionInfo => sectionKeys.includes(sectionInfo.get('section.key')));\n    }),\n\n    isEditingSection: computed('fieldSections.@each.editingSection', 'editEmergencyLocation', function () {\n        if (this.get('editEmergencyLocation')) {\n            return true;\n        }\n        return !isEmpty(this.get('fieldSections').findBy('editingSection', true));\n    }),\n\n    showStatus: computed('editingProfile', 'onOwnProfile', 'entity.hasChatStatus', 'chatService.enabled', function () {\n        if (!this.get('chatService.enabled')) {\n            return false;\n        }\n\n        return (this.get('editingProfile') && this.get('onOwnProfile')) || this.get('entity.hasChatStatus');\n    }),\n\n    videoProviders: computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'));\n    }),\n\n    haveVideoMediaProviders: computed('videoProviders.@each.haveAccess', function () {\n        return hasSupplementalVideoProvider(this.get('videoProviders'));\n    }),\n\n    entityData: Ember.computed('entity.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('entity.id'),\n            name: this.get('entity.name'),\n            isFavorite: this.get('entity.isFavorite'),\n            type: this.get('entity.type')\n        };\n    }),\n\n    enableFavoriteEvent: Ember.on('didInsertElement', function () {\n        this.$().on('favoriteEvent', () => {\n            this.get('favorites').toggleFavorite(this.get('entity'));\n        });\n        this.notifyPropertyChange('entityData');\n    }),\n\n    profileChanged: observer('entity.id', function () {\n        Ember.run.once(this, 'handleProfileChange');\n    }),\n\n    editingSectionChange: observer('isEditingSection', function () {\n        Ember.run.once(this, 'handleEditingSectionChange');\n    }),\n\n    handleProfileChange() {\n        let lastId = this.get('lastEntity.id');\n        if (this.get('entity.id') !== lastId) {\n            this.set('lastEntity', this.get('entity'));\n        }\n    },\n\n    handleEditingSectionChange() {\n        if (this.get('editEmergencyLocation')) {\n            Ember.run.later(() => {\n                this.scrollToBottom();\n            }, 800);\n        }\n\n        if (this.get('setEditingSection')) {\n            this.get('setEditingSection')(this.get('isEditingSection'));\n        }\n    },\n\n    // masonry configuration\n    masonryEl: null,\n\n    _useMasonry() {\n        const debug = this.get('application.debug');\n        const enableMasonry = this.get('application.debugSettings.masonry');\n        return !debug || enableMasonry;\n    },\n\n    _masonryId() {\n        return `entity-profile-${this.get('elementId')}`;\n    },\n\n    _isInDOM() {\n        return this.get('_state') === 'inDOM';\n    },\n\n    fieldSectionsUpdate: Ember.observer('fieldSections.[]', function () {\n        if (isEmpty(this.get('fieldSections'))) {\n            return;\n        }\n\n        Ember.run.scheduleOnce('afterRender', () => {\n            this.updateMasonry();\n        });\n    }),\n\n    attachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.$('.masonry-container');\n            masonryEl.masonry({\n                itemSelector: '.field-section',\n                columnWidth: '.field-section',\n                fitWidth: true\n            });\n            masonryEl.on('click submit', () => Ember.run(() => this.updateMasonry()));\n            this.set('masonryEl', masonryEl);\n\n            registerLayout(this._masonryId(), this);\n        }\n    },\n\n    _updateMasonry() {\n        if (this._useMasonry()) {\n            Ember.run.scheduleOnce('afterRender', () => {\n                const masonryEl = this.get('masonryEl');\n                if (masonryEl && this._isInDOM()) {\n                    masonryEl.masonry('reloadItems').masonry();\n                }\n            });\n        }\n    },\n\n    rerun() {\n        // ^ this method is required for the utils/masonry#rerunLayouts()\n        Ember.run(() => this.updateMasonry());\n    },\n\n    updateMasonry() {\n        Ember.run.throttle(this, this._updateMasonry, 500, false);\n    },\n\n    detachMasonry() {\n        if (this._useMasonry()) {\n            const masonryEl = this.get('masonryEl');\n            this.set('masonry', null);\n            if (masonryEl) {\n                masonryEl.masonry('destroy');\n                masonryEl.off('click submit');\n            }\n\n            deregisterLayout(this._masonryId());\n        }\n    },\n\n    startMasonry: Ember.on('didInsertElement', function () {\n        this.attachMasonry();\n    }),\n\n    stopMasonry: Ember.on('willDestroyElement', function () {\n        this.detachMasonry();\n    }),\n\n    handleResize(data) {\n        if (!data.width) {\n            return;\n        }\n\n        if (data.width < 500) {\n            this.set('compactLayout', true);\n        } else {\n            this.set('compactLayout', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nconst { Mixin, inject, computed } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    canEditProfile: computed.or('onOwnProfile', 'profile.canEditProfile', 'session.person.isAdmin'),\n\n    canEditName: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditTitle: computed(\n        'entity.readWritePermissions',\n        'editingProfile',\n        'session.features',\n        'permissions.canEditProfiles',\n        function () {\n            if (!this.get('editingProfile')) {\n                return false;\n            }\n            return this.get('permissions.canEditProfiles');\n        }\n    ),\n\n    canEditDepartment: computed('editingProfile', 'permissions.canEditProfiles', function () {\n        if (!this.get('editingProfile')) {\n            return false;\n        }\n        return this.get('permissions.canEditProfiles');\n    }),\n\n    canReadHR: computed.reads('permissions.canReadProfile'),\n\n    onOwnProfile: Ember.computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: Ember.computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    canReadGroups: Ember.computed('entity.groups.{social,official}', function () {\n        let groupsFieldConfig = this.get('entity.fieldConfig')\n            ? this.get('entity.fieldConfig').getSectionByKey('groups')\n            : null;\n        let groups = this.get('entity.groups');\n        if (!groupsFieldConfig || _.isEmpty(groups)) {\n            return false;\n        }\n        return Ember.get(groups, 'social.length') || Ember.get(groups, 'official.length');\n    }),\n\n    canEditProfilePicture: Ember.computed('canEditProfile', function () {\n        return this.get('canEditProfile');\n    }),\n\n    canEditGeneralInfo: Ember.computed('onOwnProfile', function () {\n        var promise = new Ember.RSVP.Promise(resolve => {\n            resolve(this.get('onOwnProfile'));\n        });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    canEditContactInfo: Ember.computed(\n        'session.{user.isAdmin,features}',\n        'entity.readWritePermissions',\n        'onOwnProfile',\n        function () {\n            var promise = new Ember.RSVP.Promise(resolve => {\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewLocations: Ember.computed(\n        'ownOwnProfile',\n        'entity.readWritePermissions',\n        'session.{user.isAdmin,features}',\n        'entity.fieldConfig.location.location',\n        function () {\n            var locationsField = this.get('entity.fieldConfig.location.location');\n            var promise = new Ember.RSVP.Promise(resolve => {\n                if (_.isEmpty(locationsField)) {\n                    return resolve(false);\n                }\n                if (this.get('session.user.isAdmin')) {\n                    return resolve(true);\n                }\n                resolve(this.get('onOwnProfile'));\n            });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n    ),\n\n    canViewInformals: Ember.computed('canEditProfilePicture', 'entity.images.informal', function () {\n        var photos = this.get('entity.images.informal');\n\n        if (photos && photos !== undefined) {\n            return photos.length > 0;\n        }\n        return false;\n    })\n});\n","import Ember from 'ember';\n\nimport Validators from '../../entity-fields/validators';\nimport { BUILTIN_SECTIONS, customSectionKeys } from './profile';\n\nconst { computed } = Ember;\n\nconst PERMISSIONED_FIELD_PATHS = [\n    'contactInfo.email_main',\n    'contactInfo.phone_work',\n    'contactInfo.voicemaileEnabled',\n    'general.title',\n    'hr.empId',\n    'hr.empType',\n    'hr.hireDate',\n    'hr.officialName',\n    'relationships.manager',\n    'relationships.administrativeAssistant',\n    'purecloud.defaultStationId',\n    'purecloud.siteId',\n    'purecloud.skills',\n    'purecloud.languages',\n    'purecloud.acdAutoAnswer',\n    'agent.name',\n    'agent.profileImage',\n    'primaryContactInfo.email'\n];\n\nconst POSSIBLE_INTEGRATION_FIELDS = ['contactInfo.phone_other'];\n\nexport default Ember.Object.extend({\n    session: null,\n    permissions: null,\n    entity: null,\n    field: null,\n    valueReference: null,\n\n    value: computed('fieldPath', 'entity.{fieldPath}.[]', 'entity.{fieldPath}.@each._id', function () {\n        const id = this.get('valueReference._id');\n        const tempId = this.get('valueReference.tempId');\n        const fieldPath = this.get('fieldPath');\n        const entity = this.get('entity');\n        const data = entity ? entity.get(fieldPath) : null;\n\n        let location = this.get('_sectionLocation');\n        let value = {};\n\n        if (Array.isArray(data) && data.length) {\n            if (location === null || location === undefined || location >= data.length || location < 0) {\n                if (tempId) {\n                    location = data.findIndex(d => d.tempId === tempId);\n                } else if (id) {\n                    location = data.findIndex(d => d._id === id);\n                } else {\n                    location = 0;\n                }\n\n                this.set('_sectionLocation', location);\n            } else if (id != null) {\n                location = data.findIndex(d => d._id === id);\n                this.set('_sectionLocation', location);\n            }\n\n            if (location != null && location >= 0) {\n                value = data[location];\n            } else {\n                // if no location found or negative index then we assume its at the top\n                value = data[0];\n            }\n        }\n\n        // if the value does not have an id or tempId then its a new addition and we need to assign a tempId for ui tracking\n        if (!value.id && !value.tempId) {\n            value.tempId = Ember.generateGuid();\n        }\n\n        return value;\n    }),\n\n    _sectionLocation: null,\n\n    // Legacy support\n    entry: computed.reads('value'),\n    fieldValue: computed.reads('value'),\n\n    sectionKey: computed('field', function () {\n        return this.get('field.section.key');\n    }),\n\n    fieldPath: computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: computed('fieldPath', function () {\n        const fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    fieldId: computed('value._id', 'value.tempId', function () {\n        return this.get('value._id') || this.get('value.tempId');\n    }),\n\n    writeable: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return true;\n        }\n\n        const canEditProfiles = this.get('permissions.canEditProfiles');\n        const path = this.get('fieldPath');\n\n        // Integration fields have their own editing requirements\n        if (this.get('integrationManaged')) {\n            return false;\n        }\n\n        if (Ember.A(PERMISSIONED_FIELD_PATHS).includes(path)) {\n            // Only admins can edit core contact fields\n            return canEditProfiles;\n        }\n\n        if (Ember.A(BUILTIN_SECTIONS).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        const myOwnProfile = this.get('session.person.id') === this.get('entity.id');\n        const customKeys = customSectionKeys(this.get('entity.fieldConfig.sections'));\n        if ((myOwnProfile || canEditProfiles) && Ember.A(customKeys).includes(this.get('sectionKey'))) {\n            return true;\n        }\n\n        return false;\n    }),\n\n    /**\n     * @deprecated\n     * This computed value is deprecated. Please use `removable` instead.\n     */\n    removeable: computed(function () {\n        Ember.Logger.warn(\n            '`components/entity-profile/profiles/field-data.js` - The use of the computed value `removeable` is deprecated. Please update to use `removable` on this class instead.'\n        );\n        return this.get('removable');\n    }),\n\n    removable: computed('integrationManaged', 'field.repeatable', function () {\n        const repeatable = this.get('field.repeatable');\n        return repeatable && !this.get('integrationManaged');\n    }),\n\n    integrationManaged: computed('entity.type', 'entity.readWritePermissions', 'fieldPath', 'value', function () {\n        const type = this.get('entity.type');\n        if (type === 'group') {\n            return false;\n        }\n\n        const path = this.get('fieldPath');\n        if (Ember.A(POSSIBLE_INTEGRATION_FIELDS).includes(path)) {\n            let value = this.get('value');\n            return value && value.value && !!value.value.integration;\n        }\n\n        return false;\n    }),\n\n    isEmpty: computed('field.type', 'value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isEmpty(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isValid: computed('value', 'value.value', 'value.value.[]', {\n        get() {\n            const type = this.get('field.type');\n            const value = this.get('value');\n\n            let validator = null;\n            if (Validators[type]) {\n                validator = Validators[type];\n            } else {\n                validator = Validators.default;\n\n                Ember.Logger.warn('Using default validator for field:', {\n                    fieldPath: this.get('fieldPath'),\n                    field: this.get('field')\n                });\n            }\n\n            if (!value || Object.keys(value).length === 0) {\n                return true;\n            }\n\n            return validator.isValid(value, this.get('field'));\n        },\n\n        set(path, value) {\n            return value;\n        }\n    }),\n\n    isPrimaryField: computed('value._id', 'entity.primaryContactInfo.email.firstObject.value.fieldId', function () {\n        const primaryFieldId = this.get('entity.primaryContactInfo.email.firstObject.value.fieldId');\n        return this.get('value._id') === primaryFieldId;\n    }),\n\n    isNewValue: computed('value._id', 'value.tempId', {\n        get() {\n            return !this.get('value._id');\n        },\n\n        set(path, value) {\n            return value;\n        }\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport SectionInfo from './section-info';\n\nconst { inject, computed } = Ember;\n\nconst PROFILE_CACHE = {};\n\nconst EXCLUDED_SECTIONS = [\n    'status',\n    'general',\n    'primaryContactInfo',\n    'images',\n    'uploads',\n    'cic',\n    'scs',\n    'custserv',\n    'device',\n    'purecloud',\n    'preferences',\n    'externalContacts'\n];\n\nexport const BUILTIN_SECTIONS = ['general', 'contactInfo', 'skills', 'location', 'bio', 'education', 'hr'];\n\nexport const ADMIN_SECTIONS = ['relationships', 'agent'];\n\nexport function customSectionKeys(sections) {\n    const builtins = [...BUILTIN_SECTIONS, ...ADMIN_SECTIONS, ...EXCLUDED_SECTIONS];\n    const keys = Ember.A(sections).mapBy('key');\n    return keys.filter(key => !Ember.A(builtins).includes(key));\n}\n\nlet Profile = Ember.Object.extend({\n    _cache: PROFILE_CACHE,\n\n    session: inject.service('session'),\n    permissions: inject.service('permissions'),\n\n    model: null,\n    readWritePermissions: null,\n\n    writeableSections: null,\n    readableSections: null,\n\n    sections: computed.reads('model.fieldConfig.sections'),\n    canEditProfiles: computed.reads('permissions.canEditProfiles'),\n    canReadProfiles: computed.reads('permissions.canReadProfiles'),\n\n    init() {\n        this._super(...arguments);\n\n        let writeableSections = [];\n        const customKeys = customSectionKeys(this.get('sections'));\n        let readableSections = [...BUILTIN_SECTIONS, 'relationships', 'groups', ...customKeys];\n\n        if (this.get('model.id') === this.get('session.person.id')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys];\n        }\n\n        if (this.get('canEditProfiles')) {\n            writeableSections = [...BUILTIN_SECTIONS, ...customKeys, ...ADMIN_SECTIONS];\n        }\n        if (this.get('canReadProfiles')) {\n            readableSections = readableSections.concat(ADMIN_SECTIONS);\n        }\n\n        this.setProperties({\n            readWritePermissions: {\n                write: [],\n                read: []\n            },\n            writeableSections,\n            readableSections\n        });\n    },\n\n    profileSections: computed('session.person', 'model', 'readableSections.[]', function () {\n        let data = [];\n        let sections = this.get('sections');\n        let isSuper = this.get('session.person.isAdmin') && !this.get('session.user.personId');\n        if (isSuper) {\n            data = _.filter(sections, section => {\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1;\n            });\n        } else {\n            data = _.filter(sections, section => {\n                let readableSections = this.get('readableSections');\n                return EXCLUDED_SECTIONS.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n            });\n        }\n\n        return _.map(data, section => {\n            return SectionInfo.create({\n                section: section,\n                entity: this.get('model')\n            });\n        });\n    }),\n\n    canEditProfile: computed('writeableSections.[]', function () {\n        return this.get('writeableSections.length') > 0;\n    }),\n\n    canEditProfilePictures: computed('model.id', 'session.person.id', 'canEditProfiles', function () {\n        if (this.get('model.id') === this.get('session.person.id')) {\n            return true;\n        }\n        return this.get('canEditProfiles');\n    }),\n\n    canEditSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canEditProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('writeableSections');\n        return _.includes(sections, section.key);\n    },\n\n    canReadSection(section) {\n        if (this.get('session.person.isAdmin') || this.get('canReadProfiles')) {\n            return true;\n        }\n\n        let sections = this.get('readableSections');\n        return _.includes(sections, section.key);\n    },\n\n    getReadableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    },\n\n    getEditableFieldPathsForSection(section) {\n        return section.get('fieldList').mapBy('fieldPath');\n    }\n});\n\nProfile.reopenClass({\n    getProfileForModel(model, owner) {\n        let id = model.get('id');\n        if (PROFILE_CACHE[id]) {\n            return PROFILE_CACHE[id];\n        }\n        let profile = Profile.create(\n            {\n                model: model\n            },\n            owner.ownerInjection()\n        );\n        PROFILE_CACHE[id] = profile;\n        return profile;\n    }\n});\n\nexport default Profile;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed } = Ember;\n\nlet customSections = ['groups', 'relationships', 'contactInfo', 'location', 'education'];\n\nexport default Ember.Object.extend({\n    entity: null,\n    section: null,\n\n    adding: false,\n    editingSection: false,\n\n    init() {\n        this._super(...arguments);\n\n        // consume computed...\n        this.get('groupSectionChange');\n    },\n\n    componentName: computed('section.key', function () {\n        let key = this.get('section.key');\n        if (_.includes(customSections, key)) {\n            let name = Ember.String.dasherize(key);\n            return `entity-field-section/entity-${name}`;\n        }\n\n        return 'entity-field-section';\n    }),\n\n    hasCustomComponent: computed('section.key', function () {\n        return _.includes(customSections, this.get('section.key'));\n    }),\n\n    isEmpty: computed(\n        'entity',\n        'section',\n        'adding',\n        'entity.groups.official.[]',\n        'entity.groups.social.[]',\n        'entity.directReports.content',\n        {\n            get() {\n                let entity = this.get('entity');\n                let section = this.get('section');\n\n                if (section.get('fieldList.length') === 0) {\n                    return true;\n                }\n\n                let emptyFields = _.filter(section.get('fieldList'), field => {\n                    let fieldPath = field.get('fieldPath');\n                    let values = entity.get(fieldPath);\n\n                    // Work-around weird direct reports relationship...\n                    if (section.get('key') === 'relationships' && field.get('key') === 'directReportCount') {\n                        return !entity.get('directReports.content.length');\n                    }\n\n                    if (!_.isEmpty(values)) {\n                        let emptyValues = _.filter(values, value => {\n                            if (_.isEmpty(value._id) && _.isEmpty(value.guid)) {\n                                return true;\n                            }\n\n                            return _.isEmpty(value.value);\n                        });\n\n                        return !_.isEmpty(emptyValues);\n                    }\n\n                    return true;\n                });\n\n                return !_.isEmpty(emptyFields) && emptyFields.length === section.get('fieldList.length');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['section-icon', 'clickable'],\n    classNameBindings: ['section.key'],\n\n    attrs: {\n        sectionInfo: null,\n        addSection() {}\n    },\n\n    section: computed.reads('sectionInfo.section'),\n\n    icon: computed('section.key', function () {}),\n\n    click() {\n        this.attrs.addSection(this.get('sectionInfo'));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"r2fmlELA\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"icon\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[13],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[13],[1,[28,[\\\"section\\\",\\\"sectionName\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/section-icon/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"lCPY4TyH\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"resize-detector\\\"],[\\\".entity-profile .banner\\\"],[[\\\"on-resize\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"resize\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h1\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingEditMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.profileHeadingViewMode\\\"],[[\\\"name\\\"],[[28,[\\\"name\\\",\\\"value\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"content banner-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit-profile\\\"],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"toggleEditProfile\\\"],null],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-edit-profile\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"button-text-removal\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewPublicProfile\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"t\\\"],[\\\"person.personProfile.viewEditMode\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"favorite links \\\",[33,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tree-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"onOwnProfile\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"entity-favorite\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"\\\"],[16,\\\"entityFavoriteData\\\",[26,[\\\"entityData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],\\\"clickable\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null],[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"canEditProfilePicture\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-camera camera\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isPresenceLabelToggleEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"presence-label\\\",{\\\"attrs\\\":[[16,\\\"presenceLabelData\\\",[26,[\\\"presenceLabelData\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"presence-label\\\"],null,[[\\\"entity\\\",\\\"showStatus\\\",\\\"wrap\\\"],[[28,[\\\"entity\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"class\\\",\\\"entity\\\",\\\"locationHoverText\\\"],[\\\"entity-geolocation\\\",[28,[\\\"entity\\\"]],[33,[\\\"t\\\"],[\\\"components.navMenu.userDropdown.setViaGeolocation\\\"],null]]]],false],[0,\\\"\\\\n\\\\n            \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]],[28,[\\\"name\\\"]],[28,[\\\"canEditName\\\"]],true,true]]],false],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"general \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"editingProfile\\\"]],[28,[\\\"department\\\",\\\"value\\\"]]],null],\\\"show-divider\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"title\\\"]],[28,[\\\"title\\\"]],[28,[\\\"canEditTitle\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"field\\\",\\\"entry\\\",\\\"canEdit\\\",\\\"onProfile\\\",\\\"isGeneralField\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"entity\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"department\\\"]],[28,[\\\"department\\\"]],[28,[\\\"canEditDepartment\\\"]],true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showStatus\\\"]],[33,[\\\"or\\\"],[[28,[\\\"isPurecloudSource\\\"]],[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entity\\\",\\\"editable\\\",\\\"onProfile\\\",\\\"showPlaceholder\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"and\\\"],[[28,[\\\"canEditStatus\\\"]],[28,[\\\"editingProfile\\\"]]],null],true,true]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"user\\\",\\\"useMediaProviders\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],[28,[\\\"user\\\"]],[28,[\\\"haveVideoMediaProviders\\\"]],false,\\\"viewLightGallery\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"haveVideoMediaProviders\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"media-providers/video-dropdown\\\"],null,[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[28,[\\\"entity\\\"]],[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]],\\\" .contact.webrtc\\\"],null],true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"elementId\\\"]},null],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"main-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-profile/add-section\\\"],null,[[\\\"entity\\\",\\\"sections\\\",\\\"emptySections\\\",\\\"addSection\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"fieldSections\\\"]],[28,[\\\"emptyWriteableSections\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"addSection\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"sections profile-sections \\\",[33,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"masonry-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"fieldSections\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"field-section \\\",[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[15,\\\"role\\\",\\\"region\\\"],[16,\\\"aria-labelledby\\\",[34,[[28,[\\\"sectionInfo\\\",\\\"section\\\",\\\"key\\\"]],\\\"-section\\\"]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]],\\\"entity-field-section/entity-contact-info\\\"],null]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"editingElocation\\\",\\\"emergencyLocationOn\\\",\\\"showResetButton\\\",\\\"onOwnProfile\\\",\\\"emergencyLocationData\\\",\\\"removeSection\\\",\\\"componentUpdated\\\",\\\"saveElocation\\\",\\\"cancelEditElocation\\\",\\\"editElocation\\\",\\\"refreshAllEmergencylocationInfo\\\",\\\"getEmergencyLocation\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[28,[\\\"emergencyLocationOn\\\"]],false,[28,[\\\"onOwnProfile\\\"]],[28,[\\\"emergencyLocation\\\",\\\"emergencyLocationData\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"saveElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"editElocation\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"refreshAllEmergencylocationInfo\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"getEmergencyLocation\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"sectionInfo\\\",\\\"componentName\\\"]]],[[\\\"entity\\\",\\\"sectionInfo\\\",\\\"editingProfile\\\",\\\"removeSection\\\",\\\"componentUpdated\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"sectionInfo\\\"]],[28,[\\\"editingProfile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSection\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"componentUpdated\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"sectionInfo\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCardView\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"card-view-container \\\",[33,[\\\"unless\\\"],[[28,[\\\"showCardView\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\"],[[28,[\\\"entity\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"profile\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"editingPictures\\\"]],[28,[\\\"profile\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-profile/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { ThenableSearchMixin } from '../../mixins/search';\nimport { pluralize } from 'ember-inflector';\n\nconst UP = 38;\nconst DOWN = 40;\nconst ESCAPE = 27;\nconst ENTER = 13;\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(ThenableSearchMixin, {\n    classNames: ['entity-search'],\n\n    currentSelected: -1,\n\n    intl: Ember.inject.service(),\n    search: Ember.inject.service(),\n\n    select: '',\n    type: 'all',\n    filterFunction: null,\n\n    searchQuery: '',\n    userInput: null,\n    searchLimit: 10,\n    debouncedScheduleQueryUpdate: null,\n    relationship: null,\n    disabled: false,\n\n    init() {\n        this._super(...arguments);\n        this.ensurePluralType();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachClickListener();\n        this.debouncedScheduleQueryUpdate = _.debounce(this._scheduleSearchQueryUpdate, 250, { maxWait: 500 });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    },\n\n    keyDown(event) {\n        switch (event.keyCode) {\n            case UP:\n                return this.selectPrevious();\n            case DOWN:\n                return this.selectNext();\n            case ESCAPE:\n                return this.cancelInput();\n            case ENTER:\n                if (this.get('wrappedSearchResults')) {\n                    return this.chooseSelected();\n                }\n                break;\n            default:\n                this.debouncedScheduleQueryUpdate();\n                this.set('currentSelected', -1);\n                break;\n        }\n    },\n\n    actions: {\n        setUserInput(event) {\n            Ember.run.debounce(this, this._updateSearchQuery, event.target.value, 250);\n        },\n\n        submit() {\n            this.notifyPropertyChange('searchQuery');\n        },\n\n        selectResult(entity) {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            this.sendAction('select', entity);\n        },\n\n        clearSearch() {\n            this.set('searchQuery', '');\n            this.set('userInput', '');\n            return this.set('currentSelected', -1);\n        }\n    },\n\n    entityFilter: computed.reads('type'),\n\n    results: computed('searchQuery', function () {\n        if (!this.get('isEmpty')) {\n            const search = this.get('search');\n            const entities = this.get('type').split(',');\n\n            return DS.PromiseArray.create({\n                promise: search.performSearch(this.get('searchQuery'), 0, entities).then(({ results }) => {\n                    return this._buildResults(results);\n                })\n            });\n        }\n        return Ember.RSVP.resolve(Ember.A([]));\n    }),\n\n    wrappedSearchResults: Ember.computed('results', function () {\n        let searchResults = this.get('results');\n        return DS.PromiseArray.create({\n            promise: searchResults.then(searchResults => {\n                return _.map(searchResults, function (entity) {\n                    Ember.set(entity, 'selected', false);\n                    return entity;\n                });\n            })\n        });\n    }),\n\n    loading: computed('wrappedSearchResults.isFulfilled', function () {\n        return !this.get('wrappedSearchResults.isFulfilled');\n    }),\n\n    haveResults: computed('results.[]', function () {\n        return !_.isEmpty(this.get('results'));\n    }),\n\n    placeholder: computed('type', function () {\n        let map = {\n            all: 'components.entitySearch.search',\n            people: 'components.personSearch.search',\n            groups: 'components.groupSearch.search',\n            locations: 'components.locationSearch.search'\n        };\n\n        let key = map[this.get('type')];\n        if (key) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        return '';\n    }),\n\n    isEmpty: computed('searchQuery', function () {\n        return _.isEmpty(this.get('searchQuery'));\n    }),\n\n    noResultsKey: computed('type', function () {\n        if (this.get('type') !== 'locations') {\n            return 'components.entitySearch.noResults';\n        }\n\n        return 'components.entitySearch.noResultsLocation';\n    }),\n\n    ensurePluralType() {\n        let type = this.get('type');\n        if (!_.isEmpty(type) && type !== 'all') {\n            let plural = pluralize(type);\n            this.set('type', plural);\n        }\n    },\n\n    attachClickListener() {\n        Ember.$(document).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                let target = Ember.$(event.target);\n                if (!target.parents('.entity-search').length) {\n                    this.set('searchResults', []);\n                }\n            });\n        });\n    },\n\n    selectNext() {\n        const entities = this.get('wrappedSearchResults.content');\n        const nowSelected = this.get('currentSelected');\n        const nextSelected = nowSelected + 1;\n        if (nowSelected + 1 < entities.length) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[nextSelected]) {\n                entities[nextSelected].set('selected', true);\n            }\n            this.set('currentSelected', nextSelected);\n            this.scrolling(true);\n        }\n    },\n\n    selectPrevious() {\n        const entities = this.get('wrappedSearchResults');\n        const nowSelected = this.get('currentSelected');\n        const previousSelected = nowSelected + 1;\n        if (nowSelected - 1 >= 0) {\n            if (entities[nowSelected]) {\n                entities[nowSelected].set('selected', false);\n            }\n            if (entities[previousSelected]) {\n                entities[previousSelected].set('selected', true);\n            }\n            this.set('currentSelected', previousSelected);\n            this.scrolling(false);\n        }\n    },\n\n    scrolling(next) {\n        const areaScroll = this.$('.scrollable-area').scrollTop();\n        const entityHeight = this.$('.scroll-entity').height();\n        if (next) {\n            if (this.currentSelected !== 0) {\n                this.$('.scrollable-area').scrollTop(areaScroll + entityHeight);\n            }\n        } else {\n            this.$('.scrollable-area').scrollTop(areaScroll - entityHeight);\n        }\n    },\n\n    clearInputs() {\n        this.set('searchQuery', null);\n        this.set('currentSelected', -1);\n    },\n\n    cancelInput() {\n        if (this.get('searchQuery')) {\n            this.clearInputs();\n        } else {\n            this.sendAction('cancel');\n            this.clearInputs();\n        }\n    },\n\n    chooseSelected() {\n        const entities = this.get('wrappedSearchResults.content');\n        let chosen = entities[this.currentSelected];\n        if (entities.length === 1) {\n            chosen = entities[0];\n        }\n        if (chosen && !chosen.disabled) {\n            this.send('selectResult', chosen);\n        }\n    },\n\n    _buildResults(results) {\n        let filterFunction = this.get('filterFunction');\n        _.each(results, function (result) {\n            if (result.selected) {\n                Ember.set(result, 'selected', false);\n            }\n        });\n        if (results && filterFunction) {\n            return filterFunction(results);\n        }\n        return results;\n    },\n\n    _scheduleSearchQueryUpdate() {\n        Ember.run.join(() => {\n            this._updateSearchQuery();\n        });\n    },\n\n    _updateSearchQuery(value) {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        value = value || this.get('userInput');\n        this.set('searchQuery', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"HBSzv/yj\",\"block\":\"{\\\"statements\\\":[[11,\\\"form\\\",[]],[15,\\\"class\\\",\\\"input-form\\\"],[15,\\\"autocomplete\\\",\\\"off\\\"],[16,\\\"aria-labelledby\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search-label\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"submit\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search-label\\\"]]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[1,[28,[\\\"relationship\\\",\\\"label\\\"]],false],[0,\\\" - \\\"],[1,[26,[\\\"placeholder\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-entity-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[16,\\\"value\\\",[34,[[26,[\\\"userInput\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setUserInput\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"search-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-spin pc-loading\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"loading\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-container scrollable-area\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"wrappedSearchResults\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[29,\\\"default\\\"]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[18,\\\"default\\\",[[28,[\\\"result\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\"],null]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectResult\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"noResultsKey\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"noResultsKey\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nconst { inject, computed, Component } = Ember;\n\nconst isEnter = event => eventToString(event) === 'ENTER';\n\nconst MAX_STATUS_LENGTH = 50;\nconst stripHtml = str => str.replace(/(<([^>]+)>)/gi, '');\n\nexport default Component.extend({\n    classNames: ['entity-status'],\n    classNameBindings: ['editable'],\n    layoutName: 'components/entity-status',\n\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    presence: inject.service(),\n\n    entity: null,\n    editable: false,\n    onProfile: false,\n    showPlaceholder: false,\n    savedStatus: null,\n    isLoading: false,\n    maxLength: MAX_STATUS_LENGTH,\n\n    debounceTime: 1000,\n\n    init() {\n        this._super(...arguments);\n        this.set('savedStatus', this.get('status'));\n    },\n\n    showStatus: computed.or('entity.hasChatStatus', 'editable', 'showPlaceholder'),\n\n    status: computed('entity.chatStatus', {\n        get() {\n            return this.get('entity.chatStatus');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    isInvalid: computed('status', function () {\n        const status = this.get('status');\n        return !_.isEmpty(status) && status.length > MAX_STATUS_LENGTH;\n    }),\n\n    actions: {\n        changeStatus(event) {\n            if (event && event.target && isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                event.preventDefault();\n                this.updateStatus();\n            }\n        },\n\n        changeStatusEventually(event) {\n            if (event && event.target && !isEnter(event)) {\n                Ember.set(this, 'status', event.target.value);\n                Ember.run.debounce(this, this.updateStatus, this.debounceTime);\n            }\n        }\n    },\n\n    updateStatus() {\n        if (this.get('isInvalid')) {\n            return;\n        }\n        const status = this.get('status');\n        Ember.Logger.debug(`STATUS-MSG: updateStatus(${status})`);\n        this.set('isLoading', true);\n\n        this.get('presence')\n            .setUsersStatus(this.get('session.person'), status)\n            .then(() => {\n                this.set('savedStatus', status);\n            })\n            .catch(response => {\n                const message = stripHtml(response.message || '');\n                this.showUpdateError(message);\n                this.set('status', this.get('savedStatus'));\n            })\n            .finally(() => {\n                this.set('isLoading', false);\n            });\n    },\n\n    showUpdateError(message) {\n        const title = this.get('intl').t('chat.statusError');\n        const options = { hideAfter: 5 };\n        this.get('notification').error(title, message, options);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"OEYdL51E\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showStatus\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"h6\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"person.status\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status-block\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-left\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-left\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editable\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"form\\\",[]],[5,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],[[\\\"on\\\"],[\\\"submit\\\"]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"id\\\",\\\"statusPlaceHolderLabel\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"textarea\\\",[]],[16,\\\"id\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-change-status\\\"],null]]]],[16,\\\"class\\\",[34,[\\\"status-input form-control\\\",[33,[\\\"if\\\"],[[28,[\\\"isInvalid\\\"]],\\\" invalid\\\"],null],[33,[\\\"if\\\"],[[28,[\\\"isLoading\\\"]],\\\" loading\\\"],null]]]],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null]]]],[16,\\\"maxlength\\\",[34,[[26,[\\\"maxLength\\\"]]]]],[16,\\\"onkeyup\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatusEventually\\\"],null],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeStatus\\\"],null],null],[16,\\\"value\\\",[34,[[26,[\\\"status\\\"]]]]],[15,\\\"aria-labelledby\\\",\\\"statusPlaceHolderLabel\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flair-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],[[\\\"hideIfText\\\"],[true]]],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showPlaceholder\\\"]],[33,[\\\"not\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text placeholder\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.statusPlaceholder\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"status-text\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"flair\\\"],[[28,[\\\"entity\\\",\\\"chatStatus\\\"]]],null],true],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"onProfile\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"icon-quote-right\\\"],[15,\\\"icon-name\\\",\\\"legacy/quote-right\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/entity-status/template.hbs\"}});","define(\"connections-ui/components/entity-v2/activity-indicator/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/activity-indicator/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/contact-group/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/contact-group/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/favorite/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/favorite/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/hover-card/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/hover-card/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/image/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/image/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/location/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/location/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-indicator-dot/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-indicator-dot/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/entity-v2/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/entity-v2/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { rerunLayouts } from 'connections-ui/utils/masonry';\n\nvar ExpanderPluginComponent = Ember.Component.extend({\n    tagName: 'div',\n    classNames: ['expander'],\n\n    intl: Ember.inject.service(),\n\n    init: function () {\n        this._super();\n    },\n\n    addBehavior: Ember.on('didInsertElement', function () {\n        const intl = this.get('intl');\n        var expandText = intl.lookup('common.more').toString().toLowerCase();\n        var collapseText = intl.lookup('common.less').toString().toLowerCase();\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            var $el = this.$();\n            if ($el) {\n                $el.expander({\n                    expandText: expandText + ' &raquo;',\n                    userCollapseText: '&laquo; ' + collapseText,\n                    afterExpand: rerunLayouts,\n                    afterCollapse: rerunLayouts\n                });\n            }\n        });\n    }),\n\n    removeBehavior: Ember.on('willDestroyElement', function () {\n        this.$().expander('destroy');\n    })\n});\nexport default ExpanderPluginComponent;\n","export default Ember.HTMLBars.template({\"id\":\"+M2hHWWk\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/expander-plugin/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\n\nconst { on, inject, computed, observer } = Ember;\n\nexport default Ember.Component.extend({\n    classNameBindings: ['field.customLabels:custom-label', 'editing', ':label-component'],\n\n    intl: inject.service(),\n\n    field: null,\n    entry: null,\n    entity: null,\n\n    editing: false,\n    isEmpty: false,\n    fallbackToEmpty: true,\n    showHistoryYearRange: true,\n    showInstructionText: true,\n\n    choices: null,\n    choicesHidden: true,\n\n    customLabelText: null,\n\n    attributeBindings: ['for'],\n\n    labelFor: null,\n\n    actions: {\n        toggleChoicesView: function () {\n            this.toggleProperty('choicesHidden');\n        },\n\n        selectChoice: function (id) {\n            this.set('customLabelText', null);\n            this.set('entry.labelKey', id);\n            this.set('choicesHidden', true);\n        }\n    },\n\n    setupCustomLabelText: on('init', function () {\n        if (this.hasCustomLabelKey()) {\n            this.set('customLabelText', this.get('entry.labelKey'));\n        }\n    }),\n\n    canEdit: computed('editing', 'writeable', 'writeable.isFulfilled', function () {\n        const editing = this.get('editing');\n        const writeable = this.get('writeable');\n        if (writeable && typeof writeable === 'object') {\n            return editing && writeable.content;\n        }\n        return editing && writeable;\n    }),\n\n    label: computed('entry.labelKey', 'editing', 'entry.{value.startDate.year,value.endDate.year}', function () {\n        // isEmpty is set by the display-field.hbs template\n        if (this.get('isEmpty')) {\n            return this.get('field.i18nLabel');\n        }\n\n        if (!this.get('editing')) {\n            if (this.get('field.type') === 'history' && this.get('showHistoryYearRange')) {\n                return this.labelForHistoryField();\n            }\n        }\n\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n\n        // A custom label is not configured for this field.\n        // Or custom labels are in use, but no label key is found, then this is a label key for an empty value.\n        // Or group link field\n        if (!this.get('field.customLabels') || !labelKey || this.get('field.fieldPath') === 'general.links') {\n            return this.get('field.i18nLabel');\n        }\n\n        var key = `${baseKey}_labelKey_${labelKey}`;\n\n        // If there is a translation for the custom label key, use it.\n        if (!this.hasCustomLabelKey()) {\n            return this.get('intl').lookup(key).toString();\n        }\n\n        // Otherwise return the label key as it was typed in.\n        return labelKey;\n    }),\n\n    customLabels: computed('field.{customLabels,fieldPath}', 'isEmpty', function () {\n        return (\n            this.get('field.customLabels') && !this.get('isEmpty') && this.get('field.fieldPath') !== 'general.links'\n        );\n    }),\n\n    labelChoices: computed('entry', function () {\n        var baseKey = this.get('field').getI18nKey();\n        return _.map(this.get('field.labelKeys'), labelKey => {\n            return {\n                id: labelKey,\n                label: this.get('intl').lookup(`${baseKey}_labelKey_${labelKey}`).toString()\n            };\n        });\n    }),\n\n    instructionText: computed('field.instructionText', function () {\n        let field = this.get('field').getI18nKey();\n        let key = `${field}_instructionText`;\n\n        const intl = this.get('intl');\n\n        if (intl.query(key)) {\n            return intl.lookup(key).toString();\n        } else {\n            return this.get('field.instructionText');\n        }\n    }),\n\n    _placeholder: computed(function () {\n        return this.get('intl').lookup('common.label').toString();\n    }),\n\n    customLabelTextChanged: observer('customLabelText', function () {\n        let label = this.get('customLabelText');\n        let entry = this.get('entry');\n        if (!entry) {\n            return;\n        }\n\n        if (label) {\n            this.set('entry.labelKey', label);\n        } else if (_.isEmpty(this.get('labelChoices'))) {\n            this.set('entry.labelKey', '');\n        } else {\n            this.set('entry.labelKey', this.get('labelChoices')[0].id);\n        }\n    }),\n\n    attachClickListener: on('didInsertElement', function () {\n        var clickId = this.get('elementId');\n        Ember.$(document).on('click.' + clickId, event => {\n            Ember.run(() => {\n                var pickerParent = $(event.target).parents('.picker'),\n                    containerParent = $(event.target).parents(`#${clickId}`);\n                if (!pickerParent.length || !containerParent.length) {\n                    this.set('choicesHidden', true);\n                }\n            });\n        });\n    }),\n\n    attachTooltip: on('didInsertElement', function () {\n        if (this.get('instructionText') && this.get('showInstructionText')) {\n            this.$('.picker .btn').tooltip({\n                html: true,\n                title: () => {\n                    return this.get('instructionText');\n                },\n                placement: 'right',\n                trigger: 'hover'\n            });\n        }\n    }),\n\n    removeClickListener: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n        this.$('i.instruction-text').tooltip('destroy');\n    }),\n\n    keyPress(event) {\n        if (this.$('input').is(':focus') && event.keyCode === 13) {\n            this.set('customLabelText', this.get('customLabelText'));\n            this.send('toggleChoicesView');\n        }\n    },\n\n    keyDown(event) {\n        const target = event.target;\n        if ((event.keyCode === 13 || event.keyCode === 32) && target.classList.contains('current-entry')) {\n            event.preventDefault();\n            this.send('toggleChoicesView');\n            return false;\n        }\n        if (\n            (event.keyCode === 13 || event.keyCode === 32) &&\n            event.target.closest('li[id]') &&\n            event.target.closest('.choices')\n        ) {\n            event.preventDefault();\n            const choiceId = event.target.closest('li').id;\n            this.send('selectChoice', choiceId);\n            return false;\n        }\n    },\n\n    // Returned from label computed above if the label is a history field. Label is not like a form label here.\n    // It's the value of the thing from entry.value\n    labelForHistoryField() {\n        moment.locale(this.get('intl.isoLocale'));\n        var startDate = this.get('entry.value.startDate');\n        var endDate = this.get('entry.value.endDate');\n\n        if (_.isEmpty(startDate) && _.isEmpty(endDate)) {\n            if (this.get('fallbackToEmpty')) {\n                return '';\n            }\n            return this.get('field.i18nLabel');\n        }\n\n        var hasStartDate = Ember.get(startDate, 'year');\n        var hasEndDate = endDate ? Ember.get(endDate, 'year') : false;\n\n        if (!hasStartDate && !hasEndDate) {\n            return this.get('field.i18nLabel');\n        }\n\n        let now = moment();\n        const regex = /DD\\W|\\WDD/g;\n        let localeFormat = now._locale._longDateFormat.L;\n        localeFormat = localeFormat.replace(/MM/, 'M');\n        let monthYearLocaleFormat = localeFormat.replace(regex, '');\n\n        var monthYearFmt = monthYearLocaleFormat; // cannot hardcode this to a particular format because then we can't adjust based on locale\n        var yearFmt = 'YYYY';\n\n        var startDateFmt = yearFmt;\n        var endDateFmt = yearFmt;\n\n        if (hasStartDate && startDate.month) {\n            startDate = _.clone(startDate);\n            startDate.month = startDate.month - 1;\n            startDateFmt = monthYearFmt;\n        } else if (hasStartDate) {\n            startDate = _.clone(startDate);\n            startDate.month = 0;\n        }\n\n        if (hasEndDate && endDate.month) {\n            endDate = _.clone(endDate);\n            endDate.month = endDate.month - 1;\n            endDateFmt = monthYearFmt;\n        } else if (hasStartDate && hasEndDate) {\n            endDate = _.clone(endDate);\n            endDate.month = new Date().getMonth();\n        }\n\n        var result;\n        if (!startDate && endDate) {\n            result = moment(endDate).format(endDateFmt);\n        } else {\n            var mStartDate = moment(startDate);\n            var mEndDate = endDate ? moment(endDate) : moment();\n            if (endDate && endDate.month) {\n                mEndDate = mEndDate.endOf('month');\n            }\n\n            var difference = mEndDate.diff(mStartDate);\n            var duration = moment.duration(difference).humanize();\n\n            let placeholder = this.get('intl').lookup('entity.fieldTypes.history.toPlaceholder');\n            let formattedStartDate = mStartDate.format(startDateFmt);\n            let formattedEndDate = hasEndDate ? mEndDate.format(endDateFmt) : placeholder.toString();\n            result = `${formattedStartDate}&ndash;${formattedEndDate}<div class=\"duration label label-default\">${duration}</div>`;\n        }\n\n        return Ember.String.htmlSafe(result);\n    },\n\n    hasCustomLabelKey() {\n        var baseKey = this.get('field').getI18nKey();\n        var labelKey = this.get('entry.labelKey');\n        return !this.get('intl').query(`${baseKey}_labelKey_${labelKey}`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"nM312VbL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"customLabels\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"writeable\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picker custom-labels is-editing\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-entry btn btn-default\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleChoicesView\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[1,[26,[\\\"label\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"choicesHidden\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"choices list-unstyled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-choice\\\"]]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.labels.customLabel\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"placeholder\\\",\\\"classNames\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-choice\\\"],null],[28,[\\\"customLabelText\\\"]],[28,[\\\"_placeholder\\\"]],\\\"form-control\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"labelChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[16,\\\"id\\\",[28,[\\\"choice\\\",\\\"id\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectChoice\\\",[28,[\\\"choice\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"choice\\\",\\\"label\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"choice\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"custom-labels not-editing\\\"],[16,\\\"for\\\",[26,[\\\"labelFor\\\"]],null],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"no-custom-labels\\\"],[16,\\\"for\\\",[26,[\\\"labelFor\\\"]],null],[16,\\\"id\\\",[34,[[26,[\\\"id\\\"]],\\\"-tag\\\"]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"label\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/field-label/template.hbs\"}});","define(\"connections-ui/components/fixtable-column-header\", [\"exports\", \"fixtable-ember/components/fixtable-column-header\"], function (_exports, _fixtableColumnHeader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnHeader.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-column-label\", [\"exports\", \"fixtable-ember/components/fixtable-column-label\"], function (_exports, _fixtableColumnLabel) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableColumnLabel.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-empty-state\", [\"exports\", \"fixtable-ember/components/fixtable-empty-state\"], function (_exports, _fixtableEmptyState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableEmptyState.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-footer\", [\"exports\", \"fixtable-ember/components/fixtable-footer\"], function (_exports, _fixtableFooter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableFooter.default;\n    }\n  });\n});\n","import FixtableGrid from 'fixtable-ember/components/fixtable-grid';\n\nexport default FixtableGrid.extend({\n    classNames: ['fixtable-grid']\n});\n","define(\"connections-ui/components/fixtable-row-toggle\", [\"exports\", \"fixtable-ember/components/fixtable-row-toggle\"], function (_exports, _fixtableRowToggle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRowToggle.default;\n    }\n  });\n});\n","define(\"connections-ui/components/fixtable-row\", [\"exports\", \"fixtable-ember/components/fixtable-row\"], function (_exports, _fixtableRow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fixtableRow.default;\n    }\n  });\n});\n","define(\"connections-ui/components/flashy-webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/flashy-webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-editor'],\n\n    store: inject.service('store'),\n    session: inject.service(),\n\n    entity: null,\n    fieldData: null,\n    field: null,\n\n    location: null,\n    parentLocation: null,\n\n    editing: true,\n\n    saveLocation: () => {},\n\n    coordinates: {},\n    coordinatesRatio: {},\n\n    type: 'edit',\n\n    selectFloorplan: true,\n\n    entry: computed.alias('fieldData.value'),\n\n    actions: {\n        setCurrentFloor(floor) {\n            let entry = this.get('entry');\n\n            let data = {\n                coordinates: {},\n                locationId: floor.get('id'),\n                notes: ''\n            };\n\n            let floorplans = floor.get('floorplanImages');\n            floorplans = floor.get('floorplanImage');\n            if (floorplans) {\n                data.coordinates = {\n                    x: 0,\n                    y: 0\n                };\n            }\n\n            Ember.set(entry, 'value', data);\n\n            let currentLocation = this.get('location');\n            let floors = this.get('floors');\n\n            this.set('location', floor);\n            this.send('showFloorplan');\n\n            if (currentLocation.get('isFloor')) {\n                floors.addObject(currentLocation);\n            }\n\n            floors.removeObject(floor);\n\n            floors = floors.sortBy('name');\n            this.set('floors', floors);\n        },\n\n        showFloorplan() {\n            if (this.get('floorplanImageUrl')) {\n                this.set('selectFloorplan', true);\n            }\n        },\n\n        saveFloorplan() {},\n\n        closeFloorplan: function () {\n            this.set('selectFloorplan', false);\n        }\n    },\n\n    loadInitialPinLocation: on('didRender', function () {\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            let coordinates = this.get('entry.value.coordinates');\n            let img = this.$('.floorplan-image img');\n            if (!img) {\n                return;\n            }\n\n            img.one('load', () => {\n                let coords = this.getRatioCoordinates(coordinates, img[0], function (a, b) {\n                    return a * b;\n                });\n\n                this.attachPinForXY(coords.x, coords.y);\n            });\n        });\n    }),\n\n    floorplanImageUrl: computed('location.floorplanImage', function () {\n        let images = this.get('location.floorplanImage');\n        if (images && images.length > 0) {\n            let image = images.find(image => image.resolution === 'x800');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    showFloorplan: computed('floorplanImageUrl', 'selectFloorplan', function () {\n        return this.get('floorplanImageUrl') && this.get('selectFloorplan');\n    }),\n\n    floors: computed('location.floors.[]', 'parentLocation.floors.[]', 'location.{id,isFloor}', function () {\n        let locationFloors = this.get('location.floors');\n        let parentFloors = this.get('parentLocation.floors');\n        let floors = [];\n        if (locationFloors && locationFloors.length > 0) {\n            floors = locationFloors;\n        }\n        if (parentFloors && parentFloors.length > 0) {\n            floors = parentFloors;\n        }\n        // Remove yourself\n        if (this.get('location.isFloor') && floors.length > 0) {\n            floors = floors.filter(floor => floor.get('id') !== this.get('location.id'));\n        }\n        return floors;\n    }),\n\n    loadFloors() {\n        return;\n    },\n\n    updateCoordinatesRatio: observer('coordinates', function () {\n        let coordinates = this.get('coordinates');\n        if (!!coordinates) {\n            let img = this.$('.floorplan-image img')[0];\n            let coords = this.getRatioCoordinates(coordinates, img, function (a, b) {\n                return a / b;\n            });\n\n            if (img) {\n                this.set('coordinatesRatio', {\n                    x: coords.x,\n                    y: coords.y\n                });\n            }\n        } else {\n            this.set('coordinatesRatio', {});\n        }\n    }),\n\n    updateCoordinatesOnLocation: observer('coordinatesRatio', function () {\n        let ratio = this.get('coordinatesRatio');\n        let entry = this.get('entry');\n\n        let value = entry.value;\n        value.coordinates = ratio;\n\n        Ember.set(entry, 'value', value);\n    }),\n\n    click(event) {\n        let target = Ember.$(event.target);\n\n        if (target.parent().is('.floorplan-image') && target.is('img') && this.get('editing')) {\n            let x = event.offsetX || event.clientX - $(event.target).offset().left + window.pageXOffset;\n            let y = event.offsetY || event.clientY - $(event.target).offset().top + window.pageYOffset;\n\n            this.attachPinForXY(x, y);\n\n            this.set('coordinates', {\n                x: x,\n                y: y\n            });\n        }\n    },\n\n    getRatioCoordinates(coordinates, image, operation) {\n        if (!image) {\n            return { x: 0, y: 0 };\n        }\n\n        let naturalHeight = image.naturalHeight;\n        let naturalWidth = image.naturalWidth;\n        let heightDiff = naturalHeight - image.height;\n        let widthDiff = naturalWidth - image.width;\n\n        let x = operation(coordinates.x, naturalWidth - widthDiff);\n        let y = operation(coordinates.y, naturalHeight - heightDiff);\n\n        return { x: x, y: y };\n    },\n\n    attachPinForXY(x, y) {\n        let icon = $('<i class=\"pin pc pc-location\"></i><i class=\"pin shadow pc pc-location\"></i>').css({\n            position: 'absolute',\n            left: x - 12,\n            top: y - 12\n        });\n\n        let currentPin = this.$('i.pin');\n        if (currentPin) {\n            this.$('i.pc-location').remove();\n        }\n\n        const image = this.$('.floorplan-image');\n        if (image) {\n            image.append(icon);\n        }\n    },\n\n    floorSorter(a, b) {\n        let init = [a.get('name'), b.get('name')];\n        let sorted = init.sort();\n        if (sorted[0] === a.get('name')) {\n            return 1;\n        } else {\n            return -1;\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"xheP5PK6\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"locations\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.floors\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"location\\\",\\\"isFloor\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-location\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"location\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"floors\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-content clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"setCurrentFloor\\\",[28,[\\\"floor\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"location-display\\\"],null,[[\\\"entity\\\",\\\"location\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"floor\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"floor\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showFloorplan\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"heading\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"locations.selectOffice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-image\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[26,[\\\"floorplanImageUrl\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"floorplan-detail\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"locations.noFloorplan\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-editor/template.hbs\"}});","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nconst { on, Component, run } = Ember;\n\nexport default Component.extend({\n    classNames: ['floorplan-popover'],\n    classNameBindings: ['show::hide'],\n\n    show: false,\n    attachmentId: '',\n    hidePopover: () => {},\n\n    tetherConstraints: {\n        pin: ['left', 'right']\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        const show = this.get('show');\n        if (show) {\n            run.scheduleOnce('afterRender', this, this._createPopper);\n        } else {\n            run.scheduleOnce('afterRender', this, this._destroyPopper);\n        }\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _createPopper() {\n        if (this._popper) {\n            return;\n        }\n\n        const targetEl = document.querySelector(`#${this.get('attachmentId')}`);\n        const popoverEl = this.element;\n        if (!targetEl || !popoverEl) {\n            return;\n        }\n\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        run.later(() => {\n            this.$('img').on(\n                'load',\n                Ember.run.bind(this, () => {\n                    if (this._popper) {\n                        this._popper.scheduleUpdate();\n                    }\n                })\n            );\n        }, 10);\n    },\n\n    attachClickHandler: on('didInsertElement', function () {\n        Ember.$(document).on(\n            `click.${this.get('elementId')}`,\n            Ember.run.bind(this, event => {\n                if (!this.get('show')) {\n                    return;\n                }\n\n                let target = Ember.$(event.target);\n\n                if (\n                    target.parents('.floorplan-action').length ||\n                    target.parents('.floorplan-popover').length ||\n                    target.parent('.location-name').length ||\n                    target.parent('.mini-card-component-wrapper').length\n                ) {\n                    return;\n                } else {\n                    this.get('hidePopover')();\n                }\n            })\n        );\n    }),\n\n    removeHandlers: on('willDestroyElement', function () {\n        Ember.$(document).off(`.${this.get('elementId')}`);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"j0uG/gql\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popover-content\\\"],[13],[0,\\\"\\\\n        \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/floorplan-popover/template.hbs\"}});","define(\"connections-ui/components/font-icon/component\", [\"exports\", \"ember-purecloud-components/components/font-icon/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport {\n    buildIntlTelInputOptions,\n    setupIntlTelInputAccessibility,\n    updateSelectedCountryAriaLabel\n} from 'connections-ui/utils/intl-tel-input-options';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nlet GroupContactModalComponent = Ember.Component.extend({\n    classNames: ['group-contact-form'],\n    classNameBindings: ['group-ring-voicemail'],\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service('file-upload'),\n\n    entity: Ember.computed.reads('model'),\n\n    attrs: {\n        close: () => {},\n        disableModal: () => {}\n    },\n\n    saveContactInfo: () => {},\n\n    number: null,\n    extension: null,\n    originalExtension: null,\n\n    voicemailFile: null,\n    showVoicemailOptions: false,\n    // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n    resetGreeting: false,\n\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n\n    actions: {\n        saveForm() {\n            this.saveContactInfo();\n        },\n\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n            }\n        },\n\n        toggleVoicemail() {\n            this.toggleProperty('voicemailOn');\n        },\n\n        toggleEmailNotification() {\n            this.toggleProperty('emailNotificationOn');\n        },\n\n        toggleOptions() {\n            this.toggleProperty('showVoicemailOptions');\n        },\n        // ^^^ This corresponds to `toggleShowVoicemailGreetingOptions` in `group-profile/group-contact-panel/*`.\n\n        cancel() {\n            this.attrs.close();\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableModal(key, value) {\n            this.set(key, value);\n            this.attrs.disableModal(value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n        Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n    },\n\n    numberOfRotations: Ember.computed('entity.numberOfRotations', 'entity.numberOfRotations.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.numberOfRotations.content');\n        }\n    }),\n\n    rotateCallSeconds: Ember.computed('entity.rotateCallSeconds', 'entity.rotateCallSeconds.{content,isFulfilled}', {\n        get() {\n            return this.get('entity.rotateCallSeconds.content');\n        }\n    }),\n\n    _voicemailOn: false,\n    voicemailOn: Ember.computed(\n        'entity.voicemailEnabled',\n        'entity.voicemailEnabled.{content,isFulfilled}',\n        'editingVoicemailDisabled',\n        {\n            get() {\n                if (this.get('entity.isSaving')) {\n                    return this._voicemailOn;\n                }\n\n                if (this.get('editingVoicemailDisabled')) {\n                    this._voicemailOn = false;\n                    return false;\n                }\n\n                const value =\n                    this.get('entity.voicemailEnabled.isFulfilled') && this.get('entity.voicemailEnabled.content');\n\n                this._voicemailOn = value;\n                return value;\n            },\n\n            set(key, value) {\n                this._voicemailOn = value;\n\n                return value;\n            }\n        }\n    ),\n\n    emailNotificationOn: Ember.computed(\n        'entity.emailNotificationEnabled',\n        'entity.emailNotificationEnabled.{content,isFulfilled}',\n        {\n            get() {\n                return this.get('entity.emailNotificationEnabled');\n            },\n\n            set(key, value) {\n                return value;\n            }\n        }\n    ),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if ((originalExtension && extension !== originalExtension) || this.get('entity.isSaving')) {\n            return false;\n        }\n\n        return !!this.get('entity.number.rel.errorCode');\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        function () {\n            const number = this.get('number');\n            const ext = this.get('extension');\n\n            if (_.isEmpty(number) && _.isEmpty(ext)) {\n                return true;\n            }\n\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (!number) {\n                return !this.get('invalidExtension');\n            }\n\n            return !this.get('invalidPhoneNumber');\n        }\n    ),\n\n    isInvalid: Ember.computed.not('isValid'),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (this.get('invalidExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidExtension').toString();\n        } else if (this.get('invalidPhoneNumber')) {\n            return this.get('intl').lookup('purecloud.callForwarding.invalidPhoneNumber').toString();\n        } else if (this.get('haveNumberAndExtension')) {\n            return this.get('intl').lookup('purecloud.callForwarding.numberAndExtension').toString();\n        }\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        const elem = this.$('.group-ring-phone-input');\n        if (elem) {\n            return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber', false);\n        }\n        return false;\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    showGroupEmail: Ember.computed(function () {\n        return false; // maybe true in the future...\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting.content');\n        return !!greeting;\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting.isFulfilled', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.audioFile.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    showEmailNotification: Ember.computed.not('session.org.hasHipaaEnabled'),\n    // ^^^ This corresponds to `emailNotifications.show` in `group-profile/group-contact-panel/*`.\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        this.attrs.disableModal(!this.get('isValid'));\n    }),\n\n    setupInput() {\n        const $input = this.$('.group-ring-phone-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n        $input.intlTelInput(buildIntlTelInputOptions(this.get('intl'), this.get('application')));\n        setupIntlTelInputAccessibility($input, this.get('intl'), fieldName);\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n\n        if (!_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(inputElem.intlTelInput('getNumber'))) {\n                inputElem.intlTelInput('setNumber', info.number);\n            }\n\n            if (_.isEmpty(extElem.val())) {\n                extElem.val(info.extension);\n            }\n\n            this.set('number', info.number);\n            this.set('extension', info.extension);\n\n            this.set('originalExtension', info.extension);\n        }\n\n        updateSelectedCountryAriaLabel(inputElem, this.get('intl'), fieldName);\n    },\n\n    async uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        if (this.get('session.features.EC-760')) {\n            return await this.get('fileUpload').uploadGreetingWithPreSigned(file, this.get('entity.guid'));\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('entity.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    save() {\n        const entity = this.get('entity');\n        const ajax = this.get('ajax');\n        const notification = this.get('notification');\n        const application = this.get('application');\n\n        const { voicemailOn, numberOfRotations, rotateCallSeconds, emailNotificationOn } = this.getProperties(\n            'voicemailOn',\n            'numberOfRotations',\n            'rotateCallSeconds',\n            'emailNotificationOn'\n        );\n\n        this.setNumberData();\n\n        const promise = entity.save();\n        let showExtensionErrorNotification = false;\n\n        // Reset since we are saving\n        this.set('originalExtension', null);\n\n        promise\n            .then(() => {\n                const haveError = !!entity.get('number.rel.errorCode');\n\n                if (!this.get('isEmpty') && !haveError) {\n                    return entity.get('policy').then(policy => {\n                        policy.setProperties({\n                            enabled: voicemailOn,\n                            rotateCallsSecs: rotateCallSeconds,\n                            stopRingingAfterRotations: numberOfRotations,\n                            sendEmailNotifications: emailNotificationOn\n                        });\n                        return policy.save();\n                    });\n                }\n\n                showExtensionErrorNotification = haveError;\n            })\n            .then(() => {\n                const resetGreeting = this.get('resetGreeting');\n                if (resetGreeting) {\n                    return this.get('entity.greeting').then(greeting => {\n                        let path = greeting.selfUri;\n                        if (_.head(path) === '/') {\n                            path = path.substring(1);\n                        }\n                        const url = application.pcV2Uri(path);\n                        return ajax.delete(url);\n                    });\n                } else {\n                    let file = this.get('recordingFile');\n                    if (!file) {\n                        file = this.get('voicemailFile');\n                    }\n\n                    return this.uploadGreeting(file);\n                }\n            })\n            .then(() => {\n                entity.notifyPropertyChange('greeting');\n            });\n\n        return promise\n            .then(() => {\n                let title = this.get('entity.name');\n                let message = this.get('intl').lookup('notification.group.general');\n                let handler = notification.info.bind(notification);\n\n                if (showExtensionErrorNotification) {\n                    handler = notification.error.bind(notification);\n\n                    const isExtensionResourceInUse = this.get('isExtensionResourceInUse');\n                    const isExtensionNotInPool = this.get('isExtensionNotInPool');\n\n                    if (isExtensionNotInPool) {\n                        title = this.get('intl').lookup('notification.group.extensionNotInPoolError.title');\n                        message = this.get('intl').lookup('notification.group.extensionNotInPoolError.message');\n                    } else if (isExtensionResourceInUse) {\n                        title = this.get('intl').lookup('notification.group.resourceInUseError.title');\n                        message = this.get('intl').lookup('notification.group.resourceInUseError.message');\n                    } else {\n                        title = this.get('intl').lookup('notification.group.groupRingExtensionError.title');\n                        message = this.get('intl').lookup('notification.group.groupRingExtensionError.message');\n                    }\n                }\n\n                handler(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n            })\n            .catch(err => {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.saveError');\n                notification.error(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                Ember.Logger.error(message, err);\n            })\n            .finally(() => {\n                this.attrs.close();\n                entity.reload();\n            });\n    },\n\n    setNumberData() {\n        var number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        var extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('entity.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('entity.contactInfo'))) {\n                this.set('entity.contactInfo', {});\n            }\n\n            var valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            var emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('entity.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('entity.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('entity.contactInfo.groupNumber.firstObject.value.extension', extension);\n    }\n});\n\nexport default GroupContactModalComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {},\n        disableModal: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableModal(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"rA8lkHhw\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"dNb/ur5f\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showGroupEmail\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"email\\\"],[15,\\\"id\\\",\\\"group-email\\\"],[15,\\\"class\\\",\\\"form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],null],[16,\\\"value\\\",[26,[\\\"email\\\"]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"number phone-field\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[15,\\\"class\\\",\\\"group-ring-phone-input form-control\\\"],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"group-ring-extension-input form-control\\\"],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"errorMessage\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"call-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRingNotice\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"rotateCallSeconds\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"numberOfRotations\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-contact-modal/inline-number-input\\\"],null,[[\\\"disabled\\\",\\\"key\\\",\\\"value\\\",\\\"update\\\",\\\"disableModal\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isEmpty\\\"]],[28,[\\\"isInvalid\\\"]],[28,[\\\"haveExtensionError\\\"]]],null],\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableModal\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.voicemail\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"voicemailEnabled\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemailOn\\\"]],[28,[\\\"editingVoicemailDisabled\\\"]],\\\"toggleVoicemail\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editingVoicemailDisabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"haveExtensionError\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionResourceInUse\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inUseError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExtensionNotInPool\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.extensionError\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.genericError\\\"],null],false],[0,\\\"\\\\n                        \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-warning\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.editingVoicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemailOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"entity\\\",\\\"greeting\\\",\\\"isFulfilled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleOptions\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\\n                            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showEmailNotification\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotification\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotificationOn\\\"]],\\\"toggleEmailNotification\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotificationOn\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotificationHelpText\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-contact-modal/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport debounce from 'lodash.debounce';\n\nimport DS from 'ember-data';\n\nimport EntityControllerMixin from '../../mixins/entity-controller';\nimport FieldSection from '../../field-config/field-section';\n\nimport { BASE_PERSON } from '../../models/person';\n\nconst { Component, run, inject, RSVP } = Ember;\n\nlet jobEndpoint = function (id) {\n    return `/api/v2/jobs/${id}`;\n};\n\nlet GroupProfileComponent = Component.extend(EntityControllerMixin, {\n    classNames: ['group-profile', 'entity'],\n    classNameBindings: ['chatEnabled'],\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    favorites: inject.service(),\n    permissions: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    addressformat: inject.service(),\n\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    phoneEnabled: Ember.computed.bool('permissions.phoneEnabled'),\n    chatEnabled: Ember.computed.alias('chatService.enabled'),\n    model: null,\n\n    showDropdown: false,\n\n    isEditing: false,\n    showContactInfo: false,\n    saves: [],\n\n    groupRoom: null,\n    showMembers: true,\n    showLinkDropdown: false,\n    displayIndices: false,\n\n    hasLinks: false,\n    hasInformals: false,\n\n    isLoading: false,\n\n    displayWarningModal: false,\n\n    activeTab: 'members',\n    shouldFocusToggle: false,\n\n    excludedFieldSections: ['general', 'images', 'membership', 'membershipDraft', 'privacy', 'owners'],\n\n    excludedMembershipFields: ['includeOwners', 'exclusions', 'inclusions'],\n\n    excludedEditingFields: ['compiledQuery'],\n\n    view: Ember.$('<div class=\"center-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>'),\n\n    toggleLoading: Ember.observer('isLoading', function () {\n        if (this.get('_state') === 'inDOM' && this.get('isLoading')) {\n            this.$('.field-section .content').append(this.get('view'));\n        } else if (this.$()) {\n            this.$('.center-indicator').remove();\n        }\n    }),\n\n    generalExcludedEditingFields: ['groupType'],\n\n    actions: {\n        selectTab(tab) {\n            this.set('activeTab', tab);\n        },\n\n        toggleCallsEnabled() {\n            if (!this.get('callsEnabled') && this.get('hasRules')) {\n                this.set('displayWarningModal', true);\n            } else {\n                this.set('shouldFocusToggle', true);\n                this.toggleProperty('callsEnabled');\n                this.saveCallsEnabledState();\n            }\n            this.set('isEditing', false);\n        },\n\n        toggleEditing() {\n            if (!this.get('isEditing')) {\n                this.get('model').reload();\n            }\n            this.toggleProperty('isEditing');\n        },\n\n        changeEditingMode(editing) {\n            this.set('isEditing', editing);\n        },\n\n        editGeneralInfo() {\n            this.set('isShowingGeneralModal', true);\n        },\n\n        editContactInfo() {\n            this.set('showContactInfo', true);\n        },\n\n        cancelEditContactInfo() {\n            this.set('showContactInfo', false);\n        },\n\n        editPrivacyRules() {\n            this.set('isShowingPrivacyModal', true);\n        },\n\n        toggleLinks() {\n            this.toggleProperty('showLinkDropdown');\n        },\n\n        goToLink(href) {\n            if (href.indexOf('http://') !== -1 || href.indexOf('https://') !== -1) {\n                window.open(href, '_blank');\n            } else {\n                window.open('http://' + href, '_blank');\n            }\n        },\n\n        confirmGeneral() {\n            const notification = this.get('notification');\n            const group = this.get('model');\n            group\n                .save()\n                .then(data => {\n                    Ember.Logger.debug('GROUP-PROFILE: group saved', data);\n                    this.closeAllModals();\n                    if (!_.isEmpty(data)) {\n                        if (data.job) {\n                            this.handleJob(data.job);\n                        }\n                    }\n\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.general');\n                    notification.info(title, message, {\n                        forceBrowserNotification: true,\n                        hideAfter: 5\n                    });\n                })\n                .catch(e => {\n                    Ember.Logger.error('group save failed', { error: e });\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.saveError');\n                    notification.error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    group.reload();\n                });\n\n            this.send('setHasLinks');\n        },\n\n        cancelGeneral() {\n            this.get('model').reload();\n            this.closeAllModals();\n        },\n\n        confirm() {\n            const notification = this.get('notification');\n            let model = this.get('model');\n            if (model.get('owners.owners.length') === 0) {\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('notification.group.noOwners').toString();\n                notification.info(title, message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n\n                model.reload();\n            } else {\n                this.set('isLoading', true);\n\n                model.save().then(() => {\n                    const title = this.get('model.name');\n                    const message = this.get('intl').lookup('notification.group.general').toString();\n                    notification.show(title, message, {\n                        hideAfter: 8\n                    });\n\n                    var job = this.store.metadataFor('group').job;\n                    this.handleJob(job);\n                    this.set('isLoading', false);\n                });\n            }\n\n            return false;\n        },\n\n        noop() {},\n\n        deleteGroup() {\n            this.set('isShowingDeleteModal', true);\n        },\n\n        cancelDelete() {\n            this.closeAllModals();\n        },\n\n        confirmDelete() {\n            const notification = this.get('notification');\n            const model = this.get('model');\n            const id = model.get('id');\n            const groupType = model.get('groupType');\n            const person = this.get('session.person');\n\n            model.deleteRecord();\n            model\n                .save()\n                .then(group => {\n                    Ember.Logger.debug('GROUP-PROFILE: Deleted Group: ', group);\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleting');\n                    notification.info(title, message, {\n                        icon: '',\n                        hideAfter: 8\n                    });\n                    this.closeAllModals();\n                    window.history.back();\n                })\n                .then(function () {\n                    if (groupType) {\n                        const type = groupType.toLowerCase();\n                        const groups = person.get(`groups.${type}`) || [];\n                        const groupData = groups.findBy('value', id);\n                        groups.removeObject(groupData);\n                    }\n                })\n                .catch(e => {\n                    Ember.Logger.error('GROUP-PROFILE: Error deleting group', {\n                        error: e\n                    });\n\n                    model.set('state', 'active');\n\n                    const title = model.get('name');\n                    const message = this.get('intl').lookup('notification.group.deleteError');\n                    notification.error(title, message, {\n                        icon: ''\n                    });\n                });\n        },\n\n        setHasLinks() {\n            let links = this.get('model.general.links');\n            if (links && links !== undefined) {\n                this.set('hasLinks', links.length > 0 && links[0].value !== '');\n            } else {\n                this.set('hasLinks', false);\n            }\n        },\n\n        makeCall: debounce(function () {\n            this.bubbleAction({\n                action: 'startCallByNumber',\n                actionContext: [this.get('phoneNumber')]\n            });\n        }, 250),\n\n        confirmWarningModal() {\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n            this.set('displayWarningModal', false);\n            this.set('shouldFocusToggle', true);\n            this.set('callsEnabled', true);\n            this.saveCallsEnabledState();\n        },\n\n        closeWarningModal() {\n            this.set('displayWarningModal', false);\n        },\n\n        toggleGroupProfileEditPopover(status) {\n            this.set('showDropdown', !status);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('model') && !this.get('model.uniqueRoleCount')) {\n            const group = this.get('model');\n            group.getGrants();\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.setupToggleAccessibility();\n        this.setupKeyboardHandlers();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.teardownKeyboardHandlers();\n    },\n\n    setupKeyboardHandlers() {\n        this._handleEscapeKey = event => {\n            if (event.key === 'Escape' && this.get('showDropdown')) {\n                this.set('showDropdown', false);\n                // Return focus to the edit button that opened the popover\n                run.scheduleOnce('afterRender', this, function () {\n                    const editButton = this.$('#group-profile-edit');\n                    if (editButton && editButton.length) {\n                        editButton.focus();\n                    }\n                });\n            }\n        };\n        document.addEventListener('keydown', this._handleEscapeKey);\n    },\n\n    teardownKeyboardHandlers() {\n        if (this._handleEscapeKey) {\n            document.removeEventListener('keydown', this._handleEscapeKey);\n        }\n    },\n\n    // Observer to reapply accessibility attributes when toggle state changes\n    callsEnabledObserver: Ember.observer('callsEnabled', function () {\n        run.scheduleOnce('afterRender', this, 'setupToggleAccessibility');\n        // Focus the toggle in the newly displayed template if it was triggered by user action\n        if (this.get('shouldFocusToggle')) {\n            run.scheduleOnce('afterRender', this, 'focusToggleAfterSwitch');\n        }\n    }),\n\n    // Observer to handle conditional voicemail-related toggles\n    voicemailStateObserver: Ember.observer('model.policy.enabled', function () {\n        run.scheduleOnce('afterRender', this, 'setupConditionalToggleAccessibility');\n    }),\n\n    setupToggleAccessibility() {\n        // Fix accessibility issue with toggle switch\n        run.schedule('afterRender', this, function () {\n            const toggleInput = this.$('.toggle-switch-wrapper .switch-input');\n            const innerLabel = this.$('.toggle-switch-wrapper .toggle-switch[title]');\n            const labelText = this.get('intl').lookup('groups.groupRing.enableCalls');\n\n            if (toggleInput.length && labelText) {\n                // Associate the input with the existing label\n                toggleInput.attr('aria-labelledby', this.get('callsEnabled') ? 'toggleLabel' : 'membershipToggleLabel');\n                toggleInput.attr('aria-label', labelText);\n            }\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && labelText) {\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n            // Map of label IDs to their corresponding toggle switch selectors (always visible)\n            const toggleMappings = [\n                {\n                    labelId: 'forward-call-label',\n                    toggleSelector: '.backup-container .switch-input',\n                    innerLabelSelector: '.backup-container .toggle-switch[title]'\n                },\n                {\n                    labelId: 'voicemails-label',\n                    toggleSelector: '.group-voicemail .switch-input',\n                    innerLabelSelector: '.group-voicemail .toggle-switch[title]'\n                }\n            ];\n\n            toggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n                const innerLabel = this.$(mapping.innerLabelSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                    // Remove any existing sr-only text to avoid duplicates\n                    innerLabel.find('.sr-only').remove();\n                    const srText = Ember.$('<span class=\"sr-only\">' + label.text() + '</span>');\n                    innerLabel.prepend(srText);\n                }\n            });\n\n            // Handle conditional toggles that appear when voicemails are enabled\n            this.setupConditionalToggleAccessibility();\n        });\n    },\n\n    setupConditionalToggleAccessibility() {\n        // Handle toggles that are conditionally rendered when voicemails are enabled\n        run.schedule('afterRender', this, function () {\n            const conditionalToggleMappings = [\n                {\n                    labelId: 'email-notifications-label',\n                    toggleSelector: '.email-notification .switch-input',\n                    innerLabelSelector: '.email-notification .toggle-switch[title]'\n                },\n                {\n                    labelId: 'pii-email-notifications-label',\n                    toggleSelector: '.email-notification-pii .switch-input',\n                    innerLabelSelector: '.email-notification-pii .toggle-switch[title]'\n                },\n                {\n                    labelId: 'transcriptions-label',\n                    toggleSelector: '.voicemail-transcription .switch-input',\n                    innerLabelSelector: '.voicemail-transcription .toggle-switch[title]'\n                }\n            ];\n\n            conditionalToggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n                const innerLabel = this.$(mapping.innerLabelSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                    // Remove any existing sr-only text to avoid duplicates\n                    innerLabel.find('.sr-only').remove();\n                    const srText = Ember.$('<span class=\"sr-only\">' + label.text() + '</span>');\n                    innerLabel.prepend(srText);\n                }\n            });\n        });\n    },\n\n    focusToggleAfterSwitch() {\n        // Focus the toggle in the newly displayed template\n        // Use a small delay to ensure the DOM has fully rendered after the conditional template switch\n        run.later(\n            this,\n            function () {\n                const callsEnabled = this.get('callsEnabled');\n                let toggleSelector;\n\n                if (callsEnabled) {\n                    // When callsEnabled is true, the group-contact-panel is shown with toggle in group-header\n                    toggleSelector = '.group-header .header-right .toggle-switch-wrapper .switch-input';\n                } else {\n                    // When callsEnabled is false, the membership-listing is shown with toggle in membership-header\n                    toggleSelector = '.membership-header .header-right .toggle-switch-wrapper .switch-input';\n                }\n\n                const toggleInput = this.$(toggleSelector);\n                if (toggleInput.length) {\n                    toggleInput.focus();\n                }\n\n                // Reset the flag\n                this.set('shouldFocusToggle', false);\n            },\n            50\n        );\n    },\n\n    closeAllModals() {\n        this.setProperties({\n            isShowingDeleteModal: false,\n            isShowingPrivacyModal: false,\n            isShowingGeneralModal: false\n        });\n    },\n\n    ensureCorrectLinksState: Ember.on('init', function () {\n        run.scheduleOnce('afterRender', this, function () {\n            this.send('setHasLinks');\n        });\n    }),\n\n    membersTabSelected: Ember.computed.equal('tabSelected', 'members'),\n\n    settingsTabSelected: Ember.computed.equal('tabSelected', 'settings'),\n\n    generalFieldConfigSection: Ember.computed('groupRingVisible', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [\n            config.get('general.name'),\n            config.get('general.groupType'),\n            config.get('general.description'),\n            config.get('general.links'),\n            config.get('membership.includeOwners'),\n            config.get('contactInfo.email')\n        ];\n\n        let fieldSection = FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: this.get('model.fieldConfig'),\n            instructionText: null,\n            fieldList: fields\n        });\n\n        // Override setting general section on non-general fields\n        fieldSection.get('includeOwners').set('section', config.get('membership'));\n        fieldSection.get('email').set('section', config.get('contactInfo'));\n\n        return fieldSection;\n    }),\n\n    privacyFieldConfigSection: Ember.computed(function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('privacy.groupVisibility'), config.get('privacy.membershipVisible')];\n\n        return FieldSection.create({\n            key: 'privacy',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    linksFieldSection: Ember.computed('model.general.links.@each.value', function () {\n        let config = this.get('model.fieldConfig');\n\n        let fields = [config.get('general.links')];\n\n        return FieldSection.create({\n            key: 'general',\n            state: 'active',\n            fieldConfig: config,\n            instructionText: null,\n            fieldList: fields\n        });\n    }),\n\n    callsEnabled: Ember.computed('model.contactInfo.allowCallConfiguration.firstObject.value', 'phoneEnabled', {\n        get() {\n            return this.get('phoneEnabled') && this.get('model.contactInfo.allowCallConfiguration.firstObject.value');\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    phoneNumber: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        return this.get('model.contactInfo.groupNumber.firstObject');\n    }),\n\n    dialableNumber: Ember.computed('phoneNumber', function () {\n        return this.get('addressformat').format(this.get('phoneNumber'));\n    }),\n\n    phoneRef: Ember.computed('model.contactInfo.groupNumber.@each.value', function () {\n        var number = this.get('model.contactInfo.groupNumber.firstObject.rel.e164');\n        return `tel:#${number}`;\n    }),\n\n    name: Ember.computed('model.general.name.@each.value', function () {\n        return this.get('model').getFieldValue('general.name');\n    }),\n\n    description: Ember.computed('model.general.description.@each.value', function () {\n        return this.get('model').getFieldValue('general.description');\n    }),\n\n    groupType: Ember.computed('model.general.groupType.@each.value', function () {\n        return this.get('model').getFieldValue('general.groupType');\n    }),\n\n    groupVisibility: Ember.computed('model.privacy.groupVisibility.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.groupVisibility');\n    }),\n\n    membershipVisible: Ember.computed('model.privacy.membershipVisible.@each.value', function () {\n        return this.get('model').getFieldValue('privacy.membershipVisible');\n    }),\n\n    includeOwners: Ember.computed('model.membership.includeOwners.@each.value', function () {\n        return this.get('model').getFieldValue('membership.includeOwners');\n    }),\n\n    email: Ember.computed('model.contactInfo.email.@each.value', function () {\n        return this.get('model').getFieldValue('contactInfo.email');\n    }),\n\n    groupTypeIcon: Ember.computed('model.general.groupType', function () {\n        let groupType = this.get('model').getFieldValue('general.groupType').value;\n        let icon = 'pc pc-official-group';\n\n        if (groupType === 'groups.social') {\n            icon = 'pc pc-social-group';\n        }\n\n        return icon;\n    }),\n\n    groupOwners: Ember.computed('model.owners.owners.[]', function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let promise = RSVP.resolve([]);\n\n        if (owners) {\n            promise = this.store.findMany('person', owners.mapBy('guid'), BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    membershipHeader: Ember.computed('model.memberCount', function () {\n        const count = this.get('model.memberCount');\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    groupRolesHeader: Ember.computed('model.uniqueRoleCount', function () {\n        const count = this.get('model.uniqueRoleCount');\n        return this.get('intl').lookup('groups.roles.rolesWithCount', { count }).toString();\n    }),\n\n    sections: Ember.computed('fieldSections', function () {\n        return this.get('fieldSections');\n    }),\n\n    canEditLeftRailInfo: Ember.computed.alias('canEditInformation'),\n    canEditProfilePicture: Ember.computed.alias('canEditInformation'),\n    canEditInformation: Ember.computed(\n        'model.owners.owners.[]',\n        'session.person',\n        'session.person.isAdmin',\n        'permissions.canEditGroups',\n        function () {\n            let namedPermissions = this.get('session.namedPermissions') || [];\n            let isOwner = this.get('model').isPersonOwner(this.get('session.person'));\n            let canEditGroups = this.get('permissions.canEditGroups');\n\n            return (\n                isOwner ||\n                canEditGroups ||\n                this.get('session.person.isAdmin') ||\n                _.includes(namedPermissions, 'group_administration')\n            );\n        }\n    ),\n\n    canEditGroupTelephonySettings: Ember.computed.readOnly('permissions.canEditGroupTelephonySettings', function () {\n        return this.get('permissions.canEditGroupTelephonySettings');\n    }),\n    disableToggleCalls: Ember.computed.not('canEditGroupTelephonySettings'),\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        const hasRolesView = this.get('session').hasPermissionAndDivision('authorization:role:view');\n        const hasGrantsEdit = this.get('session').hasPermissionAndDivision('authorization:grant:add');\n        return hasRolesView.hasPermission && hasGrantsEdit.hasPermission;\n    }),\n\n    canDeleteGroup: Ember.computed.reads('permissions.canDeleteGroup'),\n\n    updateLinksChange: Ember.observer('model.general.links.@each.value', function () {\n        this.send('setHasLinks');\n    }),\n\n    setHasInformals: Ember.observer('model.images.gallery', 'model.images.gallery.length', function () {\n        let informals = this.get('model.images.gallery');\n        if (informals && informals !== undefined) {\n            this.set('hasInformals', informals.length > 0);\n        } else {\n            this.set('hasInformals', false);\n        }\n    }),\n\n    checkMembers: Ember.observer('model.membership', function () {\n        let exclusions = this.get('model.membership.exclusions') !== undefined;\n        let inclusions = this.get('model.membership.inclusions') !== undefined;\n        let canEdit = this.get('canEditMembership.labelKey') === 'owners' || this.get('session.person.isAdmin');\n\n        let value = exclusions || inclusions || canEdit;\n        this.set('showMembers', value);\n    }),\n\n    canEditMembership: Ember.computed(function () {\n        let owners = this.get('model').getFieldValue('owners.owners');\n        let isOwner = _.find(owners, owner => owner.value === this.get('session.person.id'));\n\n        return isOwner || this.get('session.person.isAdmin');\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    saveCallsEnabledState() {\n        const model = this.get('model');\n        const callsEnabled = this.get('callsEnabled');\n        if (!callsEnabled) {\n            model.set('contactInfo.groupNumber', [], { overwrite: true });\n        }\n        model.set('contactInfo.allowCallConfiguration', callsEnabled);\n        return model\n            .save()\n            .then(() => {\n                model.get('policy').then(policy => {\n                    if (!this.get('callsEnabled')) {\n                        this.get('store').unloadRecord(policy);\n                        this.get('store')\n                            .findRecord('group-policy', model.get('guid'))\n                            .then(policy => {\n                                this.set('policy', policy);\n                            });\n                    }\n                });\n            })\n            .catch(() => {\n                this.toggleProperty('callsEnabled');\n                const title = this.get('model.name');\n                const message = this.get('intl').lookup('groups.groupRing.enableCallsError');\n                this.get('notification').error(title, message, {\n                    forceBrowserNotification: true\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    },\n\n    handleJob(job) {\n        if (job) {\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 2000);\n        }\n    },\n\n    getJobData(job) {\n        return this.get('ajax')\n            .request(jobEndpoint(job.jobId))\n            .then(data => {\n                data = data.res;\n\n                let retryJobId = data.retryJobId;\n\n                if (data.status !== 'in-progress' && data.status !== 'pending') {\n                    window.clearInterval(job.interval);\n\n                    if (data.status === 'retry') {\n                        job.jobId = retryJobId;\n                        this.handleJob(job);\n                    } else if (job.status !== 'failed') {\n                        this.get('model').reload();\n                    }\n                }\n            })\n            .catch(() => {\n                window.clearInterval(job.interval);\n\n                this.get('model').reload();\n            });\n    },\n\n    commitRevertHandler(data) {\n        let model = this.get('model');\n        model.set('version', data.res.version);\n\n        // Ember-Data is doing something weird and not marking as saved, so we do this manually\n        model.save().then(function (group) {\n            group.adapterDidCommit();\n        });\n    }\n});\nexport default GroupProfileComponent;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-acd-expressions'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    notification: inject.service('notification-proxy'),\n\n    group: null,\n    showSaveModal: false,\n    showCancelModal: false,\n    loading: false,\n    previewValue: null,\n\n    expressionDisplay: computed('group.expression.@each.{display,opAnd}', function () {\n        const conditions = this.get('group.expression');\n        let display = '';\n        let valid = true;\n\n        if (!conditions || conditions.length === 0) {\n            return this.get('intl').t('groups.expressions.empty');\n        }\n\n        conditions.forEach(con => {\n            if (con.display === null || con.display === undefined) {\n                valid = false;\n                return;\n            }\n\n            display += con.display;\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    //last rule\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n        });\n\n        const empty = display.replace(/[()]/g, '').trim().length === 0;\n        if (empty) {\n            display = this.get('intl').t('groups.expressions.empty');\n        } else if (!valid) {\n            display = this.get('intl').t('groups.expressions.invalid');\n        }\n\n        return display;\n    }),\n\n    saveDisabled: computed('group.expression.@each.display', 'loading', function () {\n        const invalid = this.get('group.expression').filterBy('display', null).length > 0;\n        const loading = this.get('loading');\n        return invalid && !loading;\n    }),\n\n    maximumExpressions: computed('group.expression.length', 'group.expression.@each.length', function () {\n        //we have a limit of 3 skills total\n        const skills = this.get('group.expression').mapBy('rules');\n        return _.flatten(skills).length >= 3;\n    }),\n\n    numberPreview: computed('previewValue', function () {\n        return isNaN(this.get('previewValue')) ? this.get('intl').t('purecloud.unknown') : this.get('previewValue');\n    }),\n\n    actions: {\n        selectTab(tab) {\n            this.selectTab(tab);\n        },\n        addCondition() {\n            if (!this.get('maximumExpressions')) {\n                if (this.get('group.expression') && this.get('group.expression').length > 0) {\n                    let exp = this.get('group.expression');\n                    exp.forEach(condition => {\n                        Ember.set(condition, 'lastCondition', false);\n                        if (condition.operation === null) {\n                            Ember.set(condition, 'operation', 'AND');\n                            Ember.set(condition, 'opAnd', true);\n                        }\n                    });\n                    exp.pushObject({\n                        lastCondition: true,\n                        operation: 'OR',\n                        opAnd: false,\n                        display: null,\n                        rules: [\n                            {\n                                skill: null,\n                                comparator: null,\n                                proficiency: null,\n                                operation: 'OR',\n                                lastRule: true,\n                                opAnd: false\n                            }\n                        ]\n                    });\n                    Ember.set(exp, 'lastObject.lastCondition', true);\n                } else {\n                    this.set('group.expression', [\n                        {\n                            lastCondition: true,\n                            operation: 'OR',\n                            opAnd: false,\n                            display: null,\n                            rules: [\n                                {\n                                    skill: null,\n                                    comparator: null,\n                                    proficiency: null,\n                                    operation: 'OR',\n                                    lastRule: true,\n                                    opAnd: false\n                                }\n                            ]\n                        }\n                    ]);\n                }\n            } else {\n                this.get('notification').error(\n                    this.get('intl').t('groups.expressions.maxConditionsTitle'),\n                    this.get('intl').t('groups.expressions.maxConditionsMessage')\n                );\n            }\n        },\n        removeCondition(index) {\n            let exp = this.get('group.expression');\n\n            if (exp.length === 1) {\n                this.set('group.expression', []);\n            } else {\n                Ember.A(exp).removeAt(index);\n                exp.forEach(condition => {\n                    Ember.set(condition, 'lastCondition', false);\n                });\n                exp.set('lastObject.lastCondition', true);\n                exp.set('lastObject.operation', 'OR');\n                exp.set('lastObject.opAnd', false);\n                this.set('group.expression', exp);\n            }\n        },\n        conditionOperation(condition, op) {\n            Ember.set(condition, 'operation', op);\n            Ember.set(condition, 'opAnd', op == 'AND');\n        },\n        save() {\n            // use new endpoints to save our changed inclusions\n            this.set('loading', true);\n            let saveData = this.prepareExpression(this.get('group.expression'));\n            let success = true;\n            const payload = {\n                data: {\n                    skillConditions: saveData\n                }\n            };\n            const groupId = this.get('group.guid');\n            const path = `api/v2/groups/${groupId}/dynamicsettings`;\n            const url = this.get('application').pcV2Uri(path);\n\n            this.get('ajax')\n                .put(url, payload)\n                .then(() => {\n                    this.get('group').reload();\n                })\n                .catch(error => {\n                    success = false;\n                    this.get('notification').error(\n                        this.get('intl').t('groups.expressions.saveErrorTitle'),\n                        this.get('intl').t('groups.expressions.saveErrorMessage')\n                    );\n                    this.get('logger').error('Error trying to save dynamic expression to group', {\n                        error\n                    });\n                    this.set('loading', false);\n                })\n                .finally(() => {\n                    if (success) {\n                        this.set('group.lastSavedExpression', saveData);\n\n                        // use the preview endpoint to show the new expected number of group members\n                        this.get('notification').info(\n                            this.get('intl').t('groups.expressions.saveTitle'),\n                            this.get('intl').t('groups.expressions.saveMessage')\n                        );\n                        const previewPath = `api/v2/groups/dynamicsettings/preview`;\n                        const previewUrl = this.get('application').pcV2Uri(previewPath);\n                        this.get('ajax')\n                            .post(previewUrl, payload)\n                            .then(preview => {\n                                this.set('previewValue', preview.userCount);\n                            })\n                            .catch(e => {\n                                this.get('logger').error('Error trying to get preview for dynamic group', {\n                                    e\n                                });\n                            })\n                            .finally(() => {\n                                this.set('loading', false);\n                                this.set('showSaveModal', true);\n                            });\n                    }\n                });\n        },\n        openCancelModal() {\n            this.set('showCancelModal', true);\n        },\n        closeCancelModal() {\n            this.set('showCancelModal', false);\n        },\n        cancel() {\n            this.set('showCancelModal', false);\n            const group = this.get('group');\n            group.reload();\n\n            if (this.get('group.lastSavedExpression')) {\n                group.set('expression', group.parseExpression(group.get('lastSavedExpression')));\n            } else {\n                group.set('expression', group.parseExpression(group.get('_expression.content.skillConditions')));\n            }\n            this.selectTab('members');\n        },\n        closeSaveModal() {\n            this.set('previewValue', null);\n            this.set('showSaveModal', false);\n            this.selectTab('members');\n        }\n    },\n\n    prepareExpression(input) {\n        let output = [];\n        input.forEach(con => {\n            let save = {\n                routingSkillConditions: [],\n                languageSkillConditions: []\n            };\n\n            let parent = null;\n            con.rules.forEach((rule, index) => {\n                const skillPropName =\n                    rule.skill.type == 'routing' ? 'routingSkillConditions' : 'languageSkillConditions';\n                const ruleType = rule.skill.type == 'routing' ? 'routingSkill' : 'languageSkill';\n\n                if (index === 0) {\n                    // we're making this rule the current parent skill\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent = newObj;\n                    save[skillPropName].pushObject(newObj);\n                    save.operation = con.operation;\n                    if (input.length === 1) {\n                        save.operation = rule.operation;\n                    }\n                } else {\n                    // we're adding this skill as a childCondition\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: {\n                            operation: rule.operation,\n                            routingSkillConditions: [],\n                            languageSkillConditions: []\n                        }\n                    };\n                    newObj[ruleType] = rule.skill.name;\n\n                    parent.childConditions[skillPropName].pushObject(newObj);\n                    parent = newObj;\n                }\n            });\n\n            output.pushObject(save);\n        });\n\n        return output;\n    }\n});\n","import Ember from 'ember';\n\nconst { observer, Component, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['condition-display'],\n\n    intl: inject.service(),\n\n    comparators: null,\n    values: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('values', [\n            { name: '0', value: 0 },\n            { name: '1', value: 1 },\n            { name: '2', value: 2 },\n            { name: '3', value: 3 },\n            { name: '4', value: 4 },\n            { name: '5', value: 5 }\n        ]);\n\n        this.set('comparators', [\n            {\n                label: 'equals (==)',\n                value: 'EqualTo',\n                class: 'equalto',\n                op: '=='\n            },\n            {\n                label: 'not equals (!=)',\n                value: 'NotEqualTo',\n                class: 'notequalto',\n                op: '!='\n            },\n            {\n                label: 'greater than (>)',\n                value: 'GreaterThan',\n                class: 'greaterthan',\n                op: '>'\n            },\n            {\n                label: 'greater than or equal to (>=)',\n                value: 'GreaterThanOrEqualTo',\n                class: 'greaterthanorequalto',\n                op: '>='\n            },\n            {\n                label: 'less than (<)',\n                value: 'LessThan',\n                class: 'lessthan',\n                op: '<'\n            },\n            {\n                label: 'less than or equal to (<=)',\n                value: 'LessThanOrEqualTo',\n                class: 'lessthanorequalto',\n                op: '<='\n            }\n        ]);\n\n        this.get('condition.rules').forEach(rule => {\n            // check to see if we're starting fresh\n            if (rule.comparator === null) return;\n\n            // set comparators to proper objects\n            const compPlace = this.get('comparators').mapBy('op').indexOf(rule.comparator.op);\n            if (compPlace >= 0) {\n                Ember.set(rule, 'comparator', this.get('comparators')[compPlace]);\n            } else {\n                Ember.set(rule, 'comparator', null);\n            }\n\n            if (!isNaN(rule.proficiency.value)) {\n                Ember.set(rule, 'proficiency', this.get('values')[rule.proficiency.value]);\n            }\n        });\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.set('condition.display', this.display());\n        });\n    },\n\n    updateConditionDisplay: observer(\n        'condition',\n        'condition.rules.@each.{skill,comparator,proficiency,opAnd,lastRule}',\n        function () {\n            this.set('condition.display', this.display());\n            this.set('condition.length', this.get('condition.rules').length);\n        }\n    ),\n\n    actions: {\n        addRule() {\n            let rules = this.get('condition').rules;\n            rules.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            rules.set('lastObject.operation', 'OR');\n            rules.set('lastObject.opAnd', false);\n            rules.pushObject({\n                skill: null,\n                comparator: null,\n                proficiency: null,\n                operation: 'OR',\n                lastRule: true,\n                opAnd: false\n            });\n        },\n        removeRule(index) {\n            let con = this.get('condition').rules;\n            Ember.A(con).removeAt(index);\n            con.forEach(rule => {\n                Ember.set(rule, 'lastRule', false);\n            });\n            con.set('lastObject.lastRule', true);\n            con.set('lastObject.operation', 'OR');\n            con.set('lastObject.opAnd', false);\n            this.set('condition.rules', con);\n        },\n        ruleOperation(rule, op) {\n            Ember.set(rule, 'operation', op);\n            Ember.set(rule, 'opAnd', op == 'AND');\n        },\n        skillChanged(rule, skill, value) {\n            if (value) {\n                Ember.set(rule, skill, value);\n            }\n        }\n    },\n\n    /**\n     * This is the same function found in `/components/skillgroup-profile/dynamic-rules/condition-display` component.\n     * TODO: Remove these functions from component level and make reusable util.\n     */\n    display() {\n        const rules = this.get('condition.rules');\n        let display = '(';\n        let valid = true;\n        let orWrap = false;\n\n        for (const rule of rules) {\n            // if a rule is not valid then break the rest of the for-loop and set the valid to `false`\n            if (!rule.skill || !rule.comparator || !rule.proficiency) {\n                valid = false;\n                return;\n            }\n\n            display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n            if (rule.lastRule) {\n                display += ')';\n            } else if (!rule.opAnd) {\n                display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                orWrap = true;\n            } else {\n                display += ` ${this.get('intl').t('groups.expressions.and')} `;\n            }\n        }\n\n        if (orWrap) {\n            display = `(${display})`;\n        }\n\n        return valid ? display : null;\n    }\n});\n","import Ember from 'ember';\nconst { computed, Component, inject } = Ember;\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['skill-search'],\n\n    application: inject.service(),\n    ajax: inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    skillResults: null,\n    languageResults: null,\n    showSearchResults: false,\n    searchvalue: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('skillResults', []);\n        this.set('languageResults', []);\n    },\n\n    results: computed('skillResults', 'languageResults', function () {\n        return this.get('skillResults').concat(this.get('languageResults'));\n    }),\n\n    placeHolder: computed('skill', function () {\n        return this.get('skill') ? this.get('skill.name') : this.get('intl').t('groups.expressions.defaultSkill');\n    }),\n\n    skillSelected: computed('skill', function () {\n        return !!this.get('skill');\n    }),\n\n    actions: {\n        select(result) {\n            this.set('skill', result);\n            this.reset();\n        },\n        clearSearch() {\n            this.reset();\n        },\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange(event.target.value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.skill-search').length) {\n                    this.reset();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    reset() {\n        this.set('showSearchResults', false);\n        this.set('searchValue', null);\n        this.set('languageResults', []);\n        this.set('skillResults', []);\n    },\n\n    updateSearchOnChange(query) {\n        if (!_.isEmpty(query)) {\n            Ember.run.debounce(this, this.runSearch, query.toLowerCase(), 250);\n        } else {\n            this.reset();\n        }\n    },\n\n    runSearch(query) {\n        this.set('showSearchResults', true);\n        this.languageSearch(query);\n        this.skillSearch(query);\n    },\n\n    skillSearch(query) {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/skills`);\n        this.get('ajax')\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let skills = res.entities;\n                skills.forEach(skl => {\n                    skl.type = 'routing';\n                    skl.class = skl.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('skillResults', skills);\n            })\n            .catch(error => {\n                // uhhhh\n                this.get('logger').error('Error trying to fetch routing skills', {\n                    error\n                });\n                this.set('skillResults', []);\n            });\n    },\n\n    languageSearch(query) {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/languages`);\n        this.get('ajax')\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let langs = res.entities;\n                langs.forEach(lang => {\n                    lang.type = 'language';\n                    lang.class = lang.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('languageResults', langs);\n            })\n            .catch(error => {\n                // uhhhh\n                this.get('logger').error('Error trying to fetch routing languages', {\n                    error\n                });\n                this.set('languageResults', []);\n            });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"wU85NT0e\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.searchSkill\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-skills-search\\\"]]],[16,\\\"class\\\",[34,[\\\"form-control purecloud-input \\\",[33,[\\\"if\\\"],[[28,[\\\"skillSelected\\\"]],\\\"selected\\\"],null]]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeHolder\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[\\\"clearfix \\\",[28,[\\\"result\\\",\\\"class\\\"]],\\\" \\\",[28,[\\\"result\\\",\\\"type\\\"]]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/skill-search/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"pAm/MlNF\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"condition\\\",\\\"rules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"rule\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display/skill-search\\\"],null,[[\\\"skill\\\"],[[28,[\\\"rule\\\",\\\"skill\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-comparator\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"comparator\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"comparator\\\"],null],\\\"form-control comparator-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultComparator\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"comparators\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"op\\\"]],[28,[\\\"op\\\",\\\"class\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"op\\\",\\\"label\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"op\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"skill-proficiency\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"value\\\",\\\"action\\\",\\\"class\\\"],[[28,[\\\"rule\\\",\\\"proficiency\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"skillChanged\\\",[28,[\\\"rule\\\"]],\\\"proficiency\\\"],null],\\\"form-control proficiency-dropdown\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"class\\\"],[\\\"default\\\"]],{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"groups.expressions.defaultValue\\\"],null],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"values\\\"]]],null,{\\\"statements\\\":[[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\",\\\"class\\\"],[[28,[\\\"val\\\"]],[28,[\\\"val\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"val\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"val\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"lastRule\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addRule\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rule-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"rule\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"ruleOperation\\\",[28,[\\\"rule\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"unless\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"condition\\\",\\\"rules\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-rule\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeRule\\\",[28,[\\\"rIndex\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-minus\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\",\\\"rIndex\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/condition-display/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"SdJHLOQh\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dynamic-expression-builder\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title-section\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-arrow-left\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.title\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"subtitle\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.subtitle\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-preview\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-builder\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"expression\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.condition\\\"],[[\\\"index\\\",\\\"display\\\"],[[33,[\\\"add\\\"],[[28,[\\\"cIndex\\\"]],1],null],[28,[\\\"condition\\\",\\\"display\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"remove-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"removeCondition\\\",[28,[\\\"cIndex\\\"]]]],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.removeCondition\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-rules\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/dynamicRules/condition-display\\\"],null,[[\\\"condition\\\",\\\"group\\\",\\\"maximumExpressions\\\"],[[28,[\\\"condition\\\"]],[28,[\\\"group\\\"]],[28,[\\\"maximumExpressions\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-footer-line\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"footer-actions\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"lastCondition\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"maximumExpressions\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"condition-and-or \\\",[33,[\\\"if\\\"],[[28,[\\\"condition\\\",\\\"opAnd\\\"]],\\\"AND\\\",\\\"OR\\\"],null]]]],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"and-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"AND\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.and\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"or-button\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"conditionOperation\\\",[28,[\\\"condition\\\"]],\\\"OR\\\"]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.or\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"condition\\\",\\\"cIndex\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"first-condition-line\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"condition-action\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-condition\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"addCondition\\\"]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-plus\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"spacer\\\"],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Primary\\\"],[15,\\\"accent\\\",\\\"primary\\\"],[15,\\\"class\\\",\\\"save-button\\\"],[16,\\\"disabled\\\",[26,[\\\"saveDisabled\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"save\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n\\\\n        \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"gux-title\\\",\\\"Tertiary\\\"],[15,\\\"accent\\\",\\\"tertiary\\\"],[15,\\\"class\\\",\\\"cancel-button\\\"],[16,\\\"disabled\\\",[26,[\\\"loading\\\"]],null],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openCancelModal\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loading-screen\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSaveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"noCancel\\\",\\\"confirm\\\",\\\"headerText\\\"],[\\\"preview-modal\\\",true,[33,[\\\"action\\\"],[[28,[null]],\\\"closeSaveModal\\\"],null],[33,[\\\"t\\\"],[\\\"groups.expressions.previewHeader\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"preview-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.previewText\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start name-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"entityStrings.group\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"group\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-expression\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start expression-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.expression\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info preview-number\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"start number-start\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.number\\\"],null],false],[0,\\\":\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"numberPreview\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showCancelModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"extraClassNames\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"headerText\\\"],[\\\"cancel-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"closeCancelModal\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.cancelDisclaimer\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/dynamic-rules/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport request from 'ember-ajax';\n\nexport const LIST_TYPES = {\n    OWNERS: 'owners',\n    MEMBERS: 'members'\n};\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-contact-panel'],\n    classNameBindings: ['slideInList'],\n\n    //---- SERVICES ----//\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    fileUpload: Ember.inject.service('file-upload'),\n\n    group: null,\n    editing: false,\n    loading: false,\n    disableSave: false,\n    slideInList: true,\n    personSearch: false,\n    saves: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    listType: LIST_TYPES.OWNERS,\n\n    routeSelection: Ember.computed.reads('group.policy.groupAlertType'),\n\n    ringRotations: Ember.computed.reads('group.policy.stopRingingAfterRotations'),\n\n    isSequential: Ember.computed.equal('routeSelection', 'SEQUENTIAL'),\n\n    isRotary: Ember.computed.equal('routeSelection', 'ROUND_ROBIN'),\n\n    displayIndices: Ember.computed.or('isSequential', 'isRotary'),\n\n    disabled: Ember.computed.or('disableSave', 'loading'),\n\n    reasons: Ember.computed('orgVoicemailPolicy', 'group.policy', function () {\n        return {\n            org: {\n                isMissing: _.isEmpty(this.get('orgVoicemailPolicy'))\n            },\n            group: {\n                isMissing: _.isEmpty(this.get('group.policy'))\n            }\n        };\n    }).readOnly(),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        this.set('saves', []);\n        if (this.get('canEditGroupTelephonySettings')) {\n            this.loadOrgVoicemailPolicy();\n        }\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n        this.scheduleRemoveAnimation();\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        appendSave(func) {\n            this.get('saves').addObject(func);\n        },\n\n        removeSave(func) {\n            this.get('saves').removeObject(func);\n        },\n\n        disableSave(value) {\n            this.set('disableSave', value);\n        },\n\n        save() {\n            if (!this.get('loading')) {\n                this.save();\n            }\n        },\n\n        cancel() {\n            this.sendAction('toggleEditing');\n            this.set('personSearch', false);\n            this.get('group').rollbackAttributes();\n        },\n\n        changeListType(type) {\n            this.set('listType', type);\n        }\n    },\n\n    async loadOrgVoicemailPolicy() {\n        try {\n            //---- Try Loading Data ----//\n\n            const url = this.get('application').pcV2Uri(`api/v2/voicemail/policy`);\n            const data = await this.get('ajax').request(url);\n            this.set('orgVoicemailPolicy', data);\n\n            //------------//\n        } catch (err) {\n            //---- Handle Error ----//\n\n            // Log the error.\n            const errorPath = 'components/group-profile/group-contact-panel';\n            const errorMessage = \"Couldn't load organization's voicemail policy.\";\n            this.get('logger').error(`${errorPath}: ${errorMessage}`, {\n                error: err,\n                remoteData: {\n                    voicemailGroupId: this.get('group.id')\n                }\n            });\n\n            // Show the user a toast.\n            const toastTitle = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastTitle');\n            const toastMessage = this.get('intl').t('groups.groupRing.orgVoicemailPolicy.errorLoading.toastMessage');\n            this.get('notification').error(toastTitle, toastMessage);\n\n            // Clean up.\n            this.set('orgVoicemailPolicy', null);\n\n            //------------//\n        }\n    },\n\n    scheduleRemoveAnimation() {\n        Ember.run.later(\n            this,\n            () => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    if (this._state !== 'destroying' && this._state !== 'destroyed') {\n                        this.set('slideInList', false);\n                    }\n                });\n            },\n            500\n        );\n    },\n\n    save() {\n        const saveData = this.get('saves').map(save => save());\n        const greetingData = _.filter(saveData, { type: 'group-ring-settings' })[0];\n        const ringSequenceData = _.filter(saveData, { type: 'ring-sequence' })[0];\n\n        this.set('loading', true);\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.saveModelData(ringSequenceData)\n                .then(() => {\n                    if (!!this.get('group.number.rel.errorCode')) {\n                        return reject({\n                            title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                            message: this.get('intl').lookup('notification.group.groupRingError.message')\n                        });\n                    }\n\n                    this.get('group.policy').then(policy => {\n                        if (policy.get('languagePreference') === '' || !policy.get('languagePreference')) {\n                            // default the language preference\n                            policy.set('languagePreference', 'en-us');\n                        }\n                        this.savePolicy(policy, true)\n                            .then(() => {\n                                this.saveGreeting(greetingData)\n                                    .then(() => {\n                                        resolve({\n                                            title: this.get('group.name'),\n                                            message: this.get('intl').lookup('notification.group.groupRingSuccess')\n                                        });\n                                    })\n                                    .catch(err => {\n                                        Ember.Logger.error('Error saving greeting', { err });\n\n                                        reject({\n                                            title: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.title'\n                                            ),\n                                            message: this.get('intl').lookup(\n                                                'notification.group.groupRingGreetingError.message'\n                                            )\n                                        });\n                                    });\n                            })\n                            .catch(err => {\n                                Ember.Logger.error('Error saving policy', { err });\n\n                                reject({\n                                    title: this.get('intl').lookup('notification.group.groupRingError.title'),\n                                    message: this.get('intl').lookup('notification.group.groupRingError.message')\n                                });\n                            });\n                    });\n                })\n                .catch(err => {\n                    Ember.Logger.error('Error saving model data', { err });\n\n                    reject({\n                        title: this.get('group.name'),\n                        message: this.get('intl').lookup('notification.group.saveError')\n                    });\n                });\n        });\n\n        promise\n            .then(param => {\n                this.get('group').reload();\n                this.get('notification').success(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                this.sendAction('toggleEditing');\n                greetingData.callback(true);\n            })\n            .catch(param => {\n                this.get('notification').error(param.title, param.message, {\n                    icon: '',\n                    hideAfter: 8\n                });\n                greetingData.callback(false);\n                return Ember.RSVP.reject();\n            })\n            .finally(() => {\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    this.set('loading', false);\n                });\n            });\n    },\n\n    savePolicy(policy, retry = false) {\n        return policy.save().catch(err => {\n            if (err && err.errors && err.errors.length > 0) {\n                let error = err.errors[0];\n                if (retry && error.status === 400 && error.title.indexOf('Referenced key') >= 0) {\n                    return new Ember.RSVP.Promise((resolve, reject) => {\n                        Ember.run.later(() => {\n                            this.savePolicy(policy, false).then(resolve).catch(reject);\n                        }, 750);\n                    });\n                }\n            }\n            return Ember.RSVP.reject(err);\n        });\n    },\n\n    saveGreeting(greetingData) {\n        return this.get('group.greeting')\n            .then(greeting => {\n                if (!greetingData.resetGreeting) {\n                    return Ember.RSVP.resolve();\n                }\n\n                let path = greeting.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').delete(url, { dataType: 'text' });\n            })\n            .then(() => {\n                let file = greetingData.recordingFile;\n                if (!file) {\n                    file = greetingData.voicemailFile;\n                }\n\n                return this.uploadGreeting(file);\n            })\n            .then(() => {\n                this.get('group').notifyPropertyChange('greeting');\n            });\n    },\n\n    saveModelData(ringSequenceData) {\n        const number = Ember.$('.group-ring-phone-input').intlTelInput('getNumber');\n        const extension = Ember.$('.group-ring-extension-input').val();\n\n        if (_.isEmpty(this.get('group.contactInfo.groupNumber'))) {\n            if (_.isEmpty(this.get('group.contactInfo'))) {\n                this.set('group.contactInfo', {});\n            }\n\n            const valueData = {\n                number: '',\n                countryCode: '',\n                extension: '',\n                acceptsSMS: false\n            };\n\n            const emptyData = [\n                {\n                    value: valueData\n                }\n            ];\n\n            this.set('group.contactInfo.groupNumber', emptyData);\n        }\n\n        this.set('group.contactInfo.groupNumber.firstObject.value.number', number);\n        this.set('group.contactInfo.groupNumber.firstObject.value.extension', extension);\n\n        const group = this.get('group');\n\n        if (!group.get('individuals')) {\n            group.set('individuals', {});\n        }\n\n        if (!group.get('owners')) {\n            group.set('owners', {});\n        }\n\n        const { individuals, owners } = ringSequenceData;\n        return Ember.RSVP.all([individuals, owners]).then(([individuals, owners]) => {\n            group.set('owners.owners', [], { overwrite: true });\n            const orgIndividuals = group.get('individuals.individuals').map(i => {\n                return i.guid;\n            });\n            group.set('individuals.individuals', [], { overwrite: true });\n\n            const addedDelta = individuals.filter(i => !orgIndividuals.includes(i));\n            const removedDelta = orgIndividuals.filter(i => !individuals.includes(i));\n\n            individuals.forEach(id => {\n                group.set('individuals.individuals', id);\n            });\n            owners.forEach(id => {\n                group.set('owners.owners', id);\n            });\n\n            if (this.get('session.features.groupProileNoIndividualsSave')) {\n                return this.get('group')\n                    .save()\n                    .then(() => this.addIndividuals(group, addedDelta, this.get('application')))\n                    .then(() => this.deleteIndividuals(group, removedDelta, this.get('application')));\n            } else {\n                return this.get('group').save();\n            }\n        });\n    },\n\n    async uploadGreeting(file) {\n        if (!file) {\n            return Ember.RSVP.resolve({});\n        }\n\n        if (this.get('session.features.EC-760')) {\n            return await this.get('fileUpload').uploadGreetingWithPreSigned(file, this.get('group.guid'));\n        }\n\n        const uploadPath = `${this.get('application.purecloudAppsUri')}uploads/v2/greetings`;\n        const data = new FormData();\n        data.append('file', file);\n        data.append('ownerType', 'group');\n        data.append('ownerId', this.get('group.guid'));\n        data.append('name', 'voicemail');\n        data.append('greetingType', 'voicemail');\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            const xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadPath, true);\n            xhr.setRequestHeader('Authorization', `bearer ${this.get('session.accessToken')}`);\n            xhr.onreadystatechange = () => {\n                // Can't use XMLHttpRequest.DONE cause Pace, so we have to use the instance property\n                if (xhr.readyState === xhr.DONE) {\n                    this.uploadComplete(xhr, resolve, reject);\n                }\n            };\n            xhr.send(data);\n        });\n    },\n\n    uploadComplete(xhr, resolve, reject) {\n        const { responseText, status } = xhr;\n        const data = JSON.parse(responseText);\n        if (status === 200) {\n            this.get('logger').info('Successful voicemail greeting upload', data.correlationId);\n            resolve(data);\n        } else {\n            this.get('logger').error('Error uploading voicemail file:', { error: responseText });\n            reject(data);\n        }\n    },\n\n    addIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this.individualsOperation(group, individuals, application, 'delete');\n    },\n\n    individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        let url;\n        if (this.get('session.features.groupProileNoIndividualsSave')) {\n            url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n            if (method.toLowerCase() === 'post') {\n                return this.get('ajax')\n                    .post(url, {\n                        dataType: 'json',\n                        data: {\n                            memberIds: individuals,\n                            version: group.get('version')\n                        }\n                    })\n                    .then(() => {\n                        return group;\n                    });\n            } else if (method.toLowerCase() === 'delete') {\n                url = url.concat('?ids=', individuals);\n                return this.get('ajax')\n                    .delete(url)\n                    .then(() => {\n                        return group;\n                    });\n            }\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = Ember.get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport {\n    buildIntlTelInputOptions,\n    setupIntlTelInputAccessibility,\n    updateSelectedCountryAriaLabel\n} from 'connections-ui/utils/intl-tel-input-options';\n\nconst AUDIO_FORMAT = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n\nfunction isOggFileType(file) {\n    return new Ember.RSVP.Promise((resolve, reject) => {\n        const fileReader = new FileReader();\n        fileReader.onloadend = function (e) {\n            const arr = new window.Uint8Array(e.target.result);\n\n            const isOpus =\n                arr[28] === 0x4f &&\n                arr[29] === 0x70 &&\n                arr[30] === 0x75 &&\n                arr[31] === 0x73 &&\n                arr[32] === 0x48 &&\n                arr[33] === 0x65 &&\n                arr[34] === 0x61 &&\n                arr[35] === 0x64;\n            const isWav =\n                arr[0] === 0x52 &&\n                arr[1] === 0x49 &&\n                arr[2] === 0x46 &&\n                arr[3] === 0x46 &&\n                arr[8] === 0x57 &&\n                arr[9] === 0x41 &&\n                arr[10] === 0x56 &&\n                arr[11] === 0x45;\n            const isAiff =\n                arr[0] === 0x46 &&\n                arr[1] === 0x4f &&\n                arr[2] === 0x52 &&\n                arr[3] === 0x4d &&\n                arr[8] === 0x41 &&\n                arr[9] === 0x49 &&\n                arr[10] === 0x46 &&\n                arr[11] === 0x46;\n\n            // Only support opus encodings, not vorbis\n            // Support WAV and AIFF as well\n            // See: https://github.com/sindresorhus/file-type\n            if (isOpus || isWav || isAiff) {\n                resolve('opus');\n            } else {\n                reject(false);\n            }\n        };\n        fileReader.readAsArrayBuffer(file);\n    });\n}\n\nconst DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE = 'en-us';\n\nexport default Ember.Component.extend({\n    //---- EMBER: BINDINGS ----//\n\n    classNames: ['group-ring-settings'],\n\n    //---- SERVICES ----//\n\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    store: Ember.inject.service(),\n    phone: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    addressFormat: Ember.inject.service('addressformat'),\n\n    //---- CONTEXT & STATES ----//\n\n    entity: null,\n    number: null,\n    extension: null,\n    originalNumber: null,\n    originalExtension: null,\n    orgVoicemailPolicy: null,\n    canEditGroupTelephonySettings: true,\n    voicemailFile: null,\n    showVoicemailGreetingOptions: false,\n    resetGreeting: false,\n    rotateCallSecondsError: false,\n    numberOfRotationsError: false,\n    pigeonEventHandler: null,\n\n    disableReplaceOverflowBtn: Ember.computed.not('canEditGroupTelephonySettings'),\n\n    disableRingInputs: Ember.computed('editing', 'canEditGroupTelephonySettings', function () {\n        return !this.get('editing') || !this.get('canEditGroupTelephonySettings');\n    }),\n\n    hasExtension: Ember.computed.notEmpty('extension'),\n\n    hasNumber: Ember.computed.notEmpty('number'),\n\n    numberOfRotations: Ember.computed.alias('entity.policy.stopRingingAfterRotations'),\n\n    rotateCallSeconds: Ember.computed.alias('entity.policy.rotateCallsSecs'),\n\n    forwardingOn: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            return DS.PromiseObject.create({\n                promise: this.get('overflowGroup').then(overflowGroup => !!overflowGroup)\n            });\n        },\n\n        set(key, value) {\n            return DS.PromiseObject.create({ promise: Ember.RSVP.resolve(value) });\n        }\n    }),\n\n    routeSelection: Ember.computed('entity.policy.groupAlertType', {\n        get() {\n            return this.get('entity.policy.groupAlertType') !== null\n                ? this.get('entity.policy.groupAlertType')\n                : 'RANDOM';\n        },\n\n        set(key, value) {\n            return this.set('entity.policy.groupAlertType', value);\n        }\n    }),\n\n    overflowGroup: Ember.computed('entity.policy.overflowGroupId', {\n        get() {\n            let promise;\n            if (!this.get('entity.policy.overflowGroupId')) {\n                promise = Ember.RSVP.resolve(null);\n            } else {\n                promise = this.get('store').findRecord('group', this.get('entity.policy.overflowGroupId'));\n            }\n            return DS.PromiseObject.create({ promise });\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    editingVoicemailDisabled: Ember.computed('isEmpty', 'isValid', 'haveExtensionError', function () {\n        return this.get('isEmpty') || !this.get('isValid') || this.get('haveExtensionError');\n    }),\n\n    ringTimeMs: Ember.computed(\n        'rotateCallSeconds',\n        'numberOfRotations',\n        'numberOfRotationsError',\n        'rotateCallSecondsError',\n        function () {\n            const seconds = parseInt(this.get('rotateCallSeconds'), 10);\n            const rotations = parseInt(this.get('numberOfRotations'), 10);\n            const { numberOfRotationsError, rotateCallSecondsError } = this.getProperties(\n                'numberOfRotationsError',\n                'rotateCallSecondsError'\n            );\n            if (numberOfRotationsError || rotateCallSecondsError) {\n                return null;\n            }\n\n            const total = seconds * rotations;\n            return total * 1000;\n        }\n    ),\n\n    isValid: Ember.computed(\n        'invalidExtension',\n        'invalidPhoneNumber',\n        'haveNumberAndExtension',\n        'number',\n        'extension',\n        'haveExtensionError',\n        'duplicateNumberError',\n        function () {\n            if (this.get('haveNumberAndExtension')) {\n                return false;\n            }\n\n            if (this.get('isEmpty')) {\n                return false;\n            }\n\n            if (!this.get('hasNumber')) {\n                return !(this.get('invalidExtension') || this.get('haveExtensionError'));\n            }\n\n            return !this.get('invalidPhoneNumber') && !this.get('duplicateNumberError');\n        }\n    ),\n\n    errorMessage: Ember.computed('isValid', function () {\n        if (!this.get('isValid')) {\n            if (this.get('isEmpty')) {\n                return this.get('intl').t('purecloud.callForwarding.missingNumberAndExtension');\n            } else if (this.get('haveNumberAndExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.numberAndExtension');\n            } else if (this.get('invalidExtension')) {\n                return this.get('intl').t('purecloud.callForwarding.invalidExtension');\n            } else if (this.get('haveExtensionError')) {\n                if (this.get('isExtensionNotInPool')) {\n                    return this.get('intl').t('groups.groupRing.extensionError');\n                }\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('duplicateNumberError')) {\n                return this.get('intl').t('groups.groupRing.inUseError');\n            } else if (this.get('invalidPhoneNumber')) {\n                return this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidNumberFormat');\n            }\n        }\n    }),\n\n    duplicateNumberError: Ember.computed('entity.number.rel.errorCode', 'number', 'originalNumber', function () {\n        let number = this.get('number');\n        let originalNumber = this.get('originalNumber');\n\n        if (originalNumber && number !== originalNumber) {\n            return false;\n        }\n\n        return this.get('entity.number.rel.errorCode') === 'DUPLICATE_VALUE';\n    }),\n\n    haveExtensionError: Ember.computed('entity.number.rel.errorCode', 'extension', 'originalExtension', function () {\n        const extension = this.get('extension');\n        const originalExtension = this.get('originalExtension');\n\n        if (originalExtension && extension !== originalExtension) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return !!code && code !== 'DUPLICATE_VALUE';\n    }),\n\n    isExtensionResourceInUse: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'RESOURCE_ALREADY_IN_USE';\n    }),\n\n    isExtensionNotInPool: Ember.computed('haveExtensionError', function () {\n        if (!this.get('haveExtensionError')) {\n            return false;\n        }\n\n        const code = this.get('entity.number.rel.errorCode');\n        return code === 'EXTENSION_MUST_BE_ASSGINED_TO_AN_EXTENSION_POOL';\n    }),\n\n    invalidExtension: Ember.computed('extension', 'haveNumberAndExtension', function () {\n        const ext = this.get('extension');\n        const regex = /^\\d+$/; // simple regex test, not meant to be expansive\n        if (!this.get('number') && !_.isEmpty(ext)) {\n            return !regex.test(ext);\n        }\n        return false;\n    }),\n\n    invalidPhoneNumber: Ember.computed('number', function () {\n        if (this.get('hasNumber')) {\n            const elem = this.$('.group-ring-phone-input');\n            if (!_.isEmpty(elem.val())) {\n                return !this.$('.group-ring-phone-input').intlTelInput('isValidNumber', false);\n            }\n        }\n        return false;\n    }),\n\n    inputErrorClass: Ember.computed('haveNumberAndExtension', 'isEmpty', 'invalidPhoneNumber', function () {\n        if (this.get('haveNumberAndExtension') || this.get('isEmpty')) {\n            return 'field-error';\n        }\n\n        if (this.get('invalidPhoneNumber')) {\n            return 'field-warning';\n        }\n\n        return '';\n    }),\n\n    isEmpty: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return _.isEmpty(number) && _.isEmpty(extension);\n    }),\n\n    haveNumberAndExtension: Ember.computed('number', 'extension', function () {\n        const number = this.get('number');\n        const extension = this.get('extension');\n        return !_.isEmpty(number) && !_.isEmpty(extension);\n    }),\n\n    callNotice: Ember.computed(function () {\n        return this.get('intl').lookup('groups.modal.groupRingNotice').toString();\n    }),\n\n    routeTypes: Ember.computed(function () {\n        return [\n            {\n                value: 'RANDOM',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.broadcast')\n            },\n            {\n                value: 'SEQUENTIAL',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.sequential')\n            },\n            {\n                value: 'ROUND_ROBIN',\n                translation: this.get('intl').t('groups.groupRing.routeTypes.rotary')\n            }\n        ];\n    }),\n\n    routeSelectionType: Ember.computed('routeSelection', function () {\n        switch (this.get('routeSelection')) {\n            case 'RANDOM':\n                return 'broadcast';\n            case 'SEQUENTIAL':\n                return 'sequential';\n            case 'ROUND_ROBIN':\n                return 'rotary';\n            default:\n                return 'broadcast';\n        }\n    }),\n\n    routeDescription: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeDescriptions.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    selectedRouteType: Ember.computed('routeSelectionType', function () {\n        return this.get('intl').t(`groups.groupRing.routeTypes.${this.get('routeSelectionType').toLowerCase()}`);\n    }),\n\n    rotateCallsDisplayText: Ember.computed('rotateCallSeconds', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.rotateCalls', { value: this.get('rotateCallSeconds') });\n    }),\n\n    stopRingingDisplayText: Ember.computed('numberOfRotations', function () {\n        return this.get('intl').t('groups.groupRing.displayOnly.stopRinging', { value: this.get('numberOfRotations') });\n    }),\n\n    searchText: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.groupSearch');\n    }),\n\n    playerOptions: Ember.computed(function () {\n        return {\n            html5: true,\n            volume: 0.5,\n            format: ['ogg']\n        };\n    }),\n\n    greetingOptions: Ember.computed(function () {\n        // greetings seem to have a low volume\n        return {\n            html5: true,\n            volume: 1.0,\n            format: [AUDIO_FORMAT]\n        };\n    }),\n\n    hasGreeting: Ember.computed('entity.greeting.content', {\n        get() {\n            const greeting = this.get('entity.greeting.content');\n            return !!greeting;\n        },\n\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    greetingAudioSource: Ember.computed('entity.greeting', function () {\n        const greeting = this.get('entity.greeting');\n        return greeting\n            .then(data => {\n                let path = data.greetings.VOICEMAIL.selfUri;\n                if (_.head(path) === '/') {\n                    path = path.substring(1);\n                }\n                path = path.concat('/media');\n                const url = this.get('application').pcV2Uri(path);\n                return this.get('ajax').request(url, {\n                    data: { formatId: AUDIO_FORMAT }\n                });\n            })\n            .then(data => {\n                return data.mediaFileUri;\n            })\n            .catch(() => {\n                this.get('logger').error('Error loading media for group:', {\n                    groupId: this.get('entity.guid')\n                });\n                this.set('hasGreeting', false);\n            });\n    }),\n\n    displaySpinner: Ember.computed('entity.greeting.isFulfilled', 'waitingOnGreeting', function () {\n        return !this.get('entity.greeting.isFulfilled') || this.get('waitingOnGreeting');\n    }),\n\n    reasons: Ember.computed(\n        'entity.policy.{enabled,sendEmailNotifications,disableEmailPii}',\n        'orgVoicemailPolicy',\n        'session.org',\n        ///\n        function () {\n            return {\n                org: {\n                    isMissing: _.isEmpty(this.get('orgVoicemailPolicy')),\n                    enablesHipaa: this.get('session.org.hasHipaaEnabled'),\n                    // disablesVoicemails: !this.get('orgVoicemailPolicy.enabled'),\n                    // ^^^ NOTE(as-of-writing): This will always be `true` but we ignore it.\n                    disablesEmailNotifications: !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications: this.get('orgVoicemailPolicy.disableEmailPii'),\n                    disablesVMTranscription: !this.get('orgVoicemailPolicy.includeEmailTranscriptions')\n                },\n                group: {\n                    isMissing: _.isEmpty(this.get('entity.policy')),\n                    disablesVoicemails: !this.get('entity.policy.enabled'),\n                    disablesEmailNotifications:\n                        !this.get('entity.policy.sendEmailNotifications') ||\n                        !this.get('orgVoicemailPolicy.sendEmailNotifications'),\n                    disablesPiiInEmailNotifications:\n                        this.get('entity.policy.disableEmailPii') || this.get('entity.policy.disableEmailPii')\n                }\n            };\n        }\n    ),\n\n    // NOTE(as-of-writing):\n    //   The property `orgVoicemailPolicy.enabled` exists, but it is unused, uneditable,\n    //   and its default value is `false`. Unless/until the org's setting affects\n    //   group policies or permissions for voicemails, we should ignore it.\n    voicemails: Ember.computed(\n        'entity.policy.enabled',\n        'reasons',\n        ///\n        function () {\n            let show;\n            // Always show it.\n            show = true;\n\n            let disable;\n            if (this.get('reasons.org.isMissing')) {\n                // Disable it if the org's policy is missing.\n                disable = true;\n            } else if (this.get('reasons.group.isMissing')) {\n                // Disable it if the group's policy is missing.\n                disable = true;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                // Disable it if the user cannot edit telephony settings\n                // Should not make it this far as the org policy will be missing\n                disable = true;\n            } else {\n                // Use the inverse of `show`.\n                disable = !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                // Default to `false` if it is disabled.\n                // only default the state to false when disabled and user has access to telephony settings\n                // if user does not have access to telephony settings, we will want to show the actual value\n                // of the voicemail toggle while it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.enabled');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionToggle: Ember.computed(\n        'entity.policy.includeEmailTranscriptions',\n        'reasons',\n        'emailNotifications.state',\n        ///\n        function () {\n            const show = this.get('emailNotifications.state');\n            let disable = false;\n            if (\n                this.get('reasons.org.enablesHipaa') ||\n                this.get('reasons.org.disablesPiiInEmailNotifications') ||\n                this.get('reasons.group.disablesPiiInEmailNotifications') ||\n                this.get('reasons.org.disablesVMTranscription') ||\n                !this.get('canEditGroupTelephonySettings')\n            ) {\n                disable = true;\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable && this.get('canEditGroupTelephonySettings')) {\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.includeEmailTranscriptions');\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionDropDown: Ember.computed(\n        'entity.policy.languagePreference',\n        'reasons',\n        'transcriptionToggle',\n        ///\n        function () {\n            const show = !this.get('transcriptionToggle.disable') && this.get('transcriptionToggle.state');\n            const disable = !this.get('canEditGroupTelephonySettings');\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (!this.get('entity.policy.languagePreference')) {\n                state = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n            } else {\n                state = this._getLanguagePreference(this.get('entity.policy'));\n            }\n            return { show, disable, state };\n        }\n    ),\n\n    transcriptionLanguages: Ember.computed(\n        'intl.languages',\n        ///\n        function () {\n            const languagesObj = this.get('intl').get('languages');\n            // Populate lanaguagesArr with languages and make the selected language the transcriptionDropDown state\n            return Object.keys(languagesObj).map(key => {\n                return {\n                    key: key,\n                    value: languagesObj[key]\n                };\n            });\n        }\n    ),\n\n    emailNotifications: Ember.computed(\n        'entity.policy.sendEmailNotifications',\n        'reasons',\n        'voicemails',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesVoicemails')) {\n                // Hide it if the group disables voicemails.\n                show = false;\n            } else if (!this.get('canEditGroupTelephonySettings')) {\n                show = false;\n            } else {\n                // Inherit `voicemails.show`.\n                show = this.get('voicemails.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.disablesEmailNotifications')) {\n                // Disable it if the org disables email notifications.\n                disable = true;\n            } else {\n                // Inherit `voicemails.disable` or use the inverse of `show`.\n                disable = this.get('voicemails.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = this.get('entity.policy.sendEmailNotifications');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    piiInEmailNotifications: Ember.computed(\n        'emailNotifications',\n        'entity.policy.disableEmailPii',\n        'reasons',\n        ///\n        function () {\n            let show;\n            if (this.get('reasons.group.disablesEmailNotifications')) {\n                // Hide it if the group disables email notifications.\n                show = false;\n            } else {\n                // Inherit `emailNotifications.show`.\n                show = this.get('emailNotifications.show');\n            }\n\n            let disable;\n            if (this.get('reasons.org.enablesHipaa')) {\n                // Disable it if the org enables HIPAA.\n                disable = true;\n            } else if (this.get('reasons.org.disablesPiiInEmailNotifications')) {\n                // Disable it if the org disables PII in email notifications.\n                disable = true;\n            } else {\n                // Inherit `emailNotifications.disable` or use the inverse of `show`.\n                disable = this.get('emailNotifications.disable') || !show;\n                // (This is probably unnecessary, but let's be cautious.)\n            }\n\n            let state;\n            if (this.get('reasons.group.isMissing')) {\n                // We cannot know its state if the group's policy is missing.\n                state = null;\n            } else if (disable) {\n                // Default to `false` if it is disabled.\n                state = false;\n            } else {\n                // Use the real value.\n                state = !this.get('entity.policy.disableEmailPii');\n            }\n\n            return { show, disable, state };\n        }\n    ),\n\n    //---- EMBER: LIFECYCLE METHODS ----//\n\n    // Initialize the component.\n    init(...args) {\n        this._super(...args);\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n        this.get('disableSave')(!this.get('isValid'));\n        this.pigeonEventHandler = this.handlePigeonEvent.bind(this);\n        this.registerToPigeonTopic();\n        this.get('pigeon').on('greetings', this, this.pigeonEventHandler);\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n\n        this.set('saveContactInfo', this.save.bind(this));\n\n        this._setupInputs();\n        this._setupToggleAriaLabels();\n    },\n\n    didUpdateAttrs(...args) {\n        this._super(...args);\n\n        this._setupInputs();\n    },\n\n    willDestroyElement(...args) {\n        this._super(...args);\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n        this.get('pigeon').off('greetings', this.pigeonEventHandler);\n    },\n\n    _getLanguagePreference(policy) {\n        let value = policy.get('languagePreference');\n        if (value === 'en_US') {\n            // backend stores it as en_US but we use en-us\n            value = DEFAULT_TRANSCIPTION_DROPDOWN_LANGUAGE;\n        }\n        return value;\n    },\n\n    // `_setupInputs` is a helper method used exclusively in the lifecycle methods.\n    _setupInputs() {\n        const previousEntity = this.get('_entity');\n        const entity = this.get('entity');\n\n        if (entity !== previousEntity) {\n            Ember.run.scheduleOnce('afterRender', this, this.setupInput);\n            Ember.run.scheduleOnce('afterRender', this, this.initNumber);\n\n            this.set('_entity', entity);\n        }\n    },\n\n    // Set aria-labelledby attributes on toggle switches after DOM is rendered\n    _setupToggleAriaLabels() {\n        Ember.run.once(this, () => {\n            // Map of label IDs to their corresponding toggle switch selectors\n            const toggleMappings = [\n                {\n                    labelId: 'forward-call-label',\n                    toggleSelector: '.backup-container .switch-input'\n                },\n                {\n                    labelId: 'voicemails-label',\n                    toggleSelector: '.group-voicemail .switch-input'\n                },\n                {\n                    labelId: 'email-notifications-label',\n                    toggleSelector: '.email-notification .switch-input'\n                },\n                {\n                    labelId: 'pii-email-notifications-label',\n                    toggleSelector: '.email-notification-pii .switch-input'\n                },\n                {\n                    labelId: 'transcriptions-label',\n                    toggleSelector: '.voicemail-transcription .switch-input'\n                }\n            ];\n\n            toggleMappings.forEach(mapping => {\n                const label = this.$(`#${mapping.labelId}`);\n                const toggle = this.$(mapping.toggleSelector);\n\n                if (label.length && toggle.length) {\n                    toggle.attr('aria-labelledby', mapping.labelId);\n                }\n            });\n        });\n    },\n\n    //---- ACTIONS & OBSERVERS & METHODS ----//\n\n    actions: {\n        updateNumber(event) {\n            this.set('number', event.target.value);\n        },\n\n        updateExtension(event) {\n            this.set('extension', event.target.value);\n        },\n\n        updateRotateCalls(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('rotateCallSeconds', number);\n            }\n        },\n\n        updateRotations(value) {\n            const number = parseInt(value, 10);\n            if (typeof number === 'number') {\n                this.set('numberOfRotations', number);\n                if (this.attrs.rotationsChanged) {\n                    this.attrs.rotationsChanged(number);\n                }\n            }\n        },\n\n        toggleCallForwarding() {\n            this.set('forwardingOn', !this.get('forwardingOn.content'));\n            if (!this.get('forwardingOn.content')) {\n                this.set('overflowGroup', null);\n            }\n        },\n\n        selectOverflowGroup(group) {\n            this.set('overflowGroup', group);\n        },\n\n        replaceOverflowGroup() {\n            this.set('overflowGroup', null);\n        },\n\n        toggleVoicemails() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.enabled');\n        },\n\n        toggleEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.sendEmailNotifications');\n        },\n\n        togglePiiInEmailNotifications() {\n            // Directly toggle the state in the group's policy.\n            return this.toggleProperty('entity.policy.disableEmailPii');\n        },\n\n        toggleTranscriptions() {\n            return this.toggleProperty('entity.policy.includeEmailTranscriptions');\n        },\n\n        selectVoicemailFile(file, recording) {\n            if (recording) {\n                this.set('recordingFile', file);\n                this.set('voicemailFile', null);\n            } else {\n                this.set('voicemailFile', file);\n                this.set('recordingFile', null);\n            }\n        },\n\n        selectTranscriptionLanguage(event) {\n            this.set('entity.policy.languagePreference', event.target.value);\n        },\n\n        triggerUpload() {\n            if (this.get('hasGreeting')) {\n                return;\n            }\n\n            this.$('input.file-upload').trigger('click');\n        },\n\n        chooseFile() {\n            const input = this.$('input.file-upload');\n            const file = Ember.get(input[0], 'files.0') || [];\n\n            if (file) {\n                isOggFileType(file)\n                    .then(format => {\n                        Ember.Logger.info('Voicemail: Correct file type', format);\n                        this.send('selectVoicemailFile', file, false);\n                    })\n                    .catch(() => {\n                        const title = this.get('intl').lookup('notification.group.fileUpload.title');\n                        const message = this.get('intl').lookup('notification.group.fileUpload.message');\n                        this.get('notification').error(title, message);\n                    });\n            } else {\n                this.set('errorSelectingFile', true);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        recordingReady(file) {\n            this.send('selectVoicemailFile', file, true);\n\n            this.set('resetGreeting', false);\n        },\n\n        resetRecording() {\n            this.set('recordingFile', null);\n        },\n\n        resetFile() {\n            this.set('voicemailFile', null);\n        },\n\n        resetCurrentGreeting() {\n            if (!this.get('hasGreeting')) {\n                this.send('resetFile');\n                this.send('resetRecording');\n            } else {\n                this.set('resetGreeting', true);\n                this.set('hasGreeting', false);\n            }\n\n            this.set('showVoicemailGreetingOptions', false);\n        },\n\n        audioPlayerError() {\n            this.set('hasGreeting', false);\n        },\n\n        disableSave(key, value) {\n            this.set(key, value);\n            this.get('disableSave')(value);\n        }\n    },\n\n    setConfirmDisabled: Ember.observer('isValid', function () {\n        if (!this.get('isValid')) {\n            let badNumber = this.get('invalidPhoneNumber') || this.get('duplicateNumberError');\n            let badExtension =\n                this.get('invalidExtension') || this.get('haveExtensionError') || this.get('haveNumberAndExtension');\n            let isEmpty = this.get('isEmpty');\n            if (badExtension || isEmpty) {\n                this.get('disableSave')(true);\n            } else if (badNumber) {\n                // Don't disable save if the only issue is a bad number\n                this.get('disableSave')(false);\n            } else {\n                // Fall through to disable save\n                this.get('disableSave')(true);\n            }\n        } else {\n            this.get('disableSave')(false);\n        }\n    }),\n\n    editingObserver: Ember.observer('editing', function () {\n        if (!this.get('editing')) {\n            this.set('voicemailFile', null);\n            this.set('recordingFile', null);\n            this.notifyPropertyChange('overflowGroup');\n            this.notifyPropertyChange('forwardingOn');\n            this.initNumber();\n        }\n    }),\n\n    registerToPigeonTopic() {\n        const groupId = this.get('entity.guid');\n        const groupTopic = `v2.groups.${groupId}.greetings`;\n        this.get('pigeon').registerPriorityTopic(groupTopic);\n    },\n\n    handlePigeonEvent() {\n        this.get('entity').notifyPropertyChange('greeting');\n        this.set('waitingOnGreeting', false);\n    },\n\n    setupInput() {\n        const $input = this.$('.group-ring-phone-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n        $input.intlTelInput(buildIntlTelInputOptions(this.get('intl'), this.get('application')));\n        setupIntlTelInputAccessibility($input, this.get('intl'), fieldName);\n    },\n\n    initNumber() {\n        const info = this.get('entity.contactInfo.groupNumber.firstObject.value');\n        const inputElem = this.$('.group-ring-phone-input');\n        const extElem = this.$('.group-ring-extension-input');\n        const fieldName = this.get('intl').lookup('groups.modal.groupRing').toString();\n\n        const number = info && info.number ? info.number : '';\n        const extension = info && info.extension ? info.extension : '';\n\n        inputElem.intlTelInput('setNumber', number);\n        extElem.val(extension);\n        updateSelectedCountryAriaLabel(inputElem, this.get('intl'), fieldName);\n\n        this.set('number', number);\n        this.set('extension', extension);\n\n        this.set('originalNumber', number);\n        this.set('originalExtension', extension);\n    },\n\n    save() {\n        const overflowGroupId = this.get('overflowGroup') === null ? null : this.get('overflowGroup.guid');\n        this.set('entity.policy.overflowGroupId', overflowGroupId);\n\n        this.set('originalExtension', this.get('extension'));\n        if (this.get('voicemailFile') || this.get('recordingFile')) {\n            this.set('waitingOnGreeting', true);\n        }\n\n        if (overflowGroupId === null) {\n            this.set('forwardingOn', false);\n        }\n\n        return {\n            type: 'group-ring-settings',\n            isExtensionResourceInUse: this.get('isExtensionResourceInUse'),\n            isExtensionNotInPool: this.get('isExtensionNotInPool'),\n            recordingFile: this.get('recordingFile'),\n            voicemailFile: this.get('voicemailFile'),\n            resetGreeting: this.get('resetGreeting'),\n            isEmpty: this.get('isEmpty'),\n            callback: this.finishedSaving.bind(this)\n        };\n    },\n\n    finishedSaving(succeeded) {\n        if (succeeded) {\n            this.set('resetGreeting', false);\n        } else {\n            this.set('waitingOnGreeting', false);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport Component from 'ember-component';\nimport computed from 'ember-computed';\n\nconst { run } = Ember;\n\nexport default Component.extend({\n    classNames: ['inline-number-input'],\n    classNameBindings: ['disabled:input-disabled'],\n\n    attrs: {\n        update: () => {}\n    },\n\n    value: null,\n    disabled: false,\n\n    isValid: computed('value', function () {\n        const regex = /^[0-9]+$/g;\n        const value = this.get('value');\n        const number = parseInt(value, 10);\n\n        if (_.isEmpty(value)) {\n            return false;\n        }\n\n        return regex.test(value) && number > 0 && number < 100;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, () => this.$('input').val(this.get('value')));\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setAriaLabel);\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        const input = this.$('input');\n        if (input) {\n            input.off();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', this, this.attachListeners);\n        run.scheduleOnce('afterRender', this, this.disableInput);\n        run.scheduleOnce('afterRender', this, this.setValue);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('input').off();\n    },\n\n    disableInput() {\n        const disabled = this.get('disabled');\n        this.$('input').attr('disabled', disabled);\n        this.set('disabled', disabled);\n    },\n\n    attachListeners() {\n        const input = this.$('input');\n\n        if (this.get('focused')) {\n            input.focus().val(input.val());\n        }\n\n        input.on('input', event => {\n            Ember.run(() => {\n                const value = event.target.value;\n                this.set('value', value);\n\n                this.attrs.disableSave(!this.get('isValid'));\n                this.attrs.update(value);\n            });\n        });\n\n        input.on('focus', () => {\n            Ember.run(() => this.set('focused', true));\n        });\n\n        input.on('blur', () => {\n            Ember.run(() => this.set('focused', false));\n        });\n    },\n\n    setValue() {\n        const input = this.$('input');\n        const value = this.get('value');\n        if (input && value) {\n            input.val(value);\n        }\n    },\n\n    setAriaLabel() {\n        const input = this.$('input');\n\n        if (input && input.length) {\n            // Find the closest parent with contact-info-group class for better context\n            const contactInfoGroup = input.closest('.contact-info-group');\n\n            if (contactInfoGroup && contactInfoGroup.length) {\n                // If contact-info-group doesn't have an ID, create one\n                let groupId = contactInfoGroup.attr('id');\n                if (!groupId) {\n                    groupId = `${this.get('elementId')}-contact-group`;\n                    contactInfoGroup.attr('id', groupId);\n                }\n                input.attr('aria-labelledby', groupId);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"MFx2gQuC\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"t\\\"],[[28,[\\\"key\\\"]]],null],true]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/inline-number-input/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"RL11fJHe\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"group-number contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"isValid\\\"]],\\\"valid\\\",\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label group-phone-label\\\"],[15,\\\"for\\\",\\\"group-number\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.modal.groupRing\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"number phone-field \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasNumber\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"tel\\\"],[15,\\\"id\\\",\\\"group-number\\\"],[16,\\\"class\\\",[34,[\\\"group-ring-phone-input form-control \\\",[26,[\\\"inputErrorClass\\\"]]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateNumber\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"extension \\\",[33,[\\\"if\\\"],[[33,[\\\"and\\\"],[[33,[\\\"not\\\"],[[28,[\\\"hasExtension\\\"]]],null],[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null]],null],\\\"hide-field\\\"],null]]]],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"input\\\",[]],[16,\\\"class\\\",[34,[\\\"group-ring-extension-input form-control\\\\n                        \\\",[33,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"invalidExtension\\\"]],[28,[\\\"haveNumberAndExtension\\\"]],[28,[\\\"isEmpty\\\"]]],null],\\\"field-error\\\"],null]]]],[16,\\\"disabled\\\",[26,[\\\"disableRingInputs\\\"]],null],[16,\\\"placeholder\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[15,\\\"maxLength\\\",\\\"9\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.extension\\\"],null],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateExtension\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isValid\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"error-message \\\",[26,[\\\"inputErrorClass\\\"]]]]],[13],[1,[26,[\\\"errorMessage\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-type contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label\\\"],[15,\\\"for\\\",\\\"route-select\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.routeType\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"group-route-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"selectedRouteType\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\",\\\"disabled\\\",\\\"action\\\"],[\\\"route-select\\\",\\\"form-control\\\",[28,[\\\"routeSelection\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"routeSelection\\\"]]],null]],null]]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"routeTypes\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"type\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"type\\\",\\\"translation\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"type\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"route-notice\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"routeDescription\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"rotate-calls contact-info-group \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"error\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"rotateCallsDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-label route-setting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.rotateCalls\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.everyNumberOfSeconds\\\",[28,[\\\"rotateCallSeconds\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotateCalls\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"rotateCallSecondsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"rotateCallSecondsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"ringing-time contact-info-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[26,[\\\"stopRingingDisplayText\\\"]],true],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label route-setting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.stopRinging\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"form-container \\\",[33,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]],\\\"input-error\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings/inline-number-input\\\"],null,[[\\\"key\\\",\\\"value\\\",\\\"disabled\\\",\\\"update\\\",\\\"disableSave\\\"],[\\\"groups.groupRing.afterNumberOfRotations\\\",[28,[\\\"numberOfRotations\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateRotations\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\",\\\"numberOfRotationsError\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"numberOfRotationsError\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"error-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.invalidNumberError\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"ringTimeMs\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"max-ring-time\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.maxRingTime\\\"],[[\\\"time\\\"],[[33,[\\\"time-duration\\\"],null,[[\\\"durationInMs\\\"],[[28,[\\\"ringTimeMs\\\"]]]]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow contact-info-group\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflow\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container backup-container\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-label\\\"],[15,\\\"id\\\",\\\"forward-call-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.forwardCall\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"forwardingOn\\\",\\\"content\\\"]],[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],\\\"toggleCallForwarding\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"forwardingOn\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"overflowGroup\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"disabled\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"groups\\\",[33,[\\\"not\\\"],[[28,[\\\"canEditGroupTelephonySettings\\\"]]],null],[28,[\\\"searchText\\\"]],\\\"selectOverflowGroup\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"has-group-number\\\"],[[28,[\\\"result\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowGroupNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"overflow-selected\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"overflowGroup\\\"]],false,false]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"disableReplaceOverflowBtn\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"replaceOverflowGroup\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.replace\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"overflow-notice\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowNotice\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.overflowDisabled\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-voicemail contact-info-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"voicemails--input-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"voicemails-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemails.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]],[28,[\\\"voicemails\\\",\\\"disable\\\"]],\\\"toggleVoicemails\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"voicemails--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"voicemails--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.voicemailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"voicemails\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-greeting contact-info-group\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label greeting-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.greeting\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"displaySpinner\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasGreeting\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"audio-player\\\"],null,[[\\\"source\\\",\\\"options\\\",\\\"onError\\\"],[[28,[\\\"greetingAudioSource\\\"]],[28,[\\\"greetingOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"audioPlayerError\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"voicemailFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"file-name\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[28,[\\\"voicemailFile\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"audio-recorder\\\"],null,[[\\\"file\\\",\\\"playerOptions\\\",\\\"audioFileReady\\\",\\\"reset\\\"],[[28,[\\\"recordingFile\\\"]],[28,[\\\"playerOptions\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"recordingReady\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"resetRecording\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"options-dropdown\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"drop-down\\\"],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"group-contact-modal\\\"]],{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link menu-selector\\\"],[15,\\\"type\\\",\\\"button\\\"],[13],[0,\\\"\\\\n                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.options\\\"],null],false],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"showVoicemailGreetingOptions\\\"]],\\\"show\\\",\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"upload-file\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"link\\\"],[16,\\\"disabled\\\",[26,[\\\"hasGreeting\\\"]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"triggerUpload\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n\\\\n                                        \\\"],[11,\\\"input\\\",[]],[15,\\\"class\\\",\\\"hidden file-upload\\\"],[15,\\\"name\\\",\\\"file\\\"],[15,\\\"type\\\",\\\"file\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"components.audioRecorder.uploadFile\\\"],null],null],[15,\\\"accept\\\",\\\".wav,.aiff,.opus,.ogg,audio/ogg\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"chooseFile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]],[13],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n\\\\n                                    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"reset\\\"],[13],[0,\\\"\\\\n                                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"resetCurrentGreeting\\\"]],[13],[0,\\\"\\\\n                                            \\\"],[1,[33,[\\\"t\\\"],[\\\"components.audioRecorder.resetToDefault\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[14],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification contact-info-group\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"email-notifications-label\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.label\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]],[28,[\\\"emailNotifications\\\",\\\"disable\\\"]],\\\"toggleEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesEmailNotifications\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"emailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.emailDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"email-notification-pii contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"pii-email-notifications-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]],[28,[\\\"piiInEmailNotifications\\\",\\\"disable\\\"]],\\\"togglePiiInEmailNotifications\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesPiiInEmailNotifications\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"pii-in-email-notifications--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"piiInEmailNotifications\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOn\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.allowPiiInEmailNotifications.info.whenOff\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"show\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"voicemail-transcription contact-info-group\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-container\\\"],[15,\\\"data-t\\\",\\\"transcriptions--input-container\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"section-label overflow-label\\\"],[15,\\\"id\\\",\\\"transcriptions-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.label\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"disabled\\\",\\\"toggleRoomMute\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]],[28,[\\\"transcriptionToggle\\\",\\\"disable\\\"]],\\\"toggleTranscriptions\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[15,\\\"data-t\\\",\\\"transcriptions--info-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"reasons\\\",\\\"org\\\",\\\"disablesVMTranscription\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.disabled.byOrg\\\"],null],false],[0,\\\"\\\\n                                        \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"disabled-message\\\"],[15,\\\"data-t\\\",\\\"transcriptions--disabled-message\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"transcriptionToggle\\\",\\\"state\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsEnabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptionsDisabled\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"transcriptionDropDown\\\",\\\"show\\\"]],[28,[\\\"transcriptionLanguages\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"transcriptionDropDown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"                                    \\\"],[9,\\\"gux-dropdown\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"transcriptionDropDown\\\",\\\"state\\\"]],null],[15,\\\"filterable\\\",\\\"true\\\"],[15,\\\"slot\\\",\\\"dropdown\\\"],[16,\\\"onchange\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTranscriptionLanguage\\\"],null],null],[16,\\\"placeholder\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.groupRing.transcriptions.dropDown.placeholder\\\"],null]]]],[16,\\\"disabled\\\",[28,[\\\"transcriptionDropDown\\\",\\\"disable\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                        \\\"],[9,\\\"gux-listbox\\\",{\\\"attrs\\\":[],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"transcriptionLanguages\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                                \\\"],[9,\\\"gux-option\\\",{\\\"attrs\\\":[[16,\\\"value\\\",[28,[\\\"language\\\",\\\"key\\\"]],null]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                                                    \\\"],[1,[28,[\\\"language\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                                                \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"language\\\"]},null],[0,\\\"                                        \\\"]]}],[0,\\\"\\\\n                                    \\\"]]}],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/group-ring-settings/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BatchDataRequestMixin from 'connections-ui/mixins/batch-data-requests';\n\nimport { LIST_TYPES } from '../component';\n\nexport default Ember.Component.extend(BatchDataRequestMixin, {\n    classNames: ['ring-sequence'],\n\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    group: null,\n    searchInput: '',\n    searchQuery: '',\n    personSearch: false,\n    sequenceContainer: null,\n    resultsContainer: null,\n    resizeListener: null,\n    isSequential: false,\n    displayIndices: false,\n    editing: false,\n    listDirty: false,\n    ringRotations: null,\n    listType: null,\n\n    owners: Ember.computed.reads('group.owners.owners'),\n    individuals: Ember.computed.reads('group.individuals.individuals'),\n\n    _editing: false,\n\n    isOwners: Ember.computed.equal('listType', LIST_TYPES.OWNERS),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.sequenceContainer = this.$('.sequence-container');\n        if (this.attrs.appendSave) {\n            this.saveFunction = Ember.run.bind(this, this.save);\n            this.attrs.appendSave(this.saveFunction);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeListeners();\n        if (this.attrs.removeSave) {\n            this.attrs.removeSave(this.saveFunction);\n        }\n    },\n\n    didUpdateAttrs() {\n        const editing = this.get('editing');\n        const cachedEditing = this.get('_editing');\n        if (editing !== cachedEditing) {\n            this.set('_editing', editing);\n            this.notifyPropertyChange('owners');\n            this.notifyPropertyChange('individuals');\n        }\n    },\n\n    sequenceList: Ember.computed('isOwners', 'individualsSequenceList.[]', 'ownersSequenceList.[]', function () {\n        return this.get('isOwners') ? this.get('ownersSequenceList') : this.get('individualsSequenceList');\n    }),\n\n    individualsSequenceList: Ember.computed('individuals.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('individuals') || [])\n        });\n    }),\n\n    ownersSequenceList: Ember.computed('owners.[]', function () {\n        return DS.PromiseArray.create({\n            promise: this._sequenceListForPeople(this.get('owners') || [])\n        });\n    }),\n\n    renderedList: Ember.computed(\n        'sequenceList.[]',\n        'individualsSequenceList.[]',\n        'ownersSequenceList.[]',\n        'ringRotations',\n        function () {\n            return DS.PromiseArray.create({\n                promise: this._appendRotationListData()\n            });\n        }\n    ),\n\n    searchLabel: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.ownersSearch');\n        } else {\n            return this.get('intl').t('groups.groupRing.membersSearch');\n        }\n    }),\n\n    searchPlaceholder: Ember.computed('listType', function () {\n        if (this.get('listType') === 'owners') {\n            return this.get('intl').t('groups.groupRing.searchPlaceholderOwners');\n        } else {\n            return this.get('intl').t('groups.groupRing.searchPlaceholder');\n        }\n    }),\n\n    addMemberPlaceholder: Ember.computed(function () {\n        return this.get('intl').t('groups.groupRing.addMemberPlaceholder');\n    }),\n\n    clearSearch: Ember.observer('editing', function () {\n        this.set('searchInput', '');\n        this.set('searchQuery', '');\n    }),\n\n    actions: {\n        inputEntered() {\n            Ember.run.throttle(this, this._updateSearchQuery, 500, false);\n        },\n\n        togglePersonSearch() {\n            this.toggleProperty('personSearch');\n            this.handleListeners();\n        },\n\n        addPerson(person) {\n            return this.get('sequenceList').then(sequenceList => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                const index = sequenceList.get('length') + 1;\n                const listItem = Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: index\n                });\n                this.set('personSearch', false);\n                sequenceList.pushObject(listItem);\n                sequenceList.set('lastObject.scrollIntoView', true);\n                this.set('listDirty', true);\n            });\n        },\n\n        listModified() {\n            this.set('listDirty', true);\n        }\n    },\n\n    handleListeners() {\n        if (this.get('personSearch')) {\n            Ember.run.scheduleOnce('afterRender', this, () => {\n                this._attachListeners();\n                this._handleResizeEvent();\n            });\n        } else {\n            Ember.run.scheduleOnce('afterRender', this, this._removeListeners);\n        }\n    },\n\n    save() {\n        this.set('personSearch', false);\n\n        const owners = this.get('ownersSequenceList');\n        const individuals = this.get('individualsSequenceList');\n\n        return {\n            type: 'ring-sequence',\n            individuals: individuals.then(people => people.mapBy('person.id')),\n            owners: owners.then(people => people.mapBy('person.id'))\n        };\n    },\n\n    _appendRotationListData() {\n        return this.get('sequenceList').then(sequenceList => {\n            const ringRotations = this.get('ringRotations');\n            const listLength = sequenceList.get('length');\n            if (ringRotations !== null) {\n                sequenceList.forEach((listModel, index) => {\n                    listModel.setProperties({\n                        beginningOutOfRange: index === ringRotations,\n                        outOfRange: index >= ringRotations,\n                        endOutOfRange: index > ringRotations - 1 && index === listLength - 1,\n                        popupDismissed: false\n                    });\n                });\n            }\n            return sequenceList;\n        });\n    },\n\n    _sequenceListForPeople(people) {\n        const batchPromises = people.map(person => this.getUser(person.guid || person.value));\n        return Ember.RSVP.all(batchPromises).then(personArray => {\n            return personArray.map((person, index) => {\n                const isOwner = this.get('group').isPersonOwner(person);\n                return Ember.Object.create({\n                    person: person,\n                    isOwner: isOwner,\n                    index: ++index\n                });\n            });\n        });\n    },\n\n    _updateSearchQuery() {\n        this.set('searchQuery', this.get('searchInput'));\n    },\n\n    _attachListeners() {\n        this.resizeListener = Ember.$(window).on(`resize.${this.get('elementId')}`, () => {\n            Ember.run.throttle(this, this._handleResizeEvent, 100, false);\n        });\n        this.resultsContainer = this.$('.results-container');\n    },\n\n    _removeListeners() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n        this.resultsContainer = null;\n    },\n\n    _handleResizeEvent() {\n        const height = this.sequenceContainer.height();\n        this.resultsContainer.css('height', `${height - 4}px`);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"Mc0I3uIH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"list-search \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"editing\\\"]]],null],\\\"display-only\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link add-person \\\",[33,[\\\"if\\\"],[[28,[\\\"personSearch\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"togglePersonSearch\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-invite-user\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addOwner\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.addMember\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"input-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-person-search\\\"]]],[13],[1,[26,[\\\"searchLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"type\\\",\\\"value\\\",\\\"key-up\\\",\\\"placeholder\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-person-search\\\"],null],\\\"search-input\\\",\\\"text\\\",[28,[\\\"searchInput\\\"]],\\\"inputEntered\\\",[28,[\\\"searchPlaceholder\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-search\\\"],null,[[\\\"type\\\",\\\"placeholder\\\",\\\"select\\\"],[\\\"people\\\",[28,[\\\"addMemberPlaceholder\\\"]],\\\"addPerson\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"can-add-group-ring-member\\\"],[[28,[\\\"result\\\"]],[28,[\\\"sequenceList\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"result-container clickable scroll-entity \\\",[33,[\\\"if\\\"],[[28,[\\\"result\\\",\\\"selected\\\"]],\\\"selected\\\"],null]]]],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectResult\\\"]],[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\"],[[28,[\\\"result\\\"]],false,false]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"result-container scroll-entity disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"disabled\\\"],[[28,[\\\"result\\\"]],false,false,true]]],false],[0,\\\"\\\\n\\\"],[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.memberNotSelectable\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[\\\"result\\\",\\\"selectResult\\\"]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"sequence-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"personSearch\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-profile/group-list\\\"],null,[[\\\"groupList\\\",\\\"searchQuery\\\",\\\"editing\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"listType\\\",\\\"listModified\\\"],[[28,[\\\"renderedList\\\"]],[28,[\\\"searchQuery\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"listModified\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-help\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.inviteHelp\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isOwners\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"owners-note\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.ownersAsMembers\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/ring-sequence/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"TD8PPWDT\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-content-wrapper\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-left-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tab-container\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-owners active\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"owners\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#owners\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.owners\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"nav-tab-members\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"changeListType\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#members\\\"],[15,\\\"data-toggle\\\",\\\"tab\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.members\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/ring-sequence\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"displayIndices\\\",\\\"isSequential\\\",\\\"ringRotations\\\",\\\"personSearch\\\",\\\"listType\\\",\\\"appendSave\\\",\\\"removeSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"ringRotations\\\"]],[28,[\\\"personSearch\\\"]],[28,[\\\"listType\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"settings-right-rail\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel/group-ring-settings\\\"],null,[[\\\"entity\\\",\\\"orgVoicemailPolicy\\\",\\\"canEditGroupTelephonySettings\\\",\\\"editing\\\",\\\"appendSave\\\",\\\"removeSave\\\",\\\"disableSave\\\"],[[28,[\\\"group\\\"]],[28,[\\\"orgVoicemailPolicy\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],[28,[\\\"editing\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"appendSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"removeSave\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"disableSave\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-wrapper\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"disabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-contact-panel/template.hbs\"}});","import Ember from 'ember';\nimport DS from 'ember-data';\nimport Fuse from 'npm:fuse.js';\n\nimport { LIST_TYPES } from '../group-contact-panel/component';\n\nconst fuseOptions = {\n    shouldSort: false,\n    threshold: 0.4,\n    location: 0,\n    distance: 100,\n    maxPatternLength: 32,\n    minMatchCharLength: 1,\n    keys: ['person.name'],\n    getFn(obj, path) {\n        return obj.get(path);\n    }\n};\n\nexport default Ember.Component.extend({\n    classNames: ['group-list'],\n\n    groupList: null,\n    selectedIndex: null,\n    searchQuery: '',\n    editing: false,\n    displayIndices: true,\n    listType: null,\n\n    queryAvailable: Ember.computed.gt('searchQuery.length', 0),\n\n    searchResults: Ember.computed('groupList', 'searchQuery', function () {\n        if (this.get('queryAvailable')) {\n            return DS.PromiseArray.create({\n                promise: this.get('groupList').then(data => new Fuse(data, fuseOptions).search(this.get('searchQuery')))\n            });\n        }\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve(Ember.A([]))\n        });\n    }),\n\n    renderedList: Ember.computed('searchResults.[]', 'groupList.[]', 'queryAvailable', function () {\n        if (this.get('queryAvailable')) {\n            return this.get('searchResults');\n        }\n        return this.get('groupList');\n    }),\n\n    canRemove: Ember.computed('renderedList.[]', 'listType', function () {\n        if (this.get('listType') !== LIST_TYPES.OWNERS) {\n            return true;\n        }\n        return this.get('renderedList.length') > 1;\n    }),\n\n    actions: {\n        removeItem(index) {\n            if (!this.get('canRemove')) {\n                return;\n            }\n\n            this.get('groupList').removeAt(index - 1);\n            this._recalculateIndices();\n            this.notifyParentOfListChange();\n        },\n\n        changePosition(from, to) {\n            Ember.run.debounce(this, this.changePosition, from, to, 100);\n        }\n    },\n\n    notifyParentOfListChange() {\n        if (this.attrs.listModified) {\n            this.attrs.listModified();\n        }\n    },\n\n    changePosition(from, to) {\n        this._changePosition(from, to);\n\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        this.set('selectedIndex', null);\n        this.notifyParentOfListChange();\n    },\n\n    _recalculateIndices() {\n        this.get('groupList').map((listModel, index) => {\n            listModel.set('index', ++index);\n        });\n    },\n\n    _changePosition(from, to) {\n        if (!Number.isInteger(to)) {\n            return;\n        }\n        const groupList = this.get('groupList');\n        to = Math.min(to, groupList.get('length'));\n        to = Math.max(to, 1);\n\n        groupList.then(groupArray => {\n            const item = groupArray.get(from - 1);\n            groupArray.removeAt(from - 1);\n            groupArray.insertAt(to - 1, item);\n            this._recalculateIndices();\n        });\n    }\n});\n","import Ember from 'ember';\nimport { eventToString } from 'connections-ui/utils/keystroke';\n\nexport default Ember.Component.extend({\n    classNames: ['list-item'],\n    classNameBindings: ['editing', 'outOfRotationRange:out-of-range', 'listModel.scrollIntoView:highlight'],\n\n    intl: Ember.inject.service(),\n\n    isSequential: false,\n    displayIndices: true,\n    listModel: null,\n    input_value: null,\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            pin: true\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    hovercardArrowOffset: 24,\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('listModel.scrollIntoView')) {\n            this.scrollIntoView();\n        }\n    },\n\n    index: Ember.computed.reads('listModel.index'),\n\n    outOfRotationRange: Ember.computed.and('listModel.outOfRange', 'isSequential'),\n\n    displayRotationRangePopup: Ember.computed(\n        'listModel.beginningOutOfRange',\n        'listModel.popupDismissed',\n        'isSequential',\n        'editing',\n        function () {\n            return (\n                this.get('listModel.beginningOutOfRange') &&\n                this.get('isSequential') &&\n                !this.get('listModel.popupDismissed') &&\n                this.get('editing')\n            );\n        }\n    ),\n\n    position: Ember.computed('index', function () {\n        return `${this.get('index')}.`;\n    }),\n\n    role: Ember.computed('listModel.isOwner', function () {\n        if (this.get('listModel.isOwner')) {\n            return this.get('intl').t('groups.memberTypes.owner');\n        }\n        return this.get('intl').t('groups.memberTypes.individual');\n    }),\n\n    newIndex: Ember.computed('input_value', function () {\n        return parseInt(this.get('input_value'));\n    }),\n\n    popupTarget: Ember.computed('elementId', function () {\n        return `list-item-popup-${this.elementId}`;\n    }),\n\n    actions: {\n        indexChanged() {\n            this.changeIndex();\n        },\n        dismissPopup() {\n            this.set('listModel.popupDismissed', true);\n        },\n        setIndexChanged(event) {\n            if (eventToString(event) !== 'ENTER') {\n                const value = parseInt(event.target.value, 10);\n                if (!isNaN(value)) {\n                    this.set('newIndex', value);\n                }\n            }\n        },\n        submitIndexChange(event) {\n            if (eventToString(event) === 'ENTER') {\n                this.changeIndex();\n            }\n        }\n    },\n\n    changeIndex() {\n        this.attrs.changePosition(this.get('index'), this.get('newIndex'));\n        this.set('input_value', null);\n    },\n\n    scrollIntoView() {\n        const parent = this.$().parent();\n        const scrollHeight = parent.prop('scrollHeight');\n        parent.animate(\n            {\n                scrollTop: scrollHeight\n            },\n            1000\n        );\n        Ember.run.later(\n            this,\n            () => {\n                this.set('listModel.scrollIntoView', false);\n            },\n            5000\n        );\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WWNJD4ST\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayIndices\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"isSequential\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[15,\\\"class\\\",\\\"input\\\"],[16,\\\"placeholder\\\",[26,[\\\"index\\\"]],null],[16,\\\"aria-label\\\",[26,[\\\"index\\\"]],null],[16,\\\"value\\\",[26,[\\\"input_value\\\"]],null],[16,\\\"onblur\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"indexChanged\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]],null],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"submitIndexChange\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"setIndexChanged\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[1,[26,[\\\"position\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null],[6,[\\\"entity-hover-card-v2\\\"],null,[[\\\"entity\\\",\\\"enableMiniCard\\\"],[[28,[\\\"listModel\\\",\\\"person\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[28,[\\\"listModel\\\",\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-right-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-link \\\",[33,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null],\\\"disabled\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"removeItem\\\"]],[28,[\\\"index\\\"]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"canRemove\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.cannotRemoveAllOwners\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\"],[\\\"top\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRotationRangePopup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"ember-tether\\\"],null,[[\\\"target\\\",\\\"targetAttachment\\\",\\\"attachment\\\",\\\"constraints\\\",\\\"classPrefix\\\",\\\"offset\\\"],[[33,[\\\"concat\\\"],[\\\"#\\\",[28,[\\\"elementId\\\"]]],null],\\\"top center\\\",\\\"bottom center\\\",[28,[\\\"tetherConstraints\\\"]],\\\"list-item-popup-tether\\\",[28,[\\\"hovercardOffset\\\"]]]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"popupTarget\\\"]]]]],[15,\\\"class\\\",\\\"list-item-popup\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-triangle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"popup-description\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.popupDescription\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"dismissPopup\\\"]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-times\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/list-item/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"ul9Fm8yu\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"renderedList\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/group-list/list-item\\\"],null,[[\\\"editing\\\",\\\"listModel\\\",\\\"isSequential\\\",\\\"displayIndices\\\",\\\"canRemove\\\",\\\"removeItem\\\",\\\"changePosition\\\"],[[28,[\\\"editing\\\"]],[28,[\\\"listModel\\\"]],[28,[\\\"isSequential\\\"]],[28,[\\\"displayIndices\\\"]],[28,[\\\"canRemove\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"removeItem\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"changePosition\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"listModel\\\"]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/group-list/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-entry'],\n\n    chat: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    attrs: {\n        person: null,\n        group: null,\n        individuals: [],\n        editing: false,\n        membership: [],\n        deletePerson: ''\n    },\n\n    actions: {\n        deletePerson() {\n            const group = this.get('group');\n            const person = this.get('person');\n            if (group.isPersonOwner(person) && this.get('group.owners.owners.length') === 1) {\n                const title = this.get('entity.name');\n                const message = this.get('intl').lookup('notification.group.noOwners');\n                this.get('notification').info(title, message);\n            } else {\n                this.sendAction('deletePerson', person, this.get('memberTypeList'));\n            }\n        },\n\n        handleDeleteKeyDown(event) {\n            if (event.key === 'Enter' || event.key === ' ') {\n                event.preventDefault();\n                this.send('deletePerson');\n            }\n        }\n    },\n\n    showChat: computed('isLoggedInUser', 'chat.enabled', function () {\n        return !this.get('isLoggedInUser') && this.get('chat.enabled');\n    }),\n\n    isLoggedInUser: computed('person', 'session.person', function () {\n        const person = this.get('person');\n        const sessionPerson = this.get('session.person');\n        return person.get('id') === sessionPerson.get('id');\n    }),\n\n    cannotDeleteMember: computed('isLoggedInUser', 'group.owners.owners.@each.value', function () {\n        const person = this.get('person');\n        const group = this.get('group');\n        const isOwnerAndSelf = group.isPersonOwner(person) && this.get('isLoggedInUser');\n        const multipleOwners = group.get('owners.owners.length') > 1;\n        return isOwnerAndSelf && !multipleOwners;\n    }),\n\n    canViewRules: computed('group.membershipVisible', 'session.person', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return true;\n        }\n\n        const group = this.get('group');\n        const person = this.get('session.person');\n        const visible = this.get('group.membershipVisible');\n        const namedPermissions = person.get('namedPermissions');\n        const hasPermissions = namedPermissions.includes('admin') || namedPermissions.includes('group_administration');\n        if (!visible) {\n            return hasPermissions || group.isPersonOwner(person);\n        }\n        return true;\n    }),\n\n    memberType: computed('person', 'group', 'isCurrentMember', 'individuals.[]', 'group.isDynamicGroup', function () {\n        const intl = this.get('intl');\n        const group = this.get('group');\n        const person = this.get('person');\n        const individuals = this.get('individuals');\n        let translation = intl.lookup('common.removed');\n        if (this.get('isCurrentMember')) {\n            if (group.isPersonOwner(person)) {\n                translation = intl.lookup('groups.memberTypes.owner');\n            } else if (_.includes(individuals, person) || group.isPersonIndividual(person)) {\n                translation = intl.lookup('groups.memberTypes.individual');\n            } else if (this.get('group.isDynamicGroup')) {\n                translation = intl.lookup('groups.memberTypes.dynamic');\n            } else {\n                translation = intl.lookup('groups.memberTypes.rule');\n            }\n        }\n        return translation.toString();\n    }),\n\n    memberTypeList: computed('person', 'group', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        const paths = [];\n        if (group.isPersonOwner(person)) {\n            paths.push('owner');\n        }\n        if (group.isPersonIndividual(person)) {\n            paths.push('individual');\n        }\n        return paths;\n    }),\n\n    isRule: computed('person', 'group', 'isAddedIndividual', function () {\n        const group = this.get('group');\n        const person = this.get('person');\n        return !group.isPersonOwner(person) && !group.isPersonIndividual(person) && !this.get('isAddedIndividual');\n    }),\n\n    isLinkable: computed.not('editing'),\n    isAddedIndividual: computed('person', 'individuals.[]', 'membership.[]', function () {\n        const id = this.get('person.id');\n        const membership = this.get('membership').mapBy('guid');\n        return _.includes(membership, id);\n    }),\n\n    isCurrentMember: computed(\n        'group.owners.owners.@each.value',\n        'group.individuals.individuals.@each.value',\n        'isAddedIndividual',\n        function () {\n            const group = this.get('group');\n            const person = this.get('person');\n            return group.isPersonOwner(person) || group.isPersonIndividual(person) || this.get('isAddedIndividual');\n        }\n    ),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachTooltip();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.delete').tooltip('destroy');\n    },\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (newAttrs.editing.value !== oldAttrs.editing.value) {\n            this.attachTooltip();\n        }\n    },\n\n    attachTooltip() {\n        Ember.run.scheduleOnce('afterRender', () => {\n            if (this.get('editing') && this.get('isRule')) {\n                this.$('.delete').tooltip({\n                    title: this.get('intl').lookup('groups.cannotRemoveRuleEntry').toString(),\n                    placement: 'left'\n                });\n            }\n        });\n    },\n\n    click(event) {\n        const target = Ember.$(event.target);\n        if (target.is('.person-name')) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [this.get('person')]\n            });\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"4MOmVGd4\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"isLinkable\\\"],[[28,[\\\"person\\\"]],true,[28,[\\\"isLinkable\\\"]]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"person\\\",\\\"title\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"member-type \\\",[33,[\\\"unless\\\"],[[28,[\\\"isCurrentMember\\\"]],\\\"removed\\\"],null]]]],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"memberType\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"member-contact\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-contact\\\"],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\",\\\"shouldTether\\\"],[[28,[\\\"person\\\"]],[28,[\\\"showChat\\\"]],false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"delete danger \\\",[33,[\\\"unless\\\"],[[28,[\\\"editing\\\"]],\\\"hidden\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRule\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cannotDeleteMember\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row disabled\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleDeleteKeyDown\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deletePerson\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-entry/template.hbs\"}});","import Ember from 'ember';\nimport request from 'ember-ajax';\nimport DS from 'ember-data';\nimport { singularize } from 'ember-inflector';\nimport _ from 'lodash';\nimport { task, timeout } from 'ember-concurrency';\nimport JobMixin from '../../../mixins/job';\nimport PagingMixin from '../../../mixins/paging';\nimport { BASE_PERSON } from '../../../models/person';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { set, get, inject, computed, observer, Component } = Ember;\n\nfunction equals(field, value, intl) {\n    return {\n        displayClassification: intl.lookup(field),\n        type: 'equals',\n        key: field,\n        value: value\n    };\n}\n\nfunction personQuery(rels, person) {\n    return {\n        rels: rels,\n        type: 'relationship',\n        value: person.get('_id') || person.get('id'),\n        guid: person.get('guid') || person.get('id'),\n        entity: 'people'\n    };\n}\n\nexport default Component.extend(PagingMixin, JobMixin, LoggerMixin, {\n    classNames: ['group-membership-listing', 'content'],\n    classNameBindings: ['editing', 'hunt-groups'],\n\n    intl: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    permissions: inject.service(),\n    searchService: inject.service('search'),\n\n    phoneEnabled: computed.reads('permissions.phoneEnabled'),\n    group: null,\n    entityType: 'person',\n    fieldList: BASE_PERSON.fl,\n\n    filterChoices: [\n        {\n            key: 'all',\n            string: 'groups.dropdown.all',\n            active: false,\n            path: null\n        },\n        {\n            key: 'individuals',\n            string: 'groups.dropdown.individuals',\n            active: true,\n            path: 'individuals.individuals'\n        },\n        {\n            key: 'owners',\n            string: 'groups.dropdown.owners',\n            active: false,\n            path: 'owners.owners'\n        },\n        {\n            key: 'rules',\n            string: 'groups.dropdown.rules',\n            active: false,\n            path: null\n        }\n    ],\n\n    inclusionFilter: {\n        key: 'inclusions',\n        string: 'group_membership_inclusions_labelKey_inclusions',\n        active: false,\n        path: 'membership.inclusions'\n    },\n\n    exclusionFilter: {\n        key: 'exclusions',\n        string: 'group_membership_exclusions_labelKey_exclusions',\n        active: false,\n        path: 'membership.exclusions'\n    },\n\n    filter: null,\n    search: null,\n    editing: false,\n    showRules: false,\n    saving: false,\n    loadedAll: false,\n    loading: null,\n    ignoreScroll: false,\n    rateLimited: false,\n\n    currentlySearching: false,\n    currentMembershipRequest: null,\n    membershipQuery: null,\n\n    membership: null,\n    memberListLimitSize: 20,\n    retryTimeout: null,\n    retyTimeOutDuration: 10000,\n\n    actions: {\n        toggleRules() {\n            this.toggleProperty('showRules');\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            Ember.set(this, 'loadedAll', false);\n            if (this.get('showRules')) {\n                Ember.set(this, 'filter', this.inclusionFilter);\n            } else {\n                Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n            }\n            this.updateContentOnChange();\n        },\n\n        selectFilter(filter) {\n            this.set('ignoreScroll', true);\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'membership', []);\n            Ember.set(this, 'membershipQuery.offset', 0);\n            Ember.set(this, 'currentPage', 0);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', filter);\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'loadedAll', false);\n\n            this.updateContentOnChange();\n        },\n\n        updateSearch(search) {\n            Ember.set(this, 'search', search);\n            this.searchCriteriaChanged();\n        },\n\n        editMembership() {\n            Ember.set(this, 'editing', true);\n            Ember.set(this, 'showRules', false);\n            Ember.set(this, 'loadedAll', false);\n            this.get('editingFilterChoices').forEach(filter => set(filter, 'active', false));\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'owners'));\n            Ember.set(this, 'filter.active', true);\n            Ember.set(this, 'membership', []);\n            this.updateContentOnChange();\n            Ember.run.scheduleOnce('afterRender', () => {\n                Ember.$('.add-member input').trigger('focus');\n            });\n            this.sendAction('changeEditing', true);\n        },\n\n        selectTab(tab) {\n            this.bubbleAction({\n                action: 'selectTab',\n                actionContext: tab\n            });\n        },\n\n        selectKeyword(keyword) {\n            this.addKeyword(keyword);\n        },\n\n        selectPerson(person) {\n            this.addPerson(person);\n        },\n\n        removeRule(rule) {\n            this.removeRule(rule);\n        },\n\n        removePerson(person, memberTypeList) {\n            this.removePerson(person, memberTypeList);\n        },\n\n        save() {\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'saving', true);\n            const application = this.get('application');\n            const group = this.get('group');\n            const addedIndividuals = this.get('addedIndividuals');\n            const removedIndividuals = this.get('removedIndividuals');\n            this.setRulesOnGroup();\n            group\n                .save()\n                .then(res => {\n                    const job = Ember.get(res, 'meta.job');\n                    if (job && job.jobId) {\n                        this.addJob(\n                            job,\n                            () => {\n                                this.handleJobFinish();\n                            },\n                            this\n                        );\n                    } else {\n                        return this.get('loadAll').perform();\n                    }\n                })\n                .then(() => this.saveIndividuals(group, addedIndividuals, application))\n                .then(() => this.deleteIndividuals(group, removedIndividuals, application))\n                .then(() => this.reload())\n                .then(() => {\n                    const title = group.get('name');\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    this.sendAction('changeEditing', false);\n\n                    Ember.set(this, 'addedIndividuals', []);\n                    Ember.set(this, 'removedIndividuals', []);\n                    Ember.set(this, 'membershipQuery.offset', 0);\n\n                    Ember.set(this, 'loading', {\n                        add: false,\n                        search: false\n                    });\n\n                    this.setProperties({\n                        saving: false,\n                        editing: false,\n                        currentPage: 0,\n                        loadedAll: false\n                    });\n\n                    Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n                })\n                .then(() => {\n                    // Membership count is eventually consistent...\n                    // Check for membership count after some seconds...\n                    Ember.run.later(() => {\n                        this.reload();\n                    }, 5000);\n                })\n                .catch(err => {\n                    this.logger.error('There was an error saving the group', {\n                        err\n                    });\n\n                    const title = group.get('name');\n                    const message = this.get('intl').t('notification.group.saveError');\n                    this.get('notification').error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    Ember.set(this, 'saving', false);\n                });\n        },\n\n        cancel() {\n            const group = this.get('group');\n\n            Ember.set(this, 'search', '');\n            Ember.set(this, 'editing', false);\n            Ember.set(this, 'loading.search', true);\n            Ember.set(this, 'filter', this.filterChoices.findBy('key', 'all'));\n\n            group.reload().then(() => {\n                group.rollbackAttributes();\n\n                Ember.set(this, 'loading.search', false);\n                Ember.set(this, 'membershipQuery.offset', 0);\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n\n                this.initMembership();\n                this.get('loadAll').perform();\n\n                this.sendAction('changeEditing', false);\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initMembership();\n\n        this.set('filter', _.head(this.filterChoices));\n        this.set('membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.set('loading', {\n            add: false,\n            search: false\n        });\n\n        this.loadMembershipList().then(() => Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit));\n        this.get('reloadPageOnGroupChange').perform();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.$('.membership-listing').on(\n            'scroll',\n            Ember.run.bind(this, () => this.get('loadContentOnScroll').perform())\n        );\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('.membership-listing').off('scroll');\n\n        if (this.get('retryTimeout')) {\n            Ember.run.cancel(timeout);\n        }\n    },\n\n    inclusionQueries: computed('group.membership.inclusions.[]', 'inclusions.[]', function () {\n        const addedInclusions = _.map(this.get('inclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.inclusions').concat(addedInclusions);\n    }),\n\n    exclusionQueries: computed('group.membership.exclusions.[]', 'exclusions.[]', function () {\n        const addedExclusions = _.map(this.get('exclusions'), value => ({\n            value\n        }));\n        return this.get('group').getFieldValue('membership.exclusions').concat(addedExclusions);\n    }),\n\n    membershipRules: computed('filter.key', 'inclusionQueries', 'exclusionQueries', 'shouldShowRules', function () {\n        if (!this.get('shouldShowRules')) {\n            return;\n        }\n        const key = this.get('filter.key');\n        if (key === 'inclusions') {\n            return this.get('inclusionQueries');\n        }\n        if (key === 'exclusions') {\n            return this.get('exclusionQueries');\n        }\n    }),\n\n    canEdit: computed(\n        'group.id',\n        'session.user.isTrustee',\n        'session.person.namedPermissions',\n        'permissions.canEditGroups',\n        function () {\n            if (this.get('session.user.isTrustee')) {\n                return this.get('permissions.canEditGroups');\n            }\n            const person = this.get('session.person');\n            const permissions = person.get('namedPermissions');\n            return (\n                permissions.includes('admin') ||\n                permissions.includes('group_administration') ||\n                this.isOwner(person) ||\n                this.get('permissions.canEditGroups')\n            );\n        }\n    ),\n\n    canViewRules: computed('canEdit', 'group.membershipVisible', 'group.isDynamicGroup', function () {\n        return !this.get('group.isDynamicGroup') && (this.get('canEdit') || this.get('group.membershipVisible'));\n    }),\n\n    isEditingRules: computed('filter.key', 'editing', function () {\n        const key = this.get('filter.key');\n        return (key === 'inclusions' || key === 'exclusions') && this.get('editing');\n    }),\n\n    expressionDisplay: Ember.computed('group.expression', function () {\n        let output = '';\n        let expression = this.get('group.expression');\n        let invalid = false;\n\n        if (_.isEmpty(expression)) {\n            return this.get('intl').t('groups.expressions.empty');\n        }\n\n        expression.forEach(con => {\n            let display = '(';\n            let orWrap = false;\n\n            con.rules.forEach(rule => {\n                let valid = !!rule.skill && !!rule.comparator && !isNaN(rule.proficiency.value);\n                if (valid) {\n                    display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n                    if (rule.lastRule) {\n                        display += ')';\n                    } else if (!rule.opAnd) {\n                        display += `) ${this.get('intl').t('groups.expressions.or')} (`;\n                        orWrap = true;\n                    } else {\n                        display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                    }\n                } else {\n                    invalid = true;\n                }\n            });\n\n            if (orWrap) {\n                display = `(${display})`;\n            }\n\n            if (!con.lastCondition) {\n                if (!con.opAnd) {\n                    display += ` ${this.get('intl').t('groups.expressions.or')} `;\n                } else {\n                    display += ` ${this.get('intl').t('groups.expressions.and')} `;\n                }\n            }\n            output += display;\n        });\n\n        let empty = output.replaceAll('(', '').replaceAll(')', '').trim() === 0;\n\n        if (invalid) {\n            output = this.get('intl').t('groups.expressions.invalid');\n        } else if (empty) {\n            //has no valid rules\n            output = this.get('intl').t('groups.expressions.empty');\n        }\n        return output;\n    }),\n\n    displayEditingFooter: Ember.computed('group.allowPermissionGroup', 'filter.key', 'editing', function () {\n        const isEditingRules = this.get('isEditingRules');\n        const rolesEnabled = this.get('group.allowPermissionGroup');\n        const editing = this.get('editing');\n        if (!editing) {\n            return false;\n        } else {\n            return !(rolesEnabled && isEditingRules);\n        }\n    }),\n\n    isSearching: computed('search', function () {\n        return !_.isEmpty(this.get('search'));\n    }),\n\n    shouldShowRules: computed.or('isEditingRules', 'showRules'),\n\n    showingFilterChoices: computed('filterChoices.[]', 'shouldShowRules', 'group.isDynamicGroup', function () {\n        if (this.get('shouldShowRules') && !this.get('group.isDynamicGroup')) {\n            return [this.inclusionFilter, this.exclusionFilter];\n        } else if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key !== 'rules' && choice.key !== 'individuals';\n            });\n        }\n        return this.get('filterChoices');\n    }),\n\n    editingFilterChoices: computed('filterChoices.[]', 'group.isDynamicGroup', function () {\n        const choices = this.get('filterChoices').filter(choice => {\n            return choice && choice.key !== 'all' && choice.key !== 'rules';\n        });\n        if (this.get('group.isDynamicGroup')) {\n            return this.get('filterChoices').filter(choice => {\n                return choice && choice.key === 'owners';\n            });\n        } else {\n            return choices.concat([this.inclusionFilter, this.exclusionFilter]);\n        }\n    }),\n\n    dropdownTitle: computed('filter', function () {\n        const filter = this.get('filter');\n        return this.get('intl').lookup(filter.string).toString();\n    }),\n\n    membershipCount: computed('membership.length', 'group.memberCount', function () {\n        const memberCount = this.get('group.memberCount');\n        let promise = Ember.RSVP.resolve(memberCount);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    membershipHeader: computed('membershipCount', 'membershipCount.isFulfilled', function () {\n        const count = this.get('membershipCount.content') || 0;\n        return this.get('intl').lookup('groups.membershipWithCount', { count }).toString();\n    }),\n\n    extraParams: computed('group.{generalSearchQuery,membershipSearchQuery}', 'search', 'filter', function () {\n        const search = this.get('search');\n        const filter = this.get('filter');\n        const generalQuery = this.get('group.generalSearchQuery');\n        const membershipQuery = this.get('group.membershipSearchQuery');\n        let queryGroup = [];\n        if (search) {\n            queryGroup.push(search);\n        }\n        if (generalQuery) {\n            queryGroup.push(generalQuery);\n        }\n        if (membershipQuery && filter && filter.key === 'rules') {\n            queryGroup.push(membershipQuery);\n        }\n\n        return { q: queryGroup.join(' AND ') };\n    }),\n\n    didReceiveAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'group.value.id') !== get(oldAttrs, 'group.value.id')) {\n            this.cancelEditOnGroupChange();\n            this.get('reloadPageOnGroupChange').perform(true);\n        }\n    },\n\n    debouncedSearchCriteriaChanged: task(function* () {\n        yield timeout(400);\n        Ember.run(() => {\n            const search = this.get('search');\n            if (_.isEmpty(search)) {\n                Ember.set(this, 'currentPage', 0);\n                Ember.set(this, 'loadedAll', false);\n                this.updateContentOnChange();\n            } else {\n                this.get('loadRules').perform();\n            }\n        });\n    }).drop(),\n\n    cancelEditOnGroupChange() {\n        Ember.set(this, 'editing', false);\n        this.sendAction('changeEditing', false);\n    },\n\n    reloadPageOnGroupChange: task(function* (loadMore = false) {\n        if (!this.get('group.id')) {\n            return;\n        }\n\n        this.initMembership();\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        Ember.set(this, 'filter', this.get('filterChoices.0'));\n        Ember.set(this, 'search', '');\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n\n        yield this.updateContentOnChange();\n\n        if (loadMore) {\n            Ember.run.scheduleOnce('afterRender', this, this.loadMoreMembersOnInit);\n        }\n    }),\n\n    updateContentOnChange() {\n        const filter = this.get('filter');\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        switch (filter.key) {\n            case 'owners':\n                return this.get('loadOwners').perform();\n            case 'individuals':\n                return this.get('loadIndividuals').perform();\n            case 'rules':\n                return this.get('loadRules').perform();\n            case 'inclusions':\n            case 'exclusions':\n                return function () {};\n            default:\n                return this.get('loadAll').perform();\n        }\n    },\n\n    searchCriteriaChanged() {\n        this.get('debouncedSearchCriteriaChanged').perform();\n    },\n\n    reload() {\n        this.get('group')\n            .reload()\n            .then(() => this.reloadPageOnGroupReload());\n    },\n\n    reloadPageOnGroupReload() {\n        if (this.get('group.isReloading')) {\n            return;\n        }\n        Ember.set(this, 'loading.search', false);\n\n        Ember.set(this, 'membershipQuery', {\n            offset: 0,\n            limit: this.memberListLimitSize\n        });\n        this.updateContentOnChange();\n    },\n\n    pageChanged: observer('page', function () {\n        this.get('page').then(() => {\n            Ember.set(this, 'loading.search', false);\n        });\n    }),\n\n    initMembership() {\n        Ember.set(this, 'addedIndividuals', []);\n        Ember.set(this, 'removedIndividuals', []);\n        Ember.set(this, 'inclusions', []);\n        Ember.set(this, 'exclusions', []);\n        Ember.set(this, 'membership', []);\n    },\n\n    _individualsOperation(group, individuals, application, method) {\n        if (_.isEmpty(individuals)) {\n            return Ember.RSVP.resolve({});\n        }\n\n        const ids = [];\n        individuals.map(i => ids.push(`${i.id}`));\n\n        let url = application.pcV2Uri(`api/v2/groups/${group.get('id')}/members`);\n        if (method.toLowerCase() === 'post') {\n            return request(url, {\n                data: {\n                    memberIds: ids,\n                    version: group.get('version')\n                },\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        } else if (method.toLowerCase() === 'delete') {\n            url = url.concat('?ids=', ids);\n            return request(url, {\n                method: method,\n                headers: {\n                    'Content-Type': 'application/json'\n                }\n            }).then(() => {\n                return group;\n            });\n        }\n\n        return request(url, {\n            data: JSON.stringify({}),\n            method: method\n        }).then(res => {\n            const version = get(res, 'rel.version');\n            group.set('version', version);\n            return group;\n        });\n    },\n\n    saveIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'post');\n    },\n\n    deleteIndividuals(group, individuals, application) {\n        return this._individualsOperation(group, individuals, application, 'delete');\n    },\n\n    loadOwners: task(function* () {\n        yield this.loadPathFieldMembers('owners.owners');\n    }).drop(),\n\n    loadIndividuals: task(function* () {\n        yield this.loadPathFieldMembers('individuals.individuals');\n        const addedIndividuals = this.get('addedIndividuals');\n        const membership = this.get('membership');\n\n        if (membership) {\n            membership.addObjects(addedIndividuals);\n        }\n    }).drop(),\n\n    addKeyword(keyword) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const query = equals(keyword.field, keyword.value, this.get('intl'));\n        const data = {\n            q: [query],\n            entity: ['people']\n        };\n        const path = `membership.${key}`;\n        group.set(path, data);\n    },\n\n    addPerson(person) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const data = person.get('id');\n        if (key === 'owners' && !this.isOwner(person)) {\n            group.set('owners.owners', data);\n            const latestAdded = group.get('owners.owners').findBy('value', data);\n            if (latestAdded) {\n                Ember.set(latestAdded, 'guid', data);\n            }\n            this.get('loadOwners').perform();\n        } else if (key === 'individuals' && !this.isIndividual(person)) {\n            const addedIndividuals = this.get('addedIndividuals');\n            if (addedIndividuals) {\n                addedIndividuals.addObject(person);\n            }\n            const removedIndividuals = this.get('removedIndividuals');\n            if (removedIndividuals) {\n                removedIndividuals.removeObject(person);\n            }\n            const membership = this.get('membership');\n            if (membership) {\n                membership.addObject(person);\n            }\n\n            this.get('loadIndividuals').perform();\n        } else if (key === 'inclusions' || key === 'exclusions') {\n            const addedRules = this.get(key);\n            const query = personQuery(['self'], person);\n            const data = {\n                q: [query],\n                entity: ['people']\n            };\n            addedRules.addObject(data);\n        }\n    },\n\n    removePerson(person, memberTypeList) {\n        if (_.isEmpty(memberTypeList)) {\n            memberTypeList = [singularize(this.get('filter.key'))];\n        }\n        memberTypeList.forEach(type => {\n            let path = null;\n            const currentFilter = this.get('filter').path;\n\n            if (type === 'owner') {\n                path = 'owners.owners';\n            }\n\n            if (currentFilter === 'individuals.individuals') {\n                // it is possible that an owner can also be an individual\n                path = 'individuals.individuals';\n                const removedIndividuals = this.get('removedIndividuals');\n                if (removedIndividuals) {\n                    removedIndividuals.addObject(person);\n                }\n                const addedIndividuals = this.get('addedIndividuals');\n                if (addedIndividuals) {\n                    addedIndividuals.removeObject(person);\n                }\n            }\n\n            if (!path) {\n                return;\n            }\n\n            const group = this.get('group');\n            const id = person.get('id');\n            const values = group.getFieldValue(path);\n            const index = _.findIndex(values, value => {\n                if (value.value.q) {\n                    const q = _.head(value.value.q);\n                    return q.value === id || q.guid === id;\n                }\n                return value.value === id || value.guid === id;\n            });\n            if (index > -1) {\n                values.removeAt(index);\n                group.notifyPropertyChange(path);\n            }\n        });\n\n        const membership = this.get('membership');\n        if (membership) {\n            membership.removeObject(person);\n        }\n    },\n\n    removeRule(rule) {\n        const key = this.get('filter.key');\n        const group = this.get('group');\n        const keypath = `membership.${key}`;\n        const values = group.getFieldValue(keypath);\n        const index = _.findIndex(values, value => {\n            if (value._id && rule._id) {\n                return value._id === rule._id;\n            } else {\n                const groupData = _.head(value.value.q);\n                const ruleData = _.head(rule.value.q);\n                return groupData.value === ruleData.value && groupData.key === ruleData.key;\n            }\n        });\n        this.get(key).removeObject(rule.value);\n        if (index > -1) {\n            return values.removeAt(index);\n        }\n    },\n\n    loadContentOnScroll: task(function* () {\n        if (this.get('rateLimited')) return;\n\n        if (this.get('ignoreScroll')) {\n            this.set('ignoreScroll', false);\n        } else {\n            yield timeout(200);\n            if (this.get('loading.search')) {\n                return;\n            }\n            const listing = this.$('.membership-listing');\n            const scroll = listing.scrollTop();\n            const height = listing.prop('scrollHeight') - listing.height();\n\n            if (height - scroll > 500) {\n                return;\n            }\n\n            const filterKey = this.get('filter.key');\n            const isSearching = this.get('isSearching') || filterKey === 'rules';\n            const isEditing = this.get('editing') && ['owners', 'individuals'].indexOf(filterKey) > -1;\n\n            let promise;\n            if (isSearching) {\n                promise = this.loadSearchMembers();\n            } else if (isEditing || filterKey === 'individuals' || filterKey === 'owners') {\n                const path = filterKey === 'owners' ? 'owners.owners' : 'individuals.individuals';\n                promise = this.loadPathFieldMembers(path);\n            } else {\n                promise = this.loadMembershipList();\n            }\n\n            return promise.then(newMembership => {\n                const meta = newMembership && newMembership._meta;\n                const isLastPage = meta && meta.pageCount === meta.pageNumber;\n                Ember.set(this, 'loadedAll', _.isEmpty(newMembership) || isLastPage);\n            });\n        }\n    }).drop(),\n\n    loadSearchMembers() {\n        const loading = this.get('loading.search');\n        const loadedAll = this.get('loadedAll');\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        this.set('currentlySearching', true);\n        this.set('loading.search', true);\n        return this.searchMembership(this.get('search')).then(content => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n            if (Array.isArray(content.content)) {\n                content = content.content.map(x => x.getRecord());\n            }\n            this.set('loading.search', false);\n            const key = this.get('filter.key');\n            if (key !== 'all' && key !== 'rules') {\n                const filter = this.get(`group.${key}.${key}`);\n                if (filter) {\n                    const peopleIds = filter.mapBy('guid');\n                    content = _.filter(content, person => {\n                        return _.includes(peopleIds, person.get('id'));\n                    });\n                }\n            } else if (key === 'rules' && _.isEmpty(this.get('inclusionQueries'))) {\n                content = [];\n            }\n            if (this.get('currentPage')) {\n                this.get('membership').pushObjects(content || []);\n            } else {\n                Ember.set(this, 'membership', content);\n            }\n            this.incrementProperty('currentPage');\n            return content;\n        });\n    },\n\n    loadMembershipList() {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n        const editing = this.get('editing');\n        if (loading || loadedAll || editing) {\n            return Ember.RSVP.resolve([]);\n        }\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n        Ember.set(this, 'loading.search', true);\n        const promise = this.get('store')\n            .findGroupMembership(this.get('group.id'), query)\n            .then(membership => {\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n\n                if (membership) {\n                    const promises = membership.map(member => {\n                        if (member.get('type') === 'user') {\n                            return member.get('profile').then(person => person);\n                        } else {\n                            return member\n                                .reload()\n                                .then(res => {\n                                    return res;\n                                })\n                                .catch(err => {\n                                    if (!this.isDestroying && !this.isDestroyed) {\n                                        if (err.errors[0].status === 429) {\n                                            if (!this.get('rateLimited')) {\n                                                this.set('membershipQuery.offset', query.offset - query.limit);\n                                                this.set('rateLimited', true);\n                                                this.get('notification').error(\n                                                    this.get('intl').t('notification.group.errors.rateLimit.title'),\n                                                    this.get('intl').t('notification.group.errors.rateLimit.message')\n                                                );\n\n                                                this.set(\n                                                    'retryTimeout',\n                                                    Ember.run.later(() => {\n                                                        this.set('rateLimited', false);\n                                                    }, this.get('retyTimeOutDuration'))\n                                                );\n                                            }\n                                        }\n                                    }\n                                });\n                        }\n                    });\n\n                    Ember.RSVP.allSettled(promises).then(results => {\n                        const filteredResults = results\n                            .map(r => r.value)\n                            .filter(r => {\n                                return r && r.isError !== true;\n                            });\n                        const allMemberships = _.uniqBy([...this.get('membership'), ...filteredResults], 'id');\n\n                        this.get('membership').setObjects(allMemberships);\n                    });\n                } else {\n                    this.get('membership').addObjects(membership);\n                }\n                Ember.set(this, 'loading.search', false);\n                return membership;\n            });\n        Ember.set(this, 'currentMembershipRequest', DS.PromiseArray.create({ promise }));\n\n        return promise;\n    },\n\n    setRulesOnGroup() {\n        const group = this.get('group');\n        _.forEach(this.get('inclusions'), rule => group.set('membership.inclusions', rule));\n        Ember.set(this, 'inclusions', []);\n\n        _.forEach(this.get('exclusions'), rule => group.set('membership.exclusions', rule));\n        Ember.set(this, 'exclusions', []);\n    },\n\n    isOwner(person) {\n        return this.get('group').isPersonOwner(person);\n    },\n\n    isIndividual(person) {\n        return this.get('group').isPersonIndividual(person);\n    },\n\n    loadPathFieldMembers(path) {\n        const loadedAll = this.get('loadedAll');\n        const loading = this.get('loading.search');\n\n        if (loading || loadedAll) {\n            return Ember.RSVP.resolve([]);\n        }\n        let ids;\n        let fieldData = this.get(`group.${path}`);\n        if (fieldData) {\n            ids = fieldData.mapBy('guid');\n        }\n\n        const query = this.get('membershipQuery');\n        if (this.get('currentlySearching')) {\n            Ember.set(query, 'offset', 0);\n        }\n\n        if (_.isEmpty(ids)) {\n            Ember.set(this, 'loading.search', false);\n            Ember.set(this, 'membership', []);\n            return Ember.RSVP.resolve([]);\n        }\n        if (!Array.isArray(ids)) {\n            ids = [ids];\n        }\n\n        const updateOffset = ids.length > this.memberListLimitSize;\n\n        ids = ids.slice(query.offset, query.offset + query.limit);\n\n        if (updateOffset) {\n            Ember.set(this, 'membershipQuery.offset', query.offset + query.limit);\n        }\n        Ember.set(this, 'loading.search', true);\n\n        return this.get('store')\n            .findMany('person', ids, BASE_PERSON)\n            .then(content => {\n                if (this.isDestroying || this.isDestroyed) {\n                    return;\n                }\n\n                if (this.get('currentlySearching')) {\n                    Ember.set(this, 'membership', []);\n                    Ember.set(this, 'currentlySearching', false);\n                }\n\n                if (!Array.isArray(content)) {\n                    content = [content];\n                }\n\n                content = this.sort(content);\n\n                Ember.set(this, 'loading.search', false);\n                this.get('membership').addObjects(content);\n                return content;\n            });\n    },\n\n    sort(content) {\n        return content.sort((a, b) => {\n            const aName = a.get('name');\n            const bName = b.get('name');\n            if (aName > bName) {\n                return 1;\n            }\n            if (aName < bName) {\n                return -1;\n            }\n            return 0;\n        });\n    },\n\n    loadRules: task(function* () {\n        const isPending = this.get('page.isPending');\n        if (isPending) {\n            return;\n        }\n        Ember.set(this, 'currentPage', 0);\n        Ember.set(this, 'loadedAll', false);\n        yield this.loadSearchMembers();\n    }),\n\n    loadAll: task(function* () {\n        yield this.loadMembershipList();\n    }),\n\n    handleJobFinish() {\n        this.get('loadAll').perform();\n        this.get('group').reload();\n    },\n\n    searchMembership(search) {\n        if (search && search.length < 2) {\n            return Ember.RSVP.resolve([]);\n        }\n        const builder = this.get('searchService').requestBuilder();\n        const group = this.get('group');\n        const fieldPath = `${group.getFieldValue('general.groupType').value}.guid`;\n        builder.addQuery(group.get('guid'), 'AND', 'EXACT', [fieldPath]);\n        if (search) {\n            builder.addQuery(search);\n        }\n\n        // Add pagination support\n        const currentPage = this.get('currentPage') || 0;\n        const pageSize = 25; // Default search page size (matches search service default)\n        builder.setPaging(currentPage + 1, pageSize);\n        return this.get('searchService').performCustomSearch(builder);\n    },\n\n    loadMoreMembersOnInit() {\n        if (this.get('group.memberCount') <= 10) {\n            return;\n        }\n\n        let listingEl = this.$('.membership-listing');\n        if (!listingEl) {\n            return;\n        }\n\n        // Sometimes we've gotta load the second page depending on how much available screen\n        // space the user has. Otherwise they can't load more members!\n        let containerHeight = listingEl.height();\n        let heightPerEntry = 90;\n        if (containerHeight / heightPerEntry < this.get('membership.length')) {\n            return;\n        }\n\n        return this.get('loadContentOnScroll').perform();\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"8dp6s8U+\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"isDynamicGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"expression-display\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[26,[\\\"expressionDisplay\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn show-dynamic-rules\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"dynamicRules\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.expressions.edit\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-header\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-5\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canViewRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"small\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRules\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewMembership\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.viewRules\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[9,\\\"gux-button-multi\\\",{\\\"attrs\\\":[[16,\\\"text\\\",[34,[[26,[\\\"dropdownTitle\\\"]]]]],[15,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"class\\\",\\\"group-profile-members-button\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"showingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[9,\\\"gux-list-item\\\",{\\\"attrs\\\":[[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]],null],null],[16,\\\"class\\\",[34,[[28,[\\\"filter\\\",\\\"key\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"]]}],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editMembership\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"membershipToggleLabel\\\"],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-switch-wrapper\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"toggleCallsEnabled\\\"]]],null]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"filter-tabs\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"nav nav-tabs\\\"],[15,\\\"role\\\",\\\"tablist\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"editingFilterChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"filter\\\",\\\"active\\\"]],\\\"active\\\"],null],\\\" \\\",[28,[\\\"filter\\\",\\\"key\\\"]],\\\"-tab\\\"]]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"role\\\",\\\"tab\\\"],[16,\\\"aria-selected\\\",[34,[[28,[\\\"filter\\\",\\\"active\\\"]]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"selectFilter\\\",[28,[\\\"filter\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"filter\\\",\\\"string\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"filter\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"membership-search\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"editing\\\",\\\"updateSearch\\\",\\\"filter\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"search\\\"]],[28,[\\\"editing\\\"]],\\\"updateSearch\\\",[28,[\\\"filter\\\"]],\\\"search\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"membership-listing \\\",[33,[\\\"if\\\"],[[28,[\\\"editing\\\"]],\\\"editing\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"shouldShowRules\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"group\\\",\\\"allowPermissionGroup\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"alert alert-warning roles-rules-info-message\\\"],[15,\\\"role\\\",\\\"alert\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-info-circle\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.rulesDisabledMessage\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membershipRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"group-profile/membership-rule-entry\\\"],null,[[\\\"rule\\\",\\\"group\\\",\\\"editing\\\",\\\"filter\\\",\\\"deleteRule\\\"],[[28,[\\\"rule\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"filter\\\"]],\\\"removeRule\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"rule\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"membership\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12 member\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-entry\\\"],null,[[\\\"person\\\",\\\"group\\\",\\\"editing\\\",\\\"individuals\\\",\\\"membership\\\",\\\"deletePerson\\\"],[[28,[\\\"member\\\"]],[28,[\\\"group\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"addedIndividuals\\\"]],[28,[\\\"membership\\\"]],\\\"removePerson\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"member\\\"]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"search\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center empty\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResults\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayEditingFooter\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"editing-footer\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"add-member \\\",[33,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]],\\\"col-sm-6\\\",\\\"col-sm-12\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/membership-search\\\"],null,[[\\\"group\\\",\\\"loading\\\",\\\"filter\\\",\\\"selectPerson\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"loading\\\",\\\"add\\\"]],[28,[\\\"filter\\\"]],\\\"selectPerson\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRules\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"add-keyword col-sm-6\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/membership-tag-search\\\"],null,[[\\\"group\\\",\\\"filter\\\",\\\"selectKeyword\\\",\\\"mode\\\"],[[28,[\\\"group\\\"]],[28,[\\\"filter\\\"]],\\\"selectKeyword\\\",\\\"add\\\"]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"submit col-sm-12\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"group\\\",\\\"isSaving\\\"]],[28,[\\\"saving\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"group\\\",\\\"isReloading\\\"]],[33,[\\\"not\\\"],[[28,[\\\"saving\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-listing/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from '../../../mixins/logger';\n\nconst { computed, Component } = Ember;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['group-membership-rule-entry'],\n\n    store: Ember.inject.service(),\n\n    rule: null,\n    group: null,\n    filter: null,\n    editing: false,\n\n    relationships: ['ancestors', 'parent', 'self', 'siblings', 'children', 'descendants'],\n    groupedRelationships: [\n        ['ancestors', 'parent'],\n        ['self', 'siblings'],\n        ['children', 'descendants']\n    ],\n\n    actions: {\n        toggleRelationship(relationship) {\n            const key = `graph.${relationship}`;\n            this.toggleProperty(key);\n            const value = this.get(key);\n            const field = this.get('rule');\n            const { rels } = _.last(Ember.get(field, 'value.q'));\n            if (value) {\n                rels.addObject(relationship);\n            } else {\n                rels.removeObject(relationship);\n            }\n        },\n\n        deleteRule() {\n            this.sendAction('deleteRule', this.get('rule'));\n        }\n    },\n\n    isKeyword: computed('rule.value.q.@each.type', function () {\n        const q = this.get('rule.value.q');\n        return _.head(q).type === 'equals';\n    }),\n\n    relationshipGroups: computed(\n        'groupedRelationships',\n        'graph.{self,parent,ancestors,siblings,children,descendants}',\n        function () {\n            const groupedRelationships = this.get('groupedRelationships');\n            return groupedRelationships.map(group => {\n                return group.map(relationship => {\n                    return {\n                        relationship,\n                        key: `person.graph.${relationship}`,\n                        selected: this.relationshipSelected(relationship)\n                    };\n                });\n            });\n        }\n    ),\n\n    field: computed('group', 'filter.key', function () {\n        const key = this.get('filter.key');\n        return this.get(`group.fieldConfig.membership.${key}`);\n    }),\n\n    person: computed('rule.value.q.@each.value', 'isKeyword', function () {\n        if (this.get('isKeyword')) {\n            return;\n        }\n        const q = this.get('rule.value.q');\n        let guid = _.head(q).guid;\n        let oid = _.head(q).value;\n        if (!guid && !!oid) {\n            // We've got a weird case where a guid value was not populated by directory\n            // Log and take these errors to directory team so they can migrate\n            this.logger.error('Found a group rule entry without a guid value', {\n                group: this.get('group.id')\n            });\n        }\n        return this.get('store').findRecord('person', guid || oid);\n    }),\n\n    graph: computed('rule.value.q.@each.rels', function () {\n        const q = this.get('rule.value.q');\n        return this.buildGraphFromRelationships(_.head(q).rels);\n    }),\n\n    name: computed('person.name', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).value;\n        }\n        return this.get('person.name');\n    }),\n\n    title: computed('person.title', 'isKeyword', 'rule', function () {\n        if (this.get('isKeyword')) {\n            const q = this.get('rule.value.q');\n            return _.head(q).key;\n        }\n        return this.get('person.title');\n    }),\n\n    relationshipSelected(relationship) {\n        return this.get('graph')[relationship];\n    },\n\n    buildGraphFromRelationships(rels) {\n        const graph = {};\n        _.forEach(rels, rel => {\n            graph[rel] = true;\n        });\n        const defaults = {\n            ancestors: false,\n            parent: false,\n            self: false,\n            siblings: false,\n            children: false,\n            descendants: false\n        };\n        const options = Object.assign({}, defaults, graph);\n        return Ember.Object.create(options);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // If this entry fails to load due to the person record\n        // not being found, let's log it\n        let person = this.get('person');\n        if (!person || !person.catch) {\n            return;\n        }\n        person.catch(error => {\n            this.logger.error('Error loading membership rule entry', {\n                error\n            });\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"+jW7/wZi\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null],true]],{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[33,[\\\"await\\\"],[[28,[\\\"person\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"information\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-name\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[26,[\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-title\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"title\\\"]]],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[26,[\\\"title\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isKeyword\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"relationships\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"relationshipGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-group\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn btn-purecloud \\\",[33,[\\\"if\\\"],[[28,[\\\"relationship\\\",\\\"selected\\\"]],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleRelationship\\\",[28,[\\\"relationship\\\",\\\"relationship\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[[28,[\\\"relationship\\\",\\\"key\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"relationship\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"graph\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"person-graph\\\"],null,[[\\\"person\\\",\\\"width\\\",\\\"height\\\",\\\"graph\\\",\\\"mini\\\"],[[28,[\\\"person\\\"]],50,50,[28,[\\\"graph\\\"]],true]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"editing\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"delete danger\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteRule\\\"]],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-rule-entry/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SearchMixin } from '../../../mixins/search';\n\nconst { get, run, inject, computed, observer, Component } = Ember;\n\nfunction removeDuplicates(group, key, results) {\n    let currentIds;\n    const current = group.getFieldValue(key);\n    if (current) {\n        currentIds = current.mapBy('value');\n    }\n    if (_.includes(key, 'membership')) {\n        currentIds = currentIds.map(id => {\n            const data = _.head(id.q) || {};\n            return Ember.get(data, 'value');\n        });\n    }\n    if (results && currentIds.length) {\n        return results.filter(result => {\n            const id = result.get('id');\n            return !currentIds.includes(id);\n        });\n    }\n    return results;\n}\n\nexport default Component.extend(SearchMixin, {\n    classNames: ['group-membership-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    entityFilter: 'people',\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    searchLimit: 6,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n            this.updateSearchOnChange();\n        },\n\n        select(person) {\n            this.sendAction('selectPerson', person);\n            this.resetPersonSearch();\n        },\n\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange();\n        },\n\n        handleKeyDown(index, event) {\n            const items = this.element.querySelectorAll('[role=\"menuitem\"]');\n            const totalItems = items.length;\n\n            switch (event.key) {\n                case 'ArrowDown':\n                    event.preventDefault();\n                    const nextIndex = (index + 1) % totalItems;\n                    this.updateTabIndex(items, nextIndex);\n                    items[nextIndex].focus();\n                    break;\n\n                case 'ArrowUp':\n                    event.preventDefault();\n                    const prevIndex = (index - 1 + totalItems) % totalItems;\n                    this.updateTabIndex(items, prevIndex);\n                    items[prevIndex].focus();\n                    break;\n\n                case 'Enter':\n                case ' ':\n                    event.preventDefault();\n                    const results = this.get('results');\n                    this.send('select', results.objectAt(index));\n                    break;\n\n                case 'Escape':\n                    event.preventDefault();\n                    this.resetPersonSearch();\n                    this.element.querySelector('input').focus();\n                    break;\n\n                case 'Home':\n                    event.preventDefault();\n                    this.updateTabIndex(items, 0);\n                    items[0].focus();\n                    break;\n\n                case 'End':\n                    event.preventDefault();\n                    this.updateTabIndex(items, totalItems - 1);\n                    items[totalItems - 1].focus();\n                    break;\n            }\n        }\n    },\n\n    isRules: computed('filter.key', function () {\n        const key = this.get('filter.key');\n        return key === 'inclusions' || key === 'exclusions';\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-moon pc-search';\n        }\n        return 'pc pc-add-person';\n    }),\n\n    searchText: computed('mode', function () {\n        const intl = this.get('intl');\n        if (this.get('mode') === 'search') {\n            return intl.lookup('groups.searchMembers').toString();\n        }\n        return intl.lookup('groups.addPerson').toString();\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    results: computed('searchResults.[]', function () {\n        const group = this.get('group');\n        const key = this.get('filter.path');\n        return removeDuplicates(group, key, this.get('searchResults'));\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    resultsChanged: observer('results.[]', function () {\n        run.scheduleOnce('afterRender', this, () => {\n            const results = this.get('results');\n            if (results && results.length > 0) {\n                const firstItem = this.element.querySelector('[role=\"menuitem\"]');\n                if (firstItem) {\n                    firstItem.focus();\n                }\n            }\n        });\n    }),\n\n    didUpdateAttrs({ newAttrs, oldAttrs }) {\n        if (!newAttrs || !oldAttrs) {\n            return;\n        }\n\n        if (get(newAttrs, 'editing.value') !== get(oldAttrs, 'editing.value')) {\n            this.set('searchValue', null);\n        }\n    },\n\n    didReceiveAttrs() {\n        const filter = this.get('filter');\n        const previousFilter = this.get('_previousFilter');\n        if (previousFilter && filter !== previousFilter) {\n            this.set('searchValue', '');\n        }\n        this.set('_previousFilter', filter);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    updateSearchOnChange() {\n        if (this.get('mode') === 'search') {\n            this.sendAction('updateSearch', this.get('searchValue'));\n        } else {\n            run.debounce(this, this.performPersonSearch, 300);\n        }\n    },\n\n    attachOutsideHandler() {\n        Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetPersonSearch();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    },\n\n    performPersonSearch() {\n        const search = this.get('searchValue');\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            this.get('search')\n                .performSearch(search, 0, 'users')\n                .then(({ results }) => {\n                    this.set('loading', false);\n                    this.set('searchResults', results);\n                });\n        } else {\n            this.set('searchResults', []);\n            this.set('searchMeta', {});\n        }\n    },\n\n    resetPersonSearch() {\n        this.set('searchValue', '');\n        this.set('searchResults', []);\n        this.set('searchMeta', {});\n    },\n\n    updateTabIndex(items, focusIndex) {\n        items.forEach((item, idx) => {\n            item.setAttribute('tabindex', idx === focusIndex ? '0' : '-1');\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"RCG3b8FL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMembers\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-search\\\"]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results show dropdown-menu \\\",[33,[\\\"if\\\"],[[28,[\\\"isKeyword\\\"]],\\\"keyword\\\"],null]]]],[15,\\\"role\\\",\\\"menu\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[16,\\\"tabindex\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"index\\\"]],0],null],\\\"0\\\",\\\"-1\\\"],null]]]],[15,\\\"role\\\",\\\"menuitem\\\"],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"handleKeyDown\\\",[28,[\\\"index\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"select\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[28,[\\\"result\\\"]],true]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"result\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"name\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"result\\\",\\\"department\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\",\\\"index\\\"]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"li\\\",[]],[15,\\\"role\\\",\\\"presentation\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-search/template.hbs\"}});","import Ember from 'ember';\n\nimport { SEARCH_FACET_KEYPATHS } from '../../../search/service';\nimport _ from 'lodash';\n\nconst { on, inject, computed, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['group-membership-search', 'tag-search'],\n\n    intl: inject.service(),\n    search: inject.service(),\n\n    group: null,\n    searchValue: null,\n    mode: null,\n    filter: null,\n\n    loading: false,\n    editing: false,\n\n    actions: {\n        clearSearch() {\n            this.set('searchValue', '');\n        },\n\n        keyword(keyword) {\n            this.sendAction('selectKeyword', keyword);\n            this.resetSearch();\n        },\n\n        updateSearch(event) {\n            const value = event.target.value;\n            this.set('searchValue', value);\n            if (this.get('mode') === 'search') {\n                this.sendAction('updateSearch', value);\n            } else if (value === '') {\n                this.resetSearch();\n            } else {\n                Ember.run.debounce(this, this.performSearch, value, 250);\n            }\n        }\n    },\n\n    searchText: computed(function () {\n        return this.get('intl').lookup('groups.addKeyword').toString();\n    }),\n\n    results: computed('tagSearchResults.[]', function () {\n        return this.get('tagSearchResults');\n    }),\n\n    iconClass: computed('iconClass', function () {\n        if (this.get('mode') === 'search') {\n            return 'pc-search';\n        }\n        return 'pc-add-person';\n    }),\n\n    dismissed: computed('results.[]', function () {\n        return _.isEmpty(this.get('results'));\n    }),\n\n    editingStateChanged: observer('editing', function () {\n        if (!_.isEmpty(this.get('searchValue'))) {\n            this.set('searchValue', '');\n        }\n    }),\n\n    currentSearchRequestUpdated: observer('currentSearchRequest', function () {\n        this.get('currentSearchRequest').then(() => {\n            this.set('loading', false);\n        });\n    }),\n\n    showSearchResults: computed('mode', 'dismissed', 'results.[]', function () {\n        const mode = this.get('mode');\n        const dismissed = this.get('dismissed');\n        return mode === 'add' && !dismissed;\n    }),\n\n    attachOutsideHandler: on('didInsertElement', function () {\n        return Ember.$(window).on(`click.${this.get('elementId')}`, event => {\n            Ember.run(() => {\n                if (this.get('dismissed')) {\n                    return;\n                }\n                const target = Ember.$(event.target);\n                if (!target.parents('.group-membership-search').length) {\n                    this.resetSearch();\n                }\n            });\n        });\n    }),\n\n    removeOutsideHandler: on('willDestroyElement', function () {\n        Ember.$(window).off(`.${this.get('elementId')}`);\n    }),\n\n    performSearch(search) {\n        if (!_.isEmpty(search.trim())) {\n            this.set('loading', true);\n\n            const type = 'CONTAINS';\n            const builder = this.get('search').requestBuilder();\n            const fields = ['profileSkills', 'department', 'certifications', 'title'];\n            builder.addAggregations(\n                ['profileSkills', search, 'profileSkills', type, 5],\n                ['department', search, 'department', type, 5],\n                ['certifications', search, 'certifications', type, 5],\n                ['title', search, 'title', type, 5]\n            );\n            this.get('search')\n                .performCustomSearch(builder)\n                .then(data => {\n                    this.set('loading', false);\n                    const results = fields.map(field => {\n                        const aggregates = data[field];\n                        return aggregates.map(aggregate => {\n                            return {\n                                field: SEARCH_FACET_KEYPATHS[field],\n                                value: aggregate.key\n                            };\n                        });\n                    });\n                    this.set('results', _.flatten(results));\n                });\n        }\n    },\n\n    resetSearch() {\n        this.set('loading', false);\n        this.set('searchValue', '');\n        this.set('results', []);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"7cwxw4o7\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"searchValue\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-close clickable\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearSearch\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[26,[\\\"iconClass\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"\\\\n\\\"],[11,\\\"label\\\",[]],[15,\\\"class\\\",\\\"hidden\\\"],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.searchMemberTags\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[11,\\\"input\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-membership-tag-search\\\"]]],[16,\\\"value\\\",[34,[[26,[\\\"searchValue\\\"]]]]],[15,\\\"class\\\",\\\"form-control purecloud-input\\\"],[16,\\\"placeholder\\\",[34,[[26,[\\\"searchText\\\"]]]]],[16,\\\"oninput\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"updateSearch\\\"],[[\\\"on\\\"],[\\\"input\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showSearchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"search-results show dropdown-menu keyword\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"results-content\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"results\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"keyword\\\",[28,[\\\"result\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"image\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-keyword\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"info\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"result\\\",\\\"value\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"tag-lookup\\\"],[[28,[\\\"result\\\",\\\"field\\\"]]],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"result\\\"]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.noResultsDuplicateEntries\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/membership-tag-search/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport JobMixin from '../../../mixins/job';\n\nexport default Ember.Component.extend(JobMixin, {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    session: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n\n    isEditingRoles: false,\n    displayRoleRemoveModal: false,\n    rolesToDelete: [],\n    displayRulesRolesWarningModel: false,\n\n    // tracks all unsaved grant changes when editing roles for group\n    unsavedGrants: new Ember.Object({\n        roles: {}, //map of roles that contains a map of unsaved-grant objects\n        _hasUnsavedGrants: false,\n        parent: undefined, //pass reference after instantiation\n        hasUnsavedGrants: undefined, //create computed after instantiation\n        add({ grantId, roleId, divisionId }) {\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            //if grant already exists, then just make sure we don't delete it\n            if (grantModel) {\n                delete this.get('roles')[roleId][grantId];\n            } else {\n                this.get('roles')[roleId][grantId] = {\n                    action: 'save',\n                    roleId,\n                    divisionId\n                };\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        remove({ grantId, roleId }) {\n            if (!this.get('roles')[roleId]) {\n                this.get('roles')[roleId] = {};\n            }\n            const grantModel = this.get('parent.store').peekRecord('grant', grantId);\n            if (grantModel) {\n                this.get('roles')[roleId][grantId] = { action: 'delete' };\n            } else {\n                delete this.get('roles')[roleId][grantId];\n            }\n            this.recalculateHasUnsavedGrants();\n        },\n        addAllFutureDivisions({ grantId, roleId }) {\n            this.get('roles')[roleId] = {};\n            this.add({ divisionId: '*', roleId, grantId });\n        },\n        removeAllFutureDivisions(roleId, grantId) {\n            this.remove({ roleId, grantId });\n        },\n        recalculateHasUnsavedGrants() {\n            const grantMaps = _.values(this.get('roles'));\n            let hasUnsavedGrants = false;\n            grantMaps.forEach(grantMap => {\n                if (Object.keys(grantMap).length) {\n                    hasUnsavedGrants = true;\n                }\n            });\n            this.set('_hasUnsavedGrants', hasUnsavedGrants);\n        },\n        clear() {\n            this.set('roles', {});\n            this.recalculateHasUnsavedGrants();\n        }\n    }),\n\n    groupRolesViewColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'role.name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-view'\n        };\n        const typeColumn = {\n            key: 'role.type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-view'\n        };\n        const descriptionColumn = {\n            key: 'role.description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-view'\n        };\n        const divisionsViewColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '255px',\n            component: 'group-profile/roles-edit/fixtable/division-view',\n            cellClass: 't-role-divisions-view'\n        };\n        const deleteColumn = {\n            header: 'delete button',\n            hideLabel: true,\n            component: 'group-profile/roles-edit/fixtable/list-remove',\n            iconClass: 'fa fa-times',\n            width: '1px',\n            class: 'list-remove-button'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsViewColumn, deleteColumn];\n    }),\n\n    groupRolesEditColumns: Ember.computed('model', 'session.features', function () {\n        const nameColumn = {\n            key: 'name',\n            header: this.get('intl').lookup('groups.roles.name'),\n            cellClass: 't-role-name-edit'\n        };\n        const typeColumn = {\n            key: 'type',\n            header: this.get('intl').lookup('groups.roles.type'),\n            cellClass: 't-role-type-edit'\n        };\n        const descriptionColumn = {\n            key: 'description',\n            header: this.get('intl').lookup('common.description'),\n            cellClass: 't-role-description-edit'\n        };\n        const divisionsEditColumn = {\n            key: 'divisions',\n            header: this.get('intl').lookup('groups.roles.divisions'),\n            width: '350px',\n            component: 'group-profile/roles-edit/fixtable/division-select',\n            cellClass: 't-role-divisions-edit'\n        };\n        const assignmentColumn = {\n            header: this.get('intl').lookup('groups.roles.selection'),\n            component: 'group-profile/roles-edit/fixtable/is-assigned-toggle',\n            width: '1px',\n            cellClass: 't-role-is-assigned'\n        };\n\n        return [nameColumn, typeColumn, descriptionColumn, divisionsEditColumn, assignmentColumn];\n    }),\n\n    hasRules: Ember.computed('model.membership.inclusions', 'model.membership.exclusions', function () {\n        return (\n            !_.isEmpty(this.get('model.membership.inclusions')) || !_.isEmpty(this.get('model.membership.exclusions'))\n        );\n    }),\n\n    actions: {\n        editRoles() {\n            if (this.get('hasRules')) {\n                this.set('displayRulesRolesWarningModel', true);\n            } else {\n                this.set('isEditingRoles', true);\n                this.set('allRolesFiltered', this.get('allRoles'));\n            }\n        },\n\n        toggleRolesEnabled() {\n            this._toggleRolesEnabled();\n        },\n\n        confirmWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n            this._enableRoles();\n        },\n\n        closeRulesRolesWarningModal() {\n            this.set('displayRulesRolesWarningModel', false);\n        },\n\n        getGroupRoles() {\n            this._getGroupRoles();\n        },\n\n        deleteRoles() {\n            this._deleteRoles();\n        },\n\n        openConfirmModelSingleRole(roleId) {\n            const grantRole = this.get('groupAssignedRoles.list').find(grantRoles => {\n                return Ember.get(grantRoles, 'id') === roleId;\n            });\n            this.set('rolesToDelete', [grantRole.role]);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        openConfirmModelMultipleRole(divisionRoles) {\n            let roles = divisionRoles.map(divisionRole => {\n                return divisionRole.role;\n            });\n            this.set('rolesToDelete', roles);\n            this.set('displayRoleRemoveModal', true);\n        },\n\n        save() {\n            this.set('isLoadingAllRoles', true);\n            let rolesToUpdate = {}; //map a role Id to a list of division ids to add that role for bulk save\n            let grantsToDelete = [];\n            let version = this.get('model.grantVersion');\n            _.values(this.get('unsavedGrants.roles')).forEach(grantMap => {\n                _.forOwn(grantMap, ({ action, roleId, divisionId }, grantId) => {\n                    if (action === 'save') {\n                        if (rolesToUpdate[roleId]) {\n                            rolesToUpdate[roleId].pushObject(divisionId);\n                        } else {\n                            rolesToUpdate[roleId] = [divisionId];\n                        }\n                    } else if (action === 'delete') {\n                        const undeletedGrant = this.get('store').peekRecord('grant', grantId);\n                        if (undeletedGrant) {\n                            grantsToDelete.pushObject(undeletedGrant);\n                        }\n                    } else {\n                        Ember.Logger.error('grant actions other than save or delete are not supported');\n                    }\n                });\n            });\n            // Make API calls sequentially to avoid api clobbering data\n            _.reduce(\n                rolesToUpdate,\n                (promise, divisionIds, roleId) => {\n                    return promise.then(() => {\n                        return this.get('store')\n                            .adapterFor('grant')\n                            .saveBulk(roleId, [this.get('model.guid')], divisionIds);\n                    });\n                },\n                Ember.RSVP.Promise.resolve()\n            )\n                .then(() => {\n                    return grantsToDelete.reduce((promise, undeletedGrant) => {\n                        return promise.then(() => {\n                            return undeletedGrant.destroyRecord();\n                        });\n                    }, Ember.RSVP.Promise.resolve());\n                })\n                .then(() => {\n                    this.get('unsavedGrants').clear();\n                    this._stopEditingRoles();\n                    this.get('notification').success(\n                        null,\n                        this.get('intl').lookup('groups.roles.roleAssignmentSaveSuccess')\n                    );\n                    return this._getGroupRoles(version);\n                })\n                .catch(err => {\n                    if (this._isTooManyGrantsError(err)) {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.tooManyGrantsSaveError')\n                        );\n                    } else {\n                        this.get('notification').error(\n                            null,\n                            this.get('intl').lookup('groups.roles.roleAssignmenSaveError')\n                        );\n                    }\n                    Ember.Logger.error('error saving grants', { error: err });\n                })\n                .finally(() => {\n                    this.set('isLoadingAllRoles', false);\n                });\n        },\n\n        searchAssignedRoles(query) {\n            const assignedRoles = this.get('groupAssignedRoles.list');\n            if (!assignedRoles) {\n                return;\n            }\n\n            if (query.length < 2) {\n                this.set('groupAssignedRolesFiltered', assignedRoles);\n            } else {\n                let filteredRoles = assignedRoles.filter(roleDivision => {\n                    return Ember.get(roleDivision, 'role.name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('groupAssignedRolesFiltered', filteredRoles);\n            }\n        },\n\n        searchAllRoles(query) {\n            const allRoles = this.get('allRoles');\n            if (!allRoles) {\n                return;\n            }\n\n            if (query.length < 2) {\n                this.set('allRolesFiltered', allRoles);\n            } else {\n                let filteredRoles = allRoles.filter(role => {\n                    return role.get('name').toLowerCase().includes(query.toLowerCase());\n                });\n                this.set('allRolesFiltered', filteredRoles);\n            }\n        },\n\n        cancel() {\n            this._stopEditingRoles();\n        },\n\n        updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n            this._updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions);\n        },\n\n        closeWarningModal() {\n            this.set('rolesToDelete', []);\n            this.set('displayRoleRemoveModal', false);\n        },\n\n        confirmHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n            this._disableRoles();\n        },\n\n        closeHasRolesWarningModal() {\n            this.set('displayHasRolesWarningModel', false);\n        },\n        toggleRoleAssignment(roleId, isAssigned) {\n            if (isAssigned) {\n                this.get('groupAssignedRoles').addRole(roleId, {});\n            } else {\n                this.get('groupAssignedRoles').removeRole(roleId);\n            }\n        }\n    },\n\n    _stopEditingRoles() {\n        this.get('unsavedGrants').clear();\n        this._getGroupRoles();\n        Ember.trySet(this, 'isEditingRoles', false);\n    },\n\n    _updateUnsavedGrants(roleId, selectedDivisions, previouslySelectedDivisions) {\n        //add selected divisions to unsaved grants map\n        selectedDivisions.forEach(division => {\n            const grantId = this.get('model.guid') + roleId + division.id;\n            this.get('unsavedGrants').add({\n                grantId,\n                roleId,\n                divisionId: division.id\n            });\n        });\n        //remove unselected divisions\n        previouslySelectedDivisions.forEach(division => {\n            let stillSelectedDivision = selectedDivisions.find(stillSelectedDivision => {\n                return division.id === stillSelectedDivision.id;\n            });\n            if (!stillSelectedDivision) {\n                const grantId = this.get('model.guid') + roleId + division.id;\n                this.get('unsavedGrants').remove({ grantId, roleId });\n            }\n        });\n\n        //keep unsaved divisions change between role pages\n        if (selectedDivisions.length) {\n            this.get('groupAssignedRoles').addRole(roleId, {\n                id: roleId,\n                role: this.get('store').peekRecord('role', roleId),\n                divisions: selectedDivisions\n            });\n        } else {\n            this.get('groupAssignedRoles').removeRole(roleId);\n        }\n    },\n\n    _removeRole(role) {\n        let grantsToDelete = [];\n        let divisionRole = this.get('groupAssignedRoles').getRoleWithDivisions(role.id);\n        Ember.get(divisionRole, 'divisions').forEach(division => {\n            const grantId = this.get('model.guid') + Ember.get(role, 'id') + division.get('id');\n            let grantRecord = this.get('store').peekRecord('grant', grantId);\n            grantsToDelete.pushObject(grantRecord);\n        });\n        Ember.set(divisionRole, 'divisions', []);\n        // Make API calls sequentially to avoid api clobbering data\n        return grantsToDelete\n            .reduce((promise, undeletedGrant) => {\n                return promise.then(() => {\n                    return undeletedGrant.destroyRecord();\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(data => {\n                this.get('notification').success(null, this.get('intl').lookup('groups.roles.removeSuccess'));\n                return data;\n            })\n            .catch(err => {\n                this.get('notification').error(null, this.get('intl').lookup('groups.roles.removeError'));\n                return err;\n            });\n    },\n\n    _deleteRoles() {\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        let version = this.get('model.grantVersion');\n        // Make API calls sequentially to avoid api clobbering data\n        return this.get('rolesToDelete')\n            .reduce((promise, role) => {\n                return promise.then(() => {\n                    return this._removeRole(role);\n                });\n            }, Ember.RSVP.Promise.resolve())\n            .then(() => {\n                return this._getGroupRoles(version);\n            })\n            .catch(err => {\n                Ember.Logger.error('error removing selected roles', { error: err });\n            })\n            .finally(() => {\n                this.set('rolesToDelete', []);\n                this.set('displayRoleRemoveModal', false);\n            });\n    },\n\n    _getGroupRoles(previousVersion, attempt = 0) {\n        if (attempt >= 10) {\n            return Ember.RSVP.reject('timed out waiting for group roles to update');\n        }\n        Ember.trySet(this, 'isLoadingGroupRoles', true);\n        const group = this.get('model');\n        if (!group) {\n            Ember.Logger.error('no group for roles edit component. (expected if test)');\n            return;\n        }\n        group\n            .getGrants()\n            .then(grants => {\n                //TODO: Bulk Update Does not Increment Version Number https://inindca.atlassian.net/browse/PLAT-1953\n                // if (previousVersion && this.get('model.grantVersion') <= previousVersion) {\n                //     return new Ember.RSVP.Promise((resolve) => {\n                //         Ember.run.later(() => {\n                //             resolve(this._getGroupRoles(previousVersion, ++attempt));\n                //         }, 500);\n                //     });\n                // }\n                let assignedRolesMap = {};\n                this.get('store').unloadAll('grant');\n                grants.forEach(grant => {\n                    grant.subjectId = this.get('model.guid');\n                    // push grants, roles and divisions to the store\n                    this.get('store').push(this.get('store').normalize('grant', grant));\n                    const role = this.get('store').push(this.get('store').normalize('role', grant.role));\n                    const division = this.get('store').push(this.get('store').normalize('division', grant.division));\n                    if (!assignedRolesMap[grant.role.id]) {\n                        assignedRolesMap[grant.role.id] = {\n                            id: grant.role.id,\n                            role,\n                            divisions: [division]\n                        };\n                    } else {\n                        Ember.get(assignedRolesMap[grant.role.id], 'divisions').pushObject(division);\n                    }\n                });\n                this.get('groupAssignedRoles').setMap(assignedRolesMap);\n                this.set('groupAssignedRolesFiltered', this.get('groupAssignedRoles.list'));\n            })\n            .catch(err => {\n                Ember.Logger.error('failed to load grants', { error: err });\n            })\n            .finally(() => {\n                this.isDestroyed || Ember.trySet(this, 'isLoadingGroupRoles', false); // workaround trySet until we get this fix https://github.com/emberjs/ember.js/pull/13355\n            });\n    },\n\n    _isTooManyGrantsError(err) {\n        return (\n            err &&\n            err.errors &&\n            err.errors.length &&\n            err.errors[0].message &&\n            err.errors[0].message.includes('Too many grants of role')\n        );\n    },\n\n    _toggleRolesEnabled() {\n        const turnOnRoles = !this.get('model.allowPermissionGroup');\n        if (turnOnRoles) {\n            this._toggleRolesOn();\n        } else {\n            this._toggleRolesOff();\n        }\n    },\n\n    _toggleRolesOn() {\n        if (this.get('hasRules')) {\n            this.set('displayRulesRolesWarningModel', true);\n        } else {\n            this._enableRoles();\n        }\n    },\n\n    _toggleRolesOff() {\n        if (this.get('groupAssignedRoles.list.length')) {\n            this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n            this.set('displayHasRolesWarningModel', true);\n        } else {\n            this._disableRoles();\n        }\n    },\n\n    _enableRoles() {\n        let hadRules = false;\n        this.set('isLoadingGroupRoles', true);\n        if (this.get('hasRules')) {\n            hadRules = true;\n            this.set('model.membership.exclusions', []);\n            this.set('model.membership.inclusions', []);\n        }\n        this.set('model.allowPermissionGroup', true);\n        return this.get('model')\n            .save()\n            .then(res => {\n                const job = Ember.get(res, 'meta.job');\n                if (hadRules) {\n                    const message = this.get('intl').lookup('notification.group.membership').toString();\n                    this.get('notification').success(null, message, {\n                        forceBrowserNotification: true\n                    });\n                }\n                if (job && job.jobId) {\n                    this.addJob(\n                        job,\n                        () => {\n                            this.get('model').reload();\n                        },\n                        this\n                    );\n                }\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    _disableRoles() {\n        this.set('isLoadingGroupRoles', true);\n        this.set('rolesToDelete', this.get('groupAssignedRoles.list'));\n        return this._deleteRoles()\n            .then(() => {\n                this.set('model.allowPermissionGroup', false);\n                return this.get('model').save();\n            })\n            .then(() => {\n                this.set('isLoadingGroupRoles', false);\n            });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardNavigation();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeKeyboardNavigation();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardNavigation();\n    },\n\n    // Re-run accessibility setup when table content changes\n    contentDidChange: Ember.observer(\n        'allRolesFiltered.[]',\n        'groupAssignedRolesFiltered.[]',\n        'isLoadingAllRoles',\n        'isLoadingGroupRoles',\n        'isEditingRoles',\n        function () {\n            if (\n                !this.get('isLoadingAllRoles') &&\n                !this.get('isLoadingGroupRoles') &&\n                this.get('allRolesFiltered') &&\n                this.get('groupAssignedRolesFiltered')\n            ) {\n                Ember.run.debounce(this, this._setupFixtableAccessibility, 100);\n            }\n        }\n    ),\n\n    _setupAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('.enable-roles-toggle .toggle-switch-container input');\n            const innerLabel = this.$('.enable-roles-toggle .toggle-switch-container .toggle-switch[title]');\n            const labelText = this.get('intl').lookup('groups.roles.enableRoles');\n\n            if (toggleInput.length && labelText) {\n                // Associate the input with the existing label\n                toggleInput.attr('aria-labelledby', 'enableRolesToggleLabel');\n                toggleInput.attr('aria-label', labelText);\n            }\n\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && labelText) {\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n\n            // Fix fixtable row selection checkboxes\n            this._setupFixtableAccessibility();\n        });\n    },\n\n    _setupFixtableAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            // Skip if component is destroyed or DOM not ready\n            if (this.isDestroyed || this.isDestroying || !this.$) {\n                return;\n            }\n\n            // Handle all checkboxes in fixtable\n            const allCheckboxes = this.$('.fixtable-grid input[type=\"checkbox\"]');\n\n            if (allCheckboxes && allCheckboxes.length) {\n                allCheckboxes.each((index, checkbox) => {\n                    const $checkbox = Ember.$(checkbox);\n\n                    // Skip if already has proper labeling\n                    if ($checkbox.attr('aria-label') || $checkbox.attr('aria-labelledby')) {\n                        return;\n                    }\n\n                    // Check if this is a header checkbox (select all)\n                    const $headerRow = $checkbox.closest('thead tr');\n                    if ($headerRow.length) {\n                        $checkbox.attr('aria-label', 'Select all roles');\n                        return;\n                    }\n\n                    // Check if this is in a toggle-switch component\n                    const $toggleSwitch = $checkbox.closest('.toggle-switch');\n                    if ($toggleSwitch.length) {\n                        // Find the row this toggle belongs to\n                        const $row = $checkbox.closest('tr');\n                        const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                        if ($roleNameCell.length) {\n                            const roleName = $roleNameCell.text().trim();\n                            if (roleName) {\n                                $checkbox.attr('aria-label', `Toggle assignment for role ${roleName}`);\n                            }\n                        }\n                        return;\n                    }\n\n                    // Handle row selection checkboxes\n                    const $row = $checkbox.closest('tr');\n                    const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                    if ($roleNameCell.length) {\n                        const roleName = $roleNameCell.text().trim();\n                        if (roleName) {\n                            $checkbox.attr('aria-label', `Select role ${roleName}`);\n                        }\n                    } else {\n                        // Fallback for checkboxes without identifiable context\n                        $checkbox.attr('aria-label', `Select table row ${index + 1}`);\n                    }\n                });\n\n                // Handle remove buttons accessibility\n                this._setupButtonAccessibility();\n\n                // Fix table headers for accessibility\n                this._setupTableHeaders();\n            }\n        });\n    },\n\n    _setupButtonAccessibility() {\n        // Skip if component is destroyed or DOM not ready\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n\n        // Handle remove buttons in fixtable\n        const $removeButtons = this.$('.fixtable-grid button[data-t=\"minus-button\"]');\n\n        if ($removeButtons && $removeButtons.length) {\n            $removeButtons.each((index, button) => {\n                const $button = Ember.$(button);\n\n                // Skip if already has proper labeling\n                if ($button.attr('aria-label') || $button.attr('aria-labelledby')) {\n                    return;\n                }\n\n                // Find the row this button belongs to\n                const $row = $button.closest('tr');\n                const $roleNameCell = $row.find('.t-role-name-view, .t-role-name-edit');\n\n                if ($roleNameCell.length) {\n                    const roleName = $roleNameCell.text().trim();\n                    if (roleName) {\n                        $button.attr('aria-label', `Remove role ${roleName}`);\n                    } else {\n                        $button.attr('aria-label', 'Remove role');\n                    }\n                } else {\n                    // Fallback for buttons without identifiable context\n                    $button.attr('aria-label', `Remove item ${index + 1}`);\n                }\n            });\n        }\n\n        // Handle any other unlabeled buttons in the fixtable\n        const $otherButtons = this.$('.fixtable-grid button:not([aria-label]):not([aria-labelledby])');\n\n        if ($otherButtons && $otherButtons.length) {\n            $otherButtons.each((index, button) => {\n                const $button = Ember.$(button);\n                const buttonText = $button.text().trim();\n                const buttonTitle = $button.attr('title');\n\n                if (buttonText) {\n                    $button.attr('aria-label', buttonText);\n                } else if (buttonTitle) {\n                    $button.attr('aria-label', buttonTitle);\n                } else {\n                    // Check for common button patterns\n                    if ($button.find('.fa-times, .fa-remove, .fa-delete').length) {\n                        $button.attr('aria-label', 'Remove');\n                    } else if ($button.find('.fa-edit, .fa-pencil').length) {\n                        $button.attr('aria-label', 'Edit');\n                    } else {\n                        $button.attr('aria-label', `Action button ${index + 1}`);\n                    }\n                }\n            });\n        }\n    },\n\n    _setupTableHeaders() {\n        // Skip if component is destroyed or DOM not ready\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n\n        // Handle table headers in fixtable\n        const $table = this.$('.fixtable-grid table');\n\n        if ($table && $table.length) {\n            // Ensure table has proper role and accessibility attributes\n            if (!$table.attr('role')) {\n                $table.attr('role', 'table');\n            }\n\n            // Add aria-label if not present\n            if (!$table.attr('aria-label') && !$table.attr('aria-labelledby')) {\n                const isEditMode = this.get('isEditingRoles');\n                const tableLabel = isEditMode ? 'Roles assignment table' : 'Assigned roles table';\n                $table.attr('aria-label', tableLabel);\n            }\n            // Add scope attributes to all header cells (including filter headers)\n            const $allHeaderCells = $table.find('thead th');\n\n            $allHeaderCells.each((index, th) => {\n                const $th = Ember.$(th);\n\n                // Skip if already has scope attribute\n                if ($th.attr('scope')) {\n                    return;\n                }\n\n                // Add appropriate scope attribute\n                $th.attr('scope', 'col');\n\n                // Handle filter headers specifically\n                if ($th.hasClass('fixtable-column-filters') || $th.find('.fixtable-column-filters').length) {\n                    // Add role attribute for filter headers\n                    if (!$th.attr('role')) {\n                        $th.attr('role', 'columnheader');\n                    }\n                }\n            });\n\n            // Add headers attribute to data cells if needed for complex tables\n            const headerIds = [];\n\n            // Create unique IDs for headers if they don't exist\n            $allHeaderCells.each((index, th) => {\n                const $th = Ember.$(th);\n                let headerId = $th.attr('id');\n\n                if (!headerId) {\n                    headerId = `fixtable-header-${index}`;\n                    $th.attr('id', headerId);\n                }\n\n                headerIds.push(headerId);\n            });\n\n            // Associate data cells with their headers\n            $table.find('tbody tr').each((rowIndex, row) => {\n                const $row = Ember.$(row);\n                const $cells = $row.find('td');\n\n                $cells.each((cellIndex, cell) => {\n                    const $cell = Ember.$(cell);\n\n                    // Skip if already has headers attribute\n                    if ($cell.attr('headers')) {\n                        return;\n                    }\n\n                    // Associate with corresponding header\n                    if (headerIds[cellIndex]) {\n                        $cell.attr('headers', headerIds[cellIndex]);\n                    }\n                });\n            });\n\n            // Handle any filter inputs in headers\n            const $filterInputs = $table.find('thead input, thead select');\n            $filterInputs.each((index, input) => {\n                const $input = Ember.$(input);\n\n                if (!$input.attr('aria-label') && !$input.attr('aria-labelledby')) {\n                    const $headerCell = $input.closest('th');\n                    const headerText = $headerCell.text().trim().replace(/\\s+/g, ' ');\n\n                    if (headerText) {\n                        $input.attr('aria-label', `Filter by ${headerText}`);\n                    } else {\n                        $input.attr('aria-label', `Filter column ${index + 1}`);\n                    }\n                }\n            });\n        }\n    },\n\n    _setupKeyboardNavigation() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            // Remove any existing handlers first\n            this._removeKeyboardNavigation();\n\n            const $fixtable = this.$('.fixtable-grid');\n            if (!$fixtable || !$fixtable.length) {\n                return;\n            }\n\n            $fixtable.on('focusin.navigation', 'tbody tr.fixtable-row', function () {\n                Ember.$(this).addClass('row-focused');\n            });\n\n            $fixtable.on('focusout.navigation', 'tbody tr.fixtable-row', function () {\n                Ember.$(this).removeClass('row-focused');\n            });\n        });\n    },\n\n    _removeKeyboardNavigation() {\n        if (this.isDestroyed || this.isDestroying || !this.$) {\n            return;\n        }\n        const $fixtable = this.$('.fixtable-grid');\n        if ($fixtable && $fixtable.length) {\n            $fixtable.off('focusin.navigation');\n            $fixtable.off('focusout.navigation');\n        }\n    },\n\n    init() {\n        this.get('groupAssignedRoles').clear();\n        this.get('store').findAll('division'); //load divisions into the store for use in the fixtable table\n        this.get('unsavedGrants').parent = this; // pass parent reference into unsavedGrants object to provide access to injected properties\n        this.get('unsavedGrants').hasUnsavedGrants = Ember.computed('_hasUnsavedGrants', function () {\n            return this.get('_hasUnsavedGrants');\n        });\n        this.get('unsavedGrants').clear(); //in case the component didn't get the chance to clean itself up before it was destroyed\n        this._getGroupRoles();\n        //Load All Roles\n        this.set('isLoadingAllRoles', true);\n        this.get('store')\n            .findAll('role')\n            .then(roles => {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('allRoles', roles);\n                this.set('allRolesFiltered', roles);\n                this.set('isLoadingAllRoles', false);\n            });\n        this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    layout,\n    selectionIsEmpty: Ember.computed('selectedDataRows', function () {\n        let selectedDataRows = this.get('selectedDataRows');\n        return !selectedDataRows || !selectedDataRows.length;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"hXr4u8/q\",\"block\":\"{\\\"statements\\\":[[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[16,\\\"disabled\\\",[26,[\\\"selectionIsEmpty\\\"]],null],[16,\\\"data-t\\\",[34,[[26,[\\\"bulkActionTitle\\\"]]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"bulkAction\\\"]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null]]],[13],[0,\\\"\\\\n    \\\"],[1,[26,[\\\"bulkActionTitle\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/bulk-actions/selected-elements/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-custom-footer'],\n    layout,\n\n    one: 1,\n    isFirstPage: Ember.computed.equal('currentPage', 1),\n    isLastPage: Ember.computed('currentPage', 'totalPages', function () {\n        return this.get('currentPage') === this.get('totalPages');\n    }),\n    listedPages: Ember.computed('currentPage', 'totalPages', function () {\n        let currentPage = this.get('currentPage');\n        let totalPages = this.get('totalPages');\n\n        // ideal number of pages to be linked on each side of current page\n        let neighbors = 3;\n\n        // determine how many pages \"short\" we are on each side\n        let pagesToFirst = currentPage - 1;\n        let pagesToLast = totalPages - currentPage;\n        let shortageL = pagesToFirst < neighbors ? neighbors - pagesToFirst : 0;\n        let shortageR = pagesToLast < neighbors ? neighbors - pagesToLast : 0;\n\n        // increase neighbors by the largest \"shortage\" value\n        neighbors += Math.max(shortageL, shortageR);\n\n        // calculate indices of first & last pages in range\n        let lowerIndex = currentPage - neighbors;\n        let upperIndex = currentPage + neighbors;\n        if (lowerIndex < 1) {\n            lowerIndex = 1;\n        }\n        if (upperIndex > totalPages) {\n            upperIndex = totalPages;\n        }\n\n        // build & return pages array\n        let pages = [];\n        for (let i = lowerIndex; i <= upperIndex; i++) {\n            pages.push({\n                index: i,\n                isCurrent: i === currentPage\n            });\n        }\n        return pages;\n    }),\n    firstPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(1) >= 0\n        );\n    }),\n    secondPageListed: Ember.computed('listedPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(2) >= 0\n        );\n    }),\n    penultimatePageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages') - 1) >= 0\n        );\n    }),\n    finalPageListed: Ember.computed('listedPages', 'totalPages', function () {\n        return (\n            this.get('listedPages')\n                .map(function (page) {\n                    return page.index;\n                })\n                .indexOf(this.get('totalPages')) >= 0\n        );\n    }),\n    showPaginationControls: Ember.computed('listedPages', function () {\n        return this.get('listedPages').length > 1;\n    }),\n    showRangeLabel: Ember.computed.not('isLoading'),\n\n    actions: {\n        bulkAction(selectedDataRows, action) {\n            this.sendAction('bubbleAction', action, selectedDataRows);\n        },\n        showPage(pageNumber) {\n            this.set('currentPage', pageNumber);\n        },\n        showNextPage() {\n            this.sendAction('goToNextPage');\n        },\n        showPreviousPage() {\n            this.sendAction('goToPreviousPage');\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"WPVwICVQ\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-footer-bulk-actions\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"component\\\"],[[28,[\\\"bulkActions\\\"]]],[[\\\"selectedDataRows\\\",\\\"bulkAction\\\",\\\"bulkActionTitle\\\"],[[28,[\\\"selectedDataRows\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"bulkAction\\\",[28,[\\\"selectedDataRows\\\"]]],null],[28,[\\\"bulkActionTitle\\\"]]]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showRangeLabel\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/item-range\\\"],null,[[\\\"currentPage\\\",\\\"pageSize\\\",\\\"totalPages\\\",\\\"totalRows\\\"],[[28,[\\\"currentPage\\\"]],[28,[\\\"pageSize\\\"]],[28,[\\\"totalPages\\\"]],[28,[\\\"totalRows\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showPaginationControls\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-pagination-controls\\\"],[13],[0,\\\"\\\\n\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-prev\\\"],[16,\\\"disabled\\\",[26,[\\\"isFirstPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPreviousPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_previous\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"firstPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",1]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"one\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"secondPageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"listedPages\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[16,\\\"disabled\\\",[28,[\\\"page\\\",\\\"isCurrent\\\"]],null],[16,\\\"data-page\\\",[28,[\\\"page\\\",\\\"index\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"page\\\",\\\"index\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"page\\\",\\\"index\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"page\\\"]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"finalPageListed\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"penultimatePageListed\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-ellipsis-h\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"fixtable-btn-page-jump\\\"],[15,\\\"data-page\\\",\\\"1\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showPage\\\",[28,[\\\"totalPages\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"totalPages\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link fixtable-btn-page-next\\\"],[16,\\\"disabled\\\",[26,[\\\"isLastPage\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showNextPage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.go_next\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/custom-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    groupAssignedRoles: Ember.inject.service(), // tracks the roles/division relationships for display\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    rowHasToggled: Ember.observer('groupAssignedRoles.changeCount', function () {\n        const isAssigned = this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n        const wasAssigned = this.get('wasAssigned');\n\n        if (wasAssigned === isAssigned) {\n            return;\n        } else {\n            this.set('wasAssigned', isAssigned);\n        }\n\n        if (!isAssigned) {\n            const previouslySelected = this.get('selectedDivisions');\n            this.set('selectedDivisions', []);\n            this._updateDivisions([], previouslySelected);\n        } else {\n            const homeDivision = this.get('store')\n                .peekAll('division')\n                .find(division => {\n                    return division.get('homeDivision');\n                });\n            const selected = [homeDivision];\n            this.set('selectedDivisions', selected);\n            this._updateDivisions(selected, []);\n        }\n    }),\n\n    allFutureDivisionsSelected: false,\n\n    actions: {\n        updateDivisions(currentSelection, info) {\n            this._updateDivisions(currentSelection, info.selected);\n        }\n    },\n\n    _updateDivisions(currentSelection, previousSelection) {\n        const allFutureDivision = currentSelection.find(division => {\n            return division.id === '*';\n        });\n        //don't allow special division to exist with any other division\n        if (allFutureDivision) {\n            currentSelection = [allFutureDivision];\n        }\n        this.set('allFutureDivisionsSelected', !!allFutureDivision);\n        this.set('selectedDivisions', currentSelection);\n        const roleId = this.get('dataRow.id');\n        this.bubbleAction('updateDivisions', roleId, currentSelection, previousSelection);\n    },\n\n    _loadDivisions() {\n        this.set('divisions', this.get('store').peekAll('division'));\n    },\n\n    _setSelectedDivisions() {\n        // need to set selected divisions from the divisions array to make select work\n        const roleId = this.get('dataRow.id');\n        const roleDivisions = this.get('groupAssignedRoles').getRoleWithDivisions(roleId)\n            ? Ember.get(this.get('groupAssignedRoles').getRoleWithDivisions(roleId), 'divisions')\n            : [];\n        if (roleDivisions && roleDivisions.length) {\n            const allDivisions = this.get('divisions');\n            const allFutureDivisionsSelected = roleDivisions.some(division => {\n                return division.id === '*';\n            });\n            this.set('allFutureDivisionsSelected', allFutureDivisionsSelected);\n            let selectedDivisions = [];\n\n            roleDivisions.forEach(selectedDivision => {\n                selectedDivisions.push(\n                    allDivisions.find(division => {\n                        return division.id === selectedDivision.id;\n                    })\n                );\n            });\n            this.set('selectedDivisions', selectedDivisions);\n        }\n    },\n\n    init() {\n        this._loadDivisions();\n        this._setSelectedDivisions();\n        this.set('wasAssigned', this.get('groupAssignedRoles').containsRole(this.get('dataRow.id')));\n        //for passing into  custom components (e.g. select-footer)\n        this.set('extra', { rolesEditComponent: this });\n        return this._super(...arguments);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    store: Ember.inject.service(),\n    allDivisionsSelected: Ember.computed('select.selected', function () {\n        let optionsWithoutSpecial = this.get('select.options').filter(division => {\n            return division.id !== '*';\n        });\n        return this.get('select.selected.length') === optionsWithoutSpecial.length;\n    }),\n    allFutureDivisions: undefined,\n\n    _allFutureDivisionsObserver() {\n        const allFutureDivisions = this.get('allFutureDivisions');\n        if (allFutureDivisions) {\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([{ id: '*' }], powerSelectAPI.selected);\n        } else {\n            this._selectAll();\n        }\n    },\n\n    actions: {\n        selectAll() {\n            this._selectAll();\n        },\n        deselectAll() {\n            if (this.get('allFutureDivisions')) {\n                this.removeObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n                this.set('allFutureDivisions', false);\n                this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n            }\n            const powerSelectAPI = this.get('select');\n            const rolesEditComponent = this.get('extra.rolesEditComponent');\n            rolesEditComponent._updateDivisions([], powerSelectAPI.selected);\n        }\n    },\n\n    _selectAll() {\n        if (this.get('allFutureDivisions')) {\n            return;\n        }\n        const powerSelectAPI = this.get('select');\n        const rolesEditComponent = this.get('extra.rolesEditComponent');\n        let optionsWithoutSpecial = powerSelectAPI.options.filter(division => {\n            return division.id !== '*';\n        });\n        rolesEditComponent._updateDivisions(optionsWithoutSpecial, powerSelectAPI.selected);\n    },\n\n    init() {\n        const powerSelectAPI = this.get('select');\n        const allFutureDivisions = powerSelectAPI.selected.some(division => {\n            return division.id === '*';\n        });\n        this.set('allFutureDivisions', allFutureDivisions);\n        this.addObserver('allFutureDivisions', this, '_allFutureDivisionsObserver');\n        return this._super(...arguments);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"NxGzYqOH\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisions\\\"]],\\\"btn btn-link select-all-divisions disabled\\\",\\\"btn btn-link select-all-divisions\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.selectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        |\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"btn btn-link deselect-all-divisions\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deselectAll\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.deselectAll\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"type\\\",\\\"disabled\\\",\\\"checked\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null],\\\"checkbox\\\",[33,[\\\"not\\\"],[[33,[\\\"or\\\"],[[28,[\\\"allFutureDivisions\\\"]],[28,[\\\"allDivisionsSelected\\\"]]],null]],null],[28,[\\\"allFutureDivisions\\\"]]]]],false],[0,\\\"\\\\n        \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-division-toggle\\\"],null]]]],[13],[0,\\\" \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.selectFooter.allFutureDivisions\\\"],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/select-footer/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({});\n","export default Ember.HTMLBars.template({\"id\":\"AzDakxFC\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"option\\\",\\\"id\\\"]],\\\"*\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.allDivisions\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[1,[28,[\\\"option\\\",\\\"name\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/selected-division/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"q65Ds8WH\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isAssigned\\\"]]],null,{\\\"statements\\\":[[6,[\\\"power-select-multiple\\\"],null,[[\\\"renderInPlace\\\",\\\"selected\\\",\\\"options\\\",\\\"searchField\\\",\\\"class\\\",\\\"placeholder\\\",\\\"onchange\\\",\\\"extra\\\",\\\"noMatchesMessage\\\",\\\"selectedItemComponent\\\",\\\"afterOptionsComponent\\\"],[true,[28,[\\\"selectedDivisions\\\"]],[28,[\\\"divisions\\\"]],\\\"name\\\",\\\"divisions-power-select\\\",[33,[\\\"t\\\"],[\\\"groups.roles.selectDivisions\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"updateDivisions\\\"],null],[28,[\\\"extra\\\"]],[33,[\\\"t\\\"],[\\\"groups.roles.noDivisionsFound\\\"],null],\\\"group-profile/roles-edit/fixtable/division-select/selected-division\\\",\\\"group-profile/roles-edit/fixtable/division-select/select-footer\\\"]],{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"division\\\",\\\"id\\\"]],\\\"*\\\"],null]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[33,[\\\"if\\\"],[[28,[\\\"allFutureDivisionsSelected\\\"]],\\\"division-select-option disabled\\\",\\\"division-select-option\\\"],null],null],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-name\\\"],[13],[1,[28,[\\\"division\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"division-description\\\"],[13],[1,[28,[\\\"division\\\",\\\"description\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"division\\\"]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-select/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    divisionsDisplayList: Ember.computed('dataRow.divisions.[]', function () {\n        const divisions = this.get('dataRow.divisions');\n        let displayString = '';\n        if (divisions.length) {\n            for (var i = 0; i < divisions.length - 1; i++) {\n                displayString +=\n                    divisions.objectAt(i).id === '*'\n                        ? this.get('intl').lookup('groups.roles.allDivisions')\n                        : divisions.objectAt(i).get('name');\n                displayString += ', ';\n            }\n            displayString +=\n                divisions.objectAt(i).id === '*'\n                    ? this.get('intl').lookup('groups.roles.allDivisions')\n                    : divisions.objectAt(i).get('name');\n        }\n        return displayString;\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"5snZkTTk\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"divisionsDisplayList\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/division-view/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    groupAssignedRoles: Ember.inject.service(),\n\n    isAssigned: Ember.computed('groupAssignedRoles.changeCount', function () {\n        return this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._setupAccessibility();\n        this._setupKeyboardHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removeKeyboardHandler();\n    },\n\n    _setupAccessibility() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('input[type=\"checkbox\"]');\n            const innerLabel = this.$('.toggle-switch[title]');\n            const roleName = this.get('dataRow.name');\n\n            if (toggleInput.length && roleName) {\n                const labelText = `Toggle assignment for role ${roleName}`;\n                toggleInput.attr('aria-label', labelText);\n\n                // If there's no existing label association, add one\n                if (!toggleInput.attr('aria-labelledby') && !toggleInput.attr('id')) {\n                    const uniqueId = `role-toggle-${this.get('dataRow.id')}`;\n                    toggleInput.attr('id', uniqueId);\n                }\n            }\n\n            // Fix the problematic inner label by adding descriptive text\n            if (innerLabel.length && roleName) {\n                const labelText = `Toggle assignment for role ${roleName}`;\n                // Remove any existing sr-only text to avoid duplicates\n                innerLabel.find('.sr-only').remove();\n                // Add screen reader only text to the inner label\n                const srText = Ember.$('<span class=\"sr-only\">' + labelText + '</span>');\n                innerLabel.prepend(srText);\n            }\n        });\n    },\n\n    _setupKeyboardHandler() {\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const toggleInput = this.$('input[type=\"checkbox\"]');\n            if (toggleInput.length) {\n                toggleInput.on('keydown.toggle', event => {\n                    if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar') {\n                        event.preventDefault();\n                        this.send('toggle');\n                    }\n                });\n            }\n        });\n    },\n\n    _removeKeyboardHandler() {\n        const toggleInput = this.$('input[type=\"checkbox\"]');\n        if (toggleInput && toggleInput.length) {\n            toggleInput.off('keydown.toggle');\n        }\n    },\n\n    actions: {\n        toggle() {\n            const isAssigned = !this.get('groupAssignedRoles').containsRole(this.get('dataRow.id'));\n            const roleId = this.get('dataRow.id');\n            this.bubbleAction('assignRole', roleId, isAssigned);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"tl06NBdl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"class\\\",\\\"check\\\",\\\"toggle\\\",\\\"aria-label\\\",\\\"title\\\"],[\\\"toggle-width\\\",[28,[\\\"isAssigned\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggle\\\"],null],[33,[\\\"concat\\\"],[\\\"Toggle assignment for role \\\",[28,[\\\"dataRow\\\",\\\"name\\\"]]],null],[33,[\\\"concat\\\"],[\\\"Toggle assignment for role \\\",[28,[\\\"dataRow\\\",\\\"name\\\"]]],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/is-assigned-toggle/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\n\nexport default Ember.Component.extend({\n    classNames: ['fixtable-item-range'],\n    layout,\n\n    dash: '-',\n    firstItemIndex: Ember.computed('currentPage', 'pageSize', function () {\n        return (this.get('currentPage') - 1) * this.get('pageSize') + 1;\n    }),\n    lastItemIndex: Ember.computed('currentPage', 'pageSize', 'totalPages', 'totalRows', function () {\n        if (this.get('currentPage') === this.get('totalPages')) {\n            return this.get('totalRows');\n        } else {\n            return this.get('currentPage') * this.get('pageSize');\n        }\n    }),\n    isSingleItem: Ember.computed('firstItemIndex', 'lastItemIndex', function () {\n        return this.get('firstItemIndex') === this.get('lastItemIndex');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"X1zLrc19\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"totalRows\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isSingleItem\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[26,[\\\"firstItemIndex\\\"]],false],[1,[26,[\\\"dash\\\"]],false],[1,[26,[\\\"lastItemIndex\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"text-muted\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.fixtable.of\\\"],null],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[26,[\\\"totalRows\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/item-range/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    iconClass: Ember.computed('columnDef.iconClass', function () {\n        return this.get('columnDef.iconClass') || 'fa fa-minus';\n    }),\n    class: Ember.computed('columnDef.class', function () {\n        return this.get('columnDef.class') ? this.get('columnDef.class') : 'btn btn-danger btn-xs';\n    }),\n    disabledMessage: Ember.computed('columnDef.disabledMessage', 'dataRow.disabledMessage', function () {\n        return this.get('dataRow.disabledMessage') || this.get('columnDef.disabledMessage');\n    }),\n    actions: {\n        remove(id) {\n            if (!this.get('dataRow.isDeleteDisabled')) {\n                this.bubbleAction('remove', id);\n            }\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"GtcE/MmX\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dataRow\\\",\\\"hideButton\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],\\\"disabled\\\"],null],\\\" \\\",[26,[\\\"class\\\"]]]]],[15,\\\"data-t\\\",\\\"minus-button\\\"],[16,\\\"title\\\",[33,[\\\"if\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.remove\\\"],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"remove\\\",[28,[\\\"dataRow\\\",\\\"id\\\"]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[26,[\\\"iconClass\\\"]],null],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\" \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"dataRow\\\",\\\"isDeleteDisabled\\\"]],[28,[\\\"disabledMessage\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"left\\\",[28,[\\\"disabledMessage\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/list-remove/template.hbs\"}});","import { debounce } from '@ember/runloop';\nimport { observer, computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    classNames: ['search-field'],\n    classNameBindings: ['positionSubclass'],\n\n    debounce: 250,\n    query: '',\n    _isInitialized: false,\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.set('_isInitialized', true);\n    },\n\n    queryChanged: observer('query', function () {\n        if (this.get('_isInitialized')) {\n            debounce(this, this.triggerSearch, this.get('debounce'));\n        }\n    }),\n\n    positionSubclass: computed('position', function () {\n        let position = this.get('position');\n        return position ? `search-field-${this.get('position')}` : '';\n    }),\n\n    triggerSearch: function () {\n        this.sendAction('onChange', this.get('query'));\n    },\n\n    actions: {\n        reset() {\n            this.set('query', '');\n            this.triggerSearch();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"lNaKkjiL\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-field-icon\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"query\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-times-circle search-field-reset\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reset\\\"]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-lg pc-icon-magnifying-glass\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fill-between-floats\\\"],[15,\\\"data-t\\\",\\\"searchfieldparent\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"input\\\",[]],[15,\\\"type\\\",\\\"text\\\"],[16,\\\"value\\\",[34,[[26,[\\\"query\\\"]]]]],[16,\\\"placeholder\\\",[34,[[26,[\\\"placeholder\\\"]]]]],[15,\\\"data-t\\\",\\\"input-search\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"groups.roles.roleSearch\\\"],null]]]],[16,\\\"onInput\\\",[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"query\\\"]]],null]],[[\\\"value\\\"],[\\\"target.value\\\"]]],null],[13],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/fixtable/search-field/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"lI4I0C0D\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"roles-edit\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEditingRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"unsavedGrants\\\",\\\"hasUnsavedGrants\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"save\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle disabled\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"enableRolesToggleLabel\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[true,[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAllRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"updateDivisions\\\",\\\"assignRole\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesEditColumns\\\"]],[28,[\\\"allRolesFiltered\\\"]],true,[28,[\\\"isLoadingAllRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",\\\"updateUnsavedGrants\\\",\\\"toggleRoleAssignment\\\",[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"new-roles-bar row\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn new-btn\\\"],[16,\\\"disabled\\\",[33,[\\\"not\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]]],null],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editRoles\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"fa fa-edit\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.assignRoles\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"enable-roles-toggle\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"enableRolesToggleLabel\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.roles.enableRoles\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"model\\\",\\\"allowPermissionGroup\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleRolesEnabled\\\"],null]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"fixtable-toolbar\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"group-profile/roles-edit/fixtable/search-field\\\"],null,[[\\\"onChange\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"searchAssignedRoles\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"list-container\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"fixtable-grid\\\"],null,[[\\\"columns\\\",\\\"content\\\",\\\"rowSelection\\\",\\\"clientPaging\\\",\\\"isLoading\\\",\\\"classNames\\\",\\\"fixtableClass\\\",\\\"tableClass\\\",\\\"remove\\\",\\\"bulkAction\\\",\\\"emptyStateComponentValues\\\",\\\"footerComponent\\\"],[[28,[\\\"groupRolesViewColumns\\\"]],[28,[\\\"groupAssignedRolesFiltered\\\"]],true,true,[28,[\\\"isLoadingGroupRoles\\\"]],\\\"fixtable-grid\\\",\\\"fixtable-purecloud\\\",\\\"fixtable-table\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelSingleRole\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"openConfirmModelMultipleRole\\\"],null],[33,[\\\"hash\\\"],null,[[\\\"nullMessage\\\"],[[33,[\\\"t\\\"],[\\\"groups.roles.noRolesAreAssigned\\\"],null]]]],[33,[\\\"component\\\"],[\\\"group-profile/roles-edit/fixtable/custom-footer\\\"],[[\\\"bulkActions\\\",\\\"bulkActionTitle\\\"],[\\\"group-profile/roles-edit/fixtable/bulk-actions/selected-elements\\\",[33,[\\\"t\\\"],[\\\"groups.roles.deleteAllSelected\\\"],null]]]]]]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRoleRemoveModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"rolesToDelete\\\",\\\"enforceModality\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.roles.confirmRemove\\\"],null],true,\\\"warning-modal\\\",\\\"deleteRoles\\\",\\\"closeWarningModal\\\",[28,[\\\"rolesToDelete\\\"]],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"rolesToDelete\\\",\\\"length\\\"]],1],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRoleConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.removeRolesConfirm\\\"],null],false],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[6,[\\\"each\\\"],[[28,[\\\"rolesToDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"b\\\",[]],[13],[1,[28,[\\\"role\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n                \\\"],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"role\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayRulesRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeRulesRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayHasRolesWarningModel\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmHasRolesWarningModal\\\",\\\"closeHasRolesWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.thereAreRoles\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.roles.warningModal.confirmRolesRemoval\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/roles-edit/template.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"J4JECv3L\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"container-fluid\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditLeftRailInfo\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"edit dropdown\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"id\\\",\\\"group-profile-edit\\\"],[15,\\\"closeOnClickOutside\\\",\\\"true\\\"],[15,\\\"class\\\",\\\"btn btn-link dropdown-link\\\"],[15,\\\"data-toggle\\\",\\\"dropdown\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-caret-down\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[6,[\\\"click-outside\\\"],null,[[\\\"action\\\"],[[33,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]],null]]],{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-popover\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"group-profile-edit-popover\\\"],[15,\\\"position\\\",\\\"bottom-end\\\"],[15,\\\"for\\\",\\\"group-profile-edit\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"ul\\\",[]],[15,\\\"class\\\",\\\"popover-menu\\\"],[13],[0,\\\"\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-general\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-general\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editGeneralInfo\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.generalInfo\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-picture\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-profile-picture-link group\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"person.edit.profilePicture\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"edit-rules\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"edit-privacy-rules\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"editPrivacyRules\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.edit.privacyRules\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n\\\\n                                \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"delete-group\\\"],[13],[0,\\\"\\\\n                                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"delete-group text-danger\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteGroup\\\"]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleGroupProfileEditPopover\\\",[28,[\\\"showDropdown\\\"]]]],[13],[0,\\\"\\\\n                                        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.admin.delete\\\"],null],false],[0,\\\"\\\\n                                    \\\"],[14],[0,\\\"\\\\n                                \\\"],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"profile-picture\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-8 col-xs-offset-2\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"model\\\"]],400]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"general\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row name\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row group-type\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[28,[\\\"isEditing\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[[26,[\\\"groupTypeIcon\\\"]]]]],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupType\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"groupType\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"description-contact-info\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row description\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"description\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"description\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"description\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"empty\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.noGroupDescription\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewVideo\\\",\\\"canViewChat\\\",\\\"entity\\\",\\\"showFavorite\\\",\\\"viewLightGallery\\\"],[[28,[\\\"canViewVideo\\\"]],[28,[\\\"canViewChat\\\"]],[28,[\\\"model\\\"]],[28,[\\\"favorites\\\",\\\"enabled\\\"]],\\\"viewLightGallery\\\"]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"meta\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row visibility\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"group_privacy_groupVisibility_labelKey_groupVisibility\\\"],null],false],[14],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"entity-fields/select-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"groupVisibility\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"privacy\\\",\\\"groupVisibility\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasLinks\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"link-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"tooltip.groupLink\\\"],null],true],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"ul\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"model\\\",\\\"general\\\",\\\"links\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"entity-fields/weblink-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"link\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"links\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"link\\\"]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"hr\\\",[]],[13],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.phone\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-phone\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneService\\\",\\\"enabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                        \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"tooltip.contactIcon.phone\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"makeCall\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"span\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"entity.fieldTypes.phone.extension\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"extension\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"anchor-tag\\\"],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[28,[\\\"phoneNumber\\\",\\\"value\\\",\\\"extension\\\"]],\\\"tel\\\",[28,[\\\"dialableNumber\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"email\\\",\\\"value\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email-header\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.email\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-email\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"application\\\",\\\"adminUIContext\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"a\\\",[]],[16,\\\"href\\\",[34,[\\\"mailto:\\\",[28,[\\\"email\\\",\\\"value\\\"]]]]],[13],[1,[28,[\\\"email\\\",\\\"value\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail tabsUI hunt-groups\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"button-tabs\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"flex-left\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-membership-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"members\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"membershipHeader\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canEditRoles\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"button\\\",[]],[16,\\\"class\\\",[34,[\\\"btn-tab t-roles-tab \\\",[33,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null],\\\"active\\\"],null]]]],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\",\\\"roles\\\"]],[13],[0,\\\"\\\\n                            \\\"],[1,[26,[\\\"groupRolesHeader\\\"]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"members\\\"],null]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"callsEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-header\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"group-name\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"entity-fields/text-field\\\"],null,[[\\\"entity\\\",\\\"entry\\\",\\\"field\\\"],[[28,[\\\"model\\\"]],[28,[\\\"name\\\"]],[28,[\\\"model\\\",\\\"fieldConfig\\\",\\\"general\\\",\\\"name\\\"]]]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEditInformation\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"header-right\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-link edit-button\\\"],[16,\\\"disabled\\\",[26,[\\\"isEditing\\\"]],null],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleEditing\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.edit\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"id\\\",\\\"toggleLabel\\\"],[15,\\\"class\\\",\\\"toggle-label\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.enableCalls\\\"],null],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"toggle-switch-wrapper\\\"],[13],[0,\\\"\\\\n                                \\\"],[1,[33,[\\\"toggle-switch\\\"],null,[[\\\"disabled\\\",\\\"check\\\",\\\"toggle\\\"],[[28,[\\\"disableToggleCalls\\\"]],[28,[\\\"callsEnabled\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null]]]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[14],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"group-profile/group-contact-panel\\\"],null,[[\\\"group\\\",\\\"editing\\\",\\\"canEditGroupTelephonySettings\\\",\\\"changeEditing\\\",\\\"toggleEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]],[28,[\\\"canEditGroupTelephonySettings\\\"]],\\\"changeEditingMode\\\",\\\"toggleEditing\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row content\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-12 field-section tabsUI\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"group-profile/membership-listing\\\"],null,[[\\\"group\\\",\\\"callsEnabled\\\",\\\"owners\\\",\\\"individuals\\\",\\\"toggleCallsEnabled\\\",\\\"changeEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"callsEnabled\\\"]],[28,[\\\"model\\\",\\\"owners\\\",\\\"owners\\\"]],[28,[\\\"model\\\",\\\"individuals\\\",\\\"individuals\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"toggleCallsEnabled\\\"],null],\\\"changeEditingMode\\\"]]],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"roles\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/roles-edit\\\"],null,[[\\\"model\\\",\\\"class\\\"],[[28,[\\\"model\\\"]],\\\"roles-edit-container\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"activeTab\\\"]],\\\"dynamicRules\\\"],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"group-profile/dynamicRules\\\"],null,[[\\\"group\\\",\\\"class\\\",\\\"selectTab\\\"],[[28,[\\\"model\\\"]],\\\"dynamic-rules\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectTab\\\"],null]]]],false],[0,\\\"\\\\n        \\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[1,[33,[\\\"entity-picture-content\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\",\\\"targetAttachment\\\"],[[28,[\\\"model\\\"]],[28,[\\\"editingPictures\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"editProfilePicture\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditProfilePicture\\\"],null],\\\"none\\\"]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showContactInfo\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"enforceModality\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\"],[true,\\\"cancelEditContactInfo\\\",[33,[\\\"t\\\"],[\\\"groups.modal.contact\\\"],null],[33,[\\\"t\\\"],[\\\"common.save\\\"],null],[33,[\\\"t\\\"],[\\\"common.cancel\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"group-contact-modal\\\"],null,[[\\\"entity\\\",\\\"saveContactInfo\\\",\\\"disableModal\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"confirmAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelEditContactInfo\\\"],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"confirmAction\\\",\\\"_\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[1,[33,[\\\"light-gallery-modal\\\"],null,[[\\\"entity\\\",\\\"showing\\\",\\\"open\\\",\\\"close\\\"],[[28,[\\\"model\\\"]],[28,[\\\"viewingGallery\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"viewLightGallery\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelViewLightGallery\\\"],null]]]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingDeleteModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\"],[true,[33,[\\\"t\\\"],[\\\"groups.admin.deleteHeader\\\"],[[\\\"name\\\"],[[33,[\\\"escape\\\"],[[28,[\\\"model\\\",\\\"name\\\"]]],null]]]],true,\\\"delete-group-confirmation-modal\\\",\\\"confirmDelete\\\",\\\"cancelDelete\\\"]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"groups.admin.deleteConfirmation\\\"],null],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingGeneralModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"generalFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditProfile\\\",\\\"canEditSection\\\",\\\"excludedFields\\\",\\\"disableModal\\\"],[[28,[\\\"model\\\"]],[28,[\\\"generalFieldConfigSection\\\"]],true,true,true,true,true,[28,[\\\"generalExcludedEditingFields\\\"]],[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"disableAction\\\"]]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"_confirm\\\",\\\"_cancel\\\",\\\"disableAction\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isShowingPrivacyModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"headerText\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[true,[28,[\\\"privacyFieldConfigSection\\\",\\\"sectionName\\\"]],true,\\\"field-section-modal\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"confirmGeneral\\\"],null],[33,[\\\"action\\\"],[[28,[null]],\\\"cancelGeneral\\\"],null],true]],{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"entity-field-section\\\"],null,[[\\\"entity\\\",\\\"section\\\",\\\"modal\\\",\\\"editing\\\",\\\"editingProfile\\\",\\\"canEditSection\\\",\\\"canEditProfile\\\"],[[28,[\\\"model\\\"]],[28,[\\\"privacyFieldConfigSection\\\"]],true,true,true,true,true]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"displayWarningModal\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"showHeader\\\",\\\"translucentOverlay\\\",\\\"container-class\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"enforceModality\\\"],[false,true,\\\"warning-modal\\\",\\\"confirmWarningModal\\\",\\\"closeWarningModal\\\",true]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.header\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-info\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.rulesWarning\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"warning-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.newGroupSuggestion\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"groups.groupRing.warningModal.confirmWarning\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/group-profile/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['grouped-facet-term'],\n    classNameBindings: ['label'],\n\n    intl: Ember.inject.service(),\n\n    group: null,\n\n    showDropdown: false,\n\n    actions: {\n        removeSelectedTerm: function () {\n            var terms = this.get('group.terms');\n            var term = terms.objectAt(0);\n\n            this.send('removeSingleTerm', term);\n        },\n\n        removeSingleTerm: function (term) {\n            var facet = this.get('group.facet');\n            this.bubbleAction({\n                action: 'removeSelectedTerm',\n                actionContext: [term, facet]\n            });\n        },\n\n        toggleDropdown: function () {\n            if (!this.get('isSingleTerm')) {\n                this.toggleProperty('showDropdown');\n            }\n        }\n    },\n\n    isSingleTerm: Ember.computed('group.terms.[]', function () {\n        return this.get('group.terms.length') === 1;\n    }),\n\n    label: Ember.computed('group.facet.facetName', function () {\n        var facetName = this.get('group.facet.facetName');\n        if (facetName) {\n            return facetName.toLowerCase().replace(/\\./gi, '_');\n        }\n    }),\n\n    value: Ember.computed('isSingleTerm', function () {\n        var terms = this.get('group.terms');\n        if (this.get('isSingleTerm')) {\n            var term = terms.objectAt(0);\n            return term.term;\n        } else {\n            return this.get('intl').lookup('search.multipleFacetsSelected', { count: terms.length }).toString();\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"l2Nsz1vc\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"grouped-facet-container\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSingleTerm\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"facet\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"value\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"value\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSelectedTerm\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"terms-dropdown-button\\\"],[16,\\\"aria-expanded\\\",[34,[[26,[\\\"showDropdown\\\"]]]]],[16,\\\"aria-controls\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleDropdown\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"facet \\\",[33,[\\\"unless\\\"],[[28,[\\\"isSingleTerm\\\"]],\\\"clickable\\\"],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],false],[0,\\\":\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[1,[26,[\\\"value\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"toggle-dropdown clickable\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"ul\\\",[]],[16,\\\"id\\\",[34,[[26,[\\\"elementId\\\"]],\\\"section\\\"]]],[15,\\\"class\\\",\\\"terms-dropdown list-unstyled\\\"],[15,\\\"role\\\",\\\"region\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"group\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"css-classify\\\"],[[28,[\\\"t\\\",\\\"term\\\"]]],null]]]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"remove clickable\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.deselectTag\\\"],[[\\\"tag\\\"],[[33,[\\\"concat\\\"],[[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]]]]],\\\": \\\",[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"group\\\",\\\"facet\\\"]],[28,[\\\"t\\\",\\\"term\\\"]]]]]],null]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"removeSingleTerm\\\",[28,[\\\"t\\\"]]]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"t\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/grouped-facet-term/template.hbs\"}});","define(\"connections-ui/components/headset-status/component\", [\"exports\", \"ember-softphone-integration/components/headset-status/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/headset-vendor-picker/component\", [\"exports\", \"ember-softphone-integration/components/headset-vendor-picker/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/horizontal-collection\", [\"exports\", \"smoke-and-mirrors/components/horizontal-collection\"], function (_exports, _horizontalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _horizontalCollection.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    session: Ember.inject.service(),\n\n    bootstrapIcons: Ember.computed.reads('session.isAuthenticated')\n});\n","export default Ember.HTMLBars.template({\"id\":\"dekSi0FY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"bootstrapIcons\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-chevron-right invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-email invisible\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading invisible\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/icon-bootstrap/template.hbs\"}});","define(\"connections-ui/components/in-viewport\", [\"exports\", \"smoke-and-mirrors/components/in-viewport\"], function (_exports, _inViewport) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inViewport.default;\n    }\n  });\n});\n","import Component from '@ember/component';\nimport Ember from 'ember';\nimport LoggerMixin from '../../mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['infinite-scroll'],\n    classNameBindings: ['hideScrollbars'],\n\n    /**\n     * @Input\n     * `true` if the component should be showing a loading state\n     */\n    loading: false,\n    /**\n     * `true` if the component should not invoke any infinite scroll\n     * interactions\n     */\n    disabled: false,\n    /**\n     * `true` if the scrollbar display should be visually hidden\n     */\n    hideScrollbars: false,\n\n    /**\n     * The amount of space in pixels that when the user scrolls within\n     * it will trigger the infinite scroll event for the parent to\n     * react to.\n     * !! If possible do not override this value with an inputted value.\n     * The functionality and UX should be consistent so if the threshold\n     * needs to increase it should increase everywhere.\n     */\n    scrollBottomThreshold: 100,\n\n    /**\n     * Lifecycle hook triggered when the element is rendered and inserted\n     * into the DOM\n     */\n    didInsertElement() {\n        const element: HTMLDivElement = this.get('element');\n        element.onscroll = () => {\n            this.onScroll();\n        };\n    },\n\n    /**\n     * Invoked when the infinite scroll component has detected scrolling\n     * behavior within its main element\n     */\n    onScroll() {\n        const element: HTMLDivElement = this.get('element');\n        const scrollBottom = element.scrollTop + element.clientHeight;\n        const scrollThreshold = scrollBottom + this.get('scrollBottomThreshold');\n        if (scrollThreshold >= element.scrollHeight) {\n            this.checkInfiniteScroll();\n        }\n    },\n\n    /**\n     * Checks if infinite scrolling can be invoked based on other factors and properties\n     */\n    checkInfiniteScroll() {\n        if (!this.get('loading') && !this.get('disabled')) {\n            this.infiniteScroll();\n        }\n    },\n\n    /**\n     * @Action\n     * Invoked when the scroll container has reached the scroll threshold to load more data\n     */\n    infiniteScroll() {\n        Ember.Logger.warn('Infinite scroll event closure action has not been set up.');\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"x6vvnuBv\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"infinite-scroll-loader\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/infinite-scroll/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed, inject } = Ember;\n\nexport default Component.extend({\n    classNames: ['integration-badge'],\n    tagName: 'span',\n\n    intl: inject.service(),\n\n    // represents what integration we want to show\n    integration: null,\n    isSmall: false,\n    useLightIcon: false,\n\n    iconUri: computed('integration.icon', 'isSmall', 'useLightIcon', function () {\n        if (this.get('isSmall')) {\n            return this.get('useLightIcon')\n                ? this.get('integration.badgeIcons.light')\n                : this.get('integration.badgeIcons.dark');\n        }\n        return this.get('integration.icon');\n    }),\n\n    translation: computed.reads('integration.translation')\n});\n","export default Ember.HTMLBars.template({\"id\":\"isG4X8WY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"integration\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"img\\\",[]],[16,\\\"class\\\",[34,[\\\"integration-icon \\\",[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"mini-icon\\\"],null]]]],[16,\\\"src\\\",[26,[\\\"iconUri\\\"]],null],[16,\\\"alt\\\",[26,[\\\"translation\\\"]],null],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badge/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['integration-badges'],\n\n    phoneIntegrations: Ember.inject.service(),\n\n    entity: null,\n    size: null,\n    useLightIcon: false,\n    isSmall: Ember.computed.equal('size', 'small')\n});\n","export default Ember.HTMLBars.template({\"id\":\"lSIuV8JS\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"entity\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[28,[\\\"isSmall\\\"]],\\\"small-integration-badge\\\",\\\"\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[33,[\\\"phone-integrations\\\"],[[28,[\\\"entity\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"integration-badge\\\"],null,[[\\\"integration\\\",\\\"isSmall\\\",\\\"useLightIcon\\\"],[[28,[\\\"phoneIntegration\\\"]],[28,[\\\"isSmall\\\"]],[28,[\\\"useLightIcon\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"phoneIntegration\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/integration-badges/template.hbs\"}});","define(\"connections-ui/components/interaction-annotation/component\", [\"exports\", \"ember-purecloud-components/components/interaction-annotation/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar LightGalleryModal = Ember.Component.extend({\n    intl: Ember.inject.service(),\n\n    entity: null,\n    showing: false,\n    escaped: false,\n\n    gallery: Ember.computed('entity.images.informal', 'entity.images.gallery', function () {\n        if (this.get('entity.type') === 'group') {\n            return this.get('entity.images.gallery');\n        }\n        return this.get('entity.images.informal');\n    }),\n\n    actions: {\n        cancel() {\n            this.attrs.close();\n        }\n    },\n\n    initGallery: Ember.observer('showing', function () {\n        if (this.get('showing')) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                const gallery = Ember.$('#lightGallery');\n                const images = gallery.children('li');\n\n                images.each((index /*, image */) => {\n                    const caption =\n                        '<div class=\"customHtml\"><h3>' + this.get('gallery')[index].labelKey + '</h3></div>';\n                    Ember.$(this).attr('data-sub-html', caption);\n                });\n\n                gallery.lightGallery({\n                    caption: true,\n                    loop: true,\n                    speed: 1,\n                    closable: false,\n                    escKey: true,\n                    lang: { allPhotos: this.get('intl').lookup('images.allPhotos') }\n                });\n            });\n        }\n    })\n});\n\nexport default LightGalleryModal;\n","export default Ember.HTMLBars.template({\"id\":\"BWEPhqLd\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showing\\\"]]],null,{\\\"statements\\\":[[6,[\\\"modal-component\\\"],null,[[\\\"confirmText\\\",\\\"cancel\\\",\\\"headerText\\\",\\\"cancelText\\\"],[null,\\\"cancel\\\",[33,[\\\"t\\\"],[\\\"person.modals.viewPictures\\\"],null],[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]],{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"light-gallery-modal\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"ul\\\",[]],[15,\\\"id\\\",\\\"lightGallery\\\"],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"gallery\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"li\\\",[]],[16,\\\"data-src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"src\\\",[28,[\\\"image\\\",\\\"value\\\",\\\"x1024\\\"]],null],[13],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"image\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/light-gallery-modal/template.hbs\"}});","define(\"connections-ui/components/link-to-external\", [\"exports\", \"ember-engines/components/link-to-external-component\"], function (_exports, _linkToExternalComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _linkToExternalComponent.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['loading-indicator']\n});\n","export default Ember.HTMLBars.template({\"id\":\"Tx//k/3u\",\"block\":\"{\\\"statements\\\":[[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/loading-indicator/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['location-display', 'location'],\n\n    entity: null,\n    location: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"fewxU3+t\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\"],[[28,[\\\"location\\\"]],200]]],false],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location-name\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h5\\\",[]],[13],[1,[28,[\\\"location\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/location-display/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, inject, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['login-oauth'],\n\n    session: inject.service(),\n\n    isAuthenticated: computed.reads('session.isAuthenticated'),\n\n    // attrs\n    offerMobileApp: false,\n    // Expected Actions: mobileOfferDenied, authenticate\n\n    onMobileOfferDecline() {\n        return this.attrs.mobileOfferDeclined().then(this.attrs.authenticate);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!this.get('offerMobileApp')) {\n            this.attrs.authenticate();\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"dq/ukkxL\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"isAuthenticated\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"auth-loading\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/login-oauth/template.hbs\"}});","define(\"connections-ui/components/logoff-link/component\", [\"exports\", \"ember-purecloud-components/components/logoff-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport Popper from 'popper.js';\n\nexport default Ember.Component.extend({\n    tagName: 'ul',\n    classNames: ['media-provider-video-dropdown'],\n    classNameBindings: ['displayDropdown:display-dropdown:hide'],\n\n    webrtc: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    user: null,\n    room: null,\n    attachTo: null,\n    attachClickHandler: false,\n\n    _displayDropdown: true,\n\n    // Default implementation is to just run the provider action in Web-Directory\n    selectProvider(provider) {\n        const personId = this.get('user').get('id');\n        const providerId = provider.get('id');\n        this.get('embedded').launchVideoProviderWithPersonById(personId, providerId);\n        this.send('hide');\n    },\n\n    _popper: null,\n    _targetEl: null,\n\n    actions: {\n        hide() {\n            this.set('_displayDropdown', false);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        Ember.assert(!!this.get('user'), '`user` is required');\n        Ember.assert(!!this.get('attachTo'), '`attachTo` is required');\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        Ember.run.scheduleOnce('afterRender', this, this.setup);\n    },\n\n    willDestroyElement() {\n        if (this._popper) {\n            this._popper.destroy();\n            this._popper = null;\n        }\n\n        const targetEl = this._targetEl;\n        const ev = `click.${this.elementId}`;\n\n        Ember.$(window).off(ev);\n        if (targetEl) {\n            Ember.$(targetEl).off(ev);\n        }\n\n        this._super(...arguments);\n    },\n\n    setup() {\n        const targetEl = document.querySelector(this.get('attachTo'));\n        if (!targetEl) {\n            // Let's wait for a bit and check again...\n            // This might happen when we are waiting on asynchronous helpers\n            Ember.run.later(() => this.setup(), 250);\n\n            return;\n        }\n\n        if (this._targetEl) {\n            // We've already setup, dont try again\n            return;\n        }\n\n        this._targetEl = targetEl;\n\n        const popoverEl = this.element;\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            arrowElement: this.$('.media-provider-arrow')[0],\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        // Attach a click handler to the target so that we can control the dropdown\n        // internally instead of externally\n        if (this.get('attachClickHandler')) {\n            this.set('_displayDropdown', false);\n\n            Ember.$(targetEl).on(\n                `click.${this.elementId}`,\n                Ember.run.bind(this, () => Ember.run.once(this, this.handleClick))\n            );\n\n            Ember.$(window).on(`click.${this.elementId}`, Ember.run.bind(this, this.handleOutsideClick));\n        }\n    },\n\n    handleClick() {\n        this.toggleProperty('_displayDropdown');\n\n        Ember.run.join(() =>\n            Ember.run.scheduleOnce('afterRender', this, () => this._popper && this._popper.scheduleUpdate())\n        );\n    },\n\n    handleOutsideClick(event) {\n        if (!this.get('displayDropdown')) {\n            return;\n        }\n\n        let target = event.target;\n        let isAttachTarget = Ember.$(this.attachTo).is(target);\n        let componentParents = Ember.$(target).parent(this.elementId);\n        let attachTargetParents = Ember.$(target).parents(this.attachTo);\n\n        if (!isAttachTarget && componentParents.length === 0 && attachTargetParents.length === 0) {\n            this.send('hide');\n        }\n    },\n\n    showingVideo: Ember.computed(\n        'webrtc.activeRoom.{showingVideo,isAcdRoom}',\n        'mediaProviders.usingVideoProvider',\n        function () {\n            const showingPurecloudVideo =\n                this.get('webrtc.activeRoom.showingVideo') && !this.get('webrtc.activeRoom.isAcdRoom');\n            const showingMediaProvider = this.get('mediaProviders.usingVideoProvider');\n            return showingPurecloudVideo || showingMediaProvider;\n        }\n    ),\n\n    providers: Ember.computed('user', 'room', 'webrtc.activeRoom.oneToOneTarget.presence', function () {\n        return this.get('mediaProviders').getVideoProviders(this.get('user'), this.get('room'));\n    }),\n\n    displayDropdown: Ember.computed(\n        '_displayDropdown',\n        'attachTo',\n        'user.profile.content.isOffline',\n        'showingVideo',\n        'room',\n        function () {\n            let targetEl = this._targetEl;\n            if (!targetEl || this.get('showingVideo')) {\n                return false;\n            }\n\n            let chatRoom = this.get('room');\n            if (chatRoom && chatRoom.isGroupRoom()) {\n                return this._displayDropdown;\n            }\n\n            return this._displayDropdown;\n        }\n    )\n});\n","export default Ember.HTMLBars.template({\"id\":\"VTG6SUhQ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"providers\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"provider\\\",\\\"haveAccess\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"class\\\",[34,[[33,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],\\\"disabled\\\"],null]]]],[16,\\\"aria-disabled\\\",[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null],null],[5,[\\\"action\\\"],[[28,[null]],[28,[\\\"selectProvider\\\"]],[28,[\\\"provider\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[1,[28,[\\\"provider\\\",\\\"label\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabled\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"tooltip-on-element\\\"],null,[[\\\"side\\\",\\\"text\\\"],[\\\"right\\\",[33,[\\\"t\\\"],[[33,[\\\"await\\\"],[[28,[\\\"provider\\\",\\\"disabledMessage\\\"]]],null]],null]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[\\\"provider\\\"]},null],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-provider-arrow\\\"],[13],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/media-providers/video-dropdown/template.hbs\"}});","import Ember from 'ember';\n\nvar MiniCardComponent = Ember.Component.extend({\n    tagName: 'a',\n    attributeBindings: ['href'],\n    classNameBindings: [':mini-card', 'isManager:manager-card:'],\n\n    session: Ember.inject.service(),\n    intl: Ember.inject.service(),\n\n    entity: null,\n    currentPerson: null,\n    managerCount: null,\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n\n    isManager: Ember.computed('entity', 'currentPerson', function () {\n        return this.get('entity.id') === this.get('currentPerson.manager.id');\n    }),\n\n    managerCountText: Ember.computed('managerCount', function () {\n        const intl = this.get('intl');\n        const count = this.get('managerCount');\n        if (count === 1) {\n            return intl.lookup('person.relationships.peerCount.singular', {\n                count: count\n            });\n        } else {\n            return intl.lookup('person.relationships.peerCount.plural', {\n                count: count\n            });\n        }\n    }),\n\n    click: function () {\n        this.sendAction('action', this.get('entity'));\n    },\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    })\n});\n\nexport default MiniCardComponent;\n","export default Ember.HTMLBars.template({\"id\":\"PTNBkxes\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-4 col-md-4 col-lg-4 profile-pic\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[28,[\\\"entity\\\"]],200,false,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-xs-4 col-sm-8 col-md-8 col-lg-8 profile-general\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name-row\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"name\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"h4\\\",[]],[13],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"managerCount\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"managers\\\"],[13],[0,\\\"(\\\"],[1,[26,[\\\"managerCountText\\\"]],false],[0,\\\")\\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"status\\\"],[13],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"location\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/mini-card/template.hbs\"}});","import Ember from 'ember';\nimport layout from './template';\nimport * as focusTrap from 'focus-trap';\n\nexport default Ember.Component.extend({\n    layout: layout,\n    translucentOverlay: true,\n    containerClassNames: ['modal-component', 'modal', 'in', 'fade'].join(' '),\n    overlayClassNames: 'translucent',\n\n    intl: Ember.inject.service(),\n\n    headerText: '',\n    confirmText: '',\n    cancelText: '',\n\n    cancel: null,\n    confirm: null,\n\n    showHeader: true,\n    showFooter: true,\n    wrapContent: true,\n    enforceModality: false,\n\n    extraClassNames: '',\n\n    confirmDisabled: false,\n    noCancel: false,\n\n    trap: null,\n\n    actions: {\n        sendClose() {\n            this.send('sendCancel');\n        },\n\n        sendConfirm() {\n            if (typeof this.get('confirm') === 'function') {\n                let ret = this.get('confirm')();\n                if (ret && ret.then) {\n                    this.set('loading', true);\n                    ret.then(() => {\n                        this.set('loading', false);\n                    });\n                }\n            } else {\n                this.sendAction('confirm');\n            }\n        },\n\n        sendCancel() {\n            if (typeof this.attrs.cancel === 'function') {\n                this.attrs.cancel();\n            } else {\n                this.sendAction('cancel');\n            }\n        },\n\n        backdropDismiss() {\n            if (!this.get('enforceModality')) {\n                this.send('sendClose');\n            }\n        },\n\n        setAttribute(key, value) {\n            this.set(key, value);\n        }\n    },\n\n    setText: Ember.on('init', function () {\n        const intl = this.get('intl');\n        let { headerText, confirmText, cancelText } = this.getProperties('headerText', 'confirmText', 'cancelText');\n\n        if (headerText === '') {\n            headerText = intl.lookup('components.modal.header').toString();\n        }\n\n        if (confirmText === '') {\n            confirmText = intl.lookup('common.confirm').toString();\n        }\n\n        if (cancelText === '') {\n            cancelText = intl.lookup('common.cancel').toString();\n        }\n\n        this.setProperties({\n            headerText,\n            confirmText,\n            cancelText\n        });\n    }),\n\n    confirmAction: Ember.computed({\n        get() {\n            return this.get('confirm');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('confirm', value);\n            }\n            return value;\n        }\n    }),\n\n    cancelAction: Ember.computed({\n        get() {\n            return this.get('cancel');\n        },\n\n        set(key, value) {\n            if (typeof value === 'function') {\n                this.set('cancel', value);\n            }\n            return value;\n        }\n    }),\n\n    disableAction: Ember.computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    attachClassToBody: Ember.on('didInsertElement', function () {\n        Ember.$('body').addClass('modal-open');\n\n        const modalContainerElement = this.$('.modal-dialog .modal-content')[0];\n        this.trap = focusTrap.createFocusTrap(modalContainerElement, {\n            escapeDeactivates: false,\n            allowOutsideClick: true\n        });\n        if (this.trap) {\n            this.trap.activate();\n        }\n    }),\n\n    removeClassFromBody: Ember.on('willDestroyElement', function () {\n        Ember.$('body').removeClass('modal-open');\n        if (this.trap) {\n            this.trap.deactivate();\n        }\n    }),\n\n    setConfirmDisabled(value) {\n        return this.set('confirmDisabled', value);\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"vbH6Zjnv\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"overlayClassNames\\\",\\\"containerClassNames\\\",\\\"targetAttachment\\\",\\\"onClose\\\"],[[28,[\\\"overlayClassNames\\\"]],[28,[\\\"containerClassNames\\\"]],\\\"center\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"modal-dialog \\\",[26,[\\\"extraClassNames\\\"]]]]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[15,\\\"role\\\",\\\"dialog\\\"],[16,\\\"aria-label\\\",[26,[\\\"headerText\\\"]],null],[15,\\\"aria-modal\\\",\\\"true\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"wrapContent\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showHeader\\\"]],[28,[\\\"headerText\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"modal-title\\\"],[13],[1,[26,[\\\"headerText\\\"]],false],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.close\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"]],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-delete-row\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n                    \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setAttribute\\\"],null],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showFooter\\\"]],[33,[\\\"or\\\"],[[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"confirmText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-success btn-purecloud\\\"],[16,\\\"disabled\\\",[26,[\\\"confirmDisabled\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"sendConfirm\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"confirmText\\\"]],false],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\"]]],null,{\\\"statements\\\":[[0,\\\"                                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cancelText\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-cancel\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"sendCancel\\\"]],[13],[0,\\\"\\\\n                                \\\"],[1,[26,[\\\"cancelText\\\"]],false],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[9,\\\"gux-button\\\",{\\\"attrs\\\":[[15,\\\"id\\\",\\\"modal-button-close\\\"],[16,\\\"class\\\",[34,[\\\"close \\\",[33,[\\\"if\\\"],[[28,[\\\"noCancel\\\"]],\\\"hide\\\"],null]]]],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"sendClose\\\"],null],null],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[16,\\\"gux-title\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]],[15,\\\"accent\\\",\\\"ghost\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"close\\\"],[16,\\\"screenreader-text\\\",[34,[[33,[\\\"t\\\"],[\\\"common.close\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n                \\\"],[18,\\\"default\\\",[[28,[\\\"confirmAction\\\"]],[28,[\\\"cancelAction\\\"]],[28,[\\\"disableAction\\\"]],[28,[\\\"headerText\\\"]],[28,[\\\"confirmText\\\"]],[28,[\\\"cancelText\\\"]]]],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/modal-component/template.hbs\"}});","define(\"connections-ui/components/modal-dialog-overlay\", [\"exports\", \"ember-modal-dialog/components/modal-dialog-overlay\"], function (_exports, _modalDialogOverlay) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialogOverlay.default;\n    }\n  });\n});\n","define(\"connections-ui/components/modal-dialog\", [\"exports\", \"ember-modal-dialog/components/modal-dialog\"], function (_exports, _modalDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _modalDialog.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport ModalDialog from 'ember-modal-dialog/components/modal-dialog';\n\n// This is a wrapper for the modal-dialog in the ember-modal-dialog library\nexport default ModalDialog.extend({\n    didInsertElement() {\n        this._super(...arguments);\n        this._initEscListener();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        Ember.$('body').off('keyup.modal-dialog');\n    },\n\n    _initEscListener() {\n        const closeOnEscapeKey = ev => {\n            if (ev.key === 'Escape' || ev.key === 'Esc') {\n                this.sendAction('onClose');\n            }\n        };\n\n        Ember.$('body').on('keyup.modal-dialog', closeOnEscapeKey);\n    }\n});\n","define(\"connections-ui/components/navigation-sub-menu/component\", [\"exports\", \"ember-purecloud-components/components/navigation-sub-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nimport CreateGroupMixin from '../../mixins/create-group';\n\nconst { inject, Component } = Ember;\n\nexport default Component.extend(CreateGroupMixin, {\n    classNames: ['new-group'],\n\n    intl: inject.service(),\n\n    attrs: {\n        confirm() {},\n        cancel() {},\n        setAttribute() {}\n    },\n\n    setHandlers: Ember.on('init', function () {\n        const setAttr = this.get('setAttribute');\n        setAttr('confirm', this.createGroup.bind(this));\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            this.$('.form-control:first').focus();\n        });\n    }),\n\n    checkNameLength: Ember.observer('groupName', function () {\n        let isTooLong = this.get('groupName.length') > 140;\n\n        if (isTooLong) {\n            this.attrs.disable(true);\n            this.$('input.form-control').tooltip({\n                placement: 'bottom',\n                title: this.get('intl').lookup('groups.admin.nameLengthTooltip'),\n                trigger: 'manual'\n            });\n            this.$('input.form-control').tooltip('show');\n        } else {\n            this.attrs.disable(false);\n            this.$('input.form-control').tooltip('destroy');\n        }\n\n        this.set('nameLengthExceeded', isTooLong);\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"PP2l++Ax\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"row\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-12\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-name\\\"]]],[13],[1,[33,[\\\"t\\\"],[\\\"groups.name\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"input\\\"],null,[[\\\"id\\\",\\\"class\\\",\\\"value\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-name\\\"],null],\\\"form-control\\\",[28,[\\\"groupName\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4 control-label\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-type\\\"]]],[13],[1,[26,[\\\"groupTypeI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-type\\\"],null],[28,[\\\"groupType\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupType\\\"]]],null]],null],[28,[\\\"groupTypeDefault\\\"]],\\\"form-control group-type\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupTypeChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupTypeChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupTypeChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupTypeChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-4\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"label\\\",[]],[16,\\\"for\\\",[34,[[26,[\\\"elementId\\\"]],\\\"-groups-visibility\\\"]]],[13],[1,[26,[\\\"groupVisibilityI18nLabel\\\"]],false],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"col-sm-8\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"default\\\",\\\"class\\\"],[[33,[\\\"concat\\\"],[[28,[\\\"elementId\\\"]],\\\"-groups-visibility\\\"],null],[28,[\\\"groupVisibility\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"groupVisibility\\\"]]],null]],null],[28,[\\\"groupVisibilityDefault\\\"]],\\\"form-control group-visibility\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"newGroupVisibilityChoices\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"groupVisibilityChoice\\\",\\\"value\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"groupVisibilityChoice\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"groupVisibilityChoice\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"clearfix\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/new-group/template.hbs\"}});","define(\"connections-ui/components/occludable-area\", [\"exports\", \"smoke-and-mirrors/components/occludable-area\"], function (_exports, _occludableArea) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _occludableArea.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pc-style-icon-example\", [\"exports\", \"ember-purecloud-style/components/pc-style-icon-example\"], function (_exports, _pcStyleIconExample) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pcStyleIconExample.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport WebrtcActionUtilsMixin from 'connections-ui/mixins/webrtc-action-utils';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\nimport DS from 'ember-data';\nimport Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport default Component.extend(WebrtcActionUtilsMixin, EntityImageDefaults, {\n    classNameBindings: ['isActive:current:sibling', 'isActive:col-sm-6:col-sm-3', ':card'],\n    attributeBindings: ['entity.id:data-entity-id'],\n\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    isGeolocationEnabled: Ember.computed.readOnly('geolocation.isEnabled'),\n    canViewChat: Ember.computed.bool('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.bool('permissions.canViewCollaborateVideo'),\n    entity: null,\n\n    phone: inject(),\n\n    needsServices: ['chat'],\n    excludedFields: ['chat'],\n\n    init() {\n        this._super(...arguments);\n        this.checkUnusedFields();\n    },\n\n    emailEnabled: computed.notEmpty('entity.email'),\n    showPhone: computed.bool('phoneServiceEnabled'),\n\n    phoneNumber: computed('phoneNumber', function () {\n        let entity = this.get('entity');\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n\n        let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n        if (phone && phone.value && phone.value.fieldPath) {\n            return entity.getFieldValue(phone.value.fieldPath);\n        }\n\n        if (phone.rel) {\n            return phone.rel.e164;\n        }\n    }),\n\n    isSelf: Ember.computed('entity.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityContactGroupData: computed('entity.email', 'entity.phone.number', function () {\n        return {\n            isPerson: true,\n            isChatEnabled: true,\n            videoTooltipTitle: this.get('videoTooltipTitle'),\n            isWebrtcEnabled: this.get('isWebrtcEnabled'),\n            emailEnabled: this.get('emailEnabled'),\n            linkToProfile: 'person.detail',\n            phoneServiceEnabled: this.get('phoneServiceEnabled'),\n            phoneAvailable: this.get('phone.enabled'),\n            emailAddress: this.entity.get('email'),\n            telephoneNumber: this.entity.get('phone.number'),\n            showPhone: this.get('showPhone'),\n            isVideoButtonEnabled: this.get('isVideoButtonEnabled'),\n            canViewChat: this.get('canViewChat'),\n            canViewVideo: this.get('canViewVideo')\n        };\n    }),\n\n    checkUnusedFields: observer('entity', function () {\n        this.set('excludedFields', ['chat']);\n\n        if (this.get('entity.fieldConfig.sections') !== undefined) {\n            var fields = this.get('entity.fieldConfig.sections')[7].get('fieldList');\n\n            for (var i = 0; i < fields.length; i++) {\n                var value = this.get('entity.data.contactInfo.' + fields[i].key);\n\n                if (value === undefined || value[0].value === '') {\n                    this.get('excludedFields').push(fields[i].key);\n                }\n            }\n        }\n    }),\n\n    initialFieldsCheck: Ember.on('init', function () {\n        this.checkUnusedFields();\n    }),\n    eLocation: Ember.computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.entity, 'geolocation.city'),\n            region: Ember.get(this.entity, 'geolocation.region'),\n            country: Ember.get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: Ember.computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: Ember.get(this.session.person, 'geolocation.city'),\n            region: Ember.get(this.session.person, 'geolocation.region'),\n            country: Ember.get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: Ember.computed('eLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.get('isGeolocationEnabled'),\n            eLocation: this.get('eLocation'),\n            selfLocation: this.get('selfLocation')\n        };\n    }),\n    actions: {\n        startChat: function () {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [this.get('entity')]\n            });\n        },\n\n        moveToPerson: function () {\n            this.sendAction('setPerson', this.get('entity'));\n        }\n    },\n\n    async toggleFavorite() {\n        await this.get('favorites').toggleFavorite(this.entity);\n        this.setEntityContactGroupData();\n    },\n\n    navigateToProfileEvent() {\n        try {\n            const router = getOwner(this).lookup('router:main');\n            const profileId = this.entity.get('id');\n            if (router && profileId) router.transitionTo('person.detail', profileId);\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    },\n\n    contactEvent(e) {\n        try {\n            const openChat = this.get('actionOpenChatRoom');\n            const openVideo = this.get('actionOpenVideoCall');\n\n            switch (e.detail) {\n                case 'call':\n                    this.callEntity(this.entity);\n                    break;\n                case 'chat':\n                    if (openChat) {\n                        openChat(this.entity);\n                    }\n                    break;\n                case 'video':\n                    if (this.get('isOneToOneOfflineOrBusy') || !this.get('isVideoButtonEnabled')) {\n                        return;\n                    }\n                    if (openVideo) {\n                        openVideo(this.entity.get('jid'), this.get('useMediaProviders'));\n                    }\n                    break;\n                case 'navigateToProfile':\n                    this.navigateToProfileEvent();\n                    break;\n                default:\n                    Ember.Logger.error('Error: contact event not found.');\n                    break;\n            }\n        } catch (err) {\n            Ember.Logger.error(err);\n        }\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"PAQ203B5\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"person-image\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"moveToPerson\\\"]],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],400,true,true]]],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-info\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h2\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[28,[\\\"entity\\\",\\\"name\\\"]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"h5\\\",[]],[15,\\\"class\\\",\\\"title\\\"],[13],[1,[28,[\\\"entity\\\",\\\"title\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"department\\\"],[13],[1,[28,[\\\"entity\\\",\\\"department\\\"]],false],[14],[0,\\\"\\\\n\\\\n    \\\"],[1,[33,[\\\"entity-status\\\"],null,[[\\\"entityId\\\"],[[28,[\\\"entity\\\",\\\"id\\\"]]]]],false],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-location-container\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"entity-location\\\"],null,[[\\\"entity\\\",\\\"class\\\"],[[28,[\\\"entity\\\"]],\\\"entity-location align-center\\\"]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-contact\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isSelf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"link-to\\\"],[\\\"person.detail\\\",[28,[\\\"entity\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"menu-label\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"tooltip.person.profile\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[1,[33,[\\\"entity-contact-group-v2\\\"],null,[[\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"entity\\\",\\\"linkProfile\\\",\\\"showImages\\\",\\\"useMediaProviders\\\"],[[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"entity\\\"]],true,false,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-card/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonGraphComponent = Ember.Component.extend({\n    classNames: ['person-graph'],\n    classNameBindings: ['mini:mini'],\n    attributeBindings: ['width', 'height'],\n\n    person: null,\n\n    graph: null,\n    paper: null,\n\n    mini: false,\n\n    trueColor: '#66f',\n    trueStrokeColor: 'white',\n\n    falseColor: '#ddd',\n    falseStrokeColor: 'white',\n\n    disabledColor: 'transparent',\n    disabledStrokeColor: 'transparent',\n\n    disabledSegments: null,\n\n    paths: null,\n    baseAttrForPath: {},\n\n    segmentChanged: Ember.observer(\n        'graph',\n        'graph.{ancestors,parent,self,siblings,children,descendants}',\n        function (sender, key) {\n            if (this.get('paths')) {\n                var segName = key.split('.').reverse()[0];\n                var segment = this.get('paths.' + segName);\n                if (segment) {\n                    segment.attr(this.attrForSegment(segName));\n                }\n            }\n        }\n    ),\n\n    disabledSegmentsChanged: Ember.observer('disabledSegments.[]', function () {\n        var segs = this.get('disabledSegments');\n        var graph = this.get('graph');\n        if (segs && graph) {\n            for (var i = 0; i < segs.length; i++) {\n                graph.set(segs[i], false);\n                this.segmentChanged(this, 'graph.' + segs[i]);\n            }\n        }\n    }),\n\n    setupGraph: Ember.on('didInsertElement', function () {\n        this.set('paths', {});\n\n        if (!this.get('graph')) {\n            this.set(\n                'graph',\n                Ember.Object.create({\n                    ancestors: false,\n                    parent: false,\n                    self: false,\n                    siblings: false,\n                    children: false,\n                    descendants: false\n                })\n            );\n        }\n\n        this.drawGraphics();\n    }),\n\n    destroyGraphics: Ember.on('willDestroyElement', function () {\n        if (this.get('paper')) {\n            this.get('paper').remove();\n            this.set('paper', null);\n        }\n    }),\n\n    click: function (event) {\n        if (this.get('mini')) {\n            return;\n        }\n\n        var target = Ember.$(event.target);\n\n        if (target.is('path')) {\n            var segment = target.data('segmentName');\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: segment\n            });\n        } else if (target.is('img') || target.is('.entity-image')) {\n            this.triggerAction({\n                action: 'selectRelationship',\n                actionContext: 'self'\n            });\n        }\n    },\n\n    isDisabled: function (segment) {\n        return this.get('disabledSegments') && this.get('disabledSegments').indexOf(segment) > -1;\n    },\n\n    drawGraphics: function () {\n        this.destroyGraphics();\n\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var paper = new window.Raphael(this.get('element'), width, height);\n        this.set('paper', paper);\n\n        this.drawSegment('ancestors');\n        this.drawSegment('parent');\n        this.drawSegment('self');\n        this.drawSegment('siblings');\n        this.drawSegment('children');\n        this.drawSegment('descendants');\n\n        paper.renderfix();\n        paper.safari();\n    },\n\n    drawSegment: function (segment) {\n        var width = this.get('width') || 200;\n        var height = this.get('height') || 200;\n\n        var xform = ['s', width, ',', height, ',0,0'];\n\n        var path = this.get('paper').path(this.pathForSegment(segment));\n        var attr = $.extend(this.get('baseAttrForPath'), this.attrForSegment(segment), { 'stroke-width': 0.5 });\n\n        path.transform(xform.join('')).attr(attr);\n        Ember.$(path.node).data('segmentName', segment);\n\n        this.set('paths.' + segment, path);\n    },\n\n    attrForSegment: function (segment) {\n        var attr = {};\n        attr.cursor = 'pointer';\n\n        if (this.isDisabled(segment)) {\n            attr.fill = this.get('disabledColor');\n            attr.stroke = this.get('disabledStrokeColor');\n            attr.cursor = 'default';\n        } else if (this.get('graph.' + segment)) {\n            attr.fill = this.get('trueColor');\n            attr.stroke = this.get('trueStrokeColor');\n        } else {\n            attr.fill = this.get('falseColor');\n            attr.stroke = this.get('falseStrokeColor');\n        }\n\n        if (this.get('mini')) {\n            attr.cursor = 'default';\n        }\n\n        return attr;\n    },\n\n    pathForSegment: function (segment) {\n        if (this.get('mini')) {\n            return this.get(segment + 'SmallPath');\n        } else {\n            return this.get(segment + 'Path');\n        }\n    },\n\n    ancestorsPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentPath:\n        'M0.439,0.299C0.458,0.294,0.478,0.29,0.499,0.29c0.022,0,0.043,0.004,0.064,0.011V0.258h0.062L0.499,0.133L0.374,0.258h0.065V0.299z',\n    selfPath:\n        'M0.499,0.313c-0.103,0-0.186,0.083-0.186,0.186s0.083,0.186,0.186,0.186s0.186-0.083,0.186-0.186S0.602,0.313,0.499,0.313z  M0.499,0.624c-0.069,0-0.125-0.056-0.125-0.125c0-0.069,0.056-0.125,0.125-0.125c0.069,0,0.125,0.056,0.125,0.125C0.624,0.568,0.568,0.624,0.499,0.624z',\n    siblingsPath:\n        'M0.298,0.559C0.293,0.54,0.289,0.52,0.289,0.5c0-0.022,0.004-0.044,0.011-0.064H0.173V0.374L0.049,0.5l0.125,0.125V0.559H0.298z M0.698,0.438c0.005,0.019,0.009,0.039,0.009,0.059c0,0.023-0.004,0.044-0.011,0.064h0.126v0.062l0.125-0.126L0.823,0.372v0.065H0.698z',\n    childrenPath:\n        'M0.56,0.699C0.541,0.705,0.521,0.708,0.5,0.708c-0.022,0-0.044-0.004-0.064-0.011v0.043H0.374L0.5,0.865l0.125-0.125H0.56V0.699z',\n    descendantsPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z',\n\n    ancestorsSmallPath: 'M0.439,0.173L0.499,0.114L0.563,0.178L0.563,0.125L0.625,0.125L0.499,0L0.374,0.125L0.439,0.125z',\n    parentSmallPath:\n        'M0.439,0.343c0.019-0.007,0.039-0.011,0.06-0.011c0.022,0,0.044,0.004,0.064,0.013V0.291h0.062L0.499,0.167L0.374,0.291h0.065V0.343z',\n    selfSmallPath:\n        'M0.499,0.374c-0.069,0-0.125,0.056-0.125,0.125c0,0.069,0.056,0.125,0.125,0.125c0.069,0,0.125-0.057,0.125-0.125c0-0.038-0.017-0.072-0.043-0.095C0.559,0.385,0.53,0.374,0.499,0.374z',\n    siblingsSmallPath:\n        'M0.332,0.499c0-0.023,0.004-0.044,0.013-0.063H0.208V0.374L0.083,0.5l0.125,0.125V0.559h0.136C0.336,0.54,0.332,0.52,0.332,0.499z M0.916,0.498L0.791,0.374v0.065H0.654c0.007,0.019,0.012,0.039,0.012,0.06c0,0.022-0.004,0.043-0.013,0.063h0.138v0.062L0.916,0.498z',\n    childrenSmallPath:\n        'M0.56,0.654L0.56,0.654C0.55,0.658,0.541,0.661,0.53,0.663S0.51,0.666,0.499,0.666c-0.011,0-0.022-0.001-0.033-0.003c-0.01-0.002-0.021-0.005-0.03-0.009v0.054H0.374L0.5,0.833l0.125-0.125H0.56V0.654z',\n    descendantsSmallPath: 'M0.559,0.827L0.5,0.886L0.436,0.822L0.436,0.875L0.374,0.875L0.5,1L0.625,0.875L0.559,0.875z'\n});\nexport default PersonGraphComponent;\n","export default Ember.HTMLBars.template({\"id\":\"fmI57xbg\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"mini\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-graph/template.hbs\"}});","import Ember from 'ember';\n\nvar PersonIconComponent = Ember.Component.extend({\n    classNames: ['person-icon'],\n\n    favorites: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    canViewChat: Ember.computed.reads('permissions.canViewBusinessChat'),\n    canViewVideo: Ember.computed.reads('permissions.canViewCollaborateVideo'),\n    person: null,\n\n    actions: {\n        noop: () => {}\n    }\n});\n\nexport default PersonIconComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Vh8AiTYZ\",\"block\":\"{\\\"statements\\\":[[6,[\\\"entity-image-v2\\\"],null,[[\\\"entity\\\",\\\"size\\\",\\\"useInitialsPlaceholder\\\",\\\"enableMiniCard\\\",\\\"isLinkable\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"subscribeToPresence\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"componentUpdated\\\",\\\"onContact\\\"],[[28,[\\\"person\\\"]],48,true,true,true,true,[28,[\\\"favorites\\\",\\\"enabled\\\"]],true,[28,[\\\"canViewChat\\\"]],[28,[\\\"canViewVideo\\\"]],[28,[\\\"componentUpdated\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"noop\\\"],null]]],{\\\"statements\\\":[[0,\\\"    \\\"],[1,[33,[\\\"integration-badges\\\"],null,[[\\\"entity\\\"],[[28,[\\\"person\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/person-icon/template.hbs\"}});","import Ember from 'ember';\r\nimport PikadayInputComponent from 'ember-pikaday/components/pikaday-input';\r\n\r\nexport default PikadayInputComponent;\r\n","define(\"connections-ui/components/pikaday-inputless\", [\"exports\", \"ember-pikaday/components/pikaday-inputless\"], function (_exports, _pikadayInputless) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pikadayInputless.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-component\", [\"exports\", \"ember-tooltips/components/popover-on-component\"], function (_exports, _popoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/popover-on-element\", [\"exports\", \"ember-tooltips/components/popover-on-element\"], function (_exports, _popoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _popoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple\", [\"exports\", \"ember-power-select/components/power-select-multiple\"], function (_exports, _powerSelectMultiple) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectMultiple.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select-multiple/trigger\", [\"exports\", \"ember-power-select/components/power-select-multiple/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select\", [\"exports\", \"ember-power-select/components/power-select\"], function (_exports, _powerSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelect.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/before-options\", [\"exports\", \"ember-power-select/components/power-select/before-options\"], function (_exports, _beforeOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _beforeOptions.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/options\", [\"exports\", \"ember-power-select/components/power-select/options\"], function (_exports, _options) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _options.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/placeholder\", [\"exports\", \"ember-power-select/components/power-select/placeholder\"], function (_exports, _placeholder) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _placeholder.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/power-select-group\", [\"exports\", \"ember-power-select/components/power-select/power-select-group\"], function (_exports, _powerSelectGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _powerSelectGroup.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/search-message\", [\"exports\", \"ember-power-select/components/power-select/search-message\"], function (_exports, _searchMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _searchMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/components/power-select/trigger\", [\"exports\", \"ember-power-select/components/power-select/trigger\"], function (_exports, _trigger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trigger.default;\n    }\n  });\n});\n","define(\"connections-ui/components/pre-render\", [\"exports\", \"smoke-and-mirrors/components/pre-render\"], function (_exports, _preRender) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _preRender.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-label/person-activity/component\", [\"exports\", \"ember-purecloud-components/components/presence-label/person-activity/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/presence-selector-dropdown/component\", [\"exports\", \"ember-purecloud-components/components/presence-selector-dropdown/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/profile-dropdown-menu/component\", [\"exports\", \"ember-webrtc-components/components/profile-dropdown-menu/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/progress-underlay/component\", [\"exports\", \"ember-purecloud-components/components/progress-underlay/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/queue-toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/queue-toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Component } = Ember;\n\nexport default Component.extend({\n    tagName: 'input',\n\n    attributeBindings: [\n        'type',\n        'disabled',\n        'isChecked:checked',\n        'name',\n        'ariaLabel:aria-label',\n        'ariaLabelledBy:aria-labelledby',\n        'ariaDescribedBy:aria-describedby'\n    ],\n\n    checked: false,\n    disabled: false,\n    onClick: () => {},\n\n    type: 'radio',\n    name: 'radio',\n    ariaLabel: null,\n    ariaLabelledBy: null,\n    ariaDescribedBy: null,\n    isChecked: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('isChecked', this.get('checked'));\n    },\n\n    didUpdateAttrs() {\n        this.set('isChecked', this.get('checked'));\n    },\n\n    click(event) {\n        this.set('isChecked', true);\n\n        this.get('onClick')();\n\n        event.stopPropagation();\n    }\n});\n","import Ember from 'ember';\n\nconst { on, observer, Component } = Ember;\n\nexport default Component.extend({\n    classNameBindings: [':resizable-content', 'minimized:minimized:maximized'],\n\n    isMouseDown: false,\n    minimized: true,\n\n    minHeight: 0,\n    maxHeight: null,\n    actions: {\n        toggleSize() {\n            this.toggleProperty('minimized');\n        }\n    },\n\n    attachCurrentHeight: on('didInsertElement', function () {\n        this.$().css('min-height', this.get('minHeight'));\n    }),\n\n    minimizedChanged: observer('minimized', function () {\n        if (this.get('minimized')) {\n            this.$().css('min-height', this.get('minHeight'));\n        } else {\n            let maxHeight = this.get('maxHeight');\n            if (!maxHeight) {\n                maxHeight = 'calc(100% - 8px)';\n                this.set('maxHeight', maxHeight);\n            }\n            this.$().css('min-height', maxHeight);\n        }\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"O1G95mNX\",\"block\":\"{\\\"statements\\\":[[18,\\\"default\\\"],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"resize-handle btn btn-purecloud\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleSize\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"minimized\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.expand\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"common.collapse\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n        \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/resizable-content/template.hbs\"}});","define(\"connections-ui/components/resize-detector\", [\"exports\", \"ember-element-resize-detector/components/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-group', 'panel', 'panel-default'],\n    classNameBindings: ['panelId'],\n\n    facet: null,\n    parentId: null,\n\n    selectedTerms: [],\n\n    accordianParentId: Ember.computed('parentId', function () {\n        return '#' + this.get('parentId');\n    }),\n\n    panelId: Ember.computed('facet.facetName', function () {\n        return this.get('facet.facetName').replace(/\\./g, '_');\n    }),\n\n    href: Ember.computed('panelId', function () {\n        return '#' + this.get('panelId');\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"4Rob5zmU\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"facet-label panel-heading\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"h4\\\",[]],[15,\\\"class\\\",\\\"panel-title\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"role\\\",\\\"button\\\"],[15,\\\"data-toggle\\\",\\\"collapse\\\"],[16,\\\"data-parent\\\",[26,[\\\"parentId\\\"]],null],[16,\\\"href\\\",[26,[\\\"href\\\"]],null],[15,\\\"aria-expanded\\\",\\\"true\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"facet-label\\\"],null,[[\\\"facet\\\"],[[28,[\\\"facet\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[16,\\\"class\\\",[34,[\\\"pc \\\",[33,[\\\"if\\\"],[[28,[\\\"showDropdown\\\"]],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"],null]]]],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"terms panel-collapse collapse in\\\"],[16,\\\"id\\\",[26,[\\\"panelId\\\"]],null],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-body\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"facet\\\",\\\"terms\\\"]]],[[\\\"key\\\"],[\\\"term\\\"]],{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"term \\\",[33,[\\\"css-classify\\\"],[[28,[\\\"term\\\",\\\"term\\\"]]],null]]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"search-facet-term\\\"],null,[[\\\"facet\\\",\\\"term\\\",\\\"selectedTerms\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\"]],[28,[\\\"selectedTerms\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"term\\\"]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-group/template.hbs\"}});","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    classNames: ['search-facet-term'],\n\n    facet: null,\n    term: null,\n\n    selectedTerms: [],\n\n    isSelected: false,\n\n    actions: {\n        selectTerm: function () {\n            var term = this.get('term');\n            var facet = this.get('facet');\n            var action = 'selectTerm';\n\n            this.bubbleAction({\n                action: action,\n                actionContext: [term, facet]\n            });\n        }\n    },\n\n    selectedTermsChanged: Ember.observer('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var term = terms.findBy('term', this.get('term'));\n        this.set('isSelected', term !== undefined);\n    })\n\n    //    isSelectedChanged: Ember.observer('isSelected', function () {\n    //        var selected = this.get('isSelected');\n    //        if (!selected) {\n    //            this.send('selectTerm');\n    //        }\n    //    })\n\n    //    isSelected: Ember.computed('selectedTerms.[]', function () {\n    //        var terms = this.get('selectedTerms');\n    //        var term = terms.findBy('term', this.get('term'));\n    //        return term !== undefined;\n    //    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"8+SnBQn/\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"term\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"search.selectTag\\\"],[[\\\"tag\\\",\\\"count\\\"],[[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],[28,[\\\"term\\\",\\\"count\\\"]]]]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectTerm\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"facet-term-label\\\"],null,[[\\\"facet\\\",\\\"term\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"term\\\",\\\"term\\\"]]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"count\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[28,[\\\"term\\\",\\\"count\\\"]],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-facet-term/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../../utils/newrelic';\nimport { BASE_GROUP_FIELDS } from '../../models/group';\nimport { BASE_LOCATION_FIELDS } from '../../models/location';\nimport { BASE_PERSON, BASE_PERSON_EXPANDS, BASE_PERSON_FIELDS } from '../../models/person';\nimport { MULTI_ENTITY_FIELDS } from '../../utils/entity-fields';\n\nconst FAVORITE_LIMIT = 200;\nconst FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA = 50;\n\nconst PAGE_SIZE = 15;\nconst FACET_COUNT = 10;\nconst PAGE_LIMIT = 4;\nconst keypathRegex = /[\\w+.]+:\"?.[^\"]+([\\w\\s]+)?\"?/gi;\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nfunction reverseLookup(obj, value) {\n    for (const key in obj) {\n        if (obj[key] === value) {\n            return key;\n        }\n    }\n}\n\nconst FacetTerm = Ember.Object.extend({\n    facet: null,\n    term: null,\n    isKeyword: false,\n\n    searchField: Ember.computed('facet.facetName', function () {\n        return reverseLookup(SEARCH_FACET_KEYPATHS, this.get('facet.facetName'));\n    }),\n\n    toString: function () {\n        if (this.get('isKeyword')) {\n            return this.get('term.term');\n        }\n\n        const name = this.get('facet.facetName');\n        const term = this.get('term.term');\n        return `${name}:\"${term}\"`;\n    }\n});\n\nconst View = {\n    classNames: ['container-fluid', 'search-results-page'],\n\n    attachScrollListener: Ember.on('didInsertElement', function () {\n        this.$().on('scroll.' + this.get('elementId'), () => {\n            this.loadNextPage();\n        });\n    }),\n\n    removeListeners: Ember.on('willDestroyElement', function () {\n        this.$().off('.' + this.get('elementId'));\n    }),\n\n    createDebouncedLoadNextPage: Ember.on('init', function () {\n        this.loadNextPage = _.debounce(function () {\n            Ember.run(() => {\n                // model.isPending\n                if (this.get('model._state') === 0 || this.get('_state') !== 'inDOM') {\n                    return;\n                }\n\n                var scroll = this.$().scrollTop();\n                var height = this.$('.search-content').height() - this.$().height();\n\n                if (height - scroll <= 500) {\n                    this.send('loadMore');\n                }\n            });\n        }, 150);\n    }),\n\n    // Keep loading pages of results until the page is filled with items.\n    // The reason this was added was because when permissions are at play,\n    // search results can come back with limited data.\n    loadResultsToFillPage: Ember.observer('model._state', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            this.loadNextPage();\n        }\n    }),\n\n    scrollToTopOnPageZero: Ember.observer('page', function () {\n        if (this.get('_state') === 'inDOM' && this.get('page') === 0) {\n            Ember.run.scheduleOnce('afterRender', this, function () {\n                let $el = this.$();\n                if ($el && $el.scrollTop) {\n                    $el.scrollTop(0);\n                }\n            });\n        }\n    })\n};\n\nconst Controller = {\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    search: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    integrationsPresence: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    _searchQuery: null,\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true,\n\n    page: 0,\n\n    loading: {\n        searchResults: false,\n        facets: false\n    },\n\n    selectedTerms: [],\n    searchResults: [],\n    facets: null,\n    totalResults: 0,\n    lastSearchFavoritesCount: 0,\n\n    init(...args) {\n        this._super(...args);\n        this.get('favorites').on('favoriteChange', this, this.onFavoriteChanged);\n    },\n    willDestroyElement(...args) {\n        this._super(...args);\n        this.get('favorites').off('favoriteChange', this, this.onFavoriteChanged);\n    },\n\n    onFavoriteChanged() {\n        if (this.get('entity') === 'favorites') {\n            Ember.run.debounce(this, this.runSearchQuery, 300);\n        }\n    },\n\n    actions: {\n        changeSearchType: function (type) {\n            var currentActive = this.get('entity');\n\n            if (currentActive === type) {\n                return false;\n            }\n\n            this.set('entity', type || 'all');\n        },\n\n        selectTerm: function (term, facet) {\n            var terms = this.get('selectedTerms');\n            var termObj = terms.findBy('term', term);\n\n            if (terms && terms.length === 10) {\n                this.notifyTooManySearchFilters();\n                return;\n            }\n\n            if (termObj !== undefined) {\n                this.get('selectedTerms').removeObject(termObj);\n            } else {\n                termObj = FacetTerm.create({\n                    term: term,\n                    facet: facet\n                });\n\n                this.get('selectedTerms').addObject(termObj);\n            }\n\n            this.updateQueryOnTermsChange();\n        },\n\n        removeSelectedTerm: function (term /*, facet*/) {\n            var termObj = this.get('selectedTerms').findBy('term', term);\n\n            if (termObj) {\n                this.get('selectedTerms').removeObject(termObj);\n                this.updateQueryOnTermsChange();\n            }\n        },\n\n        loadMore: function () {\n            if (this.get('hasMoreResults')) {\n                this.runSearchQuery(true);\n            }\n        }\n    },\n\n    changeTabButtons: Ember.on('didRender', function () {\n        this.$('.entity-type-filter .gux-tab-button').attr('aria-controls', 'search-results');\n    }),\n\n    atPageLimit: Ember.computed.equal('page', PAGE_LIMIT),\n    remainingResults: Ember.computed('totalResults', 'page', function () {\n        return this.get('totalResults') - this.get('page') * PAGE_SIZE;\n    }),\n\n    hasMoreResults: Ember.computed('remainingResults', 'loading.searchResults', function () {\n        const moreResults = this.get('remainingResults') > 0;\n        const loading = this.get('loading.searchResults');\n        return !loading && moreResults;\n    }),\n\n    groupedSelectedTerms: Ember.computed('selectedTerms.[]', function () {\n        var terms = this.get('selectedTerms');\n        var data = [];\n\n        terms.forEach(function (termObj) {\n            var term = termObj.get('term');\n            var facet = termObj.get('facet');\n            var currentGroup = data.findBy('facet.facetName', facet.facetName);\n\n            if (!currentGroup) {\n                currentGroup = {\n                    facet: facet,\n                    terms: [term]\n                };\n\n                data.addObject(currentGroup);\n            } else {\n                currentGroup.terms.addObject(term);\n            }\n        });\n\n        return data;\n    }),\n\n    isEmpty: Ember.computed('model._state', 'loading.searchResults', 'loading.facets', function () {\n        if (this.get('model._state') === 1) {\n            // model.isFulfilled\n            return this.get('totalResults') === 0;\n        } else if (this.get('model._state') === 2) {\n            // model.isRejected\n            return true;\n        }\n        return false;\n    }),\n\n    isGroups: Ember.computed.equal('entity', 'groups'),\n    isLocations: Ember.computed.equal('entity', 'locations'),\n    isExternalContacts: Ember.computed.equal('entity', 'externalContacts'),\n\n    isExternalContactsEmpty: Ember.computed('isExternalContacts', 'totalResults', 'query', function () {\n        return this.get('isExternalContacts') && this.get('totalResults') === 0 && !this.get('query');\n    }),\n\n    isFavorite: Ember.computed.equal('entity', 'favorites'),\n    isFavoritesEmpty: Ember.computed('isFavorite', 'lastSearchFavoritesCount', function () {\n        return this.get('isFavorite') && this.get('lastSearchFavoritesCount') === 0;\n    }),\n\n    haveSelectedTerms: Ember.computed.notEmpty('selectedTerms'),\n\n    displayFacets: Ember.computed('facets', 'selectedTerms', function () {\n        const facets = this.get('facets');\n        if (!Array.isArray(facets)) {\n            return facets;\n        }\n\n        // remove facets which are selected terms\n        const selectedTerms = this.get('selectedTerms');\n        facets.forEach(facet => {\n            const { facetName, terms } = facet;\n            facet.terms = terms.filter(\n                ({ term }) =>\n                    !selectedTerms.find(\n                        selected => selected.get('facet.facetName') === facetName && selected.get('term.term') === term\n                    )\n            );\n        });\n\n        // remove empty facets\n        return facets.filter(({ terms }) => !_.isEmpty(terms));\n    }),\n\n    updateQueryParameters() {\n        let queryParameters = '';\n        const params = [];\n        if (this.get('entity')) {\n            params.push(`entity=${encodeURIComponent(this.get('entity'))}`);\n        }\n        if (this.get('query')) {\n            params.push(`query=${encodeURIComponent(this.get('query'))}`);\n        }\n        if (this.get('queryFacets')) {\n            params.push(`queryFacets=${encodeURIComponent(this.get('queryFacets'))}`);\n        }\n        if (params.length) {\n            queryParameters = `?${params.join('&')}`;\n        }\n        const newHash = `#/search-v2${queryParameters}`;\n        if (newHash !== this.lastHash) {\n            this.lastHash = newHash;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n            return true;\n        }\n        return false;\n    },\n\n    searchInitial: Ember.on('didInsertElement', function () {\n        if (!this.get('entity')) {\n            this.set('entity', 'all'); // This will trigger a new /search (via searchOnChange() observer)\n        } else {\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    searchOnChange: Ember.observer('entity', 'query', 'queryFacets', function () {\n        if (window.top.location.hash.startsWith('#/search-v2') && this.updateQueryParameters()) {\n            Ember.run.next(this, this.runSearchQuery);\n        }\n    }),\n\n    updateQueryOnTermsChange() {\n        var terms = this.get('selectedTerms');\n\n        var termStrings = _.chain(terms)\n            .filter(term => !term.get('isKeyword'))\n            .map(term => term.toString())\n            .value();\n        var queryFacets = termStrings.join(' ');\n\n        var keywordStrings = _.map(\n            _.filter(terms, function (term) {\n                return term.get('isKeyword');\n            }),\n            function (term) {\n                return term.toString();\n            }\n        );\n        var query = keywordStrings.join(' ');\n\n        this.setProperties({\n            query,\n            queryFacets\n        });\n    },\n\n    _baseSearch() {\n        return {\n            pageSize: PAGE_SIZE,\n            sortOrder: 'SCORE'\n        };\n    },\n\n    _baseAggregations() {\n        const terms = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        const aggregateTerm = name => ({\n            name,\n            field: name,\n            type: 'TERM',\n            size: FACET_COUNT,\n            order: ['COUNT_DESC', 'VALUE_ASC']\n        });\n        return terms.map(aggregateTerm);\n    },\n\n    _valueQuery(value) {\n        if (value) {\n            return [\n                {\n                    type: 'QUERY_STRING',\n                    value\n                }\n            ];\n        }\n        return [{ type: 'MATCH_ALL' }];\n    },\n\n    _facetQuery(facets) {\n        return facets\n            .filter(facet => !facet.get('isKeyword'))\n            .map(facet => {\n                const value = facet.get('term.term');\n                const fields = [facet.get('searchField')];\n                return {\n                    value,\n                    fields,\n                    type: 'EXACT'\n                };\n            });\n    },\n\n    _baseSearchForEntity(entityType) {\n        if (entityType === 'people') {\n            entityType = 'users';\n        }\n        if (entityType === 'externalContacts') {\n            entityType = 'external_contacts';\n        }\n\n        if (entityType === 'all') {\n            let types = ['users', 'groups', 'locations'];\n            return {\n                types,\n                aggregations: this._baseAggregations(),\n                returnFields: MULTI_ENTITY_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'users') {\n            return {\n                types: ['users'],\n                aggregations: this._baseAggregations(),\n                returnFields: BASE_PERSON_FIELDS,\n                expand: BASE_PERSON_EXPANDS\n            };\n        }\n\n        if (entityType === 'locations') {\n            return {\n                types: ['locations'],\n                returnFields: BASE_LOCATION_FIELDS\n            };\n        }\n\n        if (entityType === 'groups') {\n            return {\n                types: ['groups'],\n                returnFields: BASE_GROUP_FIELDS\n            };\n        }\n\n        if (entityType === 'external_contacts') {\n            return {\n                types: ['external_contacts'],\n                returnFields: BASE_PERSON_FIELDS\n            };\n        }\n\n        // Unsafe to assert because the `entity` query param could\n        // be manually modified and blow up the page without warning.\n        Ember.Logger.warn(`_baseSearchForEntity(): Invalid entityType \"${entityType}\"`);\n        return this._baseSearchForEntity('all');\n    },\n\n    _buildSearch(entityType, search, facets, favoriteIds) {\n        let query = [...this._facetQuery(facets)];\n        const valueQuery = this._valueQuery(search);\n        if (search || _.isEmpty(facets)) {\n            query = [].concat([], query, valueQuery);\n        }\n        if (favoriteIds) {\n            if (favoriteIds.length > FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA) {\n                const chunks = _.chunk(favoriteIds, FAVORITE_LIMIT_FOR_SEARCH_MULTI_CRITERIA);\n                query.push({\n                    group: chunks.map(chunk => ({\n                        operator: 'OR',\n                        type: 'EXACT',\n                        fields: ['id'],\n                        values: chunk\n                    }))\n                });\n            } else {\n                query.push({\n                    type: 'EXACT',\n                    fields: ['id'],\n                    values: favoriteIds\n                });\n            }\n        }\n\n        let base = this._baseSearch();\n        if (!valueQuery[0].value) {\n            base = Object.assign({}, base, {\n                sortBy: 'name',\n                sortOrder: 'ASC'\n            });\n        }\n\n        return Object.assign(\n            {\n                query\n            },\n            base,\n            this._baseSearchForEntity(entityType)\n        );\n    },\n\n    _normalizeSearch(data) {\n        const { total, aggregations, results } = data;\n        const models = this.get('search').modelResults(results);\n        const facets = this._processFacets(aggregations);\n        return { results: models, total, facets };\n    },\n\n    _processFacets(rawFacets) {\n        const facets = _.chain(rawFacets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, ({ key: term, count }) => ({ term, count }))\n                };\n            })\n            .filter()\n            .value();\n        const keyOrder = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => keyOrder.indexOf(key));\n    },\n\n    async getFavoriteIds() {\n        const favorites = await this.get('favorites').getLoadedFavorites();\n        return favorites.map(favorite => favorite.id).slice(0, FAVORITE_LIMIT);\n    },\n\n    async runSearchQuery(isLoadMore) {\n        // Wait for any existing search to complete (max 20 iterations * 50ms = 1 second)\n        let iterations = 0;\n        while (this.get('loading.searchResults') && iterations++ < 20) {\n            await new Promise(resolve => setTimeout(resolve, 50));\n        }\n\n        let nextPage = 1;\n        if (isLoadMore) {\n            nextPage = this.get('page') + 1;\n        }\n        this.set('loading.searchResults', true);\n        this.set('loading.facets', !isLoadMore);\n\n        let entity = this.get('entity') || 'all';\n        const query = this.get('query');\n        const queryFacets = this.get('queryFacets');\n        const selectedTerms = this.buildSelectedTerms(query, queryFacets);\n        let favoriteIds = null;\n        if (entity == 'favorites') {\n            entity = 'all';\n            try {\n                favoriteIds = await this.getFavoriteIds();\n            } catch (e) {\n                Ember.Logger.warn(`search::runSearchQuery() Cannot find favorites: ${e.message}`);\n                favoriteIds = [];\n            }\n            const numberOfFavoriteToSearch = favoriteIds ? favoriteIds.length : 0;\n            this.set('lastSearchFavoritesCount', numberOfFavoriteToSearch);\n            addPageAction('conn-ui-fav-disp', {\n                'conn-ui-fav-nb': numberOfFavoriteToSearch\n            });\n            if (favoriteIds && !favoriteIds.length) {\n                // There is no favorite at all, abort the search request!\n                const searchResults = this.get('searchResults');\n                searchResults.clear();\n                this.set('page', nextPage);\n                this.set('totalResults', 0);\n                this.set('facets', []);\n                this.set('selectedTerms', selectedTerms);\n                this.set('model', Ember.RSVP.resolve());\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                return;\n            }\n        }\n\n        const search = this._buildSearch(entity, query, selectedTerms, favoriteIds);\n        search.pageNumber = nextPage;\n\n        const fetch = this.get('search')\n            .search(search)\n            .then(data => this._normalizeSearch(data));\n\n        await fetch\n            .then(({ results, total, facets }) => {\n                const searchResults = this.get('searchResults');\n                if (!isLoadMore) {\n                    searchResults.clear();\n                }\n                searchResults.pushObjects(results);\n                this.set('page', nextPage);\n                this.set('totalResults', total);\n                this.set('facets', facets);\n                this.set('selectedTerms', selectedTerms);\n                return results;\n            })\n            .then((results = []) => {\n                const people = results.filterBy('type', 'person');\n                const ids = people.mapBy('id');\n                if (ids) {\n                    return this.get('store')\n                        .findMany('person', ids, BASE_PERSON)\n                        .then(userResults => {\n                            const integrationsPresence = this.get('integrationsPresence');\n                            if (\n                                integrationsPresence &&\n                                integrationsPresence.get('useIntegrationPresenceDirectorySearch')\n                            ) {\n                                return integrationsPresence.alterUsersWithIntegration(userResults);\n                            }\n                            return userResults;\n                        });\n                }\n            })\n            .catch(reason => {\n                let code = Ember.get(reason, 'payload.details.0.errorCode');\n                if (code === 'TOO_MANY_SEARCH_CRITERIA') {\n                    this.notifyTooManySearchFilters();\n                    throw reason;\n                }\n                this.set('searchResults', []);\n                throw reason;\n            })\n            .finally(() => {\n                this.set('loading.searchResults', false);\n                this.set('loading.facets', false);\n                this.set('model', fetch);\n            });\n    },\n\n    searchKeywords(query) {\n        const intoQuoteSegments = /(\".*?\"|'.*?'|[^\"\\s]+)+(?=\\s*|\\s*$)/g;\n        return query.split(intoQuoteSegments).filter(keyword => keyword && keyword.trim());\n    },\n\n    buildSelectedTerms(query, queryFacets) {\n        if (!query) {\n            query = '';\n        }\n        if (!queryFacets) {\n            queryFacets = '';\n        }\n\n        const selectedTerms = [];\n        const addSelectedTerm = (facetName, term, isKeyword) => {\n            selectedTerms.push(\n                FacetTerm.create({\n                    isKeyword,\n                    facet: { facetName },\n                    term: { term }\n                })\n            );\n        };\n\n        const keywordFacetName = this.get('intl').t('search.keyword');\n        this.searchKeywords(query).forEach(keyword => {\n            addSelectedTerm(keywordFacetName, keyword, true);\n        });\n\n        const directedSearchTerms = queryFacets.match(keypathRegex);\n        _.forEach(directedSearchTerms, directedSearch => {\n            const [facetName, ...searchSplit] = directedSearch.split(':');\n            const value = searchSplit.join(':');\n            if (value) {\n                const term = value.replace(/\"/g, '');\n                addSelectedTerm(facetName, term);\n            }\n        });\n\n        return selectedTerms;\n    },\n\n    notifyTooManySearchFilters() {\n        let title = this.get('intl').t('search.errors.tooManyFilters.title');\n        let message = this.get('intl').t('search.errors.tooManyFilters.message');\n        this.get('notification').error(title, message);\n    }\n};\n\nexport default Ember.Component.extend(Controller, View);\n","export default Ember.HTMLBars.template({\"id\":\"DE//2wWE\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-content\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"left-rail facets\\\"],[15,\\\"role\\\",\\\"complementary\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filtersLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"isGroups\\\"]],[28,[\\\"isLocations\\\"]],[28,[\\\"isExternalContacts\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.loading\\\"],null]]]],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"panel-group\\\"],[15,\\\"id\\\",\\\"facets\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isGroups\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringGroups\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isLocations\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFiltering\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContacts\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-contacts\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-filtering-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFilteringContacts\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-search\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"no-results\\\"],[13],[0,\\\"\\\\n                        \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResults\\\"],null],false],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"loading\\\",\\\"facets\\\"]]],null,{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"displayFacets\\\"]]],[[\\\"key\\\"],[\\\"facetName\\\"]],{\\\"statements\\\":[[0,\\\"                        \\\"],[1,[33,[\\\"search-facet-group\\\"],null,[[\\\"facet\\\",\\\"selectedTerms\\\",\\\"parentId\\\"],[[28,[\\\"facet\\\"]],[28,[\\\"selectedTerms\\\"]],\\\"facets\\\"]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"facet\\\"]},null]],\\\"locals\\\":[]},null],[0,\\\"            \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"right-rail results\\\"],[15,\\\"role\\\",\\\"main\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.resultsLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"loading\\\",\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"loader\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[15,\\\"role\\\",\\\"status\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"common.loading\\\"],null]]]],[13],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"entity-type-filter\\\"],[13],[0,\\\"\\\\n            \\\"],[9,\\\"gux-tabs-advanced\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"col-tabs\\\"],[16,\\\"active-tab\\\",[34,[\\\"tab-filter-\\\",[28,[null,\\\"entity\\\"]]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                \\\"],[9,\\\"gux-tab-advanced-list\\\",{\\\"attrs\\\":[[15,\\\"slot\\\",\\\"tab-list\\\"],[15,\\\"show-new-tab-button\\\",\\\"false\\\"],[15,\\\"allow-sort\\\",\\\"false\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-all\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"all\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-all\\\"],[15,\\\"class\\\",\\\"filter all\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-search-all\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.all\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-people\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"people\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-people\\\"],[15,\\\"class\\\",\\\"filter people\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-personicon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.people\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-groups\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"groups\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-groups\\\"],[15,\\\"class\\\",\\\"filter groups\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-groups\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.groups\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"session\\\",\\\"features\\\",\\\"PURE-7064_search_favorites\\\"]]],null,{\\\"statements\\\":[[0,\\\"                        \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-favorites\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"favorites\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-favorites\\\"],[15,\\\"class\\\",\\\"filter favorites\\\"],[13],[0,\\\"\\\\n                                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"rating-active\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.favorites\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[14],[0,\\\"\\\\n                        \\\"]]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"                    \\\"],[9,\\\"gux-tab-advanced\\\",{\\\"attrs\\\":[[15,\\\"tab-id\\\",\\\"tab-filter-locations\\\"],[16,\\\"onclick\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"changeSearchType\\\",\\\"locations\\\"],null],null],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null]]]]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n                        \\\"],[11,\\\"span\\\",[]],[15,\\\"id\\\",\\\"filter-locations\\\"],[15,\\\"class\\\",\\\"filter locations\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-location-marker\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"visible-lg-inline visible-md-inline\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"search.filter.locations\\\"],null],false],[14],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"]]}],[0,\\\"\\\\n                \\\"]]}],[0,\\\"\\\\n            \\\"]]}],[0,\\\"\\\\n\\\\n            \\\"],[1,[26,[\\\"create-entity-menu\\\"]],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"current-facets \\\",[33,[\\\"unless\\\"],[[28,[\\\"haveSelectedTerms\\\"]],\\\"no-selected-facets\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"each\\\"],[[28,[\\\"groupedSelectedTerms\\\"]]],[[\\\"key\\\"],[\\\"facet.facetName\\\"]],{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"grouped-facet-term\\\"],null,[[\\\"group\\\"],[[28,[\\\"group\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"group\\\"]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"search-results \\\",[26,[\\\"entity\\\"]]]]],[15,\\\"id\\\",\\\"search-results\\\"],[15,\\\"role\\\",\\\"region\\\"],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"search.resultsLabel\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isEmpty\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFavoritesEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-search-results-icon-favorite\\\"],[13],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-background pc-moon\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-full\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                            \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"favorite-foreground pc-moon not-favorite favorite outline-favorite\\\"],[15,\\\"icon-name\\\",\\\"legacy/favs-alpha\\\"],[15,\\\"decorative\\\",\\\"\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results-with-icon\\\"],[13],[0,\\\"\\\\n                            \\\"],[11,\\\"strong\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"search.noFavorite\\\"],null],false],[14],[11,\\\"br\\\",[]],[13],[14],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noFavoriteLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isExternalContactsEmpty\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noContacts\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"empty-state\\\"],[13],[0,\\\"\\\\n                        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center no-search-results\\\"],[13],[0,\\\"\\\\n                            \\\"],[1,[33,[\\\"t\\\"],[\\\"search.noResultsLonger\\\"],null],false],[0,\\\"\\\\n                        \\\"],[14],[0,\\\"\\\\n                    \\\"],[14],[0,\\\"\\\\n                \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"searchResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                    \\\"],[1,[33,[\\\"entity-mini/default\\\"],null,[[\\\"entity\\\",\\\"isSearchResult\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[28,[\\\"entity\\\"]],true,true,false]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"entity\\\"]},null]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"atPageLimit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"hasMoreResults\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"text-center page-limit entity-mini\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"search.reachedPageLimit\\\"],[[\\\"count\\\"],[[28,[\\\"remainingResults\\\"]]]]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-page/template.hbs\"}});","import Ember from 'ember';\n\nconst SearchResultContextComponent = Ember.Component.extend({\n    classNameBindings: ['searchResultContextVisible:search-result-context-area'],\n    searchResultContextVisible: false,\n\n    _scrollToPreviousTop(messages, $messagePane, $lastMessage) {\n        if (messages.length > 0) {\n            Ember.run.scheduleOnce('afterRender', null, () => {\n                let targetHeight =\n                    $lastMessage.position().top - $lastMessage.height() - this.$('.history-bar').outerHeight();\n                $messagePane.animate({ scrollTop: targetHeight });\n            });\n        }\n    },\n\n    closeOnContextSwitch: Ember.observer('chatService.activeRoom', function () {\n        this.send('close');\n    }),\n\n    actions: {\n        close() {\n            this.attrs.close();\n        },\n\n        replyToMessage(message) {\n            this.attrs.close();\n            this.attrs.replyToMessage(message);\n        },\n\n        loadHistoryAfterLast() {\n            const promise = this.attrs.loadMoreHistoryAfter(this.get('historyRoom'));\n            promise.then(messages => messages);\n        },\n\n        loadHistoryBeforeFirst() {\n            let $messagePane = this.$('.search-result-context-messages');\n            let $lastMessage = this.$('.search-result-context .chat-message').first();\n            const promise = this.attrs.loadMoreHistoryBefore(this.get('historyRoom'));\n            promise.then(messages => {\n                this._scrollToPreviousTop(messages, $messagePane, $lastMessage);\n                return messages;\n            });\n        }\n    }\n});\n\nexport default SearchResultContextComponent;\n","export default Ember.HTMLBars.template({\"id\":\"Z/9pIjDO\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"close\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"h4\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"chat.history\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"search-result-context-messages\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],false,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryBeforeFirst\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/messages\\\"],null,[[\\\"room\\\",\\\"replyToMessage\\\",\\\"isMediaCollapsed\\\",\\\"openMentionWarning\\\"],[[28,[\\\"historyRoom\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"replyToMessage\\\"],null],true,[33,[\\\"action\\\"],[[28,[null]],[28,[\\\"openMentionWarning\\\"]]],null]]]],false],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"chat-panel/conversation/conversation-pane/history-bar\\\"],null,[[\\\"activeRoom\\\",\\\"isForward\\\",\\\"loadMoreHistory\\\",\\\"noMoreHistoryText\\\"],[[28,[\\\"historyRoom\\\"]],true,[33,[\\\"action\\\"],[[28,[null]],\\\"loadHistoryAfterLast\\\"],null],[33,[\\\"t\\\"],[\\\"chat.noHistory\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/search-result-context/template.hbs\"}});","import Ember from 'ember';\n\nconst { Component, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['sms-message-icon'],\n    classNameBindings: ['subMessageTypeClass'],\n\n    subMessageTypeClass: computed('subMessageType', function () {\n        return `sms-message-type-${this.get('subMessageType')}`;\n    }),\n\n    subMessageType: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"swD2LZfy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"line\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"line-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"facebook\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"facebook-messenger\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"twitter\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"twitter\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"viber\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"viber\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"wechat\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"wechat\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"telegram\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"telegram\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"whatsapp\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"whatsapp\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"webmessaging\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"chat-multi\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"eq\\\"],[[28,[\\\"subMessageType\\\"]],\\\"open\\\"],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"comment-ellipsis\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"    \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"sms\\\"],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/sms-message-icon/template.hbs\"}});","define(\"connections-ui/components/station-disassociate-link/component\", [\"exports\", \"ember-purecloud-components/components/station-disassociate-link/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"kFbO6UNm\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"tags-input-label\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"tags-input__tag\\\"],[13],[0,\\\"\\\\n        \\\"],[9,\\\"gux-truncate-beta\\\",{\\\"attrs\\\":[[15,\\\"max-lines\\\",\\\"1\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[0,\\\"\\\\n            \\\"],[18,\\\"default\\\"],[0,\\\"\\\\n        \\\"]]}],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/tags-input/label/template.hbs\"}});","define(\"connections-ui/components/telephone-input/component\", [\"exports\", \"ember-purecloud-components/components/telephone-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-dialog\", [\"exports\", \"ember-modal-dialog/components/deprecated-tether-dialog\"], function (_exports, _deprecatedTetherDialog) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deprecatedTetherDialog.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-component\", [\"exports\", \"ember-tooltips/components/tether-popover-on-component\"], function (_exports, _tetherPopoverOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-popover-on-element\", [\"exports\", \"ember-tooltips/components/tether-popover-on-element\"], function (_exports, _tetherPopoverOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherPopoverOnElement.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-component\"], function (_exports, _tetherTooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnComponent.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tether-tooltip-on-element\", [\"exports\", \"ember-tooltips/components/tether-tooltip-on-element\"], function (_exports, _tetherTooltipOnElement) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tetherTooltipOnElement.default;\n    }\n  });\n});\n","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from 'connections-ui/utils/dates';\nimport layout from './template';\n\nconst MINUTE = 1000 * 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\n\nexport default Component.extend({\n    classNames: ['time-elapsed'],\n    tagName: 'span',\n    layout,\n\n    clock: service(),\n    intl: service(),\n\n    timeSince: null,\n\n    _calculateElapsedTime(durationInMs) {\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n\n        const duration = moment.duration(durationInMs);\n        const days = duration.asDays();\n        const hours = duration.hours();\n        const minutes = duration.minutes();\n\n        if (days) {\n            if (hours) {\n                return this.get('intl').t('components.timeElapsed.detail.daysHours', {\n                    days: days,\n                    hours: hours\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.days', {\n                days: days\n            });\n        } else if (hours) {\n            if (minutes) {\n                return this.get('intl').t('components.timeElapsed.detail.hoursMinutes', {\n                    hours: hours,\n                    minutes: minutes\n                });\n            }\n            return this.get('intl').t('components.timeElapsed.detail.hours', {\n                hours: hours\n            });\n        }\n\n        return this.get('intl').t('components.timeElapsed.detail.minutes', {\n            minutes: minutes || '0'\n        });\n    },\n\n    _formatDuration: function () {\n        const timeSince = this.get('timeSince');\n        const msSince = moment().diff(moment(timeSince));\n        let unit, cnt;\n\n        if (msSince > DAY) {\n            unit = 'days';\n        } else if (msSince > HOUR) {\n            unit = 'hours';\n        } else if (msSince > MINUTE) {\n            unit = 'minutes';\n        } else {\n            return this.get('intl').t('components.timeElapsed.now');\n        }\n\n        cnt = moment().diff(moment(timeSince), unit);\n\n        if (cnt < 2) {\n            return this.get('intl').t(`components.timeElapsed.singular.${unit}`);\n        }\n\n        return this.get('intl').t(`components.timeElapsed.plural.${unit}`, { count: cnt });\n    },\n\n    tickingDuration: computed('timeSince', 'clock.second', function () {\n        return this._formatDuration();\n    })\n});\n","export default Ember.HTMLBars.template({\"id\":\"fP6V7Isp\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[13],[1,[26,[\\\"tickingDuration\\\"]],false],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-elapsed/template.hbs\"}});","import Ember from 'ember';\nimport moment from '../../utils/dates';\n\nconst CLOCK_MODE_DURATION = 10000;\n\nexport default Ember.Component.extend({\n    classNames: 'time-machine-confirmation',\n\n    // Expose attrs as direct properties for modern Ember\n    cancel: Ember.computed.reads('attrs.cancel'),\n    confirm: Ember.computed.reads('attrs.confirm'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('primaryDirection', Math.random() < 0.5 ? 1 : -1);\n        this.set('minuteDirection', this.get('primaryDirection') * -1);\n        // Set to undefined to init the clock with the current time and tick as normal\n        this.set('_clockStandardMode', true);\n        this.set('randomTime', undefined);\n    },\n\n    willDestroyElement() {\n        let timer = this.get('_updInterval');\n        if (timer) {\n            Ember.run.cancel(timer);\n            this.set('_updInterval', null);\n        }\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n    },\n\n    escapedBuildTag: Ember.computed('buildTag', function () {\n        let result = '';\n\n        let rawBuildTag = this.get('buildTag');\n        if (typeof rawBuildTag === 'string' && Ember.isPresent(rawBuildTag)) {\n            result = Ember.Handlebars.Utils.escapeExpression(rawBuildTag);\n        }\n\n        return result;\n    }),\n\n    updRandTime() {\n        if (this.get('_clockStandardMode')) {\n            this.set('_clockStandardMode', false);\n            this.set('_randomModeStart', Date.now());\n        } else if (Date.now() - this.get('_randomModeStart') > CLOCK_MODE_DURATION) {\n            this.set('_clockStandardMode', true);\n            this.set('randomTime', undefined);\n            this.set('_updInterval', Ember.run.later(this, 'updRandTime', CLOCK_MODE_DURATION));\n            return;\n        }\n\n        let currTime = moment(this.get('randomTime'));\n\n        try {\n            let currMinutes = currTime.get('minutes');\n            let currBin = Math.floor(currMinutes / 5);\n            currTime.add(5 * this.get('minuteDirection'), 'minutes');\n            currTime.add(10 * this.get('primaryDirection'), 'seconds');\n            let nextMinutes = currTime.get('minutes');\n            let nextBin = Math.floor(nextMinutes / 5);\n\n            let hourMultiplier = 1;\n            if (Math.abs(nextBin - currBin) === 11) {\n                // Prevents jitter caused by minutes rolling hours\n                hourMultiplier++;\n            }\n            currTime.add(hourMultiplier * this.get('primaryDirection'), 'hours');\n\n            if (isNaN(currTime) || !currTime.isValid()) {\n                // Protect against overflow\n                currTime = moment();\n            }\n        } catch (e) {\n            currTime = moment();\n        }\n\n        this.set('randomTime', currTime);\n\n        this.set('_updInterval', Ember.run.later(this, 'updRandTime', 100));\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"14qtFvIN\",\"block\":\"{\\\"statements\\\":[[6,[\\\"modal-dialog\\\"],null,[[\\\"attachment\\\",\\\"targetAttachment\\\",\\\"translucentOverlay\\\",\\\"overlay-class\\\",\\\"container-class\\\",\\\"destinationElementId\\\"],[\\\"top center\\\",\\\"top center\\\",true,\\\"dark\\\",\\\"modal-dialog time-machine-confirm-dialog\\\",\\\"modal-overlays\\\"]],{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-content\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"header\\\",[]],[15,\\\"class\\\",\\\"modal-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"analog-clock\\\"],null,[[\\\"class\\\",\\\"showSecondHand\\\",\\\"staticMoment\\\"],[\\\"random-clock\\\",true,[28,[\\\"randomTime\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"h1\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"timemachine.title\\\"],null],false],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"close cancel-time-machine-nav\\\"],[16,\\\"title\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"timemachine.cancel.desc\\\"],null]]]],[5,[\\\"action\\\"],[[28,[null]],\\\"cancel\\\"]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[0,\\\"×\\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-body\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"intended-destination\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.intendedDestination\\\"],[[\\\"buildNumber\\\"],[[28,[\\\"escapedBuildTag\\\"]]]]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"disclaimer\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.disclaimer\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"modal-footer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"actions\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default confirm-time-machine-nav\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"confirm\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.confirm.label\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"extra-links\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"https://www.genesys.com/company/careers\\\"],[15,\\\"class\\\",\\\"hiring-link\\\"],[15,\\\"target\\\",\\\"_blank\\\"],[15,\\\"rel\\\",\\\"noopener noreferrer\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"timemachine.hiring\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/time-machine-confirmation/template.hbs\"}});","define(\"connections-ui/components/toggle-switch/component\", [\"exports\", \"ember-purecloud-components/components/toggle-switch/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/tooltip-on-component\", [\"exports\", \"ember-tooltips/components/tooltip-on-component\"], function (_exports, _tooltipOnComponent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tooltipOnComponent.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport TooltipOnElement from 'ember-tooltips/components/tooltip-on-element';\n\nlet _didUpdateTimeoutLength = config.environment === 'test' ? 0 : 1000;\n\nexport default TooltipOnElement.extend({ _didUpdateTimeoutLength });\n","/* global File */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\n\nimport PromiseLoadingMixin from 'connections-ui/mixins/promise-loading';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\n\nimport FileAPI from 'fileapi';\nimport { uploadImageUrl } from './helpers';\n\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, observer } = Ember;\nconst webcamWidth = 640;\nconst webcamHeight = 480;\n\nexport default Ember.Component.extend(PromiseLoadingMixin, AutoSaveDevicesMixin, {\n    classNames: ['upload-picture'],\n\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    fileUpload: Ember.inject.service(),\n    store: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    currentFile: null,\n    currentFileInfo: null,\n    currentCoords: null,\n    currentXHR: null,\n    currentImageId: null,\n\n    selectedCamera: null,\n    cameraPending: false,\n    cameraError: false,\n    startingMedia: false,\n\n    imageUrl: null,\n    imageUrlData: null,\n    uploadingImageUrl: false,\n\n    attrs: {\n        confirm() {},\n\n        upload: null,\n        autoTakePicture: false,\n\n        entity: null,\n        uploadType: null\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.send('cancelCamera');\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n    },\n\n    actions: {\n        uploadError() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('cameraError'));\n            }\n        },\n\n        uploadImage() {\n            if (this.attrs.upload) {\n                this.attrs.upload(this.get('currentFile'));\n                return;\n            }\n\n            let file = this.get('currentFile');\n            let promise;\n\n            if (this.get('uploadingImageUrl')) {\n                promise = Ember.RSVP.resolve(this.get('imageUrlData'));\n            } else {\n                promise = this.upload(file);\n            }\n\n            let coords = this.get('currentCoords');\n            let left = coords.x + (coords.x2 - coords.x) / 2 - 21;\n            let top = coords.y + (coords.y2 - coords.y) / 2 - 21;\n            const entityType = Ember.get(this, 'attrs.entity.value.type');\n\n            if (entityType === 'group') {\n                // using the public api group image requests we don't need to worry\n                // about linking an image.\n                promise\n                    .then(result => {\n                        // set image Id\n                        this.set('currentImageId', result.id);\n                        return;\n                    })\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const groupId = this.get('entity').guid;\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for group ${groupId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            } else {\n                const userId = this.get('entity').id;\n                promise\n                    .then(this.get('entity').reload())\n                    .then(this.showPictures.bind(this))\n                    .catch(err => {\n                        this.send('clearImage');\n                        const intl = this.get('intl');\n\n                        const orgId = this.get('entity').orgId;\n                        this.get('logger').error(\n                            `failed to upload image for user ${userId}, of organization ${orgId}`,\n                            { error: err }\n                        );\n\n                        this.get('notification').error(\n                            intl.t('notification.titles.profileSaveError').toString(),\n                            intl.t('notification.fieldSection.error').toString(),\n                            {\n                                forceBrowserNotification: true,\n                                tag: 'image-upload'\n                            }\n                        );\n                    });\n            }\n\n            this.addIndicatorForPromise(promise, `#${this.get('elementId')} .image`);\n            this.$('.loading-indicator i').css({ top, left });\n        },\n\n        uploadImageUrl() {\n            let application = this.get('application');\n            let imageUrl = this.get('imageUrl');\n\n            if (!imageUrl) {\n                return;\n            }\n\n            this.set('uploadingImageUrl', true);\n\n            uploadImageUrl(application, imageUrl)\n                .then(data => {\n                    this.set('imageUrlData', data);\n\n                    this.displayImage(data);\n                    this.setupFileFromUrl();\n                })\n                .catch(err => {\n                    const intl = this.get('intl');\n\n                    const groupId = this.get('entity').guid;\n                    const orgId = this.get('entity').orgId;\n                    this.get('logger').error(`upload ImageUrl failed for group ${groupId} of organization ${orgId}`, {\n                        error: err\n                    });\n\n                    this.get('notification').error(\n                        intl.t('notification.titles.profileSaveError').toString(),\n                        intl.t('notification.fieldSection.error').toString(),\n                        {\n                            forceBrowserNotification: true,\n                            tag: 'image-upload'\n                        }\n                    );\n\n                    this.set('uploadingImageUrl', false);\n                    this.set('imageUrl', '');\n                });\n        },\n\n        clearImage() {\n            this.$('.image').empty();\n\n            this.set('currentFile', null);\n            this.set('currentFileInfo', null);\n            this.set('currentFileCoords', null);\n            this.set('currentImageId', null);\n\n            this.set('uploadingImageUrl', false);\n\n            Ember.run.scheduleOnce('afterRender', this, this.createDropZone);\n        },\n\n        startCamera() {\n            if (this.get('startingMedia')) {\n                return;\n            }\n\n            this.send('cancelCamera');\n            this.set('startingMedia', true);\n            this.set('cameraPending', true);\n\n            let options = {\n                audio: false,\n                video: true\n            };\n            return navigator.mediaDevices\n                .getUserMedia(options)\n                .then(stream => {\n                    this.set('cameraStream', stream);\n                    this.attachMediaStream(stream, this.$('.camera-preview')[0], {\n                        muted: true,\n                        mirror: true\n                    });\n                    this.set('startingMedia', false);\n                    if (this.get('autoTakePicture')) {\n                        this.send('takePicture');\n                    }\n                })\n                .catch(err => {\n                    this.set('cameraError', this.get('intl').lookup(`images.error.${err.name}`).toString());\n                    if (this.get('autoTakePicture')) {\n                        this.send('uploadError');\n                    }\n                });\n        },\n\n        takePicture() {\n            this.set('countdown', true);\n            Ember.run.later(() => {\n                let video = this.$('video')[0];\n                this.set('countdown', false);\n                let canvas = document.createElement('canvas');\n                canvas.width = video.videoWidth;\n                canvas.height = video.videoHeight;\n                let ctx = canvas.getContext('2d');\n                ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n                //convert to desired file format\n                let dataUrl = canvas.toDataURL('image/jpeg');\n                let asBlob = window.dataURLtoBlob(dataUrl);\n                let pictureInfo = { width: webcamWidth, height: webcamHeight, type: 'image/jpeg' };\n\n                let fileName = 'webcam';\n                if (this.get('autoTakePicture')) {\n                    fileName = this.get('intl').lookup('chat.commands.selfie.command').toString();\n                }\n\n                let asFile = new File([asBlob], `${fileName}.jpeg`, pictureInfo);\n                this.onTookPicture(dataUrl, asFile, pictureInfo);\n                this.send('cancelCamera');\n            }, 3000);\n        },\n\n        cancelCamera() {\n            let cameraStream = this.get('cameraStream');\n            try {\n                if (cameraStream && cameraStream.getTracks) {\n                    cameraStream.getTracks().forEach(track => {\n                        track.stop();\n                    });\n                }\n            } catch (e) {\n                const groupId = this.get('entity').guid;\n                const orgId = this.get('entity').orgId;\n                this.get('logger').error(`Error stopping camera stream for group ${groupId} of organization ${orgId}`, {\n                    error: e\n                });\n            }\n            this.set('cameraPending', false);\n            this.set('cameraStream', null);\n        }\n    },\n\n    switchCamera: observer('selectedCamera', function () {\n        if (this.get('cameraPending')) {\n            this.send('startCamera');\n            this.get('webrtc').updateDefaultDevices({\n                camera: this.get('selectedCamera')\n            });\n        }\n    }),\n\n    canUseCamera: computed('webrtc.hasCamera', function () {\n        return (\n            this.get('webrtc.hasCamera') &&\n            (window.navigator.getUserMedia ||\n                (window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia))\n        );\n    }),\n\n    init() {\n        this._super(...arguments);\n        // Calling enumerateDevices will conduct translation PCM-316\n        this.get('webrtc').enumerateDevices();\n        if (this.get('autoTakePicture')) {\n            this.send('startCamera');\n        }\n    },\n\n    getImageDataFromXhr(xhr) {\n        if (xhr) {\n            if (typeof xhr.responseText === 'string') {\n                return JSON.parse(xhr.responseText);\n            } else if (typeof xhr.responseText === 'object') {\n                return xhr.responseText;\n            } else if (typeof xhr === 'string') {\n                return JSON.parse(xhr);\n            }\n        }\n        return xhr;\n    },\n\n    initCrop() {\n        let aspectRatio = 1;\n        let size = this.get('currentFileInfo.height');\n        let type = this.get('entity.type');\n        let uploadType = this.get('uploadType');\n\n        if (type === 'floor' || uploadType === 'informal') {\n            aspectRatio = null;\n        }\n\n        if (this.get('currentFileInfo').width <= this.get('currentFileInfo').height) {\n            size = this.get('currentFileInfo').width;\n        }\n        this.$('img').Jcrop({\n            onSelect: this.handleCropChange.bind(this),\n            onChange: this.handleCropChange.bind(this),\n            aspectRatio: aspectRatio, // TODO: get this ratio from field config.\n            setSelect: [0, 0, size, size]\n        });\n    },\n\n    showPictures() {\n        const entity = this.get('entity');\n        if (!entity) {\n            throw new Error('Missing entity for component');\n        }\n\n        if (entity.get('type') === 'group') {\n            /*\n               https://github.com/emberjs/data/issues/3704\n               I hit what I believe is an ember-data 2.16 bug where the store was not being\n               updated after a findRecord request (even with reload: true specified).\n               As a result we make the request ourselves and update the store.\n            */\n            const store = this.get('store');\n            let serializer = store.serializerFor('group');\n            let model = store.modelFor('group');\n            let adapter = store.adapterFor('group');\n\n            const url = adapter.urlForFindRecord(entity.id);\n            const fieldsObj = { fl: '*' };\n            const data = Object.assign({}, data, fieldsObj);\n\n            const traditional = true;\n\n            this.get('ajax')\n                .request(url, { method: 'GET', data, traditional })\n                .then(result => {\n                    const santizedResult = serializer.normalizeSingleResponse(\n                        store,\n                        model,\n                        result,\n                        entity.id,\n                        'findRecord'\n                    );\n                    entity.set('version', santizedResult.data.attributes.version);\n                    entity.set('images', santizedResult.data.attributes.images);\n                    this.attrs.confirm();\n                });\n        } else {\n            entity.reload().then(() => {\n                this.attrs.confirm();\n            });\n        }\n    },\n\n    handleCropChange(coords) {\n        if (coords.x === coords.x2 && coords.y === coords.y2) {\n            let ratio = this.get('currentFileInfo.ratio');\n            coords = {\n                x: 0,\n                y: 0,\n                x2: this.get('currentFileInfo.width') * ratio,\n                y2: this.get('currentFileInfo.height') * ratio\n            };\n        }\n\n        this.set('currentCoords', coords);\n    },\n\n    displayImage(xhr) {\n        let data = this.getImageDataFromXhr(xhr);\n        let container = this.$('div.image');\n\n        let width = container.width();\n        let ratio = width / data.dimensions.x;\n        let height = data.dimensions.y * ratio;\n\n        let image = $(`<img src=\"${data.url}\" />`).css({ width: width, height: height });\n        container.html(image);\n\n        let currentFileInfo = this.get('currentFileInfo');\n        if (_.isEmpty(currentFileInfo) || !currentFileInfo.ratio) {\n            if (!width) {\n                width = 100;\n            }\n\n            if (!height) {\n                height = 100;\n            }\n\n            let fileInfo = {\n                ratio: ratio,\n                width,\n                height\n            };\n\n            this.set('currentFileInfo', fileInfo);\n        }\n\n        return xhr;\n    },\n\n    setupFileFromUrl() {\n        let container = this.$('div.image');\n        let $image = this.$('div.image img');\n        let image = $image[0];\n        let currentFile = FileAPI.Image(image);\n        this.set('currentFile', currentFile);\n\n        $image.on('load', () => {\n            Ember.run(() => {\n                let ratio = container.width() / image.naturalWidth;\n                let width = container.width();\n                let height = image.naturalHeight * ratio;\n                this.set('currentFileInfo', {\n                    ratio,\n                    width: image.naturalWidth,\n                    height: image.naturalHeight\n                });\n                $image.width(width);\n                $image.height(height);\n\n                this.initCrop();\n            });\n        });\n    },\n\n    upload(file) {\n        const entityType = this.attrs.entity.value.get('type');\n\n        let uploadType = this.get('uploadType');\n        let imageCategory = uploadType === 'informal' ? 'gallery' : 'profile';\n        const coords = this.get('currentCoords');\n        const displaywidth = this.$('img').width();\n        const cropProportion = file.name === 'webcam.jpeg' ? webcamWidth / displaywidth : file.width / displaywidth; // webcam files are always 640 * 480\n\n        if (entityType === 'group') {\n            const gId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                groupImageType: imageCategory\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'groupImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/groups/${gId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        } else {\n            const uId = this.attrs.entity.value.get('id');\n\n            const imgData = {\n                // the server side directory requires that the file size width/height be used\n                // for x2/y2\n                boundingBox: {\n                    x: coords.x * cropProportion,\n                    x2: coords.x2 * cropProportion,\n                    y: coords.y * cropProportion,\n                    y2: coords.y2 * cropProportion\n                },\n                userImageType: uploadType\n            };\n\n            let formData = new window.FormData();\n            formData.append('file', file);\n            formData.append(\n                'userImageRequest',\n                new Blob([JSON.stringify(imgData)], {\n                    type: 'application/json'\n                })\n            );\n            const uri = this.get('application').pcV2Uri(`api/v2/users/${uId}/images`);\n            return this.get('fileUpload').upload(uri, formData);\n        }\n    },\n\n    onTookPicture(dataUri, file) {\n        this.set('currentFile', file);\n\n        Ember.run.scheduleOnce('afterRender', this, () => {\n            const container = this.$('div.image');\n            const width = container.width();\n\n            let image = $(`<img src=\"${dataUri}\" />`);\n            container.html(image);\n            image.width(width);\n\n            image.one('load', () => {\n                const width = image.width();\n                const ratio = width / image[0].naturalWidth;\n                this.set('currentFileInfo', {\n                    width: width,\n                    height: image.height(),\n                    ratio\n                });\n\n                this.initCrop();\n            });\n\n            if (this.get('autoTakePicture')) {\n                this.send('uploadImage');\n            }\n        });\n    },\n\n    onChange(file) {\n        let container = this.$('div.image');\n\n        if (/^image/.test(file.type)) {\n            FileAPI.getInfo(file, (err, info) => {\n                this.handleFileInfo(err, info, file);\n            });\n        } else {\n            if (file) {\n                container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n            }\n\n            FileAPI.reset(event.currentTarget);\n        }\n    },\n\n    handleFileInfo(err, info, file) {\n        let container = this.$('div.image');\n        if (!err) {\n            let image = FileAPI.Image(file);\n\n            let ratio = container.width() / info.width;\n\n            this.set('currentFile', file);\n            this.set('currentFileInfo', info);\n            this.set('currentFileInfo.ratio', ratio);\n\n            let width = container.width();\n            let height = info.height * ratio;\n\n            image.preview(width, height).get((err, img) => {\n                if (width && height) {\n                    let uri = img.toDataURL();\n                    let image = $(`<img src=\"${uri}\" />`);\n                    container.html(image);\n\n                    this.initCrop();\n                }\n            });\n        } else {\n            container.html(this.get('intl').t('images.genericFileTypeMessage').toString());\n        }\n        FileAPI.reset(event.currentTarget);\n    },\n\n    createDropZone: function () {\n        if (this.get('dropzone')) {\n            this.get('dropzone').destroy();\n        }\n        const dropzone = new window.Dropzone(`#${this.get('elementId')} .dropzone`, {\n            acceptedFiles: 'image/*',\n            url: '/file/post',\n            uploadMultiple: false,\n            maxFiles: 1,\n            clickable: '.browse',\n            autoProcessQueue: false,\n            addRemoveLinks: true,\n            maxFilesize: 10,\n            dictInvalidFileType: this.get('intl').t('images.genericFileTypeMessage').toString(),\n            dictRemoveFile: this.get('intl').t('common.remove').toString(),\n            dictFileTooBig: this.get('intl').t('images.fileTooLarge').toString(),\n            dictCancelUpload: this.get('intl').t('images.cancelUpload').toString(),\n            dictUploadCanceled: this.get('intl').t('images.uploadCanceled').toString()\n        });\n\n        dropzone.on('thumbnail', file => {\n            Ember.run(() => this.onChange(file));\n        });\n\n        dropzone.on('addedfile', function () {\n            Ember.run(() => {\n                if (this.files.length > 1) {\n                    this.removeFile(this.files[0]);\n                }\n            });\n        });\n        this.set('dropzone', dropzone);\n    },\n\n    attachMediaStream: function (stream, element, options) {\n        const opts = {\n            autoplay: true,\n            mirror: false,\n            muted: false,\n            audio: false,\n            disableContextMenu: false\n        };\n\n        if (options) {\n            Object.keys(options).forEach(key => {\n                opts[key] = options[key];\n            });\n        }\n\n        if (opts.disableContextMenu) {\n            element.oncontextmenu = function (e) {\n                e.preventDefault();\n            };\n        }\n\n        if (opts.autoplay) element.autoplay = 'autoplay';\n        element.muted = !!opts.muted;\n        if (!opts.audio) {\n            ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n                const styleName = prefix ? prefix + 'Transform' : 'transform';\n                element.style[styleName] = opts.mirror ? 'scaleX(-1)' : 'scaleX(1)';\n            });\n        }\n\n        if (BrowserUtils.isSafari) {\n            element.setAttribute('playsinline', true);\n        }\n\n        element.srcObject = stream;\n        return element;\n    }\n});\n","import ajax from 'ember-ajax';\n\nexport function uploadImageUrl(application, url) {\n    let formData = new window.FormData();\n    formData.append('imageUrl', url);\n    return ajax(application.uri('api/v2/images'), {\n        method: 'post',\n        data: formData,\n        contentType: false,\n        processData: false\n    });\n}\n","export default Ember.HTMLBars.template({\"id\":\"K6YT0VqB\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"uploads \\\",[33,[\\\"if\\\"],[[28,[\\\"autoTakePicture\\\"]],\\\"hide\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]],\\\"have-file\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"currentFile\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary upload-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"uploadImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.uploadImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-danger clear-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"clearImage\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.clearImage\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"webrtc\\\",\\\"hasCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"btn-block camera-selection\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"select-with-icon\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"label\\\",[]],[15,\\\"for\\\",\\\"camera-select\\\"],[15,\\\"class\\\",\\\"sr-only\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"webrtcDevices.videoSource\\\"],null],false],[14],[0,\\\"\\\\n\\\"],[6,[\\\"x-select\\\"],null,[[\\\"id\\\",\\\"value\\\",\\\"action\\\",\\\"class\\\",\\\"aria-label\\\"],[\\\"camera-select\\\",[28,[\\\"selectedCamera\\\"]],[33,[\\\"action\\\"],[[28,[null]],[33,[\\\"mut\\\"],[[28,[\\\"selectedCamera\\\"]]],null]],null],\\\"form-control with-icon\\\",\\\"{{t \\\\\\\"webrtcDevices.videoSource\\\\\\\"}}\\\"]],{\\\"statements\\\":[[6,[\\\"each\\\"],[[28,[\\\"webrtc\\\",\\\"cameraList\\\"]]],null,{\\\"statements\\\":[[0,\\\"                            \\\"],[6,[\\\"component\\\"],[[28,[\\\"xs\\\",\\\"option\\\"]]],[[\\\"value\\\"],[[28,[\\\"camera\\\"]]]],{\\\"statements\\\":[[1,[28,[\\\"camera\\\",\\\"label\\\"]],false]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[\\\"camera\\\"]},null]],\\\"locals\\\":[\\\"xs\\\"]},null],[0,\\\"                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-video select-icon\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-primary take-picture-button\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"takePicture\\\"]],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dropzone\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"dz-message\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"glyphicon glyphicon-cloud-upload\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.drop\\\"],null],false],[0,\\\"\\\\n                    \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"browse\\\"],[15,\\\"tabindex\\\",\\\"0\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"images.browseFile\\\"],null],false],[0,\\\".\\\"],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"picture-options\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canUseCamera\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-block btn-default take-picture-button clickable\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"startCamera\\\"]],[13],[0,\\\"\\\\n                    \\\"],[1,[33,[\\\"t\\\"],[\\\"images.takePicture\\\"],null],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"image \\\",[33,[\\\"if\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"camera \\\",[33,[\\\"unless\\\"],[[28,[\\\"cameraPending\\\"]],\\\"hide\\\"],null]]]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"cameraError\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"h4\\\",[]],[13],[1,[26,[\\\"cameraError\\\"]],false],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"    \\\"],[11,\\\"video\\\",[]],[15,\\\"class\\\",\\\"camera-preview\\\"],[15,\\\"mute\\\",\\\"true\\\"],[15,\\\"autoplay\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"countdown\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown\\\"],[13],[0,\\\"\\\\n\\\"],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-3\\\"],[13],[0,\\\"3\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-2\\\"],[13],[0,\\\"2\\\"],[14],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"countdown-1\\\"],[13],[0,\\\"1\\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/upload-picture/template.hbs\"}});","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nlet profilePaths = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nexport default Ember.Component.extend(LoggerMixin, {\n    classNames: ['uploaded-image'],\n\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    image: null,\n    entity: null,\n    size: '128',\n    labelKey: '',\n    editingCaption: false,\n    canAddCaption: false,\n\n    type: 'profile',\n\n    attrs: {\n        select() {},\n        delete() {},\n\n        editing: false,\n        canEdit: false,\n        showingInformal: false\n    },\n\n    actions: {\n        selectUploadedImage(event) {\n            if (event) {\n                //action executed on click, kb Space, kb Enter\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n\n            let selectUploadedImage = this.attrs.select;\n\n            if (this.get('editing') && this.get('canEdit') && this.get('type') === 'profile') {\n                selectUploadedImage(type, image, active);\n            } else {\n                let current = this.get('currentInformal');\n                if (current !== this.get('image')) {\n                    this.set('currentInformal', this.get('image'));\n                    this.showImage(image, type);\n                } else {\n                    this.set('currentInformal', null);\n                }\n            }\n        },\n        deleteUploadedImage(event) {\n            //action executed on click, kb Space, kb Enter\n            if (event) {\n                if (event.keyCode != 13 && event.keyCode != 32) {\n                    return;\n                }\n                event.preventDefault();\n            }\n            let type = this.get('type');\n            let image = this.get('image');\n            let active = this.get('isActive');\n            let deleteUploadedImage = this.attrs.delete;\n\n            if (this.get('canDelete')) {\n                const entityType = Ember.get(this, 'entity.type');\n\n                if (entityType === 'group' || entityType === 'person') {\n                    const id = Ember.get(this, 'entity.id');\n                    const imageId = Ember.get(this, 'image._id');\n                    const url =\n                        entityType === 'group'\n                            ? `api/v2/groups/${id}/images/${imageId}`\n                            : `api/v2/users/${id}/images/${imageId}`;\n\n                    return this.get('ajax')\n                        .delete(Ember.get(this, 'application').pcV2Uri(url))\n                        .then(() => {\n                            deleteUploadedImage(type, image, false);\n                            return;\n                        })\n                        .catch(err => {\n                            const intl = this.get('intl');\n\n                            this.logger.error('failed to upload image', { error: err });\n\n                            this.get('notification').error(\n                                intl.lookup('notification.titles.profileSaveError').toString(),\n                                intl.lookup('notification.fieldSection.error').toString(),\n                                {\n                                    forceBrowserNotification: true,\n                                    tag: 'image-upload'\n                                }\n                            );\n                            return;\n                        });\n                } else {\n                    this.get('delete')(type, image, active);\n                }\n            }\n        }\n    },\n\n    addCaption() {\n        this.set('openCaption', this);\n\n        Ember.run.scheduleOnce('afterRender', this, function () {\n            this.$('.caption textarea').focus();\n        });\n    },\n\n    saveCaption() {\n        this.set('openCaption', null);\n\n        let imageList = this.get('entity').getFieldValue('images.informal');\n        let image = imageList.findBy('_id', this.get('image._id'));\n\n        Ember.set(image, 'labelKey', this.get('labelKey'));\n        this.get('entity').save();\n    },\n\n    initCaption: Ember.on('init', function () {\n        this.set('canAddCaption', this.get('type') === 'informal' && this.get('entity.type') === 'person');\n        this.set('labelKey', this.get('image.labelKey'));\n    }),\n\n    ownImage: Ember.computed('entity', 'entity.id', function () {\n        if (!this.get('canEdit')) {\n            return false;\n        }\n\n        let isPerson = this.get('entity.id') === this.get('session.person.id');\n        let isGroupOwner = false;\n\n        if (this.get('entity.type') === 'group') {\n            let owners = this.get('entity').getFieldValue('owners.owners') || [];\n            isGroupOwner = _.find(owners, owner => {\n                return owner.value === this.get('session.person.id');\n            });\n        }\n\n        return isPerson || isGroupOwner;\n    }),\n\n    closeCaption: Ember.observer('openCaption', function () {\n        if (this.get('openCaption') !== this) {\n            this.set('editingCaption', false);\n        } else {\n            this.set('editingCaption', true);\n        }\n    }),\n\n    canDelete: Ember.computed('entity.uploadedProfilePictures.length', function () {\n        const entityType = this.get('entity.type');\n        if (entityType === 'group') {\n            let isEditing = this.get('editing');\n            return isEditing;\n        }\n\n        let type = this.get('type') === 'informal';\n        let populated = this.get('entity.uploadedProfilePictures.length') !== 1;\n        let isEditing = this.get('editing');\n        return (type || populated) && isEditing;\n    }),\n\n    src: Ember.computed('image', 'entity', 'size', function () {\n        let image = this.get('image.value');\n        let size = `x${this.get('size')}`;\n\n        if (image) {\n            return image[size];\n        }\n\n        return '';\n    }),\n\n    isActive: Ember.computed('image', 'entity', 'entity.profilePicture', function () {\n        let image = this.get('image');\n        let type = this.get('type');\n        let imagePath = profilePaths[this.get('entity.type')];\n\n        if (type === 'profile') {\n            let currentImage = this.get('entity').getReferencedField(imagePath);\n\n            if (!_.isEmpty(currentImage)) {\n                return image._id === currentImage._id;\n            }\n        }\n\n        return false;\n    }),\n\n    showImage: function (/*image, type*/) {\n        this.bubbleAction({\n            action: 'viewLightGallery',\n            actionContext: [this.get('image')]\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kplgeCU/\",\"block\":\"{\\\"statements\\\":[[11,\\\"img\\\",[]],[16,\\\"alt\\\",[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],null],[16,\\\"class\\\",[34,[\\\"clickable \\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],\\\"active\\\"],null],\\\" \\\",[33,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]],\\\"can-edit\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[16,\\\"aria-label\\\",[33,[\\\"if\\\"],[[28,[\\\"isActive\\\"]],[33,[\\\"concat\\\"],[[33,[\\\"t\\\"],[\\\"images.userSubmitted\\\"],null],\\\" (selected)\\\"],null],[33,[\\\"t\\\"],[\\\"images.selectImage\\\"],null]],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"src\\\",[26,[\\\"src\\\"]],null],[5,[\\\"action\\\"],[[28,[null]],\\\"selectUploadedImage\\\"]],[13],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canDelete\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"span\\\",[]],[16,\\\"class\\\",[34,[\\\"delete \\\",[33,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]],\\\"informal-delete\\\"],null]]]],[16,\\\"onkeydown\\\",[33,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.deleteImage\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"deleteUploadedImage\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-close-circled\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canEdit\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"editingCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption form-group\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"textarea\\\"],null,[[\\\"classNames\\\",\\\"value\\\",\\\"aria-label\\\"],[\\\"form-control\\\",[28,[\\\"labelKey\\\"]],[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null]]]],false],[0,\\\"\\\\n            \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"btn btn-default\\\"],[15,\\\"type\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"common.save\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"saveCaption\\\"]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"common.save\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"canAddCaption\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption clickable\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[15,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[33,[\\\"t\\\"],[\\\"images.addCaption\\\"],null],null],[5,[\\\"action\\\"],[[28,[null]],\\\"addCaption\\\",[28,[\\\"image\\\"]]]],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption own-caption\\\"],[13],[0,\\\"\\\\n                    \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n                \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"edit\\\"],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-edit\\\"],[15,\\\"aria-hidden\\\",\\\"true\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"showingInformal\\\"]],[28,[\\\"labelKey\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"caption\\\"],[16,\\\"title\\\",[26,[\\\"labelKey\\\"]],null],[13],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"current-caption\\\"],[13],[0,\\\"\\\\n                \\\"],[1,[26,[\\\"labelKey\\\"]],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]}]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/components/uploaded-image/template.hbs\"}});","define(\"connections-ui/components/vertical-collection\", [\"exports\", \"smoke-and-mirrors/components/vertical-collection\"], function (_exports, _verticalCollection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalCollection.default;\n    }\n  });\n});\n","define(\"connections-ui/components/vertical-item\", [\"exports\", \"smoke-and-mirrors/components/vertical-item\"], function (_exports, _verticalItem) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _verticalItem.default;\n    }\n  });\n});\n","define(\"connections-ui/components/volume-input/component\", [\"exports\", \"ember-purecloud-components/components/volume-input/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-debug-modal/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-debug-modal/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-issues/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-issues/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-settings/component\", [\"exports\", \"ember-webrtc-components/components/webrtc-settings/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/webrtc-troubleshooter/component\", [\"exports\", \"webrtc-troubleshoot/components/webrtc-troubleshooter/component\"], function (_exports, _component) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _component.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls\", [\"exports\", \"ember-wrap-urls/components/wrap-urls\"], function (_exports, _wrapUrls) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _wrapUrls.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/link\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/link\"], function (_exports, _link) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _link.default;\n    }\n  });\n});\n","define(\"connections-ui/components/wrap-urls/url\", [\"exports\", \"ember-wrap-urls/components/wrap-urls/url\"], function (_exports, _url) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _url.default;\n    }\n  });\n});\n","import XOption from 'emberx-select/components/x-option';\nexport default XOption;\n","import XSelect from 'emberx-select/components/x-select';\nexport default XSelect;\n","import require from 'require';\nimport environment from './environment';\n\nconst modulePrefix = environment.modulePrefix;\nconst metaName = `${modulePrefix}/config/asset-manifest`;\nconst nodeName = `${modulePrefix}/config/node-asset-manifest`;\n\nlet config = {};\n\ntry {\n  // If we have a Node version of the asset manifest, use that for FastBoot and\n  // similar environments.\n  if (require.has(nodeName)) {\n    config = require(nodeName).default; // eslint-disable-line\n  } else {\n    const rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n    config = JSON.parse(unescape(rawConfig));\n  }\n} catch(err) {\n  throw new Error('Failed to load asset manifest. For browser environments, verify the meta tag with name \"'+ metaName +\n    '\" is present. For non-browser environments, verify that you included the node-asset-manifest module.');\n}\n\nexport default config;\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['path'],\n    path: ''\n});\n","import Ember from 'ember';\n\nconst isNonEmptyStringQueryParam = paramStr => {\n    return (\n        typeof paramStr === 'string' &&\n        !Ember.isBlank(paramStr) &&\n        // Handles 'https://wikipedia.org/?param' case.\n        // Ember parses as the literal string 'true'\n        paramStr !== 'true'\n    );\n};\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    application: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    appsService: Ember.inject.service('apps'),\n    webrtc: Ember.inject.service('webrtc'),\n\n    queryParams: ['mobile', 'panels', 'initialPanel'],\n    panels: null,\n    initialPanel: null,\n\n    updateCurrentRouteName: Ember.observer('currentRouteName', function () {\n        Ember.run.once(this, this.set, 'application.currentRouteName', this.get('currentRouteName'));\n    }),\n\n    panelsOverrideObject: Ember.computed('panels', 'initialPanel', function () {\n        const panelsOverrideObject = {};\n        const panelsOverride = this.get('panels');\n        const initialPanelOverride = this.get('initialPanel');\n        if (isNonEmptyStringQueryParam(panelsOverride)) {\n            panelsOverrideObject.panelsOverride = panelsOverride.split(',');\n        } else if (panelsOverride === '') {\n            panelsOverrideObject.panelsOverride = [];\n        }\n        if (isNonEmptyStringQueryParam(initialPanelOverride)) {\n            panelsOverrideObject.initialPanelOverride = initialPanelOverride;\n        }\n        return panelsOverrideObject;\n    }),\n\n    actions: {\n        reportError(notification) {\n            if (notification) {\n                notification.hide();\n            }\n\n            this.transitionToRoute('feedback');\n        },\n\n        openPreferencesModal() {\n            this.get('settings').open();\n        }\n    }\n});\n","define(\"connections-ui/controllers/array\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.reads('model'),\n\n    currentPerson: null,\n\n    actions: {\n        setCurrentPerson(person) {\n            this.set('currentPerson', person);\n        }\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    permissions: Ember.inject.service()\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    chat: Ember.inject.service(),\n\n    managePresenceSubscriptions: Ember.observer('model.participantsVisible', function () {\n        const subscribeTo = this.get('model.participantsVisible') ? this.get('model.participants') : null;\n        return this.get('presenceSubscription').autoSubscribe(subscribeTo, this);\n    }),\n\n    actions: {\n        inviteUserToRoom(person) {\n            const room = this.get('model');\n            if (room.isOneToOneRoom()) {\n                return this.promoteToAdhocRoom(person);\n            } else {\n                return this.get('chat').inviteToRoom(room, person);\n            }\n        },\n\n        toggleParticipants() {\n            this.toggleProperty('model.participantsVisible');\n        },\n\n        collapseChat() {}\n    },\n\n    promoteToAdhocRoom(person) {\n        const chat = this.get('chat');\n        const oneToOneTarget = this.get('model.oneToOneTarget');\n        return chat.makeNewEmptyRoom().then(room => {\n            chat.inviteToRoom(room, oneToOneTarget);\n            return chat.inviteToRoom(room, person);\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nimport PersonModel from '../models/person';\n\nvar ContactsController = Ember.Controller.extend({\n    favoritesNameFilter: null,\n\n    personBinding: 'session.person',\n    isOnlyFavorite: false,\n    canSearch: false,\n\n    actions: {\n        removeFavorite: function (person) {\n            var path = this.get('applicationService').uri([\n                'api/v2/people',\n                this.get('person.id'),\n                'favorites',\n                person.get('id')\n            ]);\n\n            $.ajax({\n                url: path,\n                type: 'delete',\n                dataType: 'json'\n            }).then(() => {\n                this.get('person').reload();\n                this.get('filteredFavorites').removeObject(person);\n            });\n        },\n\n        addFavorite: function (person) {\n            this.get('filteredFavorites').addObject(person);\n        },\n\n        toggleFavorite: function (person, isFavorite) {\n            if (person.content) {\n                person = person.content;\n            }\n\n            if (isFavorite) {\n                this.send('addFavorite', person);\n            } else {\n                this.send('removeFavorite', person);\n            }\n        }\n    },\n\n    recents: Ember.computed('person', 'model', function () {\n        var apiEndpoint = PersonModel.apiEndpoint;\n        var url = `/api/${apiEndpoint}/${this.get('person.id')}/recents`;\n\n        var promise = new Ember.RSVP.Promise(function (resolve) {\n            $.getJSON(url, { idOnly: true }).then(function (data) {\n                resolve(data.res);\n            });\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    setLocalFavorites: Ember.observer('model', 'person', function () {\n        var favorites = this.get('model');\n        if (!_.isEmpty(favorites)) {\n            this.set('filteredFavorites', favorites);\n        }\n    }),\n\n    favoritesFilterChanged: Ember.observer('favoritesNameFilter', function () {\n        this.debouncedFavoritesFilterChanged();\n    }),\n\n    createDebouncedFavoritesFilterChanged: Ember.on('init', function () {\n        this.debouncedFavoritesFilterChanged = _.debounce(() => {\n            Ember.run(() => this._filterChanged());\n        }, 250);\n    }),\n\n    _filterChanged: function () {\n        var filter = this.get('favoritesNameFilter');\n        var favorites = this.get('model');\n\n        if (filter) {\n            var filtered = this.get('model').filter(function (person) {\n                return _.includes(person.get('name').toLowerCase(), filter.toLowerCase());\n            });\n\n            this.setFavorites(filtered);\n        } else {\n            this.setFavorites(favorites);\n        }\n    },\n\n    countFavorites: Ember.observer('filteredFavorites', 'person.favorites.content', 'view', function () {\n        try {\n            var list = this.get('filteredFavorites');\n            this.set('isOnlyFavorite', list.length === 1);\n        } catch (err) {\n            this.set('isOnlyFavorite', false);\n        }\n    }),\n\n    checkSearchVisibility: Ember.observer('filteredFavorites', 'person.favorites.content', function () {\n        var list = this.get('filteredFavorites');\n\n        if (list !== null && list !== undefined) {\n            var value = list.length > 0;\n            this.set('canSearch', value);\n        }\n    }),\n\n    setFavorites: function (favorites) {\n        this.set('filteredFavorites', favorites);\n    }\n});\n\nexport default ContactsController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar EngageController = Ember.Controller.extend(LoggerMixin, {\n    engageService: Ember.inject.service('engage'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    setEngageActive() {\n        this.set('engageService.route', this.get('model.engagePath'));\n        this.set('engageService.isEngageActive', true);\n    },\n\n    setEngageInactive() {\n        this.set('engageService.isEngageActive', false);\n    },\n\n    navigationEvent: Ember.observer('engageService.navigationRoute', function () {\n        const navRoute = this.get('engageService.navigationRoute');\n        if (navRoute) {\n            const route = engageRouteToCollaborateRoute(navRoute);\n            this.logger.debug('Transitioning to', route);\n            this.transitionToRoute(route); //see override above\n            this.set('engageService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('engageService.redirectRoute', function () {\n        const route = engageRouteToCollaborateRoute(this.get('engageService.redirectRoute'));\n        this.replaceRoute(route); //see override above\n        this.logger.debug('Redirecting to', route);\n    })\n});\n\nfunction engageRouteToCollaborateRoute(route) {\n    // Content management routes live under their own top-level position in collaborate\n    let newRoute = route.replace(/^#contentManagement/, '/content-management');\n    // Everything else is mapped to the /engage/... routes\n    if (!/^\\/content-management/.test(newRoute)) {\n        newRoute = route.replace(/^#\\/?/, '/engage/');\n    }\n    return newRoute;\n}\n\nexport default EngageController;\n","import Ember from 'ember';\n\nconst { Controller } = Ember;\n\nexport default Controller.extend();\n","import Ember from 'ember';\n\nconst { Controller, computed, inject } = Ember;\n\ntype MaintenanceModeMessageKeys = {\n    titleKey: string;\n    descKey?: string;\n    actionKey: string;\n};\n\nconst MaintenanceController = Controller.extend({\n    intl: inject.service(),\n\n    hasDesc: false,\n\n    messageKeys: computed('model', function (): MaintenanceModeMessageKeys {\n        // Always return the same generic error in the maintenance page.\n        // Newrelic will still report the specific error.\n        return {\n            titleKey: 'unrecoverableAppFailure.unknownFailure.title',\n            descKey: 'unrecoverableAppFailure.unknownFailure.desc',\n            actionKey: 'unrecoverableAppFailure.unknownFailure.action'\n        };\n    })\n});\n\nexport default MaintenanceController;\n\n// DO NOT DELETE: This registers controllers by key with the Ember Container allowing TS to know the types of items in the container\ndeclare module '@ember/controller' {\n    interface Registry {\n        maintenance: typeof MaintenanceController;\n    }\n}\n","define(\"connections-ui/controllers/object\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = Ember.Controller;\n  _exports.default = _default;\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Controller.extend({\n    entity: Ember.computed.alias('model.person'),\n    embedded: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    queryParams: ['editing', 'editEmergencyLocation'],\n\n    editing: true,\n    editEmergencyLocation: false,\n    showMobile: false,\n    showDropdown: false,\n\n    loadingFieldSections: false,\n\n    editingProfile: computed.alias('editing'),\n    editingSection: false,\n\n    actions: {\n        toggleEditing() {\n            this.toggleProperty('editingProfile');\n        },\n\n        setEditingSection(value) {\n            this.set('editingSection', value);\n        },\n\n        showGridMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: true,\n                treeMode: false\n            });\n        },\n\n        showStackedMode() {\n            this.setProperties({\n                stackedMode: true,\n                gridMode: false,\n                treeMode: false\n            });\n        },\n\n        showTreeMode() {\n            this.setProperties({\n                stackedMode: false,\n                gridMode: false,\n                treeMode: true\n            });\n        },\n\n        toggleLeftRail() {\n            this.toggleProperty('showMobile');\n        },\n\n        noop() {}\n    },\n\n    name: computed('entity.general.name.[]', function () {\n        return this.get('entity').getFieldValue('general.name');\n    }),\n\n    title: computed('entity.general.title.[]', function () {\n        return this.get('entity').getFieldValue('general.title');\n    }),\n\n    department: computed('entity.general.department.[]', function () {\n        return this.get('entity').getFieldValue('general.department');\n    }),\n\n    onOwnProfile: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    showGallery: computed('entity', 'entity.id', function () {\n        var gallery = this.get('entity.images.informal');\n        if (gallery) {\n            return gallery.length > 0;\n        }\n        return false;\n    }),\n\n    /**\n     * Observes query parameter changes and notifies the host application\n     */\n    queryParamObserver: Ember.observer('editing', 'editEmergencyLocation', function () {\n        Ember.run.debounce(this, this.syncQueryParamsWithHost, 100);\n    }),\n\n    /**\n     * Syncs current query parameters with the host application URL\n     */\n    syncQueryParamsWithHost() {\n        if (!this.get('embedded')) return;\n\n        if (\n            this.get('application.adminUIContext') &&\n            this.get('session.features') &&\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition']\n        ) {\n            return; // Do not navigate when embedded in the Users-UI.\n        }\n\n        const currentLocalHash = window.location.hash;\n        const currentHostHash = window.top.location.hash;\n        if (!currentLocalHash.startsWith('#/person')) return;\n\n        const updatedHostHash = currentLocalHash.replace(/person/, 'person-v2');\n\n        // Send navigation event to host application, if different from current\n        if (currentHostHash !== updatedHostHash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: updatedHostHash\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { PUBLIC_ENVS } from '../utils/net';\n\nconst { Controller, inject } = Ember;\n\nexport default Controller.extend({\n    application: inject.service(),\n    intl: inject.service(),\n\n    desktopRegionId: null,\n\n    actions: {\n        chooseRegion() {\n            const context = this.get('application.hostedContext');\n            if (context.isHosted()) {\n                context.sendRegionToDesktop(this.get('desktopRegionId'));\n            }\n        }\n    },\n\n    init: function () {\n        this._super(...arguments);\n\n        // Set Initial/Default Region\n        let defaultDesktopRegionId = 'global';\n\n        const locale = this.get('intl.systemLocale');\n        if (_.includes(locale, 'au')) {\n            defaultDesktopRegionId = 'au';\n        } else if (_.includes(locale, 'ja') || _.includes(locale, 'zh')) {\n            defaultDesktopRegionId = 'jp';\n        }\n\n        this.set(\n            'desktopRegionId',\n            _.find(PUBLIC_ENVS, { desktopId: defaultDesktopRegionId })\n                ? defaultDesktopRegionId\n                : PUBLIC_ENVS[0].desktopId\n        );\n    }\n});\n","import IndexController from './index';\n\nvar RelateExternalContactController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalContactController;\n","import IndexController from './index';\n\nvar RelateExternalOrganizationController = IndexController.extend({\n    // Nothing to override.  This is instantiated to provide the same services from RelateExternalContactRoute to\n    // the RelateExternalContactRoute\n});\n\nexport default RelateExternalOrganizationController;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nvar IndexController = Ember.Controller.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    relateService: Ember.inject.service('relate'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    navigationEvent: Ember.observer('relateService.navigationRoute', function () {\n        var navRoute = this.get('relateService.navigationRoute');\n        if (navRoute) {\n            this.logger.debug('Transitioning to', navRoute);\n            this.transitionToRoute(navRoute); //see override above\n            this.set('relateService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: Ember.observer('relateService.redirectRoute', function () {\n        let redirectRoute = this.get('relateService.redirectRoute');\n        this.logger.debug('Redirecting to', redirectRoute.route);\n        this.replaceRoute(redirectRoute.route); //see override above\n    }),\n\n    init: function () {\n        this._super.apply(this, arguments);\n        this.get('relateService.redirectRoute');\n    }\n});\n\nexport default IndexController;\n","import Ember from 'ember';\nimport SignupController from './signup';\n\nexport default SignupController.extend({\n    intl: Ember.inject.service(),\n\n    _heading: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    }),\n\n    _button: Ember.computed(function () {\n        return this.get('intl').lookup('signIn.forgotPasswordHeading').toString();\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['entity', 'query', 'queryFacets', 'saveHistory'],\n\n    entity: null,\n    query: null,\n    queryFacets: null,\n    saveHistory: true\n});\n","import Ember from 'ember';\n\nexport default Ember.Controller.extend({\n    queryParams: ['targetRoute']\n});\n","define(\"connections-ui/enums/plantronics-call-events\", [\"exports\", \"ember-softphone-integration/enums/plantronics-call-events\"], function (_exports, _plantronicsCallEvents) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronicsCallEvents.default;\n    }\n  });\n});\n","import FieldConfig from '../field-config';\nimport ExternalContactModel from '../../models/external-contact';\n\nexport default FieldConfig.extend({\n    modelClass: ExternalContactModel\n}).reopenClass({\n    modelClass: ExternalContactModel\n});\n","import FieldConfig from '../field-config';\nimport GroupModel from '../../models/group';\n\nexport default FieldConfig.extend({\n    modelClass: GroupModel\n}).reopenClass({\n    modelClass: GroupModel\n});\n","import FieldConfig from '../field-config';\nimport OrgModel from '../../models/org';\n\nexport default FieldConfig.extend({\n    modelClass: OrgModel\n}).reopenClass({\n    modelClass: OrgModel\n});\n","import FieldConfig from '../field-config';\nimport PersonModel from '../../models/person';\n\nexport default FieldConfig.extend({\n    modelClass: PersonModel\n}).reopenClass({\n    modelClass: PersonModel\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldSection from './field-section';\n\nexport const KEY_BLACKLIST = [\n    'id',\n    '_id',\n    'guid',\n    'store',\n    'data',\n    'currentState',\n    'name',\n    'type',\n    'group',\n    'title',\n    'department',\n    'phone',\n    'email',\n    'description',\n    'organization'\n];\nconst GROUP_BLACKLIST = [...KEY_BLACKLIST, 'expression', 'groupType'];\nconst ORG_BLACKLIST = [...KEY_BLACKLIST, 'orgPreferences', 'shortName'];\nconst PROFILE_BLACKLIST = [\n    ...KEY_BLACKLIST,\n    'activities',\n    'profile',\n    'emptySections',\n    'fieldSections',\n    'emptyWriteableSections'\n];\n\nconst FieldConfig = Ember.Object.extend({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    id: Ember.computed.alias('_id'),\n\n    _id: null,\n    orgId: null,\n    entityType: null,\n    version: null,\n    sections: [],\n\n    _initModelWithType: function () {\n        const type = this.get('entityType');\n        const modelClass = this.modelClass;\n\n        let blacklist;\n        switch (type) {\n            case 'person':\n                blacklist = [...PROFILE_BLACKLIST];\n                break;\n            case 'org':\n                blacklist = [...ORG_BLACKLIST];\n                break;\n            case 'group':\n                blacklist = [...GROUP_BLACKLIST];\n                break;\n            case 'externalContact':\n            default:\n                blacklist = [...KEY_BLACKLIST];\n                break;\n        }\n\n        let fields = {};\n\n        this.get('sections').forEach(function (section) {\n            if (!Ember.A(blacklist).includes(section.key)) {\n                fields[section.key] = DS.attr();\n            }\n        });\n\n        modelClass\n            .reopenClass({\n                fieldConfig: this\n            })\n            .reopen(fields, {\n                fieldConfig: this\n            });\n\n        if (type === 'group') {\n            var allowedValues = this.getFieldByKey('general.groupType').get('params.allowedValues') || [];\n            allowedValues = allowedValues.filter(value => {\n                return value !== 'purecloud.distributionGroups';\n            });\n            this.set('groupTypes', allowedValues);\n        }\n    },\n\n    unknownProperty: function (property) {\n        var sections = this.get('sections');\n\n        if (_.map(sections, 'key').indexOf(property) > -1) {\n            return this.getSectionByKey(property);\n        }\n\n        return this._super();\n    },\n\n    splitFieldPath: function (path) {\n        var split = path.replace(/^\\w+\\.\\s/gi, '').split('.');\n        return {\n            sectionKey: split[0],\n            fieldKey: split[1]\n        };\n    },\n\n    getSectionByKey: function (key) {\n        return this.sections.findBy('key', key);\n    },\n\n    getFieldByKey: function (key) {\n        var splitField = this.splitFieldPath(key);\n        var section = this.getSectionByKey(splitField.sectionKey);\n        if (splitField.fieldKey && section) {\n            return section.getFieldByKey(splitField.fieldKey);\n        }\n\n        return undefined;\n    },\n\n    getFieldListByType: function (type) {\n        var fieldList = this.sections\n            .map(function (section) {\n                return section.getFieldsByType(type);\n            })\n            .filter(function (field) {\n                return field !== undefined && field.length > 0;\n            });\n\n        return _.flatten(fieldList);\n    },\n\n    getFieldsByType: function () {\n        this.getFieldListByType.apply(this, arguments);\n    },\n\n    getAllowedValues: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).params.allowedValues;\n    },\n\n    isFieldRepeatable: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.repeatable;\n        }\n\n        return false;\n    },\n\n    isFieldReference: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.type === 'reference';\n        }\n\n        return false;\n    },\n\n    isFieldChoice: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).type === 'select';\n    },\n\n    groupFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('group', Ember.getOwner(this));\n    }),\n\n    personFieldConfig: Ember.computed(function () {\n        return this.getFieldConfig('person', Ember.getOwner(this));\n    })\n});\n\nvar extra = {\n    getFieldConfig: function (type, owner) {\n        return owner.lookup('field-config:' + type);\n    }\n};\n\nFieldConfig.reopenClass({\n    createFieldConfig: function (attributes, container) {\n        // Ensure that sections are the proper object\n        attributes.sections = attributes.sections.map(function (section) {\n            return FieldSection.create(section);\n        });\n\n        var instance = container.lookup('field-config:' + attributes.entityType);\n        if (instance) {\n            instance.setProperties(attributes);\n\n            instance.sections.forEach(function (section) {\n                section.set('fieldConfig', instance);\n            });\n\n            instance._initModelWithType();\n\n            return instance;\n        }\n        Ember.Logger.warn('Unknown field-config type:', { type: attributes.entityType });\n    }\n})\n    .reopenClass(extra)\n    .reopen(extra);\n\nexport default FieldConfig;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default Ember.Object.extend({\n    entity: null,\n    field: null,\n\n    entries: [],\n\n    attachComputedEntries: Ember.on('init', function () {\n        var fieldPath = this.get('field').getFieldPath();\n        if (typeof fieldPath === 'string') {\n            fieldPath = fieldPath.trim();\n\n            var boundTo = `entity.${fieldPath}`;\n            var boundToEach = `entity.${fieldPath}.[]`;\n\n            Ember.defineProperty(this, 'entries', Ember.computed(boundTo, boundToEach, this.getEntriesFromEntity));\n        }\n    }),\n\n    fieldPath: Ember.computed('field', function () {\n        return this.get('field').getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed('fieldPath', function () {\n        var fieldPath = this.get('fieldPath');\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    isEmpty: Ember.computed('field', 'entries', 'entries.[]', function () {\n        return this.isFieldEmpty(this.get('field'), this.get('entries'));\n    }),\n\n    writeable: Ember.computed('entity.readWritePermissions', 'entries.[]', function () {\n        var path = this.get('field').getFieldPath();\n        var readWritePermissions = this.get('entity.readWritePermissions');\n        var promise = Ember.RSVP.resolve(true);\n\n        if (this.get('entity.type') !== 'group') {\n            promise = new Ember.RSVP.Promise(function (resolve) {\n                readWritePermissions.then(function (permissions) {\n                    resolve(_.includes(permissions.write, path));\n                });\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    getEntriesFromEntity: function () {\n        var path = this.get('field').getFieldPath();\n        var value = this.get('entity').getFieldValue(path);\n        if (value === undefined) {\n            return [];\n        }\n\n        return value;\n    },\n\n    isFieldEmpty: function (field, entry) {\n        if (entry === undefined) {\n            return true;\n        }\n\n        if (field.repeatable) {\n            return _.isEmpty(entry) || entry.length <= 0;\n        } else {\n            return !(entry && entry.value);\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport Field from './field';\n\nvar FieldSection = Ember.Object.extend({\n    intl: Ember.computed.reads('fieldConfig.intl'),\n    application: Ember.computed.reads('fieldConfig.application'),\n\n    fieldConfig: null,\n\n    key: null,\n    state: null,\n    instructionText: null,\n    fieldList: [],\n\n    getFieldByKey: function (key) {\n        return this.fieldList.findBy('key', key);\n    },\n\n    getFieldsByType: function (type) {\n        return this.fieldList.filterBy('type', type);\n    },\n\n    getEntityType: function () {\n        return this.fieldConfig.entityType;\n    },\n\n    getI18nKey: function () {\n        var type = this.getEntityType();\n        return `${type}_${this.key}`;\n    },\n\n    unknownProperty: function (property) {\n        var fieldList = this.get('fieldList');\n\n        if (_.map(fieldList, 'key').indexOf(property) > -1) {\n            return this.getFieldByKey(property);\n        }\n\n        return null;\n    },\n\n    sectionName: Ember.computed(function () {\n        const intl = this.get('intl');\n        const key = this.getI18nKey();\n        const serverKey = `server_translations.${key}`;\n        if (!intl.exists(serverKey)) {\n            return key;\n        }\n        return intl.t(serverKey, null, true).toString();\n    })\n});\n\nFieldSection.reopenClass({\n    create: function (attributes) {\n        attributes.fieldList = attributes.fieldList\n            .filter(field => {\n                return field.state !== 'deleted';\n            })\n            .map(field => {\n                return Field.create(field);\n            });\n\n        var instance = this._super(attributes);\n        instance.fieldList.forEach(function (field) {\n            field.section = instance;\n        });\n\n        return instance;\n    }\n});\n\nexport default FieldSection;\n","/* global requirejs */\n\nimport Ember from 'ember';\n\nvar Field = Ember.Object.extend({\n    intl: Ember.computed.reads('section.intl'),\n    application: Ember.computed.reads('section.application'),\n\n    section: null,\n\n    key: null,\n    type: null,\n    labelKeys: [],\n    instructionText: '',\n    customLabels: false,\n    repeatable: false,\n    params: null,\n\n    maxRepeat: Ember.computed.reads('params.maxRepeat'),\n\n    i18nLabel: Ember.computed(function () {\n        let intl = this.get('intl');\n        let key = `server_translations.${this.getI18nKey()}`;\n        let labelKey = `server_translations.${this.getI18nLabelKey()}`;\n        if (intl.exists(labelKey)) {\n            return intl.t(labelKey).toString();\n        }\n        if (intl.exists(key)) {\n            return intl.t(key).toString();\n        }\n        return this.get('key');\n    }),\n\n    i18nKey: Ember.computed(function () {\n        return this.getI18nKey();\n    }),\n\n    elemId: Ember.computed(function () {\n        return `#${this.get('key')}`;\n    }),\n\n    fieldPath: Ember.computed(function () {\n        return this.getFieldPath();\n    }),\n\n    fieldPathClass: Ember.computed(function () {\n        let path = this.getFieldPath();\n        return path.replace(/\\./gi, '-');\n    }),\n\n    componentName: Ember.computed('type', function () {\n        var type = this.get('type');\n        return `entity-fields/${type}-field`;\n    }),\n\n    getI18nKey() {\n        return `${this.section.getI18nKey()}_${this.key}`;\n    },\n\n    getI18nLabelKey() {\n        return `${this.getI18nKey()}_labelKey_${this.key}`;\n    },\n\n    getFieldPath() {\n        return this.section.key + '.' + this.key;\n    },\n\n    getEntityType() {\n        return this.section.getEntityType();\n    },\n\n    cleanForEntity(entity) {\n        Ember.Logger.warn('DEPRECATION: Stop using this method please...it breaks a lot of rules...');\n\n        var name = this.get('componentName');\n        if (requirejs._eak_seen[name]) {\n            var module = requirejs(name);\n            if (module.cleanFieldForEntity) {\n                return module.cleanFieldForEntity(entity, this, entity.getFieldValue(this.getFieldPath()));\n            }\n        }\n    },\n\n    component: Ember.computed(function () {\n        Ember.Logger.warn(\n            'DEPRECATION: Use component helper and `field.componentName` property to use field components'\n        );\n\n        // We have fields with hyphens (multiline-text). Make sure they get Ember-ized.\n        var className = this.get('componentName');\n\n        var factory = this.get('application.container').lookupFactory('component:' + className);\n        if (factory) {\n            return factory;\n        }\n\n        Ember.Logger.warn('Could not find view for:', { className });\n\n        return this.get('application.container').lookupFactory('component:text-field');\n    })\n});\n\nexport default Field;\n","export default {\n    time: {\n        hhmmss: {\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        }\n    },\n    date: {\n        hhmmss: {\n            hour: 'numeric',\n            minute: 'numeric',\n            second: 'numeric'\n        }\n    },\n    number: {\n        EUR: {\n            style: 'currency',\n            currency: 'EUR',\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        },\n        USD: {\n            style: 'currency',\n            currency: 'USD',\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        }\n    }\n};\n","import Ember from 'ember';\n\nconst { Mixin, RSVP } = Ember;\n\nconst DEFAULT_PARAMETERS = {\n    offset: 0,\n    limit: 15\n};\n\nexport default Mixin.create({\n    findGroupMembership(id, parameters = DEFAULT_PARAMETERS) {\n        const label = 'Adapter#findGroupMembership';\n        const adapter = this.adapterFor('group');\n\n        const serializer = this.serializerFor('person');\n        const modelClass = this.modelFor('person');\n        let promise = adapter.findGroupMembership(id, parameters);\n        promise = RSVP.Promise.resolve(promise, label);\n\n        return promise.then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(this, modelClass, payload, null, 'findMany');\n                const records = this.push(payload);\n                return records;\n            },\n            null,\n            'Store#findGroupMembership'\n        );\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst activityMessages = {\n    sms: 'components.recentContact.sms',\n    voice: 'components.recentContact.voice',\n    email: 'components.recentContact.email',\n    chat: 'components.recentContact.chat'\n};\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const activity = params[0];\n        const message = activityMessages[activity.method];\n        const date = moment(activity.ts * 1000);\n        return this.get('intl').lookup(message, { date: date.format('L') });\n    }\n});\n","define(\"connections-ui/helpers/abs\", [\"exports\", \"ember-math-helpers/helpers/abs\"], function (_exports, _abs) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"abs\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.abs;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _abs.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acos\", [\"exports\", \"ember-math-helpers/helpers/acos\"], function (_exports, _acos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acos\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.acos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/acosh\", [\"exports\", \"ember-math-helpers/helpers/acosh\"], function (_exports, _acosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"acosh\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.acosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _acosh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/add\", [\"exports\", \"ember-math-helpers/helpers/add\"], function (_exports, _add) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"add\", {\n    enumerable: true,\n    get: function get() {\n      return _add.add;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _add.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    addressformat: Ember.inject.service(),\n\n    compute: function (params) {\n        if (!params || params.length !== 1) {\n            Ember.Logger.warn('addressformat helper called with bad arguments');\n            return '';\n        }\n        return this.get('addressformat').formatOrLookupAddressForDisplay(params[0]);\n    }\n});\n","define(\"connections-ui/helpers/and\", [\"exports\", \"ember-truth-helpers/helpers/and\"], function (_exports, _and) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"and\", {\n    enumerable: true,\n    get: function get() {\n      return _and.and;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _and.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport { shaRegExp, versionRegExp } from 'ember-cli-app-version/utils/regexp';\n\nconst {\n  APP: {\n    version\n  }\n} = config;\n\nexport function appVersion(_, hash = {}) {\n  if (hash.hideSha) {\n    return version.match(versionRegExp)[0];\n  }\n\n  if (hash.hideVersion) {\n    return version.match(shaRegExp)[0];\n  }\n\n  return version;\n}\n\nexport default Ember.Helper.helper(appVersion);\n","define(\"connections-ui/helpers/array-contains\", [\"exports\", \"ember-array-contains-helper/helpers/array-contains\"], function (_exports, _arrayContains) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"arrayContains\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.arrayContains;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _arrayContains.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asin\", [\"exports\", \"ember-math-helpers/helpers/asin\"], function (_exports, _asin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asin\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.asin;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asin.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/asinh\", [\"exports\", \"ember-math-helpers/helpers/asinh\"], function (_exports, _asinh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"asinh\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.asinh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _asinh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan\", [\"exports\", \"ember-math-helpers/helpers/atan\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atan2\", [\"exports\", \"ember-math-helpers/helpers/atan2\"], function (_exports, _atan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atan2\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.atan2;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atan.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/atanh\", [\"exports\", \"ember-math-helpers/helpers/atanh\"], function (_exports, _atanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"atanh\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.atanh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _atanh.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/await\", [\"exports\", \"ember-promise-helpers/helpers/await\"], function (_exports, _await) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _await.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default Ember.Helper.extend({\n    compute([person, promiseArray]) {\n        return DS.PromiseObject.create({\n            promise: promiseArray.then(sequenceList => {\n                const people = sequenceList.filter(listItem => listItem.person === person);\n                return people.get('length') === 0;\n            })\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    permissionsService: Ember.inject.service('permissions'),\n\n    permissions: null,\n\n    compute([entity, fieldPath]) {\n        if (!entity || !fieldPath) {\n            return false;\n        }\n\n        const permissionsService = this.get('permissionsService');\n        return permissionsService.get('canEditProfiles');\n    }\n});\n","define(\"connections-ui/helpers/cancel-all\", [\"exports\", \"ember-concurrency/helpers/cancel-all\"], function (_exports, _cancelAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cancelAll\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.cancelAll;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cancelAll.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cbrt\", [\"exports\", \"ember-math-helpers/helpers/cbrt\"], function (_exports, _cbrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cbrt\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.cbrt;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cbrt.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ceil\", [\"exports\", \"ember-math-helpers/helpers/ceil\"], function (_exports, _ceil) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"ceil\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.ceil;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ceil.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return time.format('LLLL');\n});\n","define(\"connections-ui/helpers/clz32\", [\"exports\", \"ember-math-helpers/helpers/clz32\"], function (_exports, _clz) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"clz32\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.clz32;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clz.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cos\", [\"exports\", \"ember-math-helpers/helpers/cos\"], function (_exports, _cos) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cos\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.cos;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cos.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/cosh\", [\"exports\", \"ember-math-helpers/helpers/cosh\"], function (_exports, _cosh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"cosh\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.cosh;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _cosh.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { dasherize } = Ember.String;\n\nexport function cssClassify([string]) {\n    if (string) {\n        string = string.replace(/[,\\(\\)]/g, '');\n        return dasherize(string);\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(cssClassify);\n","define(\"connections-ui/helpers/dasherize\", [\"exports\", \"ember-purecloud-components/helpers/dasherize\"], function (_exports, _dasherize) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"dasherize\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.dasherize;\n    }\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dasherize.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/div\", [\"exports\", \"ember-math-helpers/helpers/div\"], function (_exports, _div) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _div.default;\n    }\n  });\n  Object.defineProperty(_exports, \"div\", {\n    enumerable: true,\n    get: function get() {\n      return _div.div;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-group\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-group\"], function (_exports, _emberPowerSelectIsGroup) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsGroup\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsGroup.emberPowerSelectIsGroup;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-is-selected\", [\"exports\", \"ember-power-select/helpers/ember-power-select-is-selected\"], function (_exports, _emberPowerSelectIsSelected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectIsSelected\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectIsSelected.emberPowerSelectIsSelected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/ember-power-select-true-string-if-present\", [\"exports\", \"ember-power-select/helpers/ember-power-select-true-string-if-present\"], function (_exports, _emberPowerSelectTrueStringIfPresent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.default;\n    }\n  });\n  Object.defineProperty(_exports, \"emberPowerSelectTrueStringIfPresent\", {\n    enumerable: true,\n    get: function get() {\n      return _emberPowerSelectTrueStringIfPresent.emberPowerSelectTrueStringIfPresent;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst { Handlebars, Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    let text = _.head(params);\n    if (text) {\n        text = emojifyString(Handlebars.Utils.escapeExpression(text));\n        return Ember.String.htmlSafe(text);\n    }\n    return text;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nEmber.Handlebars.helper('highlight', function (context, options) {\n    return _.isEmpty(options.context) ? options.fn(this) : null;\n});\n","define(\"connections-ui/helpers/eq\", [\"exports\", \"ember-truth-helpers/helpers/equal\"], function (_exports, _equal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equal\", {\n    enumerable: true,\n    get: function get() {\n      return _equal.equal;\n    }\n  });\n});\n","define(\"connections-ui/helpers/equals\", [\"exports\", \"fixtable-ember/helpers/equals\"], function (_exports, _equals) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.default;\n    }\n  });\n  Object.defineProperty(_exports, \"equals\", {\n    enumerable: true,\n    get: function get() {\n      return _equals.equals;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return _.escape(params[0]);\n});\n","define(\"connections-ui/helpers/exp\", [\"exports\", \"ember-math-helpers/helpers/exp\"], function (_exports, _exp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.default;\n    }\n  });\n  Object.defineProperty(_exports, \"exp\", {\n    enumerable: true,\n    get: function get() {\n      return _exp.exp;\n    }\n  });\n});\n","import Ember from 'ember';\nimport escape from 'connections-ui/utils/escape';\n\nconst { Helper } = Ember;\n\nexport default Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute([text]) {\n        if (!text) {\n            text = '';\n        }\n\n        // Check for promise\n        if (typeof text !== 'string' && typeof text.then === 'function' && !text.get('content')) {\n            text.then(() => this.recompute());\n        } else if (typeof text === 'object' && typeof text.get === 'function') {\n            text = text.get('content') || '';\n        }\n\n        // Check if we've got a POJO\n        if (typeof text === 'object' && typeof text.get !== 'function') {\n            return this.get('intl')\n                .t('entity.fieldTypes.location.address', {\n                    street1: text.street1,\n                    street2: text.street2,\n                    city: text.city,\n                    state: text.state,\n                    country: text.country,\n                    zipcode: text.zipcode\n                })\n                .toString();\n        }\n        return Ember.String.htmlSafe(escape(text).replace(/\\n/g, '<br>'));\n    }\n});\n","define(\"connections-ui/helpers/expm1\", [\"exports\", \"ember-math-helpers/helpers/expm1\"], function (_exports, _expm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"expm1\", {\n    enumerable: true,\n    get: function get() {\n      return _expm.expm1;\n    }\n  });\n});\n","import Ember from 'ember';\nimport FieldConfig from '../field-config/field-config';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        const facetName = facet.facetName;\n        const splitName = facetName.split('.');\n        const section = splitName[0];\n        const field = splitName[1];\n\n        if (section && field) {\n            const owner = Ember.getOwner(this);\n            let fieldObj = FieldConfig.getFieldConfig('person', owner).getSectionByKey(section).getFieldByKey(field);\n\n            if (fieldObj === undefined) {\n                const section = FieldConfig.getFieldConfig('group', owner).getSectionByKey(section);\n                if (!!section) {\n                    fieldObj = section.getFieldByKey(field);\n                } else {\n                    return field;\n                }\n            }\n\n            if (fieldObj !== undefined) {\n                const intl = this.get('intl');\n                const path = fieldObj.getFieldPath();\n                const lookupPath = path.replace(/\\./g, '_');\n                let i18nKey;\n\n                if (facet.total > 1) {\n                    i18nKey = `directedSearch_${lookupPath}_plural`;\n                } else {\n                    i18nKey = `directedSearch_${lookupPath}_singular`;\n                }\n\n                if (intl.query(i18nKey)) {\n                    return intl.lookup(i18nKey);\n                } else {\n                    return fieldObj.get('i18nLabel');\n                }\n            }\n        }\n\n        return facetName;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params, namedArgs) {\n        const facet = namedArgs.facet;\n        let term = namedArgs.term;\n        let facetName = facet.facetName;\n        if (term && facetName === 'general.groupType') {\n            facetName = facetName.replace(/[\\. ]/g, '_');\n            term = term.replace(/[\\. ]/g, '_');\n            const intl = this.get('intl');\n            const i18nKey = ['group', facetName, 'value', term].join('_');\n            if (intl.query(i18nKey)) {\n                return intl.lookup(i18nKey);\n            }\n        }\n        return term;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([arr]) {\n    if (arr && arr.length) {\n        return arr[0];\n    }\n\n    return {};\n});\n","import Ember from 'ember';\nimport { emojifyString } from 'ember-purecloud-components/utils/emoji';\n\nconst _flairRegEx = new RegExp(/^(flair:)(#[0-9a-f]{3}:|#[0-9a-f]{6}:){0,1}(.+)/i); // flair:[#hex:]message\n\nexport default Ember.Helper.extend({\n    compute(params, namedArgs) {\n        const status = params[0];\n        const hideIfText = namedArgs.hideIfText;\n\n        let color = '#aaaaaa';\n\n        let match = _flairRegEx.exec(status);\n        if (match) {\n            if (match[2]) {\n                color = match[2].substring(0, match[2].length - 1);\n            }\n            let emojiText = emojifyString(Ember.Handlebars.Utils.escapeExpression(match[3]));\n            return `<div class=\"flair\" style=\"background-color: ${color}\"> ${emojiText} </div>`;\n        } else if (hideIfText) {\n            return '';\n        } else {\n            return emojifyString(Ember.Handlebars.Utils.escapeExpression(status));\n        }\n    }\n});\n","define(\"connections-ui/helpers/floor\", [\"exports\", \"ember-math-helpers/helpers/floor\"], function (_exports, _floor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"floor\", {\n    enumerable: true,\n    get: function get() {\n      return _floor.floor;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-date\", [\"exports\", \"ember-intl/helpers/format-date\"], function (_exports, _formatDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatDate.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute: function (params) {\n        let bytes = params[0];\n        let units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n        for (var i = units.length - 1; i >= 0; i--) {\n            var converted = bytes / Math.pow(1000, i);\n            if (converted >= 1 && converted < 1000) {\n                var decimals = i === 0 ? 0 : 1;\n                return `${converted.toFixed(decimals)} ${units[i]}`;\n            }\n        }\n    }\n});\n","define(\"connections-ui/helpers/format-html-message\", [\"exports\", \"ember-intl/helpers/format-html-message\"], function (_exports, _formatHtmlMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatHtmlMessage.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const link = params[0];\n    return link.replace('http://', '').replace('https://', '').replace('www.', '');\n});\n","define(\"connections-ui/helpers/format-message\", [\"exports\", \"ember-intl/helpers/format-message\"], function (_exports, _formatMessage) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatMessage.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-number\", [\"exports\", \"ember-intl/helpers/format-number\"], function (_exports, _formatNumber) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatNumber.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-relative\", [\"exports\", \"ember-intl/helpers/format-relative\"], function (_exports, _formatRelative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatRelative.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/format-time\", [\"exports\", \"ember-intl/helpers/format-time\"], function (_exports, _formatTime) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _formatTime.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/fround\", [\"exports\", \"ember-math-helpers/helpers/fround\"], function (_exports, _fround) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.default;\n    }\n  });\n  Object.defineProperty(_exports, \"fround\", {\n    enumerable: true,\n    get: function get() {\n      return _fround.fround;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst fullNameHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    names: Ember.inject.service(),\n\n    compute(params) {\n        const externalProfile = params[0];\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile) || Ember.get(externalProfile, 'firstName');\n        }\n        return this.get('intl').lookup('purecloud.unknown');\n    }\n});\n\nexport default fullNameHelper;\n","define(\"connections-ui/helpers/gcd\", [\"exports\", \"ember-math-helpers/helpers/gcd\"], function (_exports, _gcd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gcd\", {\n    enumerable: true,\n    get: function get() {\n      return _gcd.gcd;\n    }\n  });\n});\n","define(\"connections-ui/helpers/get-select-options\", [\"exports\", \"fixtable-ember/helpers/get-select-options\"], function (_exports, _getSelectOptions) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.default;\n    }\n  });\n  Object.defineProperty(_exports, \"getSelectOptions\", {\n    enumerable: true,\n    get: function get() {\n      return _getSelectOptions.getSelectOptions;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    name: '',\n    compute(params) {\n        const groupId = params[0];\n        if (!this.get('name')) {\n            if (this.get('store').hasRecordForId('group', groupId)) {\n                let group = this.get('store').recordForId('group', groupId);\n                if (group && group.get('name')) {\n                    this.set('name', group.get('name'));\n                    this.recompute();\n                }\n            } else {\n                this.get('store')\n                    .find('group', groupId)\n                    .then(group => {\n                        this.set('name', group.get('name'));\n                        this.recompute();\n                    });\n            }\n        }\n\n        return this.get('name');\n    }\n});\n","define(\"connections-ui/helpers/gt\", [\"exports\", \"ember-truth-helpers/helpers/gt\"], function (_exports, _gt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gt\", {\n    enumerable: true,\n    get: function get() {\n      return _gt.gt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/gte\", [\"exports\", \"ember-truth-helpers/helpers/gte\"], function (_exports, _gte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"gte\", {\n    enumerable: true,\n    get: function get() {\n      return _gte.gte;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    compute(params) {\n        const group = params[0];\n        return !!Ember.get(group, 'contactInfo.groupNumber.firstObject.rel.e164');\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(params => {\n    const type = params[0];\n\n    switch (type) {\n        case 'faq':\n            return 'faq';\n        case 'article':\n            return 'article';\n        case 'glossary':\n            return 'glossary';\n        case 'video':\n            return 'video-camera';\n        case 'post':\n            return 'post';\n        case 'releasenote':\n            return 'releasenote';\n        case 'page':\n            return 'page';\n        default:\n            return '';\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params = []) {\n    return Ember.String.htmlSafe(params[0]);\n});\n","define(\"connections-ui/helpers/hypot\", [\"exports\", \"ember-math-helpers/helpers/hypot\"], function (_exports, _hypot) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.default;\n    }\n  });\n  Object.defineProperty(_exports, \"hypot\", {\n    enumerable: true,\n    get: function get() {\n      return _hypot.hypot;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst activityIcons = {\n    sms: 'ion-iphone',\n    voice: 'ion-ios-telephone',\n    email: 'ion-email',\n    chat: 'ion-chatboxes'\n};\n\nexport default Ember.Helper.helper(params => {\n    const activity = params[0];\n    return Ember.String.htmlSafe(`<i class='${activityIcons[activity.method]}'></i>`);\n});\n","define(\"connections-ui/helpers/ignore-children\", [\"exports\", \"ember-ignore-children-helper/helpers/ignore-children\"], function (_exports, _ignoreChildren) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.default;\n    }\n  });\n  Object.defineProperty(_exports, \"ignoreChildren\", {\n    enumerable: true,\n    get: function get() {\n      return _ignoreChildren.ignoreChildren;\n    }\n  });\n});\n","define(\"connections-ui/helpers/imul\", [\"exports\", \"ember-math-helpers/helpers/imul\"], function (_exports, _imul) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.default;\n    }\n  });\n  Object.defineProperty(_exports, \"imul\", {\n    enumerable: true,\n    get: function get() {\n      return _imul.imul;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function (params) {\n    const string = typeof params[0] === 'undefined' ? '' : params[0];\n    return string.charAt(0);\n});\n","define(\"connections-ui/helpers/intl-get\", [\"exports\", \"ember-intl/helpers/intl-get\"], function (_exports, _intlGet) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _intlGet.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-after\", [\"exports\", \"ember-moment/helpers/is-after\"], function (_exports, _isAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-array\", [\"exports\", \"ember-truth-helpers/helpers/is-array\"], function (_exports, _isArray) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isArray\", {\n    enumerable: true,\n    get: function get() {\n      return _isArray.isArray;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-before\", [\"exports\", \"ember-moment/helpers/is-before\"], function (_exports, _isBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-between\", [\"exports\", \"ember-moment/helpers/is-between\"], function (_exports, _isBetween) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isBetween.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-empty\", [\"exports\", \"ember-truth-helpers/helpers/is-empty\"], function (_exports, _isEmpty) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isEmpty.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { Helper } = Ember;\n\nexport default Helper.helper(function (params) {\n    const left = params[0];\n    const right = params[1];\n    return left === right;\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Helper.helper(function (params) {\n    const user = params[0];\n    const entity = params[1];\n    const favorites = user.get('_favorites');\n    const isFavorite = !!favorites && !_.isEmpty(favorites.findBy('id', entity.get('id')));\n\n    if (isFavorite) {\n        return 'favorite';\n    } else {\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/is-fulfilled\", [\"exports\", \"ember-promise-helpers/helpers/is-fulfilled\"], function (_exports, _isFulfilled) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isFulfilled\", {\n    enumerable: true,\n    get: function get() {\n      return _isFulfilled.isFulfilled;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-pending\", [\"exports\", \"ember-promise-helpers/helpers/is-pending\"], function (_exports, _isPending) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isPending\", {\n    enumerable: true,\n    get: function get() {\n      return _isPending.isPending;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-rejected\", [\"exports\", \"ember-promise-helpers/helpers/is-rejected\"], function (_exports, _isRejected) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.default;\n    }\n  });\n  Object.defineProperty(_exports, \"isRejected\", {\n    enumerable: true,\n    get: function get() {\n      return _isRejected.isRejected;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-after\", [\"exports\", \"ember-moment/helpers/is-same-or-after\"], function (_exports, _isSameOrAfter) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrAfter.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same-or-before\", [\"exports\", \"ember-moment/helpers/is-same-or-before\"], function (_exports, _isSameOrBefore) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSameOrBefore.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/is-same\", [\"exports\", \"ember-moment/helpers/is-same\"], function (_exports, _isSame) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _isSame.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.helper(function ([routes, station]) {\n    if (!routes || !station) {\n        return false;\n    }\n    const routeIds = routes.filterBy('isStation').mapBy('station.id');\n    return routeIds.indexOf(station.get('id')) > -1;\n});\n","import Ember from 'ember';\n\nexport function joinStrings(params /*, hash*/) {\n    const [joinCharacter, ...rest] = params || [];\n    return rest.join(joinCharacter);\n}\n\nexport default Ember.Helper.helper(joinStrings);\n","define(\"connections-ui/helpers/l\", [\"exports\", \"ember-intl/helpers/l\"], function (_exports, _l) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _l.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lcm\", [\"exports\", \"ember-math-helpers/helpers/lcm\"], function (_exports, _lcm) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lcm\", {\n    enumerable: true,\n    get: function get() {\n      return _lcm.lcm;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    presence: Ember.inject.service(),\n\n    compute(params) {\n        return this.get('presence').localizePresence(...params);\n    }\n});\n","define(\"connections-ui/helpers/log-e\", [\"exports\", \"ember-math-helpers/helpers/log-e\"], function (_exports, _logE) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.default;\n    }\n  });\n  Object.defineProperty(_exports, \"logE\", {\n    enumerable: true,\n    get: function get() {\n      return _logE.logE;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log10\", [\"exports\", \"ember-math-helpers/helpers/log10\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log10\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log10;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log1p\", [\"exports\", \"ember-math-helpers/helpers/log1p\"], function (_exports, _log1p) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log1p\", {\n    enumerable: true,\n    get: function get() {\n      return _log1p.log1p;\n    }\n  });\n});\n","define(\"connections-ui/helpers/log2\", [\"exports\", \"ember-math-helpers/helpers/log2\"], function (_exports, _log) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _log.default;\n    }\n  });\n  Object.defineProperty(_exports, \"log2\", {\n    enumerable: true,\n    get: function get() {\n      return _log.log2;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lt\", [\"exports\", \"ember-truth-helpers/helpers/lt\"], function (_exports, _lt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lt\", {\n    enumerable: true,\n    get: function get() {\n      return _lt.lt;\n    }\n  });\n});\n","define(\"connections-ui/helpers/lte\", [\"exports\", \"ember-truth-helpers/helpers/lte\"], function (_exports, _lte) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.default;\n    }\n  });\n  Object.defineProperty(_exports, \"lte\", {\n    enumerable: true,\n    get: function get() {\n      return _lte.lte;\n    }\n  });\n});\n","define(\"connections-ui/helpers/max\", [\"exports\", \"ember-math-helpers/helpers/max\"], function (_exports, _max) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _max.default;\n    }\n  });\n  Object.defineProperty(_exports, \"max\", {\n    enumerable: true,\n    get: function get() {\n      return _max.max;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute(date) {\n        let locale = this.get('intl.isoLocale');\n        if (moment(date, 'YYYY-MM-DD').isSame(new Date(), 'day')) {\n            return `TODAY: ${moment(date, 'YYYY-MM-DD').locale(locale).format('dddd MMMM DD')}`;\n        } else {\n            return moment(date, 'YYYY-MM-DD').locale(locale).format('MMMM DD');\n        }\n    }\n});\n","define(\"connections-ui/helpers/min\", [\"exports\", \"ember-math-helpers/helpers/min\"], function (_exports, _min) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _min.default;\n    }\n  });\n  Object.defineProperty(_exports, \"min\", {\n    enumerable: true,\n    get: function get() {\n      return _min.min;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mod\", [\"exports\", \"ember-math-helpers/helpers/mod\"], function (_exports, _mod) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mod\", {\n    enumerable: true,\n    get: function get() {\n      return _mod.mod;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-add\", [\"exports\", \"ember-moment/helpers/moment-add\"], function (_exports, _momentAdd) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentAdd.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-calendar\", [\"exports\", \"ember-moment/helpers/moment-calendar\"], function (_exports, _momentCalendar) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentCalendar.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-diff\", [\"exports\", \"ember-moment/helpers/moment-diff\"], function (_exports, _momentDiff) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDiff.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-duration\", [\"exports\", \"ember-moment/helpers/moment-duration\"], function (_exports, _momentDuration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentDuration.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-format\", [\"exports\", \"ember-moment/helpers/moment-format\"], function (_exports, _momentFormat) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFormat.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from-now\", [\"exports\", \"ember-moment/helpers/moment-from-now\"], function (_exports, _momentFromNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFromNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-from\", [\"exports\", \"ember-moment/helpers/moment-from\"], function (_exports, _momentFrom) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentFrom.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-subtract\", [\"exports\", \"ember-moment/helpers/moment-subtract\"], function (_exports, _momentSubtract) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentSubtract.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-date\", [\"exports\", \"ember-moment/helpers/moment-to-date\"], function (_exports, _momentToDate) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToDate.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to-now\", [\"exports\", \"ember-moment/helpers/moment-to-now\"], function (_exports, _momentToNow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentToNow.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-to\", [\"exports\", \"ember-moment/helpers/moment-to\"], function (_exports, _momentTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _momentTo.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment-unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/moment\", [\"exports\", \"ember-moment/helpers/moment\"], function (_exports, _moment) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _moment.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/mult\", [\"exports\", \"ember-math-helpers/helpers/mult\"], function (_exports, _mult) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.default;\n    }\n  });\n  Object.defineProperty(_exports, \"mult\", {\n    enumerable: true,\n    get: function get() {\n      return _mult.mult;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport default Ember.Helper.helper(function (params) {\n    if (params && params[0]) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n});\n","define(\"connections-ui/helpers/not-eq\", [\"exports\", \"ember-truth-helpers/helpers/not-equal\"], function (_exports, _notEqual) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.default;\n    }\n  });\n  Object.defineProperty(_exports, \"notEq\", {\n    enumerable: true,\n    get: function get() {\n      return _notEqual.notEq;\n    }\n  });\n});\n","define(\"connections-ui/helpers/not\", [\"exports\", \"ember-truth-helpers/helpers/not\"], function (_exports, _not) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _not.default;\n    }\n  });\n  Object.defineProperty(_exports, \"not\", {\n    enumerable: true,\n    get: function get() {\n      return _not.not;\n    }\n  });\n});\n","define(\"connections-ui/helpers/now\", [\"exports\", \"ember-moment/helpers/now\"], function (_exports, _now) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _now.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/or\", [\"exports\", \"ember-truth-helpers/helpers/or\"], function (_exports, _or) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _or.default;\n    }\n  });\n  Object.defineProperty(_exports, \"or\", {\n    enumerable: true,\n    get: function get() {\n      return _or.or;\n    }\n  });\n});\n","define(\"connections-ui/helpers/perform\", [\"exports\", \"ember-concurrency/helpers/perform\"], function (_exports, _perform) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.default;\n    }\n  });\n  Object.defineProperty(_exports, \"perform\", {\n    enumerable: true,\n    get: function get() {\n      return _perform.perform;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { inject } = Ember;\n\nexport default Ember.Helper.extend({\n    phoneIntegrations: inject.service(),\n\n    onIntegrationConfigChange: Ember.observer('phoneIntegrations.integrationConfigs.[]', function () {\n        this.recompute();\n    }),\n\n    compute([person]) {\n        if (person.integrationContactInfo === undefined) {\n            return [];\n        }\n        const phoneIntegrations = this.get('phoneIntegrations');\n        const integrationConfigs = phoneIntegrations.get('integrationConfigs');\n        return integrationConfigs.filter(\n            config =>\n                !!person.integrationContactInfo(config.key) &&\n                (config.includeBadge === undefined ||\n                    (config.includeBadge !== undefined && config.includeBadge === true))\n        );\n    }\n});\n","import Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\n\nexport default Ember.Helper.helper(function (params) {\n    const count = params[1] || 1;\n    const text = params[0];\n    if (count !== 1) {\n        return pluralize(text);\n    }\n    return text;\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","define(\"connections-ui/helpers/pow\", [\"exports\", \"ember-math-helpers/helpers/pow\"], function (_exports, _pow) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.default;\n    }\n  });\n  Object.defineProperty(_exports, \"pow\", {\n    enumerable: true,\n    get: function get() {\n      return _pow.pow;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-all\", [\"exports\", \"ember-promise-helpers/helpers/promise-all\"], function (_exports, _promiseAll) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseAll\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseAll.promiseAll;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-hash\", [\"exports\", \"ember-promise-helpers/helpers/promise-hash\"], function (_exports, _promiseHash) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.default;\n    }\n  });\n  Object.defineProperty(_exports, \"promiseHash\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseHash.promiseHash;\n    }\n  });\n});\n","define(\"connections-ui/helpers/promise-rejected-reason\", [\"exports\", \"ember-promise-helpers/helpers/promise-rejected-reason\"], function (_exports, _promiseRejectedReason) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _promiseRejectedReason.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/random\", [\"exports\", \"ember-math-helpers/helpers/random\"], function (_exports, _random) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _random.default;\n    }\n  });\n  Object.defineProperty(_exports, \"random\", {\n    enumerable: true,\n    get: function get() {\n      return _random.random;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { markdownToHtml } from '../utils/markdown';\n\nexport function renderMarkdown(params /*, hash*/) {\n    if (params && params.length > 0) {\n        return Ember.String.htmlSafe(markdownToHtml(params[0]));\n    }\n    return '';\n}\n\nexport default Ember.Helper.helper(renderMarkdown);\n","define(\"connections-ui/helpers/round\", [\"exports\", \"ember-math-helpers/helpers/round\"], function (_exports, _round) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _round.default;\n    }\n  });\n  Object.defineProperty(_exports, \"round\", {\n    enumerable: true,\n    get: function get() {\n      return _round.round;\n    }\n  });\n});\n","define(\"connections-ui/helpers/route-action\", [\"exports\", \"ember-route-action-helper/helpers/route-action\"], function (_exports, _routeAction) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeAction.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nexport default Ember.Helper.helper(function (params) {\n    const time = params[0];\n    return moment(time).format('h:mm a');\n});\n","import Ember from 'ember';\nimport { emojifyStringUnicode } from 'ember-purecloud-components/utils/emoji';\n\nexport default Ember.Helper.helper(params => {\n    const emoji = params[0];\n    const isUnicode = params.length > 1 ? params[1] : false;\n    const isUnicodeLookAhead = params[1] === 'isUnicodeLookAhead' ? true : false;\n    if (isUnicodeLookAhead) {\n        return emojifyStringUnicode(`:${emoji}:`);\n    }\n    return /:\\w+:/.test(emoji) || isUnicode ? emoji : `:${emoji}:`;\n});\n","define(\"connections-ui/helpers/sign\", [\"exports\", \"ember-math-helpers/helpers/sign\"], function (_exports, _sign) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sign\", {\n    enumerable: true,\n    get: function get() {\n      return _sign.sign;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sin\", [\"exports\", \"ember-math-helpers/helpers/sin\"], function (_exports, _sin) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sin\", {\n    enumerable: true,\n    get: function get() {\n      return _sin.sin;\n    }\n  });\n});\n","import singularize from 'ember-inflector/lib/helpers/singularize';\nexport default singularize;\n","import Ember from 'ember';\nimport orderBy from 'lodash/orderBy';\nimport moment from '../utils/dates';\n\nexport function sortFieldData([data], { group }) {\n    let key = group.key;\n    if (key === 'workHistory' || key === 'education') {\n        return orderBy(\n            data,\n            function (fieldData) {\n                let value = fieldData.get('value.value.startDate');\n                if (value) {\n                    let { month, year } = value;\n                    if (month) {\n                        month -= 1;\n                    }\n\n                    return moment({ month, year }).valueOf();\n                }\n            },\n            ['desc']\n        );\n    }\n\n    return data;\n}\n\nexport default Ember.Helper.helper(sortFieldData);\n","define(\"connections-ui/helpers/sqrt\", [\"exports\", \"ember-math-helpers/helpers/sqrt\"], function (_exports, _sqrt) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sqrt\", {\n    enumerable: true,\n    get: function get() {\n      return _sqrt.sqrt;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute([value, placeholder] /*, hash*/) {\n        if (typeof value === 'string') {\n            return value;\n        }\n        if (!value) {\n            return '';\n        }\n        if (Ember.get(value, 'promise')) {\n            if (Ember.get(value, 'isFulfilled')) {\n                return Ember.get(value, 'content');\n            }\n            return placeholder || this.get('intl').t('common.loading');\n        }\n        return 'stringOrPromiseError';\n    }\n});\n","define(\"connections-ui/helpers/sub\", [\"exports\", \"ember-math-helpers/helpers/sub\"], function (_exports, _sub) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sub\", {\n    enumerable: true,\n    get: function get() {\n      return _sub.sub;\n    }\n  });\n});\n","define(\"connections-ui/helpers/sum\", [\"exports\", \"ember-math-helpers/helpers/sum\"], function (_exports, _sum) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.default;\n    }\n  });\n  Object.defineProperty(_exports, \"sum\", {\n    enumerable: true,\n    get: function get() {\n      return _sum.sum;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n    compute: function (params, hash) {\n        return this.get('intl').lookup(params[0], hash);\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        var field = params[0];\n        var tag = field;\n        if (field) {\n            var section = field.replace('.', '_');\n            var key = section.substring(section.indexOf('_') + 1);\n            tag = this.get('intl').lookup(`person_${section}_labelKey_${key}`);\n        }\n\n        return tag;\n    }\n});\n","define(\"connections-ui/helpers/tan\", [\"exports\", \"ember-math-helpers/helpers/tan\"], function (_exports, _tan) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tan\", {\n    enumerable: true,\n    get: function get() {\n      return _tan.tan;\n    }\n  });\n});\n","define(\"connections-ui/helpers/tanh\", [\"exports\", \"ember-math-helpers/helpers/tanh\"], function (_exports, _tanh) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.default;\n    }\n  });\n  Object.defineProperty(_exports, \"tanh\", {\n    enumerable: true,\n    get: function get() {\n      return _tanh.tanh;\n    }\n  });\n});\n","define(\"connections-ui/helpers/task\", [\"exports\", \"ember-concurrency/helpers/task\"], function (_exports, _task) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _task.default;\n    }\n  });\n  Object.defineProperty(_exports, \"task\", {\n    enumerable: true,\n    get: function get() {\n      return _task.task;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\n\nconst { run, inject, addObserver, removeObserver, Helper } = Ember;\n\nfunction padZero(num) {\n    return num.toString().length === 1 ? `0${num}` : num;\n}\n\n// clone of duration format\n\nexport default Helper.extend({\n    clock: inject.service(),\n\n    willDestroy() {\n        removeObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this._super(...arguments);\n    },\n\n    compute(params, { startTime, endTime, durationInMs }) {\n        const shouldTick = (startTime || endTime) && !durationInMs;\n\n        this.set('startTime', startTime);\n        this.set('endTime', endTime);\n        this.set('durationInMs', durationInMs);\n\n        if (shouldTick) {\n            this._setupObserver();\n        }\n\n        return this._formatDuration();\n    },\n\n    _formatDuration: function () {\n        const startTime = this.get('startTime');\n        const endTime = this.get('endTime');\n\n        let durationInMs;\n        if (startTime && endTime) {\n            durationInMs = endTime.diff(startTime);\n        } else if (startTime) {\n            durationInMs = moment().diff(startTime);\n        } else if (endTime) {\n            durationInMs = endTime.diff(moment());\n        } else {\n            durationInMs = this.get('durationInMs');\n        }\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n        const duration = moment.duration(durationInMs);\n        const days = duration.days();\n\n        let hours = duration.hours() + days * 24;\n        let minutes = '';\n        if (hours) {\n            hours = `${hours}:`;\n            minutes = duration.minutes() ? `${padZero(duration.minutes())}:` : '00:';\n        } else {\n            hours = '';\n            minutes = duration.minutes() ? `${duration.minutes()}:` : '0:';\n        }\n\n        const seconds = duration.seconds() ? `${padZero(duration.seconds())}` : '00';\n\n        return `${hours}${minutes}${seconds}`;\n    },\n\n    _setupObserver() {\n        addObserver(this, 'clock.second', this, this._scheduleRecompute);\n        this.get('clock.second'); // start observation\n    },\n\n    _scheduleRecompute() {\n        run.next(this, this.recompute);\n    }\n});\n","import Ember from 'ember';\n\nconst titleForEntityPropertyHelper = Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const entity = params[0];\n        const entityType = params[1];\n        const entityPropertyType = params[2];\n        if (entityType === 'phone') {\n            return entity.getPhoneTitleFor(entityPropertyType);\n        }\n        if (entityType === 'email') {\n            return entity.getEmailTitleFor(entityPropertyType);\n        }\n        return '';\n    }\n});\n\nexport default titleForEntityPropertyHelper;\n","define(\"connections-ui/helpers/trunc\", [\"exports\", \"ember-math-helpers/helpers/trunc\"], function (_exports, _trunc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"trunc\", {\n    enumerable: true,\n    get: function get() {\n      return _trunc.trunc;\n    }\n  });\n});\n","define(\"connections-ui/helpers/unix\", [\"exports\", \"ember-moment/helpers/unix\"], function (_exports, _unix) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _unix.default;\n    }\n  });\n});\n","define(\"connections-ui/helpers/utc\", [\"exports\", \"ember-moment/helpers/utc\"], function (_exports, _utc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.default;\n    }\n  });\n  Object.defineProperty(_exports, \"utc\", {\n    enumerable: true,\n    get: function get() {\n      return _utc.utc;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Helper.extend({\n    intl: Ember.inject.service(),\n\n    compute(params) {\n        const intl = this.get('intl');\n        const value = params[0];\n        const type = params[1];\n        if (type === 'location') {\n            return intl.lookup('geolocation.formattedLocationName', value);\n        }\n        if (!value || !value.value) {\n            return '';\n        }\n        if (type === 'email') {\n            return value.value;\n        }\n        if (type === 'voice' || type === 'sms') {\n            const number = value.value.number;\n            const ext = value.value.extension;\n            const html = `<span class='number'>${number}</span>`;\n            const extLabel = intl.lookup('entity.fieldTypes.phone.extension');\n            return Ember.String.htmlSafe(\n                ext ? `${html} <span>${extLabel}</span> <span class='extension'>${ext}</span>` : html\n            );\n        }\n        return '';\n    }\n});\n","define(\"connections-ui/helpers/xor\", [\"exports\", \"ember-truth-helpers/helpers/xor\"], function (_exports, _xor) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.default;\n    }\n  });\n  Object.defineProperty(_exports, \"xor\", {\n    enumerable: true,\n    get: function get() {\n      return _xor.xor;\n    }\n  });\n});\n","export var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded'\n};\n","define(\"connections-ui/index\", [\"exports\", \"ember-uuid\"], function (_exports, _emberUuid) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _emberUuid.v4;\n    }\n  });\n});\n","import initialize from 'ember-modal-dialog/initializers/add-modals-container';\n\nexport default {\n  name: 'add-modals-container',\n  initialize: initialize\n};\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version)\n};\n","import ApplicationService from '../services/application';\n\nexport default {\n    name: 'setupApplicationService',\n    after: 'orgspan',\n    initialize(application) {\n        application.register('service:application', ApplicationService);\n        application.inject('controller', 'applicationService', 'service:application');\n        application.inject('route', 'applicationService', 'service:application');\n        application.inject('component', 'applicationService', 'service:application');\n        application.inject('model', 'applicationService', 'service:application');\n    }\n};\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\nimport AuthenticatedAuthorizedRouteMixin from '../mixins/authenticated-authorized-route-mixin';\n\nexport default {\n    name: 'authenticationSetup',\n    after: 'orgspan',\n    before: 'authenticators',\n\n    initialize: function () {\n        /*\n         * Protecting ALL routes with ember-simple-auth by default\n         *\n         * Use unprotected or unauthenticated route mixins to relax\n         * permissions on your routes\n         */\n        Ember.Route.reopen(AuthenticatedAuthorizedRouteMixin);\n\n        UnauthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n\n        AuthenticatedRouteMixin.reopen({\n            beforeModel() {\n                if (!this.get('session.isAuthenticated')) {\n                    return this._super(...arguments);\n                }\n\n                /*\n                Intentionally not calling super or doing anthing.  This should\n                be the termination of the route hierarchy.  If not, you\n                run into the default Ember route which we just set as an\n                authenticated-authorized route.\n                */\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\nimport netUtils from '../utils/net';\n\nfunction loadOauthProps() {\n    const { oauthProps } = config;\n    if (oauthProps && typeof oauthProps === 'object' && !Object.prototype.hasOwnProperty.call(oauthProps, 'clientId')) {\n        try {\n            const { runtime } = netUtils.getEnvDetails();\n            // Authenticator will handle `null` from a UI perspective\n            return runtime.name in oauthProps ? oauthProps[runtime.name] : null;\n        } catch (e) {\n            return null;\n        }\n    }\n    return oauthProps;\n}\n\nexport function deprecateJqueryCookie() {\n    const jQueryCookieDeprecation = {\n        id: 'directory-core.deprecate-jquery-cookie',\n        until: '8.0.0',\n        url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-jquery-cookie'\n    };\n\n    if (Ember.$.cookie) {\n        const cookie = Ember.$.cookie;\n        Ember.$.cookie = function _overrideCookie(name, value) {\n            let message = 'Please use `service:ember-cookies`.read(name) instead of jQuery.$.cookie';\n            if (value) {\n                message = 'Please use `service:ember-cookies`.write(name, value, [opts]) instead of jQuery.$.cookie';\n            }\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return cookie.apply(Ember.$, arguments);\n        };\n    }\n\n    if (Ember.$.removeCookie) {\n        const removeCookie = Ember.$.removeCookie;\n        Ember.$.removeCookie = function _overrideRemoveCookie() {\n            const message = 'Please use `service:ember-cookies`.clear(name) instead of jQuery.$.removeCookie';\n            Ember.deprecate(message, false, jQueryCookieDeprecation);\n            return removeCookie.apply(Ember.$, arguments);\n        };\n    }\n}\n\nexport default {\n    name: 'authenticators',\n    before: 'ember-simple-auth',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        deprecateJqueryCookie();\n\n        application.register('authenticator:oauthProps', Ember.Object.extend(loadOauthProps() || {}));\n        application.inject('authenticator:directory', 'oauthProps', 'authenticator:oauthProps');\n    }\n};\n","import ChatService from '../services/chat';\n\nexport default {\n    name: 'setupChatService',\n    after: 'setupPhoneService',\n    initialize: function (application) {\n        application.register('service:chat', ChatService, { singleton: true, initialize: true });\n        application.inject('service:chat', 'store', 'service:store');\n        application.inject('service:chat', 'session', 'service:session');\n        application.inject('service:chat', 'preferences', 'service:preferences');\n        application.inject('service:chat', 'applicationService', 'service:application');\n        application.inject('service:chat', 'phoneService', 'service:phone');\n\n        application.inject('controller', 'chatService', 'service:chat');\n        application.inject('route', 'chatService', 'service:chat');\n        application.inject('component', 'chatService', 'service:chat');\n    }\n};\n","import Clock from '../services/clock';\n\nexport default {\n  name: 'clock',\n  initialize: function() {\n    var app = arguments[1] || arguments[0];\n    app.register('clock:main', Clock);\n    app.inject('controller', 'clock', 'clock:main');\n    app.inject('component', 'clock', 'clock:main');\n  }\n};\n","export { default, initialize } from 'ember-component-css/initializers/component-styles';\n\nimport Ember from 'ember';\n\nimport StyleNamespacingExtras from '../mixins/style-namespacing-extras';\n\n// eslint-disable-next-line ember/new-module-imports\nEmber.Component.reopen(StyleNamespacingExtras);\n","import ContainerDebugAdapter from 'ember-resolver/resolvers/classic/container-debug-adapter';\n\nexport default {\n  name: 'container-debug-adapter',\n\n  initialize() {\n    let app = arguments[1] || arguments[0];\n\n    app.register('container-debug-adapter:main', ContainerDebugAdapter);\n    app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n  }\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `data-adapter` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'data-adapter',\n  before: 'store',\n  initialize() {}\n};\n","import WebrtcSdkService from '../services/device-profiles-v2';\n\nexport default {\n    name: 'setupDeviceProfilesService',\n    after: 'setupWebrtcSdkService',\n    initialize: function (application) {\n        application.register('service:device-profiles-v2', WebrtcSdkService);\n        application.inject('controller', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('route', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('component', 'device-profiles-v2', 'service:device-profiles-v2');\n    }\n};\n","define(\"connections-ui/initializers/ember-concurrency\", [\"exports\", \"ember-concurrency/initializers/ember-concurrency\"], function (_exports, _emberConcurrency) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _emberConcurrency.initialize;\n    }\n  });\n});\n","import {initializer as initialize} from 'ember-data-change-tracker';\n\nexport default {\n  name: 'ember-data-change-tracker',\n  after: 'ember-data',\n  initialize\n};\n","import setupContainer from 'ember-data/setup-container';\nimport 'ember-data';\n\n/*\n\n  This code initializes Ember-Data onto an Ember application.\n\n  If an Ember.js developer defines a subclass of DS.Store on their application,\n  as `App.StoreService` (or via a module system that resolves to `service:store`)\n  this code will automatically instantiate it and make it available on the\n  router.\n\n  Additionally, after an application's controllers have been injected, they will\n  each have the store made available to them.\n\n  For example, imagine an Ember.js application with the following classes:\n\n  App.StoreService = DS.Store.extend({\n    adapter: 'custom'\n  });\n\n  App.PostsController = Ember.Controller.extend({\n    // ...\n  });\n\n  When the application is initialized, `App.ApplicationStore` will automatically be\n  instantiated, and the instance of `App.PostsController` will have its `store`\n  property set to that instance.\n\n  Note that this code will only be run if the `ember-application` package is\n  loaded. If Ember Data is being used in an environment other than a\n  typical application (e.g., node.js where only `ember-runtime` is available),\n  this code will be ignored.\n*/\n\nexport default {\n  name: 'ember-data',\n  initialize: setupContainer\n};\n","import ENV from '../config/environment';\nimport Configuration from 'ember-simple-auth/configuration';\nimport setupSession from 'ember-simple-auth/initializers/setup-session';\nimport setupSessionService from 'ember-simple-auth/initializers/setup-session-service';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(registry) {\n    const config = ENV['ember-simple-auth'] || {};\n    config.baseURL = ENV.rootURL || ENV.baseURL;\n    Configuration.load(config);\n\n    setupSession(registry);\n    setupSessionService(registry);\n  }\n};\n","define(\"connections-ui/initializers/engines\", [\"exports\", \"ember-engines/initializers/engines\"], function (_exports, _engines) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _engines.initialize;\n    }\n  });\n});\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nexport function initialize() {\n  var application = arguments[1] || arguments[0];\n  if (config.exportApplicationGlobal !== false) {\n    var theGlobal;\n    if (typeof window !== 'undefined') {\n        theGlobal = window;\n    } else if (typeof global !== 'undefined') {\n        theGlobal = global\n    } else if (typeof self !== 'undefined') {\n        theGlobal = self;\n    } else {\n       // no reasonable global, just bail\n       return;\n    }\n\n    var value = config.exportApplicationGlobal;\n    var globalName;\n\n    if (typeof value === 'string') {\n      globalName = value;\n    } else {\n      globalName = Ember.String.classify(config.modulePrefix);\n    }\n\n    if (!theGlobal[globalName]) {\n      theGlobal[globalName] = application;\n\n      application.reopen({\n        willDestroy: function() {\n          this._super.apply(this, arguments);\n          delete theGlobal[globalName];\n        }\n      });\n    }\n  }\n}\n\nexport default {\n  name: 'export-application-global',\n\n  initialize: initialize\n};\n","import throttled from \"rate-limit-computed/throttled\";\nimport debounced from \"rate-limit-computed/debounced\";\n\nexport default {\n  name: 'extend-ember-computed',\n  initialize: function() {\n    Ember.computed.throttle = throttled;\n    Ember.computed.debounce = debounced;\n  }\n};\n","import FieldConfig from '../field-config/field-config';\n\nimport PersonFieldConfig from '../field-config/entities/person';\nimport GroupFieldConfig from '../field-config/entities/group';\nimport OrgFieldConfig from '../field-config/entities/org';\nimport ExternalContactFieldConfig from '../field-config/entities/external-contact';\n\nfunction _register(application, id, config) {\n    application.register(id, config);\n}\n\nfunction initialize(application) {\n    _register(application, 'field-config:base', FieldConfig);\n    _register(application, 'field-config:person', PersonFieldConfig);\n    _register(application, 'field-config:group', GroupFieldConfig);\n    _register(application, 'field-config:org', OrgFieldConfig);\n    _register(application, 'field-config:externalContact', ExternalContactFieldConfig);\n}\n\nexport default {\n    name: 'setupFieldConfig',\n    after: 'orgspan',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `injectStore` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'injectStore',\n  before: 'store',\n  initialize() {}\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nconst MainInitializer = {\n    name: 'orgspan',\n    after: 'ember-data',\n\n    initialize: function (application) {\n        // TODO: THIS IS BAD...remove later\n        window.Orgspan = application;\n\n        application.inject('component', 'store', 'service:store');\n\n        /*\n         * Ember is supposed to noop Ember.deprecate calls in production builds:\n         * http://emberjs.com/api/classes/Ember.html#method_deprecate\n         * However, this is a WIP:\n         * https://github.com/ember-cli/rfcs/pull/50\n         *\n         * Until this RFC is implemented, kill the deprecation chain which will\n         * result in noop (e.g. no logging) in non-dev environments.\n         */\n        if (config.environment !== 'development') {\n            // Register an empty function to break the deprecation chain call\n            Ember.Debug.registerDeprecationHandler(function () {});\n        }\n    }\n};\n\nif (config.environment === 'test') {\n    MainInitializer.after = ['ember-data'];\n}\n\nexport default MainInitializer;\n","import Provider from '../media-providers/provider';\nimport ZoomProvider from '../media-providers/zoom';\nimport PureCloudProvider from '../media-providers/purecloud';\nimport TeamsProvider from '../media-providers/teams';\n\nfunction _register(application, id, config) {\n    application.register(id, config, { singleton: false });\n}\n\nfunction initialize(application) {\n    _register(application, 'media-provider:base', Provider);\n    _register(application, 'media-provider:zoom', ZoomProvider);\n    _register(application, 'media-provider:purecloud', PureCloudProvider);\n    _register(application, 'media-provider:teams', TeamsProvider);\n}\n\nexport default {\n    name: 'setupMediaProviders',\n    after: 'orgspan',\n    initialize\n};\n","import PhoneService from '../services/phone';\n\nexport default {\n    name: 'setupPhoneService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:phone', PhoneService, { singleton: true, initialize: true });\n        application.inject('service:phone', 'store', 'service:store');\n        application.inject('service:phone', 'session', 'service:session');\n        application.inject('service:phone', 'preferences', 'service:preferences');\n        application.inject('service:phone', 'applicationService', 'service:application');\n\n        application.inject('route', 'phoneService', 'service:phone');\n        application.inject('component', 'phoneService', 'service:phone');\n    }\n};\n","import PreferencesService from '../services/preferences';\n\nexport default {\n    name: 'setupPreferencesService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:preferences', PreferencesService);\n        application.inject('controller', 'preferences', 'service:preferences');\n        application.inject('route', 'preferences', 'service:preferences');\n        application.inject('component', 'preferences', 'service:preferences');\n    }\n};\n","define(\"connections-ui/initializers/route-styles\", [\"exports\", \"ember-component-css/initializers/route-styles\"], function (_exports, _routeStyles) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _routeStyles.initialize;\n    }\n  });\n});\n","import ApplicationService from 'connections-ui/services/application';\nimport netUtils from '../utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nexport default {\n    name: 'service-discovery',\n\n    initialize: function (application) {\n        application.deferReadiness();\n        if (isTesting) {\n            ApplicationService.reopen({\n                authUri: null\n            });\n        } else {\n            const instanceProperties = {};\n            const runtimePublicDomainName = netUtils.getEnvDetails().runtime\n                ? netUtils.getEnvDetails().runtime.publicDomainName\n                : null;\n            if (runtimePublicDomainName) {\n                instanceProperties.authUri = 'https://login.' + runtimePublicDomainName;\n                instanceProperties.purecloudV2BaseUri = 'https://api.' + runtimePublicDomainName;\n                instanceProperties.cobrowseUri = 'https://cobrowse.' + runtimePublicDomainName;\n                instanceProperties.purecloudAppsUri = 'https://apps.' + runtimePublicDomainName + '/';\n                instanceProperties.streamingServiceUri = 'wss://streaming.' + runtimePublicDomainName;\n            } else {\n                instanceProperties.authUri = null;\n            }\n            ApplicationService.reopen(instanceProperties);\n            application.advanceReadiness();\n        }\n    }\n};\n","import SessionService from '../services/session';\n\nexport default {\n    name: 'setupSessionService',\n    after: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:session', SessionService);\n        application.inject('service:session', 'application', 'service:application');\n        application.inject('controller', 'session', 'service:session');\n        application.inject('route', 'session', 'service:session');\n        application.inject('component', 'session', 'service:session');\n        application.inject('adapter', 'session', 'service:session');\n    }\n};\n","import { loadTheme, setThemeClass } from '../utils/theme-loader';\n\nexport default {\n    name: 'set-application-theme',\n    before: 'orgspan',\n    /**\n     * Sets the theme to an out-of-the-box supported theme until FT's load in, and then will update the theme\n     * of the application to the actual cached theme if the FT is supported in the Environment. That way the\n     * theme will never show until it's confirmed to be supported no matter the value of the theme cookie.\n     */\n    initialize: () => setThemeClass(loadTheme())\n};\n","const require = window.requirejs;\n\nexport function initialize(instance) {\n    const regex = /^ember-webrtc-components\\/components\\/([\\w\\-/]+)\\/component/;\n    const packages = Object.keys(require._eak_seen);\n    const paths = packages.filter(path => regex.test(path));\n    paths.forEach(path => {\n        const matches = path.match(regex);\n        const name = matches && matches.length && matches[matches.length - 1];\n        instance.register(`component:${name}`, require(path).default);\n    });\n}\n\nexport default {\n    name: 'setup-webrtc-components',\n    initialize\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `store` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'store',\n  after: 'ember-data',\n  initialize() {}\n};\n","/*\n  This initializer is here to keep backwards compatibility with code depending\n  on the `transforms` initializer (before Ember Data was an addon).\n\n  Should be removed for Ember Data 3.x\n*/\n\nexport default {\n  name: 'transforms',\n  before: 'store',\n  initialize() {}\n};\n","import WebrtcSdkService from '../services/webrtc-sdk';\nimport 'genesys-cloud-webrtc-sdk';\n\nexport default {\n    name: 'setupWebrtcSdkService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:webrtc-sdk', WebrtcSdkService);\n        application.inject('controller', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('route', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('component', 'webrtc-sdk', 'service:webrtc-sdk');\n    }\n};\n","import WebrtcService from 'ember-webrtc-components/services/webrtc';\n\nexport default {\n    name: 'setupWebrtcService',\n    after: 'setupChatService',\n    initialize: function (application) {\n        application.register('service:webrtc', WebrtcService, { singleton: true, initialize: true });\n        application.inject('service:webrtc', 'store', 'service:store');\n        application.inject('service:webrtc', 'session', 'service:session');\n        application.inject('service:webrtc', 'preferences', 'service:preferences');\n        application.inject('service:webrtc', 'applicationService', 'service:application');\n        application.inject('service:webrtc', 'phoneService', 'service:phone');\n        application.inject('service:webrtc', 'chatService', 'service:chat');\n\n        application.inject('controller', 'webrtcService', 'service:webrtc');\n        application.inject('route', 'webrtcService', 'service:webrtc');\n        application.inject('component', 'webrtcService', 'service:webrtc');\n    }\n};\n","import WebrtcSettings from '../services/webrtc-settings';\n\nexport default {\n    name: 'setupWebrtcSettingsService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:webrtc-settings', WebrtcSettings);\n        application.inject('controller', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('route', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('component', 'webrtc-settings', 'service:webrtc-settings');\n    }\n};\n","export function initialize(instance) {\n    instance.lookup('controller:application');\n}\n\nexport default {\n    name: 'attach-application-controller',\n    initialize\n};\n","export default {\n    name: 'attach-application-session',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('session', instance.lookup('service:session'));\n    }\n};\n","define(\"connections-ui/instance-initializers/backburner-debug\", [\"exports\", \"ember-purecloud-components/instance-initializers/backburner-debug\"], function (_exports, _backburnerDebug) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _backburnerDebug.initialize;\n    }\n  });\n});\n","define(\"connections-ui/instance-initializers/conversation-service\", [\"exports\", \"ember-purecloud-components/instance-initializers/conversation-service\"], function (_exports, _conversationService) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.default;\n    }\n  });\n  Object.defineProperty(_exports, \"initialize\", {\n    enumerable: true,\n    get: function get() {\n      return _conversationService.initialize;\n    }\n  });\n});\n","export function initialize(applicationInstance) {\n    applicationInstance.lookup('service:embedded');\n}\n\nexport default {\n    name: 'embedded',\n    initialize: initialize\n};\n","import initializeStoreService from 'ember-data/instance-initializers/initialize-store-service';\n\nexport default {\n  name: \"ember-data\",\n  initialize: initializeStoreService\n};\n","/* globals requirejs, Intl */\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\n\nimport Ember from 'ember';\nimport ENV from '../config/environment';\nimport links from 'ember-intl/utils/links';\n\nconst { warn } = Ember;\n\nfunction filterBy(type) {\n  return Object.keys(requirejs._eak_seen).filter((key) => {\n    return key.indexOf(`${ENV.modulePrefix}\\/${type}\\/`) === 0;\n  });\n}\n\nexport function instanceInitializer(instance) {\n  let service;\n\n  if (typeof instance.lookup === 'function') {\n    service = instance.lookup('service:intl');\n  } else {\n    service = instance.container.lookup('service:intl');\n  }\n\n  if (typeof Intl === 'undefined') {\n    warn(`[ember-intl] Intl API is unavailable in this environment.\\nSee: ${links.polyfill}`, false, {\n      id: 'ember-intl-undefined-intljs'\n    });\n  }\n\n  const cldrs = filterBy('cldrs');\n\n  if (!cldrs.length) {\n    warn('[ember-intl] project is missing CLDR data\\nIf you are asynchronously loading translation, see: ${links.asyncTranslations}.', false, {\n      id: 'ember-intl-missing-cldr-data'\n    });\n  } else {\n    cldrs.map((moduleName) => requirejs(moduleName, null, null, true)['default'])\n      .forEach((locale) => locale.forEach(service.addLocaleData));\n  }\n\n  filterBy('translations').forEach((moduleName) => {\n    const localeSplit = moduleName.split('\\/');\n    const localeName = localeSplit[localeSplit.length - 1];\n    service.addTranslations(localeName, requirejs(moduleName, null, null, true)['default']);\n  });\n}\n\nexport default {\n  name: 'ember-intl',\n  initialize: instanceInitializer\n}\n","import setupSessionRestoration from 'ember-simple-auth/instance-initializers/setup-session-restoration';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(instance) {\n    setupSessionRestoration(instance);\n  }\n};\n","import LazyRenderWrapper from 'ember-tooltips/components/lazy-render-wrapper';\n\nexport function initialize() {\n    // this can be removed after ember-tooltips version is bumped to 3.0.\n    // 2.5 defaults this property to off.\n    LazyRenderWrapper.reopen({\n        enableLazyRendering: true\n    });\n}\n\nexport default {\n    name: 'ember-tooltips',\n    initialize\n};\n","import EntityContactGroupComponent from '../components/entity-contact-group-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityContactGroupComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-contact-group-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityFavoriteComponent from 'ember-purecloud-components/components/entity-favorite/component';\n\nexport function initialize() {\n    EntityFavoriteComponent.reopen({\n        favorites: Ember.inject.service(),\n        toggleFavorite(entity) {\n            this.get('favorites').toggleFavorite(entity);\n        }\n    });\n}\n\nexport default {\n    name: 'entity-favorite',\n    initialize\n};\n","import EntityHoverCard from '../components/entity-hover-card-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityHoverCard.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-hover-card-v2',\n    initialize\n};\n","import EntityImageComponent from '../components/entity-image-v2/component';\nimport EntityImageDefaults from 'connections-ui/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityImageComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-image-v2',\n    initialize\n};\n","import Ember from 'ember';\nimport EntityLocationComponent from 'ember-purecloud-components/components/entity-location/component';\n\nexport function initialize() {\n    EntityLocationComponent.reopen({\n        session: Ember.inject.service(),\n        geolocation: Ember.inject.service(),\n\n        self: Ember.computed.reads('session.person'),\n        isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled')\n    });\n}\n\nexport default {\n    name: 'entity-location',\n    initialize\n};\n","import Validators from '../components/entity-fields/validators';\n\nexport function initialize(application) {\n    Validators.reopen(application.ownerInjection());\n}\n\nexport default {\n    name: 'inject-owner',\n    initialize\n};\n","import manifest from '../config/asset-manifest';\n\n/**\n * Initializes the AssetLoader service with a generated asset-manifest.\n */\nexport function initialize(instance) {\n  const service = instance.lookup('service:asset-loader');\n  service.pushManifest(manifest);\n}\n\nexport default {\n  name: 'load-asset-manifest',\n  initialize\n};\n","import Ember from 'ember';\nimport PresenceLabelComponent from 'ember-purecloud-components/components/presence-label/component';\n\nexport function initialize() {\n    PresenceLabelComponent.reopen({\n        chat: Ember.inject.service(),\n        isChatEnabled: Ember.computed.reads('chat.enabled')\n    });\n}\n\nexport default {\n    name: 'presence-label',\n    initialize\n};\n","export default {\n  name: 'setupRecordingService',\n  initialize (instance) {\n    instance.lookup('service:recording');\n  }\n};\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default {\n    name: 'reopen-component',\n\n    initialize(instance) {\n        const session = instance.lookup('service:session');\n        const preferences = instance.lookup('service:preferences');\n\n        Ember.Component.reopen({\n            bubbleAction(data) {\n                try {\n                    this.triggerAction(data);\n                } catch (e) {\n                    // Turn on to debug component stack\n                    // Ember.Logger.warn(e.message, e.stack);\n                }\n\n                const parentView = this.get('parentView');\n                if (parentView && parentView.bubbleAction) {\n                    parentView.bubbleAction(data);\n                }\n            }\n        });\n\n        Ember.Component.reopen({\n            init() {\n                this._super();\n\n                var services = this.get('needsServices');\n                if (!services) {\n                    services = [];\n                }\n\n                var current = this.get('services');\n                if (!current) {\n                    current = {};\n                }\n\n                _.each(services, function (name) {\n                    var service = instance.lookup('service:' + name);\n                    Ember.set(current, name, service);\n                });\n\n                this.set('services', current);\n\n                if (!this.get('session')) {\n                    this.set('session', session);\n                }\n\n                if (!this.get('preferences')) {\n                    this.set('preferences', preferences);\n                }\n            }\n        });\n    }\n};\n","import Ember from 'ember';\nconst { inject, observer, Route } = Ember;\n\nexport default {\n    name: 'reopen-route',\n\n    initialize() {\n        Route.reopen({\n            intl: inject.service(),\n            application: inject.service(),\n\n            routeTitle: '',\n\n            updateRouteTitle: observer(\n                'routeName',\n                'routeTitle',\n                'application.{orgName,currentRouteName}',\n                function () {\n                    let parts = [];\n                    let routeName = this.get('routeName');\n                    let routeTitle = this.get('routeTitle');\n                    let appRoute = this.get('application.currentRouteName') || '';\n                    let orgName = this.get('application.orgName');\n\n                    if (!routeTitle || appRoute.indexOf(routeName) === -1) {\n                        return;\n                    }\n\n                    parts.push(typeof routeTitle === 'function' ? routeTitle.call(this) : routeTitle);\n\n                    if (orgName) {\n                        parts.push(orgName);\n                    }\n\n                    window.top.document.title = parts.join(' - ');\n                }\n            )\n        });\n    }\n};\n","import Ember from 'ember';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport HostedContext from '../utils/hosted-context';\nimport { parseRuntimeCustom } from '../utils/net';\n\nexport default {\n    name: 'set-application-service-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        const service = instance.lookup('service:application');\n        service.setProperties(application.getProperties('urlprefix', 'semver', 'version', 'context'));\n        const context = HostedContext.create(instance.ownerInjection());\n        service.set('hostedContext', context);\n        service.set('store', instance.lookup('service:store'));\n        if (isTesting) {\n            // Runtime will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n            service.set('runtime', null);\n        } else {\n            try {\n                const runtime = parseRuntimeCustom();\n                if (runtime) service.set('runtime', parseRuntimeCustom());\n                else {\n                    throw new Error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js');\n                }\n            } catch (error) {\n                Ember.Logger.error(error);\n                // Setting the errorState on the applicaiton service will route to the maintenance mode page.\n                service.set('errorState', { type: 'invalidEnv' });\n                service.set('runtime', null);\n            }\n        }\n        application.set('applicationService', service);\n    }\n};\n","export default {\n    name: 'set-application-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('instance', instance);\n        application.set('ajax', instance.lookup('ajax:application'));\n        application.set('permissions', instance.lookup('permissions:application'));\n\n        // Probably shouldn't access these this way...might be one of those separation of concerns problems\n        application.set('store', instance.lookup('service:store'));\n        application.set('router', instance.lookup('router:main'));\n    }\n};\n","import Ember from 'ember';\nimport { initializeMarkdownRendering } from '../utils/markdown';\nimport { initializeEmojiRendering } from 'ember-purecloud-components/utils/emoji';\n\nexport default {\n    name: 'setup-application',\n    initialize: function (instance) {\n        const application = instance.lookup('application:main');\n        // looking up sound service here loads all of the sounds and creates handlers for onplay and onstop events.\n        // see PCDWEBK-3861 for more info.\n        const sound = instance.lookup('service:sound'); // eslint-disable-line no-unused-vars\n\n        Ember.$(window).on('beforeunload', function (event) {\n            return Ember.run(() => {\n                // mailto: links cause beforeunload to fire.\n                let isLink = false;\n                let $target = Ember.$(Ember.get(event, 'target.activeElement'));\n                let href = $target.attr('href');\n                if (!href) {\n                    $target = Ember.$($target).closest('a');\n                    href = $target.attr('href');\n                }\n                if (href) {\n                    isLink = href.indexOf('mailto') > -1 || href.indexOf('tel') > -1;\n                }\n                if (isLink) {\n                    return;\n                }\n            });\n        });\n\n        const urlPrefix = application.get('urlprefix');\n\n        initializeEmojiRendering(urlPrefix);\n\n        const isApplicationRoute = function (href) {\n            return !!/^\\/?#\\/.*\\/[a-f0-9]{24}/.test(href) || !!/^\\/?#\\/.*\\/[a-z0-9-]{36}$/i.test(href);\n        };\n\n        initializeMarkdownRendering(isApplicationRoute);\n    }\n};\n","export default {\n    name: 'setup-apps-api-handlers',\n    initialize(instance) {\n        let apiHandlers = [];\n        let apiHandlerKeys = instance.lookup('apps-api-handler:keys');\n        if (apiHandlerKeys && apiHandlerKeys.length) {\n            apiHandlerKeys.forEach(currHandlerKey => {\n                apiHandlers.push(instance.lookup(currHandlerKey));\n            });\n        }\n\n        instance.lookup('service:apps').set('globalApiHandlers', apiHandlers);\n    }\n};\n","import Ember from 'ember';\n\nexport function initialize(instance) {\n    const stashLogger = instance.lookup('service:stash-logger');\n    Ember.Logger = stashLogger;\n    Ember.onerror = function (error) {\n        const status = error ? Ember.get(error, 'status') : null;\n        if (status === 200) {\n            return null;\n        } else if (status === 418) {\n            const applicationService = instance.lookup('service:application');\n            const session = applicationService.get('session');\n            if (session) {\n                session.logout();\n            }\n        }\n\n        // Sometimes Ember RSVP triggers the onError, and sometimes it doesn't,\n        // so this will prevent the same error being logged multiple times\n        if (error._logged === true || error === 'Request Cancelled') {\n            return;\n        }\n\n        if (typeof error === 'object') {\n            error._logged = true;\n        }\n\n        return stashLogger.error(`Global Error Caught: ${error}`);\n    };\n\n    Ember.RSVP.on('error', function (error) {\n        if (!error) {\n            return; // https://github.com/simplabs/ember-simple-auth/issues/439\n        }\n        if (!instance.isDestroyed) {\n            Ember.onerror(error);\n        }\n    });\n\n    const nrOnError = window.onerror;\n    window.onerror = function () {\n        if (nrOnError) {\n            nrOnError.apply(nrOnError, arguments);\n        }\n        stashLogger.error(arguments);\n        return true; // stash logger will handle and log it\n    };\n}\n\nexport default {\n    name: 'setup-error-handling',\n    initialize: initialize\n};\n","function hasQueryParam(param) {\n    const search = window.location.search;\n\n    if (!search) {\n        return false;\n    }\n\n    const params = new URLSearchParams(window.location.search);\n\n    return params.get(param) === 'true';\n}\n\nexport function initialize(instance) {\n    ['disableSoftphone', 'disableProactiveDevicePermissions'].forEach(param => {\n        if (hasQueryParam(param)) {\n            const webrtc = instance.lookup('service:webrtc');\n            webrtc.logger.info(`Setting webrtc.${param} to true based on query param`);\n            webrtc.set(param, true);\n        }\n    });\n}\n\nexport default {\n    name: 'webrtc',\n    initialize\n};\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst TARGET_PRESENCE = Object.freeze({\n    BUSY: 'busy',\n    MEETING: 'meeting',\n    OFFLINE: 'offline'\n});\n\nexport default Ember.Object.extend(LoggerMixin, {\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    // Required props\n\n    /**\n     * User associated with this media provider instance (usually the current UI session user)\n     */\n    user: null,\n\n    /**\n     * Type of media provider\n     * Currently only \"video\"\n     */\n    type: null,\n\n    /**\n     * Unique id among the video provider implementations\n     */\n    id: null,\n\n    /**\n     * Label for the media provider (can be a computed property)\n     */\n    label: null,\n\n    /**\n     * Used to store stateful data that can be used in the UI\n     */\n    data: null,\n\n    /**\n     * Path to an image used to launch a video chat inside of the video panel\n     */\n    launchVideoImage: Ember.computed(function () {\n        return '';\n    }),\n\n    disabled: Ember.computed(\n        'user',\n        'room.oneToOneTarget',\n        'room.oneToOneTarget.activities.{presence}',\n        'user.activities.{presence}',\n        function () {\n            let presence = this.getTargetPresence();\n            return (\n                presence === TARGET_PRESENCE.BUSY ||\n                presence === TARGET_PRESENCE.MEETING ||\n                presence === TARGET_PRESENCE.OFFLINE\n            );\n        }\n    ),\n\n    disabledMessage: Ember.computed('disabled', 'user.name', 'room.oneToOneTarget.name', function () {\n        let presence = this.getTargetPresence();\n        let name = this.get('user.name') || this.get('room.oneToOneTarget.name');\n        if (presence === TARGET_PRESENCE.OFFLINE) {\n            return this.get('intl').t('ewc.userOffline', { name });\n        }\n        if (presence === TARGET_PRESENCE.BUSY || presence === TARGET_PRESENCE.MEETING) {\n            return this.get('intl').t('ewc.userBusy', { name });\n        }\n        return this.get('intl').t('common.disabled');\n    }),\n\n    getTargetPresence() {\n        let user = this.get('user');\n        let room = this.get('room');\n\n        if (user) {\n            const gcPresence = user.get('primaryPresence');\n            if (gcPresence) {\n                return (Ember.get(gcPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        if (room && room.get('oneToOneTarget')) {\n            const profile = room.get('oneToOneTarget');\n            const chatUserPresence = profile.get('primaryPresence');\n            if (chatUserPresence) {\n                return (Ember.get(chatUserPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        return '';\n    },\n\n    // Optional props\n\n    /**\n     * Optional chat room\n     * If you have a media provider that associates itself with a room (video),\n     * you can set this property to hold that state\n     */\n    room: null,\n\n    /**\n     * Optional handler (can be async)\n     * If the provider needs to handle user action (clicking something in the interface)\n     * then you can provider that function here\n     */\n    action: () => {},\n\n    /**\n     * Optional data loader\n     */\n    loadData: () => {},\n\n    /**\n     * Optional handler\n     * If your media provider action could not be run, this handler will be called\n     * It can be used to show an error notification\n     */\n    showRunErrorNotification: () => {},\n\n    /**\n     * Indicates if this provider is available as a feature to the current user.\n     * Implementations can utilize feature toggles, org settings, user access controls, etc.\n     * as needed.\n     *\n     * Used to provide access to various parts of the UI for a media provider\n     * Currently mostly used for chat widget rendering and video dropdowns\n     */\n    haveAccess: Ember.computed(function () {\n        return true;\n    }),\n\n    isActive: Ember.computed('id', 'mediaProviders.activeProvider', function () {\n        const active = this.get('mediaProviders.activeProvider');\n        return active && active.get('id') === this.get('id');\n    }),\n\n    notification: Ember.computed(function () {\n        return null;\n    }),\n\n    // Internal API below\n\n    /**\n     * Check if we can run an action based on current provider state\n     * For example, you cannot join a second video call while on video\n     */\n    canRunAction(options) {\n        if (this.type !== 'video') {\n            return true;\n        }\n\n        if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n            if (options.allowMultipleMeetings) {\n                return true;\n            }\n            this.logger.warn('Media Provider: Cannot run video action while on video', {\n                provider: this\n            });\n            return false;\n        } else if (this.get('application.isPopout')) {\n            this.logger.warn('Media Provider: Cannot run video action while in popout', {\n                provider: this\n            });\n            return false;\n        }\n\n        return true;\n    },\n\n    /**\n     * Grabs the jid for a user or room. Method is used in the purecloud, teams, and zoom provider\n     * classes.\n     * @param {*} options\n     * @returns string (jid) or undefined\n     */\n    getJid(options) {\n        let user = this.get('user');\n        if (!user && options) {\n            user = options.user;\n        }\n        let jid;\n        if (user) {\n            // user could be different types of entities, so access jid both ways\n            jid = user.get('chat.jabberId') || user.get('jid');\n        } else if (this.get('room')) {\n            jid = this.get('room.jid');\n        }\n        return jid;\n    },\n\n    init() {\n        this._super(...arguments);\n\n        const originalAction = this.action;\n        this.action = async function action(options = {}) {\n            const _options = Object.assign(options, {\n                user: this.get('user')\n            });\n\n            if (!this.canRunAction(options) && this.showRunErrorNotification) {\n                this.showRunErrorNotification(options);\n                return;\n            }\n\n            if (this.get('haveEmbeddedClientAccess')) {\n                this.get('mediaProviders').set('activeProvider', this);\n            }\n            try {\n                await originalAction.apply(this, [_options]);\n            } catch (err) {\n                this.get('mediaProviders').set('activeProvider', null);\n                this.logger.error('Media Provider: Error running video action', {\n                    err,\n                    provider: this.get('id')\n                });\n            }\n        }.bind(this);\n    }\n});\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport const PROVIDER_ID = 'purecloud';\n\nexport default Provider.extend({\n    intl: Ember.inject.service(),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    application: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: PROVIDER_ID,\n    data: {},\n    type: 'video',\n    component: 'webrtc-panel',\n\n    init() {\n        this._super(...arguments);\n\n        this.get('webrtc.activeRoom.showingVideo');\n    },\n\n    launchVideoImage: Ember.computed('application.urlprefix', function () {\n        return `${this.get('application.urlprefix')}assets/images/svg/Genesys_Cloud-Expanded-landscape-color.svg`;\n    }),\n\n    haveAccess: Ember.computed('user.profile.content', 'room', 'webrtc.videoCallCapable', function () {\n        if (!this.get('webrtc.videoCallCapable')) {\n            return false;\n        }\n\n        let user = this.get('room.oneToOneTarget') || this.get('user.profile.content');\n        if (!user) {\n            // GC video should just generally always be available\n            return true;\n        }\n\n        return !user.get('isOffline');\n    }),\n\n    action(options) {\n        let jid = this.getJid(options);\n        this.get('application').openChatRoomWithVideo(jid, false);\n    },\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.purecloud.label').toString();\n    }),\n\n    showingVideoChanged: Ember.observer('webrtc.activeRoom.showingVideo', function () {\n        if (!this.get('webrtc.activeRoom.showingVideo') && this.get('isActive')) {\n            this.set('mediaProviders.activeProvider', null);\n        }\n    })\n});\n","import Ember from 'ember';\nimport LoggerMixin from '../mixins/logger';\nimport Provider from './provider';\n\nexport default Provider.extend(LoggerMixin, {\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    /**\n     * Teams provider id.\n     * Will be used in chat service's sendVideoProviderNotification method. 'id' will\n     * be the stanza name which will render the teams-notification component for Teams in ember-chat-components.\n     */\n    id: 'teams',\n    type: 'video',\n    /**\n     * web-directory component that will render the Teams client app in an iframe that we will use\n     * for communicating from web-directory -> Teams client app. Will allow us to create Teams meetings\n     * from '/teams' command and the media-providers/video-dropdown component. This component is rendered\n     * in the video-panel\n     */\n    component: 'teams-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\n\n    /**\n     * Provider launch image. Would be rendered in webrtc panel.\n     * Note: we are not currently supporting 3rd Party embedded video, therefore, this\n     * property is not technically needed but may be required in the future.\n     */\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/msteams-integration/msteams-icon.png';\n    }),\n\n    /**\n     * Provider label\n     */\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.teams.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    /**\n     * This is remnant from Zoom provider. Leaving it here and defaulting as false as we\n     * may implement a MS Teams Meeting embedded within Genesys Cloud.\n     */\n    haveEmbeddedClientAccess: false,\n\n    /**\n     * Data is used in chat service's sendVideoProviderNotification method to build stanza.\n     * This is set during runtime.\n     */\n    data: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.teams.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","export function queryParamsToObject(params) {\n    if (!params) {\n        return {};\n    }\n\n    return params.split('&').reduce((acc, param) => {\n        let keyValue = param.split('=');\n        if (keyValue.length === 2) {\n            let [key, value] = keyValue;\n            acc[key] = value;\n        }\n        return acc;\n    }, {});\n}\n\nexport function buildAuthUrl(baseUrl, authConfig) {\n    let query = Object.keys(authConfig)\n        .map(key => {\n            let value = authConfig[key];\n            return `${key}=${value}`;\n        })\n        .join('&');\n    return `${baseUrl}?${query}`;\n}\n\nexport function performIframeAuth(authUrl, authConfig) {\n    return new Promise((resolve, reject) => {\n        let url = buildAuthUrl(authUrl, authConfig);\n\n        let iframe = document.createElement('iframe');\n        iframe.style = 'height:0;width:0;position:absolute;z-index:0';\n        iframe.src = url;\n        document.body.appendChild(iframe);\n\n        let timer, cancelTimer;\n\n        timer = setInterval(function () {\n            try {\n                if (iframe) {\n                    let hash = iframe.contentWindow.location.hash;\n                    let search = iframe.contentWindow.location.search;\n                    if (hash) {\n                        let params = queryParamsToObject(hash.substring(1));\n                        let accessToken = params['access_token'];\n                        if (accessToken) {\n                            document.body.removeChild(iframe);\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            resolve(accessToken);\n                        }\n                    }\n                    if (search) {\n                        let params = queryParamsToObject(search.substring(1));\n                        let code = params['code'];\n                        if (code) {\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            document.body.removeChild(iframe);\n                            resolve(code);\n                        }\n                    }\n                }\n            } catch (e) {\n                // Ignore for now\n            }\n        }, 20);\n\n        // After 5 seconds, if we havent resolved, exit\n        // A properly authed client shouldnt take long on the redirect\n        cancelTimer = setTimeout(function () {\n            window.clearTimeout(cancelTimer);\n            window.clearInterval(timer);\n            reject(new Error('Timeout'));\n        }, 5000);\n    });\n}\n","import Ember from 'ember';\nimport Provider from './provider';\n\nexport default Provider.extend({\n    apps: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    mediaProviders: Ember.inject.service(),\n\n    id: 'zoom',\n    type: 'video',\n    component: 'zoom-panel',\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    launchVideoImage: Ember.computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/zoom-integration/zoom-lg.png';\n    }),\n\n    label: Ember.computed(function () {\n        return this.get('intl').t('mediaProviders.zoom.label').toString();\n    }),\n\n    profile: Ember.computed(\n        'user.profile.content',\n        'user.profile.content.preferences.preferences.@each.value',\n        function () {\n            return this.get('user.profile.content');\n        }\n    ),\n\n    haveAccess: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    useCollaborateChat: Ember.computed.readOnly('session.useCollaborateChat'),\n\n    haveEmbeddedClientAccess: false,\n\n    // Data is used by the chat widget sender to build stanza\n    // This is set during runtime\n    data: Ember.computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: Ember.computed('data', function () {\n        let key = 'mediaProviders.zoom.defaultNotification';\n        return this.get('intl')\n            .t(key, { meetingUrl: this.get('data.url') })\n            .toString();\n    })\n});\n","import Ember from 'ember';\nimport netUtils from 'ember-purecloud-components/utils/net';\n\nconst { inject } = Ember;\nconst INTERNAL_DL_MATCHER = /\\/api\\/v[12]\\/downloads\\/([\\w-+]+).*$/i;\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n\n    embeddedUrl: function (imageUrl) {\n        const url = imageUrl;\n        const isLocal = this.get('application.runtime.local');\n\n        if (!url || isLocal) {\n            return url;\n        }\n\n        try {\n            // Only transform internal PC urls\n            if (!netUtils.isExternalDomain(url)) {\n                const matches = INTERNAL_DL_MATCHER.exec(url);\n                if (matches && matches[1]) {\n                    const id = matches[1];\n                    return `${this.get('application').pcV2Uri([\n                        'api/v2/apps/downloads',\n                        id\n                    ])}?contentDisposition=INLINE`;\n                }\n            }\n        } catch (error) {\n            // Failed to check URL, returning unmodified url below\n            this.get('logger').info(`ACD embeddedUrl`, {\n                error,\n                imageUrl: url\n            });\n            return url;\n        }\n        return url;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'connections-ui/utils/dates';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    personGuid: Ember.computed.reads('session.person.guid'),\n\n    // TODO: Ultimately, we need to store these values somewhere other\n    // than the model. We may introduce a persistance service that will\n    // allow us to store interaction properties by id and persist them\n    // back to the public API via the preference API.\n    modelSet(model, property, value) {\n        if (model && !Ember.get(model, 'isDestroyed') && !Ember.get(model, 'isDestroying')) {\n            model.set(property, value);\n        }\n    },\n\n    _displayApiError(error, fallbackMessageKey) {\n        const code = _.get(error, 'responseJSON.code');\n        const key = code && `error.${code}`;\n        this._displayError(key && this.get('intl').exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey, messageKeyOption) {\n        const message = this.get('intl').t(messageKey, messageKeyOption).toString();\n        this.get('notification').error(null, message, {});\n    },\n\n    _displayNotification(titleKey, messageKey) {\n        let title = null;\n        let message = null;\n\n        if (titleKey) {\n            title = this.get('intl').t(titleKey).toString();\n        }\n\n        if (messageKey) {\n            message = this.get('intl').t(messageKey).toString();\n        }\n\n        this.get('notification').info(title, message);\n    },\n\n    _isInDOM() {\n        const isDestroyed =\n            this.get('isDestroyed') ||\n            this.get('isDestroying') ||\n            !this.get('interaction') ||\n            this.get('interaction.isDestroyed') ||\n            this.get('interaction.isDestroying');\n\n        if (isDestroyed) {\n            return false;\n        } else if (this.get('interaction.isCall')) {\n            const conversation = this.get('interaction.conversation');\n            const conversationIsDestroyed =\n                !conversation || conversation.get('isDestroying') || conversation.get('isDestroyed');\n            if (conversationIsDestroyed) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    getInteractionTypeFromCP(interaction) {\n        let type = {\n            isCall: false,\n            isFax: false,\n            isChat: false,\n            isEmail: false,\n            isCallback: false,\n            isSms: false\n        };\n        const myselfAgent = _.findLast(interaction.participants, party => {\n            let partyIsUser = _.has(party, 'userId') ? party.userId === this.get('personGuid') : false;\n            let partyIsAgent = _.has(party, 'purpose') ? party.purpose.toLowerCase() === 'agent' : false;\n            return partyIsUser && partyIsAgent;\n        });\n        type.isCallback = myselfAgent ? _.has(myselfAgent, 'callbacks') && myselfAgent.callbacks.length : false;\n        type.isCall = _.some(interaction.participants, party => !_.isEmpty(party.calls));\n        type.isFax = _.some(interaction.participants, party =>\n            _.has(party, 'purpose') ? party.purpose === 'fax' : false\n        );\n        type.isChat = _.some(interaction.participants, party => !_.isEmpty(party.chats));\n        type.isEmail = _.some(interaction.participants, party => !_.isEmpty(party.emails));\n        type.isSms = _.some(interaction.participants, party => !_.isEmpty(party.messages));\n\n        return type;\n    },\n\n    handleMissedTimedBoxTimer(ctx, payload, Interaction, conversationModel) {\n        try {\n            const tmpInteractionModel = Interaction.create(payload, Ember.getOwner(ctx).ownerInjection());\n\n            if (tmpInteractionModel && conversationModel) {\n                Ember.set(tmpInteractionModel, 'conversation', conversationModel);\n            }\n\n            const interactionHasMissedTimer = Ember.get(tmpInteractionModel, 'hasMissedTimer');\n\n            if (tmpInteractionModel && interactionHasMissedTimer) {\n                const titleKey = 'purecloud.acdInteraction.aftercallworkTitleMessage';\n                const messageKey = 'purecloud.acdInteraction.aftercallworkTimerExpiredBodyMessage';\n                this._displayNotification(titleKey, messageKey);\n            }\n            if (tmpInteractionModel) {\n                Ember.run.later(() => {\n                    tmpInteractionModel.destroy();\n                });\n            }\n        } catch (error) {\n            this.logger.info('ACD: handleMissedBoxTimer error', { error });\n        }\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return document.hasFocus();\n        }\n    },\n\n    timeDiff(timeCreated) {\n        const diff = moment().diff(timeCreated);\n        if (diff < 500) {\n            this.logger.info('ACD: interaction create destroy diff', { diff });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Mixin.create({\n    notes: null,\n    selectedWrapupCode: null,\n    wrapupNotSaved: true,\n    oldWrapupCode: null,\n    skipAfterCallWork: false,\n    isAfterCallWorkTimerExpired: false,\n\n    isWrapupCodeSet: computed.notEmpty('selectedWrapupCode'),\n    isNotesSet: computed.notEmpty('notes'),\n    activeCallWorkCompleted: computed.reads('participantForCurrentUser.wrapup.code'),\n\n    activeCallWorkNeeded: computed('activeCallWorkCompleted', 'participantForCurrentUser.wrapupRequired', function () {\n        return !this.get('activeCallWorkCompleted') && this.get('participantForCurrentUser.wrapupRequired');\n    }),\n\n    canUseCommunicationACW: false,\n\n    canAgentRequestACW: computed.and('canUseCommunicationACW', 'useCommunicationACW', 'isWrapupPromptAgentRequested'),\n\n    useCommunicationACW: computed('canUseCommunicationACW', 'isWrapupPromptAgentRequested', function () {\n        if (this.get('canUseCommunicationACW') && this.get('isWrapupPromptAgentRequested')) {\n            return true;\n        }\n\n        return this.get('canUseCommunicationACW');\n    }),\n\n    isAfterCallWorkCompleted: computed(\n        'participantForCurrentUser.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'isCommunicationAfterCallWorkCompleted',\n        'useCommunicationACW',\n        function () {\n            if (this.get('useCommunicationACW')) {\n                return this.get('isCommunicationAfterCallWorkCompleted');\n            }\n\n            if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            } else if (this.get('participantForCurrentUser.wrapup') || this.get('skipAfterCallWork')) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    communicationMedia: computed(\n        'participantForCurrentUser.calls.firstObject.wrapup',\n        'participantForCurrentUser.chats.firstObject.wrapup',\n        'participantForCurrentUser.emails.firstObject.wrapup',\n        'participantForCurrentUser.messages.firstObject.wrapup',\n        'participantForCurrentUser.callbacks.firstObject.wrapup',\n        'isChat',\n        'isCall',\n        'isCallback',\n        'isEmail',\n        'isSms',\n        function () {\n            let communicationObj = null;\n            if (this.get('isCall')) {\n                communicationObj = this.get('participantForCurrentUser.calls.firstObject');\n            } else if (this.get('isChat')) {\n                communicationObj = this.get('participantForCurrentUser.chats.firstObject');\n            } else if (this.get('isEmail')) {\n                communicationObj = this.get('participantForCurrentUser.emails.firstObject');\n            } else if (this.get('isSms')) {\n                communicationObj = this.get('participantForCurrentUser.messages.firstObject');\n            } else if (this.get('isCallback')) {\n                communicationObj = this.get('participantForCurrentUser.callbacks.firstObject');\n            }\n            return communicationObj;\n        }\n    ),\n\n    isCommunicationAfterCallWorkCompleted: computed(\n        'communicationMedia.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'canAgentRequestACW',\n        function () {\n            if (this.get('canAgentRequestACW')) {\n                if (!this.get('communicationMedia.afterCallWorkRequired')) {\n                    return true;\n                }\n            } else if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            }\n\n            return !!this.get('communicationMedia.wrapup') || this.get('skipAfterCallWork');\n        }\n    ),\n\n    isCommunicationAfterCallWorkRequested: computed.bool('connectedCommunication.afterCallWorkRequired'),\n\n    isAfterCallWorkMandatory: computed(\n        'isCall',\n        'conversation.isAfterCallWorkMandatory',\n        'isCallback',\n        'participantForCurrentUser.wrapupPrompt',\n        'isNonDiscretionaryCompletion',\n        'canUseCommunicationACW',\n        'dialerPreview',\n        function () {\n            const wrapupPrompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n            if (this.get('isCallback')) {\n                return wrapupPrompt === 'mandatory' || this.get('dialerPreview');\n            } else if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkMandatory');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return wrapupPrompt === 'mandatory' || this.get('isNonDiscretionaryCompletion');\n                }\n                return wrapupPrompt === 'mandatory' || wrapupPrompt === 'timeout' || wrapupPrompt === 'forcedtimeout';\n            }\n        }\n    ),\n\n    isAfterCallWorkForcedTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkForcedTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkForcedTimeout');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isAfterCallWorkTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isAfterCallWorkTimeout');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'timeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed(\n        'isCall',\n        'conversation.isNonDiscretionaryCompletion',\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('isCall')) {\n                return this.get('conversation.isNonDiscretionaryCompletion');\n            } else {\n                if (this.get('canUseCommunicationACW')) {\n                    return (\n                        this.get('isAfterCallWorkForcedTimeout') ||\n                        this.get('isAfterCallWorkTimeout') ||\n                        this.get('isWrapupPromptAgentRequested')\n                    );\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isWrapupPromptAgentRequested: computed('participantForCurrentUser.wrapupPrompt', function () {\n        const wrapupPrompt = maybeLowerCase(this.get('participantForCurrentUser.wrapupPrompt'));\n        return wrapupPrompt === 'agentrequested';\n    }),\n\n    hasMissedTimer: computed('participantForCurrentUser.wrapup.code', 'isNonDiscretionaryCompletion', function () {\n        return (\n            this.get('participantForCurrentUser.wrapup.code') === 'ININ-WRAP-UP-TIMEOUT' &&\n            this.get('isNonDiscretionaryCompletion')\n        );\n    })\n});\n","import { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport { inject } from '@ember/service';\nimport findLast from 'lodash/findLast';\nimport last from 'lodash/last';\nimport reject from 'lodash/reject';\nimport { getTrueCustomerIfMultipleCustomersExist } from 'connections-ui/utils/acd';\n\nconst MACHINE_PARTICIPANTS = ['acd', 'ivr', 'dialer.system'];\n\nconst CUSTOMER_PARTICIPANTS = ['manual', 'inbound', 'dialer', 'customer', 'external'];\n\nconst MEDIA_TYPES = ['chats', 'calls', 'callbacks', 'emails', 'screenshares', 'cobrowsesessions', 'videos'];\n\nexport default Mixin.create({\n    session: inject('session'),\n\n    isCustomerParticipant(participant) {\n        return CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isMachineParticipant(participant) {\n        return MACHINE_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isAgentParticipant(participant) {\n        return participant.purpose === 'agent';\n    },\n\n    isCurrentUserOrMachineParticipant(participant) {\n        return (\n            ((participant.purpose === 'user' || participant.purpose === 'agent') &&\n                participant.userId === this.get('participantForCurrentUser.userId')) ||\n            participant.userId === this.get('session.person.guid') ||\n            this.isMachineParticipant(participant)\n        );\n    },\n\n    /**\n     * Determines who the host participant should be based on the participant array order\n     * and if the participant is an agent and is also human and connected.\n     *\n     * Currently returning `null` to eliminate any role assumptions for participants.\n     * Keeping this around to expand upon when the backend implements participant roles\n     * for a conversation.\n     */\n    hostParticipant: computed('allHumanConnectedParticipants.[]', function () {\n        return null;\n\n        // TODO: Update when the backend provides the participant roles\n        // const participants = this.get('allHumanConnectedParticipants') || [];\n        // for (const participant of participants) {\n        //     const isAgent = participant.purpose === 'agent';\n        //     if (isAgent) {\n        //         return participant;\n        //     }\n        // }\n    }),\n\n    // Human Participants with purpose 'manual', 'inbound', 'dialer', 'customer', or 'external\n    customerParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => this.isCustomerParticipant(participant));\n    }),\n\n    agentParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => this.isAgentParticipant(participant));\n    }),\n\n    // Human participants that are not the current user\n    otherParticipants: computed('participants.@each.{purpose,userId}', function () {\n        return reject(this.get('participants'), participant => {\n            return this.isCurrentUserOrMachineParticipant(participant);\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    otherConnectedParticipants: computed('otherParticipants.@each.endTime', function () {\n        return reject(this.get('otherParticipants'), participant => {\n            // Reject participant if disconnected or a monitoring\n            // participant and not a customer.\n            const isDisconnected = !!participant.endTime;\n\n            // TODO: The public api will eventually filter these out.\n            // This can be removed when that is done.\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            const isBarged = !!participant.bargedParticipantId;\n\n            return isDisconnected || isMonitored || isCoached || isBarged;\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    allHumanConnectedParticipants: computed('participants.@each.{purpose,userId,endTime}', function () {\n        return reject(this.get('participants'), participant => {\n            const isDisconnected = !!participant.endTime;\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            return isDisconnected || isMonitored || isCoached || this.isMachineParticipant(participant);\n        });\n    }),\n\n    /**\n     * All participants that should be showing up in a potential conference.\n     * Note that the participant that is being connecting should not show up if they are being connected\n     * through and queue that is also connected.\n     */\n    allConferenceParticipants: computed(\n        'participants.[]',\n        'participants.@each.{purpose,userId,endTime,queueId,coachedParticipantId,monitoredParticipantId}',\n        function () {\n            const participants = this.get('participants') || [];\n            const connectingQueue = new Map();\n            return participants.filter(participant => {\n                if (this.isMachineParticipant(participant)) {\n                    // Filter out any callback typed machine participants\n                    if (participant['callbacks']) {\n                        return false;\n                    } else if (participant.endTime) {\n                        connectingQueue.delete(participant.queueId);\n                    } else if (!connectingQueue.has(participant.queueId)) {\n                        connectingQueue.set(participant.queueId, participant);\n                        return true;\n                    }\n                }\n\n                if (participant.endTime || participant.monitoredParticipantId || participant.coachedParticipantId) {\n                    return false;\n                } else if (connectingQueue.has(participant.queueId)) {\n                    return false;\n                }\n\n                return true;\n            });\n        }\n    ),\n\n    participantForCustomer: computed(\n        'participants.@each.{purpose,userId,endTime,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        'session.person.guid',\n        'onConsult',\n        'consultParticipant',\n        'otherConnectedParticipants.[]',\n        'isDisconnected',\n        'isTerminated',\n        'isCall',\n        function () {\n            const consultParticipantId = this.get('consultParticipantId');\n            if (consultParticipantId) {\n                const participants = this.get('participants') || [];\n                const trueCustomerParticipant = participants.findBy('id', consultParticipantId);\n                if (trueCustomerParticipant) {\n                    return trueCustomerParticipant;\n                }\n            }\n\n            if (this.get('onConsult') && this.get('consultParticipant')) {\n                return this.get('consultParticipant');\n            }\n\n            let participantCaller = null;\n\n            const customer = findLast(this.get('participants'), participant => {\n                const isCurrentUser = this.get('session.person.guid') === participant.userId;\n\n                /**\n                 * Solely used for determining the edge-case of a queue calling a queue.\n                 * We do not want to return the current user\n                 */\n                // TODO: Remove the `else if` portion of this statement when the `if` feature toggle is removed.\n                if (!isCurrentUser) {\n                    if (\n                        (this.get('session.features.interactionNameQueueCallingQueue') &&\n                            participant.purpose === 'acd' &&\n                            get(participant, 'calls.firstObject.direction') === 'inbound') ||\n                        (participant.purpose === 'agent' &&\n                            get(participant, 'calls.firstObject.direction') === 'outbound')\n                    ) {\n                        participantCaller = participant;\n                    }\n                }\n\n                const isExternalCustomer = CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n                const isInternalCustomer = !isCurrentUser && participant.purpose === 'user';\n\n                return (\n                    !participant.monitoredParticipantId &&\n                    !participant.coachedParticipantId &&\n                    !participant.bargedParticipantId &&\n                    (isExternalCustomer || isInternalCustomer)\n                );\n            });\n\n            if (customer && customer.endTime) {\n                const nextConnectedParticipant = this.get('otherConnectedParticipants.firstObject');\n                const isDisconnected = this.get('isDisconnected') || this.get('isTerminated');\n\n                if (nextConnectedParticipant && !isDisconnected) {\n                    return nextConnectedParticipant;\n                }\n            }\n\n            /**\n             * If we still don't have a customer at this point\n             * then consider the scenario where this may be an agent\n             * calling a queue on behalf of a queue so we are identifying\n             * the caller as the `customer`\n             */\n            if (!customer && this.get('isCall') && participantCaller) {\n                return participantCaller;\n            }\n\n            if (customer) {\n                /**\n                 * if there are multiple customers in the participants list the customer returned above is likely incorrect\n                 * if it is not a user participant. In that case the getTrueCustomerIfMultipleCustomersExist will return the\n                 * last connected true customer participant - if there is only one customer participant - getTrueCustomerIfMultipleCustomersExist\n                 * returns nothing and the value of customer falls through\n                 */\n                const customerParticipant = getTrueCustomerIfMultipleCustomersExist(this);\n                if (customer.purpose !== 'user' && customerParticipant) {\n                    return customerParticipant;\n                }\n            }\n\n            return customer;\n        }\n    ),\n\n    /**\n     * Returns all of the active participants. Active is described as trying to connect or connected.\n     * It does not include any participants who have an endTime.\n     * The id's returned supported external, user, or queue with a regular `id` fallback.\n     *\n     * [ACE-3276] If an incoming customer who is not associated with an external contact yet may not have\n     * any other form of id other than the base `id` or `queueId` it came from.\n     */\n    activeParticipantIds: computed('participants.[]', function () {\n        const participants = this.get('participants') || [];\n        return participants.reduce((filtered, participant) => {\n            const { endTime, externalContactId, userId, queueId, id, purpose } = participant;\n            if (!endTime) {\n                if (['agent', 'user'].includes(purpose) && userId) {\n                    filtered.push(userId);\n                } else if (['acd'].includes(purpose) && queueId) {\n                    filtered.push(queueId);\n                } else if (CUSTOMER_PARTICIPANTS.includes(purpose) && externalContactId) {\n                    filtered.push(externalContactId);\n                } else {\n                    filtered.push(id);\n                }\n            }\n            return filtered;\n        }, []);\n    }),\n\n    participantsForCurrentUser: computed('participants.@each.{purpose,userId}', 'session.person.guid', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => {\n            const purpose = participant.purpose;\n            const participantUserId = participant.userId;\n            const userId = this.get('session.person.guid');\n            return userId === participantUserId && (purpose === 'user' || purpose === 'agent');\n        });\n    }),\n\n    getFirstStuckParticipant: function () {\n        const currentUserParticipants = this.get('participantsForCurrentUser');\n\n        const stuckParticipant = currentUserParticipants.find(participant => {\n            const hasActivePrimary = this._doesParticipantHaveActivePrimaryMedia(participant);\n            const hasActiveSessionShare = this._doesParticipantHaveActiveSessionShare(participant);\n            return !hasActivePrimary && hasActiveSessionShare;\n        });\n        return stuckParticipant;\n    },\n\n    participantForCurrentUser: computed('participantsForCurrentUser.@each.wrapup', function () {\n        const currentUserParticipants = this.get('participantsForCurrentUser');\n\n        // alerting interactions\n\n        const lastAlertingParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return media.state.toLowerCase() === 'alerting';\n                    });\n                }\n            });\n        });\n\n        if (lastAlertingParticipant) {\n            return lastAlertingParticipant;\n        }\n\n        // non-disconnected interactions\n\n        const lastNonDisconnectedParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return (\n                            media.state.toLowerCase() !== 'disconnected' && media.state.toLowerCase() !== 'terminated'\n                        );\n                    });\n                }\n            });\n        });\n\n        if (lastNonDisconnectedParticipant) {\n            return lastNonDisconnectedParticipant;\n        }\n\n        // disconnected interactions\n\n        const lastCurrentUserNeedingWrapup = findLast(currentUserParticipants, participant => {\n            return participant.wrapupRequired && !participant.wrapup;\n        });\n\n        // If everyone has a wrapup code\n        if (!lastCurrentUserNeedingWrapup) {\n            return last(currentUserParticipants);\n        }\n\n        // If participant needs wrapup\n        // return lastCurrentUserNeedingWrapup;\n\n        // If we reach this point then this means that:\n        // 1) All agent participants have wrapped up and therefore should be disconnected\n        // 2) All agent participants have no active callbacks\n        // In this case we are (may be) dealing with a stuck interaction that conversation service still believes is active.\n\n        // Let's get the first participant for the agent with a stuck interaction\n        // TODO: confirm that first object is latest added by conversation service.\n        return lastCurrentUserNeedingWrapup || this.getFirstStuckParticipant();\n    }),\n\n    participantsForACD: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.filter(participant => participant.purpose === 'acd');\n    }),\n\n    participantForQueue: computed.alias('participantsForACD.lastObject'),\n\n    dialerParticipant: computed('participants.@each.purpose', function () {\n        const participants = this.get('participants') || [];\n        return participants.find(participant => participant.purpose === 'dialer');\n    }),\n\n    /**\n     * Iterates through the participants in reverse to find the last/newest participant that is\n     * considered either a machine or agent. Used to determine if the interaction is being transferred.\n     * The return breaks the for loop in this instance to it will only iterates as long as it needs to.\n     */\n    transferringToParticipant: computed('participants.[]', 'activeAttendedTransfer', function () {\n        const activeTransfer = this.get('activeAttendedTransfer');\n        const destination = activeTransfer ? activeTransfer.destination : null;\n        if (!destination) return null;\n\n        const participants = this.get('participants') || [];\n        // we want to look at the participants in reverse order to find newest reference\n        for (let i = participants.length - 1; i >= 0; i--) {\n            const participant = participants[i];\n            if (participant.userId === destination.userId) {\n                return participant;\n            }\n        }\n        // participant not found.\n        return null;\n    })\n});\n","import Ember from 'ember';\nimport { isRoomJid } from 'ember-purecloud-components/utils/jid-helpers';\nimport isEmpty from 'lodash/isEmpty';\nimport maxBy from 'lodash/maxBy';\nimport moment from 'connections-ui/utils/dates';\n\nconst { computed } = Ember;\n\nconst PROVIDER_MEDIATYPE = {\n    COBROWSE: 'PureCloud Co-browse',\n    SCREENSHARE: 'PureCloud WebRTC screen-share',\n    VIDEO: 'PureCloud WebRTC video'\n};\n\nfunction aggregateMedia(screenShares, cobrowsesessions, videos) {\n    // Ensure provider is identified in array items.\n    // This step could be skipped if backend does not remove provider info\n    (screenShares || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.SCREENSHARE;\n        }\n    });\n\n    (cobrowsesessions || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.COBROWSE;\n        }\n    });\n\n    (videos || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.VIDEO;\n        }\n    });\n\n    let allMedia = [];\n    if (screenShares) {\n        allMedia = allMedia.concat(screenShares);\n    }\n    if (cobrowsesessions) {\n        allMedia = allMedia.concat(cobrowsesessions);\n    }\n    if (videos) {\n        allMedia = allMedia.concat(videos);\n    }\n\n    return allMedia;\n}\n\nfunction getMediaObject(mediaArray) {\n    // This function identifies the current active media\n    // object from mediaArray mediaArray is expected to contain\n    // the secondary media types within a participant i.e screenShares,\n    // cobrowseSessions, videos etc.\n\n    // Get media with latest connected Time\n    const mediaWithlatestConnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.connectedTime) {\n            return moment(mediaObj.connectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get media with latest disconnected time\n    const mediaWithlatestDisconnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.disconnectedTime) {\n            return moment(mediaObj.disconnectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get latest active media\n    const maxConnectedTime = moment(\n        mediaWithlatestConnectedTime && mediaWithlatestConnectedTime.connectedTime\n            ? mediaWithlatestConnectedTime.connectedTime\n            : 0\n    );\n    const maxDisconnectedTime = moment(\n        mediaWithlatestDisconnectedTime && mediaWithlatestDisconnectedTime.disconnectedTime\n            ? mediaWithlatestDisconnectedTime.disconnectedTime\n            : 0\n    );\n\n    const activeMedia = maxConnectedTime.isAfter(maxDisconnectedTime)\n        ? mediaWithlatestConnectedTime\n        : mediaWithlatestDisconnectedTime;\n\n    return activeMedia;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    sessionShareCode: null,\n    isSessionCodeRequired: false,\n\n    isSessionSharing: false,\n    isRequestingEndSessionShare: false,\n\n    sessionShareDisconnectTimer: null,\n    sessionShareExplicitlyInitiated: false,\n    sessionShareActiveOnLoad: false,\n    isCobrowseV2Disconnected: false,\n    isCobrowseV2: false,\n\n    // feature toggles & permissions\n\n    canScreenShareOnCall: computed.and('isCall', 'permissions.canViewAcdScreenShare'),\n    canScreenShareOnChat: computed.and('isChat', 'permissions.canViewAcdScreenShare'),\n    canCobrowseOnCall: computed.and('isCall', 'permissions.canViewAcdCoBrowseForCall'),\n    canCobrowseOnChat: computed.and('isChat', 'permissions.canViewAcdCoBrowseForChat'),\n\n    // State\n\n    isRequestingScreenShareOrCoBrowse: false,\n    isRequestingVideo: false,\n\n    sessionShareState: computed.reads('mostRecentAgentSessionShare.state'),\n    customerShareState: computed.reads('mostRecentCustomerSessionShare.state'),\n    hasSessionShareCode: computed.notEmpty('sessionShareCode'),\n    sessionShareActive: computed.or('isRequestingSessionShare', 'hasSessionShareCode', 'isSessionSharing'),\n    isRequestingSessionShare: computed.or('isRequestingScreenShareOrCoBrowse', 'isRequestingVideo'),\n\n    isSessionShareConnected: computed('sessionShareState', 'isV2Provider', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    isSessionShareDisconnected: computed('sessionShareState', 'isRequestingNewSessionShare', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'disconnected' && !this.get('isRequestingNewSessionShare');\n    }),\n\n    isCustomerInSessionShare: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'connected';\n    }),\n\n    isCustomerDisconnectedFromSharedSession: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.get('customerShareState') || '';\n        return this.get('isSessionSharing') && state.toLowerCase() === 'disconnected';\n    }),\n\n    isAgentDisconnectedFromSharedSession: computed(\n        'sessionShareState',\n        'isSessionSharing',\n        'isRequestingNewSessionShare',\n        function () {\n            const state = this.get('sessionShareState') || '';\n            return (\n                this.get('isSessionSharing') &&\n                state.toLowerCase() === 'disconnected' &&\n                !this.get('isRequestingNewSessionShare')\n            );\n        }\n    ),\n\n    isWaitingForAgentToConnect: computed(\n        'isSessionShareConnected',\n        'isAgentDisconnectedFromSharedSession',\n        'sessionShareState',\n        'isV2Provider',\n        function () {\n            return !this.get('isSessionShareConnected') && !this.get('isAgentDisconnectedFromSharedSession');\n        }\n    ),\n\n    isWaitingForCustomerToConnect: computed(\n        'isSessionCodeRequired',\n        'isCustomerInSessionShare',\n        'isCustomerDisconnectedFromSharedSession',\n        'isV2Provider',\n        function () {\n            return (\n                this.get('isSessionCodeRequired') &&\n                !this.get('isCustomerInSessionShare') &&\n                !this.get('isCustomerDisconnectedFromSharedSession')\n            );\n        }\n    ),\n\n    hasCustomerJoinedSessionShareRoom: computed('customerShareState', function () {\n        const state = this.get('customerShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    hasAgentJoinedSessionShareRoom: computed('sessionShareState', function () {\n        const state = this.get('sessionShareState') || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    sessionShareRoomJid: computed('mostRecentCustomerSessionShare.context', function () {\n        const context = this.get('mostRecentCustomerSessionShare.context');\n        if (context && context.indexOf(':') >= 0) {\n            return context.substring(context.indexOf(':') + 1);\n        } else if (context && isRoomJid(context)) {\n            return context;\n        }\n        return null;\n    }),\n\n    // media objects\n\n    mostRecentAgentSessionShare: computed(\n        'participantForCurrentUser.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCurrentUser.screenShares') ||\n                this.get('participantForCurrentUser.screenshares');\n            let cobrowsesessions = this.get('participantForCurrentUser.cobrowsesessions');\n            let videos = this.get('participantForCurrentUser.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.get('logger').info('getMediaObject for agent', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    mostRecentCustomerSessionShare: computed(\n        'participantForCustomer.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCustomer.screenShares') || this.get('participantForCustomer.screenshares');\n            let cobrowsesessions = this.get('participantForCustomer.cobrowsesessions');\n            let videos = this.get('participantForCustomer.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.get('logger').info('getMediaObject for customer', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    // type\n\n    sessionShareType: computed('isScreenShare', 'isVideoShare', 'isCoBrowse', function () {\n        if (this.get('isScreenShare')) {\n            return 'screen-share';\n        } else if (this.get('isVideoShare')) {\n            return 'video';\n        } else if (this.get('isCoBrowse')) {\n            return 'co-browse';\n        }\n        return null;\n    }),\n\n    canScreenShare: computed.or('canScreenShareOnCall', 'canScreenShareOnChat'),\n    canCobrowse: computed.or('canCobrowseOnCall', 'canCobrowseOnChat'),\n\n    mediaTypeIsScreenShare: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.SCREENSHARE),\n    mediaTypeIsCobrowse: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.COBROWSE),\n    mediaTypeIsVideo: computed.equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.VIDEO),\n\n    isScreenShare: computed(\n        'isRequestingScreenShareOrCoBrowse',\n        'isRequestingVideo',\n        'canScreenShare',\n        'mediaTypeIsScreenShare',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse')) {\n                return true;\n            }\n\n            if (this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canScreenShare') && this.get('mediaTypeIsScreenShare');\n        }\n    ),\n\n    isCoBrowse: computed(\n        'isRequestingVideo',\n        'isRequestingScreenShareOrCoBrowse',\n        'mediaTypeIsCobrowse',\n        'canCobrowse',\n        function () {\n            if (this.get('isRequestingScreenShareOrCoBrowse') || this.get('isRequestingVideo')) {\n                return false;\n            }\n\n            return this.get('canCobrowse') && this.get('mediaTypeIsCobrowse');\n        }\n    ),\n\n    isVideoShare: computed('isRequestingVideo', 'isRequestingScreenShareOrCoBrowse', 'mediaTypeIsVideo', function () {\n        return this.get('isRequestingVideo') && !this.get('isRequestingScreenShareOrCoBrowse');\n    }),\n\n    // permission errors\n\n    hasScreenSharePermissionError: computed.or(\n        'hasCobrowsePermissionError',\n        'hasVideoPermissionError',\n        'hasShareError'\n    ),\n\n    hasCobrowsePermissionError: computed('mediaTypeIsCobrowse', 'canCobrowse', function () {\n        if (this.get('mediaTypeIsCobrowse') && !this.get('canCobrowse')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Co-Browse: Permissions or feature toggle missing to process acd co-browse events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasVideoPermissionError: computed('mediaTypeIsVideo', function () {\n        if (this.get('mediaTypeIsVideo')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Video: Permissions or feature toggle missing to process acd video events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasShareError: computed('mediaTypeIsScreenShare', 'canScreenShare', function () {\n        if (this.get('mediaTypeIsScreenShare') && !this.get('canScreenShare')) {\n            this.get('logger').error(\n                'ERROR: setSessionShareType: Screen-share: Permissions or feature toggle missing to process acd screen-share events.',\n                this.get('id')\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    // Timers\n\n    sessionShareConnectedTime: computed(\n        'mostRecentAgentSessionShare.connectedTime',\n        'participantForCurrentUser.connectedTime',\n        function () {\n            if (this.get('mostRecentAgentSessionShare.connectedTime')) {\n                return moment(this.get('mostRecentAgentSessionShare.connectedTime'));\n            } else if (this.get('participantForCurrentUser.connectedTime')) {\n                return moment(this.get('participantForCurrentUser.connectedTime'));\n            }\n            return moment();\n        }\n    ),\n\n    sessionShareDuration: computed('mostRecentAgentSessionShare.{disconnectedTime,connectedTime}', function () {\n        const connectedTime = this.get('mostRecentAgentSessionShare.connectedTime');\n        const endTime = this.get('mostRecentAgentSessionShare.disconnectedTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    _privacyStatement: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('chrome.privacyStatement');\n    }),\n\n    _securityDisclaimer: Ember.computed('applicationService.locale', function () {\n        return this.get('intl').t('signIn.securityDisclaimer');\n    })\n});\n","import Ember from 'ember';\nimport AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';\n\nexport default Ember.Mixin.create(AuthenticatedRouteMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive) {\n            // Authenticated by Simple Auth\n            result = Ember.RSVP.resolve(result).then(() => {\n                // Authorizing the route\n                if (!this.get('session.hasAppAccess')) {\n                    transition.abort();\n                    this.transitionTo('no-access');\n                    return Ember.RSVP.reject();\n                }\n\n                return true;\n            });\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\n\nconst BatchDataRequestsMixin = Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    getUser(id) {\n        return this.get('batchDataRequests').getUser(id);\n    },\n\n    refreshUser(id) {\n        return this.get('batchDataRequests').refreshUser(id);\n    },\n\n    getChatUser(jid) {\n        return this.get('batchDataRequests').getChatUser(jid);\n    },\n\n    getGroup(jid) {\n        return this.get('batchDataRequests').getGroup(jid);\n    }\n});\n\nexport default BatchDataRequestsMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ChatRoom from '../models/chat-room';\nimport {\n    getEntityObjectId,\n    isPersonJid,\n    isGroupJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP, getOwner } = Ember;\n\nexport default Ember.Mixin.create({\n    presenceSubscription: Ember.inject.service(),\n    batchDataRequests: Ember.inject.service(),\n\n    // this is set in chat service\n    useChatBetaCleanUp: false,\n\n    initRoomCaching: Ember.on('init', function () {\n        return this.set('rooms', Ember.Object.create());\n    }),\n\n    getChatRoom(jid) {\n        return new RSVP.Promise(resolve => {\n            const objectId = getEntityObjectId(jid);\n            let room = this.get(`rooms.${objectId}`);\n            if (room) {\n                if (this.get('useChatBetaCleanUp')) {\n                    const isGroupRoom = !isPersonJid(room.get('jid'));\n                    const passedInJidIsPerson = isPersonJid(jid) && !isSupervisorJid(jid);\n                    if (passedInJidIsPerson && isGroupRoom) {\n                        this.logger.debug(\n                            `<cache-chat-rooms-mixin> Found incorrect chat room with jid\n                            ${room.get('jid')}. Closing the room. Passed in jid is ${jid}`\n                        );\n                        // bad jid from early chat beta\n                        // need to leave the room so it will be deleted on realtime side\n                        this.closeActiveRoom(room);\n\n                        // create the correct 1-1 chat room and store in `rooms` dictionary\n                        const personRoom = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n                        Ember.set(this.rooms, objectId, personRoom, true);\n\n                        // shouldn't need to run this feature toggle check but to be safe\n                        if (this.get('useCollaborateChat')) {\n                            return resolve(this.setupRoomContextV2(personRoom));\n                        }\n                        return resolve(this.setupRoomContext(personRoom));\n                    }\n                }\n                return resolve(room);\n            }\n\n            room = ChatRoom.create({ jid, objectId }, getOwner(this).ownerInjection());\n            Ember.set(this.rooms, objectId, room, true);\n\n            return resolve(this.setupRoomContext(room));\n        });\n    },\n\n    setupRoomContext(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return Ember.RSVP.resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            return this.addChatTargetAsParticipant(room);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return Ember.RSVP.resolve(room);\n    },\n    setupRoomContextV2(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return Ember.RSVP.resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            room.set('oneToOneTarget', jid);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return Ember.RSVP.resolve(room);\n    },\n\n    addChatTargetAsParticipant(room) {\n        const jid = room.get('jid');\n        const user = this.get('session.person');\n        return this.get('batchDataRequests')\n            .getChatUser(jid)\n            .then(person => {\n                room.set('oneToOneTarget', person);\n                this.addParticipantToRoom(room, person);\n                this.addParticipantToRoom(room, user);\n                this.get('presenceSubscription').subscribeToPresence(person);\n                person.set('oneToOneRoom', room);\n                return room;\n            });\n    },\n\n    loadRoomSubject(room) {\n        if (room.isOneToOneRoom() || room.get('rawSubject')) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        const roomJid = room.get('jid');\n        return this.getStreamingRoomInfo(roomJid).then(({ subject }) => {\n            this.updateRoomSubject(room, subject);\n            return room;\n        });\n    },\n\n    addRoomToCache(room) {\n        const objectId = getEntityObjectId(room.jid);\n        Ember.set(this.rooms, objectId, room, true);\n    },\n\n    addAllParticipantsToRoom(room, participantJids) {\n        const cachedParticipants = room.get('participants');\n\n        _.forEach(cachedParticipants, cachedParticipant => {\n            const cachedParticipantJid = cachedParticipant && cachedParticipant.get('jid');\n            if (participantJids.indexOf(cachedParticipantJid) === -1) {\n                this.removeParticipantFromRoom(room, cachedParticipant);\n            } else {\n                participantJids.removeObject(cachedParticipantJid);\n            }\n        });\n\n        _.forEach(participantJids, jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    return this.addParticipantToRoom(room, person);\n                });\n        });\n    },\n\n    loadGroup(room) {\n        if (!room.isGroupRoom()) {\n            return Ember.RSVP.resolve(room);\n        }\n\n        return this.get('batchDataRequests')\n            .getGroup(room.get('objectId'))\n            .then(group => {\n                room.set('group', group);\n                if (group && _.isEmpty(group.get('name'))) {\n                    this.loadRoomSubject(room);\n                }\n                return room;\n            });\n    }\n});\n","define(\"connections-ui/mixins/change-serializer\", [\"exports\", \"ember-data-change-tracker/mixins/keep-only-changed\"], function (_exports, _keepOnlyChanged) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _keepOnlyChanged.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport GithubItemModel from '../models/github-item';\n\nconst { computed, generateGuid } = Ember;\n\nconst imageRegex = /\\.(jpe?g|gifv?|png)(\\?.*)?(#.*)?$/i;\nconst timeStampRegex = /(\\d+h)?(\\d+m)?(\\d+s)?$/i;\n\nconst audioRegex = /\\.(mp3|aac|wav)(\\?.*)?(#.*)?$/i;\n\n/*\nhttps://media4.giphy.com/media/R06WhFXLF1Fmw/200w.gif\nhttp://i.giphy.com/R06WhFXLF1Fmw.gif\nhttp://giphy.com/embed/R06WhFXLF1Fmw\nhttp://giphy.com/gifs/christmas-cat-R06WhFXLF1Fmw\nhttp://giphy.com/gifs/R06WhFXLF1Fmw\n*/\nconst giphyRegex = /^https?:\\/\\/.*?giphy\\.com\\/.*?([0-9a-z]{13,}).*?$/i;\nconst giphyIdIndex = 1;\n\nconst imgurRegex = /^(http:\\/\\/)?.{1}\\.imgur\\.com\\/([0-9a-z]{0,})\\..*$/i;\n\n// regex for identifying youtube links\n// adapted from http://stackoverflow.com/a/10315969\n// + revised to include additional timestamp param\nconst youtubeRegex =\n    /^(?:https?:\\/\\/)?(?:www\\.|gaming\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|))((\\w|-){11})(?:[&])?(?:t=)?([^&]+)?$/;\nconst youtubeIdIndex = 1; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst youtubeTimeStampIndex = 3;\n\n// adapted from http://stackoverflow.com/questions/13286785/get-video-id-from-vimeo-url\n// + revised to include additional timestamp param\nconst vimeoRegex =\n    /https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?|#)?(?:t=)?([^&]+)?$/i;\nconst vimeoIdIndex = 3; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst vimeoTimeStampIndex = 4;\n\nconst ghGistRegex = /http(?:s)?:\\/\\/gist.github\\.com\\/([a-zA-Z0-9_]+)\\/([a-zA-Z0-9]+)(?:\\.js)?/i;\nconst ghRepoRegex = /http(?:s)?:\\/\\/github\\.com\\/([a-zA-Z0-9_\\-.]+)\\/([a-zA-Z0-9\\-.]+)\\/?(?:\\/issues\\/[0-9]+)?$/i;\nconst twitterRegex = /http(?:s)?:\\/\\/(?:mobile.)?twitter\\.com\\/(?:#!\\/)?[a-zA-Z0-9_]+\\/status\\/([0-9]+)/i;\nconst googleSlidesRegex = /https?:\\/\\/docs.google.com\\/presentation\\/d\\/[a-zA-Z0-9_-]*\\//i;\nconst soundcloudRegex = /https?:\\/\\/soundcloud\\.com\\/(?!(stream|you)).+/i;\n\nfunction getImageShortName(url = '') {\n    const pattern = /([A-Z0-9_-]{1,}\\.(?:png|jpg|gif|jpeg))/i;\n    const match = pattern.exec(url);\n    if (match) {\n        return window.decodeURI(match.shift());\n    }\n    return window.decodeURI(url.split('/').pop());\n}\n\n// convert timestamp (1m30s) to parseable integer (90).\nfunction parseTimeStamp(timeStamp) {\n    if (timeStamp.indexOf('h') < 0 && timeStamp.indexOf('m') < 0 && timeStamp.indexOf('s') < 0) {\n        return parseInt(timeStamp);\n    }\n    timeStamp = timeStampRegex.exec(timeStamp);\n    timeStamp =\n        (timeStamp[1] ? parseInt(timeStamp[1]) * 360 : 0) +\n        (timeStamp[2] ? parseInt(timeStamp[2]) * 60 : 0) +\n        (timeStamp[3] ? parseInt(timeStamp[3]) : 0);\n    return timeStamp;\n}\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n\n    mediaItems: computed('images', 'videos', 'gists', 'githubRepos', 'tweets', function () {\n        const images = this.get('images');\n        const videos = this.get('videos');\n        const giphies = this.get('giphies');\n        const audios = this.get('audios');\n        const gists = this.get('gists');\n        const repos = this.get('githubRepos');\n        const tweets = this.get('tweets');\n        const googleSlides = this.get('googleSlides');\n        const soundcloud = this.get('soundcloud');\n\n        return _.union(images, videos, giphies, gists, repos, tweets, googleSlides, soundcloud, audios).map(item => {\n            item.set(\n                'mediaRenderer',\n                'chat-panel/conversation/conversation-pane/messages/widgets/media-item/' + item.get('mediaType')\n            );\n            return item;\n        });\n    }),\n\n    getLinks() {\n        return this.get('links') || [];\n    },\n\n    /***********\n    exampleMediaType: computed('links', function () {\n        The 'links' property can sometimes be null/undefined, so use this.getLinks() to safely get a non-null array\n\n        map and filter links to match your media type\n        items are required have the following base properties:\n        {\n            mediaType,\n            title\n        }\n        other properties can be used to render the 'body' of the media\n    }),\n    ************/\n\n    images: computed('links', function () {\n        const links = _.filter(this.getLinks(), link => {\n            if (!link.match(imageRegex)) {\n                return false; // don't return any links not matching images\n            }\n            if (link.match(giphyRegex)) {\n                return false; // don't match giphy images here\n            }\n            if (link.startsWith('http://')) {\n                return link.match(imgurRegex); // if it's http, only return if it's imgur (can be upgraded to https)\n            }\n            return true; // all conditions met\n        });\n\n        return _.map(links, url => {\n            let gifv;\n            let match = imgurRegex.test(url);\n            if (url.endsWith('gifv')) {\n                gifv = {\n                    webm: url.replace('.gifv', '.webm'),\n                    mp4: url.replace('.gifv', '.mp4')\n                };\n            }\n            if (match) {\n                if (url.startsWith('http://')) {\n                    url = url.replace('http://', 'https://');\n                }\n            }\n            return Ember.Object.create({\n                mediaType: 'inline-image',\n                url,\n                gifv: gifv,\n                title: getImageShortName(url),\n                identifier: generateGuid(null, 'inline-image')\n            });\n        });\n    }),\n\n    videos: computed('links', function () {\n        const links = this.getLinks();\n\n        let youtubeLinks = links\n            .map(link => youtubeRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[youtubeIdIndex];\n                let timeStamp = match[youtubeTimeStampIndex]\n                    ? `?start=${parseTimeStamp(match[youtubeTimeStampIndex])}`\n                    : '';\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.youtube').toString(),\n                    id: id,\n                    videoUrl: `https://www.youtube.com/embed/${id}${timeStamp}`\n                });\n            });\n\n        let vimeoLinks = links\n            .map(link => vimeoRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[vimeoIdIndex];\n                let timeStamp = match[vimeoTimeStampIndex] ? `#t=${parseTimeStamp(match[vimeoTimeStampIndex])}` : '';\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.vimeo').toString(),\n                    id: id,\n                    videoUrl: `//player.vimeo.com/video/${id}${timeStamp}`\n                });\n            });\n\n        return _.union(youtubeLinks, vimeoLinks);\n    }),\n\n    giphies: computed('links', function () {\n        return this.getLinks()\n            .map(link => giphyRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                const id = match[giphyIdIndex];\n                return Ember.Object.create({\n                    mediaType: 'inline-video',\n                    title: this.get('intl').lookup('chat.inlineMedia.giphy').toString(),\n                    id,\n                    videoUrl: `https://giphy.com/embed/${id}?html5=true`\n                });\n            });\n    }),\n\n    gists: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghGistRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-gist',\n                        username: matches[1],\n                        url: `https://gist.github.com/${matches[1]}/${matches[2]}.json?callback=?`\n                    };\n\n                    Ember.setOwner(modelData, Ember.getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n                return undefined;\n            })\n            .filter(gist => !!gist);\n    }),\n\n    githubRepos: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghRepoRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-repo',\n                        username: matches[1],\n                        repo: matches[2],\n                        link: link,\n                        url: `https://api.github.com/repos/${matches[1]}/${matches[2]}`\n                    };\n\n                    Ember.setOwner(modelData, Ember.getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n\n                return undefined;\n            })\n            .filter(repo => !!repo);\n    }),\n\n    tweets: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = twitterRegex.exec(link);\n                if (matches && matches.length === 2) {\n                    return Ember.Object.create({\n                        mediaType: 'twitter-card',\n                        title: this.get('intl').lookup('chat.inlineMedia.tweet'),\n                        tweetId: matches[1],\n                        url: link,\n                        tweetInfo: null\n                    });\n                }\n                return undefined;\n            })\n            .filter(tweet => !!tweet);\n    }),\n\n    googleSlides: computed('links', function () {\n        return this.getLinks()\n            .map(link => googleSlidesRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return Ember.Object.create({\n                    mediaType: 'google-slides',\n                    title: this.get('intl').lookup('chat.inlineMedia.googleSlides').toString(),\n                    url: `${url}embed?start=false&loop=false&delayms=3000`\n                });\n            });\n    }),\n\n    soundcloud: computed('links', function () {\n        return this.getLinks()\n            .map(link => soundcloudRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return Ember.Object.create({\n                    mediaType: 'soundcloud',\n                    title: this.get('intl').lookup('chat.inlineMedia.soundcloud').toString(),\n                    url: url\n                });\n            });\n    }),\n\n    audios: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                return {\n                    match: !!audioRegex.exec(link),\n                    link\n                };\n            })\n            .filter(res => res.match)\n            .map(res => {\n                return Ember.Object.create({\n                    mediaType: 'inline-audio',\n                    title: this.get('intl').lookup('chat.inlineMedia.audio').toString(),\n                    url: res.link\n                });\n            });\n    })\n});\n","import Ember from 'ember';\nimport { displayDateRelativeToToday } from '../utils/dates';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nexport default Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    acdChatUser: Ember.computed.alias('room.acdCustomerParticipant'),\n\n    isYou: Ember.computed('chatUser.jid', 'session.person.jid', function () {\n        return compareJids(this.get('chatUser.jid'), this.get('session.person.jid'));\n    }),\n\n    isAcdChatUser: Ember.computed('chatUser.id', 'acdChatUser.id', function () {\n        const chatUserId = getEntityObjectId(this.get('chatUser.id'));\n        const acdChatUserId = getEntityObjectId(this.get('acdChatUser.id'));\n        return chatUserId === acdChatUserId;\n    }),\n\n    isLastMessage: Ember.computed('room.messages.lastObject.id', function () {\n        return this.get('id') === this.get('room.messages.lastObject.id');\n    }),\n\n    messageTime: Ember.computed('time', function () {\n        return displayDateRelativeToToday(this.get('time'), this.get('intl.isoLocale'));\n    }),\n\n    messageDisplay: Ember.computed('correction', function () {\n        const correction = this.get('correction');\n        if (correction) {\n            return correction;\n        } else {\n            return this;\n        }\n    }),\n\n    isCorrection: Ember.computed.bool('correction')\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst ChatEvents = Ember.Mixin.create(Ember.Evented, LoggerMixin, {\n    initialDataLoaded: false,\n    connected: false,\n    enabled: false,\n    historyDirty: false,\n    handleHiddenRooms: true,\n    hiddenRooms: {},\n    useChatSyncFix: false\n});\n\nexport default ChatEvents;\n","import Ember from 'ember';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst MessageNotificationsMixin = Ember.Mixin.create(LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    chat: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n\n    sendMentionNotification(room, person, message) {\n        // You shouldn't get a mention notification for yourself, which happens when sending a quote from another client\n        // like mobile\n        if (this.get('session.person.id') === person.get('id')) {\n            return;\n        }\n\n        if (this.shouldShowMentionNotification(room, message)) {\n            let roomName = room.getRawDisplaySubject();\n\n            const title = person.get('name');\n            const toastMessage = this.get('intl')\n                .lookup('notification.titles.chatMention', {\n                    roomName\n                })\n                .toString();\n            this.get('notification').info(title, toastMessage, {\n                icon: person.get('profilePicture.x128'),\n                tag: room.get('jid'),\n                hideAfter: 10,\n                soundId: 'chat',\n                shouldShowPopup: true,\n                shouldPlaySound: !this.get('preferences.chat.global.soundsMuted'),\n                target: this.get('applicationController'),\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendNotification(message) {\n        if (this.shouldShowNotification(message)) {\n            let showPopup =\n                this.get('preferences.notifications.global.showGroupNotifications') ||\n                message.get('room').isOneToOneRoom();\n            let playSound = showPopup && !this.get('preferences.chat.global.soundsMuted');\n            let title = this.getNotificationTitle(message.get('room'), message.get('chatUser'), message);\n            let messageBody, raw;\n\n            if (message.widgetType === 'video-notification') {\n                const messageKey = `chat.video.chatNotifications.${message.get('widget.data.type')}`;\n                const intl = this.get('intl');\n                if (intl.exists(messageKey)) {\n                    messageBody = this.get('intl').lookup(messageKey);\n                    raw = this.get('intl').t(messageKey);\n                } else {\n                    messageBody = message.get('messageBody');\n                    raw = message.get('raw');\n                }\n            } else {\n                messageBody = message.get('messageBody');\n                raw = message.get('raw');\n            }\n\n            this.get('notification').info(title, messageBody, {\n                icon: message.get('chatUser.profilePicture.x128'),\n                rawMessage: raw,\n                tag: message.get('room.jid'),\n                hideAfter: 8,\n                soundId: 'chat',\n                shouldShowPopup: showPopup,\n                shouldPlaySound: playSound,\n                target: this.get('applicationController'),\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendEngageNotification(message) {\n        let title = message.title;\n        let body = message.body;\n        let options = {\n            rawMessage: body,\n            hideAfter: message.hideAfter,\n            markdownToHtml: false,\n            shouldShowPopup: true,\n            shouldPlaySound: false,\n            clickHandler: message.clickHandler,\n            target: this.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n        };\n\n        if (message.severity === 'error') {\n            this.get('notification').error(title, body, options);\n        } else {\n            this.get('notification').info(title, body, options);\n        }\n    },\n\n    shouldShowNotification(message) {\n        let isBusyUser = this.get('session.person.presence') === 'busy' && !message.get('room').isOneToOneRoom();\n        let isDuplicate = false;\n        if (message.duplicate) {\n            isDuplicate = message.get('duplicate');\n        }\n\n        let messageAlreadySeen = !message.get('unread');\n        let fromLoggedInUser = compareJids(message.get('chatUser.jid'), this.get('session.person.jid'));\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let windowFocused = this.windowInFocus();\n        let isSupervisorRoom = false;\n        targetRoomIsMuted = this.roomMuted(message.get('room.jid'));\n        isSupervisorRoom = message.get('room.isSupervisorRoom');\n\n        // Negative cases that block notifications are checked first.\n        if (\n            isBusyUser ||\n            isDuplicate ||\n            messageAlreadySeen ||\n            fromLoggedInUser ||\n            roomIsVisible ||\n            targetRoomIsMuted ||\n            isSupervisorRoom\n        ) {\n            return false;\n        } else if (!roomIsVisible || !windowFocused) {\n            //Then positive cases that indicate a notification should be shown are checked.\n            return true;\n        }\n\n        // The final default is to not show a notification\n        return false;\n    },\n\n    shouldShowMentionNotification(room) {\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let groupNotificationsEnabled = false;\n        let coveredByMessageNotification = false;\n\n        targetRoomIsMuted = this.roomMuted(room.get('jid'));\n        groupNotificationsEnabled = this.get('preferences.notifications.global.showGroupNotifications');\n        coveredByMessageNotification = groupNotificationsEnabled && !targetRoomIsMuted;\n\n        // Don't show a notification if the message is on screen already or if the notification will be covered\n        // by the message notification\n        if (roomIsVisible || coveredByMessageNotification) {\n            return false;\n        }\n\n        // Unlike messages the default for a mention notification is true\n        return true;\n    },\n\n    getNotificationTitle(room, chatUser) {\n        if (room.isOneToOneRoom()) {\n            return chatUser.get('name');\n        } else {\n            let personName = chatUser.get('name');\n            let roomName = room.getRawDisplaySubject();\n            return this.get('intl')\n                .lookup('notification.titles.chatRoomMessage', {\n                    personName: personName,\n                    roomName: roomName\n                })\n                .toString();\n        }\n    },\n\n    sendTestNotification() {\n        let title = this.get('intl').lookup('notification.titles.testNotification').toString();\n        let message = this.get('intl').lookup('notification.titles.testText').toString();\n        this.get('notification').info(title, message, {\n            icon: this.get('session.person.profilePicture.x128'),\n            tag: 'test-message',\n            hideAfter: 8,\n            soundId: 'chat',\n            shouldShowPopup: true,\n            shouldPlaySound: true,\n            target: this.get('applicationController'),\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId(),\n            clickHandler: () => {}\n        });\n    },\n\n    getNotificationVolume() {\n        let volume = this.get('chat.chatNotificationVolume');\n        if (volume > 1) {\n            volume = volume / 100;\n        }\n        return volume;\n    },\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    }\n});\n\nexport default MessageNotificationsMixin;\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { markdownToHtml } from '../../utils/markdown';\nimport ChatMessage from '../../models/chat-message';\nimport { v4 as uuid } from 'uuid';\n\nexport default Ember.Mixin.create({\n    batchDataRequests: Ember.inject.service(),\n\n    messageDelayDefault: 200,\n    messageDelay: 200,\n    maxDelay: 25000,\n\n    _splitOverSizedMessage(message) {\n        //this regex pattern will try to split the message as close to 4000 characters as possible,\n        //if 4000 character falls on the middle of a word it will split before the word begins. If splitting\n        //isn't possible due to a long string of characters without a space it will just split at the 4,000\n        //character mark.\n        const pattern = /^(?:([\\s\\S]{1,4000}(?=[\\s]|$))|(?!([\\s\\S]{1,4000}(?=[\\s]|$)))[\\s\\S]{1,4000})/i;\n        var messageQueue = [];\n\n        while (message.length > 0) {\n            const result = pattern.exec(message);\n            messageQueue.push(result[0]);\n            message = message.slice(result[0].length);\n        }\n        return messageQueue;\n    },\n\n    _convertSplitMessagesToWidgets(room, messageQueue) {\n        const jid = room.get('jid');\n        const id = uuid();\n        let index = 0;\n\n        return messageQueue.map(message => {\n            const stanza = {\n                name: 'multipart-message',\n                contents: JSON.stringify({\n                    id: id,\n                    index: index++,\n                    messageCount: messageQueue.length\n                })\n            };\n            return {\n                to: jid,\n                body: message,\n                children: [stanza]\n            };\n        });\n    },\n\n    sendSplitMessageQueue(room, messageQueue) {\n        let deferred = Ember.RSVP.defer();\n        this._delayedMessageSender(room, deferred, messageQueue, null);\n        deferred.promise.catch(unsentMessageQueue => {\n            this._addFailedMessagesToRoom(room, unsentMessageQueue);\n            deferred.resolve(null);\n        });\n        return deferred.promise;\n    },\n\n    _addFailedMessagesToRoom(room, unsentMessageQueue) {\n        unsentMessageQueue.forEach(splitWidget => {\n            const jid = room.get('jid');\n            const owner = Ember.getOwner(this);\n            const stanza = this._manuallyCreateStanzaForFailedMessage(splitWidget);\n\n            let message = ChatMessage.create(\n                {\n                    from: this.get('session.person.jid'),\n                    oid: uuid(),\n                    time: moment(),\n                    stanza: stanza,\n                    links: [],\n                    raw: splitWidget.body,\n                    to: jid,\n                    widget: splitWidget,\n                    sendError: true\n                },\n                owner.ownerInjection()\n            );\n            message.set('messageBody', markdownToHtml(splitWidget.body));\n            this.checkForMentions(message);\n            this.get('batchDataRequests')\n                .getChatUser(message.get('from'))\n                .then(person => {\n                    message.set('chatUser', person);\n                    this.setMessageReadState(message);\n                    room.addMessage(message);\n                });\n        });\n    },\n\n    _manuallyCreateStanzaForFailedMessage(splitWidget) {\n        const childName = Ember.get(splitWidget, 'children.lastObject.name');\n        const childPayload = Ember.get(splitWidget, 'children.lastObject.contents');\n        return {\n            children: [\n                {\n                    name: childName,\n                    children: [childPayload]\n                }\n            ]\n        };\n    },\n\n    findMessageById(room, messageId) {\n        const messageCache = room.get('messageCache');\n        if (Object.prototype.hasOwnProperty.call(messageCache, messageId)) {\n            return messageCache.get(messageId);\n        }\n        return null;\n    },\n\n    _delayedMessageSender(room, deferred, messageQueue, pendingMessage) {\n        if (messageQueue.length === 0) {\n            deferred.resolve(null);\n            return;\n        }\n\n        if (this.get('messageDelay') >= this.get('maxDelay')) {\n            this.set('messageDelay', this.get('messageDelayDefault'));\n            let message = this.findMessageById(room, pendingMessage);\n            const splitWidget = messageQueue.shift();\n            message.setProperties({\n                sendError: true,\n                pending: false,\n                widget: splitWidget\n            });\n            deferred.reject(messageQueue);\n            return;\n        }\n\n        if (pendingMessage !== null) {\n            const failedMessage = messageQueue.get('firstObject');\n            const splitMessageData = JSON.parse(Ember.get(failedMessage, 'children.lastObject.contents'));\n            const splitMessageParent = room.get('splitMessageCache').get(splitMessageData.id);\n\n            if (splitMessageParent.get('messageArray.length') > 1) {\n                const message = this.findMessageById(room, pendingMessage);\n                splitMessageParent.get('messageArray').removeObject(message);\n            } else {\n                room.get('messages').removeObject(splitMessageParent);\n                const splitMessageCache = room.get('splitMessageCache');\n                delete splitMessageCache[splitMessageData.id];\n            }\n        }\n\n        this.sendMessageToRoom(room.get('jid'), null, messageQueue[0])\n            .then(() => {\n                messageQueue.shift();\n                this.set('messageDelay', this.get('messageDelayDefault'));\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    null,\n                    this.get('messageDelay')\n                );\n            })\n            .catch(messageId => {\n                this.set('messageDelay', this.get('messageDelay') * 2);\n                Ember.run.later(\n                    this,\n                    this._delayedMessageSender,\n                    room,\n                    deferred,\n                    messageQueue,\n                    messageId,\n                    this.get('messageDelay')\n                );\n                return Ember.RSVP.reject();\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { computed, inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    chatService: inject.service('chat'),\n    oneToOneRoom: null,\n\n    presenceSubscriptionCounter: 0,\n\n    jid: computed('contactInfo.chat', function () {\n        const chatField = this.getFieldValue('contactInfo.chat');\n        if (chatField) {\n            return Ember.get(chatField, 'value.jid');\n        }\n        return null;\n    }),\n\n    // Deprecated: Please use entity-presence mixin properties where possible.\n    presence: computed.reads('activityPresence'),\n    chatStatus: computed.reads('primaryStatusMessage'),\n    hasChatStatus: computed.notEmpty('chatStatus'),\n\n    // TODO: these hasMedia computeds should move \"up\" a layer to \"participant\" - a new model layer for persons in rooms\n    hasMedia: computed('mediaPresence', function () {\n        const mediaInfo = this.get('mediaPresence.media');\n        return !!_.find(mediaInfo, media => media.audio || media.video || media.listener);\n    }),\n\n    hasMediaInActiveChatRoom: computed('hasMedia', 'chatService.activeRoom', function () {\n        return this.get('mediaPresence.roomJid') === this.get('chatService.activeRoom.jid');\n    })\n});\n","import ClickOutsideMixin from 'ember-click-outside/mixins/click-outside';\nexport default ClickOutsideMixin;\n","define(\"connections-ui/mixins/conversation-analysis\", [\"exports\", \"ember-webrtc-components/mixins/webrtc-conversation-analysis\"], function (_exports, _webrtcConversationAnalysis) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversationAnalysis.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst BASE_URI_V2 = 'api/v2/conversations';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    session: inject.service(),\n    application: inject.service(),\n    acdNormalizedMessages: Ember.computed.bool('session.features.acdNormalizedMessages'),\n\n    pcUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri.apply(application, arguments);\n    },\n    baseUri: function () {\n        let application = this.get('application');\n        return application.pcV2Uri(BASE_URI_V2);\n    },\n    callsUri: function (id) {\n        return `${this.communicationUri(id, 'calls')}`;\n    },\n    createCommunicationUri: function (mediaType) {\n        return `${this.baseUri()}/${mediaType}`;\n    },\n    communicationUri: function (id, mediaType) {\n        return !_.isEmpty(mediaType) ? `${this.baseUri()}/${mediaType}/${id}` : `${this.baseUri()}/${id}`;\n    },\n    communicationsUri(id, participantId, mediaType, mediaId) {\n        return `${this.participantUri(id, participantId, mediaType)}/communications/${mediaId}`;\n    },\n    communicationsByTypeUri: function (mediaType) {\n        return this.baseUri() + '?communicationType=' + mediaType;\n    },\n    consultUri: function (id, participantId, mediaType, entity) {\n        if (this.get('session.features.acdTransferPermissions') && entity) {\n            entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n            return this.participantUri(id, participantId, mediaType) + '/consult' + `/${entity}`;\n        }\n        return this.participantUri(id, participantId, mediaType) + '/consult';\n    },\n    disconnectMediaTypeUri: function (id, mediaId, participantId, mediaType) {\n        const uri = `${BASE_URI_V2}/${mediaType}/${id}/participants/${participantId}/communications/${mediaId}`;\n        return this.get('application').pcV2Uri(uri);\n    },\n    getConversationUri: function (id) {\n        return this.communicationUri(id);\n    },\n    mediaRequestUri: function (id) {\n        return `${this.communicationUri(id, 'chats')}/mediarequests`;\n    },\n    monitorUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/monitor';\n    },\n    participantUri: function (id, participantId, mediaType) {\n        return this.participantsUri(id, mediaType) + participantId;\n    },\n    participantsUri: function (id, mediaType) {\n        return this.communicationUri(id, mediaType) + '/participants/';\n    },\n    participantDetailsUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/details';\n    },\n    participantWrapupUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapup';\n    },\n    sessionShareCodeUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/codes';\n    },\n    expireSessionShareCodeUri: function (id, participantId, securityKey) {\n        return this.participantUri(id, participantId) + '/codes/' + securityKey;\n    },\n    participantWrapupCodesUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapupcodes';\n    },\n    participantCommunicationWrapupUri: function (id, participantId, mediaType, communicationId) {\n        return this.participantUri(id, participantId, mediaType) + '/communications/' + communicationId + '/wrapup';\n    },\n    replaceUri: function (id, participantId, query, mediaType, entity) {\n        if (query) {\n            return this.participantUri(id, participantId, mediaType) + '/replace' + this.getQueryStr(query);\n        } else {\n            if (this.get('session.features.acdTransferPermissions') && entity) {\n                entity = entity.toLowerCase() === 'person' ? 'agent' : entity;\n                return this.participantUri(id, participantId, mediaType) + '/replace' + `/${entity}`;\n            }\n            return this.participantUri(id, participantId, mediaType) + '/replace';\n        }\n    },\n    scheduleCallbackUri: function (id, participantId) {\n        return `${this.participantUri(id, participantId)}/callbacks`;\n    },\n    tagsUri: function (id) {\n        //Are we using this?\n        return this.communicationUri(id) + '/tags';\n    },\n    wrapUpUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/wrapup';\n    },\n    wrapUpCodesUri: function (id) {\n        return this.communicationUri(id) + '/wrapupCodes';\n    },\n    messagesUri: function (id, mediaType) {\n        return `${this.communicationUri(id, mediaType)}/messages`;\n    },\n    sendChatMessageUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/messages`;\n    },\n    sendTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/typing`;\n    },\n    sendMessagingTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'messages')}/communications/${communicationId}/typing`;\n    },\n    draftUri: function (id, mediaType, query) {\n        if (query) {\n            return `${this.messagesUri(id, mediaType)}/draft${this.getQueryStr(query)}`;\n        } else {\n            return `${this.messagesUri(id, mediaType)}/draft`;\n        }\n    },\n    draftAttachmentUri: function (id, attachmentId, mediaType) {\n        return `${this.draftUri(id, mediaType)}/attachments/${attachmentId}`;\n    },\n    smsUri: function (id) {\n        return `${this.communicationUri(id, 'messages')}/messages`;\n    },\n    smsHistoryUri: function (id) {\n        return this.getConversationUri(id);\n    },\n    smsMessageDetailUri: function (id, messageId) {\n        // api/v2/conversations/messages/{conversationId}/messages/{messageId}/details\n        return `${this.smsUri(id)}/${messageId}/details/?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    smsMessageBatchUri: function (id) {\n        return `${this.smsUri(id)}/bulk?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    sendSMSMessageUri: function (id, communicationId) {\n        return `${this.communicationUri(\n            id,\n            'messages'\n        )}/communications/${communicationId}/messages?useNormalizedMessage=${this.get('acdNormalizedMessages')}`;\n    },\n    createMediaAttachmentUri: function (id, communicationId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media`;\n    },\n    getMediaAttachmentUri: function (id, communicationId, mediaId) {\n        return `${this.communicationUri(id, 'messages')}/communications/${communicationId}/messages/media/${mediaId}`;\n    },\n    copyMediaAttachmentUri: function (conversationId) {\n        // api/v2/conversations/emails/{conversationId}/messages/draft/attachments/copy\n        return `${this.communicationUri(conversationId, 'emails')}/messages/draft/attachments/copy`;\n    },\n    requestACWUri: function (interactionId, participantId, agentCommunicationId) {\n        // api/v2/conversations/aftercallwork/{conversationId}/participants/{participantId}/communications/{communicationId}\n        return `${this.communicationUri(\n            ''\n        )}aftercallwork/${interactionId}/participants/${participantId}/communications/${agentCommunicationId}`;\n    },\n    getSupportedContentUri: function (subType, id) {\n        return `${this.baseUri()}/messaging/integrations/${subType}/${id}?expand=supportedContent`;\n    },\n\n    getDeploymentConfigUri: function (deploymentId, getSupportedContent = false) {\n        if (getSupportedContent) {\n            return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?expand=supportedContent`;\n        }\n        return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?type=active`;\n    },\n\n    getIntegrationConfigUri: function (subMessageType, integrationId) {\n        return `${this.baseUri()}/messaging/integrations/${subMessageType}/${integrationId}?expand=messagingSetting`;\n    },\n\n    getConversationSummaryFeedbackUri: function (conversationId, summaryId) {\n        return `${this.baseUri()}/${conversationId}/summaries/${summaryId}/feedback`;\n    },\n\n    getQueryStr: function (parameters) {\n        var query = '';\n        var arrayParameterCollection = {};\n        var params;\n\n        if (parameters && !_.isEmpty(parameters)) {\n            // Get all parameters that are simple key-value pairs and where the value is\n            // NOT an array\n            params = _.reduce(\n                parameters,\n                function (result, value, key) {\n                    if (Array.isArray(parameters[key])) {\n                        arrayParameterCollection[key] = value;\n                    } else {\n                        result[key] = value;\n                    }\n\n                    return result;\n                },\n                {}\n            );\n\n            // serialize the parameters\n            query = '?' + $.param(params);\n\n            _.forIn(arrayParameterCollection, function (arr, key) {\n                // convert the array values into query parameters that will result in:\n                //   ?key=value1&key=value2&...\n                _.each(arr, function (item) {\n                    if (query === '?') {\n                        query += key + '=' + item;\n                    } else {\n                        query += '&' + key + '=' + item;\n                    }\n                });\n            });\n        }\n        return query;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    // TODO: Fill in this stub for answer a chat\n    // with code that will actually answer a chat.\n    answerChat: function (conversation) {\n        return Ember.RSVP.resolve(conversation);\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject } = Ember;\nconst { Promise } = Ember.RSVP;\n\nexport default Ember.Mixin.create(LoggerMixin, {\n    session: inject.service(),\n    ajax: inject.service(),\n\n    defaultLogLevel: 'debug',\n\n    /*\n     * Proxies AJAX requests as raw requests capturing\n     * response codes, correlations, etc. and loggin them\n     * out to SumoLogic automatically. Failed requests\n     * Promises will always resolved with the response,\n     * payload, and jqXHR object.\n     *\n     * @param {string} url - The request url path.\n     * @param {object} options - The request options.\n     * @param {string} type - The type of request to be made.\n     *\n     * @returns {Promise} Result of Ajax request\n     */\n    makeRequest(url, options = {}, type = 'get') {\n        const userId = this.get('session.person.guid');\n        const logger = this.logger;\n\n        if (type !== 'raw') {\n            options.method = (options.method || type).toUpperCase();\n            options.cache = false;\n        } else if (type === 'raw') {\n            options.method = (options.method || 'get').toUpperCase();\n        }\n\n        if (options.method && options.method.toLowerCase() !== 'get') {\n            options.dataType = options.dataType || 'json';\n        }\n\n        if (\n            options.data &&\n            options.dataType &&\n            options.dataType.toLowerCase() === 'json' &&\n            typeof options.data !== 'string' &&\n            options.method.toLowerCase() !== 'get'\n        ) {\n            options.contentType = 'application/json; charset=UTF-8';\n            options.data = JSON.stringify(options.data);\n        }\n\n        /*\n         * Logs the request at a specific log level\n         *\n         * @param {string} path - The request url path.\n         * @param {object} options - The request options.\n         * @param {object} payload - The response payload.\n         * @param {int} status - The response status code.\n         * @param {string} correlation - The correlation guid of the response.\n         * @param {strign} logLevel - The level to emit the log with.\n         */\n        const logRequest = (path, options, payload, status, correlation, logLevel) => {\n            const log = {\n                namespace: 'conversations',\n                message: 'User request',\n                path: path,\n                options: options,\n                response: { status, correlation },\n                user: userId\n            };\n\n            if (payload) {\n                log.response.payload = payload;\n            }\n\n            logger[logLevel]('Conversation Request:', { log });\n        };\n\n        /*\n         * Parses the response from the request to send to logRequest.\n         *\n         * @param {object} jqXHR - The jqXHR object.\n         * @param {object} payload - The response payload.\n         * @param {boolean} isError - Flag used to set appropriate log level.\n         */\n        const captureRequest = (request, isError) => {\n            const jqXHR = request.jqXHR;\n            const payload = request.payload;\n            if (jqXHR) {\n                const statusCode = jqXHR.status;\n                const correlationId = jqXHR.getResponseHeader('ININ-Correlation-id');\n                const logLevel = isError ? 'error' : this.get('defaultLogLevel');\n                logRequest(url, options, payload, statusCode, correlationId, logLevel);\n            }\n        };\n\n        /*\n         * Resolves a provies based on the response of a request.\n         *\n         * @param {object} response - Response from jqXHR request.\n         * @param {boolean} error - Flag use to resolve/reject promise.\n         *\n         * @returns {Promise} Promise resolve/rejecting jqXHR response.\n         */\n        const resolveRequest = (response, error) => {\n            const resolution = !!error ? 'reject' : 'resolve';\n            if (type === 'raw' || !!error) {\n                return Promise[resolution](response);\n            }\n            return Promise[resolution](response.response);\n        };\n\n        /*\n         * Determines if jqXHR response error is merely a parse error\n         * of an empty string returned by publicAPI.\n         *\n         * @param {response} - Response object from request.\n         */\n        const isSuccessResponse = response => {\n            if (response) {\n                const status = response.status || response.jqXHR.status;\n                if (status === 200 || status === 202) {\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        return this.get('ajax')\n            .raw(url, options)\n            .then(response => {\n                captureRequest(response);\n                return resolveRequest(response);\n            })\n            .catch(response => {\n                // Swallow errors if jQuery is just failing to\n                // parse an empty respone as a valid JSON object.\n                if (isSuccessResponse(response)) {\n                    captureRequest(response);\n                    return resolveRequest(response);\n                }\n                captureRequest(response, true);\n                return resolveRequest(response, true);\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport FieldConfig from '../field-config/field-config';\n\nconst { inject, Mixin } = Ember;\n\nfunction newPublicApiGroupData(name, type, vis) {\n    return {\n        name: name,\n        type: type.includes('groups.') ? type.split('.')[1] : type,\n        visibility: vis.toLowerCase(),\n        rulesVisible: true\n    };\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    notification: inject.service('notification-proxy'),\n    application: inject.service(),\n\n    groupName: null,\n    groupType: null,\n    groupVisibility: null,\n\n    groupTypeDefault: Ember.computed.reads('newGroupTypeChoices.0'),\n    groupVisibilityDefault: Ember.computed.reads('newGroupVisibilityChoices.0'),\n    groupMembershipDefault: Ember.computed.reads('newGroupMembershipChoices.0'),\n    groupModal: null,\n\n    nameLengthExceeded: false,\n\n    creatingGroup: false,\n\n    createGroup() {\n        const intl = this.get('intl');\n        var name = this.get('groupName');\n        var type = this.get('groupType');\n        var visibility = this.get('groupVisibility');\n\n        if (!type) {\n            type = this.get('groupTypeDefault.value');\n        }\n\n        if (!visibility) {\n            visibility = this.get('groupVisibilityDefault.value');\n        }\n\n        if (visibility.toLowerCase() === 'public') {\n            visibility = 'public';\n        } else if (visibility.toLowerCase() === 'members-only') {\n            visibility = 'members';\n        } else {\n            visibility = 'owners';\n        }\n\n        const data = newPublicApiGroupData(name, type, visibility);\n        const url = this.get('application').pcV2Uri('api/v2/groups');\n        const request = this.get('ajax').post(url, { data });\n\n        return request\n            .then(data => {\n                try {\n                    this.setProperties({\n                        groupName: null,\n                        groupType: null,\n                        groupVisibility: null\n                    });\n                } catch (err) {\n                    Ember.Logger.error('Failed to set properties to null', { error: err });\n                }\n\n                this.sendAction('cancel');\n\n                this.bubbleAction({\n                    action: 'transitionToRoute',\n                    actionContext: ['group.detail', data.id]\n                });\n            })\n            .catch(err => {\n                this.setProperties({\n                    groupName: null,\n                    groupType: null,\n                    groupVisibility: null\n                });\n\n                this.sendAction('cancel');\n\n                const error = Ember.get(err, 'errors.0.detail');\n                const title = intl.lookup('notification.group.errorTitle');\n                let message = intl.lookup('notification.group.createError');\n\n                if (Ember.get(error, 'payload.code') === 'DUPLICATE_VALUE') {\n                    message = intl.lookup('notification.group.duplicate');\n                }\n\n                this.get('notification').error(title, message, {\n                    hideAfter: 5,\n                    forceBrowserNotification: true\n                });\n\n                Ember.Logger.error('Error creating group:', { error: err });\n            });\n    },\n\n    canCreateGroup: Ember.computed('session.person.namedPermissions', 'session.person.isAdmin', function () {\n        var permissions = this.get('session.person.namedPermissions');\n        var isAdmin = this.get('session.person.isAdmin');\n\n        if (_.includes(permissions, 'admin') || isAdmin) {\n            return true;\n        }\n\n        var createGroup = _.includes(permissions, 'group_creation');\n        var adminGroup = _.includes(permissions, 'group_administration');\n\n        return createGroup || adminGroup;\n    }),\n\n    groupTypeI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('general.groupType.i18nLabel');\n    }),\n\n    newGroupTypeChoices: Ember.computed('intl.isoLocale', function () {\n        var types = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('groupTypes');\n\n        return types.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_general_groupType_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    }),\n\n    groupVisibilityI18nLabel: Ember.computed('intl.isoLocale', function () {\n        return FieldConfig.getFieldConfig('group', Ember.getOwner(this)).get('privacy.groupVisibility.i18nLabel');\n    }),\n\n    newGroupVisibilityChoices: Ember.computed('intl.isoLocale', function () {\n        var choices = FieldConfig.getFieldConfig('group', Ember.getOwner(this)).getAllowedValues(\n            'privacy.groupVisibility'\n        );\n\n        return choices.map(type => {\n            var lookupType = type.replace('.', '_');\n            var label = this.get('intl').lookup(`group_privacy_groupVisibility_value_${lookupType}`);\n\n            return {\n                value: type,\n                label: label\n            };\n        });\n    })\n});\n","define(\"connections-ui/mixins/device-enumeration\", [\"exports\", \"ember-webrtc-components/mixins/device-enumeration\"], function (_exports, _deviceEnumeration) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _deviceEnumeration.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst {\n    $,\n    Mixin,\n    run: { bind }\n} = Ember;\n\nexport default Mixin.create({\n    handleMessageEvent(event) {\n        Ember.run(() => {\n            const iframe = Ember.get(this, 'element');\n            if (iframe) {\n                const messageEvent = event.originalEvent;\n                const messageData = messageEvent.data;\n                const messageOptions = Object.assign({}, messageData.options);\n                if (messageEvent.source === iframe.contentWindow && messageData.type) {\n                    this.triggerMessageAction(messageData.type.toLowerCase(), messageData.data, messageOptions);\n                }\n            }\n        });\n    },\n\n    triggerMessageAction(type, data, options = {}) {\n        if (this.messageHandlers[type]) {\n            this.logger.debug('Handling message type', type, data);\n            this.messageHandlers[type].call(this, data, options);\n        } else {\n            // An in-house utility generates messages in this\n            // format that we do not want to log. See: PCDWEBK-4163\n            if (type !== 'rpc:request') {\n                this.logger.info('Unknown message type', { type, data });\n            }\n        }\n    },\n\n    startMessageListener: Ember.on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, bind(this, this.handleMessageEvent));\n    }),\n\n    stopMessageListener: Ember.on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nvar EntityControllerMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    entity: null,\n\n    excludedFieldSections: null,\n\n    lastUploadedImage: null,\n\n    editingPictures: false,\n\n    viewingGallery: false,\n\n    actions: {\n        cancelEditProfilePicture() {\n            this.set('editingPictures', false);\n        },\n\n        editProfilePicture() {\n            this.set('editingPictures', true);\n        },\n\n        cancelUpload() {\n            this.send('editProfilePicture');\n        },\n\n        cancelEditPictures() {\n            this.set('uploadType', null);\n        },\n\n        viewLightGallery() {\n            this.set('viewingGallery', true);\n        },\n\n        cancelViewLightGallery() {\n            this.set('viewingGallery', false);\n        },\n\n        noop() {}\n    },\n\n    setInitialFieldSections: Ember.on('init', function () {\n        this.set('excludedFieldsSections', []);\n    }),\n\n    fieldSections: Ember.computed('entity', function () {\n        var entity = this.get('entity');\n\n        if (entity) {\n            var sections = this.get('entity').fieldConfig.sections;\n\n            if (this.get('application.session.user.isAdmin') && !this.get('application.session.user.personId')) {\n                return _.filter(\n                    sections,\n                    function (section) {\n                        var excludedSections = this.get('excludedFieldSections');\n                        return excludedSections.indexOf(section.key) === -1;\n                    },\n                    this\n                );\n            }\n\n            return _.filter(\n                sections,\n                function (section) {\n                    var readableSections = this.get('entity').getReadableSections(),\n                        excludedSections = this.get('excludedFieldSections');\n                    return excludedSections.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n                },\n                this\n            );\n        }\n\n        return [];\n    })\n});\n\nexport default EntityControllerMixin;\n","import Ember from 'ember';\n\n// Brings in isOneToOneOfflineOrBusy\nimport WebrtcActionUtils from 'connections-ui/mixins/webrtc-action-utils';\n\nexport default Ember.Mixin.create(WebrtcActionUtils, {\n    chat: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    geolocation: Ember.inject.service(),\n    application: Ember.inject.service(),\n    phoneService: Ember.inject.service('phone'),\n    mediaProviders: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    isChatEnabled: Ember.computed.reads('chat.enabled'),\n    isWebrtcEnabled: Ember.computed.reads('webrtc.enabled'),\n    isGeolocationEnabled: Ember.computed.reads('geolocation.isEnabled'),\n    phoneServiceEnabled: Ember.computed.reads('phoneService.enabled'),\n    phoneAvailable: Ember.computed.reads('phoneService.phoneAvailable'),\n    self: Ember.computed.reads('session.person'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('applicationUrlPrefix', this.get('application.urlprefix') || '');\n\n        // Need user details to compute the 'useMediaProviders' property, which is only used by the {{entity-contact-group}} component.\n        if (this.get('entity.type') === 'person' && this.classNames.includes('entity-contact-group-v2')) {\n            this.get('store')\n                .findRecord('public-api-user', this.get('entity.id'), {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => this.set('user', user));\n        }\n    },\n    callEntity(entity) {\n        this.get('phoneService').makeCall(entity);\n    },\n    toggleFavorite(entity) {\n        this.get('favorites').toggleFavorite(entity);\n    },\n\n    mediaProviderComponent: 'media-providers/video-dropdown',\n\n    videoProviders: Ember.computed('user', 'user.profile', function () {\n        return this.get('mediaProviders').getProvidersForUser('video', this.get('user'));\n    }),\n\n    useMediaProviders: Ember.computed('videoProviders.@each.haveAccess', function () {\n        const providers = this.get('videoProviders').filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }),\n\n    integrationBadgesComponent: 'integration-badges',\n    useIntegrationBadges: true\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport Presence from 'ember-purecloud-components/models/presence';\n\nconst { get, set, inject, computed, Mixin } = Ember;\n\nexport function isPresence(presenceMap, definition, check) {\n    if (!definition) {\n        return false;\n    }\n\n    let apiValue = get(definition, 'systemPresence');\n    let id = get(definition, 'id');\n\n    if (apiValue) {\n        return apiValue.toLowerCase() === check;\n    } else if (id && presenceMap) {\n        let presenceMapping = presenceMap.findBy('id', id);\n        if (presenceMapping && presenceMapping.systemPresence) {\n            return presenceMapping.systemPresence.toLowerCase() === check;\n        }\n    }\n\n    return false;\n}\n\nexport default Mixin.create({\n    intl: inject.service(),\n    session: inject.service(),\n    presenceService: inject.service('presence'),\n    phoneIntegrations: inject.service(),\n\n    outOfOffice: computed.reads('activities.outOfOffice'),\n    routingStatus: computed.reads('activities.routingStatus'),\n    acdDivisionPresenceProfileToggle: computed.readOnly('session.features.acdDivisionPresenceProfileToggle'),\n    primaryPresence: computed(\n        'activities.presence',\n        'activities.integrationPresence',\n        'session.presenceMap',\n        'presenceList.[]',\n        'currentPresenceSource',\n        function () {\n            const presence = this.get('activities.presence');\n            const presenceList = this.get('presenceList');\n            let currentPresenceSource = this.get('currentPresenceSource');\n            const integrationPresence = this.get('integrationPresence');\n            let currentPresence = presence;\n\n            // check the presence list for primary presence\n            // falls back to `activities.presence`\n            if (presenceList && presenceList.length > 0) {\n                const existingPresence = presenceList.find(pres => {\n                    let presSource = pres.source;\n                    if (isPurecloudSource(presSource)) {\n                        presSource = 'default';\n                    }\n                    return presSource.toLowerCase() === currentPresenceSource.toLowerCase();\n                });\n                if (existingPresence) {\n                    if (!presence) {\n                        // there are times where activities.presence is undefined\n                        currentPresence = existingPresence;\n                    } else {\n                        // need to verify if expands presence (from api) is the latest presence\n                        const existingPresenceDate = moment(existingPresence.modifiedDate);\n                        const activitiesPresenceDate = moment(presence.modifiedDate);\n                        const isExistingPresenceLatest = existingPresenceDate.isAfter(activitiesPresenceDate);\n                        if (isExistingPresenceLatest) {\n                            // if presence value in presence list, is the latest, then use that instead\n                            currentPresence = existingPresence;\n                        }\n                    }\n                }\n            }\n\n            // if user has an integration presence\n            if (integrationPresence && Ember.get(integrationPresence, 'presenceDefinition')) {\n                // check if user is offline for their primary presence source\n                const isGCOffline = isPresence(\n                    this.get('session.presenceMap'),\n                    !!currentPresence ? Ember.get(currentPresence, 'presenceDefinition') : undefined,\n                    'offline'\n                );\n\n                // if offline in primary presence source\n                // return integration presence\n                if (isGCOffline) {\n                    return integrationPresence;\n                }\n            }\n            return currentPresence;\n        }\n    ),\n\n    conversationSummary: computed.reads('activities.conversationSummary'),\n    geolocation: computed.reads('activities.geolocation'),\n    presenceDefinition: computed.reads('primaryPresence.presenceDefinition'),\n\n    // PCUCC-1546 - new integrationPresence expands for 3rd Party Presence\n    integrationPresence: computed.reads('activities.integrationPresence'),\n\n    presenceModel: computed(\n        'primaryPresence.presenceDefinition.systemPresence',\n        'presenceDefinition',\n        'presenceService.allPresences.[]',\n        'presenceService.outOfBandPresenceDefinitions.[]',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const presenceService = this.get('presenceService');\n            const presences = this.get('presenceService.allPresences');\n            const presenceDefinition = this.get('presenceDefinition');\n            if (presenceDefinition && presences && presences.length > 0) {\n                const presence = presences.find(presence => {\n                    return get(presenceDefinition, 'id') === get(presence, 'id');\n                });\n                const canViewPresenceDefinition = this.get('permissions.canViewPresenceDefinition');\n\n                if (this.get('acdDivisionPresenceProfileToggle')) {\n                    const outOfBandPresences = this.get('presenceService.outOfBandPresenceDefinitions');\n                    let outOfBandPresence;\n                    if (outOfBandPresences) {\n                        outOfBandPresence = outOfBandPresences.find(presence => {\n                            return get(presenceDefinition, 'id') === get(presence, 'id');\n                        });\n                    }\n                    if (!presence && !outOfBandPresence) {\n                        if (canViewPresenceDefinition) {\n                            // This recalculates the data necessary to handle the use cases where an unknown\n                            // presence is selected or when a deactivated presence has worked its way into the\n                            // cache (outside user intervention)\n                            // integration presence will be undefined at times and trigger many loops based on results\n                            Ember.run.join(() => {\n                                return presenceService.findPresence(get(presenceDefinition, 'id'), presenceDefinition);\n                            });\n                        } else {\n                            if (\n                                get(presenceDefinition, 'id') &&\n                                presenceDefinition &&\n                                presenceDefinition.systemPresence\n                            ) {\n                                //same code as in presenceService.findPresence catch() to retrieve the matching system status\n                                // We need to map the out of band presence to a primary presence for translation sake.\n                                return presenceService.get('primaryPresences').find(presence => {\n                                    const matchingPrimaryPresence =\n                                        presence.get('presence.systemPresence').toLowerCase() ===\n                                        presenceDefinition.systemPresence.toLowerCase();\n                                    if (matchingPrimaryPresence) {\n                                        const newPresence = presence.get('presence');\n                                        // Replace the id of the actual def instead of the primary presences id\n                                        set(newPresence, 'id', presenceDefinition.id);\n                                        const instance = Presence.create(\n                                            {\n                                                presence: newPresence\n                                            },\n                                            presenceService.getOwner(presenceService).ownerInjection()\n                                        );\n                                        presenceService.get('outOfBandPresenceDefinitions').addObject(instance);\n                                        return instance;\n                                    }\n                                    return false;\n                                });\n                            }\n                        }\n                    }\n                    return presence || outOfBandPresence;\n                } else {\n                    if (!presence && canViewPresenceDefinition) {\n                        // Try to find a system presence that matches\n                        const systemPresence = presences.find(\n                            p =>\n                                get(p, 'presence.type') === 'System' &&\n                                get(p, 'presence.systemPresence') === get(presenceDefinition, 'systemPresence')\n                        );\n                        if (systemPresence) {\n                            return systemPresence;\n                        }\n                        // This recalculates the data necessary to handle the use cases where an unknown\n                        // presence is selected or when a deactivated presence has worked its way into the\n                        // cache (outside user intervention)\n                        // integration presence will be undefined at times and trigger many loops based on results\n                        Ember.run.join(() => presenceService.findPresence(get(presenceDefinition, 'id')));\n                    }\n                    return presence;\n                }\n            }\n\n            return presences.findBy('key', 'offline');\n        }\n    ),\n\n    presenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'isOutOfOffice',\n        'outOfOffice.endDate',\n        'integrationPresence',\n        'primaryPresence',\n        'presenceModel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const endOfTime = moment('9999-12-31T00:00:00.000Z');\n\n            if (this.get('isOutOfOffice')) {\n                let end = moment(this.get('outOfOffice.endDate'));\n                if (end.isSame(endOfTime) || end.year() === 9999 || this.get('outOfOffice.indefinite')) {\n                    return this.get('intl').t('chat.presence.outOfOffice.title');\n                } else {\n                    return this.get('intl').t('chat.presence.outOfOffice.presence', {\n                        date: end.locale(this.get('intl.isoLocale')).format('l')\n                    });\n                }\n            }\n\n            const integrationPresenceSource = this.get('integrationPresence.source');\n            let primaryPresenceSource = this.get('primaryPresence.source');\n\n            if (isPurecloudSource(primaryPresenceSource)) {\n                primaryPresenceSource = 'default';\n            }\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                // if using 3rd Party Presence, append 3rd Party labels to presence label\n                if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                    const integrationLabel = this.get('intl').t(\n                        `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                    );\n                    return `${this.get('presenceModel.label')} on ${integrationLabel}`;\n                }\n                return this.get('presenceModel.label');\n            }\n            // if using 3rd Party Presence, append 3rd Party labels to presence label\n            if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                const integrationLabel = this.get('intl').t(\n                    `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                );\n                return `${this.get('presenceModel.primaryLabel')} on ${integrationLabel}`;\n            }\n\n            return this.get('presenceModel.primaryLabel');\n        }\n    ),\n\n    /**\n     * Generates a label based on the users presence. Includes the secondary presence and the primary presence\n     * separated by a bullet symbol. i.e. `Busy 1 • Busy`.\n     * This gives the users a further look into the users exact presence\n     */\n    secondaryPresenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'presenceLabel',\n        'presenceModel.primaryLabel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                if (!this.get('presenceLabel')) {\n                    return;\n                }\n                if (\n                    this.get('presenceModel.primaryLabel') &&\n                    this.get('presenceModel.primaryLabel') !== this.get('presenceLabel')\n                ) {\n                    return this.get('presenceModel.primaryLabel');\n                }\n                return null;\n            }\n\n            let secondaryPresence = null;\n\n            const definition = this.get('presenceDefinition');\n            const presenceMap = this.get('session.presenceMap');\n            const presence = presenceMap.find(p => p.id === definition.id);\n\n            if (presence) {\n                const locale = this.get('intl.isoLocale').toLowerCase();\n                const fallbackLocale = this.get('intl.baseLocale');\n\n                if (presence.languageLabels && Object.keys(presence.languageLabels).length > 0) {\n                    /**\n                     * The language label keys are inconsistent so we will just iterate over them\n                     * and try to match it up with the info we have\n                     */\n                    for (const [key, value] of Object.entries(presence.languageLabels)) {\n                        const formattedLocale = key.toLowerCase().replace(/_/g, '-');\n                        // if we found the exact locale that matches the users we can end it\n                        if (locale === formattedLocale) {\n                            secondaryPresence = value;\n                            break;\n                        }\n\n                        // sets the secondarypresence to the fallback locale if found and needed\n                        if (fallbackLocale === formattedLocale) {\n                            secondaryPresence = value;\n                        }\n                    }\n                }\n\n                let primaryPresence =\n                    typeof presence.systemPresence === 'string'\n                        ? presence.systemPresence.toLowerCase().trim().replace('_', ' ')\n                        : '';\n                // if the secondaryPresence and the primaryPresence are the same then we don't want to return anything\n                if (!secondaryPresence || secondaryPresence.toLowerCase().trim() === primaryPresence) {\n                    return null;\n                }\n            }\n\n            return secondaryPresence;\n        }\n    ),\n\n    primaryStatusMessage: computed.reads('primaryPresence.message'),\n\n    cityExists: computed.notEmpty('geolocation.city'),\n    regionExists: computed.notEmpty('geolocation.region'),\n    countryExists: computed.notEmpty('geolocation.country'),\n    hasGeolocation: computed.or('cityExists', 'regionExists', 'countryExists'),\n\n    isAvailable: computed.reads('isOnline'),\n    isOnline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('available') && !this.get('isOutOfOffice');\n    }),\n\n    isOffline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('offline');\n    }),\n\n    isAway: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isAway =\n            this.isPresence('away') ||\n            this.isPresence('training') ||\n            this.isPresence('break') ||\n            this.isPresence('meal') ||\n            this.isPresence('idle');\n        return isAway && !this.get('isOutOfOffice');\n    }),\n\n    isBusy: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isBusy = this.isPresence('busy') || this.isPresence('meeting');\n        return isBusy && !this.get('isOutOfOffice');\n    }),\n\n    isOutOfOffice: computed('session.presenceMap.[]', 'presenceDefinition', 'outOfOffice.active', function () {\n        return this.get('outOfOffice.active');\n    }),\n\n    isOnQueue: computed(\n        'session.presenceMap.[]',\n        'presenceDefinition',\n        'presenceDefinition.systemPresence',\n        'routingStatus.status',\n        'isOutOfOffice',\n        function () {\n            let systemPresence = this.get('presenceDefinition.systemPresence') || '';\n            return (\n                (systemPresence.toLowerCase() === 'on_queue' ||\n                    systemPresence.toLowerCase() === 'on queue' ||\n                    this.isPresence('on_queue')) &&\n                !this.get('isOutOfOffice')\n            );\n        }\n    ),\n\n    isOfflineOrBusy: computed.or('isOffline', 'isBusy'),\n\n    activityPresence: computed('isOnQueue', 'isOutOfOffice', 'isOnline', 'isOffline', 'isAway', 'isBusy', function () {\n        if (this.get('isOnQueue')) {\n            return 'on_queue';\n        } else if (this.get('isOutOfOffice')) {\n            return 'out_of_office';\n        } else if (this.get('isOnline')) {\n            return 'available';\n        } else if (this.get('isAway')) {\n            return 'away';\n        } else if (this.get('isBusy')) {\n            return 'busy';\n        }\n\n        return 'offline';\n    }),\n    activityPresenceClass: computed('activityPresence', 'isOffline', 'isOutOfOffice', function () {\n        if (this.get('isOutOfOffice') && this.get('isOffline')) {\n            // Display offline CSS colors via class if out of office and signed out\n            return 'offline';\n        }\n        return this.get('activityPresence');\n    }),\n\n    isPresence(check) {\n        return isPresence(this.get('session.presenceMap'), this.get('presenceDefinition'), check);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport keys from 'lodash/keys';\nimport parseInt from 'lodash/parseInt';\nimport sortBy from 'lodash/sortBy';\n\nconst profilePictureFieldKey = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nconst imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        informal: 'images.informal',\n        agent: 'agent.profileImage'\n    },\n    group: {\n        profile: 'images.profilePictures',\n        informal: 'images.gallery'\n    }\n};\n\nconst missingFieldsCache = {};\n\nconst EntityMixin = Ember.Mixin.create({\n    intl: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    _currentSection: null,\n    _missingFieldsCache: missingFieldsCache,\n\n    _id: DS.attr(),\n    _entity: DS.attr(),\n    guid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr().volatile(),\n    mt: DS.attr(),\n\n    apps: DS.attr(),\n    orgId: DS.attr(),\n\n    init: function () {\n        Ember.set(this, '_initialData', {});\n        Ember.set(this, '_previousData', {});\n        Ember.set(this, '_changedSinceSave', []);\n\n        this._super();\n    },\n\n    name: Ember.computed('general.name.@each.value', function () {\n        return this.getFieldValue('general.name').value;\n    }),\n\n    type: Ember.computed(function () {\n        if (typeof this.fieldConfig === 'undefined') {\n            return '';\n        }\n        return this.fieldConfig.entityType;\n    }),\n\n    profilePicture: Ember.computed(\n        'images.profile',\n        'images.profile.[]',\n        'images.activeProfilePicture.[]',\n        'images.profile.@each.ref',\n        function () {\n            const pictureKey = profilePictureFieldKey[this.get('type')];\n            let fieldValue = this.getFieldValue(pictureKey);\n\n            if (!isEmpty(fieldValue)) {\n                return fieldValue.value;\n            } else {\n                fieldValue = this.getFieldValue(pictureKey, true);\n                if (!isEmpty(fieldValue.ref)) {\n                    return fieldValue.ref;\n                }\n            }\n\n            return null;\n        }\n    ),\n\n    profilePictureSizes: Ember.computed('profilePicture', function () {\n        const profilePicture = this.get('profilePicture');\n        if (profilePicture) {\n            // Strip off the 'x' in the keys and sort the available sizes.\n            return sortBy(keys(profilePicture).map(item => parseInt(item.substr(1))));\n        }\n        return [];\n    }),\n\n    uploadedImages: Ember.computed('uploads.images.[]', function () {\n        const type = this.get('type');\n        const path = imageMappings[type].profile;\n        return this.get(path);\n    }),\n\n    stateString: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('data.state')}`)\n            .toString();\n    }),\n\n    _self: Ember.computed(function () {\n        return this;\n    }),\n\n    _missingFields: Ember.computed('_missingFieldsCache', function () {\n        return missingFieldsCache[this.get('id')] || [];\n    }),\n\n    recordPropertyChange(fieldPath) {\n        const changedSinceSave = this.get('_changedSinceSave');\n\n        const missingFields = this.get('_missingFields');\n        if (missingFields.indexOf(fieldPath) !== -1) {\n            missingFields.removeObject(fieldPath);\n        }\n\n        changedSinceSave.addObject(fieldPath);\n\n        this.notifyPropertyChange(fieldPath);\n    },\n\n    changedProperties() {\n        const changedSinceSave = this.get('_changedSinceSave');\n        const missingFields = this.get('_missingFields');\n        return (changedSinceSave || []).filter(field => missingFields.indexOf(field) < 0);\n    },\n\n    getReferencedField(fieldPath) {\n        const field = this.getFieldValue(fieldPath, true);\n\n        if (field.value && field.value.fieldId !== 'NONE') {\n            const referencedField = this.getFieldValue(field.value.fieldPath, true);\n\n            if (Ember.isArray(referencedField) && referencedField.length > 0) {\n                return find(referencedField, { _id: field.value.fieldId });\n            } else if (!isEmpty(referencedField)) {\n                return referencedField;\n            } else if (field.ref) {\n                // If the reference field path is not loaded, try the field.ref value.\n                return {\n                    value: field.ref\n                };\n            }\n\n            return referencedField;\n        }\n\n        return {};\n    },\n\n    getFieldValue(fieldPath, referencedLookup) {\n        if (fieldPath && typeof this.fieldConfig !== 'undefined') {\n            const fieldArray = Ember.get(this, fieldPath);\n            const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n            const reference = this.fieldConfig.isFieldReference(fieldPath);\n\n            if (!isEmpty(fieldArray)) {\n                if (reference && !referencedLookup) {\n                    return this.getReferencedField(fieldPath);\n                } else if (repeatable) {\n                    return fieldArray;\n                } else {\n                    return fieldArray[0];\n                }\n            }\n\n            return repeatable ? [] : {};\n        }\n\n        return [];\n    },\n\n    isFieldValueEmpty(fieldPath) {\n        if (fieldPath) {\n            const fieldArray = Ember.get(this, fieldPath);\n            if (fieldArray && fieldArray.length > 0) {\n                return !fieldArray.some(entry => entry && entry.value);\n            }\n        }\n        return true;\n    },\n\n    removeFieldValue(fieldPath, value) {\n        const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n        const currentFieldValue = this.getFieldValue(fieldPath);\n\n        if (repeatable) {\n            const object = find(currentFieldValue, value);\n            if (object && object !== -1) {\n                currentFieldValue.removeObject(object);\n            }\n        }\n    },\n\n    reset() {\n        const promise = this.reload();\n\n        // For some reason, we need to keep the state updated manually\n        promise.then(record => {\n            if (this.currentState.stateName.indexOf('uncommitted') < 0) {\n                this.adapterDidCommit();\n            }\n\n            return record;\n        });\n\n        return promise;\n    },\n\n    save() {\n        const state = this.get('currentState');\n\n        if (state.stateName.includes('deleted')) {\n            this.set('isDeleted', true);\n        }\n\n        const promise = this._super();\n        promise.then(this.onSaveSuccess.bind(this)).catch(this.onSaveError.bind(this));\n\n        return promise;\n    },\n\n    onSaveSuccess(entity) {\n        const copy = cloneDeep(this.get('data'));\n        this.set('_initialData', copy);\n\n        // Clear historical data\n        this.set('_previousData', {});\n\n        this.set('versionError', false);\n\n        if (entity._internalModal) {\n            const internal = entity._internalModel;\n            if (internal.adapterDidCommit) {\n                internal.adapterDidCommit();\n            }\n        }\n\n        return entity;\n    },\n\n    onSaveError(error) {\n        const data = error.responseJSON || {};\n        const publicApiError = error.errors && error.errors[0];\n\n        if (publicApiError && publicApiError.title && publicApiError.title.indexOf('version') > -1) {\n            // Try to extract error from text inside the public api response\n            const regex = /^.*\\[(\\d+)\\].*\\[(\\d+)\\].*$/i;\n            const matches = publicApiError.title.match(regex);\n            if (matches.length === 3) {\n                const currentVersion = this.get('version');\n                const newVersion = matches[2];\n\n                // Prevent infinite loop: only retry if version actually changed\n                if (currentVersion !== newVersion) {\n                    Ember.Logger.info('Version mismatch, retrying with correct version:', publicApiError);\n\n                    this.set('versionError', true);\n                    this.set('version', newVersion);\n\n                    return Ember.RSVP.resolve(this.save())\n                        .then(this.onSaveSuccess.bind(this))\n                        .catch(this.onSaveError.bind(this));\n                } else {\n                    Ember.Logger.warn('Version mismatch but version unchanged, not retrying to avoid loop');\n                    return Ember.RSVP.reject(error);\n                }\n            }\n        } else if ((data && data.payload) || Ember.get(error, 'errors.length')) {\n            // Check error payload from directory-style error response\n            const payload = data.payload || Ember.get(error, 'errors.0.payload') || {};\n            if (payload.code === 'VERSION_MISMATCH') {\n                const currentVersion = this.get('version');\n                const newVersion = payload.currentVersion;\n\n                // Prevent infinite loop: only retry if version actually changed\n                if (currentVersion !== newVersion && newVersion) {\n                    Ember.Logger.info('Version mismatch, retrying with correct version:', payload);\n\n                    this.set('versionError', true);\n                    this.set('version', newVersion);\n\n                    return Ember.RSVP.resolve(this.save())\n                        .then(this.onSaveSuccess.bind(this))\n                        .catch(this.onSaveError.bind(this));\n                } else {\n                    Ember.Logger.warn('Version mismatch but version unchanged or missing, not retrying to avoid loop');\n                    return Ember.RSVP.reject(error);\n                }\n            } else {\n                return Ember.RSVP.reject(error);\n            }\n        } else {\n            Ember.Logger.error(\"Couldn't save field config\", error);\n            return new Ember.RSVP.Promise((_, reject) => {\n                this.reload().then(() => reject(error));\n            });\n        }\n    },\n\n    saveSection(section) {\n        this.set('_currentSection', section);\n        return this.save()\n            .catch(response => {\n                if (response && response.errors) {\n                    const error = response.errors[0];\n                    if (error && Ember.get(error, 'payload.code') === 'VERSION_MISMATCH') {\n                        return Ember.RSVP.resolve(response);\n                    }\n                }\n                return Ember.RSVP.reject(response);\n            })\n            .finally(() => this.set('_currentSection', null));\n    },\n\n    set(field, value, options) {\n        options = options || {};\n        const overwrite = options.overwrite !== undefined ? options.overwrite : undefined;\n        const recordChange = options.recordChange !== undefined ? options.recordChange : true;\n\n        if (field.indexOf('.') === -1 || overwrite === true) {\n            return this._super(field, value);\n        }\n\n        const sectionKey = field.split('.')[0];\n\n        if (this.get(field) === undefined) {\n            if (!this.fieldConfig.getFieldByKey(field)) {\n                // This is getting loud...\n                // Ember.Logger.error(`The field \"${field}\" does not exist on entity`, this);\n                return undefined;\n            }\n\n            if (!this.get(sectionKey)) {\n                this._super(sectionKey, {});\n            }\n        }\n\n        // Delegate to Ember when not dealing with our own field config\n        if (!this.fieldConfig.getSectionByKey(sectionKey)) {\n            return this._super(field, value);\n        }\n\n        let currentField = this.getFieldValue(field);\n        const fieldDef = this.fieldConfig.getFieldByKey(field);\n\n        if (this.fieldConfig.isFieldRepeatable(field)) {\n            const data = {\n                tempId: Ember.generateGuid(),\n                value: value,\n                labelKey: fieldDef.labelKeys[0]\n            };\n\n            if (currentField && currentField.length > 0) {\n                currentField.addObject(data);\n            } else {\n                currentField = [data];\n            }\n        } else {\n            if (currentField && currentField._id) {\n                Ember.set(currentField, 'value', value);\n            } else {\n                currentField = {\n                    tempId: Ember.generateGuid(),\n                    value: value,\n                    labelKey: fieldDef.labelKeys[0]\n                };\n            }\n\n            currentField = [currentField];\n        }\n\n        if (recordChange) {\n            this.recordPropertyChange(field);\n        }\n\n        return this._super(field, currentField);\n    },\n\n    getPermissableSections() {},\n    getReadableSections() {},\n    getWriteableSections() {},\n    getReadableFieldsForSection() {},\n    getWriteableFieldsForSection() {},\n\n    deleteField(fieldPath, fieldId) {\n        const id = this.get('id');\n        const field = this.getFieldValue(fieldPath);\n\n        if (!fieldId) {\n            fieldId = field._id;\n        }\n\n        const version = this.get('version');\n\n        const type = pluralize(this.get('type'));\n        const path = `/directory/api/v2/${type}/${id}/${version}/field/${fieldPath}/${fieldId}`;\n\n        return this.get('ajax')\n            .del(path)\n            .then(data => {\n                this.set('version', data.rel.version);\n            });\n    }\n});\n\nexport default EntityMixin;\n","import Ember from 'ember';\nimport EvaluationModel from '../models/evaluation';\nimport moment from '../utils/dates';\n\nconst EvaluationsMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    evaluationsAjax: Ember.$.ajax,\n\n    getEvaluations() {\n        return new Ember.RSVP.Promise(resolve => {\n            let promises = [];\n            let agentEvaluations = [];\n            let evaluatorEvaluations = [];\n            let assigneeEvaluations = [];\n            let payload = {\n                agentId: this.get('session.person.guid'),\n                evaluationState: ['Pending', 'InProgress'],\n                userType: 'evaluator'\n            };\n            let isAssigneeFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.assignee'];\n            let isDisputesFeatureEnabled =\n                this.get('session.features') && this.get('session.features')['qm.release.evaluation.disputes'];\n\n            let evaluatorUri = `api/v2/quality/evaluations/query?`;\n            if (isAssigneeFeatureEnabled) {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&expand=assignee` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            } else {\n                evaluatorUri =\n                    evaluatorUri +\n                    `expand=agent` +\n                    `&evaluatorUserId=${payload.agentId}` +\n                    `&evaluationState=Pending` +\n                    `&evaluationState=InProgress` +\n                    `&pageSize=25`;\n            }\n\n            let agentFinishedUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.agentId}` +\n                `&isReleased=true` +\n                `&agentHasRead=false` +\n                `&evaluationState=Finished` +\n                `&pageSize=25`;\n\n            let agentInReviewUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${payload.agentId}` +\n                `&isReleased=true` +\n                `&evaluationState=InReview` +\n                `&pageSize=25`;\n\n            let assigneeUri =\n                `api/v2/quality/evaluations/query?` +\n                `expand=agent` +\n                `&expand=assignee` +\n                `&assigneeUserId=${payload.agentId}` +\n                `&pageSize=25`;\n\n            const startTime = moment().add(-1, 'month').toISOString();\n\n            agentFinishedUri = agentFinishedUri + `&startTime=${startTime}`;\n            agentInReviewUri = agentInReviewUri + `&startTime=${startTime}`;\n            evaluatorUri = evaluatorUri + `&startTime=${startTime}`;\n            assigneeUri = assigneeUri + `&startTime=${startTime}`;\n\n            let evaluatorRequest = {\n                url: this.get('application').pcUri(evaluatorUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentFinished = {\n                url: this.get('application').pcUri(agentFinishedUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentInReview = {\n                url: this.get('application').pcUri(agentInReviewUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAssignee = {\n                url: this.get('application').pcUri(assigneeUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n\n            let locale = this.get('intl.isoLocale');\n            promises.push(\n                this.get('evaluationsAjax')(evaluatorRequest).then(({ entities = [] }) => {\n                    evaluatorEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate =\n                                    isAssigneeFeatureEnabled && !evaluation.calibration\n                                        ? evaluation.dateAssigneeChanged || evaluation.assignedDate\n                                        : evaluation.assignedDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'admin';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.get('evaluationsAjax')(requestAgentFinished).then(({ entities = [] }) => {\n                    agentEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = evaluation.releaseDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate &&\n                                    moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                evaluation.linkContext = 'agent';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            if (isAssigneeFeatureEnabled) {\n                promises.push(\n                    this.get('evaluationsAjax')(requestAssignee).then(({ entities = [] }) => {\n                        assigneeEvaluations.push(\n                            entities.map(evaluation => {\n                                if (evaluation) {\n                                    evaluation.changedDate = evaluation.dateAssigneeChanged;\n                                    evaluation.assignedDate =\n                                        evaluation.assignedDate &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'admin';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            if (isDisputesFeatureEnabled) {\n                promises.push(\n                    this.get('evaluationsAjax')(requestAgentInReview).then(({ entities = [] }) => {\n                        agentEvaluations.push(\n                            entities.map(evaluation => {\n                                if (evaluation) {\n                                    evaluation.changedDate = evaluation.releaseDate;\n                                    evaluation.assignedDate =\n                                        evaluation.assignedDate &&\n                                        moment(evaluation.assignedDate).locale(locale).format('LLLL');\n                                    evaluation.linkContext = 'agent';\n                                }\n                                return EvaluationModel.create(evaluation);\n                            })\n                        );\n                    })\n                );\n            }\n\n            let evaluationIdSet = {};\n            Ember.RSVP.all(promises).then(function () {\n                // It is important that the results are processed this way: evaluator results first, then assignee, and then agent\n                // That allows the de-duplication to use the most relevant of the results first and reject the same evaluation\n                // from less relevant queries\n                const resultData = evaluatorEvaluations\n                    .concat(assigneeEvaluations, agentEvaluations)\n                    .reduce((totalResult, queryResult) => {\n                        return totalResult.concat(\n                            queryResult.reduce((result, evaluation) => {\n                                if (!evaluationIdSet[evaluation.id]) {\n                                    evaluationIdSet[evaluation.id] = true;\n                                    result.push(evaluation);\n                                }\n                                return result;\n                            }, [])\n                        );\n                    }, []);\n                resolve(resultData); //resolve the promise when all inner promises are resolved\n            });\n        });\n    },\n\n    readEvaluation(evaluation) {\n        const evaluationIsAdminContext =\n            evaluation && evaluation.linkContext && evaluation.linkContext.toUpperCase() === 'ADMIN';\n        return (window.location.hash = `#/engage/${evaluationIsAdminContext ? 'admin' : 'agent'}/interactions/${\n            evaluation.conversation.id\n        }/?evaluationId=${evaluation.id}`);\n    }\n});\n\nexport default EvaluationsMixin;\n","import Ember from 'ember';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst { inject } = Ember;\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create(RelateFeaturesMixin, {\n    relate: inject.service(),\n    names: inject.service(),\n    externalContacts: inject.service(),\n\n    externalContactProfiles: null,\n\n    conversationId: null,\n    mediaType: null,\n\n    participants: [],\n    consultAgentParticipant: null,\n    consultParticipant: null,\n    communicationId: null,\n    hasMultipleExternalContactMatches: computed.gt('externalContactProfiles.length', 1),\n\n    isIncomingFromExternalContacts: computed.and('hasRelateAccess', 'isIncoming', 'hasExternalContactProfiles'),\n    isConnectedWithExternalContact: computed.and('hasRelateAccess', 'isConnected', 'hasOneExternalContactProfile'),\n    hasExternalContactProfiles: computed.notEmpty('externalContactProfiles'),\n    hasOneExternalContactProfile: computed.equal('externalContactProfiles.length', 1),\n\n    /**\n     * Returns the \"class\" of the thing that mixes in this mixin (the \"inheritor\")\n     * @private\n     */\n    _nameForInheritor() {\n        return componentClassName.call(this);\n    },\n\n    // This CP is used by the navbar.hbs template for for direct incoming (not to an agent's queue) calls\n    externalContactFullName: computed('externalContactProfiles.[]', function () {\n        const externalProfile = this.get('externalContactProfiles.firstObject');\n        if (externalProfile) {\n            return this.get('names').fullName(externalProfile);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator.calls.firstObject.other.name');\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport ajax from 'ember-ajax';\nimport FaxModel from '../models/fax';\n\nconst FaxesMixin = Ember.Mixin.create({\n    application: Ember.inject.service(),\n\n    getFaxes() {\n        return new Ember.RSVP.Promise(resolve => {\n            let request = {\n                contentType: 'application/json; charset=UTF-8',\n                cache: false\n            };\n            let url = this.get('application').pcV2Uri('api/v2/fax/documents');\n\n            return ajax(url, request).then(({ entities = [] }) => {\n                let owner = Ember.getOwner(this);\n                return resolve(\n                    _.map(entities, function (fax) {\n                        return FaxModel.create(fax, owner.ownerInjection());\n                    })\n                );\n            });\n        });\n    },\n\n    readFax(fax) {\n        this.changeFaxReadState(fax, true);\n        let contentUri = fax.get('contentUri');\n        let sharingUri = fax.get('sharingUri');\n\n        if (sharingUri) {\n            window.open(sharingUri);\n        } else {\n            ajax(contentUri, {\n                cache: false\n            }).then(contentLocationUri => {\n                window.open(contentLocationUri);\n            });\n        }\n    },\n\n    markFaxesRead(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, true);\n        });\n    },\n\n    markFaxesUnread(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, false);\n        });\n    },\n\n    changeFaxReadState(fax, read) {\n        fax.set('read', read);\n        let id = fax.get('id');\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify({\n                id: id,\n                read: read\n            })\n        });\n    },\n\n    renameFax(fax, name) {\n        fax.set('name', name);\n        let id = fax.get('id');\n        return ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: {\n                name\n            }\n        });\n    },\n\n    deleteFaxes(faxes) {\n        Ember.RSVP.all(\n            _.map(faxes, fax => {\n                this.deleteFax(fax);\n            })\n        );\n    },\n\n    downloadFax(id) {\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${id}/content`), {\n            cache: false,\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json'\n        }).then(function ({ contentLocationUri }) {\n            window.open(contentLocationUri);\n        });\n    },\n\n    deleteFax(fax) {\n        ajax(this.get('application').pcV2Uri(`api/v2/fax/documents/${fax.get('id')}`), {\n            cache: false,\n            method: 'DELETE',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    }\n});\n\nexport default FaxesMixin;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nconst { run, inject, computed, RSVP, Mixin } = Ember;\n\nexport default Mixin.create({\n    classNames: ['field-component'],\n    classNameBindings: ['field.key', 'fieldTypeClass', 'isEmpty:empty-field', 'isNewField:new-field-entry-component'],\n\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n\n    entity: null,\n\n    allFieldData: [],\n\n    fieldData: null,\n    field: computed.reads('fieldData.field'),\n    writeable: computed.reads('fieldData.writeable'),\n    isValid: computed.reads('fieldData.isValid'),\n    isEmpty: computed.alias('fieldData.isEmpty'),\n\n    editing: false,\n    showLabel: false,\n\n    isNewField: false,\n    savingField: false,\n\n    complexField: false,\n    complexValueFields: [], // Override complex fields for simple 'entry.value' bindings to fire\n\n    timers: null,\n\n    attrs: {\n        cancelAddNew: () => {}\n    },\n\n    init() {\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.attachObserversForComplexFields();\n    },\n\n    willDestroyElement() {\n        this.timers.forEach(timer => Ember.run.cancel(timer));\n        this.timers = [];\n\n        this._super(...arguments);\n    },\n\n    entry: computed('fieldData.value', 'fieldData.valueReference', function () {\n        return this.get('fieldData.value') || this.get('fieldData.valueReference');\n    }),\n\n    fieldTypeClass: computed('field.type', function () {\n        return `${this.get('field.type')}-field`;\n    }),\n\n    canEdit: computed('editing', 'fieldData.writeable', function () {\n        var editing = this.get('editing');\n\n        if (!editing) {\n            return DS.PromiseObject.create({\n                promise: Ember.RSVP.resolve(false)\n            });\n        }\n\n        return this.get('fieldData.writeable');\n    }),\n\n    attachObserversForComplexFields() {\n        var fields = this.get('complexValueFields');\n        if (_.isEmpty(fields)) {\n            return;\n        }\n\n        _.each(fields, field => {\n            this.addObserver(field, this, this.notifyComplexPropertyChange);\n        });\n    },\n\n    isFieldEmpty() {},\n\n    notifyComplexPropertyChange() {\n        run.once(this, this.performNotification);\n    },\n\n    performNotification() {\n        let fieldData = this.get('fieldData');\n        if (fieldData) {\n            fieldData.notifyPropertyChange('isEmpty');\n            fieldData.notifyPropertyChange('isValid');\n        }\n    },\n\n    // Called before save\n    cleanFieldForSave: () => {},\n\n    // Override for empty logic check for complex fields\n    isComplexFieldEmpty() {\n        return false;\n    },\n\n    saveField(value) {\n        if (this.get('savingField')) {\n            return new RSVP.Promise(function (resolve) {\n                resolve({});\n            });\n        }\n\n        const entity = this.get('entity');\n        const fieldPath = this.get('field').getFieldPath();\n\n        if (value || value === '') {\n            this.set('entry.value', value);\n            entity.set(fieldPath, value);\n        }\n\n        this.set('savingField', true);\n\n        const section = this.get('field.section');\n        if (section) {\n            return entity.saveSection(section).finally(() => this.set('savingField', false));\n        }\n        return entity.save();\n    }\n});\n","import Ember from 'ember';\nimport moment from 'connections-ui/utils/dates';\n\nexport default Ember.Mixin.create({\n    notification: Ember.inject.service('notification-proxy'),\n    intl: Ember.inject.service(),\n    phone: Ember.inject.service(),\n\n    didFlag: Ember.computed.bool('flaggedSelves.length'),\n    flagOperationInProcess: false,\n\n    flaggedSelves: Ember.computed('call.participants.@each.flaggedReason', 'call.myGuid', function () {\n        let myParticipants = this.get('call.participants');\n        if (!myParticipants) {\n            return [];\n        }\n        let myGuid = this.get('call.myGuid');\n        let myFlaggedParticipants = myParticipants.filter(\n            participant => participant.user && participant.user.id === myGuid && participant.flaggedReason\n        );\n        return myFlaggedParticipants;\n    }),\n\n    // allow flagging/unflagging calls for 45 minutes from end time (analytics service's window for accepting new events for a call is 60 minutes)\n    allowFlagChange: Ember.computed('call.callEnd', 'clock.minute', function () {\n        let minutesPassed = moment().diff(this.get('call.callEnd'), 'minutes');\n        return minutesPassed < 45;\n    }),\n\n    flagInteractionAction(action) {\n        if (this.get('allowFlagChange')) {\n            this.set('flagOperationInProcess', true);\n            const participants = action === 'flag' ? [this.get('call.myParticipant')] : this.get('flaggedSelves');\n            this.get('phone')\n                .flagCallHistoryInteraction(action, this.get('call'), participants)\n                .then(() => {\n                    this.set('flagOperationInProcess', false);\n                });\n        } else {\n            const message = this.get('intl').lookup('notification.purecloud.tooLateToFlag');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Mixin from 'smoke-and-mirrors/mixins/in-viewport';\n\nexport default Mixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\n// ==========================================================\n// NOTICE: This mixin is intended to be consumed by the\n// Interaction component. It inherits servies injects and\n// dependencies from the parent component.\n// ==========================================================\n//\n// Rules for showing/hiding/disabling session share button\n//\n// 1. If the agent has session share permissions then the\n// session share button should be visible (it may be disabled\n// when end customer's browser cannot support screen share).\n//\n// 2. If the agent has session share permissions and the end\n// user is using Firefox - button is enabled.\n//\n// 3. If the agent has session share permissions and the end\n// user is using Chrome AND has the screen share extension\n// installed - button is enabled.\n//\n// 4. If the agent has session share permissions and the end\n// user is using any browser except Firefox or Chrome the\n// screen share button is disabled with tooltip.\n//\n// 5. If the agent has session share permissions and the end\n// user is using Chrome but does NOT have the screen share\n// extension, button is disabled with tooltip.\n//\n// ==========================================================\n\nexport default Ember.Mixin.create({\n    // Configuration\n\n    customerBrowserDetails: computed(\n        'interaction.customerDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,cobrowseType,standAloneApplication,canScreenshare,canCobrowse}',\n        function () {\n            const customerDetails = this.get('interaction.customerDetails');\n\n            if (!customerDetails) {\n                return {};\n            }\n\n            // because the object we get has stringified the boolean values, need to convert these to true and false\n            const isChrome = Ember.get(customerDetails, 'isChrome') === 'true' ? true : false;\n            const isFirefox = Ember.get(customerDetails, 'isFirefox') === 'true' ? true : false;\n            const isEdgeChromium = Ember.get(customerDetails, 'isEdgeChromium') === 'true' ? true : false;\n            const hasChromeExtension = Ember.get(customerDetails, 'hasChromeExtension') === 'true' ? true : false;\n            const isStandAloneApplication =\n                Ember.get(customerDetails, 'standAloneApplication') === 'true' ? true : false;\n            const canScreenshare = Ember.get(customerDetails, 'canScreenshare') === 'true' ? true : false;\n            const canCobrowse = Ember.get(customerDetails, 'canCobrowse') === 'true' ? true : false;\n            const cobrowseType = Ember.get(customerDetails, 'cobrowseType') || canCobrowse ? true : false;\n            return {\n                isChrome,\n                isFirefox,\n                isEdgeChromium,\n                hasChromeExtension,\n                cobrowseType,\n                isStandAloneApplication,\n                canScreenshare,\n                canCobrowse\n            };\n        }\n    ),\n\n    isCustomerConfiguredForCobrowse: computed.or(\n        'customerBrowserDetails.cobrowseType',\n        'customerBrowserDetails.canCobrowse'\n    ),\n\n    isCustomerConfiguredForScreenShare: computed(\n        'interaction.isV2Provider',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            // screenshare is not supported for v2 providers\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            if (\n                Ember.get(customerBrowserDetails, 'canScreenshare') ||\n                Ember.get(customerBrowserDetails, 'isFirefox') ||\n                (Ember.get(customerBrowserDetails, 'isChrome') &&\n                    Ember.get(customerBrowserDetails, 'hasChromeExtension')) ||\n                Ember.get(customerBrowserDetails, 'isEdgeChromium') ||\n                Ember.get(customerBrowserDetails, 'isStandAloneApplication')\n            ) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    screenShareMisconfiguration: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isAgentAllowedToScreenShare',\n        function () {\n            return this.get('isCustomerConfiguredForScreenShare') === !this.get('isAgentAllowedToScreenShare');\n        }\n    ),\n\n    cobrowseMisconfiguration: computed('isCustomerConfiguredForCobrowse', 'isAgentAllowedToCobrowse', function () {\n        return this.get('isCustomerConfiguredForCobrowse') === !this.get('isAgentAllowedToCobrowse');\n    }),\n\n    // Permissions & Feature Toggles\n\n    canCobrowseChat: computed.reads('permissions.canViewAcdCoBrowseForChat'),\n    canCobrowseCall: computed.reads('permissions.canViewAcdCoBrowseForCall'),\n\n    isAgentAllowedToCobrowseCall: computed.and('isCall', 'canCobrowseCall'),\n    isAgentAllowedToCobrowseChat: computed.and('isChat', 'canCobrowseChat'),\n    isAgentAllowedToCobrowse: computed.or('isAgentAllowedToCobrowseCall', 'isAgentAllowedToCobrowseChat'),\n\n    canScreenShare: computed.reads('permissions.canViewAcdScreenShare'),\n\n    isAgentAllowedToScreenShareCall: computed.and('isCall', 'canScreenShare'),\n    isAgentAllowedToScreenShareChat: computed.and('isChat', 'canScreenShare'),\n    isAgentAllowedToScreenShare: computed.or('isAgentAllowedToScreenShareCall', 'isAgentAllowedToScreenShareChat'),\n\n    // Tooltips\n\n    sessionShareStartVideoTooltip: computed('webrtc.activeBridge', function () {\n        if (!this.get('webrtc.activeBridge')) {\n            return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n        }\n        return 'purecloud.acdInteraction.sessionShare.startVideo';\n    }),\n\n    sessionShareStartTooltip: computed(\n        'webrtc.{activeBridge,screenShareViaHawk}',\n        'disableShareButtonReason',\n        'customerBrowserDetails.isStandAloneApplication',\n        'interaction.canScreenShare',\n        function () {\n            const canScreenShareViaHawk =\n                this.get('interaction.canScreenShare') && this.get('webrtc.screenShareViaHawk');\n            /* if we cannot screen share via hawk, we need to check the activeBridge */\n            if (!canScreenShareViaHawk && !this.get('webrtc.activeBridge')) {\n                return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n            } else if (this.get('disableShareButtonReason') && this.get('isChat')) {\n                return this.get('disableShareButtonReason');\n            } else if (this.get('customerBrowserDetails.isStandAloneApplication') && this.get('isChat')) {\n                return 'purecloud.acdInteraction.sessionShare.customerUsingStandAloneApplication';\n            }\n            return 'purecloud.acdInteraction.sessionShare.start';\n        }\n    ),\n\n    webMessagingCobrowseStartTooltip: computed(\n        'interaction.cobrowseSessionShareActive',\n\n        function () {\n            if (!this.get('interaction.cobrowseSessionShareActive')) {\n                return 'purecloud.acdInteraction.cobrowseNext.startCobrowse';\n            }\n            return 'purecloud.acdInteraction.sessionShare.screenShareActive';\n        }\n    ),\n\n    // Session Share State\n\n    isCoBrowse: computed.bool('interaction.isCoBrowse'),\n\n    isRequestingScreenShareOrCoBrowse: computed.alias('interaction.isRequestingScreenShareOrCoBrowse'),\n    isRequestingVideo: computed.alias('interaction.isRequestingVideo'),\n\n    isAgentDisconnectedFromSharedSession: computed.reads('interaction.isAgentDisconnectedFromSharedSession'),\n    isCustomerDisconnectedFromSharedSession: computed.reads('interaction.isCustomerDisconnectedFromSharedSession'),\n\n    isSessionCodeRequired: computed.alias('interaction.isSessionCodeRequired'),\n\n    // Button Enablement\n\n    disableShareButtonReason: computed(\n        'screenShareMisconfiguration',\n        'cobrowseMisconfiguration',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            const isConfigured =\n                this.get('isCustomerConfiguredForCobrowse') ||\n                this.get('isCustomerConfiguredForScreenShare') ||\n                this.get('customerBrowserDetails.isStandAloneApplication');\n\n            if (!customerBrowserDetails || isConfigured) {\n                return false;\n            }\n\n            if (this.get('screenShareMisconfiguration')) {\n                if (\n                    Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'hasChromeExtension')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.noChromeExtension';\n                }\n                if (\n                    !Ember.get(customerBrowserDetails, 'isFirefox') &&\n                    !Ember.get(customerBrowserDetails, 'isChrome') &&\n                    !Ember.get(customerBrowserDetails, 'isEdgeChromium')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.notUsingSupportedBrowser';\n                }\n            } else if (this.get('cobrowseMisconfiguration')) {\n                return 'purecloud.acdInteraction.sessionShare.error.notConfiguredForCobrowse';\n            }\n        }\n    ),\n\n    disableVideoButton: computed.bool('interactionService.hasActiveSessionShare'),\n\n    disableShareButton: computed(\n        'disableVideoButton',\n        'isCustomerConfiguredForCobrowse',\n        'isCustomerConfiguredForScreenShare',\n        'interaction.isV2Provider',\n        function () {\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n            return (\n                this.get('disableVideoButton') ||\n                !(this.get('isCustomerConfiguredForCobrowse') || this.get('isCustomerConfiguredForScreenShare'))\n            );\n        }\n    ),\n\n    shouldShowSessionShareButton: computed(\n        'interaction.isV2Provider',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedToCobrowse',\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        function () {\n            // session-share is not supported for v2 widgets or for MCB participants\n            if (\n                this.get('interaction.isV2Provider') ||\n                this.get('interaction.myselfIsMonitor') ||\n                this.get('interaction.myselfIsCoach')\n            ) {\n                return false;\n            }\n            // Show the button if agent has either permission\n            return this.get('isAgentAllowedToScreenShare') || this.get('isAgentAllowedToCobrowse');\n        }\n    ),\n\n    enableAcdSessionShare: computed(\n        'isConnected',\n        'isCall',\n        'isChat',\n        'interaction.onConsult',\n        'isInternalProvider',\n        function () {\n            const isInternalProvider = this.get('isInternalProvider');\n            return (\n                isInternalProvider &&\n                (this.get('isCall') || this.get('isChat')) &&\n                this.get('isConnected') &&\n                !this.get('interaction.onConsult')\n            );\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    acdVoicemailTooltip: computed('acdVoicemailPlayerVisible', function () {\n        if (!this.get('acdVoicemailPlayerVisible')) {\n            return 'purecloud.acdInteraction.voicemail.showAudioPlayer';\n        }\n        return 'purecloud.acdInteraction.voicemail.hideAudioPlayer';\n    }),\n\n    holdTooltipTitle: computed('interaction.isHeld', function () {\n        if (this.get('interaction.isHeld')) {\n            return 'purecloud.acdInteraction.unhold';\n        }\n        return 'purecloud.acdInteraction.hold';\n    }),\n\n    muteTooltipTitle: computed('interaction.conversation.isMuted', function () {\n        if (this.get('interaction.conversation.isMuted')) {\n            return 'purecloud.acdInteraction.unmute';\n        }\n        return 'purecloud.acdInteraction.mute';\n    }),\n\n    scriptToolTip: computed('disabledScriptButton', function () {\n        if (this.get('disabledScriptButton')) {\n            return 'purecloud.acdInteraction.scriptsNotAvailable';\n        }\n        return 'purecloud.acdInteraction.scripts';\n    }),\n\n    skipACWTooltipTitle: computed('interaction.isCommunicationAfterCallWorkRequested', function () {\n        if (this.get('interaction.isCommunicationAfterCallWorkRequested')) {\n            return 'purecloud.acdInteraction.skipACW';\n        }\n        return 'purecloud.acdInteraction.requestACW';\n    })\n});\n","import Ember from 'ember';\n\nvar currentJobs = [];\nvar finishedJobs = [];\n\nfunction jobEndpoint(id) {\n    return `/api/v2/jobs/${id}`;\n}\n\nexport default Ember.Mixin.create({\n    ajax: Ember.inject.service(),\n\n    _currentJobs: currentJobs,\n    _finishedJobs: finishedJobs,\n\n    addJob: function (job, callback, scope) {\n        if (job) {\n            job.callback = callback;\n            job.scope = scope || this;\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 5000);\n\n            currentJobs.addObject(job);\n        }\n    },\n\n    getJobData: function (job) {\n        return this.get('ajax')\n            .ajaxGet(jobEndpoint(job.jobId))\n            .then(\n                data => {\n                    data = data.res;\n\n                    var retryJobId = data.retryJobId;\n\n                    if (data.status !== 'in-progress' && data.status !== 'pending') {\n                        window.clearInterval(job.interval);\n\n                        if (data.status === 'retry') {\n                            job.jobId = retryJobId;\n                            this.handleJob(job);\n                        } else if (job.status === 'failed') {\n                            currentJobs.removeObject(job);\n                            finishedJobs.addObject(job);\n\n                            job.callback.apply(job.scope, [job]);\n                        } else {\n                            currentJobs.removeObject(job);\n                            finishedJobs.addObject(job);\n\n                            job.callback.apply(job.scope, [job]);\n                        }\n                    }\n                },\n                function () {\n                    window.clearInterval(job.interval);\n\n                    currentJobs.removeObject(job);\n                    finishedJobs.addObject(job);\n\n                    job.callback.apply(job.scope, [job]);\n                }\n            );\n    }\n});\n","define(\"connections-ui/mixins/logger\", [\"exports\", \"ember-purecloud-components/mixins/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    actions: {\n        error(error) {\n            const errorState = { type: 'profileFetchServerFailure' };\n\n            Ember.Logger.error(error);\n\n            if (error && error.errors) {\n                error = _.head(error.errors);\n            }\n\n            if (error) {\n                let code = error.code;\n                if (typeof error.status === 'number') {\n                    code = error.status;\n                }\n                if (code >= 400 && code < 500) {\n                    this.transitionTo('index');\n                } else if (error.status >= 500) {\n                    this.set('application.errorState', errorState);\n                    this.transitionTo('maintenance');\n                }\n            } else if (!error) {\n                this.set('application.errorState', errorState);\n                this.transitionTo('maintenance');\n            }\n        }\n    }\n});\n","import Ember from 'ember';\n\nvar PagingMixin = Ember.Mixin.create({\n    entityType: null,\n\n    currentPage: null,\n    cachedTotal: null,\n\n    limit: 10,\n    extraParams: Ember.computed(function () {\n        return {};\n    }),\n\n    fieldList: null,\n\n    actions: {\n        nextPage() {\n            if (this.get('hasNextPage')) {\n                this.incrementProperty('currentPage');\n                this.loadPage();\n            }\n        },\n\n        prevPage() {\n            if (this.get('hasPrevPage')) {\n                this.decrementProperty('currentPage');\n                this.loadPage();\n            }\n        }\n    },\n\n    ensureCorrectProperties: Ember.on('init', function () {\n        if (!this.get('entityType')) {\n            this.set('entityType', 'person');\n        }\n\n        this.set('currentPage', 0);\n        this.set('cachedTotal', 0);\n    }),\n\n    offset: Ember.computed('limit', 'currentPage', function () {\n        return this.get('limit') * this.get('currentPage');\n    }),\n\n    currentPageDisplay: Ember.computed('currentPage', function () {\n        return this.get('currentPage') + 1;\n    }),\n\n    totalPages: Ember.computed('currentPage', 'content.[]', 'page', 'cachedTotal', function () {\n        var cachedTotal = this.get('cachedTotal') || 0;\n\n        return Math.ceil(cachedTotal / this.get('limit'));\n    }),\n\n    hasNextPage: Ember.computed('currentPageDisplay', 'totalPages', function () {\n        return this.get('currentPageDisplay') < this.get('totalPages');\n    }),\n\n    hasPrevPage: Ember.computed('currentPage', function () {\n        return this.get('currentPage') !== 0;\n    }),\n\n    haveContent: Ember.computed('content.[]', 'currentPage', function () {\n        var content = this.get('content');\n        if (content) {\n            return content.get('length') > 0;\n        }\n\n        return false;\n    }),\n\n    loadPage() {\n        let directory = true;\n        let entityType = this.get('entityType');\n        let extraParams = this.get('extraParams');\n\n        let letterUpdate = {};\n        if (entityType === 'group') {\n            letterUpdate = {\n                letter: null\n            };\n        }\n\n        let params = Object.assign(\n            {},\n            {\n                limit: this.get('limit'),\n                offset: this.get('offset'),\n                directory: directory\n            },\n            extraParams,\n            letterUpdate\n        );\n\n        if (this.get('fieldList')) {\n            params = Object.assign({}, params, {\n                fl: this.get('fieldList')\n            });\n        }\n\n        let page = this.store.query(entityType, params);\n\n        page.then(data => {\n            let content = data;\n            if (data.content) {\n                content = data.content;\n            }\n\n            content = content.map(x => x.getRecord());\n\n            this.set('content', content);\n\n            let cachedTotal = Ember.get(data, 'meta.count');\n            if (cachedTotal > 0) {\n                this.set('cachedTotal', cachedTotal);\n            }\n\n            return content;\n        });\n\n        this.set('page', page);\n\n        return page;\n    }\n});\n\nexport default PagingMixin;\n","import Ember from 'ember';\n\nconst { computed } = Ember;\n\nexport default Ember.Mixin.create({\n    activeCall: null,\n    isHeld: computed.reads('activeCall.isHeld'),\n    isMuted: computed.reads('activeCall.isMuted'),\n    isRecording: computed.reads('activeCall.isRecording'),\n    isActiveCallACD: computed('activeCall.{isAgentCall,myselfIsMonitor,myselfIsCoach,myselfIsBarged}', function () {\n        if (!this.get('activeCall')) {\n            return false;\n        }\n        return (\n            this.get('activeCall.isAgentCall') &&\n            !this.get('activeCall.myselfIsMonitor') &&\n            !this.get('activeCall.myselfIsCoach') &&\n            !this.get('activeCall.myselfIsBarged')\n        );\n    }),\n    isOutsideCall: computed('activeCall.otherParty.purpose', function () {\n        const purpose = this.get('activeCall.otherParty.purpose');\n        return purpose === 'external';\n    }),\n    myself: computed('activeCall.myself', function () {\n        // TODO: can this be removed?\n        return this.get('activeCall.myself');\n    }),\n    onCall: computed.reads('activeCall.onCall'),\n    setActiveCall(conversation) {\n        this.set('activeCall', conversation);\n        this.notifyPropertyChange('activeCall');\n    },\n    cleanupActiveCall() {\n        return this.setActiveCall(null);\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport { task, timeout } from 'ember-concurrency';\nimport AutoSaveDevicesMixin from 'ember-webrtc-components/mixins/webrtc-service/auto-save-devices';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\n\nconst CALL_CONVERSATION_CREATED_EVENT = 'callConversationCreated';\n\nconst Promise = Ember.RSVP.Promise;\nconst { run, inject, observer } = Ember;\n\nexport default Ember.Mixin.create(AutoSaveDevicesMixin, {\n    headset: inject.service(),\n    session: inject.service(),\n    webrtc: inject.service(),\n    phone: inject.service(),\n    store: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    // temp variables for user actions (merging, dialing)\n    attemptingToCall: null,\n    shouldPromptForMerge: false,\n    callToMergeInto: null,\n    mergeData: null,\n\n    deviceMuteEvent(isMuted) {\n        const call = this.get('activeCall');\n        if (call && this.get('isMuted') !== isMuted) {\n            this.mute(call);\n        }\n    },\n\n    deviceHoldEvent(holdRequested, toggle) {\n        const call = this.get('activeCall');\n        if (!call) {\n            return;\n        }\n\n        // this is because jabra sends an unmute request after the call ends. Presumably to get the headset in a vanilla state\n        if (toggle && !call.get('isConnected')) {\n            return;\n        }\n\n        if (toggle || call.get('isHeld') !== holdRequested) {\n            this.hold(call);\n        }\n    },\n\n    deviceCallRejectedEvent(conversationId) {\n        let conversation;\n        if (conversationId) {\n            conversation = this.get('conversations').findBy('id', conversationId);\n        } else {\n            conversation = this.get('conversations').find(conversation => {\n                return conversation.get('isDialing') && conversation.get('isIncoming');\n            });\n        }\n\n        this.sendToVoicemail(conversation);\n    },\n\n    init() {\n        this._super(...arguments);\n        run.next(() => {\n            if (this.get('webrtcSdkService.useSdk')) {\n                this.enableHeadsets(this.get('webrtcSdkService'));\n            } else {\n                this.enableHeadsets(this.get('headset'));\n            }\n        });\n    },\n\n    changeHeadsetSource: observer('webrtcSdkService.useSdk', function () {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.enableHeadsets(this.get('webrtcSdkService'));\n        }\n    }),\n\n    enableHeadsets(headsetSource) {\n        const headset = headsetSource;\n        headset.on('deviceMuteStatusChanged', isMuted => {\n            this.deviceMuteEvent(isMuted);\n        });\n        headset.on('deviceHoldStatusChanged', (holdRequested, toggle) => {\n            this.deviceHoldEvent(holdRequested, toggle, true);\n        });\n        headset.on('deviceRejectedCall', conversationId => {\n            this.deviceCallRejectedEvent(conversationId, true);\n        });\n    },\n\n    callVoicemail() {\n        return this.makeCall('*86');\n    },\n\n    _handleValidationError(error) {\n        const validationError = {\n            valid: false,\n            validationError: error\n        };\n        this.logger.warn('Call validation failed', validationError);\n        return Promise.reject('Call validation failed', validationError);\n    },\n\n    webrtcPhoneWithIssues: Ember.computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    _validateCall(phoneNumber, callingPerson, onbehalfOfQueue) {\n        if (this.get('station.isWebrtc')) {\n            if (!this.get('carrierPigeonConnected')) {\n                this.get('notification').error(\n                    null,\n                    this.get('intl').lookup('notification.purecloud.webrtcPhoneUnavailable'),\n                    {\n                        hideAfter: 5,\n                        tag: 'webrtc-phone-unavailable'\n                    }\n                );\n\n                return this._handleValidationError('Station is webrtc and carrier pigeon is not connected');\n            } else if (this.get('webrtcPhoneWithIssues')) {\n                const intl = this.get('intl');\n                const title = intl.t('notification.titles.callError').toString();\n                const message = intl.t(this.get('webrtc.webrtcAudioCallIssueKey'));\n                this.get('notification').info(title, message);\n                return this._handleValidationError('Station is webrtc and has audio issues');\n            }\n        }\n\n        let message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n        if (this.get('onQueue') && (!onbehalfOfQueue || !onbehalfOfQueue.id)) {\n            message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n        let station = this.get('station');\n        let noStation = station === undefined || station === null;\n        if (noStation) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.noStationSelected');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('No station selected');\n        }\n        if (this.get('phoneDisabled')) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.get('intl').lookup('notification.purecloud.unsupportedStation');\n            this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('Phone service disabled');\n        }\n        return Promise.resolve();\n    },\n\n    _throttledHoldOtherConversations: task(function* (data) {\n        this._holdOtherActiveConversations(data);\n        yield timeout(1000);\n    }).drop(),\n\n    // Handles errors by logging and notifying the user, but re-throws the error for consumers\n    // to handle if they want to\n    _makeCall(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId) {\n        if (callingPerson && !_.isEmpty(callingPerson)) {\n            this.set('attemptingToCall', callingPerson);\n        } else {\n            this.set('attemptingToCall', phoneNumber);\n        }\n\n        let url;\n        let data = {};\n        let key = 'phoneNumber';\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'person') {\n            key = 'callUserId';\n        }\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'queue') {\n            key = 'callQueueId';\n        }\n        // if phoneNumber is a string, we can safely skip the formatting\n        // otherwise, the format method is required here to return an id\n        // or number from the model (phoneNumber).\n        if (typeof phoneNumber !== 'string') {\n            phoneNumber = this.get('addressformat').format(phoneNumber);\n        } else if (_.startsWith(phoneNumber, 'sip:')) {\n            phoneNumber = this.get('addressformat').formatSipAddress(phoneNumber);\n        }\n        data[key] = phoneNumber;\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        url = this.pcUri(`api/v2/conversations/calls`);\n        if (onbehalfOfQueue && onbehalfOfQueue.id) {\n            data.callFromQueueId = onbehalfOfQueue.id;\n        }\n        if (phoneNumber === undefined || phoneNumber === null) {\n            let message = this.get('intl').lookup('notification.purecloud.unableToMakeCall');\n            const error = Error('Failed to make call: PhoneNumber is not defined');\n\n            this.logger.error(error.message, error);\n            this.showErrorNotification({ message }, error);\n            return Ember.RSVP.Promise.reject(error);\n        }\n\n        let promise;\n\n        // if this is a webrtc call, place it through the sdk\n        if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n            promise = this.get('webrtcSdkService').startSoftphoneSession(data);\n        } else {\n            const options = { data: data, contentType: 'application/json' };\n            promise = this.makeRequest(url, options, 'post');\n        }\n\n        return promise\n            .then(data => {\n                this.get('conversationsMadeByClient').pushObject(data);\n                data.attemptingToCall = this.get('attemptingToCall');\n                const conversation = this.updateActiveConversationEntry(data);\n\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').outgoingCall({ conversationId: data.id });\n                }\n\n                if (onbehalfOfQueue && data && data.id) {\n                    this.trigger(CALL_CONVERSATION_CREATED_EVENT, { conversationId: data.id });\n                }\n\n                if (this.get('station.isWebrtc')) {\n                    // TODO: shouldnt this be automatic with we place a call?\n                    this.get('_throttledHoldOtherConversations').perform(data);\n                }\n\n                return conversation || { id: data.id };\n            })\n            .catch(err => {\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n\n                this.logger.error('Error making request to place call', { data, url, err });\n                this.showErrorNotification(responseJSON, err);\n                return Ember.RSVP.Promise.reject(err);\n            });\n    },\n\n    // helper service method to validate and make a call, handling errors by notifying the user.\n    // Returns a promise that does not reject. All errors are handled and notified to user\n    // To consume the error from validation or placing call, call _validateCall and _makeCall directly\n    makeCall(/*phoneNumber, callingPerson, onbehalfOfQueue*/) {\n        const callArgs = arguments;\n        return this._validateCall(...callArgs).then(() => {\n            return this._makeCall(...callArgs);\n        });\n    },\n\n    /**\n       @desc Starts a call with the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async callPersonById(id) {\n        if (!this.get('phoneAvailable')) {\n            return;\n        }\n\n        const person = await this.get('store').findRecord('person', id);\n        return this.makeCall(person);\n    },\n\n    mergeCalls(conversations) {\n        const conferences = _.filter(conversations, function (conversation) {\n            return conversation.get('onConference');\n        });\n        const data = {\n            conversationIds: []\n        };\n        const recordings = _.filter(conversations, function (conversation) {\n            return conversation.get('isRecording');\n        });\n        let callsToMerge, callToMergeInto;\n        if (conferences.length > 1) {\n            Ember.Logger.warn('phone service: You cannot merge two conferences');\n            return;\n        } else if (conferences.length === 1) {\n            callToMergeInto = _.head(conferences);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation.get('onConference');\n            });\n            if (recordings.length && callToMergeInto.get('isRecording') !== true) {\n                this.set('shouldPromptForMerge', true);\n                Ember.Logger.warn('Your recording will end when merging a recording call into a conference call');\n            }\n        } else if (recordings.length > 0) {\n            callToMergeInto = _.head(recordings);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        } else {\n            callToMergeInto =\n                conversations.findBy('id', this.get('activeCall.id')) || conversations.findBy('isIncoming', false);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        }\n        _.each(callsToMerge, function (conversation) {\n            return data.conversationIds.push(conversation.id);\n        });\n        this.set('mergeData', data);\n        this.set('callToMergeInto', callToMergeInto);\n        if (this.get('shouldPromptForMerge') === false) {\n            return this.makeMergeRequest();\n        }\n    },\n\n    toVoicemail(conversation) {\n        Ember.deprecate('Please use \"service:phone/sendToVoicemail\" for sending a call to voicemail', false, {\n            id: 'directory-core.deprecate-old-phone-service-methods',\n            until: '8.0.0',\n            url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md#markdown-header-old-phone-service-methods'\n        });\n        this.sendToVoicemail(conversation);\n    },\n\n    _throttledHandlePhoneStatusChange: task(function* () {\n        this.handlePhoneStatusChange(...arguments);\n        yield timeout(1000);\n    }).drop(),\n\n    sendToVoicemail(conversation) {\n        if (conversation) {\n            this.get('_throttledHandlePhoneStatusChange').perform('sendToVoicemail', conversation);\n            !this.get('webrtcSdkService.useSdk') &&\n                this.get('headset').endCall(conversation.get('id'), this.get('connectedConversations.length') > 1);\n        }\n    },\n\n    makeMergeRequest() {\n        const callId = this.get('callToMergeInto.id');\n        const uri = this.communicationUri(callId, 'calls');\n        const data = this.get('mergeData');\n        return this.makeRequest(uri, { data }, 'patch').finally(() => {\n            return this.clearMergeData();\n        });\n    },\n\n    clearMergeData() {\n        this.set('mergeData', null);\n        this.set('callToMergeInto', null);\n        return this.set('shouldPromptForMerge', false);\n    },\n\n    makeConferenceCall(parties, queue) {\n        const uri = this.pcUri(`api/${this.get('convAPIVersion')}/conversations/calls`);\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { queueId: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        if (queue && queue.id) {\n            options.data.callFromQueueId = queue.id;\n        }\n\n        return this.makeRequest(uri, options, 'post')\n            .then(json => {\n                this.get('conversationsMadeByClient').pushObject(json);\n            })\n            .catch(err => {\n                Ember.Logger.error('Error making conference call number', { uri, error: err });\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n                return this.showErrorNotification(responseJSON, err);\n            });\n    },\n\n    bulkAddParticipants(parties) {\n        const callId = this.get('activeCall').id;\n        const uri = `${this.communicationUri(callId, 'calls')}/participants`;\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { address: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    blindTransfer(participant) {\n        const isNumber = typeof participant.value === 'string';\n        const myselfId = this.get('myself.id');\n        const callId = this.get('activeCall.id');\n        const participantEntity = Ember.get(participant, 'entity');\n        const url = this.replaceUri(callId, myselfId, null, 'calls');\n        const isQueue = participant ? Ember.get(participant, 'entity.type') === 'queue' : false;\n        let data = {};\n\n        if (isNumber) {\n            data.address = participant.value;\n        } else if (isQueue) {\n            data.queueId = participant.id;\n        } else {\n            const personGuid = Ember.get(participantEntity, 'guid');\n            data.userId = personGuid;\n        }\n\n        const options = { data };\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this._handleCallTransferred();\n        });\n    },\n\n    _handleCallTransferred(interaction) {\n        // if the call gets routed back to the client later, we don't want it to appear already answered or placed by the client\n        const conversationId = interaction ? Ember.get(interaction, 'id') : this.get('activeCall.id');\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            Ember.set(conversation, 'acceptedByClient', false);\n            Ember.set(conversation, 'shouldAutoProceedWebrtc', false);\n        }\n        if (interaction) {\n            Ember.set(interaction, 'acceptedByClient', false);\n            Ember.set(interaction, 'shouldAutoProceedWebrtc', false);\n        }\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const placedConversation = conversationsMadeByClient.findBy('id', conversationId);\n        if (placedConversation) {\n            conversationsMadeByClient.removeObject(placedConversation);\n        }\n    },\n\n    consultTransfer(destination) {\n        const activeCall = this.get('activeCall');\n        const isNumber = typeof destination.value === 'string';\n        const person = destination.entity;\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        const currentCallId = Ember.get(activeCall, 'id');\n        const otherPartyId = Ember.get(activeCall, 'otherParty.id');\n        let url = this.consultUri(currentCallId, otherPartyId, 'calls');\n        if (!isNumber && !isQueue) {\n            return this.get('store')\n                .find('person', Ember.get(person, 'guid'))\n                .then(party => {\n                    return this.initiateTransfer(party, url);\n                });\n        } else if (isQueue) {\n            return this.initiateTransfer(destination, url);\n        }\n        return this.initiateTransfer(destination.value, url);\n    },\n\n    initiateTransfer(destination, url) {\n        const isQueue = destination ? Ember.get(destination, 'entity.type') === 'queue' : false;\n        let addressee = {};\n        if (isQueue) {\n            addressee = { queueId: destination.id };\n        } else if (typeof destination !== 'string' && _.isEmpty(destination.phoneNumber)) {\n            addressee = { userId: destination.get('guid') };\n        } else if (typeof destination === 'string') {\n            addressee = { address: destination };\n        }\n        const options = { data: { destination: addressee } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    changeSpeakerForConsult(speakTo) {\n        const callId = this.get('activeCall.id');\n        const otherParty = this.get('activeCall.otherParties').find(function (party) {\n            return party.consultParticipantId != null;\n        });\n        const otherPartyId = Ember.get(otherParty, 'consultParticipantId');\n        const url = this.consultUri(callId, otherPartyId, 'calls');\n        const options = { data: { speakTo } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    endConsult() {\n        const currentCallId = this.get('activeCall.id');\n        const otherPartyId = this.get('activeCall.myself.consultParticipantId');\n        const url = this.generateConversationsUrl(currentCallId, otherPartyId, 'consult');\n        const options = { dataType: 'text' };\n        return this.makeRequest(url, options, 'DELETE');\n    },\n\n    dialDtmfNumber(currentCallId, participantId, number) {\n        Ember.assert(\n            'phone:dialDtmfNumber must take a conversation id as the first argument',\n            currentCallId !== undefined\n        );\n        Ember.assert(\n            'phone:dialDtmfNumber must take a participant id as the second argument',\n            participantId !== undefined\n        );\n\n        let uri = this.pcUri(\n            `api/${this.get('convAPIVersion')}/conversations/${currentCallId}/participants/${participantId}/digits`\n        );\n        this.logger.info('sendingDtmfTones', {\n            conversationId: currentCallId,\n            participantId,\n            number\n        });\n\n        this.get('ajax').post(uri, { data: { digits: number } });\n    },\n\n    _throttledAnswerWebrtc: task(function* (conversation) {\n        this._answerWebrtc(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswer: task(function* (conversation) {\n        this._answer(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswerSoftphoneConversation: task(function* (conversationId) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.get('webrtcSdkService').acceptPendingSession({ conversationId });\n        } else {\n            this.get('webrtc').answerSoftphoneConversation(conversationId);\n        }\n        yield timeout(1000);\n    }).drop(),\n\n    answer() {},\n\n    _answerWebrtc(conversation) {\n        const conversationId = conversation.get('id');\n        const session = this._findPendingSessionsByConversationId(conversationId);\n        if (session === undefined) {\n            if (this.get('stationHasPersistentConnection')) {\n                // This is a flag we can look at in case we end up getting proposes for this conversation *later*\n                Ember.set(conversation, 'shouldAutoProceedWebrtc', true);\n\n                this.logger.info('_answerWebrtc stationHasPersistentConnection', { conversationId });\n                const task = this.get('_throttledAnswer').perform(conversation);\n                return task;\n            }\n\n            this.logger.info('Conversation is waiting for session', { conversationId });\n            conversation.set('waitingForSession', true); // when the session comes in, this should auto accept.\n            return;\n        }\n\n        return this.get('_throttledAnswerSoftphoneConversation').perform(conversationId);\n    },\n\n    _answer(conversation) {\n        const conversationId = conversation.get('id');\n        this.logger.log('handling _answer status change for conversation', { conversationId });\n        this.handlePhoneStatusChange('answer', conversation)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'callState.state', 'CONNECTED');\n            })\n            .then(() => {\n                if (this.get('onQueue')) {\n                    return this.checkForNonACD(conversation);\n                }\n            })\n            .catch(() => {\n                const message = 'Failed to answer call: ' + conversationId;\n                const title = this.get('intl').t('notification.titles.callError');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    _throttledMute: task(function* (conversation) {\n        this._mute(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    mute(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            return this.get('_throttledMute').perform(conversation);\n        }\n    },\n\n    _mute(conversation) {\n        const isMuted = conversation.get('isMuted');\n        this.handlePhoneStatusChange('muted', conversation)\n            .then(() => {\n                // this.get('headset').setMute(!isMuted);\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').setMute(!isMuted);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isMuted', !isMuted);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.mute');\n                return this.get('notification').error(title, message);\n            });\n    },\n\n    /**\n     * @param {object | undefined | null} conversation the conversation to hold, if not provided `activeCall` will be used\n     * @param {boolean} skipHoldAll `true` if we should skip holding all of the other calls`\n     */\n    hold(conversation, skipHoldAll = false) {\n        // bypasses throttling and other seemingly uneeded checks\n        if (this.get('session.useMultipanel')) {\n            conversation = conversation || this.get('activeCall');\n            if (!conversation) {\n                return Ember.RSVP.Promise.resolve();\n            } else if (skipHoldAll) {\n                return this._held(conversation);\n            }\n\n            // if the conversation is held now, it's being unheld\n            // so if we're using webrtc, and there are more than one active\n            // call, we should hold all other calls that aren't already held\n            const isHeld = conversation.get('isHeld');\n            if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n                this._holdOtherActiveConversations(conversation);\n            }\n            return this._held(conversation);\n        }\n\n        // if the conversation is held now, it's being unheld\n        // so if we're using webrtc, and there are more than one active\n        // call, we should hold all other calls that aren't already held\n        const isHeld = conversation.get('isHeld');\n        if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n            this._holdOtherActiveConversations(conversation);\n        }\n        this.held(conversation);\n        return Ember.RSVP.Promise.resolve();\n    },\n\n    _holdOtherActiveConversations(conversation) {\n        const conversationId = Ember.get(conversation, 'id');\n        const otherConversations = this.get('connectedConversations').filter(c => c.get('id') !== conversationId);\n        otherConversations.forEach(otherConversation => {\n            if (!otherConversation.get('isHeld')) {\n                this._held(otherConversation);\n            }\n        });\n    },\n\n    held(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_throttledHeld').perform(conversation);\n        }\n    },\n\n    _throttledHeld: task(function* (conversation) {\n        this._held(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _held(conversation) {\n        const isHeld = conversation.get('isHeld');\n        return this.handlePhoneStatusChange('held', conversation)\n            .then(() => {\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.get('headset').setHold(conversation.get('id'), !isHeld);\n                }\n                return this.get('communication').validateActionSucceeded(conversation, 'isHeld', !isHeld);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hold');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    record(conversation) {\n        conversation = conversation || this.get('activeCall');\n        if (conversation) {\n            this.get('_throttledRecord').perform(conversation);\n        }\n    },\n\n    _throttledRecord: task(function* (conversation) {\n        this._record(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _record(conversation) {\n        const isRecording = conversation.get('isRecording');\n        this.handlePhoneStatusChange('recording', conversation)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'isRecording', !isRecording);\n            })\n            .catch(() => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.record');\n                this.get('notification').error(title, message);\n            });\n    },\n\n    flagActiveInteraction(action, conversation) {\n        const call = conversation || this.get('activeCall');\n        const participant = call.get('myself');\n        if (!participant) {\n            this.logger.info('No \"myself\" participant on the call when handling flag change', {\n                conversationId: Ember.get(call, 'id')\n            });\n            return Promise.reject(new Error('Self participant missing'));\n        }\n\n        const isFlagged = !!conversation.get('myself.flaggedReason');\n        this.logger.debug('isFlagged:', isFlagged);\n\n        return this._makeFlagChange(conversation, participant, action)\n            .then(() => {\n                return this.get('communication').validateActionSucceeded(conversation, 'myself.flaggedReason', [\n                    isFlagged ? undefined : 'general'\n                ]);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n                this.get('notification').error(title, message);\n                this.logger.warn('Failed to validate interaction flagging', {\n                    conversationId: Ember.get(conversation, 'id'),\n                    err\n                });\n            });\n    },\n\n    flagCallHistoryInteraction(action, conversation, participants) {\n        return Ember.RSVP.all(\n            participants.map(participant => {\n                return this._makeFlagChange(conversation, participant, action);\n            })\n        ).catch(err => {\n            const title = this.get('intl').t('notification.titles.callError');\n            const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.flag');\n            this.get('notification').error(title, message);\n            this.logger.warn('Failed to validate history interaction flagging', {\n                conversationId: Ember.get(conversation, 'id'),\n                err\n            });\n        });\n    },\n\n    _makeFlagChange(call, participant, action) {\n        let url = this.pcUri(`api/v2/conversations/${call.id}/participants/${participant.id}/flaggedreason`);\n\n        let type;\n        if (action === 'flag') {\n            type = 'PUT';\n        } else if (action === 'unflag') {\n            type = 'DELETE';\n        } else {\n            return Promise.reject(new Error('Unwanted action for changing flag'));\n        }\n\n        return this.makeRequest(url, {}, type).then(() => {\n            if (action === 'flag') {\n                Ember.set(participant, 'flaggedReason', 'general');\n            } else {\n                Ember.set(participant, 'flaggedReason', undefined);\n            }\n        });\n    },\n\n    endCall(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCall').perform(conversation);\n        }\n    },\n\n    /**\n     * Ends the conversation call for ALL participants included.\n     * @param {object} conversation The conversation to end\n     */\n    endCallForAll(conversation = this.get('activeCall')) {\n        if (conversation) {\n            return this.get('_throttledEndCallForAll').perform(conversation);\n        }\n    },\n\n    endCallById(conversationId) {\n        const conversation = this.get('conversations').findBy('id', conversationId);\n        if (conversation) {\n            return this.get('_throttledEndCall').perform(conversation);\n        }\n    },\n\n    _throttledEndCall: task(function* (conversation) {\n        this._endCall(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledEndCallForAll: task(function* (conversation) {\n        this._endCallForAll(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    async _endCall(conversation) {\n        return this.handlePhoneStatusChange('hangup', conversation)\n            .then(() => {\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('notification').error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    async _endCallForAll(conversation) {\n        return this.handlePhoneStatusChange('end', conversation)\n            .then(() => {\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n\n                const isDisconnected = Ember.get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(Ember.get(conversation, 'id'));\n                }\n\n                return this.get('communication').validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.get('intl').t('notification.titles.callError');\n                const message = this.get('intl').t('purecloud.acdInteraction.calls.errors.hangup');\n                this.get('notification').error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    /**\n     * All webrtc softphone calls are ended through here.\n     */\n    _endWebrtcCall(conversationId) {\n        if (this.get('stationHasPersistentConnection')) {\n            return;\n        }\n        if (this.get('station.isWebrtc') && conversationId) {\n            const data = {\n                conversationId,\n                conversationType: webrtcConversationTypes.SOFTPHONE,\n                // PCM-517 - this fallback disconnect was disconnecting conversations that\n                // got routed back to an agent after transfering to a queue, and were new, not old\n                pending: false, // don't end any new pending conversations\n                notAfter: new Date() // don't end any conversations created after now\n            };\n            // PCM-340 - pass false to throttle to run on tail end of the interval. This gives the API request to hangup\n            // one second to finish, before we explicitly tear down the connection. If the edge takes longer than\n            // one second to hangup, then we'll tear it down and the edge will detect an error, but that's expected\n            this.get('_throttledEndWebrtcCall').perform(data);\n        }\n    },\n\n    _throttledEndWebrtcCall: task(function* (data) {\n        yield timeout(1000);\n        this.get('webrtc').endConversation(data);\n    }).drop(),\n\n    handlePhoneStatusChange(action, conversation) {\n        return new Promise((resolve, reject) => {\n            const call = conversation || this.get('activeCall');\n            const participant = call.get('myself');\n            if (!participant) {\n                this.logger.info('No \"myself\" participant on the call when handling status change', {\n                    conversationId: Ember.get(call, 'id')\n                });\n                return reject(new Error('Self participant missing'));\n            }\n            let type = 'patch';\n            let url = this.pcUri(`api/v2/conversations/calls/${call.id}/participants/${participant.id}`);\n            let data, toggle;\n\n            // Used to end the entirety of the conversation. Implemented for `endForAll` in conferencing.\n            if (action === 'end') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n                url = this.generateConversationUrl(call.get('id'));\n            } else if (action === 'hangup') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n\n                const conversationWithError = this.get('userCallSessionsWithErrors').findBy(\n                    'id',\n                    conversation.get('id')\n                );\n                const callbackConnected = _.get(participant, 'callbacks[0].state', '').toLowerCase() === 'connected';\n                const callConnected = _.get(participant, 'calls[0].state', '').toLowerCase() === 'connected';\n\n                if (\n                    (callConnected && callbackConnected) ||\n                    (!callConnected && callbackConnected && conversationWithError)\n                ) {\n                    type = 'patch';\n                    const communicationId = _.get(participant, 'calls[0].id');\n                    url = this.generateCommunicationUrl(call.get('id'), participant.id, communicationId);\n                }\n            } else if (action === 'answer') {\n                data = {\n                    state: 'CONNECTED'\n                };\n            } else if (action === 'sendToVoicemail') {\n                type = 'post';\n                const query = {\n                    voicemail: true\n                };\n                url = this.replaceUri(call.get('id'), participant.id, null, 'calls');\n                data = query;\n            } else if (action === 'held') {\n                if (!Ember.get(conversation, 'isConnected')) {\n                    this.logger.debug(\n                        `Attempted to set hold state for non-connected conversation: ${conversation.get('id')}`\n                    );\n                    return Promise.resolve();\n                }\n\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            } else {\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            }\n\n            this.set('loading.' + action, true);\n            this.set('currentStatusChange', action);\n\n            if (!_.includes(['put', 'post', 'patch'], type)) {\n                reject();\n            }\n\n            this.makeRequest(url, { data }, type)\n                .then(response => {\n                    resolve(response);\n                })\n                .catch(({ jqXHR }) => {\n                    reject(jqXHR);\n\n                    if (jqXHR.status !== 202) {\n                        this.set(`loading.${action}`, false);\n                    }\n\n                    if (jqXHR.status === 403) {\n                        const response = JSON.parse(jqXHR.responseText);\n                        if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                            const title = this.get('intl').t('notification.titles.callError');\n                            const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                            return this.get('notification').error(title, message);\n                        }\n                    }\n                })\n                .finally(() => {\n                    return this.set('loading.' + action, false);\n                });\n        });\n    },\n\n    handleOtherParticipantStatusChange(action, participant) {\n        const call = this.get('activeCall');\n        const url = this.generateConversationsUrl(call.get('id'), participant.id);\n        let method = 'patch';\n        let data = {};\n\n        if (action === 'hangup') {\n            data.state = 'disconnected';\n        } else {\n            const toggle = _.head(participant.calls)[action];\n            data[action] = !toggle;\n        }\n\n        const options = { method, data: JSON.stringify(data) };\n        return this.makeRequest(url, options, 'raw')\n            .then(data => {\n                return Ember.Logger.debug('Other Status Change: ' + action, data);\n            })\n            .catch(({ jqXHR }) => {\n                if (jqXHR.status !== 202) {\n                    this.set('loading.' + action, false);\n                }\n\n                if (jqXHR.status === 403) {\n                    const response = JSON.parse(jqXHR.responseText);\n                    if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                        const title = this.get('intl').t('notification.titles.callError');\n                        const message = this.get('intl').t('notification.purecloud.lackRecordingPermission');\n                        return this.get('notification').error(title, message);\n                    }\n                }\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nexport default Ember.Mixin.create({\n    callForwardingActive: false,\n    callForwardingNumber: null,\n    callForwardingExtension: null,\n\n    fetchCallForwarding() {\n        if (this.get('canCallForward')) {\n            this.getCallForwarding()\n                .then(response => {\n                    return this._updateCallForwarding(response);\n                })\n                .catch(() => {\n                    this.set('callForwardingActive', false);\n                });\n        }\n    },\n\n    getCallForwarding() {\n        const url = this.get('application').pcV2Uri('api/v2/users/' + this.get('personGuid') + '/callForwarding');\n        return this.get('ajax').ajaxGet(url);\n    },\n\n    _updateCallForwarding(response) {\n        const enabled = _.isEmpty(response) ? false : response.enabled;\n        this.set('callForwardingActive', enabled);\n        const phoneNumber = response.phoneNumber;\n        const hasPhoneNumber = !_.isEmpty(phoneNumber);\n        if (hasPhoneNumber) {\n            if (_.startsWith(phoneNumber, ';ext=')) {\n                const re = /^;ext=(\\d{1,})$/;\n                const number = _.last(re.exec(phoneNumber));\n                this.set('callForwardingExtension', number);\n                return this.set('callForwardingNumber', null);\n            } else {\n                this.set('callForwardingNumber', phoneNumber);\n                return this.set('callForwardingExtension', null);\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\nimport ERROR_WHITE_LIST from 'connections-ui/utils/error-white-list';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject, observer, run } = Ember;\n\nexport default Ember.Mixin.create({\n    externalContacts: inject.service(),\n\n    _contactObservers: null,\n\n    // holds all of the conversations\n    conversations: [],\n    conversationsMadeByClient: [],\n    activeConversations: computed.reads('conversations'),\n    onMultipleCalls: computed.gt('activeConversations.length', 1),\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n    },\n\n    // TODO: unbind conversations and webrtc sessions\n    // This is only used in two places anyways. Might be able to remove.\n    activeAcdCalls: computed(\n        'activeConversations.[]',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        'station.isWebrtc',\n        function () {\n            return this.get('activeConversations').filter(conv => {\n                if (!this.get('station.isWebrtc')) {\n                    return conv.get('isAgentCall');\n                }\n                const callState = Ember.get(conv, 'callState.state');\n                const webrtcConversation = this.get('webrtc').getConversation({\n                    conversationId: conv.id,\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                const session = this._findPendingSessionsByConversationId(conv.id);\n                if (!callState || !webrtcConversation || !session) {\n                    return false;\n                }\n                const callIsAlreadyConnnected = ['connected', 'disconnected'].indexOf(callState.toLowerCase()) > -1;\n                const hasPendingSession = session ? Ember.get(session, 'id') || Ember.get(session, 'sid') : false; // seems redundant when checking for session above\n                const webrtcSessions = Ember.get(webrtcConversation, 'sessions');\n                const atLeastOneWebrtcConversation = this.isDefinedAndLengthGreaterThan(webrtcSessions, 0); // atLeastOneWebrtcConversation would be better here.\n                return (\n                    (callIsAlreadyConnnected || hasPendingSession || atLeastOneWebrtcConversation) &&\n                    conv.get('isAgentCall')\n                );\n            });\n        }\n    ),\n\n    // activeNonAcdCalls feeds all the components based on whether or not station is webrtc or not.\n    activeNonAcdCalls: computed('activeConversations.@each.connectedToStationAndNotConference', function () {\n        return this.get('activeConversations').filter(conv => {\n            // connecting to an auto conference, do not display.\n            if (conv.get('connectedToStationAndNotConference') && !conv.get('isGroupRing')) {\n                return false;\n            }\n            return !conv.get('isAgentCall');\n        });\n    }),\n\n    // conversations that are not 'disconnected' and not 'terminated'\n    connectedConversations: computed('conversations.@each.onCall', function () {\n        const conversations = this.get('conversations');\n        return conversations.filter(function (conversation) {\n            return conversation.get('onCall');\n        });\n    }),\n\n    /**\n     * Consumed by webrtc-conversation-manager behind toggle.\n     *\n     * Conversations for which the client should send the <proceed /> (i.e., webrtc.answerSoftphoneConversation())\n     * This would be conversations that the client initiated or conversations that were answered before the client received the <propose />\n     * or conversations that this browser was set to handle calls from with the thisBrowserIsTheOneToAnswerFrom toggle.\n     */\n    dialingOrContactingOrAlertingConversationsToProceed: computed(\n        'conversations.@each.waitingForSession',\n        'conversationsMadeByClient.@each.id',\n        'conversations.@each.isDialing',\n        'thisBrowserIsTheOneToAnswerFrom',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filter(conversation => {\n                const thisClientMadeTheCall = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n                const waitingForSession = conversation.get('waitingForSession');\n                // If we transfer a call we've placed and we're the target of the transfer, we do not want to auto answer/proceed.\n                if (!!conversation.recentTransfers) {\n                    this.get('conversationsMadeByClient').removeObject(conversation);\n                    return false;\n                }\n                if (thisClientMadeTheCall || waitingForSession) {\n                    return true;\n                }\n\n                const thisBrowserIsTheOneToAnswerFrom = this.get('thisBrowserIsTheOneToAnswerFrom');\n                const isDialing = conversation.get('isDialing');\n                const isOutbound = conversation.get('isOutbound');\n                return isOutbound && isDialing && thisBrowserIsTheOneToAnswerFrom;\n            });\n        }\n    ),\n\n    disconnectedConversations: computed('conversations.@each.onCall', function () {\n        return this.get('conversations').filter(conversation => {\n            const isDisconnected = this.isDisconnected(conversation);\n            if (conversation.get('isAgentCall')) {\n                return isDisconnected && conversation.get('isAfterCallWorkCompleted');\n            }\n            return isDisconnected;\n        });\n    }),\n\n    eligibleCallsToMerge: computed('activeConversations.@each.{isConnected,onConference}', 'activeCall', function () {\n        const onConference = this.get('activeCall.onConference');\n        return this.get('activeConversations').reject(conv => {\n            let thisCallIsConference = false;\n            if (!conv.get('isConnected')) {\n                return true;\n            }\n            if (conv.get('onConference')) {\n                thisCallIsConference = true;\n            }\n            return conv.id === this.get('activeCall.id') || (onConference && thisCallIsConference);\n        });\n    }),\n\n    _handleActiveConversationsUpdates: observer(\n        'activeConversations.[]',\n        'activeNonAcdCalls.[]',\n        'station.isWebrtc',\n        function () {\n            this.get('_throttledHandleActiveConversations').perform();\n        }\n    ),\n\n    _throttledHandleActiveConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this.handleActiveConversationsUpdates();\n    }).drop(),\n\n    handleActiveConversationsUpdates() {\n        const hasActiveCall = this.get('activeCall');\n        const activeNonAcdCalls = this.get('activeNonAcdCalls');\n\n        // activeNonAcdCalls could contain calls that have ended\n        const connectedNonAcdCalls = activeNonAcdCalls.filterBy('onCall');\n\n        const connectedConversations = this.get('connectedConversations') || [];\n        const dialingOrIncomingConversation = connectedConversations.filter(function (conversation) {\n            return conversation.get('isDialing') || conversation.get('isIncoming');\n        });\n\n        let newActiveCall = undefined;\n\n        if (!hasActiveCall) {\n            // no active call\n            newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n        } else {\n            // active call might have finished\n            const activeCallOngoing = this.get('onCall');\n\n            if (!activeCallOngoing) {\n                const activeCallErrors = this.get('activeCall.errorInfoMessage');\n\n                if (activeCallErrors) {\n                    // something went wrong with the call\n                    this.set('lastConversationError', {\n                        id: this.get('activeCall.id'),\n                        errorInfo: this.get('activeCall.errorInfo')\n                    });\n                    Ember.Logger.warn('lastConversationError: ', this.get('lastConversationError'));\n                } else {\n                    // call finished successfully - move to the next one\n                    newActiveCall = (connectedNonAcdCalls && Ember.get(connectedNonAcdCalls, 'lastObject')) || null;\n                }\n\n                // prioritize new dialed or incoming calls\n                if (dialingOrIncomingConversation && dialingOrIncomingConversation.length) {\n                    newActiveCall = Ember.get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            } else {\n                const dialingOutboundConversations = connectedConversations.filter(function (conversation) {\n                    return conversation.get('isDialing') && !conversation.get('isIncoming');\n                });\n                const hasOutboundConversation = dialingOutboundConversations && dialingOutboundConversations.length;\n\n                if (hasOutboundConversation) {\n                    newActiveCall = Ember.get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            }\n        }\n\n        // set the next active call appropriately\n        if (newActiveCall) {\n            this.set('activeCall', newActiveCall);\n        }\n    },\n\n    hasIncomingConversations: false,\n    _setHasIncomingConversations: observer('incomingConversations.[]', function () {\n        return run.once(this, this.set, 'hasIncomingConversations', this.get('incomingConversations.length') > 0);\n    }),\n\n    hasActiveNonAcdCalls: computed('incomingNonAcdConversations.[]', 'activeNonAcdCalls.[]', function () {\n        return this.get('incomingNonAcdConversations.length') > 0 || this.get('activeNonAcdCalls.length') > 0;\n    }),\n\n    incomingConversations: computed(\n        'conversations.[]',\n        'station.isWebrtc',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        function () {\n            const conversations = this.get('conversations');\n            return conversations.filterBy('isIncoming');\n        }\n    ),\n\n    incomingNonAcdConversations: computed('incomingConversations.[]', function () {\n        const conversations = this.get('incomingConversations');\n        return conversations.rejectBy('isAgentCall');\n    }),\n\n    isOnConnectedCall: computed('activeConversations.@each.isConnected', function () {\n        return !!this.get('activeConversations').findBy('isConnected');\n    }),\n\n    mostRecentlyConnectedConferenceCalls() {\n        return this.get('activeConversations').filter(conversation => {\n            const isConferenceCall = Ember.get(conversation, 'onConference');\n            const isConnectedCall = Ember.get(conversation, 'onCall');\n            const myTime = moment(Ember.get(conversation, 'myself.connectedTime'));\n            const diff = moment().diff(myTime);\n            return isConferenceCall && isConnectedCall && diff < 3000;\n        });\n    },\n\n    // conversations that have the 'connected' state and are not agent calls.\n    onlyConnectedConversations: computed('conversations.@each.connected', function () {\n        return this.get('conversations').filter(conversation => {\n            return conversation.get('isConnected') && !conversation.get('isAgentCall');\n        });\n    }),\n\n    recentDisconnectedAgentCalls: computed('conversations.@each.connected', function () {\n        return this.get('conversations').reject(conversation => {\n            const isDisconnected = this.isDisconnected(conversation) && conversation.get('isAfterCallWorkCompleted');\n            const isAgentCall = conversation.get('isAgentCall');\n            return !isAgentCall || !isDisconnected;\n        });\n    }),\n\n    recentDisconnectedNonAcdCalls: computed('conversations.@each.onCall', function () {\n        return this.get('conversations').filter(conversation => {\n            const callState = Ember.get(conversation, 'callState');\n            const isDisconnected =\n                callState && callState.state\n                    ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1\n                    : false;\n            return isDisconnected && !conversation.get('isAgentCall');\n        });\n    }),\n\n    removeConversationFromConversations(calls) {\n        const conversations = this.get('conversations');\n        const conversationsMadeByClient = this.get('conversationsMadeByClient');\n        const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n        if (this.isDefinedAndLengthGreaterThan(conversations, 0)) {\n            calls.forEach(conversation => {\n                const conversationId = Ember.get(conversation, 'id');\n                if (!conversationId || !Ember.get(conversation, 'isDisconnected')) {\n                    return;\n                }\n\n                // weird case where a non acd call ends and gets transferred back immediately. conversation is no longer disconnected and shouldn't be removed\n                if (!conversation.get('isAgentCall') && !this._shouldRemoveNonAcdConversation(conversation)) {\n                    return;\n                }\n\n                const conversationMarker = conversationsMadeByClient.findBy('id', conversationId);\n                if (conversationMarker) {\n                    conversationsMadeByClient.removeObject(conversationMarker);\n                }\n                const conversationsToRemove = conversations.filterBy('id', conversationId);\n\n                if (conversation) {\n                    const callErrorToRemove = userCallSessionsWithErrors.filterBy('id', conversationId);\n                    userCallSessionsWithErrors.removeObjects(callErrorToRemove);\n\n                    if (conversation.id === this.get('activeCall.id')) {\n                        this.cleanupActiveCall();\n                    }\n\n                    const conversationModelTemp = ConversationModel.create(\n                        conversation.get('__interaction_metadata__'),\n                        Ember.getOwner(this).ownerInjection()\n                    );\n                    Ember.set(conversationModelTemp, 'type', 'call');\n\n                    const { id } = conversation;\n                    this.set(`_contactObservers.${id}`, undefined);\n\n                    conversation.destroy();\n                    conversationModelTemp.destroy();\n                }\n\n                conversations.removeObjects(conversationsToRemove);\n            });\n        }\n    },\n\n    _throttledRemoveDisconnectedConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this._removeDisconnectedConversations();\n    }).drop(),\n\n    _shouldRemoveNonAcdConversation(conversation) {\n        const conversationHasErrors = this.get('userCallSessionsWithErrors').findBy('id', conversation.id);\n        const conversationMadeByClient = this.get('conversationsMadeByClient').findBy('id', conversation.id);\n        const conversationAcceptedOnClient = Ember.get(conversation, 'acceptedByClient');\n        const conversationWasMadeOrAcceptedOnClient = conversationAcceptedOnClient || conversationMadeByClient;\n\n        const participantsForUser = conversation.get('participants').filterBy('userId', this.get('personGuid'));\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n\n        let conversationWasTerminatedNotDisconnected = false;\n        if (updatedParticipantCall) {\n            conversationWasTerminatedNotDisconnected = updatedParticipantCall.state === 'terminated';\n\n            if (updatedParticipantCall.state === 'alerting') {\n                return false;\n            }\n        }\n\n        if (\n            !conversationWasMadeOrAcceptedOnClient ||\n            conversationWasTerminatedNotDisconnected ||\n            (conversationWasMadeOrAcceptedOnClient && !conversationHasErrors)\n        ) {\n            return true;\n        }\n        if (conversationHasErrors) {\n            return false;\n        }\n    },\n\n    _removeDisconnectedConversations() {\n        if (this.get('recentDisconnectedAgentCalls.length')) {\n            const disconnectedCalls = this.get('recentDisconnectedAgentCalls');\n            return run.next(this, this.removeConversationFromConversations, disconnectedCalls);\n        }\n        if (this.get('recentDisconnectedNonAcdCalls.length')) {\n            // remove conversations normally that were not made or accepted on this client\n            // remove conversations normally that do not have errors\n            const conversationsToRemove = this.get('recentDisconnectedNonAcdCalls').filter(conversation => {\n                return this._shouldRemoveNonAcdConversation(conversation);\n            });\n            let timeOutToRemove = this.get('timeOutToRemove');\n            if (!isTesting) {\n                const stationIsWebrtc = this.get('station.isWebrtc');\n                const thereArePendingSessions = this.get('webrtc.pendingSessions.length') > 0;\n                if (\n                    stationIsWebrtc &&\n                    thereArePendingSessions &&\n                    this.get('activeCall.connectedToStationAndNotConference')\n                ) {\n                    timeOutToRemove = 1;\n                }\n            }\n            if (conversationsToRemove.length) {\n                this.get('_debouncedRemoveConversationFromConversations').perform(\n                    conversationsToRemove,\n                    timeOutToRemove\n                );\n            }\n        }\n    },\n\n    _debouncedRemoveConversationFromConversations: task(function* (conversationsToRemove, debounceTime) {\n        yield timeout(debounceTime);\n        this.removeConversationFromConversations(conversationsToRemove);\n    }),\n\n    thereIsAConnectedConversation: computed.gte('onlyConnectedConversations.length', 1),\n\n    updateConversationArray(conversation, conversationDetails, isAgentCall) {\n        const conversationExists = conversationDetails != null ? true : false;\n        if (conversationExists) {\n            conversationDetails.setProperties(conversation);\n        } else {\n            conversationDetails = ConversationModel.create(conversation, Ember.getOwner(this).ownerInjection());\n\n            //Verify if we should process this update if agentCall\n            let isUpdateValid = true;\n            if (isAgentCall) {\n                Ember.set(conversationDetails, 'type', 'call');\n            }\n            if (isUpdateValid) {\n                this.get('conversations').pushObject(conversationDetails);\n            } else {\n                conversationDetails.destroy();\n            }\n        }\n        if (conversationDetails) {\n            this.trigger(`conversations.${conversationDetails.get('id')}`);\n            return conversationDetails;\n        } else {\n            return null;\n        }\n    },\n\n    monitoredConversationsForErrors: computed('conversations.@each.participants', function () {\n        const nonAcdCalls = this.get('conversations').reject(conversation => {\n            return Ember.get(conversation, 'participants').any(party =>\n                party && party.purpose ? party.purpose === 'agent' || party.purpose === 'acd' : false\n            );\n        });\n        return Ember.A([].concat(nonAcdCalls || []));\n    }),\n\n    // returns an array of conversation objects for the current user:\n    // { id: conversationId,\n    //   calls: [] // All calls for this user's participant\n    // }\n    usersCallSessions: computed('monitoredConversationsForErrors.@each.participants', 'personGuid', function () {\n        let callSessions = [];\n        this.get('monitoredConversationsForErrors').forEach(conversation => {\n            Ember.get(conversation, 'participants').forEach(participant => {\n                const purpose = (Ember.get(participant, 'purpose') || '').toLowerCase();\n                const participantIsUserAgent = ['user', 'agent'].indexOf(purpose) > -1;\n                const participantIsCurrentUser = Ember.get(participant, 'userId') === this.get('personGuid');\n                const userParticipant = participantIsCurrentUser && participantIsUserAgent ? participant : null;\n                if (userParticipant && Ember.get(userParticipant, 'calls')) {\n                    callSessions.push({ id: conversation.id, calls: Ember.get(userParticipant, 'calls') });\n                }\n            });\n        });\n        return callSessions;\n    }),\n\n    // returns array of user's call sessions that have errors (errorInfo or disconnectType == 'error' or disconnectReasons with 3XX, 4XX, 5XX codes)\n    userCallSessionsWithErrors: computed(\n        'usersCallSessions.calls.@each.errorInfo',\n        'usersCallSessions.calls.@each.disconnectReasons',\n        'userCallSessionsWithErrors.calls.@each.disconnectType',\n        function () {\n            return this.get('usersCallSessions').filter(session => {\n                const calls = Ember.get(session, 'calls');\n                const callsWithErrors = calls.filter(call => {\n                    const disconnectReasons = Ember.get(call, 'disconnectReasons');\n                    const thereAreDisconnectReasons = this.isDefinedAndLengthGreaterThan(disconnectReasons, 0);\n                    if (thereAreDisconnectReasons) {\n                        const re = /[3|4|5|6]\\d{2}/;\n                        const disconnectErrors = disconnectReasons.filter(reason => {\n                            return re.exec(reason.code);\n                        });\n                        return this.isDefinedAndLengthGreaterThan(disconnectErrors, 0);\n                    }\n                    const errorInfo = Ember.get(call, 'errorInfo');\n                    const disconnectTypeIsError =\n                        typeof Ember.get(call, 'disconnectType') === 'string'\n                            ? call.disconnectType.toLowerCase() === 'error'\n                            : false;\n\n                    // UI-2567: Ignore white listed errors if they do not cause disconnect\n                    if (!disconnectTypeIsError && errorInfo && ERROR_WHITE_LIST.indexOf(errorInfo.code) !== -1) {\n                        return false;\n                    }\n\n                    return errorInfo || disconnectTypeIsError ? true : false;\n                });\n                return callsWithErrors.length > 0 ? true : false;\n            });\n        }\n    )\n});\n","import Ember from 'ember';\n\nconst { observer, Logger } = Ember;\n\nexport default Ember.Mixin.create({\n    registerCPTopics: observer('user.id', function () {\n        const id = this.get('user.id');\n        const pigeon = this.get('pigeon');\n        let topics = [];\n        if (id && !this.get('registeredTopics')) {\n            this.set('registeredTopics', true);\n            topics = [\n                'station',\n                'conversations',\n                'voicemail.messages',\n                'userrecordings',\n                'fax.documents',\n                'evaluations'\n            ];\n\n            this.get('pigeon').on(`v2.users.${id}.station`, this, this._updateStationEvent); // in mixins/phone-service/station\n            return topics.map(t => `v2.users.${id}.${t}`).forEach(t => pigeon.registerPriorityTopic(t));\n        }\n    }),\n\n    updateActiveConversationEntry(conversation) {\n        let type = this.getInteractionTypeFromCP(conversation);\n\n        if (!type.isCall || (type.isCall && type.isCallback) || type.isFax) {\n            return;\n        }\n\n        let conversationData;\n        let currentCallState;\n        const conversationDetails = this.get('conversations').findBy('id', conversation.id);\n        if (conversationDetails) {\n            const participantOnExistingConversation = conversationDetails\n                .get('participants')\n                .findBy('userId', this.get('personGuid'));\n            if (!participantOnExistingConversation) {\n                Logger.error(\n                    `updateActiveConversationEntry: Expected to find person ${this.get('personGuid')} on conversation ${\n                        conversation.id\n                    } but person was not found`\n                );\n            } else {\n                const participantCall = this.getParticipantCall(participantOnExistingConversation);\n                currentCallState = participantCall.state ? participantCall.state.toLowerCase() : null;\n            }\n        }\n\n        const participants = Ember.get(conversation, 'participants');\n        const isAgentCall = participants.any(party => (party.purpose ? party.purpose === 'agent' : false));\n\n        const participantsForUser = participants.filterBy('userId', this.get('personGuid'));\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n        const participantOnCall = updatedParticipantCall\n            ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(updatedParticipantCall.state.toLowerCase()) >\n              -1\n            : false;\n        const participantIsNotVoicemail = participantOnUpdatedConversation.purpose\n            ? participantOnUpdatedConversation.purpose.toLowerCase() !== 'voicemail'\n            : false;\n        const isActiveOnCall = updatedParticipantCall && participantOnCall && participantIsNotVoicemail;\n        const newCallState = updatedParticipantCall.state.toLowerCase();\n\n        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n            Ember.set(conversation, 'acceptedByClient', false);\n        }\n\n        if (\n            currentCallState &&\n            participantIsNotVoicemail &&\n            currentCallState !== 'connected' &&\n            newCallState === 'connected'\n        ) {\n            this.get('headset').answerCall(conversation.id, this.get('connectedConversations.length') >= 1);\n        }\n\n        if (currentCallState && currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n            this.get('headset').endCall(conversation.id, this.get('connectedConversations.length') > 1);\n        }\n\n        const onCall = conversationDetails ? conversationDetails.get('onCall') : false;\n        if (isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated') {\n            conversationData = this.updateConversationArray(conversation, conversationDetails, isAgentCall);\n        }\n        if (conversationData || newCallState === 'terminated') {\n            this.notifyPropertyChange('conversations');\n            this.notifyPropertyChange('recentDisconnectedAgentCalls');\n            this._logConversationDetails(conversationData);\n        }\n\n        conversationData = this._updateModelForConsult(conversationData, conversation);\n\n        return conversationData;\n    },\n\n    //TODO | SERVOPS-11175 | change this if/when service updates to include consultParticipant status for participants after customer departs\n    _updateModelForConsult(conversationData, conversation) {\n        if (conversation && conversation.participants) {\n            const consultParticipantId = conversation.participants\n                .filterBy('purpose', 'customer')\n                .mapBy('consultParticipantId')\n                .pop();\n\n            // the consultParticipantId needs to be retained even when the call is no longer\n            // on consult because of use cases identified in SERVOPS-11175\n            if (consultParticipantId) {\n                conversationData.consultParticipantId = consultParticipantId;\n            }\n        }\n        return conversationData;\n    }\n});\n","import Ember from 'ember';\nimport { EVENTS } from 'connections-ui/utils/hosted-context';\nimport moment from 'connections-ui/utils/dates';\nimport _ from 'lodash';\n\nconst { observer, run, inject } = Ember;\nconst IGNORED_ERRORS = ['error.ininedgecontrol.session.inactive'];\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    useNotificationProfileOutput: Ember.computed.reads('session.features.notificationOutputPicker'),\n\n    displayIncomingNotification(conversation) {\n        let isHosted, applicationHasFocus;\n        const hosted = this.get('application.hostedContext');\n        if (hosted) {\n            isHosted = hosted.isHosted();\n            applicationHasFocus = hosted.applicationHasFocus();\n        }\n        if (this.get('application.browserHidden') || (isHosted && !applicationHasFocus)) {\n            const title = this.get('intl').lookup('notification.titles.incomingCall').toString();\n            const message = this.get('intl').lookup('notification.purecloud.incomingCall').toString();\n            const notificationOptions = {\n                fallbackToInBrowser: false,\n                hideAfter: 8,\n                tag: EVENTS.INCOMING_CALL,\n                meta: {\n                    conversation: conversation\n                },\n                clickHandler: (conversation, action) => {\n                    if (conversation && action) {\n                        if (_.includes(action, 'ignore')) {\n                            return this.toVoicemail(conversation);\n                        } else if (_.includes(action, 'answer')) {\n                            return this.answer(conversation);\n                        }\n                    }\n                }\n            };\n\n            if (this.get('useNotificationProfileOutput')) {\n                notificationOptions.notificationOutputDeviceId = this.getNotificationOutputDeviceId();\n            }\n\n            this.get('notification').info(title, message, notificationOptions);\n        }\n    },\n\n    // handle errors on users session\n    handleParticipantCallError: observer(\n        'userCallSessionsWithErrors.@each.calls',\n        'userCallSessionsWithErrors.calls.@each.disconnectedTime',\n        'personGuid',\n        'webrtcSdkService.useSdk',\n        function () {\n            // we will use the sdk the determine and parse call errors\n            if (this.get('webrtcSdkService.useSdk')) {\n                return;\n            }\n\n            const callsWithErrors = this.get('callsWithErrors');\n            const userCallSessionsWithErrors = this.get('userCallSessionsWithErrors');\n            // are there any errors on any of the user's sessions?\n            _.each(userCallSessionsWithErrors, session => {\n                const calls = Ember.get(session, 'calls');\n                _.each(calls, call => {\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    const hasThrownError = Ember.get(call, '_hasThrownError');\n                    if (isRecent && !hasThrownError) {\n                        callsWithErrors.pushObject({ conversationId: session.id, call: call });\n\n                        // TODO: We should not be getting calls without error info here PCDWEBK-3674\n                        if (call.errorInfo && !_.includes(IGNORED_ERRORS, call.errorInfo.code)) {\n                            Ember.set(call, '_hasThrownError', true);\n                            this.showErrorNotification(call.errorInfo);\n                        }\n                    }\n                });\n            });\n\n            if ((this.get('_testIsStationWebrtc') || this.get('station.isWebrtc')) && callsWithErrors.length > 0) {\n                _.each(callsWithErrors, call => {\n                    const reason = Ember.get(call, 'call.disconnectReasons.firstObject');\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    if (\n                        reason &&\n                        isRecent &&\n                        Ember.get(reason, 'type') === 'SIP' &&\n                        !Ember.get(call, 'call._hasThrownError')\n                    ) {\n                        Ember.set(call, 'call._hasThrownError', true);\n                        run.throttle(this, this.showSipError, reason, 1000);\n                    }\n                });\n            }\n        }\n    ),\n\n    showSipError(response) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.sipError');\n        messageText = `${messageText} ${response.code} ${response.phrase}`;\n        this.get('notification').error(title, messageText, {\n            tag: 'call-error',\n            icon: `${prefix} assets/images/icons/png/checkmark-circled.png`,\n            hideAfter: 5\n        });\n    },\n\n    translateServerErrors(response) {\n        const { message, messageParams, messageWithParams, code } = response;\n        const intl = this.get('intl');\n        switch (code) {\n            case 'providerapi.error.no.station.for.edge':\n            case 'providerapi.error.station.no.active.edge': {\n                return this.fetchStation(messageParams.stationId).then(response => {\n                    return messageWithParams.replace('{stationId}', `'${response.get('name')}'`);\n                });\n            }\n            case 'error.ininedgecontrol.connection.station.notReached': {\n                let newCode = code + '.physical';\n\n                if (this.get('station.isWebrtc')) {\n                    newCode = code + '.webrtc';\n                }\n\n                return Ember.RSVP.resolve(intl.t(newCode));\n            }\n            default: {\n                if (code && intl.exists(code)) {\n                    return Ember.RSVP.resolve(intl.t(code));\n                }\n                if (message) {\n                    return Ember.RSVP.resolve(message);\n                }\n                return code;\n            }\n        }\n    },\n\n    showErrorNotification(response, err) {\n        if (!response) {\n            if (!err) {\n                Ember.Logger.error(new Error('Cannot show error notification with no error information'));\n                return;\n            }\n            response = { message: err.message };\n        }\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.get('intl').t('purecloud.error.dialpad.call');\n        messageText = this.translateServerErrors(response, err);\n        return messageText.then(text => {\n            return this.get('notification').error(title, text, {\n                tag: 'call-error',\n                icon: prefix + 'assets/images/icons/png/checkmark-circled.png',\n                hideAfter: 5\n            });\n        });\n    },\n    showFeedbackErrorNotification(message) {\n        const title = this.get('intl').lookup('notification.titles.callError').toString();\n        message = '' + message;\n        return this.get('notification').error(title, message, {\n            target: this.get('applicationController'),\n            tag: 'activeCall',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.get('intl').lookup('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    showNoStationSelected(conversation) {\n        Ember.Logger.error('Cannot answer conversation because there is no active station for the current user', {\n            conversationId: conversation.get('id')\n        });\n        const title = this.get('intl').t('notification.titles.callError');\n        const message = this.get('intl').t('purecloud.station.noStationSelected');\n        this.get('notification').error(title, message, {\n            tag: 'call-error'\n        });\n    },\n\n    checkForNonACD(conversation) {\n        let isAcdCall = this.get('isActiveCallACD');\n        if (conversation) {\n            isAcdCall = conversation.get('isAgentCall');\n        }\n        if (!isAcdCall) {\n            const message = this.get('intl').lookup('notification.purecloud.nonACDOnQueue');\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nconst { computed, RSVP, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    store: inject.service(),\n    station: null,\n    needStation: false,\n    updateStationEventTimeout: 500,\n\n    freeSeatPreference: computed('session.org.orgSettings.freeSeating', function () {\n        return this.get('session.org.orgSettings.freeSeating');\n    }),\n\n    noStationSelected: computed.not('station'),\n\n    defaultStation: computed('user.station.defaultStation', function () {\n        const user = this.get('user');\n        if (user && Ember.get(user, 'station.defaultStation')) {\n            return this.get('user.station.defaultStation');\n        }\n        return null;\n    }),\n\n    associatedStationNotDefault: computed('defaultStation', 'station', function () {\n        if (!(this.get('defaultStation') || this.get('station'))) {\n            return false;\n        }\n        return this.get('defaultStation.id') !== this.get('station.id');\n    }),\n\n    defaultStationNamePromise: computed('defaultStation', function () {\n        if (!this.get('defaultStation')) {\n            return RSVP.resolve(null);\n        }\n\n        return this.get('store')\n            .find('station', this.get('defaultStation.id'))\n            .then(station => station.get('name'));\n    }),\n\n    // TODO: Remove this when API-2018 is ready because the calls to pub api for getting the user\n    // and setting the station will include station name and type.\n    fetchStation(selectedStation) {\n        const stationId = this.guidFromUri(selectedStation || this.get('user.station.lastAssociatedStation.id'));\n        return this.store\n            .find('station', stationId)\n            .then(station => {\n                this.set('station', station);\n                return station;\n            })\n            .catch(function (err) {\n                Ember.Logger.error('Failed to fetch station:', {\n                    error: err,\n                    stationId\n                });\n            });\n    },\n\n    disassociateStation() {\n        let url = this.get('applicationService').pcV2Uri(`api/v2/users/stations/me/associatedstation`);\n        return this.get('ajax').delete(url);\n    },\n\n    disconnectPersistentConnection() {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService').endAllSoftphoneSessions();\n        }\n\n        const webrtc = this.get('webrtc');\n        const conversations = webrtc\n            .get('conversations')\n            .filterBy('conversationType', webrtcConversationTypes.SOFTPHONE)\n            .map(c => ({ conversationId: c.get('conversationId'), jid: c.get('jid') }));\n        if (conversations.length !== 1) {\n            Ember.Logger.warn('Disconnecting persistent connection with active conversations', {\n                conversations: conversations.map(c => Ember.get(c, 'id'))\n            });\n        } else {\n            Ember.Logger.info('disconnecting persistent connection', conversations[0]);\n        }\n        conversations.forEach(c => webrtc.endConversation(c));\n    },\n\n    chooseDefault() {\n        const user = this.get('user');\n        let defaultStation = Ember.get(user, 'station.defaultStation');\n        if (!defaultStation) {\n            defaultStation = Ember.get(user, 'station.associatedStation');\n        }\n        this.chooseStation(Ember.get(defaultStation, 'id'));\n        this.set('defaultStation', defaultStation);\n        Ember.set(user, 'station.defaultStation', defaultStation);\n    },\n\n    doLoginAssociationLogic() {\n        const isFreeSeatOrg = this.get('freeSeatPreference');\n        let promise;\n\n        if (isFreeSeatOrg) {\n            promise = this._loginAssociationFreeSeat();\n        } else {\n            promise = this._loginAssociation();\n        }\n\n        return promise;\n    },\n\n    doLogoutAssociationLogic() {\n        return Ember.RSVP.resolve();\n    },\n\n    _loginAssociationFreeSeat() {\n        const user = this.get('user');\n        const associatedStation = Ember.get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        this.set('station', null);\n        this.logger.debug('Could not associate station on login because user does not have an associated Station');\n        return RSVP.resolve();\n    },\n\n    _loginAssociation() {\n        const user = this.get('user');\n        const associatedStation = Ember.get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        const lastAssociatedStation = Ember.get(user, 'station.lastAssociatedStation');\n        if (lastAssociatedStation) {\n            // user has no associated station, so we will pick the last station they used as long as it is not associated to another user\n            const lastAssociatedUser = Ember.get(lastAssociatedStation, 'associatedUser');\n            if (!lastAssociatedUser) {\n                return this.chooseStation(Ember.get(lastAssociatedStation, 'id'));\n            }\n        }\n        const defaultStation = Ember.get(user, 'station.defaultStation');\n        if (defaultStation) {\n            // user has no associated station or last used station, so pick their default as long as it is not associated to another user\n            const defaultStationUser = Ember.get(defaultStation, 'associatedUser');\n            if (!defaultStationUser) {\n                return this.chooseStation(Ember.get(defaultStation, 'id'));\n            }\n        }\n        const userStationSettings = Ember.get(user, 'station');\n        this.set('station', null);\n        this.logger.info('User did not have any stations to pick on login', { userStationSettings });\n        return RSVP.resolve();\n    },\n\n    chooseStation(selectedStation) {\n        let station = selectedStation.split('/').pop();\n\n        if (!station) {\n            return Ember.RSVP.resolve();\n        }\n        let uri = this.get('application').pcUri(['api/v2/users/stations/me/associatedstation', station]);\n        const successHandler = data => {\n            this.fetchStation(station);\n            return data;\n        };\n        const errorHandler = jqXHR => {\n            Ember.onerror(jqXHR);\n            let message = Ember.get(jqXHR, 'responseJSON.message') || '';\n            message = this.get('intl').lookup('notification.purecloud.phoneFail') + message;\n            return this.get('notification').info(null, message, {\n                hideAfter: 5\n            });\n        };\n        return this.get('ajax').put(uri).then(successHandler, errorHandler);\n    },\n\n    _updateStationEvent(eventBody, json) {\n        this.get('_debouncedUpdateStationEvent').cancelAll();\n        this.get('_debouncedUpdateStationEvent').perform(eventBody, json);\n    },\n\n    _debouncedUpdateStationEvent: task(function* (eventBody, json) {\n        yield timeout(this.get('updateStationEventTimeout'));\n        this._handleUpdateStation(eventBody, json);\n    }),\n\n    _handleUpdateStation(eventBody, json) {\n        const metadata = Ember.get(json, 'metadata');\n        if (!metadata) {\n            return;\n        }\n        const stationId = this.get('station') ? this.get('station.id') : null;\n        const newStation = Ember.get(eventBody, 'associatedStation');\n        const newStationId = newStation && newStation.id ? newStation.id : null;\n        const currentStationIsNewStation = !!(stationId && newStationId && stationId === newStationId);\n        const action = Ember.get(metadata, 'action') ? metadata.action.toLowerCase() : false;\n\n        if (action === 'associated' && currentStationIsNewStation) {\n            return;\n        } else if (action === 'disassociated') {\n            this.set('station', null);\n        } else if (action === 'associated') {\n            this.fetchStation(eventBody.stationUri || newStationId);\n        }\n    },\n\n    _testIsStationWebrtc: false // HACK: for testing\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    addIndicatorForPromise: function (promise, target) {\n        Ember.assert('You must specify a valid target selector', target && typeof target === 'string');\n\n        if (promise && promise.then) {\n            var view = Ember.$('<div class=\"loading-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>');\n            Ember.$(target).append(view);\n\n            promise.then(function () {\n                view.remove();\n            });\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst PurecloudModelMixin = Ember.Mixin.create({});\n\nexport default PurecloudModelMixin;\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\nconst { alias } = computed;\n\nconst FEATURE_RELATE_ACCESS = 'permissions.hasExternalContactsViewContactAccess';\n\nconst FEATURE_CUSTOM_FIELDS = 'session.features.relateDynamicSchema';\n\nexport default Ember.Mixin.create({\n    session: inject.service(),\n    permissions: inject.service(),\n\n    hasRelateAccess: computed.alias(FEATURE_RELATE_ACCESS),\n\n    canShowCustomFields: alias(FEATURE_CUSTOM_FIELDS),\n\n    contactRoute: computed('isRelateEngineAvailable', function () {\n        return 'relate.contacts-ui-redirect'; // todo: clean up with redirects\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport DS from 'ember-data';\nimport ajax from 'ember-ajax';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\n\nconst SEARCH_ALL = '*';\n\nconst TAGS_ENDPOINT = '/directory/api/v2/tags/skills.skills,skills.certs,general.department,general.title';\n\nconst CANCELLATION_ERROR = 'Request Cancelled';\n\nfunction performSearch() {\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n\n    var value;\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = SEARCH_ALL;\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    var deferred = this.get('pendingSearchRequest');\n    if (deferred) {\n        deferred.reject(CANCELLATION_ERROR);\n    }\n    deferred = Ember.RSVP.defer();\n\n    this.set('pendingSearchRequest', deferred);\n\n    var requestArray = [];\n\n    var queueSearchRequest;\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    if (this.get('searchQueueOnly') && queuePermission) {\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        const myQueuesOnly = this.get('myQueuesOnly');\n\n        if (divisionAgnostic) {\n            queueSearchData.name = `**${value}**`;\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        if (myQueuesOnly) {\n            queueSearchData.myQueuesOnly = myQueuesOnly;\n        }\n\n        queueSearchRequest = this.get('store').query('queue', queueSearchData);\n        requestArray.push(queueSearchRequest);\n    } else if (this.get('searchRelate') && this.get('searchRelateOnly') && relatePermission) {\n        queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            originator: this.get('componentClassName'),\n            expandField: 'externalOrganization'\n        });\n        requestArray.push(queueSearchRequest);\n    } else {\n        if (this.get('searchQueueOnly')) {\n            return;\n        }\n        const query = [\n            {\n                value: value,\n                type: 'QUERY_STRING'\n            }\n        ];\n        // should be the ucIntegrationKey, will be null unless set\n        const searchIntegrationKey = this.get('searchIntegrationKey');\n        if (searchIntegrationKey) {\n            query.push({\n                type: 'EXACT',\n                fields: ['integration'],\n                value: searchIntegrationKey\n            });\n        }\n\n        let request = null;\n\n        const userRequest = this.get('store').query('public-api-user', {\n            query,\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        request = userRequest.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        requestArray.push(request);\n\n        if (this.get('searchQueue') && queuePermission) {\n            let queueSearchQuery;\n            if (this.get('divisionAgnostic')) {\n                queueSearchQuery = {\n                    name: value,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit'),\n                    divisionAgnostic: true\n                };\n            } else {\n                queueSearchQuery = {\n                    name: `**${value}**`,\n                    pageNumber: 1,\n                    pageSize: this.get('searchLimit')\n                };\n            }\n            queueSearchRequest = this.get('store').query('queue', queueSearchQuery);\n            requestArray.push(queueSearchRequest);\n        }\n\n        if (this.get('searchRelate') && relatePermission) {\n            queueSearchRequest = this.get('store').query('externalcontacts/contact', {\n                searchTerm: `${value}`,\n                pageSize: this.get('searchLimit'),\n                originator: this.get('componentClassName'),\n                pageNumber: 1,\n                expandField: 'externalOrganization,division'\n            });\n            requestArray.push(queueSearchRequest);\n        }\n    }\n\n    Ember.RSVP.allSettled(requestArray).then(promises => {\n        const results = [];\n        promises.forEach(promise => {\n            if (promise.state === 'rejected') {\n                Ember.Logger.warn('Failed to load search request', { reason: promise.reason });\n            } else {\n                results.push(promise.value);\n            }\n        });\n        if (results.length === 0) {\n            deferred.reject(new Error('All search requests failed'));\n        } else {\n            deferred.resolve(results);\n        }\n    });\n\n    deferred.promise\n        .then(entities => {\n            var results = _.map(entities, function (entity) {\n                if (!Array.isArray(entity)) {\n                    return entity.get('content').map(x => x.getRecord());\n                } else {\n                    return entity;\n                }\n            });\n\n            if (entities.length) {\n                this.set('searchMeta', _.head(entities).meta);\n            }\n            entities = _.flatten(results);\n            const people = entities.filterBy('type', 'person');\n            if (people.length > 0) {\n                this.get('presenceSubscription').autoSubscribe(people, this, 'search');\n            }\n            this.set('searchResults', entities);\n\n            if (_.isEmpty(entities)) {\n                this.notifyPropertyChange('searchResults');\n            }\n\n            return entities;\n        })\n        .finally(() => {\n            this.set('pendingSearchRequest', null);\n        });\n\n    this.set('currentSearchRequest', DS.PromiseArray.create({ promise: deferred.promise }));\n}\n\nfunction performTagSearch() {\n    var request = tagSearchRequest(this.get('tagSearchQuery'));\n\n    request.then(results => {\n        this.set('tagSearchResults', results);\n        return results;\n    });\n\n    this.set('tagSearchRequest', DS.PromiseObject.create({ promise: request }));\n}\n\nfunction tagSearchRequest(query) {\n    return new Ember.RSVP.Promise(function (resolve, reject) {\n        ajax(TAGS_ENDPOINT, {\n            type: 'GET',\n            data: { q: query }\n        }).then(function (data) {\n            var results = data.res;\n\n            if (results.length !== 0) {\n                _.each(results, function (result) {\n                    var tag = result.field.substring(result.field.indexOf('.') + 1);\n                    result.tag = tag;\n                });\n            }\n\n            resolve(results);\n        }, reject);\n    }, 'SearchMixin#tagSearchRequest');\n}\n\nexport const SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    searchIntegrationKey: null,\n\n    searchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        Ember.run.debounce(this, performSearch, 200);\n    })\n});\n\nexport const ThenableSearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n    store: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    searchQuery: null,\n    entityFilter: null,\n    searchQueue: false,\n    searchQueueOnly: false,\n    saveHistory: true,\n    searchOnEmpty: false,\n    searchLimit: 25,\n\n    pendingSearchRequest: null,\n    currentSearchRequest: null,\n\n    performSearch(searchQuery, entityFilter) {\n        this.set('searchQuery', searchQuery);\n        this.set('entityFilter', entityFilter);\n        performSearch.apply(this);\n        return this.get('currentSearchRequest');\n    }\n});\n\nexport const TagSearchMixin = Ember.Mixin.create({\n    tagSearchQuery: null,\n    tagSearchRequest: null,\n\n    tagSearchResults: Ember.computed(function () {\n        return [];\n    }),\n\n    performTagSearch: Ember.observer('tagSearchQuery', function () {\n        Ember.run.debounce(this, performTagSearch, 150);\n    })\n});\n\n// TODO: Remove this after toggle is flipped\nexport const HelpMixin = Ember.Mixin.create({\n    searchQuery: null,\n    searchResults: null,\n    request: null,\n\n    _performHelpSearch() {\n        const searchQuery = this.get('searchQuery');\n\n        if (searchQuery) {\n            const request = new Ember.RSVP.Promise((resolve, reject) => {\n                Ember.$.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: 'https://help.genesys.cloud/purecloud-search-api.php',\n                    dataType: 'json',\n                    data: {\n                        q: searchQuery\n                    },\n                    success: data => {\n                        const results = data ? Ember.get(data, 'results') : null;\n                        _.forEach(results, function (result) {\n                            if (result.excerpt) {\n                                result.excerpt = result.excerpt\n                                    .replace(/(<([^>]+)>)/gi, '')\n                                    .replace(/&quot;/g, '\"')\n                                    .replace(/&#39;/g, \"'\")\n                                    .replace(/&lt;/g, '<')\n                                    .replace(/&gt;/g, '>')\n                                    .replace(/&amp;/g, '&')\n                                    .replace(/&#8217;/g, \"'\");\n                            }\n                        });\n                        this.set('searchResults', results);\n                        resolve(data);\n                    },\n                    error: function (error) {\n                        Ember.Logger.log('Error accessing resourceCenter');\n                        reject(error);\n                    }\n                });\n            });\n\n            this.set('request', DS.PromiseObject.create({ promise: request }));\n        } else {\n            this.set('searchResults', null);\n        }\n    },\n\n    performHelpSearch: Ember.observer('searchQuery', function () {\n        Ember.run.debounce(this, this._performHelpSearch, 150);\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { componentClassName } from 'connections-ui/utils/external-contact-messaging';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst TIMEOUT = isTesting ? 0 : 300;\n\nconst PrepareResults = (context, results) => {\n    let parsedResults;\n\n    if (!Array.isArray(results)) {\n        parsedResults = results.get('content');\n        parsedResults = parsedResults.map(x => x.getRecord());\n    } else {\n        parsedResults = results;\n    }\n\n    if (parsedResults.length < 0 && parsedResults === undefined && parsedResults === null) {\n        context.set('retrySearch', true);\n        return;\n    }\n\n    const entities = _.flatten(parsedResults);\n    const people = entities.filterBy('type', 'person');\n\n    if (people.length > 0) {\n        context.get('presenceSubscription').autoSubscribe(people, context, 'search');\n    }\n\n    return entities;\n};\n\nconst performSearch = function () {\n    let value;\n\n    if (this.get('isDestroyed') || this.get('isDestroying')) {\n        return;\n    }\n    if (this.get('searchQuery.length') > 0) {\n        value = this.get('searchQuery');\n    } else if (this.get('searchOnEmpty')) {\n        value = '*';\n    } else {\n        if (this._state !== 'inDOM') {\n            return;\n        }\n        this.get('presenceSubscription').autoSubscribe(null, this, 'search');\n        this.set('searchResults', []);\n        return;\n    }\n\n    const userPending = this.get('userPending');\n    const queuePending = this.get('queuePending');\n    const relatePending = this.get('relatePending');\n\n    const queuePermission = this.get('permissions.canViewQueue');\n    const relatePermission = this.get('permissions.hasExternalContactsViewContactAccess');\n\n    const searchRelate = this.get('searchRelate');\n    const searchQueues = this.get('searchQueue');\n    const searchUsers = this.get('searchUser');\n    let userRequests = null;\n\n    if (searchUsers && !userPending) {\n        this.set('userPending', true);\n\n        const request = this.get('store').query('public-api-user', {\n            query: [\n                {\n                    value: value,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        });\n        userRequests = request.then(entities => {\n            const resultArray = entities.content || [];\n            const userIds = resultArray.map(entry => entry.id);\n            return this.get('store').findMany('person', userIds);\n        });\n\n        userRequests.catch(() => this.set('userSearchFailed', true));\n        userRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('userResults', entities);\n        });\n        userRequests.finally(() => {\n            this.set('userPending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchQueues && queuePermission && !queuePending) {\n        this.set('queuePending', true);\n\n        const queueSearchData = {\n            name: `**${value}**`,\n            pageNumber: 1,\n            pageSize: this.get('searchLimit')\n        };\n\n        const divisionAgnostic = this.get('divisionAgnostic');\n        if (divisionAgnostic) {\n            queueSearchData.divisionAgnostic = true;\n        }\n\n        const queueRequests = this.get('store').query('queue', queueSearchData);\n\n        queueRequests.catch(() => this.set('queueSearchFailed', true));\n        queueRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('queueResults', entities);\n        });\n        queueRequests.finally(() => {\n            this.set('queuePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n\n    if (searchRelate && relatePermission && !relatePending) {\n        this.set('relatePending', true);\n        const relateRequests = this.get('store').query('externalcontacts/contact', {\n            searchTerm: `${value}`,\n            pageSize: this.get('searchLimit'),\n            pageNumber: 1,\n            expandField: 'externalOrganization,division',\n            originator: this.get('componentClassName')\n        });\n\n        relateRequests.catch(() => this.set('relateSearchFailed', true));\n        relateRequests.then(res => {\n            let entities = new PrepareResults(this, res);\n            this.set('relateResults', entities);\n        });\n        relateRequests.finally(() => {\n            this.set('relatePending', false);\n            this.get('retrySearch', false);\n        });\n    }\n};\n\nconst SearchMixin = Ember.Mixin.create({\n    componentClassName: Ember.computed(function () {\n        return componentClassName.call(this);\n    }),\n\n    presenceSubscription: Ember.inject.service('presence-subscription'),\n    store: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    searchQuery: null,\n    searchOnEmpty: false,\n\n    retrySearch: false,\n\n    searchUser: false,\n    searchRelate: false,\n    searchQueue: false,\n\n    userSearchFailed: false,\n    queueSearchFailed: false,\n    relateSearchFailed: false,\n\n    searchLimit: 25,\n    userPending: false,\n    queuePending: false,\n    relatePending: false,\n\n    userResults: null,\n    queueResults: null,\n    relateResults: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('userResults', []);\n        this.set('relateResults', []);\n        this.set('queueResults', []);\n    },\n\n    performSearch: Ember.observer('searchQuery', 'entityFilter', function () {\n        this.debouncedSearch();\n    }),\n\n    performReload: Ember.observer('retrySearch', function () {\n        if (this.get('retrySearch')) {\n            this.set('userResults', []);\n            this.set('relateResults', []);\n            this.set('queueResults', []);\n            this.debouncedSearch();\n        }\n    }),\n\n    debouncedSearch: _.debounce(performSearch, TIMEOUT, { leading: false, trailing: true })\n});\n\nexport default SearchMixin;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst presenceToRadixMapping = {\n    available: 1,\n    busy: 2,\n    away: 3,\n    idle: 3,\n    offline: 4,\n    on_queue: 5,\n    out_of_office: 6\n};\n\nconst radixMapping = function (user) {\n    if (user) {\n        return presenceToRadixMapping[user.get('presence')];\n    } else {\n        return null;\n    }\n};\n\nconst userName = function (user) {\n    return user.get('name') || '';\n};\n\nconst mapUserToSortable = function (user) {\n    return `${radixMapping(user)}${userName(user)}`;\n};\n\nconst mapRoomToSortable = function (room) {\n    let radix = radixMapping(room.get('oneToOneTarget'));\n    let name = room.get('subject');\n    return `${radix}${name}`;\n};\n\nconst SortChatUsersMixin = Ember.Mixin.create({\n    sortChatUsers(usersList) {\n        return _.sortBy(usersList, mapUserToSortable);\n    },\n\n    sortOneToOneRooms(rooms) {\n        return _.sortBy(rooms, mapRoomToSortable);\n    }\n});\n\nexport default SortChatUsersMixin;\n","define(\"connections-ui/mixins/style-namespacing-extras\", [\"exports\", \"ember-component-css/mixins/style-namespacing-extras\"], function (_exports, _styleNamespacingExtras) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _styleNamespacingExtras.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Mixin.create({\n    beforeModel: function () {\n        // Skip call to super which is the authenticated-route-mixin\n        return null;\n    }\n});\n","import Ember from 'ember';\n\n// Viewport code adapted from:\n// https://emberway.io/ember-js-detecting-if-a-dom-element-is-in-the-viewport-eafcc77a6f86\n\nconst { computed } = Ember;\n\nconst REFRESH_RATE = 200;\n\nfunction getScrollParent(comp) {\n    if (!comp || !comp.$) {\n        return null;\n    }\n    try {\n        return [...comp.$().parents()].find(el => {\n            const $el = Ember.$(el);\n            return /(auto|scroll)/.test($el.css('overflow') + $el.css('overflow-y') + $el.css('overflow-x'));\n        });\n    } catch (err) {\n        return null;\n    }\n}\n\nexport default Ember.Mixin.create({\n    enableViewport: true,\n\n    enteredViewport: computed('boundingClientRect', 'windowHeight', function () {\n        const rect = this.get('boundingClientRect');\n        const windowHeight = this.get('windowHeight');\n        const windowWidth = this.get('windowWidth');\n        if (!rect) {\n            return false;\n        }\n\n        return rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth;\n    }),\n\n    exitedViewport: computed.not('enteredViewport'),\n\n    /**\n     * Implementers of these hooks are responsible for setting up their own run loop for\n     * scheduling, since this mixin is using request animation frame to handle events.\n     **/\n    didEnterViewport() {},\n    didExitViewport() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.get('enableViewport')) {\n            Ember.run.scheduleOnce('afterRender', this, '_setup');\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._teardown();\n    },\n\n    _setup() {\n        Ember.run(() => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n\n            this._bindEvents();\n            this._updateBoundingClientRect();\n            this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n            this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n        });\n    },\n\n    _teardown() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const scrollParentRef = Ember.$(scrollParent);\n        if (scrollParentRef) {\n            scrollParentRef.off(`.${this.elementId}`);\n        }\n\n        const windowRef = Ember.$(window);\n        if (windowRef) {\n            windowRef.off(`.${this.elementId}`);\n        }\n    },\n\n    _bindEvents() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const $scrollParent = Ember.$(scrollParent);\n        const resizeHandler = this.resizeHandler.bind(this);\n        $scrollParent.on(`scroll.${this.elementId}`, this.scrollHandler.bind(this));\n        Ember.$(window).on(`resize.${this.elementId}`, resizeHandler);\n    },\n\n    _updateBoundingClientRect() {\n        const el = this.element;\n        if (el && el.getBoundingClientRect) {\n            this.set('boundingClientRect', el.getBoundingClientRect());\n        }\n    },\n\n    _updateWindowSize() {\n        this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n        this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n    },\n\n    scrollHandler() {\n        Ember.run.debounce(this, '_scrollHandler', REFRESH_RATE, false);\n    },\n\n    _scrollHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateBoundingClientRect.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateBoundingClientRect', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    },\n\n    resizeHandler() {\n        Ember.run.debounce(this, '_resizeHandler', REFRESH_RATE, false);\n    },\n\n    _resizeHandler() {\n        const run = window.requestAnimationFrame || Ember.run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateWindowSize.bind(this));\n        } else {\n            Ember.run.debounce(this, '_updateWindowSize', 100);\n        }\n\n        if (this.get('enteredViewport')) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    }\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Mixin.create({\n    interaction: computed.reads('webrtc.interaction'),\n    webrtc: inject.service(),\n    streaming: inject.service(),\n    intl: computed.reads('webrtc.intl'),\n    phone: inject.service(),\n    mediaProviders: inject.service(),\n    sessionService: inject.service('session'),\n\n    videoTooltipTitle: Ember.computed('videoTooltipKey', 'haveNonPurecloudMediaProvider', function () {\n        let key = this.get('videoTooltipKey');\n        if (this.get('haveNonPurecloudMediaProvider')) {\n            key = 'ewc.open';\n        }\n\n        const params = {};\n\n        if (key === 'ewc.userOffline' || key === 'ewc.userBusy') {\n            params.name = this.get('webrtcTarget.oneToOneTarget.name');\n        }\n\n        if (this._fixTooltips) {\n            Ember.run.scheduleOnce('afterRender', this, this._fixTooltips);\n        }\n        return this.get('intl').t(key, params);\n    }),\n\n    videoTooltipTitleSr: Ember.computed('videoTooltipTitle', 'videoTooltipeKey', 'activeRoom.videoPeers', function () {\n        let key = this.get('videoTooltipKey');\n\n        const numberOfParticipants = this.get('activeRoom.videoPeers');\n        if (key == 'ewc.open' && numberOfParticipants > 0) {\n            key = 'ewc.openSr';\n            return this.get('intl').t(key, { number: numberOfParticipants });\n        }\n\n        return this.get('videoTooltipTitle');\n    }),\n\n    oneToOneChat: computed('webrtcTarget.oneToOneTarget', function () {\n        const webrtcTarget = this.get('webrtcTarget');\n        return webrtcTarget && webrtcTarget.isOneToOneRoom();\n    }),\n\n    isFirefox: BrowserUtils.isFirefox,\n\n    webrtcTarget: computed.or('activeRoom', 'entity.oneToOneRoom'),\n\n    webrtcPhoneWithIssues: Ember.computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    videoMediaProviders: Ember.computed('useMediaProviders', 'sessionService', 'mediaProviders.enabled', function () {\n        if (!this.get('useMediaProviders') || !this.get('mediaProviders.enabled')) {\n            return [];\n        }\n\n        return this.get('mediaProviders').getVideoProviders(this.get('sessionService.user'), this.get('webrtcTarget'));\n    }),\n\n    haveNonPurecloudMediaProvider: Ember.computed('videoMediaProviders.[]', function () {\n        return !!this.get('videoMediaProviders').find(provider => provider.get('id') !== 'purecloud');\n    }),\n\n    videoTooltipKey: computed(\n        'webrtc.{videoCallCapable,activeRoom.showingVideo,activeBridge,canConference,webrtcAudioCallIssueKey}',\n        'webrtcTarget.{showingVideo,videoRoomFull}',\n        'interaction.activeRealtimeInteractions.[]',\n        'isOneToOneOfflineOrBusy',\n        'isFirefox',\n        'mediaProviders.{enabled,usingVideoProvider}',\n        'useMediaProviders',\n        function () {\n            const openTooltip = 'ewc.open';\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return this.get('webrtc.webrtcAudioCallIssueKey');\n            }\n            if (!this.get('webrtc.videoCallCapable') && !this.get('useMediaProviders')) {\n                return 'ewc.notCapable';\n            }\n            if (this.get('interaction.activeRealtimeInteractions.length')) {\n                return 'ewc.activeInteractions';\n            }\n            if (\n                this.get('webrtcTarget.showingVideo') ||\n                this.get('webrtc.activeRoom.showingVideo') ||\n                this.get('mediaProviders.usingVideoProvider')\n            ) {\n                if (this.get('webrtcTarget.jid') === this.get('webrtc.activeRoom.jid')) {\n                    return 'ewc.openActiveCall';\n                }\n                return 'ewc.anotherActiveCall';\n            }\n            if (this.get('webrtcTarget.videoRoomFull')) {\n                return 'ewc.atCapacity';\n            }\n            if (this.get('webrtcTarget.oneToOneTarget')) {\n                if (this.get('mediaProviders.enabled') && this.get('useMediaProviders')) {\n                    return openTooltip;\n                }\n                if (!this.get('isOneToOneOfflineOrBusy')) {\n                    return openTooltip;\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isOffline')) {\n                    return 'ewc.userOffline';\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isBusy')) {\n                    return 'ewc.userBusy';\n                }\n            }\n            if (!this.get('webrtc.canConference') && !this.get('useMediaProviders')) {\n                return 'ewc.browserNotSupported';\n            }\n            return openTooltip;\n        }\n    ),\n\n    isOneToOneOfflineOrBusy: computed.and(\n        'oneToOneChat',\n        'webrtcTarget',\n        'webrtcTarget.oneToOneTarget.isOfflineOrBusy'\n    ),\n\n    isVideoButtonEnabled: computed(\n        'videoTooltipKey',\n        'webrtc.webrtcAudioCallIssueKey',\n        'haveNonPurecloudMediaProvider',\n        'useMediaProviders',\n        function () {\n            if (this.get('useMediaProviders') && this.get('haveNonPurecloudMediaProvider')) {\n                return true;\n            }\n\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return false;\n            }\n\n            return this.get('videoTooltipKey') === 'ewc.open' || this.get('videoTooltipKey') === 'ewc.openActiveCall';\n        }\n    ),\n\n    videoButtonEnabled: computed('isVideoButtonEnabled', function () {\n        return this.get('isVideoButtonEnabled') ? 'enabled' : 'disabled';\n    })\n});\n","define(\"connections-ui/models/annotation\", [\"exports\", \"ember-purecloud-components/models/annotation\"], function (_exports, _annotation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _annotation.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst { typeOf, isPresent, copy, computed, assign } = Ember;\n\nexport const APPS_API_PROTOCOL = 'purecloud-client-apps';\nconst PROTOCOL_FIELD_NAME = 'protocol';\n\n// ----- Inbound Message Properties\nconst PROTOCOL_AGENT_FIELD_NAME = 'protocolAgentName';\nconst PROTOCOL_AGENT_VERSION_FIELD_NAME = 'protocolAgentVersion';\nconst API_ACTION_FIELD_NAME = 'action';\n\n// ----- Outbound Message Properties\nconst OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME = 'purecloudEventType';\n\n/**\n * Model representing an inbound API call from the Apps SDK or from an internal app/frame utilizing direct\n * postMessage calls.\n */\nconst AppApiCall = Ember.Object.extend({\n    internalPcCall: false,\n    srcApp: null,\n    srcAppInstance: null,\n    protocol: null,\n    protocolAgentName: null,\n    protocolAgentVersion: null,\n    action: null,\n    actionDetails: null,\n\n    appId: computed('srcApp', 'srcAppInstance', function () {\n        let result = this.get('srcAppInstance.appId');\n\n        if (!result) {\n            result = this.get('srcApp.id');\n        }\n\n        return result || null;\n    })\n});\n\n/**\n * Parses and validates the provided messagePayload into an AppApiCall instance.\n *\n * actionDetails will only contain properties which are applicable to the specific api call.  i.e.\n * metadata props like the action, protocol, protocol agent, etc. will only exist in their\n * specific instance variables.\n *\n * @param {object} messagePayload - The payload to parse; fails if not an object\n * @param {boolean} requireProtocol - If the validation should fail on protocol fields\n *\n * @returns an AppApiCall if the message is valid\n * @throws Error if the payload structure is invalid;\n *  the protocol is missing/incorrect (in strict mode);\n *  the action is missin/incorrect\n */\nexport function parseMessage(messagePayload, requireProtocol) {\n    let result = null;\n\n    if (typeOf(messagePayload) !== 'object') {\n        throw new Error('invalidPayload');\n    } else {\n        let protocol = messagePayload[PROTOCOL_FIELD_NAME];\n        if (requireProtocol) {\n            if (\n                !Object.prototype.hasOwnProperty.call(messagePayload, PROTOCOL_FIELD_NAME) ||\n                typeOf(protocol) !== 'string' ||\n                !isPresent(protocol)\n            ) {\n                throw new Error('missingProtocol');\n            }\n\n            if (protocol !== APPS_API_PROTOCOL) {\n                throw new Error('invalidAppsProtocol');\n            }\n        }\n\n        let action = messagePayload[API_ACTION_FIELD_NAME];\n        if (\n            !Object.prototype.hasOwnProperty.call(messagePayload, API_ACTION_FIELD_NAME) ||\n            typeOf(action) !== 'string' ||\n            !isPresent(action)\n        ) {\n            throw new Error('missingAction');\n        }\n\n        let actionDetails = copy(messagePayload, true);\n\n        // Prune metadata and control fields from the actionDetails\n        [\n            PROTOCOL_FIELD_NAME,\n            PROTOCOL_AGENT_FIELD_NAME,\n            PROTOCOL_AGENT_VERSION_FIELD_NAME,\n            API_ACTION_FIELD_NAME\n        ].forEach(fieldToPrune => {\n            delete actionDetails[fieldToPrune];\n        });\n\n        result = AppApiCall.create({\n            protocol,\n            protocolAgentName: messagePayload[PROTOCOL_AGENT_FIELD_NAME],\n            protocolAgentVersion: messagePayload[PROTOCOL_AGENT_VERSION_FIELD_NAME],\n            action,\n            actionDetails\n        });\n    }\n\n    return result;\n}\n\n/**\n * Constructs the full payload of a message to be sent to an Embedded Client App.\n * Metadata fields will be appended to any provided custom payload to create the normalized\n * event structure.\n *\n * @param {string} eventType - The eventType of this message.\n * @param {object|null|undefined} [customPayload={}] - Additional payload to send to the the app\n *\n * @throws Error if eventType is not a non-blank string\n * @throws Error if the customPayload is not null, undefined, or an object\n * @throws Error if any of the reserved, metadata keys are provided in the customPayload\n *\n * @returns A normalized payload with all necessary metadata suitable to dispatch to an Embedded Client App\n */\nexport function buildOutboundMsgPayload(eventType, customPayload = {}) {\n    if (typeOf(eventType) !== 'string' || eventType.trim().length === 0) {\n        throw new Error('Non-empty string must be provided as the eventType');\n    }\n\n    let payloadType = typeOf(customPayload);\n    if (payloadType !== 'null' && payloadType !== 'object') {\n        throw new Error('Payload must be null, undefined, or an object');\n    }\n\n    // Ensure no metadata fields are in the provided customPayload\n    [PROTOCOL_FIELD_NAME, OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME].forEach(currMetadataFieldName => {\n        if (customPayload && Object.prototype.hasOwnProperty.call(customPayload, currMetadataFieldName)) {\n            throw new Error(`Payload contains reserved metadata prop '${currMetadataFieldName}'`);\n        }\n    });\n\n    return assign(\n        {\n            [PROTOCOL_FIELD_NAME]: APPS_API_PROTOCOL,\n            [OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME]: eventType\n        },\n        customPayload || {}\n    );\n}\n\nexport default AppApiCall;\n","import config from '../config/environment';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport InternallyHostedApp from './internally-hosted-app';\n\nconst { Evented, computed, run, get } = Ember;\n\nlet AppState = Ember.Object.extend({\n    name: null,\n    ordinal: 0,\n    compareTo(anotherState) {\n        if (!anotherState) {\n            return 1;\n        } else if (Object.getPrototypeOf(anotherState) !== Object.getPrototypeOf(this)) {\n            let errorMsg = 'Cannot compare AppState another object type';\n            Ember.Logger.error(errorMsg);\n            throw new Error(errorMsg);\n        }\n\n        return this.get('ordinal') - anotherState.get('ordinal');\n    }\n});\n\n/**\n * List of lifecycle-oredered, AppState instances\n *\n * Callers can use the @see AppState#copareTo method to test for state order\n */\nexport const APP_STATES = {\n    LOADING: AppState.create({\n        ordinal: 100\n    }),\n    BOOTSTRAPPING: AppState.create({\n        ordinal: 200\n    }),\n    RUNNING: AppState.create({\n        ordinal: 300\n    }),\n    STOPPING: AppState.create({\n        ordinal: 400\n    }),\n    STOPPED: AppState.create({\n        ordinal: 500\n    })\n};\n\n/**\n * The event name (internal eventing) that will be fired when the\n * lifecycle is changing (opt-in).  The primary consumer of this event will\n * be the app-instance component for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOK_EVENT = 'appLifecycleHook';\n\n/**\n * The event payload values for @see {LIFECYCLE_HOOK_EVENT} that will\n * notify of a new lifecycle state (opt-in).  Again, this will typically be used\n * by the app-instance componet for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOKS = {\n    BOOTSTRAP: 'bootstrap',\n    FOCUS: 'focus',\n    BLUR: 'blur',\n    STOP: 'stop'\n};\n\n/**\n * The callback types utilized by the Apps SDK (or app devs directly) as the\n * postMessage payload confirming the succes of app-side work within a lifecycle\n * phase.\n */\nexport const APP_LIFECYCLE_CALLBACKS = {\n    BOOTSTRAPPED: 'bootstrapped',\n    STOPPED: 'stopped'\n};\n\n/**\n * The list of problems which can affect this app-instance\n */\nexport const APP_PROBLEMS = {\n    APP_UPDATED: 'updated',\n    APP_DELETED: 'deleted',\n    LICENSE_UNAVAILABLE: 'licenseUnavailable'\n};\n\n/*\n * Internal, configuration details of each app lifecycle state which will be ordered by ordinal.\n *\n * Heads up, this config is not validated internally.  So you break it, you bought it.\n */\nconst STATE_CONFIGS = {\n    [APP_STATES.LOADING]: {\n        lifecycleDetails: {\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.loading')\n        }\n    },\n    [APP_STATES.BOOTSTRAPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.bootstrap',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.bootstrapping'),\n            broadcastHookName: LIFECYCLE_HOOKS.BOOTSTRAP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.BOOTSTRAPPED\n        }\n    },\n    [APP_STATES.RUNNING]: {},\n    [APP_STATES.STOPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.stop',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.stopping'),\n            broadcastHookName: LIFECYCLE_HOOKS.STOP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.STOPPED\n        }\n    },\n    [APP_STATES.STOPPED]: {}\n};\n\n// Ordered list of lifecycle states\nconst LIFECYCLE_ORDERED_APP_STATES = Object.keys(APP_STATES)\n    .map(currStateName => APP_STATES[currStateName])\n    .sort((state1, state2) => state1.compareTo(state2));\n\n/**\n * An app-instance manages the runtime state of a particular instance of an app.\n * It contains the current lifecyle state, tracks transitional states, stores\n * any problems that might be affecting this instance, provides an api to\n * manipulate the lifecycle, and broadcasts events to integrate\n * with the rendering portion of the lifecycle.\n *\n * Important Notes:\n * app-instances are managed by an app-pool and must also be rendered with\n * an app-pool (transitively: app-instance and app-embed) component to ensure the\n * lifecycle correctly accounts for rendering and callbacks.\n *\n * Problems can occur at any state and may or may not exclusively affect state.  Therefore,\n * there is no app-state \"PROBLEM\".  Rather, users should consult the problem attribute\n * in addition to state.\n *\n * Instance Lifecycle States:\n *  <ol>\n *      <li>LOADING - The app's iframe is loading</li>\n *      <li>BOOTSTRAPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'bootstrap' hook (event fired)</li>\n *              <li>Awaits 'bootstrapped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>RUNNING\n *          <ul>\n *              <li>'blur' hook (event fired) on app blur (Opt-in)</li>\n *              <li>'focus' hook (event fired) on subsequent app focus (Opt-in)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'stop' hook (event fired) after stop requested</li>\n *              <li>Awaits 'stopped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPED - The app has shut down and the instance can safely be removed from PureCloud</li>\n *  </ol>\n *\n * Lifecycle Hooks (Opt In):\n * If an app is so configured, this class will broadcast lifecyle events out.  The\n * primary consumer of these events will be the app-instance component who will re-broadcast\n * the event onto the app's iframe.\n *\n * <ul>\n *   <li>bootstrap</li>\n *   <li>focus</li>\n *   <li>blur</li>\n *   <li>stop</li>\n * </ul>\n *\n * Lifecycle Callbacks:\n * App developers can acknowledge completion of certain app-side work via callbacks.\n * Callbacks are opt-in and will eventually time out to prevent an app from locking up\n * <ul>\n *   <li>bootstrapped</li>\n *   <li>stopped</li>\n * </ul>\n */\nconst AppInstance = Ember.Object.extend(Evented, {\n    instanceId: null,\n    app: null,\n\n    currState: null,\n    _currStateStartTimestamp: null,\n    problem: {\n        name: null,\n        details: null\n    },\n\n    lastUserAccessTimestamp: null,\n\n    _stateTimeoutTimer: null,\n\n    // sets a badging count for the app instance\n    attentionCount: 0,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('instanceId', Ember.guidFor(this));\n\n        this.set('problem', {\n            name: null,\n            details: null\n        });\n\n        // Attach to beforeunload event to get instrumentation on app shutdown\n        // Note: beforeunload listeners should not be attached via jquery\n        if (window && window.addEventListener) {\n            let reportStoppedInteraction = () => {\n                Ember.run(() => {\n                    // Inactive app integrations will have already been reported\n                    if (this._inAppInteraction()) {\n                        this._appendAppInteraction('windowUnload', true);\n                    }\n                });\n            };\n            this.set('reportStoppedInteraction', reportStoppedInteraction);\n            window.addEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let timeout = this.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let reportStoppedInteraction = this.get('reportStoppedInteraction');\n        if (reportStoppedInteraction) {\n            window.removeEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    appId: computed('app.id', function () {\n        let appId = this.get('app.id');\n\n        return appId || null;\n    }),\n\n    start() {\n        this._startAppInteraction('start');\n        this._advanceState(APP_STATES.LOADING);\n        this.set('lastUserAccessTimestamp', Date.now());\n    },\n\n    loaded() {\n        this._advanceState(APP_STATES.BOOTSTRAPPING);\n    },\n\n    bootstrapped() {\n        this._advanceState(APP_STATES.RUNNING);\n    },\n\n    focus() {\n        this._startAppInteraction('focus');\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.focus')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.FOCUS);\n        }\n    },\n\n    blur() {\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.blur')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.BLUR);\n        }\n\n        this._appendAppInteraction('blur', true);\n    },\n\n    stop() {\n        this._advanceState(APP_STATES.STOPPING);\n    },\n\n    stopped() {\n        this._advanceState(APP_STATES.STOPPED);\n    },\n\n    setProblem(name, details = null) {\n        this.set('problem.name', name);\n        this.set('problem.details', details);\n        this.notifyPropertyChange('problem');\n    },\n\n    _advanceState(requestedState) {\n        let currState = this.get('currState');\n        if (!requestedState || requestedState.compareTo(currState) <= 0) {\n            // Invalid next state\n            return;\n        }\n\n        // if monitoring ... cancel\n        let timeout = this.get('_stateTimeoutTimer');\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let requestedStateConfig = STATE_CONFIGS[requestedState];\n        let nextState = this._getNextState(requestedState);\n\n        if (\n            requestedStateConfig.lifecycleDetails &&\n            requestedStateConfig.lifecycleDetails.stateOptInPropName &&\n            !this.get(`app.lifecycle.${requestedStateConfig.lifecycleDetails.stateOptInPropName}`) &&\n            nextState\n        ) {\n            // App doesn't need this transitional state ... move to the next\n\n            this._advanceState(nextState);\n            return;\n        }\n\n        this.set('currState', requestedState);\n        this.set('_currStateStartTimestamp', Date.now());\n\n        if (this._inAppInteraction()) {\n            this._appendAppInteraction(\n                this._convertStateToLifecycleEvent(requestedState),\n                requestedState === APP_STATES.STOPPED\n            );\n        } else if (requestedState === APP_STATES.STOPPED) {\n            // Because an app will likely be hidden when stopped, there is no\n            // active interaction; however, this event represents a user dismissing\n            // an app (updated/deleted) or a pool eviction; so it's important to log\n            this._logInactiveAppStopped();\n        }\n\n        if (requestedStateConfig.lifecycleDetails) {\n            if (requestedStateConfig.lifecycleDetails.broadcastHookName) {\n                this._triggerLifecycleHookEvent(requestedStateConfig.lifecycleDetails.broadcastHookName);\n            }\n\n            if (requestedStateConfig.lifecycleDetails.maxDurationMillis) {\n                // Start transitional state timeout\n                this.set(\n                    '_stateTimeoutTimer',\n                    run.later(\n                        this,\n                        '_monitorTransitionalState',\n                        requestedStateConfig.lifecycleDetails.maxDurationMillis + 1\n                    )\n                );\n            }\n        }\n    },\n\n    _triggerLifecycleHookEvent(hook) {\n        this.trigger(LIFECYCLE_HOOK_EVENT, {\n            hook\n        });\n    },\n\n    _monitorTransitionalState() {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        let currState = this.get('currState');\n        let currStateConfig = STATE_CONFIGS[currState];\n        let nextState = this._getNextState(currState);\n        let currStateEntryTimestamp = this.get('_currStateStartTimestamp');\n        let maxDuration = currStateConfig ? get(currStateConfig, 'lifecycleDetails.maxDurationMillis') : undefined;\n\n        if (currStateConfig && currStateEntryTimestamp !== null && maxDuration) {\n            let timeInState = Date.now() - currStateEntryTimestamp;\n\n            if (timeInState < maxDuration) {\n                // Should not occur, but will re-kick the timer to wait until the state has expired\n                this.set('_stateTimeoutTimer', run.later(this, '_monitorTransitionalState', 100));\n            } else if (nextState) {\n                // The transitional state has expired and can be moved to the next state\n                this._advanceState(nextState);\n            }\n        }\n    },\n\n    _getNextState(currState) {\n        let result = null;\n\n        let currStateIndex = _.findIndex(LIFECYCLE_ORDERED_APP_STATES, currState);\n        if (currStateIndex >= 0 && LIFECYCLE_ORDERED_APP_STATES.length > currStateIndex + 1) {\n            result = LIFECYCLE_ORDERED_APP_STATES[currStateIndex + 1];\n        }\n\n        return result;\n    },\n\n    // Instrumentation\n    _interactionStartTimestamp: null,\n    _latestInteractionTimestamp: null,\n    _inAppInteraction() {\n        return !!this.get('_interactionStartTimestamp');\n    },\n    _startAppInteraction(lifecycleEvent) {\n        let startTimestamp = Date.now();\n        this.set('_interactionStartTimestamp', startTimestamp);\n        this.set('_latestInteractionTimestamp', startTimestamp);\n\n        this._logAppInteraction(lifecycleEvent, {\n            interactionStart: startTimestamp\n        });\n    },\n    _appendAppInteraction(lifecycleEvent, complete) {\n        let startTimestamp = this.get('_interactionStartTimestamp');\n        if (!startTimestamp) {\n            Ember.Logger.error('Attempted to append to an unknown app interaction');\n            return;\n        }\n\n        let now = Date.now();\n        let interactionDetails = {\n            interactionStart: startTimestamp,\n            timeSinceInteractionStart: now - startTimestamp,\n            timeSincePrevInteraction: now - this.get('_latestInteractionTimestamp')\n        };\n\n        if (complete) {\n            interactionDetails.interactionEnd = now;\n            interactionDetails.interactionDuration = now - startTimestamp;\n            this.set('_interactionStartTimestamp', null);\n            this.set('_latestInteractionTimestamp', null);\n        } else {\n            this.set('_latestInteractionTimestamp', Date.now());\n        }\n\n        this._logAppInteraction(lifecycleEvent, interactionDetails);\n    },\n    /**\n     * logs an app shutdown as a single pageAction regardless of interaction\n     * state due to the importance of this event.  Usually, this will be\n     * the result of a user dismissal (update/deleted app) or pool\n     * eviction.\n     */\n    _logInactiveAppStopped() {\n        let now = Date.now();\n        this._logAppInteraction(this._convertStateToLifecycleEvent(APP_STATES.STOPPED), {\n            interactionStart: now,\n            timeSinceInteractionStart: 0,\n            timeSincePrevInteraction: 0,\n            interactionEnd: now,\n            interactionDuration: 0\n        });\n    },\n    _logAppInteraction(lifecycleEvent, interactionDetails) {\n        let commonAttrs = {\n            lifecycleEvent,\n            pcAppTypeId: this.get('app.typeId'),\n            pcAppId: this.get('appId'),\n            pcAppInstanceId: this.get('instanceId'),\n            pcAppDisplayType: this.get('app.displayType'),\n            pcAppInternallyHosted: this.get('app') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: this.get('app.featureCategory'),\n            pcAppProblemName: this.get('problem.name'),\n            interactionId: this.get('app.interactionId')\n        };\n        for (const queryParam of this.get('app').getURLTemplateQueryParams()) {\n            commonAttrs[`${queryParam}UrlReplacement`] = true;\n        }\n        addPageAction('clientAppInteraction', _.merge({}, interactionDetails, commonAttrs));\n    },\n    _convertStateToLifecycleEvent(appState) {\n        switch (appState) {\n            case APP_STATES.LOADING:\n                return 'loading';\n            case APP_STATES.BOOTSTRAPPING:\n                return 'bootstrapping';\n            case APP_STATES.RUNNING:\n                return 'running';\n            case APP_STATES.STOPPING:\n                return 'stopping';\n            case APP_STATES.STOPPED:\n                return 'stopped';\n            default:\n                return 'unknownAppState';\n        }\n    }\n});\n\nexport default AppInstance;\n","import Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport find from 'lodash/find';\nimport findIndex from 'lodash/findIndex';\nimport isEqual from 'lodash/isEqual';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport orderBy from 'lodash/orderBy';\nimport reduce from 'lodash/reduce';\nimport { addPageAction } from '../utils/newrelic';\nimport AppInstance, { APP_PROBLEMS, APP_STATES } from './app-instance';\n\nconst { computed, RSVP } = Ember;\n\n/**\n * An AppPool manages a collection of apps, appInstances, and their lifecycles.  This object must\n * be used in conjuction with an app-pool component to handle the rendering lifecycle\n * of the appInstances.  Because it handles lifecycles and is render aware, it should also\n * be used for ephemeral apps that need lifecycle hooks called.\n *\n * If a getMaxActive size is set, then the pool will limit the number of concurrent\n * apps; however, apps transitioning into/out of active state will still be\n * included in renderedApps and must still be rendered to the dom to afford the\n * apps time to boot and shutdown appropriately.\n *\n * Top level pool state such as app loading state, if an app is being shown, or\n * if a requested app is unavailable will be represented in currState and the\n * details will contain applicable details.\n *\n * Individual app state such as loading, bootstrapping, app config changes,\n * runtime problems, etc. will be stored in the instance.\n *\n * Only one instance of an app can be \"active\" (loading, booting, or running)\n * at a given time; however, there may be other instances of the same app that are\n * transitioning out of the pool (e.g. stopping, stopped).\n *\n * Top-level Pool States\n *\n * LOADING - Apps are being loaded for the first time or a load failure is being\n *  retried.  Note that this state is NOT re-entered when apps are periodically\n *  refreshed; Instead, the pool will merge running apps behind the scenes.  See\n *  the AppInstance model for details.\n *  {\n *    loadRetryAttempt: true|false, // Indicates that this is an initial load retry attempt\n *    autoAttempt: true|false, // The loading request was made automatically by the pool\n *  }\n *\n * LOAD_FAILED - Initial load of the pool failed.  This state is recoverable\n *  automatically if loadRetryBaseMillis is configured or manually via the\n *  reloadApps call.  If an app was previously\n *  attempted to be shown, that state will attempt to be restored if the load\n *  eventually succeeds.\n *\n *  This state will not occur if a reloadApps fails after a successful init.  In\n *  this case, the pool will remain with the existing apps until a successful\n *  reload.\n *\n *  {\n *      loadRetryScheduled: true|false\n *  }\n *\n * IDLE - Apps are successfully loaded, but no app is being used\n *  null - No Details\n *\n * APP_NOT_FOUND - The requested app is not known to this pool\n *  {\n *      appId: <id> // The attempted app Id\n *  }\n *\n * ALLOCATING_SPACE - Space is being made for the requested instance\n *  {\n *    // the pending instance's details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * SHOWING_APP - An app is active.  Note: App may be loading or have a problem.\n *  @see {app-instance} for the enumerated states of an instance\n *  {\n *    // active instance details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * ALLOCATION_FAILED - Space could not be made for the requested instance\n *  {\n *    // the failed instance's details\n *    appId: app.id,\n *    app\n *  }\n *\n * Events:\n *  appPoolReloaded - Triggered when this pool's apps have been reloaded either\n *      manually or via a scheduled refresh\n *\n * @see {app-instance} For details on lifecylce, hooks, events, etc.\n */\n\nexport const APPS_RELOADED_EVENT = 'appPoolReloaded';\n\nexport const POOL_STATES = {\n    IDLE: 'idle',\n    LOADING: 'loading',\n    APP_NOT_FOUND: 'appNotFound',\n    ALLOCATING_SPACE: 'allocating',\n    SHOWING_APP: 'showingApp',\n    ALLOCATION_FAILED: 'allocationFailed',\n    LOAD_FAILED: 'loadFailed'\n};\n\nconst AppPool = Ember.Object.extend(Ember.Evented, LoggerMixin, {\n    // Public params\n    /**\n     * Optional, dev-friendly pool name used for logging purposes.\n     */\n    poolName: null,\n\n    /**\n     * A function that returns the maximum number of concurrent running\n     * apps (does not include apps shutting down). The app pool size is not dynamic and\n     * will not properly respond to changing the value this function returns.\n     */\n    getMaxActive: null,\n    /**\n     * Function to fetch apps for this pool.  Must return a Promise.  Will be used\n     * to load and refresh the pool.\n     */\n    fetchAppsFn: null,\n\n    /**\n     * Base millis for incremental backoff retries (with jitter) of initial apps load failures.\n     * Set <= 0 to disable auto retry and allow manual retry.\n     */\n    loadRetryBaseMillis: -1,\n\n    /**\n     * Max base millis to use in the initial apps load retry backoff.  If not specified,\n     * retry will grow without bound.  If specified and reached, retry will be\n     * loadRetryMaxBackoffMillis + random([0, .1loadRetryMaxBackoffMillis]).\n     */\n    loadRetryMaxBackoffMillis: -1,\n\n    /**\n     * Millis to wait until refreshing the list of apps in the pool.\n     * Apps will be smartly merged per logic in reloadApps.\n     */\n    reloadAppsIntervalMillis: -1,\n\n    /**\n     * Base millis for exponential backoff of reload retries if the initial interval attempt fails.\n     * Full jitter will be applied until reloadAppsIntervalMillis is hit.  Once reached,\n     * retry will be reloadAppsIntervalMillis + random([0, .1reloadAppsIntervalMillis]).\n     */\n    reloadAppsRetryBaseMillis: 1000,\n\n    /**\n     * The number of millis to wait between checks for stopped instances.\n     *\n     * Primarily configurable for testing purposes.\n     */\n    stoppedInstanceRemovalInterval: 500,\n\n    // Public Props\n    currState: {\n        name: null,\n        details: null\n    },\n    /**\n     * A list of app instances whose iframe elements MUST be rendered.\n     * This list will include transitional apps and, therefore, is not suitable to query\n     * for which apps are actively being used by the user.\n     */\n    renderedAppInstances: computed.alias('_renderedInstances'),\n\n    // Private Props\n    _loadAppsPromise: null, // Holds the initial apps load promise (and reload promise if the initial load fails)\n    _showFailureRestoreAppId: null, // Holds attempted show appId in case the load fails and needs reloaded\n    _loadRetryAttempts: 0, // Holds the number of load retry attempts (Used to calculate backoff)\n    _loadRetryScheduled: computed.bool('_loadRetryTask.isRunning'), // Computed indicating if a retry is scheduled\n\n    _reloadFailureCount: 0, // Failure attempts since last successful reload\n\n    skipLongRunningTasks: false,\n\n    appAttentionCounts: computed('_renderedInstances.[]', '_renderedInstances.@each.attentionCount', function () {\n        let counts = Ember.Object.create({});\n        let runningInstances = this._searchInstances(this.get('_renderedInstances'), {\n            appId: null,\n            maxState: APP_STATES.RUNNING\n        });\n\n        runningInstances.forEach(currInstance => {\n            counts.set(currInstance.get('app.id'), currInstance.get('attentionCount'));\n        });\n\n        return counts;\n    }),\n\n    totalAttentionCount: computed('appAttentionCounts', function () {\n        let keys = Object.keys(this.get('appAttentionCounts'));\n        let sum = 0;\n        keys.forEach(key => {\n            sum += this.get(`appAttentionCounts.${key}`);\n        });\n        return sum;\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.setProperties({\n            _apps: [],\n            _renderedInstances: [],\n            currState: {\n                name: null,\n                details: null\n            },\n            _fetchFailureLog: {\n                abortedCount: 0,\n                endpointFailureCount: 0\n            }\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let instances = this.get('_renderedInstances');\n        if (instances && instances.length > 0) {\n            instances.forEach(currInstance => {\n                if (currInstance && !currInstance.isDestroying && !currInstance.isDestroyed) {\n                    currInstance.destroy();\n                }\n            });\n        }\n    },\n\n    /**\n     * Returns a promise resolving with the list of loaded apps or rejected due to load failure\n     */\n    findAllApps() {\n        return this._loadApps().then(() => {\n            return this.get('_apps');\n        });\n    },\n\n    /**\n     * Returns a promise that will be resolved with the newly shown instance if successful\n     * or rejected if the show operation could not be performed (See pool failure states)\n     */\n    showApp(appId) {\n        return this._findApp(appId)\n            .then(app => {\n                let [existingInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                    appId,\n                    maxState: APP_STATES.RUNNING\n                });\n\n                return new RSVP.Promise(resolve => {\n                    if (existingInstance) {\n                        existingInstance.focus();\n\n                        this._setState(POOL_STATES.SHOWING_APP, {\n                            appId,\n                            instanceId: existingInstance.instanceId,\n                            instance: existingInstance\n                        });\n\n                        resolve(this.get('currState'));\n                    } else {\n                        resolve(this._allocateNewInstance(app));\n                    }\n                });\n            })\n            .catch(reason => {\n                if (reason && typeof reason === 'object' && Object.prototype.hasOwnProperty.call(reason, 'name')) {\n                    // A promise already rejected with state\n\n                    if (reason.name === POOL_STATES.LOAD_FAILED) {\n                        // store the attempted appId here incase the user wants to reload\n                        this.set('_showFailureRestoreAppId', appId);\n                    }\n\n                    // reject it on through\n                    return RSVP.reject(reason);\n                } else {\n                    this._setState(POOL_STATES.APP_NOT_FOUND, {\n                        appId\n                    });\n\n                    return RSVP.reject(this.get('currState'));\n                }\n            });\n    },\n\n    /**\n     * Hides the specified running instance, sets it's last used ts, and sets the pool to idle\n     *\n     * @returns a promise that will be resolved with the hidden instance\n     * details or rejected if the instance could not be found, was not running,\n     * or was not shown.\n     * (See pool failure states)\n     */\n    hideApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                instanceId,\n                maxState: APP_STATES.STOPPING\n            });\n\n            if (\n                runningInstance &&\n                this.get('currState.name') === POOL_STATES.SHOWING_APP &&\n                this.get('currState.details.instance.instanceId') === runningInstance.get('instanceId')\n            ) {\n                runningInstance.blur();\n                this._setState(POOL_STATES.IDLE);\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.get('currState'));\n            }\n        });\n    },\n\n    /**\n     * Stops the specified running instance, if available.  The instance will\n     * still complete its lifecycle as configured.  The pool state will not be\n     * modified.\n     *\n     * @returns a promise that will be resolved with the stopped instance\n     * details or rejected if the instance could not be found or was not running.\n     * (See pool failure states)\n     */\n    stopApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.get('currState'));\n            }\n\n            let [runningInstance] = this._searchInstances(this.get('_renderedInstances'), {\n                instanceId,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (runningInstance) {\n                runningInstance.stop();\n\n                this._monitorAppLifecycles();\n\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.get('currState'));\n            }\n        });\n    },\n\n    /**\n     * Reattempt a failed app load or fetch and merge latest apps with current apps.\n     * Note: if the pool is configured for auto-reload attempts on failure, calling this\n     * manually while in a LOAD_FAILED state will have no effect and always reject\n     * with LOAD_FAILED status.\n     *\n     * If an instance is running and its backing app is updated/removed, the current\n     * app version will be used/retained.  Once the app instance is no longer running,\n     * (i.e. the user confirms removal) a subsequent reloadApps call will\n     * replace/remove the app.\n     *\n     * @returns a promise which resolves/rejects with the current pool state.  Note that\n     * the promise may reject but the pool state will be a success state.  This indicates\n     * that the reload failed, but the existing apps are still being used.\n     */\n    reloadApps() {\n        return this._reloadApps();\n    },\n\n    /**\n     * Helper method to differentiate internal and external requests\n     *\n     * @private\n     */\n    _reloadApps(internalLoadRetry = false) {\n        return this._loadApps()\n            .then(() => {\n                // Fetch current apps and overlay with any running, existing apps\n                return this.__fetchApps().then(latestApps => {\n                    let mergedApps = [];\n\n                    this._searchInstances(this.get('_renderedInstances'), {\n                        appId: null,\n                        maxState: APP_STATES.RUNNING\n                    }).forEach(runningInstance => {\n                        let newApp = find(latestApps, { id: runningInstance.get('appId') });\n\n                        let problem = null;\n                        if (!newApp) {\n                            problem = APP_PROBLEMS.APP_DELETED;\n                        } else if (!isEqual(newApp, runningInstance.app)) {\n                            problem = APP_PROBLEMS.APP_UPDATED;\n                        }\n\n                        if (problem) {\n                            // App has been removed or changed, keep the existing until\n                            // the user shuts down the running app\n                            runningInstance.setProblem(problem);\n                            mergedApps.push(runningInstance.app);\n                        }\n                    });\n\n                    // Add all latestApps that have not been overridden by current apps\n                    latestApps.forEach(currNewApp => {\n                        if (findIndex(mergedApps, { id: currNewApp.id }) < 0) {\n                            mergedApps.push(currNewApp);\n                        }\n                    });\n\n                    this.set('_apps', mergedApps);\n\n                    return this.get('currState');\n                });\n            })\n            .catch(reason => {\n                if (\n                    reason &&\n                    reason.name &&\n                    reason.name === POOL_STATES.LOAD_FAILED &&\n                    (!this.get('_loadRetryScheduled') || internalLoadRetry)\n                ) {\n                    // Initial load previously failed\n                    // OK to retry; this is an manual or internal, automatic reload request\n                    // Reload success will be broadcast in handler below or pass rejection/pool state on through\n                    return this._loadApps(true, internalLoadRetry);\n                }\n\n                // Failed on subsequent app reload\n                // Leave the current pool-state and/or apps alone and just reject this function's promise\n                return RSVP.reject(this.get('currState'));\n            })\n            .then(loadResult => {\n                this.trigger(APPS_RELOADED_EVENT);\n\n                let restoreAppId = this.get('_showFailureRestoreAppId');\n                if (restoreAppId) {\n                    // reload attempt succeeded; retry appId one more time\n                    this.set('_showFailureRestoreAppId', null);\n\n                    return this.showApp(restoreAppId);\n                } else {\n                    return loadResult;\n                }\n            });\n    },\n\n    _setState(name, details = null) {\n        this.set('currState.name', name);\n        this.set('currState.details', details);\n        this.notifyPropertyChange('currState');\n        this._logPoolEvent('stateUpdate');\n    },\n\n    _findApp(appId) {\n        return this._loadApps().then(() => {\n            let app = find(this.get('_apps'), { id: appId });\n            return app || RSVP.reject('appNotFound');\n        });\n    },\n\n    /**\n     * Singleton initial load of apps.  All calls wait on this initial load\n     * to ensure a base state of the pool (loaded or failure).\n     *\n     * LOAD SUCCESS:\n     * Sets the pool state to idle and will initiate automatic app refresh\n     * if the pool owner has configured it via reloadAppsIntervalMillis.  If the\n     * owner has not configured automatic refresh, it can be manually triggered\n     * via reloadApps.\n     *\n     * LOAD FAILURE:\n     * In the event of load failure, load can be retried by passing true for\n     * the forceReload argument. Note that forceReload will still only allow\n     * one concurrent reload call. The pool can be configured to automatically\n     * attempt reloads via loadRetryBaseMillis.\n     *\n     * @private\n     */\n    _loadApps(forceReload = false, autoLoadRetry = false) {\n        this.logger.debug('app-pool:_loadApps', { remoteData: { forceReload, autoLoadRetry } });\n        let result = this.get('_loadAppsPromise');\n\n        if (result === null || (forceReload && this.get('currState.name') === POOL_STATES.LOAD_FAILED)) {\n            this._setState(POOL_STATES.LOADING, {\n                loadRetryAttempt: forceReload,\n                autoAttempt: autoLoadRetry\n            });\n            this.set(\n                '_loadAppsPromise',\n                (result = this.__fetchApps()\n                    .then(apps => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps succeeded', {\n                            apps,\n                            remoteData: { apps: apps.map(app => app.get('id')) }\n                        });\n                        this.set('_apps', apps);\n                        this._setState(POOL_STATES.IDLE);\n                        if (!this.get('skipLongRunningTasks')) {\n                            this._scheduleAppReload();\n                        }\n                        return this.get('currState');\n                    })\n                    .catch(e => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps threw exception', e);\n                        let autoRetry = this.get('loadRetryBaseMillis') > 0;\n                        this._setState(POOL_STATES.LOAD_FAILED, {\n                            loadRetryScheduled: autoRetry\n                        });\n                        if (autoRetry) {\n                            this._retryInitialAppLoad();\n                        }\n                        return RSVP.reject(this.get('currState'));\n                    }))\n            );\n        }\n\n        return result;\n    },\n\n    /**\n     * Schedules an app load retry in the future based on attempt state (backoff, jitter, etc.)\n     *\n     * @private\n     */\n    _retryInitialAppLoad() {\n        let retryBase = this.get('loadRetryBaseMillis');\n        if (retryBase > 0) {\n            // pool owner requested automatic retry\n            let retryAttempts = this.incrementProperty('_loadRetryAttempts');\n\n            let retryInterval = retryBase * Math.pow(2, retryAttempts - 1);\n\n            let maxRetryDuration = this.get('loadRetryMaxBackoffMillis');\n            if (maxRetryDuration > 0 && retryInterval >= maxRetryDuration) {\n                // Max specified and reached; use max and a little jitter\n                retryInterval = maxRetryDuration + Math.floor(Math.random() * (maxRetryDuration * 0.1));\n            } else {\n                // Standard retry, Using \"full jitter\"\n                retryInterval = Math.floor(Math.random() * retryInterval);\n            }\n\n            this.get('_loadRetryTask').perform(retryInterval);\n        }\n    },\n\n    _loadRetryTask: task(function* (retryInterval) {\n        let timeoutVal = retryInterval;\n        this.logger.debug('app-pool:_loadRetryTask Pausing before retry', { remoteData: { timeoutVal } });\n        yield timeout(timeoutVal);\n        try {\n            yield this._reloadApps(true);\n        } catch (e) {\n            let abortedAttempts = this.get('_fetchFailureLog.abortedCount');\n            let endpointAttempts = this.get('_fetchFailureLog.endpointFailureCount');\n            if (abortedAttempts + endpointAttempts === 6) {\n                const msg =\n                    'Apps Initial load and 5 retry attempts failed. Continuing to retry but should be investigated';\n                Ember.Logger.warn(this._decorateLogStatement(msg), {\n                    remoteData: { abortedAttempts, endpointAttempts }\n                });\n            }\n        }\n    }),\n\n    /**\n     * Handles scheduling, rescheduling, and backoff of app refreshes per pool config\n     *\n     * @private\n     */\n    _scheduleAppReload() {\n        let reloadInterval = this.get('reloadAppsIntervalMillis');\n        this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadInterval } });\n        if (reloadInterval > 0) {\n            // pool owner requested automatic refresh\n\n            let reloadWait = reloadInterval;\n\n            let reloadFailureCount = this.get('_reloadFailureCount');\n            this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadFailureCount } });\n            if (reloadFailureCount > 0) {\n                // Previous reload failed; backoff and retry\n                reloadWait = Math.min(\n                    reloadInterval,\n                    this.get('reloadAppsRetryBaseMillis') * Math.pow(2, reloadFailureCount - 1)\n                );\n                if (reloadWait === this.get('reloadAppsIntervalMillis')) {\n                    // Max reached; use max and a little jitter\n                    reloadWait += Math.floor(Math.random() * (reloadWait * 0.1));\n                } else {\n                    // Standard retry, Using \"full jitter\"\n                    reloadWait = Math.floor(Math.random() * reloadWait);\n                }\n            }\n            this.logger.debug('app-pool:_scheduleAppReload Kicking off reloadTimer', { remoteData: { reloadWait } });\n            this.get('_reloadTimerTask').perform(reloadWait);\n        }\n    },\n\n    _reloadTimerTask: task(function* (reloadWait) {\n        yield timeout(reloadWait);\n        try {\n            yield this.reloadApps();\n            this.set('_reloadFailureCount', 0);\n        } catch (e) {\n            this.incrementProperty('_reloadFailureCount');\n            if (this.get('_fetchFailureLog.endpointFailureCount') === 6) {\n                Ember.Logger.warn(\n                    this._decorateLogStatement(\n                        'Apps Reload and 5 retry attempts failed. Continuing to retry but should be investigated'\n                    )\n                );\n            } else if (this.get('_fetchFailureLog.abortedCount') === 11) {\n                Ember.Logger.info(\n                    this._decorateLogStatement(\n                        'Apps Reload and 10 retry attempts have been cancelled. This could indicate a lost network connection or CORS issue. Continuing to retry but should be investigated'\n                    )\n                );\n            }\n        } finally {\n            if (!this.get('skipLongRunningTasks')) {\n                this._scheduleAppReload();\n            }\n        }\n    }),\n\n    /**\n     * Internal utility to fetch the apps via the fetchAppsFn\n     *\n     * Important Note: __fetchApps will fetch regardless of pool state.  It is free of side effects,\n     * but will be wasteful if invoked at the wrong state of the pool.  Specifically,\n     * it is only applicable (and should only be called) during the initial apps\n     * load, load failure retries, and apps reloads after successful, initial load\n     * has occurred.\n     *\n     * @returns A promise that resolves with the list of apps or rejects with the reason\n     *\n     * @private\n     */\n    __fetchApps() {\n        return new RSVP.Promise((resolve, reject) => {\n            this.logger.debug('app-pool:__fetchApps entry');\n            let fetchAppsFn = this.get('fetchAppsFn');\n            if (typeof fetchAppsFn !== 'function') {\n                Ember.Logger.error(this._decorateLogStatement('No/Invalid App Fetch function'));\n                reject('badFetchFunction');\n            } else {\n                try {\n                    fetchAppsFn()\n                        .then(apps => {\n                            this.logger.debug('app-pool:__fetchApps fetchAppsFn returned', apps);\n                            this.set('_fetchFailureLog.abortedCount', 0);\n                            this.set('_fetchFailureLog.endpointFailureCount', 0);\n\n                            if (!Array.isArray(apps)) {\n                                Ember.Logger.error(\n                                    this._decorateLogStatement('Invalid App Fetch Payload. Expected Array.'),\n                                    { remoteData: { typeOfApps: Ember.typeOf(apps) } }\n                                );\n                                reject('invalidFetchPayload');\n                            } else {\n                                resolve(apps);\n                            }\n                        })\n                        .catch(reason => {\n                            this.logger.debug('app-pool:__fetchApps apps fetch failed', reason);\n                            if (isAjaxError(reason) && isAbortError(reason)) {\n                                // Skipping logging to avoid flooding sumo with false positives related to the browser sleeping.\n                                // Will log excessive cancelled retries which might indicate a cors issue\n                                this.incrementProperty('_fetchFailureLog.abortedCount');\n                                reject('abortedRequest');\n                            } else {\n                                Ember.Logger.info(this._decorateLogStatement('App fetch request failed.'), { reason });\n                                this.incrementProperty('_fetchFailureLog.endpointFailureCount');\n                                reject('endpointFailure');\n                            }\n                        });\n                } catch (error) {\n                    Ember.Logger.error(this._decorateLogStatement('Failed to invoke App Fetch function.'), { error });\n                    reject('fetchFunctionRuntimeError');\n                }\n            }\n        });\n    },\n\n    _allocateNewInstance(app) {\n        let pendingInstance = AppInstance.create({\n            app\n        });\n\n        this._setState(POOL_STATES.ALLOCATING_SPACE, {\n            appId: app.id,\n            instanceId: pendingInstance.instanceId,\n            instance: pendingInstance\n        });\n\n        return new RSVP.Promise((resolve, reject) => {\n            this._allocateSpace()\n                .then(() => {\n                    // Room at the inn\n                    pendingInstance.start();\n                    this.get('_renderedInstances').pushObject(pendingInstance);\n\n                    this._setState(POOL_STATES.SHOWING_APP, {\n                        appId: app.id,\n                        instanceId: pendingInstance.instanceId,\n                        instance: pendingInstance\n                    });\n\n                    resolve(this.get('currState'));\n                })\n                .catch(() => {\n                    pendingInstance.destroy();\n\n                    this._setState(POOL_STATES.ALLOCATION_FAILED, {\n                        appId: app.id,\n                        app\n                    });\n\n                    reject(this.get('currState'));\n                });\n        });\n    },\n\n    _allocateSpace() {\n        let getMaxActive = this.get('getMaxActive');\n        if (getMaxActive) {\n            let renderedInstances = this.get('_renderedInstances');\n\n            let existingInstances = this._searchInstances(renderedInstances, {\n                appId: null,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (existingInstances.length >= getMaxActive()) {\n                // Make way\n                let sortedInstances = orderBy(\n                    existingInstances,\n                    ['app.lifecycle.ephemeral', 'lastUserAccessTimestamp'],\n                    ['desc', 'asc']\n                );\n\n                let instanceToEvict = sortedInstances[0];\n                instanceToEvict.stop();\n                this._logPoolEvent('eviction', { evictedAppId: instanceToEvict.get('appId') });\n                this._monitorAppLifecycles();\n            }\n        }\n\n        return RSVP.resolve();\n    },\n\n    _searchInstances(instances, { instanceId = null, appId = null, states = [], maxState = null } = {}) {\n        let result = [];\n\n        if (instances && Array.isArray(instances) && instances.length > 0) {\n            if (states && Array.isArray(states) && states.length > 0) {\n                result = instances.filter(currInstance => {\n                    let instanceState = currInstance.get('currState');\n                    return states.indexOf(instanceState) >= 0;\n                });\n            } else if (maxState) {\n                result = instances.filter(currInstance => {\n                    let currInstanceState = currInstance.get('currState');\n                    return maxState.compareTo(currInstanceState) >= 0;\n                });\n            } else {\n                result = instances;\n            }\n\n            if (instanceId) {\n                let specificInstance = find(result, { instanceId });\n                result = specificInstance ? [specificInstance] : [];\n            } else if (appId) {\n                result = result.filter(instance => appId === instance.get('appId'));\n            }\n        }\n\n        return result;\n    },\n\n    _monitorAppLifecycles() {\n        if (this._removeStopped() && !this.get('skipLongRunningTasks')) {\n            this.get('_monitorAppLifecyclesTask').perform();\n        }\n    },\n\n    _monitorAppLifecyclesTask: task(function* () {\n        yield timeout(this.get('stoppedInstanceRemovalInterval'));\n        this._monitorAppLifecycles();\n    }),\n\n    _removeStopped() {\n        let renderedInstances = this.get('_renderedInstances');\n\n        let stoppedInstances = this._searchInstances(renderedInstances, {\n            states: [APP_STATES.STOPPED]\n        });\n        stoppedInstances.forEach(currInstance => {\n            currInstance.destroy();\n            renderedInstances.removeObject(currInstance);\n        });\n\n        return (\n            this._searchInstances(renderedInstances, {\n                states: [APP_STATES.STOPPING]\n            }).length > 0\n        );\n    },\n\n    _decorateLogStatement(logText) {\n        let prefix = 'AppPool';\n        let poolName = this.get('poolName');\n        if (poolName && Ember.typeOf(poolName) === 'string') {\n            prefix += ` (${poolName})`;\n        }\n\n        return `${prefix}: ${logText}`;\n    },\n\n    _logPoolEvent(poolEvent, poolEventDetails = {}) {\n        const getMaxActive = this.get('getMaxActive');\n        const attrs = {\n            poolEvent,\n            poolName: this.get('poolName'),\n            poolState: this.get('currState.name'),\n            maxPoolSize: getMaxActive && getMaxActive(),\n            renderedApps: this.get('renderedAppInstances.length'),\n            totalAttentionCount: this.get('totalAttentionCount')\n        };\n\n        // Only grab primitive fields from the current pool state details\n        // to avoid trying to send NR full app/app-instance models\n        const primitivePoolStateDetails = omitBy(\n            this.get('currState.details'),\n            prop => prop && typeof prop === 'object'\n        );\n        const poolStateDetails = reduce(\n            primitivePoolStateDetails,\n            (acc, val, key) => {\n                acc[`poolState.${key}`] = val;\n                return acc;\n            },\n            {}\n        );\n\n        addPageAction('clientAppPoolEvent', merge({}, poolEventDetails, poolStateDetails, attrs));\n    }\n});\n\nexport default AppPool;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport appUtils from '../utils/apps';\n\nconst { Copyable, computed, copy, getOwner, typeOf, isPresent } = Ember;\n\nconst LIFECYCLE_DEFAULTS = {\n    ephemeral: false,\n    hooks: {\n        bootstrap: false,\n        focus: false,\n        blur: false,\n        stop: false\n    }\n};\n\nexport const DISPLAY_TYPES = {\n    STANDALONE: 'standalone',\n    WIDGET: 'widget',\n    INTERAPPTION: 'interactionWidget'\n};\n\nexport const FEATURE_CATEGORIES = {\n    DIRECTORY: 'directory',\n    CONTACT_CENTER_INSIGHTS: 'contactCenterInsights'\n};\n\nexport const ASSET_CATEGORIES = ['icon', 'monochromicIcon'];\n\nconst URL_REPLACEMENT_PREFIX = '{{';\nconst URL_REPLACEMENT_SUFFIX = '}}';\n// PC\nconst LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'pcLangTag';\nexport const LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_ENV_URL_REPLACEMENT_VAR_NAME = 'pcEnvironment';\nexport const PC_ENV_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_ENV_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'pcConversationId';\nexport const PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'pcUsePopupAuth';\nexport const USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n// GC\nconst GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'gcLangTag';\nexport const GC_LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME = 'gcInteractionId';\nexport const GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'gcConversationId';\nexport const GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME = 'gcInteractionType';\nexport const GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'gcUsePopupAuth';\nexport const GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME = 'gcHostOrigin';\nexport const GC_HOST_ORIGIN_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_TARGET_ENV_REPLACEMENT_VAR_NAME = 'gcTargetEnv';\nexport const GC_TARGET_ENV_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_TARGET_ENV_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n\nconst TOKEN_REPLACEMENTS = {\n    // PC\n    [LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [PC_ENV_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_ENV_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'envTld'\n    },\n    [PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    // GC\n    [GC_LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementValue: (interactionId, interactionType) => {\n            return interactionType === 'conversation' ? interactionId : '';\n        }\n    },\n    [GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionType'\n    },\n    [GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    [GC_HOST_ORIGIN_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcHostOrigin'\n    },\n    [GC_TARGET_ENV_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_TARGET_ENV_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcTargetEnv'\n    }\n};\n\nconst URL_REPLACEMENTS = Object.entries(TOKEN_REPLACEMENTS).map(\n    ([replacementToken, { queryParamName, replacementProp, replacementValue }]) => {\n        return {\n            regExp: new RegExp(replacementToken, 'g'),\n            queryParamName,\n            replacementProp,\n            replacementValue\n        };\n    }\n);\n\nexport const INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS = ['chat', 'call', 'callback', 'email'];\nexport const INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS = [\n    'apple',\n    'sms',\n    'line',\n    'facebook',\n    'open',\n    'instagram',\n    'twitter',\n    'webmessaging',\n    'whatsapp'\n];\nexport const INTERAPPTION_COMMUNICATION_TYPE_FILTERS = [\n    ...INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS,\n    ...INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS\n];\nexport const NO_SUPPORTED_COMMUNICATION_TYPE_FILTER = 'none';\n\nconst App = Ember.Object.extend(Copyable, {\n    typeId: null,\n    id: null,\n    name: null,\n    urlTemplate: null,\n    langTag: null,\n    envTld: null,\n    usePopupAuth: false,\n    displayType: null, // The type of app which dictates how an app behaves, where an app is displayed, etc. - standalone, widget, etc.\n    featureCategory: null, // The category of an app's behavior for grouping purposes - directory, performance, help, etc.\n    permissionsPolicy: null,\n    // sandbox, assets, lifecycle, permissionsPolicy - set in init\n\n    // Interapption specific properties\n    interactionId: null,\n    interactionType: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified queues\n     */\n    enabledQueueIds: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified communication types.\n     * Currently, this only includes the initial communication type (it does not include elevations).\n     * When it includes 'none', it will not display the interapption for any communication type.\n     */\n    enabledCommunicationTypes: null,\n    gcHostOrigin: null,\n    gcTargetEnv: null,\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.get('sandbox')) {\n            this.set('sandbox', []);\n        }\n\n        if (!this.get('assets')) {\n            this.set('assets', {});\n        }\n\n        if (!this.get('permissionsPolicy')) {\n            this.set('permissionsPolicy', []);\n        }\n\n        this.set('lifecycle', _.merge(copy(LIFECYCLE_DEFAULTS, true), this.get('lifecycle')));\n    },\n\n    url: computed('urlTemplate', 'langTag', 'envTld', 'interactionId', 'usePopupAuth', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = this.get('urlTemplate');\n            if (typeOf(result) === 'string' && isPresent(result)) {\n                URL_REPLACEMENTS.forEach(currReplacement => {\n                    let replacementValue = '';\n                    if (currReplacement.replacementValue) {\n                        if (this.get('interactionId') && this.get('interactionType'))\n                            replacementValue = currReplacement.replacementValue(\n                                this.get('interactionId'),\n                                this.get('interactionType')\n                            );\n                    } else {\n                        const rawValue = this.get(currReplacement.replacementProp);\n                        replacementValue = isPresent(rawValue) ? rawValue : '';\n                    }\n                    if (encodeURIComponent) {\n                        replacementValue = encodeURIComponent(replacementValue);\n                        result = result.replace(currReplacement.regExp, replacementValue);\n                    }\n                });\n            } else {\n                result = '';\n            }\n            return result;\n        },\n        set() {\n            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derived url property instead of new urlTemplate property.'),\n                {\n                    urlTemplate: this.get('urlTemplate'),\n                    remoteData: {\n                        appId: this.get('id')\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set url.  Use urlTemplate property.');\n        }\n    }),\n\n    getURLTemplateQueryParams() {\n        const result = [];\n        const urlTemplate = this.get('urlTemplate');\n        if (typeOf(urlTemplate) === 'string' && isPresent(urlTemplate)) {\n            URL_REPLACEMENTS.forEach(currReplacement => {\n                if (urlTemplate.search(currReplacement.regExp) !== -1) {\n                    result.push(currReplacement.queryParamName);\n                }\n            });\n        }\n        return result;\n    },\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return App.create(ownerMixin, {\n            typeId: this.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            urlTemplate: this.get('urlTemplate'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? _.cloneDeep(this.get('sandbox')) : this.get('sandbox'),\n            assets: deep ? _.cloneDeep(this.get('assets')) : this.get('assets'),\n            lifecycle: deep ? _.cloneDeep(this.get('lifecycle')) : this.get('lifecycle'),\n            permissionsPolicy: deep ? _.cloneDeep(this.get('permissionsPolicy')) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default App;\n","define(\"connections-ui/models/call-communication\", [\"exports\", \"ember-purecloud-components/models/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nconst { attr, Model } = DS;\n\nconst { computed } = Ember;\n\nexport default Model.extend({\n    enabled: attr(),\n    phoneNumber: attr(),\n\n    calls: attr(),\n\n    voicemail: attr(),\n\n    isExternalVoicemail: computed.equal('voicemail', 'LASTCALL')\n});\n","define(\"connections-ui/models/callback-communication\", [\"exports\", \"ember-purecloud-components/models/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport { inject } from '@ember/service';\nimport DS from 'ember-data';\nimport cloneDeep from 'lodash/cloneDeep';\nimport RSVP from 'rsvp';\n\nconst { attr } = DS;\n\nfunction hasSipErrors(party: any) {\n    const codes = get(party, 'sipResponseCodes');\n    if (!codes || codes.length === 0) {\n        return false;\n    }\n    // 487 is Voicemail Not Available, which is not treated as an error\n    // 410 is a queue call that gets transfered to an agent for some reason\n    return !!party.sipResponseCodes.filter((c: number) => c >= 300 && c !== 487 && c !== 410).length;\n}\n\nexport default DS.Model.extend({\n    // required services\n    session: inject('session'),\n    addressformat: inject('addressformat'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    intl: inject('intl'),\n\n    /**\n     * The conversation (with the same id as this call)\n     * Fetched when we need to distinguish between participants (if there are 2 or more valid otherParties)\n     * Raw object - Not the EPC model\n     */\n    conversation: null,\n\n    //  The relevant part of conversation. Each participant in this list corresponds to participants on callv2, but has\n    //  extra properties such as monitorParticipantId or coachedParticipantId\n    conversationParticipants: computed('conversation.participants', function () {\n        const conversationParties = this.get('conversation.participants') || [];\n        return conversationParties;\n    }),\n\n    participants: attr(),\n    startTime: attr('date'),\n    direction: attr('string'),\n    missedCall: attr('boolean'),\n    wasConference: attr('boolean'),\n    wasCallback: attr('boolean'),\n    wasOutboundCampaign: attr('boolean'),\n    /**\n     * call went to voicemail\n     */\n    wentToVoicemail: attr('boolean'),\n\n    callStart: computed.alias('startTime'),\n\n    sentToVoicemail: computed('wentToVoicemail', 'voicemailParticipant', function () {\n        // sent to my voicemail\n        if (!this.get('wentToVoicemail')) {\n            return false;\n        }\n        return this.get('voicemailParticipant.user.id') === this.get('myGuid');\n    }),\n    reachedVoicemail: computed.and('wentToVoicemail', 'isOutbound'), // went to other user's voicemail\n\n    // my participant computeds\n    myGuid: computed.reads('session.person.guid'),\n    callEnd: computed.reads('myParticipant.endTime'),\n    isOutbound: computed.equal('myParticipant.direction', 'outbound'),\n    isMultiParty: computed.or(\n        'isOutboundCampaign',\n        'isIvrTransfer',\n        'isBlindTransfer',\n        'isConsultTransfer',\n        'wasConference'\n    ),\n    myself: computed.reads('myParticipant'), // convenience for call-history-entity backward compat\n    allParticipants: computed.union(\n        'internalParticipants',\n        'externalParticipants',\n        'stationParticipants',\n        'ivrParticipants',\n        'queueParticipants'\n    ),\n\n    // an acd call is where any participant is an agent\n    isAcdCall: computed('participants.[]', function () {\n        return A(this.get('participants')).any((participant: any) => participant && participant.purpose === 'agent');\n    }),\n\n    // begin participant computed props: myParticipant, internalParticipants, externalParticipants, voicemailParticipant, otherParties\n    myParticipant: computed('participants.[]', 'myGuid', function () {\n        const nonVoicemail = this.get('participants').rejectBy('purpose', 'voicemail') || A([]);\n        let me = nonVoicemail.findBy('user.id', this.get('myGuid'));\n        if (!me) {\n            me = nonVoicemail.findBy('purpose', 'station');\n        }\n        return me;\n    }),\n\n    // internalParticipants and externalParticipants and combined in allParticipants computed above.\n    internalParticipants: computed('participants.[]', function () {\n        return (this.get('participants') || []).filter(\n            (party: any) => party.user !== undefined && party.monitoredCallId === undefined\n        );\n    }),\n\n    externalParticipants: computed('participants.[]', function () {\n        const participants = this.get('participants').reject(\n            (p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p)\n        );\n\n        let externalParticipants = A([\n            ...participants.filterBy('purpose', 'external'),\n            ...participants.filterBy('purpose', 'customer')\n        ]);\n\n        // the edge does dumb stuff like add participants with no error code when\n        // the call gets redirected to another edge. See if there are two identical\n        // participants where both didn't interact, and if so, filter one out.\n        if (\n            externalParticipants.length === 2 &&\n            externalParticipants.filterBy('didInteract').length < 2 &&\n            externalParticipants[0].ani === externalParticipants[0].ani\n        ) {\n            externalParticipants = A([externalParticipants[0]]);\n        }\n        return externalParticipants;\n    }),\n\n    stationParticipants: computed('participants.[]', function () {\n        return this.get('participants')\n            .reject((p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p))\n            .filterBy('purpose', 'station');\n    }),\n\n    voicemailParticipant: computed('participants.[]', function () {\n        return this.get('participants').findBy('purpose', 'voicemail');\n    }),\n\n    ivrParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'ivr');\n    }),\n\n    queueParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'acd');\n    }),\n\n    // All participants that aren't the current user, or a monitor, coach, or barged participant\n    otherParties: computed('allParticipants.[]', 'myGuid', 'conversationParticipants.[]', function () {\n        const conversationParticipants = this.get('conversationParticipants');\n        return this.get('allParticipants')\n            .rejectBy('user.id', this.get('myGuid'))\n            .reject((party: any) => get(party, 'startTime') === get(party, 'endTime') || hasSipErrors(party))\n            .filter((party: any) => {\n                //  Only filter out monitors, coaches, or barged participants (if found from conversation.participants)\n                const partyFromConversation = conversationParticipants.find(\n                    (participant: any) => participant.id === party.id\n                );\n                if (partyFromConversation) {\n                    return !(\n                        get(partyFromConversation, 'monitoredParticipantId') ||\n                        get(partyFromConversation, 'coachedParticipantId') ||\n                        get(partyFromConversation, 'bargedParticipantId')\n                    );\n                }\n                return true;\n            });\n    }),\n\n    callParties: computed('otherParties.[]', 'isGroupRing', 'conversationParticipants', function () {\n        const otherParties = this.get('otherParties');\n        const addressformat = this.get('addressformat');\n\n        // We dont display (all) group call participants in any call UIs\n        if (this.get('isGroupRing')) {\n            return [];\n        }\n\n        return otherParties.rejectBy('purpose', 'voicemail').map((p: any) => {\n            const party = cloneDeep(p); // no side effects\n            if (party.purpose === 'user' || party.purpose === 'agent') {\n                const promise = this.get('store').findRecord('person', party.user.id);\n                promise.then((data: any) => {\n                    set(party, 'name', data.get('name'));\n                });\n                return promise.catch(() => party);\n            }\n\n            if (party.purpose === 'acd') {\n                const promise = this.get('store').findRecord('queue', party.queue.id);\n                promise.then((data: any) => {\n                    set(party, 'name', data.get('name'));\n                    set(party, 'address', `sip:${data.get('id')}`);\n                });\n                return promise.catch(() => party);\n            }\n\n            if (party.purpose === 'ivr') {\n                set(party, 'address', get(party, 'dnis'));\n            } else if (party.direction === 'outbound') {\n                const dnis = get(party, 'dnis');\n                set(party, 'isOutbound', true);\n                //  Sometimes in conference calls the address of a participant is not resolved correctly when accessed from the 'history' bulk endpoint\n                //  In that case we try to fallback on the same participant taken fron the GET conversation/{conversationId} endpoint which may be resolved correctly\n                if (party.address && party.address.startsWith('sip:')) {\n                    const conversationParticipants = this.get('conversationParticipants');\n                    const participant = conversationParticipants.find(\n                        (participant: any) => participant.id === party.id\n                    );\n\n                    // If the participant address is also available from the more detailed 'conversationParticipants', use it\n                    if (participant) {\n                        set(party, 'address', get(participant, 'address'));\n                    } else {\n                        // Otherwise fallback to DNIS\n                        set(party, 'address', dnis);\n                    }\n                } else {\n                    set(party, 'address', dnis);\n                }\n            } else {\n                set(party, 'address', get(party, 'ani'));\n            }\n\n            set(party, 'address', addressformat.formatAddressForDisplay(get(party, 'address')));\n            return RSVP.resolve(party);\n        });\n    }),\n\n    initiator: computed('allParticipants.[]', function () {\n        const all = this.get('allParticipants');\n        const outboundParticipant = all.findBy('direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const external = this.get('externalParticipants');\n        const inboundExternal = external.findBy('direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    disconnectReason: computed('myParticipant.disconnectType', 'isOutbound', 'wentToVoicemail', function () {\n        const intl = this.get('intl');\n\n        const disconnectType = this.get('myParticipant.disconnectType') || 'unknown';\n        let disconnectTypeKey = 'other';\n\n        if (disconnectType === 'client') {\n            disconnectTypeKey = 'you';\n        } else if (disconnectType === 'endpoint') {\n            disconnectTypeKey = 'otherParty';\n        } else if (disconnectType === 'system') {\n            disconnectTypeKey = 'system';\n        } else if (disconnectType && disconnectType.indexOf('transfer') > -1) {\n            if (!this.get('isOutbound') && this.get('wentToVoicemail')) {\n                disconnectTypeKey = 'youDeclined';\n            } else {\n                disconnectTypeKey = 'transfer';\n            }\n        } else if (disconnectType === 'error') {\n            disconnectTypeKey = 'error';\n        }\n\n        return intl.lookup(`purecloud.disconnectReason.${disconnectTypeKey}`);\n    }),\n\n    isIvrTransfer: computed('myParticipant.disconnectType', 'otherParties.[]', function () {\n        return !!this.get('otherParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose === 'ivr' || purpose === 'acd';\n        }).length;\n    }),\n\n    isOutboundCampaign: computed.readOnly('wasOutboundCampaign'),\n\n    isBlindTransfer: computed('sentToVoicemail', 'myParticipant.disconnectType', function () {\n        // if I'm an agent and there were other agents, it's a transfer situation. We can't\n        // distinguish between consult or blind based on analytics or conversation data\n        if (this.get('myParticipant.purpose') === 'agent') {\n            return this.get('participants').filterBy('purpose', 'agent').length > 1;\n        }\n\n        const participants = this.get('participants').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n\n        if (!participants.any((p: any) => get(p, 'disconnectType') === 'transfer')) {\n            return false;\n        }\n\n        return !this.get('wentToVoicemail');\n    }),\n\n    isConsultTransfer: computed('isBlindTransfer', 'wasConference', 'callParties.[]', function () {\n        // multiple parties, but not marked as a transfer or a conference means consult\n        const parties = this.get('callParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n        return !this.get('isBlindTransfer') && !this.get('wasConference') && parties.length > 1;\n    }),\n\n    isPersonalVoicemail: computed('voicemailParticipant.dnis', function () {\n        return this.get('voicemailParticipant')\n            ? this.get('voicemailParticipant.dnis').indexOf('user=voicemailbox') > -1\n            : false;\n    }),\n\n    // This an outbound call initiated by the queue - NOT true for normal inbound/outbound ACD calls\n    isQueueCall: computed('initiator', function () {\n        const queueId = this.get('myParticipant.queue.id') || this.get('myParticipant.queueId');\n        return (\n            !!(\n                this.get('initiator.dnis') &&\n                queueId &&\n                this.get('initiator.dnis').indexOf(queueId > -1) &&\n                this.get('isOutbound')\n            ) && !this.get('isAcdCall')\n        );\n    }),\n\n    invalidNumber: computed('myParticipant.{disconnectType,dnis}', function () {\n        return (\n            this.get('myParticipant.disconnectType') === 'error' && this.get('myParticipant.dnis') === 'Invalidnumber'\n        );\n    }),\n\n    groupRingParticipant: computed('participants.[]', function () {\n        return this.get('participants').find((p: any) => get(p, 'groupId') || get(p, 'group.id'));\n    }),\n\n    isGroupRing: computed.bool('groupRingParticipant'),\n\n    groupRingId: computed('groupRingParticipant', function () {\n        const participant = this.get('groupRingParticipant');\n        if (!participant) {\n            return undefined;\n        }\n        return get(participant, 'groupId') || get(participant, 'group.id');\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', 'groupRingCaller.guid', 'isGroupRing', 'myGuid', function () {\n        return !!(\n            this.get('isOutbound') &&\n            this.get('isGroupRing') &&\n            this.get('groupRingCaller.guid') === this.get('myGuid')\n        );\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        if (this.get('groupRingId')) {\n            return this.get('store').findRecord('group', this.get('groupRingId'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    groupRingCaller: computed('isGroupRing', 'initiator', function () {\n        const initiator = this.get('initiator');\n        if (this.get('groupRingParticipant') && initiator) {\n            if (!get(initiator, 'user')) {\n                return RSVP.resolve(initiator);\n            }\n\n            return this.get('store').findRecord('person', get(initiator, 'user.id'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    //  If there are more than 2 parties fetch the conversation individually to distinguish them\n    loadConversation: function () {\n        const personParticipants = this.get('participants').filter((participant: any) =>\n            ['user', 'agent', 'external', 'customer'].includes(participant.purpose.toLowerCase())\n        );\n        let promise = Ember.RSVP.Promise.resolve([]);\n        if (!this.get('conversation') && personParticipants.length > 2) {\n            let id = this.get('id');\n            let url = this.get('application').pcV2Uri(`api/v2/conversations/${id}`);\n            promise = this.get('ajax')\n                .request(url)\n                .then(res => {\n                    this.set('conversation', res);\n                    return !!res ? res.participants : [];\n                })\n                .catch(() => []);\n        }\n        return promise;\n    }\n});\n","define(\"connections-ui/models/chat-communication\", [\"exports\", \"ember-purecloud-components/models/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport { compareJids } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst SECOND_TO_EDIT = 60;\n\nconst ChatMessage = Ember.Object.extend(ChatMessageMedia, ChatMessageMixin, {\n    /**\n    Any new functionality that needs to be added to the Chat Message Model must\n    be added to the ChatMessageMixin instead. Adding functionality to the model\n    instead of the mixin will cause chat messages to break, and cant guarantee\n    that message will render as they should.\n    */\n\n    // Start of chat message attrs\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    corrects: null,\n    raw: null,\n    links: null,\n    stanza: null,\n    files: null,\n    // End of chat message attrs\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n    messageBody: null,\n    hasMentionLinks: false,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    correction: null,\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n\n    //set by services/chat.parseWidgetData()\n    widget: null,\n    widgetType: 'default',\n\n    //set by chat-room.processSplitMessage()\n    splitMessageIndex: null,\n\n    init() {\n        this._super(...arguments);\n        this.determineMessageEditability();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.run.cancel(this.get('isEditableTimeout'));\n    },\n\n    isSplitMessage: Ember.computed('stanza', function () {\n        const children = this.get('stanza.children');\n        return children.findBy('name', 'multipart-message') !== undefined;\n    }),\n\n    isEditable: false,\n\n    editableEndTime: Ember.computed('time', function () {\n        const time = this.get('time');\n        if (time) {\n            return moment(time).add(SECOND_TO_EDIT, 'seconds');\n        }\n        return time;\n    }),\n\n    isEditing: Ember.computed('widgetType', function () {\n        return 'editor' === this.get('widgetType');\n    }),\n\n    canEdit: Ember.computed(\n        'isEditable',\n        'isYou',\n        'isYourLastMessage',\n        'endOfBlock',\n        'pending',\n        'files.[]',\n        'correction.{isYou,isYourLastMessage,pending}',\n        'room.isAcdRoom',\n        function () {\n            if (!this.get('isEditable') || this.get('files.length') || this.get('room.isAcdRoom')) {\n                return false;\n            }\n\n            const message = this.get('messageDisplay');\n            return (\n                !message.get('pending') &&\n                message.get('isYou') &&\n                message.get('endOfBlock') &&\n                message.get('isYourLastMessage')\n            );\n        }\n    ),\n\n    meAction: Ember.computed('raw', 'correction.raw', function () {\n        const raw = this.get('correction.raw') || this.get('raw');\n        if (raw && raw.indexOf('/me ') === 0) {\n            return raw.substr(4, raw.length);\n        }\n        return null;\n    }),\n\n    startEditing() {\n        this.set('_originalWidgetType', this.get('widgetType'));\n        this.set('widgetType', 'editor');\n    },\n\n    stopEditing() {\n        const originalWidgetType = this.get('_originalWidgetType');\n        if (originalWidgetType && 'editor' === this.get('widgetType')) {\n            this.set('widgetType', originalWidgetType);\n        }\n    },\n\n    determineMessageEditability() {\n        if (!this.get('corrects') && compareJids(this.get('from'), this.get('session.person.jid'))) {\n            const now = moment();\n            const seconds = SECOND_TO_EDIT - now.diff(this.get('time'), 'seconds');\n            const isEditable = seconds > 0;\n            this.set('isEditable', isEditable);\n            if (isEditable) {\n                const isEditableTimeout = Ember.run.later(\n                    this,\n                    () => {\n                        this.stopEditing();\n                        this.set('isEditable', false);\n                    },\n                    seconds * 1000\n                );\n                this.set('isEditableTimeout', isEditableTimeout);\n            }\n        }\n    }\n});\n\nexport default ChatMessage;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport SortChatUsersMixin from '../mixins/sort-chat-users';\nimport SplitMessage from './split-message';\nimport {\n    compareJids,\n    isAcdJid,\n    isGroupJid,\n    isPersonJid,\n    isRoomJid,\n    isSoftphoneJid,\n    isSupervisorJid\n} from 'ember-purecloud-components/utils/jid-helpers';\n\nconst POPOUT_HEIGHT = 800;\nconst POPOUT_WIDTH = 500;\nconst POPOUT_LOCATION = -2000;\n\nconst haveGroupData = group => {\n    const haveId = !_.isEmpty(group.get('id'));\n    const haveName = !_.isEmpty(group.get('name'));\n    const groupId =\n        group.getFieldValue && group.getFieldValue('general.name') && group.getFieldValue('general.name')._id;\n    const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n    return haveId && haveName && isApiFieldConfigName;\n};\n\n// TODO: Find a better Ember way/spot for this view oriented behavior.\n// This === shared by all chat-room models on purpose.  Rooms decide based\n// mute setting to animate ||!.\n// Similar code exist in interaction.js service\nconst MAX_WAIT = 8000;\nconst animateChatIcon = _.debounce(\n    () => {\n        Ember.$('.action-item.chat a').addClass('faa-horizontal animated');\n        Ember.run.later(() => {\n            Ember.$('.action-item.chat a').removeClass('faa-horizontal animated');\n        }, MAX_WAIT);\n    },\n    MAX_WAIT,\n    { leading: true, trailing: false, maxWait: MAX_WAIT }\n);\n\n// This size mirrors the 'messagesPerHistoryRequest' property in services/chat\nconst PRUNE_SIZE = 25;\n\nconst ChatRoom = Ember.Object.extend(SortChatUsersMixin, {\n    session: Ember.inject.service('session'),\n    webrtc: Ember.inject.service('webrtc'),\n    batchDataRequests: Ember.inject.service(),\n    chat: Ember.inject.service('chat'),\n\n    jid: null,\n    objectId: null,\n    group: null,\n    oneToOneTarget: null,\n    rawSubject: null,\n    pendingRoom: false,\n\n    firstMessageTime: null,\n    lastMessageTime: null,\n    lastMessageTimeRadix: 0,\n    roomClosedTimeRadix: 0,\n\n    mentions: 0,\n    unseen: 0,\n    messageActivity: 0,\n    userActivity: 0,\n\n    loadingHistory: false,\n    moreHistoryAvailable: false,\n    moreForwardHistoryAvailable: false,\n\n    activated: false,\n\n    participants: null,\n    acdCustomerParticipant: null,\n    messages: null,\n    messageCache: null,\n    splitMessageCache: null,\n    inputCache: null,\n\n    isInRoster: false,\n    participantsVisible: false,\n\n    isFavorite: false,\n\n    invited: false,\n    showingVideo: false,\n    joinCallImmediately: false,\n    joinScreenshareImmediately: false,\n\n    type: 'room',\n\n    deferredParticipants: null,\n\n    roomOwners: [],\n\n    setupProperties: Ember.on('init', function () {\n        this.setProperties({\n            participants: [],\n            messages: [],\n            messageCache: Ember.Object.create({}),\n            splitMessageCache: Ember.Object.create({}),\n            firstMessageTime: moment(0),\n            lastMessageTime: moment(0),\n            deferredParticipants: Ember.A([])\n        });\n    }),\n\n    authenticatedUserIsRoomOwner: Ember.computed('session.person', function () {\n        const group = this.get('group');\n        return group && group.isPersonOwner(this.get('session.person'));\n    }),\n\n    resizeNewPopout: Ember.observer('popout', function () {\n        const popout = this.get('popout');\n        if (popout) {\n            popout.resizeTo(POPOUT_WIDTH, POPOUT_HEIGHT);\n            popout.moveTo(POPOUT_LOCATION, POPOUT_LOCATION);\n            popout.focus();\n        }\n    }),\n\n    videoConversation: Ember.computed('webrtc.conversations.[]', function () {\n        let conversations = this.get('webrtc.conversations');\n        if (conversations) {\n            return conversations.findBy('room.jid', this.get('jid'));\n        }\n        return null;\n    }),\n\n    videoRoomFull: false,\n\n    subject: Ember.computed('rawSubject', 'group.{id,name}', 'oneToOneTarget.name', function () {\n        const group = this.get('group');\n\n        if (!group) {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n\n        const haveId = !_.isEmpty(group.id);\n        const haveName = !_.isEmpty(group.get('name'));\n        const groupId = group.getFieldValue && group.getFieldValue('general.name') && group.id;\n        const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n        if (haveId && haveName && isApiFieldConfigName) {\n            return this.get('groupName');\n        } else {\n            return (\n                this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || ''\n            );\n        }\n    }),\n\n    mapCanRemoveParticipant(participantList) {\n        const group = this.get('group');\n        const personId = this.get('session.person.id');\n        return participantList.map(participant => {\n            const isMember = group && group.isPersonIndividual(participant);\n            const canRemove = !isMember && !this.isRoomOwner(participant) && participant.id !== personId;\n\n            Ember.set(participant, 'canBeRemovedFromRoom', canRemove);\n            return participant;\n        });\n    },\n\n    sortedParticipants: Ember.computed('participants.@each.presence', 'allowUserRemoval', function () {\n        if (this.get('allowUserRemoval')) {\n            const list = this.mapCanRemoveParticipant(this.get('participants'));\n            return this.sortChatUsers(list);\n        }\n        return this.sortChatUsers(this.get('participants'));\n    }),\n\n    skipGroupDataCheckEnabled: true,\n\n    groupName: Ember.computed.reads('group.name'),\n\n    isAdhocRoom: Ember.computed('jid', function () {\n        const jid = this.get('jid');\n        return isRoomJid(jid) && _.isEmpty(this.get('groupName'));\n    }),\n\n    isAcdRoom: Ember.computed('jid', function () {\n        return isAcdJid(this.get('jid'));\n    }),\n\n    isSupervisorRoom: Ember.computed('jid', function () {\n        return isSupervisorJid(this.get('jid'));\n    }),\n\n    isSoftphoneRoom: Ember.computed('jid', function () {\n        return isSoftphoneJid(this.get('jid'));\n    }),\n\n    isOneToOne: Ember.computed('jid', function () {\n        return this.isOneToOneRoom();\n    }),\n\n    allowUserRemoval: true,\n\n    processRoomDetails({ owners }) {\n        this.set('roomOwners', owners);\n    },\n\n    isRoomOwner(person) {\n        const group = this.get('group');\n        const isGroupOwner = !!group && group.isPersonOwner(person);\n        const personId = Ember.get(person, 'id');\n        const isOwner = this.get('roomOwners').some(owner => owner.id === personId);\n\n        return isOwner || isGroupOwner;\n    },\n\n    getRawDisplaySubject() {\n        // Get a version of the room subject that has! been decorated with markdown, for usages in places where the\n        // data will show up without being html rendered (such as mentions)\n        const group = this.get('group');\n        // we're skipping the haveGroupData check\n        if (this.get('skipGroupDataCheckEnabled')) {\n            if (group) {\n                return this.get('groupName');\n            }\n        } else if (group && haveGroupData(group)) {\n            return this.get('groupName');\n        }\n        return this.get('oneToOneTarget.name') || this.get('rawSubject') || this.get('oneToOneTarget.email_main') || '';\n    },\n\n    clearMessageCache() {\n        this.set('activated', false);\n        this.set('messages', []);\n        this.set('messageCache', Ember.Object.create({}));\n    },\n\n    pruneMessages() {\n        const messages = this.get('messages');\n        if (messages.length > PRUNE_SIZE) {\n            const messageCache = this.get('messageCache');\n            const splitMessageCache = this.get('splitMessageCache');\n            const removeCachedItemsCount = messages.length - PRUNE_SIZE;\n            for (let i = 0; i < removeCachedItemsCount; i++) {\n                const message = messages[i];\n\n                if (message.get('splitMessage')) {\n                    message.get('messageArray').forEach(message => {\n                        delete messageCache[message.get('id')];\n                        delete messageCache[message.get('oid')];\n                        message.destroy();\n                    });\n                    delete splitMessageCache[message.get('splitMessageId')];\n                }\n                delete messageCache[message.get('oid')];\n                delete messageCache[message.get('id')];\n                message.destroy();\n            }\n            this.set('messages', _.takeRight(messages, PRUNE_SIZE));\n            this.set('moreHistoryAvailable', true);\n            this.reconcileMessages();\n        }\n    },\n\n    addHistoryMessages(messages) {\n        if (messages && messages.length > 0) {\n            this.processHistoryModels(messages);\n        }\n    },\n\n    processHistoryModels(history) {\n        history = this.filterSeenMessages(_.uniqBy(history, 'id'));\n        this.addSelfReference(history);\n        this.insertHistory(history);\n        this.reconcileMessages();\n    },\n\n    reconcileMessages() {\n        this.sortChatMessages();\n        this.processCorrections();\n        this.processSplitMessageHistory();\n        this.markConversationBlockBoundaries();\n        this.updateFirstUnread();\n        this.updateMessageTimes();\n    },\n\n    filterSeenMessages(history) {\n        const cache = this.get('messageCache');\n        return _.filter(history, message => {\n            return !Object.prototype.hasOwnProperty.call(cache, message.get('id'));\n        });\n    },\n\n    addSelfReference(history) {\n        _.each(history, message => message.set('room', this));\n        return null;\n    },\n\n    bumpActivityCount(message) {\n        this.incrementProperty('messageActivity');\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid'))) {\n            this.incrementProperty('userActivity');\n        }\n    },\n\n    insertHistory(historyMessages) {\n        this.get('messages').unshiftObjects(historyMessages);\n\n        const cache = this.get('messageCache');\n        _.each(historyMessages, message => {\n            cache.set(message.get('id'), message);\n        });\n    },\n\n    sortChatMessages() {\n        const messages = _.sortBy(this.get('messages'), message => {\n            return message.get('time').valueOf();\n        });\n        this.set('messages', messages);\n    },\n\n    processSplitMessageHistory() {\n        const messages = this.get('messages')\n            .map(message => {\n                if (message.get('isSplitMessage')) {\n                    const splitMessage = this.processSplitMessage(message);\n                    if (splitMessage.get('messageArray.length') <= 1) {\n                        return splitMessage;\n                    }\n                    return null;\n                }\n                return message;\n            })\n            .filter(message => !!message);\n        this.set('messages', messages);\n    },\n\n    processCorrections() {\n        const messages = this.get('messages');\n        _.each(messages, message => {\n            if (message.get('corrects')) {\n                const correctedMessage = _.find(messages, m => {\n                    return m.get('id') === message.get('corrects');\n                });\n                if (correctedMessage) {\n                    correctedMessage.set('correction', message);\n                }\n            } else if (message.get('isEdited')) {\n                message.set('correction', message);\n            }\n        });\n        this.set('messages', messages);\n    },\n\n    markConversationBlockBoundaries() {\n        const messages = this.get('messages');\n\n        if (messages.length === 0) {\n            return;\n        }\n\n        _.head(messages).setProperties({\n            startOfBlock: true,\n            endOfBlock: true,\n            isLastMessage: false,\n            isYourLastMessage: false\n        });\n\n        _.last(messages).setProperties({\n            endOfBlock: true,\n            isLastMessage: true\n        });\n\n        if (messages.length === 1) {\n            const message = messages[0];\n            message.set('isYourLastMessage', message.get('isYou'));\n        }\n\n        if (messages.length === 1) {\n            return;\n        }\n\n        let isYourLastMessage = null;\n\n        for (let i = 0; i <= messages.length - 2; i++) {\n            const last = messages[i];\n            const next = messages[i + 1];\n\n            if (last.get('isYou')) {\n                isYourLastMessage = last;\n            } else {\n                last.set('isYourLastMessage', false);\n            }\n\n            if (next.get('isYou')) {\n                isYourLastMessage = next;\n            } else {\n                next.set('isYourLastMessage', false);\n            }\n\n            if (this.shouldGroupMessages(last, next)) {\n                last.set('endOfBlock', false);\n                next.set('startOfBlock', false);\n            } else {\n                last.set('endOfBlock', true);\n                next.set('startOfBlock', true);\n            }\n        }\n\n        if (isYourLastMessage) {\n            isYourLastMessage.set('isYourLastMessage', true);\n        }\n    },\n\n    updateFirstUnread() {\n        if (this.get('firstUnread')) {\n            this.set('firstUnread.firstUnread', false);\n            this.set('firstUnread', null);\n        }\n\n        const messages = this.get('messages');\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            if (message.get('unread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n                return;\n            }\n        }\n    },\n\n    processSplitMessage(message) {\n        const splitMessageCache = this.get('splitMessageCache');\n        const stanza = message.get('stanza.children').findBy('name', 'multipart-message');\n        const splitMessageData = JSON.parse(Ember.get(stanza, 'children.lastObject'));\n        const splitMessageParentExists = Object.prototype.hasOwnProperty.call(splitMessageCache, splitMessageData.id);\n        if (!splitMessageParentExists) {\n            const owner = Ember.getOwner(this);\n            let splitMessage = SplitMessage.create(\n                {\n                    id: message.id,\n                    oid: message.oid,\n                    from: message.from,\n                    to: message.to,\n                    time: message.time,\n                    chatUser: message.chatUser,\n                    splitMessageId: splitMessageData.id,\n                    totalMessages: splitMessageData.messageCount\n                },\n                owner.ownerInjection()\n            );\n            this.addSelfReference([splitMessage]);\n            splitMessageCache.set(splitMessageData.id, splitMessage);\n        }\n        let splitMessage = splitMessageCache.get(splitMessageData.id);\n        message.set('splitMessageIndex', splitMessageData.index);\n        splitMessage.addSplitMessage(message);\n        return splitMessage;\n    },\n\n    addMessage(message) {\n        const messages = this.get('messages');\n        const cache = this.get('messageCache');\n        const msgId = message.get('id') || message.get('oid');\n\n        this.addSelfReference([message]);\n\n        if (Object.prototype.hasOwnProperty.call(cache, msgId)) {\n            message.set('duplicate', true);\n            return;\n        }\n        cache.set(msgId, message);\n\n        if (message.get('isSplitMessage')) {\n            const splitMessage = this.processSplitMessage(message);\n            if (splitMessage.get('messageArray.length') > 1) {\n                return;\n            }\n            message = splitMessage;\n        }\n\n        const roomJid = message.get('room.jid');\n        const isSupervisor = this.get('isSupervisorRoom');\n        const isAcd = this.get('isAcdRoom');\n\n        if (!isAcd && !isSupervisor) {\n            this.bumpActivityCount(message);\n        }\n\n        if (message.get('unread') && !message.get('corrects')) {\n            if (!this.get('muted')) {\n                if (roomJid && !isAcd && !isSupervisor) {\n                    animateChatIcon();\n                }\n            }\n\n            if (!this.get('firstUnread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n            }\n        }\n\n        // default message to its own block\n        message.set('startOfBlock', true);\n        message.set('endOfBlock', true);\n\n        const lastMessage = _.last(messages);\n        messages.pushObject(message);\n\n        this.updateMessageTimes();\n\n        if (message.get('isYou')) {\n            const yourLast = _.findLast(messages, message => message.get('isYourLastMessage'));\n            if (yourLast) {\n                yourLast.set('isYourLastMessage', false);\n            }\n            message.set('isYourLastMessage', true);\n        }\n\n        if (!lastMessage) {\n            return;\n        }\n\n        if (message.get('time').isBefore(lastMessage.get('time'))) {\n            Ember.Logger.warn('chat-room : Message came in out of order');\n            this.reconcileMessages();\n            return;\n        }\n\n        if (message.get('corrects')) {\n            this.processCorrections();\n        }\n\n        if (this.shouldGroupMessages(lastMessage, message)) {\n            lastMessage.set('endOfBlock', false);\n            message.set('startOfBlock', false);\n        }\n    },\n\n    shouldGroupMessages(oldMessage, newMessage) {\n        return (\n            oldMessage &&\n            newMessage &&\n            oldMessage.get('from') === newMessage.get('from') &&\n            oldMessage.get('unread') === newMessage.get('unread') &&\n            !oldMessage.get('corrects') &&\n            2 >= Math.abs(newMessage.get('time').diff(oldMessage.get('time'), 'minutes'))\n        );\n    },\n\n    updateMessageTimes() {\n        const first = this.get('messages.firstObject');\n        const last = this.get('messages.lastObject');\n        const firstMessageTime = moment(first ? first.get('time') : 0);\n        const lastMessageTime = moment(last ? last.get('time') : 0);\n\n        this.setProperties({ firstMessageTime, lastMessageTime });\n        return this.updateMessageTimeRadix();\n    },\n\n    updateMessageTimeRadix() {\n        // sort messages by last message sent\n        const messages = this.get('messages');\n        const lastMessage = messages[messages.length - 1];\n        return this.set('lastMessageTimeRadix', lastMessage ? lastMessage.get('time').valueOf() : 0);\n    },\n\n    updateClosedTimeRadix() {\n        this.set('roomClosedTimeRadix', moment().valueOf());\n    },\n\n    addParticipant(person) {\n        if (person) {\n            this.get('participants').addObject(person);\n        }\n    },\n\n    removeParticipant(person) {\n        this.get('participants').removeObject(person);\n    },\n\n    clearUnreadMessages() {\n        if (this.get('firstUnread')) {\n            this.get('firstUnread').set('firstUnread', false);\n        }\n        this.set('firstUnread', null);\n        const messages = this.get('messages');\n\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            message.set('unread', false);\n        }\n\n        return this.markConversationBlockBoundaries();\n    },\n\n    isOneToOneRoom() {\n        return isPersonJid(this.get('jid'));\n    },\n\n    isGroupRoom() {\n        return isGroupJid(this.get('jid'));\n    },\n\n    isUserInRoom(userjid) {\n        return this.get('participants').findBy('jid', userjid);\n    },\n\n    clearPending(message) {\n        const existingMessage = this.get(`messageCache.${message.oid}`);\n        if (existingMessage && typeof message === 'object') {\n            existingMessage.set('id', message.id);\n            existingMessage.set('time', moment(message.time));\n            existingMessage.set('pending', false);\n\n            this.set(`messageCache.${message.oid}`, null);\n            this.set(`messageCache.${message.id}`, existingMessage);\n        }\n    },\n\n    setSendError(messageId) {\n        const message = this.get(`messageCache.${messageId}`);\n        if (message) {\n            message.set('pending', false);\n            message.set('sendError', true);\n        }\n    },\n\n    addDeferredParticipant(jid) {\n        this.get('deferredParticipants').addObject(jid);\n    },\n\n    loadDeferredParticipants() {\n        let deferred = Ember.A([...this.get('deferredParticipants')]);\n        deferred.forEach(jid => {\n            this.get('batchDataRequests')\n                .getChatUser(jid)\n                .then(person => {\n                    this.addParticipant(person);\n                });\n            // Semi-deferred to run loop\n            Ember.run.join(() => this.get('deferredParticipants').removeObject(jid));\n        });\n    }\n});\n\nexport default ChatRoom;\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst ZERO_BITRATE_THRESHOLD = 2;\n\nexport default Ember.Object.extend({\n    intl: Ember.inject.service(),\n\n    local: false,\n    person: null,\n    audioMuted: false,\n    videoMuted: false,\n    sharingScreen: false, // deprecated. V1 only\n    major: false,\n    selected: false,\n    connectionState: null,\n    domId: null,\n    hasConnected: false,\n    inLastN: false,\n    cameraStream: null,\n    screenStream: null,\n    sessionId: null,\n    isV1: false,\n    startedVideoMuted: false, // HACK: PCDWEBK-3216; bridge doesn't play well with people who don't join with video\n    associatedInteraction: null,\n    zeroBitrateCount: 0,\n    positiveBitrateCount: 0,\n\n    name: Ember.computed('person.name', 'associatedInteraction.customerName', function () {\n        return (\n            this.get('person.name') ||\n            this.get('associatedInteraction.customerName') ||\n            this.get('intl').t('ewc.unknownParticipant')\n        );\n    }),\n\n    // HACK PCDWEBK-2982: remove when video bridge send video when you dont provide it\n    noVideoTrack: Ember.computed('cameraStream', 'isV1', function () {\n        if (this.get('isV1')) {\n            return false;\n        }\n\n        const stream = this.get('cameraStream');\n        return !(stream && stream.getVideoTracks().length);\n    }),\n\n    speaking: false,\n\n    mediaPresence: Ember.computed.reads('person.mediaPresence'),\n\n    _getInteractionAvatarDisplay() {\n        if (this.get('videoMuted')) {\n            return true;\n        }\n        return false;\n    },\n\n    showAvatar: Ember.computed(\n        'videoMuted',\n        'sharingScreen',\n        'connectionState',\n        'inLastN',\n        'isOffline',\n        'noVideoTrack',\n        'screenStream',\n        'zeroBitrateCount',\n        'positiveBitrateCount',\n        function () {\n            if (this.get('associatedInteraction')) {\n                return this._getInteractionAvatarDisplay();\n            }\n\n            const videoMuted = this.get('videoMuted');\n            const sharingScreen = this.get('sharingScreen') || this.get('screenStream');\n            const state = this.get('connectionState');\n            const isOffline = this.get('isOffline');\n            const inLastN = this.get('inLastN');\n            const noVideo = this.get('noVideoTrack') && !sharingScreen;\n            const zeroBitrateCount = this.get('zeroBitrateCount');\n\n            if (\n                _.includes(['failed', 'checking', 'starting'], state) ||\n                isOffline ||\n                noVideo ||\n                zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n            ) {\n                return true;\n            }\n            if (!inLastN) {\n                if (this.get('positiveBitrateCount') > 3) {\n                    Ember.Logger.warn('hiding avatar for !inLastN && positiveBitrateCount > 3', {\n                        remoteData: {\n                            kind: 'webrtcSession',\n                            id: this.get('person.id'),\n                            conversationId: this.get('associatedInteraction.id')\n                        }\n                    });\n                    return false;\n                }\n                return true;\n            }\n            return !sharingScreen && videoMuted;\n        }\n    ),\n\n    avatarDisplay: Ember.computed('showAvatar', function () {\n        return this.get('showAvatar') ? 'avatar-visible' : 'avatar-hidden';\n    }),\n\n    isOffline: Ember.computed('connectionState', 'person.presence', 'zeroBitrateCount', function () {\n        if (this.get('local') || this.get('associatedInteraction')) {\n            return false;\n        }\n\n        const connectionState = this.get('connectionState');\n        const presence = this.get('person.presence');\n        const hasOfflinePresence = this.get('person') && (!presence || presence === 'offline');\n        const zeroBitrateCount = this.get('zeroBitrateCount');\n\n        return (\n            connectionState === 'disconnected' ||\n            connectionState === 'interrupted' ||\n            hasOfflinePresence ||\n            zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n        );\n    }),\n\n    connectionStatus: Ember.computed('connectionState', 'isOffline', 'zeroBitrateCount', function () {\n        const intl = this.get('intl');\n        const state = this.get('connectionState');\n        if (state === 'connected' || state === 'completed') {\n            this.set('hasConnected', true);\n        }\n        if (\n            (state === 'checking' || this.get('isOffline') || this.get('zeroBitrateCount') >= ZERO_BITRATE_THRESHOLD) &&\n            this.get('hasConnected')\n        ) {\n            return intl.lookup('ewc.callStatus.recovering').toString();\n        } else if (state) {\n            return intl.lookup(`ewc.callStatus.${state}`).toString();\n        }\n    }),\n\n    canBeMuted: Ember.computed('audioMuted', 'local', 'associatedInteraction', function () {\n        return !this.get('audioMuted') && !this.get('local') && !this.get('associatedInteraction');\n    })\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    name: null,\n    markedAsRead: false,\n    actionType: null,\n    relationship: null,\n    dateStart: null,\n    lengthInMinutes: null,\n    status: null,\n\n    appointment: {\n        id: null,\n        selfUri: null,\n        isOverdue: false\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    city: DS.attr(),\n    region: DS.attr(),\n    country: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport ExternalContactsMixin from 'connections-ui/mixins/external-contacts';\nimport PersonModel from '../models/person';\nimport moment from '../utils/dates';\nimport { userGuidFromParticipant } from '../utils/conversation';\n\nconst { computed, get, inject, observer, run } = Ember;\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Ember.Object.extend(ExternalContactsMixin, {\n    application: inject.service(),\n    intl: inject.service(),\n    session: inject.service(),\n    chat: inject.service(),\n    phone: inject.service(),\n    addressformat: inject.service(),\n    permissions: inject.service(),\n    names: inject.service(),\n    store: inject.service(),\n\n    id: null,\n    conversationId: null,\n    participants: null,\n    maxParticipants: 0,\n    selfUri: null,\n    acwNotes: null,\n    selectedWrapupCode: null,\n    conversationIsAConsult: false,\n    conversationInitiator: null,\n    lastPartyTalkingTo: null,\n    attemptingToCall: null,\n    webrtcSession: null,\n\n    hasDisplayedDesktopNotification: false,\n    acceptedByClient: false,\n\n    willDestroy() {\n        run.cancel(this.get('_recomputePartiesTimer'));\n        this._super(...arguments);\n    },\n\n    dialingTime: computed('isDialing', 'isContacting', 'participants.[]', function () {\n        if (this.get('isContacting')) {\n            return moment();\n        } else if (this.get('isDialing') && this.get('participants.length') > 1) {\n            return moment();\n        }\n    }),\n\n    otherPartyJid: null,\n    setOtherPartyJid: observer('onCall', 'otherPartyModel', 'otherParty', function () {\n        const promise = Ember.RSVP.resolve(this.get('otherPartyModel'));\n        promise.then(person => {\n            const isOtherPartyPerson = person instanceof PersonModel;\n            if (\n                person &&\n                isOtherPartyPerson &&\n                this.get('onCall') &&\n                this.get('otherParty') &&\n                this.get('otherParty.purpose') !== 'customer'\n            ) {\n                this.set('otherPartyJid', person.get('jid'));\n            } else {\n                this.set('otherPartyJid', null);\n            }\n        });\n    }).on('init'),\n\n    startTime: computed('myself.connectedTime', 'isDialing', 'dialingTime', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        if (this.get('isDialing') && connectedTime === undefined) {\n            return this.get('dialingTime');\n        }\n        if (!this.get('onCall')) {\n            return null;\n        }\n        if (connectedTime) {\n            return connectedTime;\n        }\n    }),\n\n    connectedDuration: computed('myself.{endTime,connectedTime}', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        const endTime = this.get('myself.endTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    }),\n\n    iAmInitiatorOfConsult: computed('conversationInitiator', 'conversationIsAConsult', 'myself', function () {\n        return this.get('conversationInitiator.userId') === this.get('myGuid');\n    }),\n\n    otherPartyThatIsNotTheInitiator: computed('participants.[]', 'conversationInitiator', 'myGuid', function () {\n        const initiator = this.get('conversationInitiator');\n        const otherParties = _.reject(this.get('participants'), party => {\n            const partyId = party && party.userId;\n            const initiatorId = initiator && initiator.userId;\n            return partyId === initiatorId || partyId === this.get('myGuid');\n        });\n        return _.last(otherParties);\n    }),\n\n    otherParticipantsThatAreNotTheInitiator: computed(\n        'participants.[]',\n        'conversationInitiator',\n        'myGuid',\n        function () {\n            const initiator = this.get('conversationInitiator');\n            const otherParties = _.reject(this.get('participants'), party => {\n                const partyId = party && party.userId;\n                const initiatorId = initiator && initiator.userId;\n                return partyId === initiatorId || partyId === this.get('myGuid');\n            });\n            return _.map(otherParties, participant => {\n                const name = participant.name || participant.aniName;\n                const model = { name };\n                return Object.assign(participant, { model });\n            });\n        }\n    ),\n\n    otherPartyThatIsNotTheInitiatorModel: computed('otherPartyThatIsNotTheInitiator', function () {\n        const guid = userGuidFromParticipant(this.get('otherPartyThatIsNotTheInitiator'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator');\n    }),\n\n    setLastPartyTalkingTo: observer('connectedParties.[]', function () {\n        const connectedParties = _.reject(this.get('connectedParties'), party => {\n            return party && party.userId === this.get('myGuid');\n        });\n        if (connectedParties.length > 0) {\n            return this.set('lastPartyTalkingTo', _.head(connectedParties));\n        }\n    }),\n\n    lastPartyTalkingToModel: computed('lastPartyTalkingTo', function () {\n        const guid = userGuidFromParticipant(this.get('lastPartyTalkingTo'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('lastPartyTalkingTo');\n    }),\n\n    consultOtherParty: computed(\n        'participants.[]',\n        'onCall',\n        'lastDisconnectedPartyModel',\n        'lastPartyTalkingToModel',\n        'otherParties.[]',\n        'conversationIsAConsult',\n        'conversationInitiator',\n        'sortedDisconnectedParties',\n        'connectedParties',\n        'iAmInitiatorOfConsult',\n        'initiatorModel',\n        'otherPartyThatIsNotTheInitiator',\n        function () {\n            const initiatorModel = this.get('initiatorModel');\n            const initiator = _.find(this.get('participants'), party => {\n                return party && party.userId === this.get('conversationInitiator.userId');\n            });\n            const initiatorCall = _.head(initiator && initiator.calls);\n            const initiatorConnected = initiatorCall && initiatorCall.state.toLowerCase() === 'connected';\n            const otherPartyThatIsNotTheInitiatorCall = this.get('otherPartyThatIsNotTheInitiator').calls[0];\n            const otherPartyThatIsNotTheInitiatorConnected =\n                otherPartyThatIsNotTheInitiatorCall.state.toLowerCase() === 'connected';\n            if (this.get('iAmInitiatorOfConsult')) {\n                if (this.get('onCall')) {\n                    return _.head(this.get('otherParties'));\n                }\n                if (this.get('connectedParties.length') < 1) {\n                    return this.get('lastDisconnectedPartyModel');\n                }\n                return _.head(this.get('connectedParties'));\n            } else {\n                if (initiatorConnected) {\n                    return initiatorModel;\n                }\n                if (otherPartyThatIsNotTheInitiatorConnected) {\n                    return this.get('otherPartyThatIsNotTheInitiatorModel');\n                }\n                if (this.get('otherPartyModel') === undefined) {\n                    return this.get('lastPartyTalkingToModel');\n                }\n                return this.get('otherPartyModel');\n            }\n        }\n    ),\n\n    consultOtherPartyModel: computed('consultOtherParty', 'participants.[]', 'onCall', function () {\n        const guid = userGuidFromParticipant(this.get('consultOtherParty'));\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.get('consultOtherParty');\n    }),\n\n    participantModels: computed('participants.[]', function () {\n        const participants = _.reject(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isTerminated = maybeLowerCase(communication.state) !== 'terminated';\n            const isNotSelf = this.get('application.session.person.guid') !== guid;\n            return isTerminated && isNotSelf;\n        });\n        return _.map(participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const name = participant && participant.name;\n            const model = guid ? this.get('application.store').find('person', guid) : { name };\n            return Object.assign(participant, { model });\n        });\n    }),\n\n    otherPartyModel: computed('otherParty', function () {\n        const otherParty = this.get('otherParty');\n        const guid = userGuidFromParticipant(otherParty);\n        const store = this.get('application.store');\n        if (!guid) {\n            return otherParty;\n        }\n        // running phone service test in isolation always threw an Ember Error:\n        // No model was found for 'person'\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => otherParty);\n            }\n        } catch (e) {\n            personFromStore = otherParty;\n        }\n        return personFromStore;\n    }),\n\n    otherPartyNumber: computed('otherParty.address', function () {\n        const number = this.get('otherParty.address');\n        if (number && 'user' !== this.get('otherParty.purpose')) {\n            return this.get('addressformat').formatAddressForDisplay(number, null, { doLookup: true });\n        }\n    }),\n\n    otherParties: computed('participants.[]', function () {\n        const otherParties = _.filter(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const purpose = maybeLowerCase(participant.purpose);\n            const state = maybeLowerCase(communication.state);\n            const notTerminatedOrDisconnected = state !== 'terminated' && state !== 'disconnected';\n            const isSelf = this.get('myGuid') === guid;\n            const isMonitor = !!participant.monitoredParticipantId;\n            const isCoach = !!participant.coachedParticipantId;\n            const isBarge = !!participant.bargedParticipantId;\n\n            if (notTerminatedOrDisconnected && !isMonitor && !isCoach && !isBarge) {\n                return !isSelf || (isSelf && purpose !== 'user');\n            }\n            return false;\n        });\n        return otherParties;\n    }),\n\n    disconnectedParties: computed('participants.[]', 'participants.@each.endTime', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isDisconnected =\n                maybeLowerCase(communication.state) === 'disconnected' ||\n                maybeLowerCase(communication.state) === 'terminated';\n            return (\n                isDisconnected &&\n                participant.userId !== this.get('myGuid') &&\n                participant.purpose !== 'ivr' &&\n                participant.purpose !== 'group'\n            );\n        });\n    }),\n\n    sortedDisconnectedParties: computed.sort('disconnectedParties', function (a, b) {\n        return moment(b.endTime).valueOf() - moment(a.endTime).valueOf();\n    }),\n\n    lastDisconnectedPartyModel: computed('sortedDisconnectedParties', function () {\n        const last = _.last(this.get('sortedDisconnectedParties'));\n        const guid = userGuidFromParticipant(last);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n    }),\n\n    selfIsDisconnectedOrTerminated: function () {\n        const myself = this.get('myself');\n        if (!myself) {\n            return false;\n        }\n\n        const communication = _.head(myself.calls) || _.head(myself.callbacks) || {};\n        if (!communication) {\n            return false;\n        }\n\n        const myState = maybeLowerCase(communication.state);\n        return myState === 'disconnected' || myState === 'terminated';\n    },\n\n    otherParty: computed('otherParties.[]', 'connectedParties.[]', 'onConsult', function () {\n        const useDisconnectedParties = this.selfIsDisconnectedOrTerminated();\n        let parties = useDisconnectedParties ? this.get('disconnectedParties') : this.get('connectedParties');\n\n        parties = parties.reject(\n            p =>\n                p.purpose === 'ivr' ||\n                p.purpose === 'group' ||\n                p.userId === this.get('myGuid') ||\n                !!p.coachedParticipantId ||\n                !!p.monitoredParticipantId ||\n                !!p.bargedParticipantId // Both ACD and Communicate should not display monitor/coached or barged in users\n        );\n\n        if (parties.length > 0) {\n            return parties.get('lastObject');\n        }\n        const otherParties = this.get('otherParties').reject(p => p.purpose === 'ivr' || p.purpose === 'group');\n        return otherParties.get('lastObject');\n    }),\n\n    allParties: computed('participants.[]', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.state && communication.state !== 'terminated';\n        });\n    }),\n\n    connectedParties: computed('participants.[]', function () {\n        return _.filter(this.get('participants'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return maybeLowerCase(communication.state) === 'connected';\n        });\n    }),\n\n    connectedOnConsult: computed('connectedParties.[]', function () {\n        return _.reject(this.get('connectedParties'), participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.confined === 'true';\n        });\n    }),\n\n    callParties: computed('onConference', 'onConsult', 'allParties.[]', 'otherParties.[]', 'otherParty', function () {\n        if (!this.get('onConference')) {\n            return this.get('onConsult') ? this.get('otherParties') : [this.get('otherParty')];\n        }\n        const firstCall = party => _.head(party.calls) || _.head(party.callbacks);\n        const isDisconnected = call =>\n            call && (call.state.toLowerCase() === 'disconnected' || call.state.toLowerCase() === 'terminated');\n        const sortedParties = this.get('allParties').sort((a, b) => {\n            const state = 'disconnected';\n            const callStateA = _.head(a.calls).state.toLowerCase() === state ? 0 : 1;\n            const callStateB = _.head(b.calls).state.toLowerCase() === state ? 0 : 1;\n            return callStateA - callStateB;\n        });\n        const parties = _.reject(sortedParties, party => {\n            const disconnected = isDisconnected(firstCall(party));\n            return disconnected && moment().isAfter(moment(party.endTime).add(20, 'seconds'));\n        });\n        const arePartiesDisconnected = _.some(parties, party => {\n            return isDisconnected(firstCall(party));\n        });\n        if (arePartiesDisconnected) {\n            const timer = run.debounce(this, this.recomputeParties, 12000);\n            this.set('_recomputePartiesTimer', timer);\n        }\n        return parties;\n    }),\n\n    otherDisconnectedParty: computed(\n        'participants.[]',\n        'conversationIsAConsult',\n        'iAmInitiatorOfConsult',\n        'lastPartyTalkingToModel',\n        'sortedDisconnectedParties',\n        function () {\n            const isConsult = this.get('conversationIsAConsult');\n            if (isConsult && !this.get('iAmInitiatorOfConsult')) {\n                return this.get('lastPartyTalkingToModel');\n            }\n            const otherParties = _.filter(this.get('participants'), party => {\n                const guid = userGuidFromParticipant(party);\n                const isSelf = guid === this.get('myGuid');\n                const isOngoing = party.endTime === undefined;\n                const isGroup = party.purpose === 'group';\n                const isStation = party.purpose === 'station';\n                const isIvr = party.purpose === 'ivr';\n                return !isSelf && (isConsult ? isOngoing : true) && !isGroup && !isStation && !isIvr;\n            });\n            if (otherParties.length > 1) {\n                /**\n                 * When group ring call ends, there's a period where the endTime properties are set on some\n                 * of the participants but not all. This can cause the display to be incorrect.\n                 */\n                const otherPartiesNoEndTime = otherParties.filter(otherParty => !Ember.get(otherParty, 'endTime'));\n                return _.head(otherPartiesNoEndTime);\n            }\n\n            return _.head(otherParties);\n        }\n    ),\n\n    otherDisconnectedPartyModel: computed('otherDisconnectedParty', function () {\n        const participant = this.get('otherDisconnectedParty');\n        if (participant) {\n            if (get(participant, 'purpose') === 'acd') {\n                return this.get('application.store').find('queue', participant.queueId);\n            }\n            const guid = userGuidFromParticipant(participant);\n            return guid ? this.get('application.store').find('person', guid) : participant;\n        }\n    }),\n\n    recomputeParties() {\n        return this.notifyPropertyChange('callParties');\n    },\n\n    initiator: computed(\n        'participants.[]',\n        'otherParties.[]',\n        'onConsult',\n        'participants.@each.consultParticipantId',\n        function () {\n            return _.find(this.get('participants'), party => {\n                const initiator = get(party, 'attributes.consultInitiator');\n                return initiator === 'true' || initiator === true;\n            });\n        }\n    ),\n\n    initiatorModel: computed('conversationInitiator', 'initiator', function () {\n        const participant = this.get('conversationInitiator');\n        const guid = userGuidFromParticipant(participant);\n        return guid ? this.get('application.store').find('person', guid) : participant;\n    }),\n\n    isDisconnectedQueueCall: computed('otherDisconnectedParty', function () {\n        return this.get('otherDisconnectedParty.purpose') === 'acd';\n    }),\n\n    setConsultInitiator: observer('initiator', 'conversationIsAConsult', function () {\n        const initiator = this.get('initiator');\n        if (!_.isEmpty(initiator) && this.get('conversationIsAConsult')) {\n            return this.set('conversationInitiator', initiator);\n        }\n    }),\n\n    nonInitiatorNumber: computed('otherParties.[]', 'onConsult', 'myself', function () {\n        const myConsultId = this.get('myself.consultParticipantId');\n        const consultParty = _.filter(this.get('otherParties'), party => {\n            return party.id === myConsultId;\n        });\n        const nonInitiator = _.last(consultParty);\n        return this.get('addressformat').formatAddressForDisplay(nonInitiator.address);\n    }),\n\n    hasActiveAgent: computed('participants.@each.purpose', 'myGuid', function () {\n        // Check to see if the current user has an agent participant\n        // that is not currently wrapped up.\n        return _.some(this.get('participants'), participant => {\n            const isMe = this.get('myGuid') === userGuidFromParticipant(participant);\n            const isAgent = participant.purpose.toLowerCase() === 'agent';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            return isMe && isAgent && needsWrapup;\n        });\n    }),\n\n    myGuid: computed.reads('session.person.guid'),\n    myself: computed('participants.[]', 'myGuid', 'hasActiveAgent', function () {\n        const hasActiveAgent = this.get('hasActiveAgent');\n        return _.findLast(this.get('participants'), participant => {\n            const isMe = this.get('myGuid') === userGuidFromParticipant(participant);\n            const purpose = (participant.purpose || '').toLowerCase();\n            const isAgent = purpose === 'agent';\n            const isUser = purpose === 'user';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            let isAlerting = false;\n\n            try {\n                const state = participant.calls[0].state.toLowerCase();\n                isAlerting = state === 'alerting';\n            } catch (e) {\n                isAlerting = false;\n            }\n\n            // If the user has an unwrapped up agent participant, set that as their\n            // current participant.\n            if (hasActiveAgent) {\n                return isMe && isAgent && (needsWrapup || isAlerting);\n            }\n\n            // Otherwise, we just use the last participant for the user\n            // to represent their state.\n            return isMe && (isAgent || isUser);\n        });\n    }),\n\n    myselfIsMonitor: computed.bool('myself.monitoredParticipantId'),\n    myselfIsCoach: computed.bool('myself.coachedParticipantId'),\n\n    myselfIsBarged: computed('myself.bargedParticipantId', function () {\n        const bargedParticipantId = this.get('myself.bargedParticipantId');\n        const bargedParticipant =\n            (this.get('participants') || []).find(participant => participant.id === bargedParticipantId) || {};\n\n        const disconnectType = get(bargedParticipant, 'calls.firstObject.disconnectType');\n        return bargedParticipantId && !disconnectType;\n    }),\n\n    myselfIsMCB: computed.or('myselfIsMonitor', 'myselfIsCoach', 'myselfIsBarged'),\n\n    monitoredParticipant: computed('myselfIsMonitor', 'myself.monitoredParticipantId', 'allParties', function () {\n        if (this.get('myselfIsMonitor')) {\n            return this.get('allParties').findBy('id', this.get('myself.monitoredParticipantId'));\n        }\n        return null;\n    }),\n\n    coachedParticipant: computed('myselfIsCoach', 'myself.coachedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsCoach')) {\n            return this.get('allParties').findBy('id', this.get('myself.coachedParticipantId'));\n        }\n        return null;\n    }),\n\n    bargedParticipant: computed('myselfIsBarged', 'myself.bargedParticipantId', 'allParties', function () {\n        if (this.get('myselfIsBarged')) {\n            return this.get('allParties').findBy('id', this.get('myself.bargedParticipantId'));\n        }\n        return null;\n    }),\n\n    monitoredParticipantPerson: computed('monitoredParticipant', function () {\n        const monitoredParticipant = this.get('monitoredParticipant');\n        const guid = userGuidFromParticipant(monitoredParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return monitoredParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => monitoredParticipant);\n            }\n        } catch (e) {\n            personFromStore = monitoredParticipant;\n        }\n        return personFromStore;\n    }),\n\n    coachedParticipantPerson: computed('coachedParticipant', function () {\n        const coachedParticipant = this.get('coachedParticipant');\n        const guid = userGuidFromParticipant(coachedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return coachedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => coachedParticipant);\n            }\n        } catch (e) {\n            personFromStore = coachedParticipant;\n        }\n        return personFromStore;\n    }),\n    bargedParticipantPerson: computed('bargedParticipant', function () {\n        const bargedParticipant = this.get('bargedParticipant');\n        const guid = userGuidFromParticipant(bargedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return bargedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => bargedParticipant);\n            }\n        } catch (e) {\n            personFromStore = bargedParticipant;\n        }\n        return personFromStore;\n    }),\n\n    isAgentCall: computed('participants.[]', 'myself', 'myselfIsMCB', function () {\n        const isSelfMCB = this.get('myselfIsMCB');\n\n        // Otherwise, if there is another agent on the call, I want to view this conversation in ACD.\n        const participants = this.get('participants') || [];\n        return participants.some(user => maybeLowerCase(user.purpose) === 'agent') || isSelfMCB;\n    }),\n\n    isAfterCallWorkCompleted: computed('myself.wrapup', 'myself.wrapupRequired', function () {\n        const result = this.get('myself.wrapup') || !this.get('myself.wrapupRequired');\n        return result;\n    }),\n\n    isAfterCallWorkForcedTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n    }),\n    isAfterCallWorkTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'timeout';\n    }),\n\n    canUseCommunicationACW: true,\n\n    isWrapupPromptAgentRequested: computed(\n        'myself.{wrapupPrompt,wrapupTimeoutMs}',\n        'canUseCommunicationACW',\n        function () {\n            if (this.get('canUseCommunicationACW')) {\n                const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n                return !!this.get('myself.wrapupTimeoutMs') && prompt === 'agentrequested';\n            } else {\n                return false;\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed.or(\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout'\n    ),\n\n    isAfterCallWorkMandatory: computed('myself.wrapupPrompt', 'isNonDiscretionaryCompletion', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return prompt === 'mandatory' || this.get('isNonDiscretionaryCompletion');\n    }),\n\n    callState: computed.reads('myself.calls.firstObject'),\n    peerDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'peer';\n    }),\n\n    myselfDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'client';\n    }),\n\n    errorInfo: computed.reads('callState.errorInfo'),\n    errorInfoMessage: computed.reads('errorInfo.message'),\n\n    isIncoming: computed('callState.state', function () {\n        return maybeLowerCase(this.get('callState.state')) === 'alerting';\n    }),\n\n    isDialing: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting' || state === 'contacting' || state === 'dialing';\n    }),\n\n    isRinging: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting';\n    }),\n\n    isDialingOrContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting' || state === 'dialing';\n    }),\n\n    isContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting';\n    }),\n\n    justMyselfOnCall: computed('participants.[]', 'myGuid', 'isContacting', function () {\n        const iAmContacting =\n            this.get('participants.firstObject.userId') === this.get('myGuid') && this.get('isContacting');\n        return this.get('participants').length === 1 && iAmContacting;\n    }),\n\n    theOtherPartyWhileContacting: computed('justMyselfOnCall', 'attemptingToCall', function () {\n        if (!this.get('justMyselfOnCall')) {\n            return;\n        }\n        const address = this.get('attemptingToCall');\n        if (address) {\n            const userId = Ember.get(address, 'userId');\n            const calls = [{ state: 'ALERTING' }];\n            return { userId, address, calls };\n        }\n    }),\n\n    isOutbound: computed('callState.direction', function () {\n        const direction = this.get('callState.direction');\n        return maybeLowerCase(direction) === 'outbound';\n    }),\n\n    isMissed: computed('callState.segments', 'isOutbound', function () {\n        const segments = this.get('callState.segments');\n        if (_.size(segments) === 1 && !this.get('isOutbound')) {\n            const segment = _.last(segments);\n            const { type, howEnded } = segment;\n            const lowType = type.toLowerCase();\n            const endedWithDisconnect = maybeLowerCase(howEnded) === 'disconnect';\n            return (lowType === 'dialing' || lowType === 'alert') && endedWithDisconnect;\n        }\n        return false;\n    }),\n\n    isActive: computed('phone.activeCall', function () {\n        return this.get('id') === this.get('phone.activeCall.id');\n    }),\n\n    isHeld: computed.and('callState.held', 'onCall'),\n    isConfined: computed.and('callState.confined', 'onCall', 'onConsult'),\n    isMuted: computed.and('callState.muted', 'onCall'),\n    isRecording: computed.and('callState.recording', 'onCall'),\n    isDisconnected: computed.not('onCall'),\n    wentToVoicemail: computed('allParties.@each.purpose', function () {\n        const parties = this.get('allParties');\n        if (!parties) {\n            return false;\n        }\n        const voicemail = parties.findBy('purpose', 'Voicemail') || parties.findBy('purpose', 'voicemail');\n        return !_.isEmpty(voicemail);\n    }),\n\n    voicemailParties: computed('wentToVoicemail', function () {\n        return _.filter(this.get('allParties'), party => {\n            return party && party.purpose === 'voicemail';\n        });\n    }),\n\n    onCall: computed('callState', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state !== 'disconnected' && state !== 'terminated';\n    }),\n\n    isConnected: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'connected';\n    }),\n\n    onConsult: computed('otherParties.@each.calls', function () {\n        const others = this.get('otherParties');\n        const consultParties = others.filter(other => !!other.consultParticipantId);\n        if (consultParties.length !== 2) {\n            return false;\n        }\n        const found = _.find(others, other => other.consultParticipantId);\n        return !_.isEmpty(found);\n    }),\n\n    markCallAsConsult: observer('onConsult', 'participants.@each.consultParticipantId', 'participants.[]', function () {\n        const consult = _.find(this.get('participants'), participant => {\n            return participant.consultParticipantId;\n        });\n        if (this.get('onConsult') || consult) {\n            return this.set('conversationIsAConsult', true);\n        }\n    }),\n\n    /**\n     * @deprecated use `isActiveConference` from the interaction model instead\n     */\n    onConference: computed('maxParticipants', function () {\n        return this.get('maxParticipants') > 0;\n    }),\n\n    canUpdateConsult: computed('onConsult', 'participants.@each.attributes', function () {\n        const person = this.get('application.session.person');\n        const initiator = _.find(this.get('participants'), participant => {\n            const initiator = participant.attributes.consultInitiator;\n            return initiator === 'true' || initiator === true;\n        });\n        return get(initiator, 'userId') === person.get('guid');\n    }),\n\n    groupRingId: computed('participants.@each.purpose', function () {\n        // grab most recent group participant with endTime\n        // if no endTime, then that group participant is most recent\n        let mostRecentEndTime = null;\n        let groupParticipant = null;\n        for (const participant of this.get('participants')) {\n            const groupId = get(participant, 'groupId') || get(participant, 'group.id');\n            if (groupId) {\n                const currentTimestamp = moment(get(participant, 'endTime'));\n                // Compare with the current most recent timestamp\n                if (mostRecentEndTime === null || currentTimestamp.isAfter(mostRecentEndTime)) {\n                    mostRecentEndTime = currentTimestamp;\n                    groupParticipant = participant;\n                }\n            }\n        }\n        if (groupParticipant) {\n            return groupParticipant.groupId;\n        }\n        return null;\n    }),\n\n    isGroupRing: computed('groupRingId', function () {\n        return !!this.get('groupRingId');\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        const groupId = this.get('groupRingId');\n        if (groupId) {\n            let promise = this.get('application.store').findRecord('group', groupId, {\n                reload: false,\n                backgroundReload: false\n            });\n            return DS.PromiseObject.create({ promise });\n        }\n    }),\n\n    _groupRingCaller: computed('isGroupRing', 'participants', 'connectedParties.@each.purpose', function () {\n        if (!this.get('isGroupRing')) {\n            return null;\n        }\n\n        // We are going to mimic the callv2 behavior, for consistency\n        let participants = this.get('participants');\n        const outboundParticipant = participants.findBy('calls.firstObject.direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const externalParticipants = participants\n            .reject(p => {\n                return Ember.get(p, 'dnis') === 'unknown';\n            })\n            .filter(p => p.purpose === 'external' || p.purpose === 'customer');\n        const inboundExternal = externalParticipants.findBy('calls.firstObject.direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', '_groupRingCaller', 'myGuid', function () {\n        return this.get('isOutbound') && this.get('_groupRingCaller.userId') === this.get('myGuid');\n    }),\n\n    groupRingCaller: computed('_groupRingCaller', function () {\n        const actualCaller = this.get('_groupRingCaller');\n        let caller = actualCaller;\n\n        if (caller && caller.userId) {\n            let promise = this.get('store').findRecord('person', caller.userId, {\n                reload: false,\n                backgroundReload: false\n            });\n            caller = DS.PromiseObject.create({ promise });\n        }\n        return caller;\n    }),\n\n    connectedToStationAndNotConference: computed('participants.[]', 'onConference', function () {\n        const participants = this.get('participants');\n        const anotherPartyIsStation = !!participants.find(p => {\n            const isStation = Ember.get(p, 'purpose') === 'station';\n            if (!isStation) {\n                return false;\n            }\n            const isStandaloneStation = Ember.get(p, 'name');\n            if (isStandaloneStation) {\n                return false;\n            }\n            return Ember.get(p, 'calls.firstObject.disconnectType') !== 'transfer.forward';\n        });\n        const anotherPartyIsVoicemail = !!participants.findBy('purpose', 'voicemail');\n        return anotherPartyIsStation && !this.get('onConference') && !anotherPartyIsVoicemail;\n    }),\n\n    _doesParticipantHaveActiveSessionShare: function (participant) {\n        const screenShares = Ember.get(participant, 'screenShares') || Ember.get(participant, 'screenshares');\n        const cobrowsesessions = Ember.get(participant, 'cobrowsesessions');\n        const videos = Ember.get(participant, 'videos');\n\n        let allMedia = [];\n        if (screenShares) {\n            allMedia = allMedia.concat(screenShares);\n        }\n        if (cobrowsesessions) {\n            allMedia = allMedia.concat(cobrowsesessions);\n        }\n        if (videos) {\n            allMedia = allMedia.concat(videos);\n        }\n\n        let connectedMedia = _.find(allMedia, media => media.state.toLowerCase() === 'connected');\n        return !!connectedMedia;\n    },\n\n    agentParticipants: computed('participants.[]', 'myGuid', function () {\n        return _.filter(this.get('participants'), participant => {\n            const guid = userGuidFromParticipant(participant);\n            const purpose = participant.purpose.toLowerCase();\n            return this.get('myGuid') === guid && (purpose === 'agent' || purpose === 'user');\n        });\n    }),\n\n    conversationHasActiveSessionShare: computed('agentParticipants.[]', function () {\n        let hasActiveMedia = _.some(this.get('agentParticipants'), participant => {\n            return this._doesParticipantHaveActiveSessionShare(participant);\n        });\n        return hasActiveMedia;\n    })\n});\n","define(\"connections-ui/models/conversation\", [\"exports\", \"ember-purecloud-components/models/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    homeDivision: DS.attr('boolean')\n});\n","define(\"connections-ui/models/email-communication\", [\"exports\", \"ember-purecloud-components/models/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import TranslationModel from 'ember-intl/models/translation';\n\n/* Allows support for both dot-separated keys and nested objects in the dictionary\n * For example, all of the following are supported\n       {\n            'greeting': \"Hello!\",\n            \"error\": {\n                \"catastrophic.failure\": \"The world has ended.\"\n            },\n            \"my.favorite.color\": \"fuchsia\"\n       }\n*/\nexport default TranslationModel.extend({\n    addTranslation(key, value) {\n        this.get('translations')[key] = value;\n    },\n    getValue(key) {\n        if (key) {\n            let segments = key.split('.');\n            let level = this.get('translations');\n            let i = 0;\n\n            for (i = 0; i < segments.length; i++) {\n                let value = level[segments.slice(i).join('.')];\n\n                if (typeof value === 'string') {\n                    return value;\n                }\n\n                let segment = segments[i];\n\n                if (Object.prototype.hasOwnProperty.call(level, segment)) {\n                    level = level[segment];\n                } else {\n                    break;\n                }\n            }\n        }\n\n        return undefined;\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    agent: null,\n    agentHasRead: null,\n    assignedDate: null,\n    releaseDate: null,\n    changedDate: null,\n    conversation: null,\n    evaluationForm: null,\n    evaluator: null,\n    status: null,\n    redacted: false,\n    selected: false,\n    rescore: false,\n    mediaType: [],\n    conversationDate: null,\n    assignee: null,\n    dateAssigneeChanged: null,\n    declinedReview: false,\n\n    displayThumbnail: Ember.computed('agent.userImages', function () {\n        if (this.get('agent.userImages.length')) {\n            return this.get('agent.userImages.firstObject');\n        }\n        return { imageUri: null };\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    title: computed('general.title.@each.value', function () {\n        const field = this.getFieldValue('general.title');\n        return field && field.value;\n    }),\n\n    department: computed('general.department.@each.value', function () {\n        const field = this.getFieldValue('general.department');\n        return field && field.value;\n    }),\n\n    organization: computed('general.organization.@each.value', function () {\n        const field = this.getFieldValue('general.organization');\n        return field && field.value;\n    }),\n\n    description: computed('general.notes.@each.value', function () {\n        const field = this.getFieldValue('general.notes')[0];\n        return field && field.value;\n    }),\n\n    phone: computed('contactInfo.phone.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.phone');\n        return field && field[0];\n    }),\n\n    email: computed('contactInfo.email.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.email');\n        return field && field.value;\n    })\n});\n","import DS from 'ember-data';\n\n// This is like a \"union\" type pf the various Relate domain messaging ID types (see the FacebookId, LineId, TwitterId\n// and WhatsApp domain classes in the Relate contact-service project).\n//\n// Also refer to the *_id models in this directory\n//\n// An Ember DS record of this type is built from the inbound message to help detect changes between the message's info, and\n// channel info from an external contact in Relate for the same channel.\nexport default DS.Model.extend({\n    type: DS.attr('string'), // Meta info about the channel\n    channelIdProperty: DS.attr('string'), // Meta info about the domain class property name for the channel (e.g. \"lineId\" or \"twitterId\")\n    isNewChannel: DS.attr('boolean'), // Meta info -- true if this is a new channel for an external contact\n    changesIgnoredByAgent: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they elected to ignore\n    agentRespondedToPrompt: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they responded\n    userId: DS.attr('string'), // The ID of the user from the channel\n    ids: DS.attr(), // An array of strings representing an array of user IDs for the channel (for Facebook or LINE)\n    name: DS.attr('string'), // The name of the user (for Twitter)\n    displayName: DS.attr('string'), // For display name of the user (for LINE, Facebook, and WhatsApp)\n    screenName: DS.attr('string'), // The screen name (AKA handle) of the user (for Twitter)\n    phoneNumber: DS.attr() // Includes e164: an e164-formatted phone number, and display: a display-friendly phone number (for Whatsapp),\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    channelId: DS.attr('string'),\n    isNewChannel: DS.attr('boolean')\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../../utils/dates';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const PreferredPhoneContactOrder = ['workPhone', 'homePhone', 'cellPhone', 'otherPhone', 'whatsAppId'];\nexport const PreferredEmailContactOrder = ['workEmail', 'personalEmail', 'otherEmail'];\nexport const ENTITY_TYPE = 'externalcontacts/contact';\n\nconst { computed } = Ember;\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    names: Ember.inject.service(),\n    schemaService: Ember.inject.service('schema'),\n    schemaType: 'contact',\n    type: ENTITY_TYPE,\n    externalDataSources: DS.attr(),\n    externalOrganizationId: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    firstName: DS.attr('string'),\n    middleName: DS.attr('string'),\n    lastName: DS.attr('string'),\n    title: DS.attr('string'),\n    address: DS.attr(),\n    workPhone: DS.attr(),\n    cellPhone: DS.attr(),\n    homePhone: DS.attr(),\n    otherPhone: DS.attr(),\n    workEmail: DS.attr('string'),\n    personalEmail: DS.attr('string'),\n    otherEmail: DS.attr('string'),\n    twitterId: DS.attr(),\n    lineId: DS.attr(),\n    facebookId: DS.attr(),\n    whatsAppId: DS.attr(),\n    surveyOptOut: DS.attr('boolean', { defaultValue: false }),\n\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    division: DS.attr(),\n\n    contactType: DS.attr(),\n    mergedTo: DS.attr(),\n    mergedFrom: DS.attr(),\n    canonicalContact: DS.attr(),\n    mergeSet: DS.attr(),\n\n    isCurated: computed('contactType', function () {\n        return this.get('contactType') === 'curated';\n    }),\n    isIdentified: computed('contactType', function () {\n        return this.get('contactType') === 'identified';\n    }),\n\n    canonicalId: computed.alias('canonicalContact.id'),\n    divisionName: computed.alias('division.name'),\n    isCanonical: computed('id', 'canonicalId', function () {\n        const { canonicalId, id } = this.getProperties('canonicalId', 'id');\n        return canonicalId === id;\n    }),\n\n    phoneNumber: null, // Set by the entity-mini/external-contact/component as the phone number the user selected\n    phoneType: null, // Set by the entity-mini/external-contact/component as the phone numbers type the user selected\n    externalOrganization: DS.belongsTo('externalcontacts/externalOrganization', { async: false }),\n    externalSystemUrl: DS.attr('string'),\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    hasEmailAddresses: Ember.computed.bool('bestEmailAddress'),\n\n    //these aliases are used to aid in validation.\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    isSalesForce: computed.bool('salesforceLink'),\n    acdOutboundWhatsApp: true,\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey =\n                phoneName === 'whatsAppId' ? phoneName.replace('Id', 'Number') : phoneName.replace('Phone', 'Number');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    initials: computed('firstName', 'lastName', function () {\n        return this.get('names').initials(this);\n    }),\n    name: computed('firstName', 'lastName', 'middleName', function () {\n        return this.get('names').fullName(this);\n    }),\n    /**\n     * Gets the best email available for this contact, or undefined if there is none\n     */\n    bestEmailAddress: computed(...PreferredEmailContactOrder, function () {\n        const preferredEmailType = this._bestEmailType();\n        return preferredEmailType ? this.get(preferredEmailType) : null;\n    }),\n\n    /**\n     * Gets the best email type available for this contact, or undefined if there is none\n     */\n    bestEmailType: computed(...PreferredEmailContactOrder, function () {\n        return this._bestEmailType();\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumber: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return this.get('acdOutboundWhatsApp') && phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.e164`) || this.get(`${phoneType}.phoneNumber.display`)\n            : this.get(`${phoneType}.e164`) || this.get(`${phoneType}.display`);\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumberDisplay: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.display`) || this.get(`${phoneType}.phoneNumber.e164`)\n            : this.get(`${phoneType}.display`) || this.get(`${phoneType}.e164`);\n    }),\n\n    /**\n     * Gets the best phone type localized string available for this contact, or undefined if there is none\n     */\n    bestPhoneType: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        if (bestPhoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return bestPhoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${bestPhoneType}`)\n            : undefined;\n    }),\n\n    /**\n     * Gets the best phone type parameter key available for this contact, or undefined if there is none\n     */\n    bestPhoneTypeKey: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return bestPhoneType ? bestPhoneType : undefined;\n    }),\n\n    adapterDidCommit() {\n        return; // Does nothing but prevent \"TypeError: _this.adapterDidCommit is not a function(�)\" when canceling an edit due to a EntityMixin call to that method\n    },\n\n    getEmailTitleFor(emailType) {\n        return emailType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.emailTypes.otherEmail');\n    },\n\n    getPhoneTitleFor(phoneType) {\n        if (phoneType === 'whatsAppId')\n            return this.get('intl').t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return phoneType\n            ? this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${phoneType}`)\n            : this.get('intl').t('purecloud.acdInteraction.relate.phoneTypes.otherPhone');\n    },\n\n    _bestEmailType() {\n        return PreferredEmailContactOrder.find(emailType => this.get(emailType));\n    },\n\n    _bestPhoneType(types) {\n        return (\n            this.get('phoneType') ||\n            types.find(type => {\n                return this.get(`${type}.e164`) || this.get(`${type}.display`);\n            }) ||\n            types.find(type => {\n                return this.get(`${type}.phoneNumber.e164`) || this.get(`${type}.phoneNumber.display`);\n            })\n        );\n    },\n\n    hasEmailAddress(address) {\n        return PreferredEmailContactOrder.some(emailType => this.get(emailType) && this.get(emailType) === address);\n    },\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        if (this.get('canShowCustomFields') && id) {\n            return await this.get('schemaService')\n                .getSchema(schemaType, id)\n                .catch(() => {\n                    return SERVICE_ERROR;\n                });\n        } else {\n            return '';\n        }\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData && schemaData !== SERVICE_ERROR ? schemaData.get('name') : schemaData;\n    })\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport moment from '../../utils/dates';\n\nconst { computed } = Ember;\nexport const PreferredPhoneContactOrder = ['phoneNumber', 'faxNumber'];\nconst getSetter = function (index) {\n    return {\n        get() {\n            const websites = this.get('websites');\n            return websites ? websites[index] : null;\n        },\n        set(key, value) {\n            const websites = this.get('websites');\n            websites[index] = value;\n            return websites[index];\n        }\n    };\n};\nconst SERVICE_ERROR = 'SERVICE_ERROR';\n\nexport default DS.Model.extend(RelateFeaturesMixin, {\n    isOrganization: true,\n    schemaService: Ember.inject.service('schema'),\n    schemaType: 'external-org',\n    type: 'externalcontacts/externalOrganization',\n    name: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    companyType: DS.attr('string'),\n    industry: DS.attr('string'),\n    primaryContactId: DS.attr('string'),\n    address: DS.attr(),\n    phoneNumber: DS.attr(),\n    faxNumber: DS.attr(),\n    employeeCount: DS.attr('number'),\n    revenue: DS.attr('number'),\n    tags: DS.attr(),\n    tickers: DS.attr(),\n    websites: DS.attr(),\n    twitterId: DS.attr(),\n    contact: DS.hasMany('externalcontacts/contact', { async: false }),\n    externalDataSources: DS.attr(),\n    externalSystemUrl: DS.attr('string'),\n    isSalesForce: computed.bool('salesforceLink'),\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey = phoneName.replace('Number', '');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, computed.alias(`${phoneName}.display`));\n            this.set(featureKeyExt, computed.alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, computed.alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    createdDate: computed('createDate', function () {\n        return moment(this.get('createDate')).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.get('modifyDate')).format('L');\n    }),\n\n    website1: computed('websites.[]', getSetter.call(this, 0)),\n    website2: computed('websites.[]', getSetter.call(this, 1)),\n    //these aliases are used to aid in validation.\n\n    address1: computed.alias('address.address1'),\n    address2: computed.alias('address.address2'),\n    city: computed.alias('address.city'),\n    state: computed.alias('address.state'),\n    postalCode: computed.alias('address.postalCode'),\n    countryCode: computed.alias('address.countryCode'),\n\n    twitter: computed.alias('twitterId.screenName'),\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.get('externalDataSources') || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    expandedSchema: computed('schema.id', 'canShowCustomFields', 'schemaType', async function () {\n        const id = this.get('schema.id');\n        const schemaType = this.get('schemaType');\n\n        return this.get('canShowCustomFields') && id ? await this.get('schemaService').getSchema(schemaType, id) : '';\n    }),\n\n    schemaTitle: computed('expandedSchema', async function () {\n        const schemaData = await this.get('expandedSchema').catch(() => {\n            return SERVICE_ERROR;\n        });\n\n        return schemaData ? schemaData.get('name') : '';\n    })\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const FACEBOOKID_TYPE = 'externalcontacts/facebook-id';\n\nexport default Channel.extend({\n    type: 'facebook',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const LINEID_TYPE = 'externalcontacts/line-id';\n\nexport default Channel.extend({\n    type: 'line',\n    ids: DS.attr(),\n    displayName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const TWITTERID_TYPE = 'externalcontacts/twitter-id';\n\nexport default Channel.extend({\n    type: 'twitter',\n    id: DS.attr('string'),\n    name: DS.attr('string'),\n    screenName: DS.attr('string')\n});\n","import DS from 'ember-data';\nimport Channel from './channel';\n\nexport const WHATSAPP_TYPE = 'externalcontacts/whatsapp-id';\n\nexport default Channel.extend({\n    type: 'whatsapp',\n    displayName: DS.attr('string'),\n    phoneNumber: DS.attr() // includes e164: an e164-formatted phone number, and display: a display-friendly phone number\n});\n","import Ember from 'ember';\n\nconst { computed, inject } = Ember;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n\n    id: null,\n    name: null,\n    dateCreated: null,\n    dateModified: null,\n    contentUri: null,\n    workspace: null,\n    createdBy: null,\n    contentType: null,\n    contentLength: null,\n    filename: null,\n    read: false,\n    thumbnails: null,\n    selfUri: null,\n    callerAddress: '',\n    receiverAddress: '',\n    selected: false,\n\n    isDefaultName: computed('name', 'callerAddress', function () {\n        let name = this.get('name');\n        if (!name) {\n            return false;\n        }\n        return name.toLowerCase().indexOf('fax from ') === 0;\n    }),\n\n    faxName: computed('isDefaultName', 'name', 'callerAddress', function () {\n        if (this.get('isDefaultName')) {\n            return this.get('intl')\n                .t('notification.inbox.faxFrom', { callerAddress: this.get('callerAddress') })\n                .toString();\n        }\n        return this.get('name');\n    }),\n\n    faxFrom: computed('callerAddress', 'createdBy', function () {\n        const callerAddress = this.get('callerAddress');\n        if (callerAddress) {\n            return callerAddress;\n        }\n        return this.get('intl').lookup('notification.inbox.unknownSender');\n    }),\n\n    faxFile: computed('filename', 'name', function () {\n        const name = this.get('name');\n        if (name) {\n            return name;\n        }\n        return this.get('filename');\n    }),\n    displayThumbnail: computed('thumbnails.[]', function () {\n        const thumbnails = this.get('thumbnails');\n        return (\n            thumbnails[0] || {\n                imageUri: null\n            }\n        );\n    }),\n    /**\n     *  Converts 'this' into an object that can be passed to the faxes standalone app\n     * @returns An object with all of the properties of 'this' that are specified in props\n     */\n    getProperties: function () {\n        const props = [\n            'id',\n            'name',\n            'dateCreated',\n            'dateModified',\n            'contentUri',\n            'workspace',\n            'createdBy',\n            'contentType',\n            'contentLength',\n            'filename',\n            'read',\n            'thumbnails',\n            'pageCount',\n            'selfUri',\n            'callerAddress',\n            'receiverAddress',\n            'selected'\n        ];\n        return props.reduce((accumulator, prop) => {\n            return Object.assign(accumulator, { [prop]: this.get(prop) });\n        }, {});\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    enabled: DS.attr()\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    longitude: DS.attr(),\n    latitude: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { inject, computed, observer } = Ember;\n\nconst ISSUE_REGEX = /http(?:s)?:\\/\\/github\\.com\\/[a-zA-Z0-9_\\-.]+\\/[a-zA-Z0-9\\-.]+\\/issues\\/([0-9]+)$/i;\n\nexport default Ember.Object.extend({\n    intl: inject.service(),\n    preferences: inject.service(),\n\n    mediaType: null,\n\n    username: null,\n    url: null,\n    repo: null,\n    link: null,\n\n    data: null,\n\n    settings: {},\n    showEmbedConfirmation: false,\n\n    init() {\n        this._super(...arguments);\n\n        this.get('preferences.widgets.githubRepo'); // setup observer\n\n        this.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                if (settings === undefined) {\n                    this.set('showEmbedConfirmation', true);\n                } else {\n                    let showEmbed = false;\n                    if (settings.showEmbedConfirmation === undefined) {\n                        showEmbed = true;\n                    }\n                    this.set('settings', settings);\n                    this.set('showEmbedConfirmation', showEmbed);\n                }\n            });\n    },\n\n    isRepo: computed.equal('mediaType', 'github-repo'),\n    isGist: computed.equal('mediaType', 'github-gist'),\n\n    isIssue: computed('link', 'isRepo', function () {\n        if (!this.get('isRepo')) {\n            return false;\n        }\n\n        return ISSUE_REGEX.test(this.get('link'));\n    }),\n\n    issueNumber: computed('link', function () {\n        return _.last(this.get('link').match(ISSUE_REGEX));\n    }),\n\n    title: computed('username', 'repo', 'isRepo', 'isGist', 'isIssue', function () {\n        const intl = this.get('intl');\n        const username = this.get('username');\n        if (this.get('isGist')) {\n            return intl.t('chat.inlineMedia.gistTitle', { username }).toString();\n        } else if (this.get('isRepo')) {\n            const repo = this.get('repo');\n            if (this.get('isIssue')) {\n                const issue = this.get('issueNumber');\n                return intl.t('chat.inlineMedia.githubIssueTitle', { issue, repo }).toString();\n            }\n            return intl.t('chat.inlineMedia.githubRepoTitle', { username, repo }).toString();\n        }\n    }),\n\n    embedString: computed(function () {\n        return this.get('intl').lookup('chat.inlineMedia.githubItems.embedSupport');\n    }),\n\n    shouldEmbed: computed('settings.embed', function () {\n        return this.get('settings.embed') || false;\n    }),\n\n    onSettingsChange: observer('preferences.widgets.githubRepo', function () {\n        this.get('preferences')\n            .getPreference('widgets.githubRepo')\n            .then(settings => {\n                this.set('settings', settings);\n                this.set('showEmbedConfirmation', settings.showEmbedConfirmation);\n            });\n    }),\n\n    setEmbedPreference(pref) {\n        let settings = this.get('settings');\n        Ember.setProperties(settings, {\n            embed: pref,\n            showEmbedConfirmation: false\n        });\n\n        this.set('showEmbedConfirmation', false);\n\n        this.get('preferences').setPreference('widgets.githubRepo', settings);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    division: DS.attr(),\n    role: DS.attr(),\n    subjectId: DS.attr('string')\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    group: DS.attr(),\n    enabled: DS.attr(),\n    groupAlertType: DS.attr(),\n    overflowGroupId: DS.attr(),\n    rotateCallsSecs: DS.attr(),\n    sendEmailNotifications: DS.attr(),\n    disableEmailPii: DS.attr(),\n    stopRingingAfterRotations: DS.attr(),\n    includeEmailTranscriptions: DS.attr(),\n    languagePreference: DS.attr()\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityMixin from '../mixins/entity';\nimport EntityImageComponent from 'ember-purecloud-components/components/entity-image/component';\n\nexport const BASE_GROUP_FIELDS = [\n    'general',\n    'owners',\n    'membership',\n    'individuals',\n    'images.activeProfilePicture',\n    'extMongoId',\n    'contactInfo'\n];\n\nexport const BASE_GROUP = BASE_GROUP_FIELDS.join(',');\n\nconst COMPARATORS = {\n    EqualTo: {\n        label: 'equals (==)',\n        value: 'EqualTo',\n        op: '=='\n    },\n    NotEqualTo: {\n        label: 'not equals (!=)',\n        value: 'NotEqualTo',\n        op: '!='\n    },\n    GreaterThan: {\n        label: 'greater than (>)',\n        value: 'GreaterThan',\n        op: '>'\n    },\n    GreaterThanOrEqualTo: {\n        label: 'greater than or equal to (>=)',\n        value: 'GreaterThanOrEqualTo',\n        op: '>='\n    },\n    LessThan: {\n        label: 'less than (<)',\n        value: 'LessThan',\n        op: '<'\n    },\n    LessThanOrEqualTo: {\n        label: 'less than or equal to (<=)',\n        value: 'LessThanOrEqualTo',\n        op: '<='\n    }\n};\n\nconst PROFICIENCIES = [\n    { name: '0', value: 0 },\n    { name: '1', value: 1 },\n    { name: '2', value: 2 },\n    { name: '3', value: 3 },\n    { name: '4', value: 4 },\n    { name: '5', value: 5 }\n];\n\nvar GroupModel = DS.Model.extend(EntityMixin, {\n    ajax: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    permissions: Ember.inject.service(),\n\n    meta: DS.attr(),\n    policy: DS.belongsTo('group-policy'),\n\n    acdSkills: null,\n\n    lastSavedExpression: null,\n\n    expression: Ember.computed('_expression.content', function () {\n        if (!this.get('_expression.content')) {\n            return null;\n        }\n        return this.parseExpression(this.get('_expression.content.skillConditions'));\n    }),\n\n    isDynamicGroup: Ember.computed(\n        'expression',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            return this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')\n                ? !!this.get('expression')\n                : false;\n        }\n    ),\n\n    reload() {\n        this.notifyPropertyChange('greeting');\n        this.get('policy').then(policy => {\n            if (policy) {\n                policy.reload();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    rollbackAttributes() {\n        this.notifyPropertyChange('greeting');\n        this.notifyPropertyChange('individuals');\n        this.get('policy').then(policy => {\n            if (policy) {\n                policy.rollbackAttributes();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    // convert to attribute on Ember-Data upgrades\n    greeting: Ember.computed('guid', function () {\n        const path = `api/v2/groups/${this.get('guid')}/greetings/defaults`;\n        const url = this.get('application').pcV2Uri(path);\n\n        return DS.PromiseObject.create({\n            promise: this.get('ajax').request(url)\n        });\n    }),\n\n    _expression: Ember.computed(\n        'guid',\n        'session.features.PURE3301-dynamicGroups',\n        'permissions.canViewGroups',\n        function () {\n            if (this.get('session.features.PURE3301-dynamicGroups') && this.get('permissions.canViewGroups')) {\n                const path = `api/v2/groups/${this.get('guid')}/dynamicsettings`;\n                const url = this.get('application').pcV2Uri(path);\n                return DS.PromiseObject.create({\n                    promise: this.get('ajax')\n                        .ajaxGet(url, {\n                            retry: true\n                        })\n                        .then(res => {\n                            return Ember.RSVP.resolve(res.query);\n                        })\n                        .catch(err => {\n                            if (err.status === 404) {\n                                //this group is confirmed not a dynamic group\n                                return Ember.RSVP.resolve(null);\n                            } else if (\n                                err.status === 403 && // check and see if it's a permission issue\n                                err.payload.code === 'missing.any.permissions' &&\n                                err.payload.message.indexOf('directory:group:view') > 0\n                            ) {\n                                // this user needs the updated group:view permissions\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.permissionErrorMessage')\n                                );\n                            } else {\n                                //actual error\n                                this.get('logger').error('Error trying to load dynamic expression for group', {\n                                    err\n                                });\n                                this.get('notification').error(\n                                    this.get('intl').t('groups.expressions.loadErrorTitle'),\n                                    this.get('intl').t('groups.expressions.loadErrorMessage')\n                                );\n                                return Ember.RSVP.resolve(null);\n                            }\n                        })\n                });\n            }\n        }\n    ),\n\n    description: Ember.computed('general.description.@each.value', function () {\n        return this.getFieldValue('general.description').value;\n    }),\n\n    groupType: Ember.computed('general.groupType', function () {\n        var groupTypeValue = this.getFieldValue('general.groupType').value;\n        if (groupTypeValue) {\n            var actualType = groupTypeValue.split('.')[1];\n            var key = `group_general_groupType_value_${actualType}`;\n\n            return this.get('intl').lookup(key, null, true).toString();\n        }\n\n        return '';\n    }),\n\n    memberCount: Ember.computed('general.memberCount.@each.value', function () {\n        if (this.get('general.memberCount')) {\n            return this.getFieldValue('general.memberCount').value;\n        }\n\n        return 0;\n    }),\n\n    profilePictureURL: Ember.computed('images.activeProfilePicture', function () {\n        var images = this.get('images');\n\n        if (images && images.activeProfilePicture && images.activeProfilePicture[0].ref) {\n            return images.activeProfilePicture[0].ref.x128;\n        } else {\n            return EntityImageComponent.placeholderImageForSize(this, 'x200');\n        }\n    }),\n\n    uploadedProfilePictures: Ember.computed('images.profilePictures', function () {\n        var field = this.getFieldValue('images.profilePictures');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: Ember.computed('images.gallery', function () {\n        var field = this.getFieldValue('images.gallery');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    groupVisibility: Ember.computed('privacy.groupVisibility', function () {\n        return this.getFieldValue('privacy.groupVisibility').value;\n    }),\n\n    membershipVisible: Ember.computed('privacy.membershipVisible', function () {\n        return this.getFieldValue('privacy.membershipVisible').value;\n    }),\n\n    includeOwners: Ember.computed('membership.includeOwners', function () {\n        var visible = this.getFieldValue('membership.includeOwners').value;\n        return this.get('intl').lookup(`entity.fieldTypes.boolean.checked-${visible}`).toString();\n    }),\n\n    areOwnersIncluded: Ember.computed('membership.includeOwners', function () {\n        return this.getFieldValue('membership.includeOwners').value;\n    }),\n\n    groupEmailAddress: Ember.computed('general.exchangeNameOverride', {\n        get() {\n            return this.getFieldValue('general.exchangeNameOverride').value;\n        },\n        set(key, value) {\n            if (value === undefined) {\n                value = '';\n            }\n            return this.set('general.exchangeNameOverride', value)[0].value;\n        }\n    }),\n\n    needsCommit: Ember.computed('general.needsCommit', function () {\n        return this.getFieldValue('general.needsCommit').value;\n    }),\n\n    membershipSearchQuery: Ember.computed('membership.compiledQuery.[]', function () {\n        var compiledQuery = this.getFieldValue('membership.compiledQuery');\n        var query = Ember.get(compiledQuery, 'value.q');\n        if (query && query.length) {\n            return query[0].value;\n        }\n\n        return '';\n    }),\n\n    generalSearchQuery: Ember.computed('id', 'general.groupType', function () {\n        var groupType = this.getFieldValue('general.groupType').value;\n        return `${groupType}:${this.get('guid')}`;\n    }),\n\n    isActive: Ember.computed('state', function () {\n        return this.get('state') === 'active';\n    }),\n\n    isDeleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    jid: Ember.computed('_id', 'contactInfo.chat.[]', function () {\n        // Synthesizing jid from a missing `_id` previously produced \"undefined@conference.<org>.orgspan.com\".\n        // Prefer the API-provided chat jid. Search/partial loads often omit `_id` even when contactInfo.chat is present;\n        const chatJid = this.get('contactInfo.chat.firstObject.value.jid');\n        if (chatJid) return chatJid;\n\n        const id = this.get('_id');\n        if (!id) return null;\n\n        const org = this.get('application.session.org');\n        const shortName = Ember.get(org, 'general.shortName');\n        const name = shortName && shortName[0] && shortName[0].value;\n        if (!name) return null;\n\n        return `${id}@conference.${name}.orgspan.com`;\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve()\n        });\n    }),\n\n    // -- Handles Grants and Roles Associated with the Group --\n\n    allowPermissionGroup: Ember.computed('general.allowPermissionGroup', {\n        get() {\n            return this.getFieldValue('general.allowPermissionGroup').value;\n        },\n        set(key, value) {\n            return this.set('general.allowPermissionGroup', value)[0].value;\n        }\n    }),\n\n    uniqueRoleCount: 0,\n    grantVersion: -1,\n\n    getGrants() {\n        return new Ember.RSVP.Promise(resolve => {\n            var path = `api/v2/authorization/subjects/${this.get('guid')}`;\n            var url = this.get('application').pcV2Uri(path);\n            this.get('ajax')\n                .ajaxGet(url)\n                .then(data => {\n                    let rolesMap = {};\n                    let uniqueRoleCount = 0;\n                    data.grants.forEach(grant => {\n                        if (!rolesMap[grant.role.id]) {\n                            rolesMap[grant.role.id] = true;\n                            uniqueRoleCount++;\n                        }\n                    });\n                    this.set('uniqueRoleCount', uniqueRoleCount);\n                    this.set('grantVersion', data.version);\n                    resolve(data.grants);\n                });\n        });\n    },\n\n    // --\n\n    number: Ember.computed('contactInfo.groupNumber.@each.value', 'contactInfo.groupNumber.@each.rel', function () {\n        return this.getFieldValue('contactInfo.groupNumber');\n    }),\n\n    //TODO: Delete these references to the policy model when group contact modal is deleted\n    numberOfRotations: Ember.computed('policy.stopRingingAfterRotations', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('stopRingingAfterRotations'));\n            })()\n        });\n    }),\n\n    rotateCallSeconds: Ember.computed('policy.rotateCallsSecs', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('rotateCallsSecs'));\n            })()\n        });\n    }),\n\n    emailNotificationEnabled: Ember.computed.reads('policy.sendEmailNotifications', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('sendEmailNotifications'));\n            })()\n        });\n    }),\n\n    voicemailEnabled: Ember.computed('policy.enabled', function () {\n        return DS.PromiseObject.create({\n            promise: (() => {\n                return this.get('policy').then(policy => policy.get('enabled'));\n            })()\n        });\n    }),\n\n    membershipChange: Ember.observer('membership.inclusions.[]', 'membership.exclusions.[]', function () {\n        var membership = this.get('membership');\n        this.set('membershipDraft', membership);\n    }),\n\n    isPersonOwner(person) {\n        if (!person) {\n            return false;\n        }\n\n        let owner = this.getFieldValue('owners.owners').findBy('value', person.get('id'));\n        let guidOwner = this.getFieldValue('owners.owners').findBy('guid', person.get('id'));\n        return !_.isEmpty(owner) || !_.isEmpty(guidOwner);\n    },\n\n    /**\n     * We derive the Jabber ID for a group from the `_id` property.\n     * Normally, this is set in the group serializer.\n     * Search results do not go through the group serializer.\n     * We need to set the `_id` on the group entity so that `group.get('jid')` resolves properly.\n     * @returns\n     */\n    setIdForGroupEntity() {\n        const existingId = this.get('_id');\n        if (existingId) {\n            return;\n        }\n        const jid = this.get('contactInfo.chat.firstObject.value.jid');\n        if (jid) {\n            const idParts = jid.split('@');\n            const id = idParts.length > 0 ? idParts[0] : '';\n            Ember.run(() => {\n                this.set('_id', id);\n            });\n        }\n    },\n\n    isPersonIndividual(person) {\n        if (!person) {\n            return false;\n        }\n\n        var individual = this.getFieldValue('individuals.individuals').findBy('value', person.get('id'));\n        var guidIndividual = this.getFieldValue('individuals.individuals').findBy('guid', person.get('id'));\n        return !_.isEmpty(individual) || !_.isEmpty(guidIndividual);\n    },\n\n    getReadableSections() {\n        return this.fieldConfig.get('sections').mapBy('key');\n    },\n\n    getWriteableSections() {\n        var currentPerson = this.get('application.session.person');\n        var ownerIds = this.get('owners.owners').mapBy('value');\n        var sections = this.fieldConfig.get('sections').mapBy('key');\n\n        if (currentPerson && currentPerson.get('isAdmin')) {\n            return sections;\n        }\n\n        if (currentPerson && ownerIds.indexOf(currentPerson.get('id')) !== -1) {\n            return sections;\n        }\n\n        return [];\n    },\n\n    getReadableFieldsForSection(section) {\n        return section.get('fieldList').mapBy('key');\n    },\n\n    setProfilePicture(image) {\n        var profileImageSection = this.get('images.activeProfilePicture');\n\n        if (profileImageSection === undefined) {\n            this.set('images.activeProfilePicture', {});\n            profileImageSection = this.get('images.activeProfilePicture');\n        }\n\n        if (profileImageSection && profileImageSection.length) {\n            var profileImage = profileImageSection[0];\n\n            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'images.profilePictures');\n\n            this.notifyPropertyChange('profilePicture');\n        }\n    },\n\n    deleteGrant(grant) {\n        var path = `/api/v2/authorization/subjects/${this.get('id')}/scopes/${grant.get('scope.id')}/roles/${grant.get(\n            'role.id'\n        )}`;\n        var url = this.get('application').pcV2Uri(path);\n        return this.get('ajax').del(url);\n    },\n\n    parseExpression(input) {\n        let output = [];\n\n        if (!input || input.length === 0) {\n            //no need to parse an empty array\n            return output;\n        }\n\n        // childConditions are all nested, so we gotta recurse\n        const addRule = function (condition, rule) {\n            let newSkill =\n                rule.routingSkillConditions.length === 0\n                    ? {\n                          name: rule.languageSkillConditions[0].languageSkill,\n                          type: 'language'\n                      }\n                    : {\n                          name: rule.routingSkillConditions[0].routingSkill,\n                          type: 'routing'\n                      };\n            let skill =\n                rule.routingSkillConditions.length === 0\n                    ? rule.languageSkillConditions[0]\n                    : rule.routingSkillConditions[0];\n            let children = skill.childConditions;\n            let op = rule.operation ? rule.operation.toUpperCase() : null;\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                op = children.operation.toUpperCase();\n            }\n\n            condition.rules.pushObject({\n                comparator: COMPARATORS[skill.comparator],\n                proficiency: PROFICIENCIES[skill.proficiency],\n                operation: op,\n                opAnd: op == 'AND' ? true : false,\n                skill: newSkill\n            });\n\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                addRule(condition, children);\n            }\n        };\n\n        // so here we'll go through each top-level condition and check recursively for children\n        input.forEach(condition => {\n            let conOp = condition.operation ? condition.operation.toUpperCase() : null;\n\n            let newCondition = {\n                rules: [],\n                lastCondition: false,\n                operation: conOp,\n                opAnd: conOp == 'AND' ? true : false\n            };\n\n            addRule(newCondition, condition);\n\n            newCondition.rules.set('lastObject.lastRule', true);\n            newCondition.rules.set('lastObject.operation', 'OR');\n            newCondition.rules.set('lastObject.opAnd', false);\n            output.pushObject(newCondition);\n        });\n        output.set('lastObject.lastCondition', true);\n        output.set('lastObject.operation', 'OR');\n        output.set('lastObject.opAnd', false);\n        return output;\n    }\n});\n\nGroupModel.reopenClass({\n    apiEndpoint: 'v2/groups'\n});\n\nexport default GroupModel;\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport App, {\n    PC_ENV_URL_REPLACEMENT_TOKEN,\n    GC_HOST_ORIGIN_REPLACEMENT_TOKEN,\n    GC_TARGET_ENV_REPLACEMENT_TOKEN,\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN\n} from './app';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\n\nconst { getOwner, computed, copy, typeOf, isPresent } = Ember;\n\n/**\n * An internally-built PureCloud Client App that is hosted on PureCloud's own infrastructure.\n *\n * The url will be dynamically generated based on the specified config:\n *\n * subdomain=apps: Optional. Subdomain to be prepended to the current purecloud domain.\n * envDetails: Required.  The environment details to build the PureCloud domain.\n * path: Required. The path to the app.  Leading slash will be prepended if omitted.\n * query=?gcHostOrigin={{gcHostOrigin}}&gcTargetEnv={{gcTargetEnv}}&gcLangTag={{gcLangTag}}&gcUsePopupAuth={{gcUsePopupAuth}}: Optional. The querystring for the app. Leading ? will be prepended if omitted.\n *\n * [SECURITY NOTE]: Because these apps will have the same purecloud env tld as the host PureCloud app,\n * they can elevate out of the iframe sandbox.  Because of this, this must always be internal code.\n * This is NOT a hosting option for external apps.\n */\nconst InternallyHostedApp = App.extend({\n    subdomain: null,\n    envDetails: null,\n    path: null,\n    query: null,\n    urlTemplate: computed('subdomain', 'envDetails', 'path', 'query', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = null;\n\n            let subdomain = this.get('subdomain') || netUtils.getPcApplicationsSubdomain();\n            let envDetails = this.get('envDetails');\n            let path = this.get('path');\n            let query = this.get('query');\n\n            if (typeOf(path) === 'string' && isPresent(path) && envDetails) {\n                result = `https://${subdomain}.${envDetails.runtime.currentDomainName}`;\n\n                path = path.trim();\n                if (path.charAt(0) !== '/') {\n                    result += '/';\n                }\n                result += path;\n\n                if (query && typeOf(query) === 'string') {\n                    query = query.trim();\n                    if (query.charAt(0) !== '?') {\n                        result += '?';\n                    }\n                    result += query;\n                } else {\n                    result += `?gcHostOrigin=${GC_HOST_ORIGIN_REPLACEMENT_TOKEN}&gcTargetEnv=${GC_TARGET_ENV_REPLACEMENT_TOKEN}&pcEnvironment=${PC_ENV_URL_REPLACEMENT_TOKEN}&pcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&pcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}&gcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&gcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}`;\n                }\n            }\n\n            return result;\n        },\n        set() {\n            Ember.Logger.error(\n                appUtils.buildLogMsg('Set called on derrived urlTemplate property instead of path property.'),\n                {\n                    path: this.get('path'),\n                    remoteData: {\n                        appId: this.get('id')\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set urlTemplate. Use path property.');\n        }\n    }),\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return InternallyHostedApp.create(ownerMixin, {\n            typeId: this.get('typeId'),\n            id: this.get('id'),\n            name: this.get('name'),\n            subdomain: this.get('subdomain'),\n            envDetails: copy(this.get('envDetails'), deep),\n            path: this.get('path'),\n            query: this.get('query'),\n            langTag: this.get('langTag'),\n            envTld: this.get('envTld'),\n            usePopupAuth: this.get('usePopupAuth'),\n            displayType: this.get('displayType'),\n            featureCategory: this.get('featureCategory'),\n            sandbox: deep ? copy(this.get('sandbox'), true) : this.get('sandbox'),\n            assets: copy(this.get('assets'), deep),\n            lifecycle: copy(this.get('lifecycle'), deep),\n            permissionsPolicy: deep ? copy(this.get('permissionsPolicy'), true) : this.get('permissionsPolicy'),\n            // interapption props\n            interactionId: this.get('interactionId'),\n            interactionType: this.get('interactionType'),\n            enabledQueueIds: deep ? _.cloneDeep(this.get('enabledQueueIds')) : this.get('enabledQueueIds'),\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.get('enabledCommunicationTypes'))\n                : this.get('enabledCommunicationTypes'),\n            gcHostOrigin: this.get('gcHostOrigin'),\n            gcTargetEnv: this.get('gcTargetEnv')\n        });\n    }\n});\n\nexport default InternallyHostedApp;\n","import DS from 'ember-data';\n\nvar LibraryModel = DS.Model.extend({\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    responses: DS.attr()\n});\n\nexport default LibraryModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport const BASE_LOCATION_FIELDS = ['name', 'address', 'images', 'contactPersonId', 'sublocationOrder'];\nexport const BASE_LOCATION = {\n    fl: BASE_LOCATION_FIELDS.join(',')\n};\n\nvar LocationModel = DS.Model.extend({\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    _id: DS.attr(),\n    name: DS.attr(),\n    address: DS.attr(),\n    imageHistory: DS.attr(),\n    contactPersonId: DS.attr(),\n    notes: DS.attr(),\n    sublocationOrder: DS.attr(),\n    images: DS.attr(),\n\n    profileImage: DS.attr(),\n    floorplanImage: DS.attr(),\n    floorplanImageHistory: DS.attr(),\n\n    path: DS.attr(),\n    orgId: DS.attr(),\n\n    version: DS.attr(),\n\n    _entity: DS.attr(),\n\n    floors: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    profilePicture: Ember.computed('profileImage', 'parent.{images,isFulfilled}', 'images', function () {\n        let profileImages = this.get('profileImage');\n\n        if (!_.isEmpty(profileImages)) {\n            let imagex48 = profileImages.find(image => image.resolution === 'x48');\n            let imagex96 = profileImages.find(image => image.resolution === 'x96');\n            let imagex128 = profileImages.find(image => image.resolution === 'x128');\n            let imagex200 = profileImages.find(image => image.resolution === 'x200');\n\n            if (imagex48 && imagex96 && imagex128 && imagex200) {\n                return {\n                    x48: `${imagex48.imageUri}`,\n                    x96: `${imagex96.imageUri}`,\n                    x128: `${imagex128.imageUri}`,\n                    x200: `${imagex200.imageUri}`\n                };\n            }\n        } else if (this.get('images')) {\n            let images = this.get('images');\n            return images;\n        }\n\n        return undefined;\n    }),\n\n    floorCount: Ember.computed('sublocationOrder', function () {\n        var subs = this.get('sublocationOrder');\n\n        if (_.isEmpty(subs)) {\n            return 0;\n        }\n\n        return subs.length;\n    }),\n\n    type: Ember.computed('path', function () {\n        var path = this.get('path');\n\n        if (path && Array.isArray(path) && path.length > 0) {\n            return 'floor';\n        }\n\n        return 'location';\n    }),\n\n    isFloor: Ember.computed('type', function () {\n        return this.get('type') === 'floor';\n    }),\n\n    deleted: Ember.computed('state', function () {\n        return this.get('state') === 'deleted';\n    }),\n\n    hasContactPerson: Ember.computed('contactPersonId', function () {\n        return this.get('contactPersonId') !== null && this.get('contactPersonId') !== undefined;\n    }),\n\n    contactPerson: Ember.computed('contactPersonId', function () {\n        var id = this.get('contactPersonId');\n        if (id) {\n            return this.store.find('person', id);\n        }\n    }),\n\n    floorplan: Ember.computed('floorplanImage', function () {\n        let images = this.get('floorplanImage');\n        if (!_.isEmpty(images)) {\n            let image = images.find(image => image.resolution === 'x1024');\n            if (image) {\n                return image.imageUri;\n            }\n        }\n\n        return undefined;\n    }),\n\n    _parent: null,\n    parent: Ember.computed('type', 'path', function () {\n        if (this.get('type') === 'floor') {\n            let promise;\n            if (this.get('_parent')) {\n                promise = this.get('_parent');\n            } else {\n                promise = this.get('store').findRecord('location', this.get('path')[0]);\n                this.set('_parent', promise);\n            }\n            return DS.PromiseObject.create({\n                promise\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: Ember.RSVP.resolve(undefined)\n        });\n    }),\n\n    containsRichAddress: Ember.computed('address', function () {\n        let address = this.get('address');\n        return typeof address !== 'string';\n    }),\n\n    setFloor() {\n        return;\n    }\n});\n\nexport default LocationModel;\n","import Model from 'ember-data/model';\nimport attr from 'ember-data/attr';\nimport Ember from 'ember';\n\nexport default Model.extend({\n    //id on the model is the occurrence id, not the meeting id\n    roomId: attr(),\n    subject: attr(),\n    description: attr(),\n    organizer: attr(),\n\n    attendees: attr(),\n    notifyAttendees: attr(),\n\n    startDate: attr('iso-date'),\n    endDate: attr(),\n    duration: attr(),\n    recurringType: attr(),\n\n    version: attr(),\n    meeting: attr(), //object that holds the meeting id\n\n    meetingAttendees: Ember.computed('attendees', function () {\n        if (this.get('attendees')) {\n            return Ember.RSVP.resolve(this.get('attendees'));\n        }\n        return this.get('store')\n            .findRecord('meeting', this.get('id'), { reload: true })\n            .then(meeting => meeting.get('attendees'));\n    })\n});\n","define(\"connections-ui/models/message-communication\", [\"exports\", \"ember-purecloud-components/models/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport EntityMixin from '../mixins/entity';\n\nconst { computed } = Ember;\n\nexport default DS.Model.extend(EntityMixin, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    name: computed('general.name.@each.value', function () {\n        const name = this.getFieldValue('general.name');\n        if (name.value) {\n            return name.value;\n        }\n        return '';\n    }),\n\n    shortName: computed('general.shortName.@each.value', function () {\n        const shortName = this.getFieldValue('general.shortName');\n        if (shortName.value) {\n            return shortName.value;\n        }\n        return '';\n    }),\n\n    hasUnifiedCommunications: computed('enabledFeatures.unifiedCommunications.@each.value', function () {\n        const comms = this.getFieldValue('enabledFeatures.unifiedCommunications');\n        if (_.isEmpty(comms)) {\n            return false;\n        }\n        return comms.value;\n    }),\n\n    hasChatEnabled: computed('enabledFeatures.chat.@each.value', function () {\n        const chat = this.getFieldValue('enabledFeatures.chat');\n        return chat.value;\n    }),\n\n    hasHipaaEnabled: computed('enabledFeatures.hipaa.@each.value', function () {\n        const hipaa = this.getFieldValue('enabledFeatures.hipaa');\n        return hipaa.value;\n    }),\n\n    _orgDetails: computed('id', function () {\n        const path = 'api/v2/organizations/me';\n        const url = this.get('application').pcV2Uri(path);\n        const promise = this.get('ajax').request(url);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    orgDefaultCountryCode: computed(\n        'general.defaultCountryCode.@each.value',\n        'session.user.organization.defaultCountryCode',\n        '_orgDetails.content.defaultCountryCode',\n        function () {\n            const fieldValue = this.getFieldValue('general.defaultCountryCode');\n            if (fieldValue && fieldValue.value) {\n                return fieldValue.value;\n            }\n\n            const sessionUserOrgCountryCodeValue = this.get('session.user.organization.defaultCountryCode');\n            if (sessionUserOrgCountryCodeValue) {\n                return sessionUserOrgCountryCodeValue;\n            }\n\n            const orgDetails = this.get('_orgDetails.content');\n            if (orgDetails && orgDetails.defaultCountryCode) {\n                return orgDetails.defaultCountryCode;\n            }\n\n            return null;\n        }\n    ),\n\n    orgPreferences: computed('preferences.preferences.@each.value', function () {\n        const preferences = this.getFieldValue('preferences.preferences');\n        let parsedPreferences;\n        try {\n            parsedPreferences = JSON.parse(preferences.value);\n        } catch (err) {\n            parsedPreferences = {};\n        }\n        return parsedPreferences;\n    })\n});\n","define(\"connections-ui/models/participant\", [\"exports\", \"ember-purecloud-components/models/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { getEntityObjectId } from 'ember-purecloud-components/utils/jid-helpers';\n\nimport EntityMixin from '../mixins/entity';\nimport ChatUserMixin from '../mixins/chat-user';\nimport EntityPresenceMixin from '../mixins/entity-presence';\n\nimport { BASE_GROUP } from '../models/group';\n\n/* /platform/api/v2/users/{id}/profile (or /platform/api/v2/profiles/users) default field list (fl query parameter) */\nexport const BASE_PERSON_FIELDS = [\n    'extMongoId',\n    'general',\n    'contactInfo',\n    'primaryContactInfo',\n    'images.profile',\n    'version'\n];\n/* /platform/api/users expand query parameter list */\nexport const BASE_PERSON_EXPANDS = [\n    'routingStatus',\n    'primaryPresence',\n    'conversationSummary',\n    'outOfOffice',\n    'geolocation',\n    'presence',\n    'locations',\n    'authorization'\n];\nexport const BASE_PERSON = {\n    fl: BASE_PERSON_FIELDS.join(','),\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nexport const FULL_PERSON = {\n    fl: '*',\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nconst { get, set, computed } = Ember;\n\nlet permissionRoutes = ['person.detail', 'person.detail.index', 'card.detail'];\n\n// We need to change how data gets merged in Ember-Data to support our field\n// config...not sure of a way around this...\nfunction merge(original, updates) {\n    _.forEach(updates, (sectionValue, sectionKey) => {\n        if (typeof sectionValue !== 'object' || Array.isArray(sectionValue)) {\n            original[sectionKey] = sectionValue;\n            return;\n        }\n\n        _.forEach(sectionValue, (fieldValue, fieldKey) => {\n            if (!original[sectionKey]) {\n                original[sectionKey] = {};\n            }\n\n            Ember.set(original[sectionKey], fieldKey, fieldValue);\n        });\n    });\n}\n\nfunction clearProperties(original, updates, changedKeys, type) {\n    const originalKeys = Object.keys(original);\n    originalKeys.forEach(sectionKey => {\n        if (updates[sectionKey] === undefined) {\n            set(original, sectionKey, {});\n            changedKeys.push(sectionKey);\n        } else {\n            if (type === 'group') {\n                const sectionData = original[sectionKey];\n                const fieldKeys = Object.keys(sectionData);\n                fieldKeys.forEach(fieldKey => {\n                    const pathKey = `${sectionKey}.${fieldKey}`;\n                    if (get(updates, pathKey) === undefined) {\n                        set(original, pathKey, {});\n                        changedKeys.push(pathKey);\n                    }\n                });\n            }\n        }\n    });\n}\n\n/**\n * @param {object | number} contactCenter contact center conversations\n * @param {object | number} enterprise enterprise  conversations\n * @returns {number} The sum of the active conversations for the two arguments, or 0.\n */\nfunction activityCounter(contactCenter, enterprise) {\n    const contactCenterCount = typeof contactCenter === 'object' ? contactCenter.active : contactCenter || 0;\n    const enterpriseCount = typeof enterprise === 'object' ? enterprise.active : enterprise || 0;\n    return contactCenterCount + enterpriseCount;\n}\n\nlet Internal = DS.InternalModel.prototype;\nlet _setupData = Internal.setupData;\nInternal.setupData = function (data) {\n    const type = data.modelName || data.type;\n    if (type === 'person' || type === 'group') {\n        let changedKeys = [];\n        if (this.hasRecord) {\n            changedKeys = this._changedKeys(data.attributes);\n        }\n\n        merge(this._data, data.attributes);\n\n        // Partial reloading is not a thing for people/groups\n        // So we've gotta clear the data that no longer exists\n        if (this.isReloading) {\n            clearProperties(this._data, data.attributes, changedKeys, type);\n        }\n\n        this.pushedData();\n\n        const record = this.record || this._record;\n        if (record) {\n            record._notifyProperties(changedKeys);\n        }\n        if (this.didInitializeData) {\n            this.didInitializeData();\n        }\n    } else {\n        _setupData.apply(this, arguments);\n    }\n};\n\nlet PersonModel = DS.Model.extend(EntityMixin, ChatUserMixin, EntityPresenceMixin, {\n    ajax: Ember.inject.service(),\n    search: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n\n    _readWritePermissions: null,\n\n    _directReports: null,\n    _siblings: null,\n    _superiors: null,\n\n    namedPermissions: Ember.computed.reads('application.session.namedPermissions'),\n\n    // attributes guaranteed to be on models\n    parent: DS.attr(),\n    path: DS.attr(),\n    children: DS.attr(),\n    roleIds: DS.attr(),\n    expands: DS.attr(),\n    version: DS.attr(),\n    divisionId: DS.attr(),\n\n    _activities: computed.alias('expands'),\n    activities: computed.alias('_activities'),\n\n    // private values just used to simplify computed functions\n    _activityCall: computed.reads('activities.conversationSummary.call'),\n    _activityCallback: computed.reads('activities.conversationSummary.callback'),\n    _activityChat: computed.reads('activities.conversationSummary.message'),\n    _activityWebChat: computed.reads('activities.conversationSummary.chat'),\n    _activityEmail: computed.reads('activities.conversationSummary.email'),\n\n    guid: computed.reads('id'),\n\n    // this computed is used in ember-purecloud-components (EPC) addon\n    // to reduce changes across deprecated projects, we are defaulting this to true.\n    // Once EPC is removed, we can remove this property.\n    showConversationSummaryIndicator: true,\n\n    presenceList: null,\n\n    // We will want to switch completely to 'default' as the only default presence source\n    // but will be blocked until the Presence Service is only returning 'default'.\n    currentPresenceSource: 'PURECLOUD',\n\n    init: function () {\n        this._super(...arguments);\n        this.set('presenceList', Ember.A());\n        this.set('personDetail', Ember.getOwner(this).lookup('controller:person/detail'));\n\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n        // convert current presence source to 'default'\n        this.set('currentPresenceSource', 'default');\n    },\n\n    totalCalls: computed('_activityCall', function () {\n        const contactCenter = this.get('_activityCall.contactCenter.active');\n        const enterprise = this.get('_activityCall.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalCallbacks: computed('_activityCallback', function () {\n        const contactCenter = this.get('_activityCallback.contactCenter.active');\n        const enterprise = this.get('_activityCallback.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalChats: computed('_activityChat', function () {\n        const contactCenter = this.get('_activityChat.contactCenter.active');\n        const enterprise = this.get('_activityChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalWebChats: computed('_activityWebChat', function () {\n        const contactCenter = this.get('_activityWebChat.contactCenter.active');\n        const enterprise = this.get('_activityWebChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalEmails: computed('_activityEmail', function () {\n        const contactCenter = this.get('_activityEmail.contactCenter.active');\n        const enterprise = this.get('_activityEmail.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    activityValues: computed('totalCalls', 'totalCallbacks', 'totalChats', 'totalEmails', function () {\n        return {\n            calls: this.get('totalCalls') + this.get('totalCallbacks'),\n            emails: this.get('totalEmails'),\n            chats: this.get('totalChats') + this.get('totalWebChats')\n        };\n    }),\n\n    title: Ember.computed('general.title.@each.value', function () {\n        var field = this.getFieldValue('general.title');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    department: Ember.computed('general.department.@each.value', function () {\n        var field = this.getFieldValue('general.department');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.email');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    email_main: Ember.computed('contactInfo.email_main', function () {\n        var field = this.getFieldValue('contactInfo.email_main');\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    phone: Ember.computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.voice');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    integrationPhone: Ember.computed('contactInfo.phone_other', function () {\n        let otherPhones = this.get('contactInfo.phone_other');\n        if (otherPhones && otherPhones.length > 0) {\n            return otherPhones.find(phone => phone && phone.value && phone.value.integration);\n        }\n        return null;\n    }),\n\n    agentName: Ember.computed('agent', function () {\n        var field = this.getFieldValue('agent.name');\n\n        return field === undefined ? '' : Ember.get(field, 'value');\n    }),\n\n    uploadedProfilePictures: Ember.computed('uploads.images', function () {\n        var field = this.getFieldValue('uploads.images');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: Ember.computed('images.informal', function () {\n        var field = this.getFieldValue('images.informal');\n\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    socialGroups: Ember.computed('groups.social.[]', function () {\n        return this.getGroupsByType('groups.social');\n    }),\n\n    officialGroups: Ember.computed('groups.official.[]', function () {\n        return this.getGroupsByType('groups.official');\n    }),\n\n    distributionGroups: Ember.computed('purecloud.distributionGroups', function () {\n        return this.getGroupsByType('purecloud.distributionGroups');\n    }),\n\n    ownedGroups: Ember.computed('id', function () {\n        const promise = new Ember.RSVP.Promise((resolve, reject) => {\n            this.get('search')\n                .performSearch(this.get('guid'), 0, 'groups', [], ['owners.owners.guid'], 'EXACT', [], 100)\n                .then(function ({ results }) {\n                    if (results) {\n                        resolve(results);\n                    } else {\n                        resolve([]);\n                    }\n                })\n                .catch(function (err) {\n                    reject(err);\n                });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    manager: Ember.computed('relationships.manager.[]', 'relationships.manager.@each.value', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'guid') || Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('store').findRecord('person', managerId, BASE_PERSON);\n        } else {\n            promise = Ember.RSVP.resolve({});\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    managerSiblings: Ember.computed('manager', 'manager.isFulfilled', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = Ember.get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.get('manager')\n                .then(function (person) {\n                    return person.get('siblings');\n                })\n                .then(function (siblings) {\n                    if (siblings.get('length')) {\n                        return siblings.filterBy('state', 'active');\n                    }\n\n                    return [];\n                });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    otherRelationships: Ember.computed('relationships.relationships.[]', function () {\n        let values = this.getFieldValue('relationships.relationships');\n        let ids = values.mapBy('value');\n        let promise = Ember.RSVP.resolve([]);\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.get('store').findByIds('person', ids, BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    groupedOtherRelationships: Ember.computed('relationships.relationships', function () {\n        var fieldValue = this.getFieldValue('relationships.relationships');\n\n        if (!fieldValue) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        var ids = fieldValue.mapBy('value');\n        var promise;\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findByIds('person', ids).then(function (persons) {\n                // Group relationships by label key.\n                var groupedRelationships = [];\n\n                _.each(fieldValue, function (personEntry) {\n                    var person = persons.findBy('id', personEntry.value);\n                    if (person.get('state') === 'deleted') {\n                        return;\n                    }\n\n                    var relationship = groupedRelationships.findBy('labelKey', personEntry.labelKey);\n                    if (relationship) {\n                        relationship.people.push(person);\n                    } else {\n                        groupedRelationships.push({\n                            labelKey: personEntry.labelKey,\n                            i18nKey:\n                                'person_relationships_relationships_labelKey_' + personEntry.labelKey.replace('.', '_'),\n                            people: [person]\n                        });\n                    }\n                });\n\n                return groupedRelationships;\n            });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    adminAssistants: Ember.computed('relationships.administrativeAssistant.[]', function () {\n        if (this.get('_adminAssistantsRequest')) {\n            return this.get('_adminAssistantsRequest');\n        }\n\n        let promise = Ember.RSVP.resolve([]);\n        let field = this.getFieldValue('relationships.administrativeAssistant');\n\n        if (!field) {\n            return DS.PromiseArray.create({ promise });\n        }\n\n        if (typeof field.mapBy !== 'function') {\n            Ember.Logger.warn('adminAssistants had unexpected value', { field });\n            return DS.PromiseArray.create({ promise });\n        }\n\n        let ids = field.mapBy('value');\n        let cachedData = this.get('_adminAssistants');\n\n        // Check cached data and resolve with it if it matches\n        if (!!cachedData && cachedData.length > 0) {\n            let cachedIds = Ember.A(cachedData).mapBy('id');\n            if (cachedIds.length === ids.length) {\n                let sameIds = cachedIds.filter(id => ids.includes(id));\n                if (sameIds.length === cachedIds.length) {\n                    return DS.PromiseArray.create({\n                        promise: Ember.RSVP.resolve(cachedData)\n                    });\n                }\n            }\n        }\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findMany('person', ids, BASE_PERSON);\n        }\n\n        let promiseArray = DS.PromiseArray.create({\n            promise\n        });\n\n        this.set('_adminAssistantsRequest', promiseArray);\n\n        promiseArray\n            .then(results => {\n                this.set('_adminAssistants', results);\n            })\n            .finally(() => this.set('_adminAssistantsRequest', null));\n\n        return promiseArray;\n    }),\n\n    superiors: Ember.computed(\n        '_superiors',\n        'path.[]',\n        'relationships.manager.[]',\n        'relationships.manager.@each.value',\n        function () {\n            if (this._loadingSuperiors && this.get('_superiors')) {\n                return this.get('_superiors');\n            }\n\n            const cache = this.get('_superiors');\n            if (cache) {\n                return cache.then(people => {\n                    const manager = this.getFieldValue('relationships.manager');\n                    if (!manager || _.isEmpty(manager)) {\n                        this.set('_superiors', null);\n                        return [];\n                    } else if (people.length === 0 && manager.value) {\n                        this.set('_superiors', null);\n                        return this.store\n                            .findSuperiors('person', this.get('id'), BASE_PERSON)\n                            .finally(() => (this._loadingSuperiors = false));\n                    }\n                    return people;\n                });\n            }\n\n            this._loadingSuperiors = true;\n\n            var superiors = this.store\n                .findSuperiors('person', this.get('id'), BASE_PERSON)\n                .finally(() => (this._loadingSuperiors = false));\n            this.set('_superiors', superiors);\n            return superiors;\n        }\n    ),\n\n    directReports: Ember.computed('children.[]', function () {\n        if (this.get('_currentReportsRequest')) {\n            return DS.PromiseArray.create({\n                promise: this.get('_currentReportsRequest')\n            });\n        }\n\n        const id = this.get('id');\n        this.get('logger').info('Refreshing direct reports:', { id });\n\n        let promise = Ember.RSVP.resolve([]);\n\n        let children = this.get('children');\n        if (!Array.isArray(children)) {\n            children = [];\n        }\n        const directReportCount = this.getFieldValue('relationships.directReportCount');\n        const cachedReports = this.get('_directReports.content') || [];\n        const attemptedToLoad = !!this.get('_directReports');\n\n        // Check for the existence of the children prop\n        const dataDiscrepancy = !_.isEmpty(this.get('children')) && children.length !== directReportCount.value;\n\n        const noDirectReports = directReportCount.value === 0 && cachedReports.length === 0;\n\n        let doNotLoad = dataDiscrepancy ? children.length === 0 : noDirectReports && attemptedToLoad;\n\n        const cachedIsSame = _.isEqual(Ember.A(children).sort(), Ember.A(cachedReports).mapBy('id').sort());\n\n        if (doNotLoad) {\n            this.get('logger').info('No direct reports needed to be loaded:', { id });\n        } else if (cachedIsSame && this.get('_directReports')) {\n            this.get('logger').info('Resolving with cached direct reports:', { id });\n            promise = this.get('_directReports') || Ember.RSVP.resolve([]);\n        } else {\n            this.get('logger').info('Loading fresh direct reports', { id });\n            promise = this.store.findDirectReports('person', this.get('id'), BASE_PERSON);\n            this.set(\n                '_directReports',\n                DS.PromiseArray.create({\n                    promise\n                })\n            );\n\n            // We don't use the promise array because we want to keep cached results\n            // and request tracking separate (don't want to clear results)\n            this.set('_currentReportsRequest', promise);\n            promise.finally(() => {\n                this.set('_currentReportsRequest', null);\n            });\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    totalReports: Ember.computed('jid', 'id', function () {\n        const jid = this.get('jid');\n        const entityId = getEntityObjectId(jid);\n        const id = entityId || this.get('id');\n        const promise = this.get('search').countHierarchyReports(id);\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    siblings: Ember.computed('manager', 'selfAndSiblings', function () {\n        var promise = this.get('selfAndSiblings')\n            .then(siblings => {\n                return siblings.filter(person => {\n                    return person.get('id') !== this.get('id') && person.get('state') === 'active';\n                });\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    selfAndSiblings: Ember.computed('manager', function () {\n        var promise = this.get('manager')\n            .then(function (person) {\n                if (person && person.get) {\n                    return person.get('directReports');\n                }\n\n                return [];\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    descendants: Ember.computed(function () {\n        return DS.PromiseArray.create({\n            promise: Ember.RSVP.resolve([])\n        });\n    }),\n\n    readWritePermissions: Ember.computed(function () {\n        let promise = new Ember.RSVP.Promise(resolve => {\n            resolve({\n                read: [],\n                write: []\n            });\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    roles: Ember.computed.reads('application.session.roleNames'),\n\n    /* TODO: Start moving these to permissions service */\n    isAdmin: Ember.computed('application.session.roleNames', 'application.session.user.isSuper', function () {\n        if (this.get('application.session.user.isSuper')) {\n            return true;\n        }\n\n        return _.filter(this.get('application.session.roleNames'), 'isAdmin').length > 0;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_user') > -1;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentAdmin: Ember.computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_admin') > -1;\n    }),\n\n    isNotBusy: Ember.computed('application.session.person.presence', function () {\n        if (this.get('application.session.person.presence') !== 'busy') {\n            return true;\n        }\n        return false;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isCommunicateUser: Ember.computed('application.session.namedPermissions', function () {\n        return _.includes(this.get('application.session.namedPermissions'), 'unified_communications');\n    }),\n\n    updatePermissionsOnRouteChange: Ember.observer('application.currentRouteName', function () {\n        if (this.onProfilePage()) {\n            this.get('readWritePermissions');\n        }\n    }),\n\n    clearDirectReportsCache() {\n        this.set('_directReports', null);\n        this.set('children', []);\n    },\n\n    onProfilePage: function () {\n        var onProfilePage = false;\n        var route = this.get('application.currentRouteName');\n        if (route) {\n            onProfilePage = permissionRoutes.indexOf(this.get('application.currentRouteName')) > -1;\n        }\n\n        var personDetailController = this.get('personDetail');\n        if (onProfilePage && personDetailController) {\n            var personId = personDetailController.get('model.id');\n            return this.get('id') === personId;\n        }\n        return false;\n    },\n\n    setProfilePicture: function (image) {\n        this.setPicture(image, 'images.profile');\n        this.notifyPropertyChange('images.profile');\n        this.notifyPropertyChange('profilePicture');\n    },\n\n    setAgentPicture(image) {\n        this.setPicture(image, 'agent.profileImage');\n        this.notifyPropertyChange('agent.profileImage');\n    },\n\n    setPicture(image, path) {\n        let imageSection = this.get(path);\n        if (imageSection === undefined) {\n            this.set(path, {});\n            imageSection = this.get(path);\n        }\n\n        if (imageSection && imageSection.length) {\n            let profileImage = imageSection[0];\n\n            Ember.set(profileImage, 'ref', image.value);\n            Ember.set(profileImage, 'value.fieldId', image._id);\n            Ember.set(profileImage, 'value.fieldPath', 'uploads.images');\n        }\n    },\n\n    getGroupsByType: function (type) {\n        const field = this.get('fieldConfig').getFieldByKey(type);\n        if (!field) {\n            return DS.PromiseArray.create({\n                promise: Ember.RSVP.resolve([])\n            });\n        }\n\n        var membershipIds;\n        var memberships = this.getFieldValue(type);\n        var promise;\n\n        if (!_.isEmpty(memberships) && memberships[0].value && memberships[0].value.length) {\n            membershipIds = memberships.mapBy('value').filter(id => {\n                if (this.store.hasRecordForId('group', id)) {\n                    return !this.store.recordForId('group', id).get('isDeleted');\n                }\n                return true;\n            });\n\n            promise = this.store.findMany('group', membershipIds, BASE_GROUP).then(groups => {\n                if (!groups) {\n                    return [];\n                }\n\n                return groups.rejectBy('state', 'deleted');\n            });\n        } else {\n            promise = Ember.RSVP.resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    getFieldPathForFieldValue: function (fieldValue, type) {\n        if (type === 'sms' || type === 'voice') {\n            type = 'phone';\n        }\n\n        var fieldPaths = this.fieldConfig.getFieldListByType(type).mapBy('fieldPath');\n\n        return _.find(fieldPaths, path => {\n            var value = this.getFieldValue(path);\n            if (Array.isArray(value)) {\n                var found = _.find(value, function (actual) {\n                    if (fieldValue.value && fieldValue.value.fieldId) {\n                        return actual._id === fieldValue.value.fieldId;\n                    }\n                    return actual._id === fieldValue._id;\n                });\n\n                return !_.isEmpty(found);\n            } else {\n                if (fieldValue.value && fieldValue.value.fieldId) {\n                    return value._id === fieldValue.value.fieldId;\n                }\n                return value._id === fieldValue._id;\n            }\n        });\n    },\n\n    getContactFieldValuesByType: function (type) {\n        var fieldType = type;\n        var collection = [];\n\n        if (type === 'sms' || type === 'voice') {\n            fieldType = 'phone';\n        }\n\n        var fields = this.fieldConfig.getFieldListByType(fieldType);\n\n        var values = _.map(fields, field => {\n            var path = field.getFieldPath();\n            var value = this.getFieldValue(path);\n\n            if (!Array.isArray(value)) {\n                value = [value];\n            }\n\n            var filteredEntries = _.filter(value, function (value) {\n                if (type === 'email') {\n                    return Ember.get(value, 'value.length') > 0;\n                }\n                return Ember.get(value, 'value.number.length') > 0 || Ember.get(value, 'value.extension.length') > 0;\n            });\n\n            if (type === 'sms') {\n                filteredEntries = filteredEntries.filterBy('value.acceptsSMS');\n            }\n\n            return filteredEntries;\n        });\n\n        _.forEach(values, function (value) {\n            if (Array.isArray(value)) {\n                collection = collection.concat(value);\n            } else if (value && typeof value === 'object') {\n                collection.push(value);\n            }\n        });\n\n        return collection;\n    },\n\n    getPermissableSections: function (permissions) {\n        var sections = _.map(permissions, function (fieldPath) {\n            return fieldPath.split('.')[0];\n        });\n\n        return _.uniq(sections);\n    },\n\n    getReadableSections: function () {\n        var permissions = this.get('_readWritePermissions.read');\n        return this.getPermissableSections(permissions);\n    },\n\n    getWriteableSections: function () {\n        var permissions = this.get('_readWritePermissions.write');\n        return this.getPermissableSections(permissions);\n    },\n\n    getReadableFieldsForSection: function (section) {\n        var permissions = this.get('_readWritePermissions.read');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(section.key) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    getWriteableFieldsForSection: function (sectionKey) {\n        var permissions = this.get('_readWritePermissions.write');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(sectionKey) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    setPrimaryContact(type, entry, fieldPath = null, fieldData = null) {\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        let primary = this.getFieldValue(path, true);\n        if (!fieldPath) {\n            fieldPath = this.getFieldPathForFieldValue(entry, type);\n        }\n\n        if (Array.isArray(primary)) {\n            primary = primary[0];\n        }\n\n        let fieldId = entry._id || entry.tempId;\n        if (fieldData) {\n            fieldId = fieldData.get('value._id') || fieldId;\n        }\n\n        Ember.set(primary, '_id', null);\n        Ember.set(primary, 'ref', entry.value);\n        Ember.set(primary, 'value', {\n            fieldId,\n            fieldPath: fieldPath\n        });\n\n        delete primary._id;\n        delete primary.rel;\n\n        Ember.set(this, path, [primary], { overwrite: true });\n    },\n\n    integrationContactInfo(key) {\n        let phones = this.get('contactInfo.phone_other');\n        if (phones && phones.length > 0) {\n            return phones.find(phone => {\n                return phone && phone.value && phone.value.integration === key;\n            });\n        }\n        return null;\n    }\n});\n\nPersonModel.reopenClass({\n    apiEndpoint: 'v2/people'\n});\n\nexport default PersonModel;\n","define(\"connections-ui/models/presence\", [\"exports\", \"ember-purecloud-components/models/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\n\nconst { attr } = DS;\n\nconst { inject, computed } = Ember;\n\nexport default DS.Model.extend({\n    name: attr(),\n    chat: attr(),\n    department: attr(),\n    email: attr(),\n    primaryContactInfo: attr(),\n    addresses: attr(),\n    state: attr(),\n    title: attr(),\n    username: attr(),\n    images: attr(),\n    version: attr(),\n    station: attr(),\n    authorization: attr(),\n    fieldConfigs: attr(),\n    selfUri: attr(),\n    outOfOffice: attr(),\n    presence: attr(),\n    token: attr(),\n    organization: attr(),\n    type: 'public-api-user',\n\n    intl: inject.service(),\n    session: inject.service(),\n\n    isSuper: false, // set by session service\n    isTrustee: false, // set by session service\n\n    person: computed.reads('session.person'),\n\n    isCloned: computed.bool('token.clonedUser'),\n\n    profile: DS.belongsTo('person', { async: true }),\n\n    // Legacy properties\n    // Here for computed parity with connect-api user\n    // Deprecated. To be phased out soon.\n    userType: computed('isSuper', 'isTrustee', 'isAdmin', function () {\n        if (this.get('isSuper')) {\n            return 'super';\n        } else if (this.get('isTrustee')) {\n            return 'trustee';\n        } else if (this.get('isAdmin')) {\n            return 'admin';\n        } else {\n            return 'employee';\n        }\n    }),\n\n    isAdmin: computed('authorization.roles.@each.name', 'isSuper', function () {\n        if (this.get('isSuper')) {\n            return true;\n        }\n\n        const roles = this.get('authorization.roles') || [];\n        const names = roles.mapBy('name');\n        return _.includes(names, 'admin');\n    }),\n\n    userState: computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n","import DS from 'ember-data';\n\nvar QueueModel = DS.Model.extend({\n    name: DS.attr(),\n    type: DS.attr(),\n    memberCount: DS.attr('number'),\n    outboundMessagingAddresses: DS.attr(),\n    outboundEmailAddress: DS.attr(),\n    directRouting: DS.attr(),\n    cannedResponseLibraries: DS.attr({ defaultValue: { mode: 'All' } })\n});\n\nexport default QueueModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { inject, computed, RSVP, run } = Ember;\n\n// CM-4671 : max retry count and retry timeout values for loading user audio recording in inbox\nconst maxNumFetchAudioRetry = 10,\n    retryAfterMs = 6000;\n\nlet recordingRetryCountMap = new Map(); // CM-4671 : map to store retry count of each user recording api call\n\nexport default DS.Model.extend({\n    ajaxService: inject.service('ajax'),\n\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    dateModified: DS.attr(),\n    contentUri: DS.attr(),\n    workspace: DS.attr(),\n    createdBy: DS.attr(),\n    conversation: DS.belongsTo('conversation'),\n    contentLength: DS.attr(),\n    durationMilliseconds: DS.attr(),\n    thumbnails: DS.attr(),\n    read: DS.attr(),\n    selfUri: DS.attr(),\n    session: inject.service('session'), // CM-5713: to get the value of userRecordingDownload feature toggle\n\n    date: computed('dateCreated', function () {\n        return this.get('dateCreated');\n    }),\n\n    // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n    userRecordingDownload: computed.readOnly('session.features.userRecordingDownload'),\n\n    mediaUri: computed.or('media.contentLocationUri', 'media.resultUri'), // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n\n    otherParty: computed('conversation', function () {\n        const model = this.get('conversation');\n        return model.get('otherPartyModel');\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(function (response) {\n            // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n            let callRecordingUri = response.contentLocationUri || response.resultUri;\n            return callRecordingUri;\n        });\n    }),\n\n    fetchAudio: function (formatId, reload = false) {\n        let resolver, pollingTimeout;\n        const media = this.get('media');\n        if (media) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            const adapter = this.store.adapterFor('recorded-call');\n            const apiName = this.get('userRecordingDownload') ? '/transcoding' : '/media'; // CM-5713: to get the FT value for userDownload so that will toggle between new transcoding api and old media api for user recordings download\n            const endpoint = adapter.buildURL('recordedCall', this.get('id') + apiName);\n            // CM-4671: User Recording Inbox UI: Use async flow to download long-duration user recordings\n            resolver = (resolve, reject) => {\n                this.get('ajaxService')\n                    .raw(endpoint, {\n                        data: { formatId, async: true },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        res => {\n                            let status = res.jqXHR.status,\n                                userRecRetryCountKey = 'userrec_' + this.get('id') + '_retrycount', // map variable to check indivitual user recording api retry count\n                                userRecRetryCurrent = recordingRetryCountMap.get(userRecRetryCountKey) || 0,\n                                response = res.response;\n                            if (status === 200) {\n                                let recordingUri = response.resultUri || response.contentLocationUri; // CM-5713: to set the uri location as audio source. ( resultUri - response param from transcoding api , contentLocationUri - response param from deprecated media api)\n                                recordingRetryCountMap.delete(userRecRetryCountKey); // remove the map variable when the api returns 200 status\n                                this.set('media', response);\n                                this.set('audioSource', recordingUri); // to update the source of the audio player\n                                return run(null, resolve, response); // resolving the promise immediately after 200 response\n                            } else if (++userRecRetryCurrent < maxNumFetchAudioRetry && status === 202) {\n                                recordingRetryCountMap.set(userRecRetryCountKey, userRecRetryCurrent);\n                                pollingTimeout = setTimeout(() => {\n                                    return this.fetchAudio(formatId, reload);\n                                }, retryAfterMs); // retry after 6 secs to fetch audio call until the api request returns 200 status\n                            } else if (userRecRetryCurrent >= maxNumFetchAudioRetry && status === 202) {\n                                // stop the retry fetch audio call once it reaches the max retry count of 10\n                                if (pollingTimeout) clearTimeout(pollingTimeout);\n                                if (userRecRetryCountKey) recordingRetryCountMap.delete(userRecRetryCountKey);\n                                this.set('audioSource', ''); // setting the audiosource to empty to show the error in audio player when the maximum retry count is done and still receive the 202 resource\n                                return RSVP.reject(new Error('Failed to load user recording'));\n                            }\n                        },\n                        reason => {\n                            this.set('media', {\n                                failed: 'Failed to load user recording'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new RSVP.Promise(resolver);\n    }\n}).reopenClass({\n    apiEndpoint: 'v2/userrecordings'\n});\n","define(\"connections-ui/models/recording\", [\"exports\", \"ember-purecloud-components/models/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction singularize(type) {\n    type = type.replace('resource_', '');\n    type = type.replace(/s$/, '');\n    return type;\n}\n\nexport default DS.Model.extend({\n    title: DS.attr(),\n    link: DS.attr(),\n    excerpt: DS.attr(),\n    _type: DS.attr(),\n\n    type: Ember.computed('_type', function () {\n        const type = this.get('_type');\n        return singularize(type);\n    })\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nvar ResponseModel = DS.Model.extend({\n    name: DS.attr(),\n    texts: DS.attr(),\n    dateCreated: DS.attr(),\n    version: DS.attr(),\n    libraries: DS.attr(),\n    substitutions: DS.attr(),\n    responseType: DS.attr(),\n    messagingTemplate: DS.attr(),\n    isOpen: DS.attr(),\n    libraryName: Ember.computed('libraries', function () {\n        var libraries = this.get('libraries');\n\n        return libraries && libraries.length ? libraries[0].name : '';\n    }),\n    isWhatsAppResponse: Ember.computed('responseType', 'messagingTemplate', function () {\n        return this.get('responseType') === 'MessagingTemplate' && !!this.get('messagingTemplate.whatsApp');\n    }),\n    language: Ember.computed.reads('messagingTemplate.whatsApp.language')\n});\n\nexport default ResponseModel;\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nexport default DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    name: DS.attr('string'),\n    description: DS.attr('string'),\n    permissions: DS.attr(),\n    permissionPolicies: DS.attr(),\n    userCount: DS.attr('number'),\n    default: DS.attr('boolean'),\n    base: DS.attr('boolean'),\n    type: Ember.computed('default', function () {\n        return this.get('default')\n            ? this.get('intl').lookup('groups.roles.default')\n            : this.get('intl').lookup('groups.roles.custom');\n    })\n});\n","define(\"connections-ui/models/screenshare-communication\", [\"exports\", \"ember-purecloud-components/models/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/models/social-communication\", [\"exports\", \"ember-purecloud-components/models/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport moment from 'moment';\nimport _ from 'lodash';\nimport { markdownToHtml } from '../utils/markdown';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\n\nexport default Ember.Object.extend(ChatMessageMedia, ChatMessageMixin, {\n    //must support default streaming service attributes, but most of these must be overridden to allow\n    //split message functionality, these will be the static streaming service attributes\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    // End of required chat message attrs\n\n    //beginning of split message attributes\n    messageArray: null,\n    splitMessageId: null,\n    splitMessage: true,\n    totalMessages: null,\n    //end of split message attributes\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n    //split messages cannot be edited due to the nature of them, so these are all static\n    isEditable: false,\n    isEditing: false,\n    canEdit: false,\n\n    widgetType: 'default',\n\n    init() {\n        this._super(...arguments);\n        this.set('time', moment(this.get('time')));\n        this.set('messageArray', Ember.A([]));\n    },\n\n    //required streaming service attributes, these are put back together from the individual models.\n    raw: Ember.computed('messageArray.@each.raw', function () {\n        return this.get('messageArray')\n            .map(message => message.get('raw'))\n            .join('');\n    }),\n\n    links: Ember.computed('messageArray.@each.links', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('links'))\n            .flatten()\n            .value();\n    }),\n\n    files: Ember.computed('messageArray.@each.files', function () {\n        return _.chain(this.get('messageArray'))\n            .map(message => message.get('files'))\n            .flatten()\n            .filter()\n            .value();\n    }),\n\n    mentions: Ember.computed('raw', function () {\n        let match;\n        let mentions = [];\n        const mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        const raw = this.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            let mention = match[0];\n            let oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        return mentions;\n    }),\n\n    hasMentionLinks: Ember.computed.gt('mentions.length', 0),\n\n    //unfortunately we have to remarkdown the message since these were all individual parts of a message\n    messageBody: Ember.computed('raw', function () {\n        return markdownToHtml(this.get('raw'));\n    }),\n\n    editableEndTime: Ember.computed('time', function () {\n        return moment(this.get('time'));\n    }),\n\n    failedMessages: Ember.computed('messageArray.@each.{sendError}', function () {\n        return _.chain(this.get('messageArray'))\n            .filter(message => message.get('sendError'))\n            .value();\n    }),\n\n    sendError: Ember.computed.gt('failedMessages.length', 0),\n\n    pending: Ember.computed('history', 'messageArray.@each.pending', 'totalMessages', function () {\n        if (this.get('history')) {\n            return false;\n        } else {\n            return this.get('messageArray.length') < this.get('totalMessages');\n        }\n    }),\n\n    addSplitMessage(message) {\n        const messages = this.get('messageArray');\n\n        messages.pushObject(message);\n        messages.sort((a, b) => (a.get('splitMessageIndex') < b.get('splitMessageIndex') ? -1 : 1));\n\n        this.notifyPropertyChange('messageArray');\n    }\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nconst { computed } = Ember;\n\nconst StationModel = DS.Model.extend({\n    intl: Ember.inject.service(),\n\n    userId: DS.attr(),\n    stationId: DS.attr(),\n    name: DS.attr(),\n    status: DS.attr(),\n    type: DS.attr(),\n    webrtcMediaDscp: DS.attr(),\n    webrtcForceTurn: DS.attr(),\n    persistentConnection: DS.attr(),\n    webRtcUserId: DS.attr(),\n    webRtcCallAppearances: DS.attr(),\n    webRtcRequireMediaHelper: DS.attr(),\n\n    state: computed('status', function () {\n        return this.get('intl').lookup(`purecloud.station.status.${this.get('status').toLowerCase()}`);\n    }),\n\n    available: computed('status', function () {\n        return this.get('status').toLowerCase() === 'available';\n    }),\n\n    isWebrtc: computed('type', 'name', function () {\n        return this.get('type') === 'inin_webrtc_softphone';\n    }),\n\n    isRemoteStation: computed.equal('type', 'inin_remote')\n});\n\nStationModel.reopenClass({\n    apiEndpoint: 'v2/stations'\n});\n\nexport default StationModel;\n","import { hasKey, includes } from 'connections-ui/utils/types';\n\nconst GeneralUnrecoverableAppFailureTypes = [\n    'invalidEnv',\n    'timeMachineFailure',\n    'missingAuthenticator',\n    'generalAuthenticationFailure',\n    'sessionInvalidationFailure',\n    'profileFetchServerFailure'\n] as const;\n\nexport type GeneralUnrecoverableAppFailure = {\n    type: (typeof GeneralUnrecoverableAppFailureTypes)[number];\n};\n\nconst SessionBootstrapSteps = [\n    'getTokenFailure',\n    'loadFeatureToggles',\n    'setupTheme',\n    'setupUserAndTrustee',\n    'establishDirectorySession',\n    'initServerTranslations',\n    'loadPresences',\n    'loadUserDetails',\n    'loadUserFavorites',\n    'setupCarrierPigeon',\n    'initAppSession',\n    'loadOrgPermissions',\n    'loadOrgTranscriptSettings',\n    'loadPerson'\n] as const;\n\nexport type SessionBootstrapFailure = {\n    type: 'sessionBootstrapError';\n    status?: number;\n    failedStep: (typeof SessionBootstrapSteps)[number];\n};\n\nexport function isGeneralUnrecoverableAppFailure(toCheck: unknown): toCheck is GeneralUnrecoverableAppFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n        return false;\n    }\n\n    return includes(GeneralUnrecoverableAppFailureTypes, toCheck.type);\n}\n\nexport function isSessionBootstrapFailure(toCheck: unknown): toCheck is SessionBootstrapFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || toCheck.type !== 'sessionBootstrapError') {\n        return false;\n    }\n\n    if (hasKey(toCheck, 'status') && !['undefined', 'number'].includes(typeof toCheck.status)) {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'failedStep') || typeof toCheck.failedStep !== 'string') {\n        return false;\n    }\n\n    return includes(SessionBootstrapSteps, toCheck.failedStep);\n}\n\nexport function isUnrecoverableAppFailure(toCheck: unknown): toCheck is UnrecoverableAppFailure {\n    return isGeneralUnrecoverableAppFailure(toCheck) || isSessionBootstrapFailure(toCheck);\n}\n\ntype UnrecoverableAppFailure = GeneralUnrecoverableAppFailure | SessionBootstrapFailure;\n\nexport default UnrecoverableAppFailure;\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport moment from '../utils/dates';\n\nvar UserModel = DS.Model.extend({\n    _id: DS.attr(),\n    lang: DS.attr(),\n    personId: DS.attr(),\n    personGuid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr(),\n    mt: DS.attr(),\n    email: DS.attr(),\n    welcomeSent: DS.attr(),\n    lastLogin: DS.attr(),\n    clientVersions: DS.attr(),\n    userType: DS.attr(),\n    passwordSaved: DS.attr(),\n    orgId: DS.attr(),\n\n    intl: Ember.inject.service(),\n\n    person: Ember.computed('personGuid', function () {\n        return this.store.find('person', this.get('personGuid'));\n    }),\n\n    isAdmin: Ember.computed('userType', function () {\n        return this.get('userType') === 'admin';\n    }),\n\n    isSuper: Ember.computed('userType', function () {\n        return this.get('userType') === 'super';\n    }),\n\n    userState: Ember.computed('state', function () {\n        return this.get('intl')\n            .lookup(`item.state.${this.get('state')}`)\n            .toString();\n    }),\n\n    inviteLastSent: Ember.computed('welcomeSent', function () {\n        var date = moment(new Date(this.get('welcomeSent') * 1000));\n        return date.format('L');\n    })\n});\n\nUserModel.reopenClass({\n    apiEndpoint: 'v2/users'\n});\n\nexport default UserModel;\n","define(\"connections-ui/models/video-communication\", [\"exports\", \"ember-purecloud-components/models/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\n\nconst { computed } = Ember;\n\nvar VoicemailMessageModel = DS.Model.extend({\n    conversation: DS.attr(),\n    read: DS.attr(),\n    audioRecordingDurationSeconds: DS.attr(),\n    audioRecordingSizeBytes: DS.attr(),\n    createdDate: DS.attr(),\n    modifiedDate: DS.attr(),\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    callerUser: DS.attr(),\n    name: DS.attr(),\n    selfUri: DS.attr(),\n    parentIds: DS.attr(),\n    group: DS.attr(),\n    note: DS.attr(),\n    copiedTo: DS.attr(),\n    copiedFrom: DS.attr(),\n    otherParties: DS.attr(),\n    displayName: DS.attr(),\n    dnis: DS.attr(),\n\n    ajax: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    useVoicemailApp: true,\n\n    init() {\n        this._super(...arguments);\n        // we will call this method in inbox service when loading voicemails when this feature toggle is enabled.\n        // no need to call here while toggle is enabled.\n        if (!this.get('useVoicemailApp')) {\n            this.loadParticipants();\n        }\n    },\n\n    type: 'voicemail',\n\n    date: computed('createdDate', function () {\n        return this.get('createdDate');\n    }),\n\n    mediaUri: computed('media.mediaFileUri', function () {\n        return this.get('media.mediaFileUri');\n    }),\n\n    caller: computed('callerAddress', 'callerName', function () {\n        return this.get('callerName') || this.get('callerAddress') || 'Not Available';\n    }),\n\n    dateFromNow: computed('createdDate', function () {\n        var createdDate = this.get('createdDate');\n        if (createdDate) {\n            return moment(createdDate).fromNow();\n        }\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(({ mediaFileUri }) => mediaFileUri);\n    }),\n\n    isGroupVoicemail: computed('group.{id,name}', function () {\n        const group = this.get('group');\n        return !_.isEmpty(group) && group.id && group.name;\n    }),\n\n    groupEntity: computed('group.entity', function () {\n        const id = this.get('group.id');\n        return this.get('store').findRecord('group', id, { reload: false, backgroundReload: false });\n    }),\n\n    loadParticipants: function () {\n        if (this.get('callerUser') || this.get('isGroupVoicemail')) {\n            return;\n        }\n        const conversationId = this.get('conversation.id');\n        if (this.get('conversation')) {\n            return this.loadEPCConversation(conversationId);\n        }\n    },\n\n    loadEPCConversation: async function (conversationId) {\n        let conversation;\n        try {\n            conversation = await this.store.findRecord('conversation', conversationId);\n        } catch (err) {\n            Ember.Logger.warn('Failed to load conversation for voicemail', { err });\n            return;\n        }\n\n        const participants = conversation.get('participants');\n        const userId = this.get('session.person.guid');\n        const participant = participants.find(participant => {\n            return participant.get('userId') !== userId;\n        });\n\n        if (participant) {\n            const userId = participant.get('userId');\n            if (userId) {\n                this.set('callerUser', { id: userId });\n            }\n\n            let callerName = participant.get('name');\n            if (!callerName) {\n                callerName = await this.fetchCallerName(userId);\n            }\n\n            this.set('callerName', callerName);\n        }\n\n        this.set('participants', participants);\n    },\n\n    fetchCallerName: function (userId) {\n        return this.store\n            .findRecord('public-api-user', userId)\n            .then(user => user.get('name'))\n            .catch(err => {\n                Ember.Logger.warn('Failed to fetch person name for voicemail', { err });\n                return '';\n            });\n    },\n\n    fetchAudio: function (formatId, forceReload) {\n        forceReload = forceReload || false;\n\n        var resolver;\n        var media = this.get('media');\n        if (media && !forceReload) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            var adapter = this.store.adapterFor('voicemail-message');\n            var endpoint = adapter.buildURL('voicemailMessage', this.get('id') + '/media');\n\n            resolver = (resolve, reject) => {\n                this.get('ajax')\n                    .ajaxGet(endpoint, {\n                        data: { formatId },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        data => {\n                            this.set('media', data);\n\n                            Ember.run(null, resolve, data);\n                        },\n                        reason => {\n                            // var msg = Ember.get(reason, 'responseJSON.message');\n                            this.set('media', {\n                                failed: 'Failed to load voicemail message'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new Ember.RSVP.Promise(resolver);\n    }\n});\n\nVoicemailMessageModel.reopenClass({\n    apiEndpoint: 'v2/voicemail/messages'\n});\n\nexport default VoicemailMessageModel;\n\n/*\nVoicemailMessage {\nconversation (UserCall, optional),\nread (boolean, optional),\naudioRecordingDurationSeconds (integer, optional),\naudioRecordingSizeBytes (integer, optional),\ncreatedDate (string, optional),\nmodifiedDate (string, optional),\ncallerAddress (string, optional),\ncallerName (string, optional),\ncallerUser (User, optional),\nname (string, optional),\nid (string, optional),\nselfUri (URI, optional),\nparentIds (array[Object], optional)\n}\n*/\n\n/*\n    this is separate endpiont from the message list????\n\nVoicemailMediaInfo {\nmediaFileUri (URI, optional),\nmediaImageUri (URI, optional),\nname (string, optional),\nselfUri (URI, optional),\nid (string, optional),\nparentIds (array[Object], optional)\n}\n*/\n","import Ember from 'ember';\n\nexport default Ember.Object.extend({\n    id: null,\n    mutableGroupId: null,\n    timestamp: null,\n    type: null,\n    shiftTrade: null,\n    alternativeShift: null,\n    timeOffRequest: null,\n    markedAsRead: null,\n    agentNotification: null,\n    otherNotificationIdsInGroup: null,\n    adherenceExplanation: null\n});\n","export default Ember.HTMLBars.template({\"id\":\"r9Qzlnt4\",\"block\":\"{\\\"statements\\\":[[1,[26,[\\\"outlet\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/phone/template.hbs\"}});","import Resolver from 'ember-resolver';\nexport default Resolver;\n","import Ember from 'ember';\nimport config from './config/environment';\n\nexport const NOOP_TRANSITION = 'NOOP_TRANSITION';\n\nconst Router = Ember.Router.extend({\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n    location: config.locationType,\n    rootURL: config.rootURL,\n\n    titleDivider: '-',\n\n    transitionTo: function () {\n        const transition = this._super(...arguments);\n        if (transition && transition.then && typeof transition.then === 'function') {\n            transition.then(() => {\n                if (transition.isActive && !transition.isAborted) {\n                    this.trigger(NOOP_TRANSITION);\n                }\n            });\n        }\n        return transition;\n    }\n});\n\nRouter.map(function () {\n    this.route('maintenance');\n    this.route('no-access');\n    this.route('login');\n    this.route('login-oauth');\n\n    this.route('search');\n\n    this.route('person', { resetNamespace: true }, function () {\n        this.route('list');\n\n        this.route('detail', { path: ':person_id' }, function () {\n            this.route('edit');\n        });\n\n        this.route('new-detail', { path: 'new/:person_id' });\n    });\n\n    this.route('card', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':person_id' });\n        this.route('tree', { path: 'tree/:person_id' });\n    });\n\n    // to do, the link-tos to this route need to be replaced and proxied to\n    // a nav event in the parent frame\n    this.route('group', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':group_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('time-machine', { path: 'timemachine/*buildTag' });\n\n    this.route('skillgroup', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':skillgroup_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('engage.recording-management-redirect', {\n        path: 'admin/quality/recordings/screensessions',\n        resetNamespace: true\n    });\n});\n\nexport default Router;\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    beforeModel(transition) {\n        this._super(...arguments);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        const url = transition.intent.url;\n\n        if (url && url.indexOf('/admin/interactions') === 0) {\n            this.replaceWith('/analytics/interactions');\n        }\n    },\n\n    actions: {\n        didTransition() {},\n        gotoRoute(route) {\n            this.transitionTo(route);\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';\n\n// Use the uprotectedroutemixin to skip the custom, protected, default Ember.Route\nexport default Ember.Route.extend(UnprotectedRouteMixin, ApplicationRouteMixin, {\n    mediaProviders: Ember.inject.service(),\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    purecloudOauth: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        this.get('session').on('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        this.get('session').off('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    actions: {\n        willTransition(transition) {\n            this.applicationService.postMessageRouteChange(transition); // broadcast route change to parent if iframed\n\n            if (this.get('applicationService.errorState')) {\n                this.transitionTo('maintenance');\n                return;\n            }\n        },\n\n        transitionToRoute(route, id) {\n            if (id) {\n                this.transitionTo(route, id);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        transitionToEntityDetail(entity) {\n            var route = entity.get('type') + '.detail';\n            this.transitionTo(route, entity.get('id'));\n        },\n\n        logout() {\n            var session = this.get('session');\n            session.logout();\n        },\n\n        linkTo(route, param) {\n            if (param) {\n                this.transitionTo(route, param);\n            } else {\n                this.transitionTo(route);\n            }\n        },\n\n        error(error, transition) {\n            Ember.Logger.error('Error transitioning route: ', {\n                error,\n                remoteData: { routeName: transition.targetName }\n            });\n            Ember.onerror(error);\n            return true;\n        },\n\n        performRecentSearch(recent, filter) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            this.transitionTo('search', {\n                queryParams: {\n                    query: recent.query,\n                    entity: filter,\n                    saveHistory: false\n                }\n            });\n        },\n\n        performSearch(query, filter, queryFacets) {\n            var search = this.controllerFor('search');\n            var entity = search.get('entity');\n\n            if (!filter) {\n                filter = entity;\n            }\n\n            if (!queryFacets) {\n                queryFacets = '';\n            }\n\n            this.transitionTo(`/search-v2?entity=person&query=${query}`);\n            return;\n        },\n\n        togglePanel() {},\n        openPanel() {},\n        closePanel() {},\n        openPreferencesModal() {},\n        toggleCommunicationSidebarExpanded() {},\n        ensureRouteVisibility() {},\n\n        async openChatRoom(entity) {\n            let jid = '';\n\n            // Callers should pass an entity; but we still tolerate an accidental jid string.\n            if (typeof entity === 'string') {\n                Ember.Logger.warn('openChatRoom expected an entity, got a jid string', { jid: entity });\n                jid = entity;\n            } else if (entity && entity.get && typeof entity.get === 'function') {\n                jid = entity.get('jid');\n\n                // Search/list groups can omit chat jid until the full record is loaded.\n                if (!jid && entity.get('type') === 'group') {\n                    // Force a new fetch if that's the case; Search may have cached this group without a jid\n                    const id = entity.get('id') || entity.get('guid');\n                    if (id) {\n                        try {\n                            const group = await this.store.findRecord('group', id, { reload: true });\n                            jid = group.get('jid');\n                        } catch (err) {\n                            Ember.Logger.error('Failed to load group jid for chat', err);\n                        }\n                    } else {\n                        Ember.Logger.warn('Cannot open group chat: group has no jid, id, or guid');\n                    }\n                }\n            }\n\n            if (jid) this.get('embedded').startChatByJid(jid);\n        },\n\n        async openChatRoomWithVideo(id, useMediaProviders = false) {\n            if (!useMediaProviders) {\n                this.get('embedded').launchVideoWithPersonById(id);\n            }\n        },\n\n        startCallPersonById(id) {\n            this.get('embedded').startCallPersonById(id);\n        },\n\n        startCallByNumber(phoneNumber) {\n            this.get('embedded').startCallByNumber(phoneNumber);\n        },\n\n        loading(transition, originRoute) {\n            if (\n                originRoute.routeName === 'application' &&\n                !this.get('session.isAuthenticated') &&\n                !this.get('purecloudOauth.inLogoutBounce')\n            ) {\n                // Show the application-loading route on session restore; otherwise,\n                // it's not worth the flash before redirecting or showing the login route\n                return true;\n            }\n        }\n    },\n\n    // Ember Simple Auth Impls\n    sessionAuthenticated() {\n        let stateRestore = this.get('purecloudOauth').popRestoreState();\n        if (stateRestore) {\n            window.location = stateRestore.url;\n            return;\n        }\n        this._super();\n    },\n\n    sessionInvalidated() {\n        // Record the logout time to handle the logout bounce\n        this.get('purecloudOauth').recordLogoutTime();\n        this.set('application.errorState', { type: 'missingAuthenticator' });\n        this.transitionTo('maintenance');\n    },\n\n    onSessionInvalidationFailure() {\n        this.set('application.errorState', { type: 'sessionInvalidationFailure' });\n        this.transitionTo('maintenance');\n    },\n\n    beforeModel(transition) {\n        if (this.get('applicationService.errorState')) {\n            this.transitionTo('maintenance');\n            return;\n        }\n\n        if (Ember.get(transition, 'queryParams.mobile')) {\n            this.get('application').set('mobileQueryParameter', true);\n        }\n\n        return this._super(transition);\n    }\n});\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar CardDetailRoute = Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model: function (params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.cardView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel: function (model) {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n\n        var promises = [model.get('directReports'), model.get('manager'), model.get('managerSiblings')];\n        return Ember.RSVP.all(promises);\n    }\n});\n\nexport default CardDetailRoute;\n","import Ember from 'ember';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    store: Ember.inject.service(),\n\n    routeTitle: '',\n\n    getUserId(transition) {\n        const id = transition.params['card.tree'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('card.tree', res[0].get('id'));\n                }\n            })\n            .catch(() => this.transitionTo('person.detail', this.get('session.person.id')));\n    },\n\n    beforeModel(transition) {\n        this.getUserId(transition).then(id => {\n            const newHash = `#/card-v2/tree/${id}`;\n            if (newHash !== window.top.location.hash) {\n                this.get('embedded').sendNavigationEvent({\n                    hash: newHash\n                });\n            }\n        });\n    },\n\n    model(params) {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.treeView').toString());\n        return this.store.find('person', params.person_id);\n    },\n\n    afterModel() {\n        this.get('embedded').sendPageData({\n            helpPath: 'card.detail',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/contacts');\n    }\n});\n","import Ember from 'ember';\nimport { inject as service } from '@ember/service';\n\nexport default Ember.Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/external-orgs');\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport ModelRouteMixin from '../../mixins/model-route';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nvar GroupDetailRoute = Ember.Route.extend(ModelRouteMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Group Profile',\n\n    canEditRoles: Ember.computed('session.namedPermissions', function () {\n        let namedPermissions = this.get('session.namedPermissions') || [];\n        let hasRolesView = _.includes(namedPermissions, 'authorization:role:view');\n        let hasGrantsEdit = _.includes(namedPermissions, 'authorization:grant:add');\n        return hasRolesView && hasGrantsEdit;\n    }),\n\n    updateParentRoute(groupId) {\n        if (this.get('application.adminUIContext')) {\n            return;\n        }\n        const newHash = `#/group-v2/${groupId}`;\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let controller = this.controllerFor('group.detail');\n            if (controller.get('isEditing')) {\n                let msg = this.get('intl').lookup('notification.group.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n            }\n\n            controller.set('isEditing', false);\n\n            return true;\n        }\n    },\n\n    model: function (params, transition) {\n        const id = params.group_id;\n\n        let currentModel = this.store.peekRecord('group', id);\n        if (currentModel && currentModel.get('isDeleted')) {\n            transition.abort();\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n            return;\n        }\n\n        this.updateParentRoute(id);\n\n        return this.store.findRecord('group', id, { include: 'policy' }).then(group => {\n            if (!group.get('guid') || isGuid(group.get('id'))) {\n                return group;\n            }\n            this.transitionTo('group.detail', group.get('guid'));\n        });\n    },\n\n    afterModel(group) {\n        let state = group.get('state');\n        if (state === 'deleted' || group.get('isDeleted')) {\n            const message = this.get('intl').lookup('notification.group.deletedGroup').toString();\n            this.get('notification').info(null, message, {\n                hideAfter: 8,\n                forceBrowserNotification: true\n            });\n\n            this.transitionTo('person.detail', this.get('session.person.id'));\n            return;\n        }\n\n        return group.reload().then(group => {\n            if (this.get('canEditRoles')) {\n                return group.getGrants();\n            } else {\n                return Ember.RSVP.resolve();\n            }\n        });\n    },\n\n    setupController(controller, model) {\n        this._super(controller, model);\n\n        this.set('routeTitle', model.get('name'));\n\n        let sidebar = this.get('sidebarService');\n        if (sidebar) {\n            sidebar.set('routeTitle', model.get('name'));\n        }\n\n        this.get('embedded').sendPageData({\n            helpPath: 'group.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n\nexport default GroupDetailRoute;\n","import Ember from 'ember';\n\nconst IndexRoute = Ember.Route.extend({\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        /* @see services/Session.authenticateWithSession() as this is the ember-simple-auth\n         * authenicator handler function before this route catch-all (empty) route.\n         */\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        return Ember.RSVP.resolve(result).then(() => {\n            var personId = this.get('session.person.id') || this.get('session.user.personId');\n\n            if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                return this.transitionTo('search');\n            }\n\n            if (!personId) {\n                Ember.Logger.error(\"Index Route: Standard user has no 'personId'.  Transitioning to no-access.\");\n                this.set('session.hasAppAccess', false);\n                return this.transitionTo('no-access');\n            }\n\n            return this.transitionTo('person.detail', personId);\n        });\n    }\n});\n\nexport default IndexRoute;\n","import Ember from 'ember';\nimport UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';\nimport { SESSION_BOOTSTRAP_ERROR_TYPE } from 'connections-ui/services/session';\n\nconst { Route, inject, RSVP } = Ember;\n\nvar OAuth2LoginRoute = Route.extend(UnauthenticatedRouteMixin, {\n    controllerName: 'login-oauth',\n\n    intl: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    purecloudOauth: inject.service(),\n    authenticator: null,\n\n    routeTitle: Ember.computed(function () {\n        return this.get('intl').lookup('auth.login');\n    }),\n\n    actions: {\n        mobileOfferDeclined() {\n            this.set('application.offerMobileApp', false);\n            return Ember.RSVP.resolve();\n        },\n        authenticate() {\n            return this._authenticate(this.modelFor(this.routeName));\n        }\n    },\n\n    beforeModel: function (transition) {\n        if (!this.get('authenticator')) {\n            let authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n            if (authenticator) {\n                this.set('authenticator', authenticator);\n            } else {\n                Ember.Logger.error(\"Failed to locate 'authenticator:directory' in Container.\");\n                this.set('application.errorState', { type: 'missingAuthenticator' });\n                return this.transitionTo('maintenance');\n            }\n        }\n\n        this._super(transition);\n\n        return this.get('intl').loadTranslations();\n    },\n\n    model: function () {\n        return Ember.Object.create(this.get('authenticator').extractAuthData());\n    },\n\n    afterModel: function (resolvedModel) {\n        if (resolvedModel.access_token) {\n            // Returning from Successful Login\n\n            /*\n             * Set denied so we don't get reprompted by this route or application\n             * The user is either not mobile or previously denied the app before login\n             */\n            this.set('application.offerMobileApp', false);\n\n            resolvedModel.set('offerMobileApp', this.get('application.offerMobileApp'));\n            // Resolve with the model to show loading screen and init local session\n            return RSVP.resolve(resolvedModel);\n        } else {\n            // Need authentication\n\n            resolvedModel.state = this.get('purecloudOauth').serializeRestoreState();\n\n            let offerMobileApp = this.get('application.offerMobileApp') && !this.get('purecloudOauth.inLogoutBounce');\n\n            if (offerMobileApp) {\n                // Resolve with the model to show mobile offer and then auth\n                resolvedModel.set('offerMobileApp', true);\n                return RSVP.resolve(resolvedModel);\n            } else {\n                // Return a non-resolving promise so the redirect can complete without a flash of the route\n                return new RSVP.Promise(() => {\n                    this.set('holdPromiseRef', this._authenticate(resolvedModel));\n                });\n            }\n        }\n    },\n\n    /**\n     * Invokes the OAuth authenticator.\n     *\n     * @returns An promise which will either:\n     * <ul>\n     * <li>Resolve on authenticator success.  [Note:] ESA will transition on success/failure.</li>\n     * <li>Handle the authenticator failure (auth UI, no-access, failure) and reject for callers.  Callers do not need to take any action.</li>\n     * </ul>\n     */\n    _authenticate: function (authData) {\n        return new RSVP.Promise((resolve, reject) => {\n            this.get('session')\n                .authenticate('authenticator:directory', authData)\n                .then(resolve)\n                .catch(rejectionDetails => {\n                    if (rejectionDetails && rejectionDetails.reason === 'noToken') {\n                        if (window === window.parent) {\n                            // Not in an iframe. For the standalone mode for development.\n                            reject('unauthenticated');\n                            window.location = rejectionDetails.authUrl;\n                        } else {\n                            // In an iframe, in WebDirectory?\n                            reject('failure');\n                            this.set('application.errorState', {\n                                type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                                failedStep: 'getTokenFailure'\n                            });\n                            this.transitionTo('maintenance');\n                        }\n                    } else if (rejectionDetails && rejectionDetails.reason === 'noAccess') {\n                        // Currently don't distinguish between 400s and 500s in local session.  Assuming our services are ok\n                        reject('unauthorized');\n                        this.transitionTo('no-access');\n                    } else if (rejectionDetails && rejectionDetails.reason === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                        // Bootstrap error will already have been logged\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                            failedStep: rejectionDetails.failedStep,\n                            status: rejectionDetails.status\n                        });\n                        this.transitionTo('maintenance');\n                    } else {\n                        let authFailureReason =\n                            rejectionDetails && rejectionDetails.reason ? rejectionDetails.reason : 'authFailure';\n                        Ember.Logger.error('Authentication Failed:', {\n                            rejectionDetails,\n                            remoteData: {\n                                sensitive: {\n                                    reason: authFailureReason\n                                }\n                            }\n                        });\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: 'generalAuthenticationFailure'\n                        });\n                        this.transitionTo('maintenance');\n                    }\n                });\n        });\n    }\n});\n\nexport default OAuth2LoginRoute;\n","import Ember from 'ember';\n\n// This route's sole purpose is to redirect users to the index page. It's for people who have bookmarked the login page\nvar LoginRoute = Ember.Route.extend({\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return result;\n        } else {\n            return this.transitionTo('index');\n        }\n    }\n});\n\nexport default LoginRoute;\n","import Ember from 'ember';\nimport { Promise, resolve } from 'rsvp';\nimport UnrecoverableAppFailure, { isSessionBootstrapFailure } from 'connections-ui/models/unrecoverable-app-failure';\nimport { buildCommonTelemetryContext } from 'connections-ui/services/analytics';\nimport { hasKey } from 'connections-ui/utils/types';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport { Transition } from '../utils/ember-types';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { inject, Route } = Ember;\n\nconst MaintenanceRoute = Route.extend(UnprotectedRouteMixin, {\n    intl: inject.service(),\n    session: inject.service(),\n    applicationService: inject.service('application'),\n\n    beforeModel: function (transition: Transition): any {\n        return resolve()\n            .then(() => {\n                return this._super(transition);\n            })\n            .then(() => {\n                if (hasKey(transition, 'isActive') && transition.isActive === false) {\n                    // Route canceled for auth\n                    return;\n                }\n\n                const errorState = this.get('applicationService').get('errorState');\n                if (!errorState) {\n                    return this.transitionTo('index');\n                }\n\n                if (!isSessionBootstrapFailure(errorState)) {\n                    addPageAction(\n                        'maintenanceMode',\n                        Object.assign(\n                            {\n                                failedStep: errorState.type\n                            },\n                            buildCommonTelemetryContext({\n                                applicationService: this.get('applicationService'),\n                                sessionService: this.get('session'),\n                                intlService: this.get('intl')\n                            })\n                        )\n                    );\n                }\n\n                return (this.get('intl') as any).loadTranslations();\n            });\n    },\n\n    model: function (): Promise<undefined | UnrecoverableAppFailure> {\n        return resolve()\n            .then(() => {\n                return this._super(...arguments);\n            })\n            .then(() => {\n                // We assert errorState exists in the beforeModel hook.\n                // The controller still needs to account for untyped errorState until we're fully TS\n                return this.get('applicationService').get('errorState')!;\n            });\n    },\n\n    actions: {\n        reloadApp: function () {\n            (this.get('session') as any)._reloadApplication();\n        }\n    }\n});\n\nexport default MaintenanceRoute;\n","import Ember from 'ember';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\n\nexport default Ember.Route.extend(UnprotectedRouteMixin, {\n    beforeModel() {\n        this._super(...arguments);\n        return this.get('intl').loadTranslations();\n    }\n});\n","import EngageSupervisor from 'connections-ui/routes/engage-supervisor';\n\nexport default EngageSupervisor.extend();\n","import Ember from 'ember';\n\nimport ModelRouteMixin from '../../mixins/model-route';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default Ember.Route.extend(ModelRouteMixin, LoggerMixin, {\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n\n    routeTitle: 'Person Profile',\n\n    getUserId(transition) {\n        const id = transition.params['person.detail'].person_id;\n        if (isGuid(id)) {\n            return Ember.RSVP.Promise.resolve(id);\n        }\n\n        // We've got a mongoid, so we need to translate that to something useable...\n        const orgName = this.get('session.org.shortName');\n        const jid = `${id}@${orgName}.orgspan.com`;\n\n        return this.get('store')\n            .findMany('person', [jid])\n            .then(res => {\n                if (res && res[0]) {\n                    transition.abort();\n\n                    this.replaceWith('person.detail', res[0].get('id'));\n                }\n            })\n            .catch(err => {\n                this.get('logger').error('route/person: getUserId failed', {\n                    personId: id,\n                    error: err\n                });\n                this.transitionTo('person.detail', this.get('session.person.id'));\n            });\n    },\n\n    updateParentRoute(transition, userId) {\n        if (this.get('application.adminUIContext')) {\n            return;\n        }\n        let newHash;\n        if (transition.intent && transition.intent.url) {\n            const initialIntent = `#${transition.intent.url}`;\n            newHash = initialIntent.replace(/person/, 'person-v2');\n        } else {\n            newHash = `#/person-v2/${userId}`;\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    actions: {\n        willTransition(transition) {\n            let editing = this.get('controller.editing') && this.get('controller.editingSection');\n            if (editing) {\n                let msg = this.get('intl').lookup('notification.person.navigate').toString();\n                if (!window.confirm(msg)) {\n                    transition.abort();\n                    return false;\n                }\n\n                this.set('controller.editing', false);\n                this.set('controller.editingSection', false);\n            }\n\n            return true;\n        }\n    },\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n        var id = transition.params['person.detail'].person_id;\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n            if (id === this.get('session.person.id')) {\n                // if (transition.params['person.detail'].person_id === this.get('session.person.id')) {\n                transition.abort();\n            }\n            return;\n        }\n\n        return Ember.RSVP.resolve(result)\n            .then(() => {\n                var person;\n\n                return this.getUserId(transition)\n                    .then(id => {\n                        this.updateParentRoute(transition, id);\n\n                        if (id === this.get('session.person.id')) {\n                            person = this.get('session.person');\n                        } else {\n                            person = this.store.recordForId('person', id);\n                        }\n\n                        if (\n                            person &&\n                            !person.get('isEmpty') &&\n                            !person.get('isSaving') &&\n                            !person.get('isLoading') &&\n                            !person.get('isReloading')\n                        ) {\n                            return person\n                                .reload()\n                                .then(function (p) {\n                                    p.rollbackAttributes();\n                                })\n                                .catch(err => {\n                                    this.get('logger').error(\n                                        'route/person: beforeModel failed at reload/rollback step',\n                                        {\n                                            personId: id,\n                                            error: err\n                                        }\n                                    );\n                                    return Ember.RSVP.reject();\n                                });\n                        } else {\n                            return true;\n                        }\n                    })\n                    .catch(err => {\n                        this.get('logger').error('route/person: beforeModel failed after getUserId step', {\n                            personId: id,\n                            error: err\n                        });\n                        return Ember.RSVP.reject();\n                    });\n            })\n            .catch(err => {\n                this.get('logger').error('route/person: beforeModel operation failed', {\n                    personId: id,\n                    error: err\n                });\n                return Ember.RSVP.reject();\n            });\n    },\n\n    model(params) {\n        // We have a guid by this point due to the beforeModel hook performing a transition for us\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.store\n                .findRecord('public-api-user', params.person_id, {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => {\n                    if (params.person_id === this.get('session.person.id')) {\n                        resolve({\n                            user,\n                            person: this.get('session.person')\n                        });\n                        return;\n                    }\n                    user.get('profile')\n                        .then(profile => {\n                            resolve({\n                                user,\n                                person: profile\n                            });\n                        })\n                        .catch(reject);\n                })\n                .catch(reject);\n        });\n    },\n\n    setupController(controller, model) {\n        this._super.apply(this, arguments);\n\n        if (this.get('session.person.id') !== model.person.get('id')) {\n            controller.set('editing', false);\n        } else {\n            controller.set('editing', true);\n        }\n\n        this.set('routeTitle', model.person.get('name'));\n        this.get('embedded').sendPageData({\n            helpPath: 'person.detail.index',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\n\nexport default Ember.Route.extend({\n    intl: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    routing: Ember.inject.service('-routing'),\n\n    routeTitle: '',\n\n    updateParentRoute(transition) {\n        let routing = this.get('routing');\n        let params = Object.values(transition.params).filter(param => {\n            return Object.values(param).length;\n        });\n        let url = routing.generateURL(transition.targetName, params, transition.queryParams);\n\n        const initialIntent = transition.intent.url ? `#${transition.intent.url}` : url;\n        let newHash;\n        if (initialIntent) {\n            newHash = initialIntent.replace(/search/, 'search-v2');\n        } else {\n            newHash = '#/search-v2';\n        }\n        if (newHash !== window.top.location.hash) {\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    model: function (params, transition) {\n        this.updateParentRoute(transition);\n    },\n\n    afterModel() {\n        this.set('routeTitle', this.get('intl').lookup('components.navMenu.search').toString());\n        this.get('embedded').sendPageData({\n            helpPath: 'search',\n            title: this.get('routeTitle')\n        });\n    }\n});\n","import Ember from 'ember';\nimport { POOL_STATES } from '../../models/app-pool';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport appUtils from '../../utils/apps';\n\nconst { Route, inject, get, computed } = Ember;\n\nconst STANDALONE_APP_ROUTE_LOG_NS = 'Route';\n\nexport default Route.extend(LoggerMixin, {\n    apps: inject.service(),\n    intl: inject.service(),\n\n    appsProblem: false,\n    unknownApp: false,\n    currAppName: null,\n\n    routeTitle: computed('appsProblem', 'unknownApp', 'currAppName', function () {\n        let result = null;\n\n        if (this.get('appsProblem')) {\n            result = this.get('intl').lookup('apps.loadFailedTitle').toString();\n        } else if (this.get('unknownApp')) {\n            result = this.get('intl').lookup('apps.notFoundTitle').toString();\n        } else {\n            result = this.get('currAppName') || this.get('intl').lookup('apps.title').toString();\n        }\n\n        return result;\n    }),\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        this.set('appsProblem', false);\n        this.set('unknownApp', false);\n        if (this.get('apps.appsSupported')) {\n            /*\n             * Clear currAppName so it will trigger a routeTitle update if the\n             *  user is bouncing between a single app and a non-app route.\n             */\n            this.set('currAppName', null);\n            return result;\n        } else {\n            // Apps are disabled.  go to index\n            return this.transitionTo('index');\n        }\n    },\n\n    model(params) {\n        let appPool = this.get('apps.standaloneAppPool');\n\n        return appPool\n            .showApp(params.app_id)\n            .then(poolState => {\n                let result = null;\n\n                if (poolState && poolState.name === POOL_STATES.SHOWING_APP) {\n                    this.set('currAppName', get(poolState, 'details.instance.app.name'));\n\n                    result = {\n                        instanceId: get(poolState, 'details.instance.instanceId')\n                    };\n                }\n\n                return result;\n            })\n            .catch(poolState => {\n                if (poolState && poolState.name === POOL_STATES.APP_NOT_FOUND) {\n                    this.set('unknownApp', true);\n\n                    // Possible Causes:\n                    // User using old or unauthorized link\n                    // User reloaded PureCloud on this route and the app has been deleted or he/she no longer has permission\n                    // Pool state and menu out of sync (Should not happen)\n                    this.logger.warn(\n                        appUtils.buildStandaloneAppLogMsg(\n                            'Unknown App requested in route param.',\n                            STANDALONE_APP_ROUTE_LOG_NS\n                        ),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: Ember.get(poolState, 'name')\n                            }\n                        }\n                    );\n                } else {\n                    this.set('appsProblem', true);\n\n                    this.logger.error(\n                        appUtils.buildStandaloneAppLogMsg('Failed to show App in route', STANDALONE_APP_ROUTE_LOG_NS),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: Ember.get(poolState, 'name')\n                            }\n                        }\n                    );\n                }\n\n                return null;\n            })\n            .finally(() => {\n                this.set('apps.standaloneAppPoolVisible', true);\n            });\n    },\n\n    actions: {\n        willTransition() {\n            let model = this.modelFor(this.routeName);\n\n            if (model && model.instanceId) {\n                // Determine if the pool is still showing the app for this route.\n                // The app for this route may not be shown if the app has been hidden/stopped/closed for\n                // another reason (e.g. Removed App closed by user) and we are transitioning to another route (e.g. index).\n                let initPoolState = this.get('apps.standaloneAppPool.currState');\n\n                if (\n                    initPoolState &&\n                    initPoolState.name === POOL_STATES.SHOWING_APP &&\n                    get(initPoolState, 'details.instanceId') === model.instanceId\n                ) {\n                    // Pool is showing this route's app, attempt to hide it.\n                    this.get('apps.standaloneAppPool')\n                        .hideApp(model.instanceId)\n                        .catch(rejectionPoolState => {\n                            // Ignore the failure as we still want to proceed and hide the pool\n                            // Log this as it should not happen\n                            this.logger.error(\n                                appUtils.buildStandaloneAppLogMsg(\n                                    'Failed to hide standalone app when trying to transition out of route',\n                                    STANDALONE_APP_ROUTE_LOG_NS\n                                ),\n                                {\n                                    initPoolState,\n                                    rejectionPoolState,\n                                    remoteData: {\n                                        routeAppId: model.instanceId,\n                                        initPoolState: Ember.get(initPoolState, 'name'),\n                                        rejectionPoolState: Ember.get(rejectionPoolState, 'name')\n                                    }\n                                }\n                            );\n                        });\n                }\n            }\n\n            this.set('apps.standaloneAppPoolVisible', false);\n\n            return true;\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { Route, inject, RSVP, Logger } = Ember;\n\nexport default Route.extend({\n    queryParams: {\n        targetRoute: {\n            refreshModel: true\n        }\n    },\n    application: inject.service(),\n    intl: inject.service(),\n\n    routeTitle() {\n        return this.get('intl').lookup('timemachine.title');\n    },\n\n    model(params, transition) {\n        let redirectUrl = window.location.origin || `${window.location.protocol}//${window.location.host}`;\n\n        redirectUrl += window.location.pathname;\n\n        if (redirectUrl.charAt(redirectUrl.length - 1) !== '/') {\n            redirectUrl += '/';\n        }\n\n        let hashRoute = '';\n        let targetRoute = (params.targetRoute || '').trim();\n        if (targetRoute) {\n            if (targetRoute.charAt(0) !== '/') {\n                targetRoute = '/' + targetRoute;\n            }\n            hashRoute = '#' + targetRoute;\n        }\n\n        redirectUrl += `${params.buildTag}/index.html`;\n        redirectUrl += window.location.search;\n        redirectUrl += hashRoute;\n\n        const runtime = this.get('application.runtime');\n        if (runtime.local) {\n            Logger.error('Timemachine is not available locally.  Use the Git Capacitor.');\n            transition.abort();\n            this.transitionTo('index');\n        } else if (['prod', 'fedramp'].includes(runtime.env)) {\n            return {\n                redirectUrl,\n                buildTag: params.buildTag\n            };\n        } else {\n            // Return a non-resolving promise to let the redirect complete\n            return new RSVP.Promise(() => {\n                window.location = redirectUrl;\n            });\n        }\n    },\n\n    actions: {\n        confirm() {\n            let currModel = this.modelFor(this.routeName);\n\n            if (currModel && currModel.redirectUrl) {\n                window.location = currModel.redirectUrl;\n            } else {\n                this.set('application.errorState', { type: 'timeMachineFailure' });\n                this.transitionTo('maintenance');\n            }\n        },\n\n        cancel() {\n            this.transitionTo('index');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nconst DEFAULT_PARAMS = {\n    pageNumber: 1,\n    pageSize: 25,\n    types: ['users', 'groups', 'locations'],\n    sortOrder: 'ASC',\n    expand: ['authorization']\n};\n\nexport default Mixin.create({\n    search: inject.service('search'),\n\n    performSimpleKeywordSearch(query, params) {\n        params = Object.assign({}, DEFAULT_PARAMS, params, {\n            query: [\n                {\n                    value: query,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            returnFields: this.get('search.fields')\n        });\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    performSearch(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    suggest(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.suggestEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { SEARCH_QUERY_OPERATORS, SEARCH_AGGREGATE_TYPES, SEARCH_QUERY_TYPES } from './service';\n\nimport { BASE_PERSON_FIELDS, BASE_PERSON_EXPANDS } from '../models/person';\n\nconst { computed } = Ember;\n\nexport default Ember.Object.extend({\n    service: null,\n\n    page: null,\n    limit: null,\n\n    types: null,\n    queries: null,\n    aggregations: null,\n    returnFields: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.queries = [];\n        this.aggregations = [];\n        this.types = ['users', 'groups', 'locations'];\n    },\n\n    data: computed('queries.[]', 'aggregations.[]', 'types.[]', function () {\n        const { queries, aggregations, page, limit, types, returnFields } = this.getProperties(\n            'queries',\n            'aggregations',\n            'page',\n            'limit',\n            'types',\n            'returnFields'\n        );\n\n        const data = {\n            types\n        };\n\n        if (queries.length) {\n            data.query = queries;\n        }\n\n        // You can only search on users when you have aggregations\n        if (aggregations.length) {\n            data.aggregations = aggregations;\n            data.types = ['users'];\n        }\n\n        if (typeof page === 'number') {\n            data.pageNumber = page;\n        }\n\n        if (typeof limit === 'number') {\n            data.pageSize = limit;\n        }\n\n        if (returnFields && Array.isArray(returnFields)) {\n            data.returnFields = returnFields;\n        } else {\n            if (data.types.indexOf('users') === -1) {\n                data.returnFields = ['ALL_FIELDS'];\n            } else {\n                data.returnFields = BASE_PERSON_FIELDS;\n            }\n        }\n\n        data.expand = BASE_PERSON_EXPANDS;\n\n        return data;\n    }),\n\n    addQuery(value, operator = 'AND', type = 'QUERY_STRING', fields = []) {\n        Ember.assert(\n            `Operator must be one of: ${SEARCH_QUERY_OPERATORS}`,\n            _.includes(SEARCH_QUERY_OPERATORS, operator)\n        );\n        Ember.assert(`Type must be one of: ${SEARCH_QUERY_TYPES}`, _.includes(SEARCH_QUERY_TYPES, type));\n\n        if (type === 'QUERY_STRING') {\n            Ember.assert('If query type is `QUERY_STRING`, the query value must have a length >= 2', value.length >= 2);\n        }\n\n        const query = {\n            type\n        };\n\n        if (type !== 'MATCH_ALL') {\n            query.operator = operator;\n            query.value = value;\n        }\n\n        if (!_.isEmpty(fields)) {\n            query.fields = fields;\n        }\n\n        this.queries.pushObject(query);\n\n        return this;\n    },\n\n    // Add multiple queries at once. Pass in as arrays:\n    // [value, operator, ...], [value, operator, ...]\n    addQueries() {\n        const queries = [...arguments];\n        queries.forEach(query => {\n            this.addQuery(...query);\n        });\n        return this;\n    },\n\n    addTagQuery() {\n        return this;\n    },\n\n    addAggregation(name, value, field = 'profileSkills', type = 'CONTAINS', size = 15) {\n        Ember.assert(`Type must be one of: ${SEARCH_AGGREGATE_TYPES}`, _.includes(SEARCH_AGGREGATE_TYPES, type));\n        if (type !== 'COUNT') {\n            Ember.assert(\n                'You much include a name and value when type is not `COUNT`',\n                type !== 'COUNT' || (!!name && !!value)\n            );\n        }\n\n        const aggregation = {\n            name,\n            field,\n            type,\n            size\n        };\n\n        if (value) {\n            aggregation.value = value;\n        }\n\n        this.aggregations.pushObject(aggregation);\n\n        return this;\n    },\n\n    addAggregations() {\n        const aggregations = [...arguments];\n        aggregations.forEach(aggregation => {\n            this.addAggregation(...aggregation);\n        });\n        return this;\n    },\n\n    setPaging(page, limit) {\n        this.setProperties({ page, limit });\n        return this;\n    },\n\n    setTypes(types) {\n        types = types.map(type => {\n            if (type === 'people') {\n                return 'users';\n            }\n            return type;\n        });\n        this.set('types', types);\n        return this;\n    },\n\n    setReturnFields(returnFields) {\n        if (returnFields && returnFields.length) {\n            this.set('returnFields', returnFields);\n        } else {\n            this.set('returnFields', undefined);\n        }\n        return this;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport RequestBuilder from './request-builder';\nimport { singularize } from 'ember-inflector';\n\nconst { computed, inject, RSVP, Service } = Ember;\n\nconst resourceTypes = [\n    'resource_article',\n    'resource_page',\n    'resource_faq',\n    'resource_glossary',\n    'resource_releasenote'\n];\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nexport const SEARCH_QUERY_TYPES = [\n    'EXACT',\n    'CONTAINS',\n    'STARTS_WITH',\n    'REQUIRED_FIELDS',\n    'RANGE',\n    'DATE_RANGE',\n    'LESS_THAN',\n    'LESS_THAN_EQUAL_TO',\n    'GREATER_THAN',\n    'GREATER_THAN_EQUAL_TO',\n    'SIMPLE',\n    'TERM',\n    'TERMS',\n    'QUERY_STRING',\n    'MATCH_ALL'\n];\n\nexport const SEARCH_QUERY_OPERATORS = ['AND', 'OR', 'NOT'];\n\nexport const SEARCH_AGGREGATE_TYPES = ['COUNT', 'SUM', 'AVERAGE', 'CONTAINS', 'STARTS_WITH', 'ENDS_WITH', 'TERM'];\n\nconst ALL_FIELDS = 'ALL_FIELDS';\n\nexport default Service.extend({\n    ajax: inject.service(),\n    store: inject.service(),\n    application: inject.service(),\n\n    apiEndpoint: computed.reads('_searchUrl'),\n    suggestEndpoint: computed.reads('_suggestUrl'),\n\n    _searchUrl: computed(function () {\n        return this.get('application').pcV2Uri('api/v2/search');\n    }),\n\n    _suggestUrl: computed('_searchUrl', function () {\n        return `${this.get('_searchUrl')}/suggest`;\n    }),\n\n    _docUrl: computed('_searchUrl', function () {\n        return this.get('application').pcV2Uri('api/v2/documentation/search');\n    }),\n\n    search(data) {\n        const url = this.get('_searchUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    suggest(data) {\n        const url = this.get('_suggestUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    searchDocumentation(data) {\n        const url = this.get('_docUrl');\n        return this.get('ajax').post(url, { data });\n    },\n\n    modelResults(results) {\n        // turn search results into DS models\n        const store = this.get('store');\n        const entities = results.map(result => {\n            let type = singularize(result._type);\n            if (type === 'external_contact') {\n                type = 'external-contact';\n            }\n            if (type === 'user') {\n                type = 'person';\n            }\n            if (resourceTypes.includes(type)) {\n                type = 'resource-article';\n                const normObj = store.normalize(type, result).data;\n\n                // id fails to be set on normalized object when\n                // running locally.\n                normObj.id = result.id;\n                return normObj;\n            }\n            result.id = result.id || result.guid || result._id;\n            return store.normalize(type, result).data;\n        });\n        return store.push({ data: entities });\n    },\n\n    performSearch(\n        query,\n        page,\n        entity = 'all',\n        facets = [],\n        fields = [ALL_FIELDS],\n        type = 'QUERY_STRING',\n        returnFields = [],\n        pageSize = 25\n    ) {\n        if (type === 'QUERY_STRING' && (!query || query.length < 2)) {\n            return RSVP.resolve([]);\n        }\n\n        const store = this.get('store');\n\n        const defaultAggregations = [\n            ['department', null, 'department', 'TERM'],\n            ['title', null, 'title', 'TERM'],\n            ['profileSkills', null, 'profileSkills', 'TERM'],\n            ['hobbies', null, 'hobbies', 'TERM'],\n            ['interests', null, 'interests', 'TERM'],\n            ['certifications', null, 'certifications', 'TERM']\n            // ['languages', null, 'languages', 'TERM']\n        ];\n\n        if (entity === null) {\n            entity = 'all';\n        }\n\n        // Two requests while working out issues with Ember Data\n        const entityRequest = this.requestBuilder()\n            .setPaging(page + 1, pageSize)\n            .setReturnFields(returnFields);\n        const facetsRequest = this.requestBuilder()\n            .setPaging(page + 1, 0)\n            .addAggregations(...defaultAggregations);\n\n        if (entity !== 'all') {\n            if (entity === 'people') {\n                entity = 'users';\n            }\n\n            if (!Array.isArray(entity)) {\n                entity = [entity];\n            }\n            entityRequest.setTypes(entity);\n        }\n\n        if (!_.isEmpty(facets)) {\n            const selectedTerms = facets.rejectBy('isKeyword');\n            _.forEach(selectedTerms, term => {\n                const searchField = term.get('searchField');\n                const value = term.get('term.term');\n                entityRequest.addQuery(value, 'AND', 'EXACT', [searchField]);\n            });\n\n            if (!_.isEmpty(selectedTerms)) {\n                entityRequest.setTypes(['users']);\n            }\n        } else if (_.isEmpty(facets) && entity === 'users') {\n            entityRequest.addAggregations(...defaultAggregations);\n        }\n\n        if (_.isEmpty(query)) {\n            entityRequest.addQuery(null, 'OR', 'MATCH_ALL', fields);\n            facetsRequest.addQuery(null, 'OR', 'MATCH_ALL');\n        } else {\n            entityRequest.addQuery(query, 'AND', type, fields);\n            facetsRequest.addQuery(query);\n        }\n\n        const searchResults = store.search(null, entityRequest.get('data'));\n        let aggregateResults = Ember.RSVP.resolve([]);\n\n        if (entity === 'all') {\n            aggregateResults = store.search(null, facetsRequest.get('data'));\n        }\n\n        const data = Ember.RSVP.all([searchResults, aggregateResults]);\n\n        return data.then(([results, facets]) => {\n            if (!facets.get('_aggregations')) {\n                facets = results.get('_aggregations');\n            } else {\n                facets = facets.get('_aggregations');\n            }\n\n            facets = this.processFacets(facets);\n\n            return { results, facets };\n        });\n    },\n\n    performSuggestSearch(query, entity = 'all') {\n        const store = this.get('store');\n        const request = this.requestBuilder().addQuery(query).setPaging(1, 4);\n\n        if (entity === 'people') {\n            entity = 'users';\n        }\n\n        if (entity !== 'all') {\n            request.setTypes([entity]);\n        }\n\n        return store.suggest(request.get('data'));\n    },\n\n    performCustomSearch(requestBuilder) {\n        return this.get('store').search(null, requestBuilder.get('data'));\n    },\n\n    countHierarchyReports(personId) {\n        if (!personId) {\n            return RSVP.resolve(null);\n        }\n\n        const url = this.get('_searchUrl');\n        const data = {\n            types: ['users'],\n            query: [\n                {\n                    type: 'EXACT',\n                    operator: 'AND',\n                    value: personId,\n                    fields: ['path']\n                }\n            ],\n            pageNumber: 1,\n            pageSize: 1,\n            returnFields: ['path']\n        };\n\n        return this.get('ajax')\n            .post(url, { data })\n            .then(response => {\n                const total = response && response.total;\n                return typeof total === 'number' ? total : null;\n            })\n            .catch(() => null);\n    },\n\n    processFacets(facets) {\n        facets = _.chain(facets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, term => {\n                        return {\n                            term: term.key,\n                            count: term.count\n                        };\n                    })\n                };\n            })\n            .filter()\n            .value();\n\n        const orderKeys = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => orderKeys.indexOf(key));\n    },\n\n    requestBuilder() {\n        return RequestBuilder.create({\n            service: this\n        });\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Mixin } = Ember;\n\nexport default Mixin.create({\n    searchService: inject.service('search'),\n\n    search(query, params = {}) {\n        const adapter = this.adapterFor('search');\n        let promise;\n\n        if (query && !params.query) {\n            // This is a simple keyword search, no special queries\n            promise = adapter.performSimpleKeywordSearch(query, params);\n        } else {\n            promise = adapter.performSearch(params);\n        }\n\n        promise = Ember.RSVP.resolve(promise, 'Adapter#performSearch');\n\n        return promise\n            .then(\n                payload => {\n                    const { aggregations } = payload;\n                    const data = this._extractData(payload, 'search');\n                    return { aggregations, data, payload };\n                },\n                null,\n                'Store#search'\n            )\n            .then(({ aggregations, data, payload }) => {\n                Ember.set(data, '_aggregations', aggregations);\n                Ember.set(data, '_meta', payload);\n                return data;\n            });\n    },\n\n    suggest(query) {\n        const adapter = this.adapterFor('search');\n        let promise = adapter.suggest(query);\n\n        promise = Ember.RSVP.resolve(promise, 'Adapter#suggest');\n\n        return promise.then(\n            payload => {\n                return this._extractData(payload, 'search');\n            },\n            null,\n            'Store#suggest'\n        );\n    },\n\n    _extractData(payload, type = 'findMany') {\n        const serializer = this.serializerFor('application');\n\n        if (!payload.results && payload.aggregations) {\n            return payload.aggregations;\n        }\n\n        if (!payload.results) {\n            payload.results = [];\n        }\n\n        payload = serializer.normalizeArrayResponse(this, null, payload, null, type);\n\n        if (!payload.data) {\n            payload.data = [];\n        }\n\n        if (payload.included) {\n            payload.data = [].concat(payload.data, payload.included);\n            payload.included = [];\n        }\n\n        return this.push(payload);\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { singularize } from 'ember-inflector';\n\nimport Validators from '../components/entity-fields/validators';\n\nexport var filterMissingFields = function (record, json) {\n    _.forEach(record.fieldConfig.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let fieldPath = field.get('fieldPath');\n            let type = field.get('type');\n            let values = record.getFieldValue(fieldPath);\n            let splitField = fieldPath.split('.');\n            let sectionKey = splitField[0],\n                fieldKey = splitField[1];\n\n            let container = json[sectionKey] ? json[sectionKey][fieldKey] : null;\n\n            if (Validators[type] && container) {\n                let validator = Validators[type];\n                if (typeof validator.isEmpty === 'function') {\n                    if (!Array.isArray(values)) {\n                        values = [values];\n                    }\n\n                    let toRemove = _.filter(values, function (value) {\n                        let isEmpty = validator.isEmpty(value, record, field);\n                        if (!value || (value.value !== undefined && isEmpty)) {\n                            if (container) {\n                                Ember.Logger.info('Removing field value:', fieldPath, container);\n                                return true;\n                            }\n                        }\n                    });\n\n                    container.removeObjects(toRemove);\n                }\n            }\n        });\n\n        if (_.isEmpty(json[section.get('key')])) {\n            delete json[section.get('key')];\n        }\n    });\n\n    return json;\n};\n\nlet OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nvar ApplicationSerializer = DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    primaryKey: 'guid',\n\n    isPrimaryType(store, typeName, primaryTypeClass) {\n        if (!primaryTypeClass) {\n            return false;\n        }\n\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = payload;\n        let groupKey = '_entity';\n\n        if (payload.res) {\n            data = payload.res;\n            delete payload.res;\n        } else if (payload.results) {\n            data = payload.results;\n            delete payload.results;\n        }\n\n        if (requestType === 'search') {\n            groupKey = '_type';\n        }\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            if (data && typeof data === 'object' && !Array.isArray(data)) {\n                data = _.map(data, value => value);\n            }\n\n            const finalData = {};\n            const groupedData = _.groupBy(data, groupKey);\n\n            _.forOwn(groupedData, (list, key) => {\n                if (key === undefined || key === 'undefined' || key === 'conversations') {\n                    key = primaryModelClass.modelName;\n                }\n\n                let type = singularize(key);\n                if (type === 'user' && requestType === 'search') {\n                    type = 'person';\n                }\n                finalData[type] = list.map(data => {\n                    data.id = data.id || data.guid || data._id;\n                    return data;\n                });\n            });\n\n            if (_.isEmpty(finalData) && primaryModelClass) {\n                finalData[primaryModelClass.modelName] = [];\n            }\n\n            let meta = {};\n            if (typeof payload === 'object' && !Array.isArray(payload)) {\n                meta = payload;\n            }\n\n            payload = _.merge(finalData, {\n                meta\n            });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        if (payload.res && !payload._id) {\n            payload = payload.res;\n        }\n\n        if (primaryModelClass.modelName === 'call') {\n            payload.id = payload.conversationId;\n        }\n\n        data[primaryModelClass.modelName] = payload;\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    serialize(snapshot, options) {\n        var json = this._super(snapshot, options);\n        delete json._entity;\n        return json;\n    }\n});\n\nexport default ApplicationSerializer;\n","define(\"connections-ui/serializers/call-communication\", [\"exports\", \"ember-purecloud-components/serializers/call-communication\"], function (_exports, _callCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    serialize(snapshot) {\n        const options = snapshot.adapterOptions;\n        let serialized;\n\n        if (options && options.patch) {\n            const attrsToSerialize = options.attrs;\n            const changed = snapshot.changedAttributes();\n            const attrs = Object.keys(changed);\n            if (!changed || attrs.length === 0) {\n                return this._super(...arguments);\n            }\n            const data = {};\n            attrs.forEach(attr => {\n                if (attrsToSerialize) {\n                    if (attrsToSerialize.indexOf(attr) > -1) {\n                        data[attr] = snapshot.attr(attr);\n                    }\n                } else {\n                    data[attr] = snapshot.attr(attr);\n                }\n            });\n\n            data.enabled = snapshot.attr('enabled');\n            data.voicemail = snapshot.attr('voicemail');\n\n            serialized = data;\n        } else {\n            serialized = this._super(...arguments);\n        }\n\n        delete serialized.phoneNumber;\n\n        return serialized;\n    }\n});\n","define(\"connections-ui/serializers/callback-communication\", [\"exports\", \"ember-purecloud-components/serializers/callback-communication\"], function (_exports, _callbackCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _callbackCommunication.default;\n    }\n  });\n});\n","import DS from 'ember-data';\n\nexport default DS.JSONSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = payload.entities || [];\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/chat-communication\", [\"exports\", \"ember-purecloud-components/serializers/chat-communication\"], function (_exports, _chatCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _chatCommunication.default;\n    }\n  });\n});\n","import Geolocation from './geolocation';\n\nexport default Geolocation.extend();\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        payload.links = {\n            recordings: `/api/v2/conversations/${payload.id}/recordings`\n        };\n\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = _.map(payload.entities, convo => {\n                convo.links = {\n                    recordings: `/api/v2/conversations/${convo.id}/recordings`\n                };\n\n                return convo;\n            });\n            payload = data;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/conversation\", [\"exports\", \"ember-purecloud-components/serializers/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/email-communication\", [\"exports\", \"ember-purecloud-components/serializers/email-communication\"], function (_exports, _emailCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emailCommunication.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport PurecloudSerializer from '../purecloud';\nimport { EMPTY_ORGANIZATION_MODEL } from './external-organization';\n\nconst EMPTY_MODEL_OBJECTS = {\n    workPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    cellPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: true\n    },\n    homePhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    otherPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    }\n};\n\nconst EXTERNAL_ORGANIZATION = 'externalOrganization';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        workPhone: { embedded: 'always' },\n        cellPhone: { embedded: 'always' },\n        homePhone: { embedded: 'always' },\n        otherPhone: { embedded: 'always' },\n        externalOrganization: { embedded: 'always' }\n    },\n\n    _normalizeContact(contact) {\n        if (contact.type) {\n            contact.contactType = contact.type.toLowerCase();\n            delete contact.type;\n        }\n        if (!contact.canonicalContact) {\n            contact.canonicalContact = { id: contact.id };\n        }\n        if (!contact.mergeSet) {\n            contact.mergeSet = [{ id: contact.id }];\n        }\n        if (!contact.middleName) {\n            contact.middleName = '';\n        }\n        return contact;\n    },\n\n    _getPojo(jsonProfile) {\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/contact' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(store)(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || payload.contacts || []).map(\n            this._fillEmptyPropertiesWithModelObjects(store)\n        );\n        payload = {\n            'externalcontacts/contacts': filledEntities,\n            meta: {\n                total: payload.total || filledEntities.length,\n                pageOffset: payload.pageNumber || 1,\n                pageSize: payload.pageSize,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(store) {\n        return payload => {\n            const emptyModel = EMPTY_MODEL_OBJECTS;\n            const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n            for (const property of Object.getOwnPropertyNames(emptyModel)) {\n                this._fillPropertyIfNecessary(property, payload, emptyModel);\n            }\n            if (payload[EXTERNAL_ORGANIZATION]) {\n                const organization = payload[EXTERNAL_ORGANIZATION];\n\n                try {\n                    store.hasRecordForId('externalcontacts/externalOrganization', organization.id);\n                } catch (err) {\n                    for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n                        this._fillPropertyIfNecessary(property, organization, emptyOrgModel);\n                    }\n                }\n            }\n            return this._normalizeContact(payload);\n        };\n    },\n\n    /**\n     * Updates the property value with the pre-filled defaultData if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and defaultData to access\n     * @param {*} data the new data\n     * @param {*} defaultData the original preset data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\nimport PurecloudSerializer from '../purecloud';\n\nexport const EMPTY_ORGANIZATION_MODEL = {\n    websites: [],\n    tickers: [],\n    tags: [],\n    phoneNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    faxNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    },\n    twitterId: {\n        screenName: ''\n    }\n};\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, RelateFeaturesMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        phoneNumber: { embedded: 'always' },\n        faxNumber: { embedded: 'always' },\n        twitterId: { embedded: 'always' }\n    },\n\n    _getPojo(jsonProfile) {\n        if (jsonProfile.twitterId && !jsonProfile.twitterId.screenName) {\n            // If there is no Twitter screen name, don't send the twitterId property to the mid-tier\n            // Ref. https://s3.amazonaws.com/connect-apidocs/contacts-service/basic-objects.html#twitterid-object\n            delete jsonProfile.twitterId;\n        }\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/externalOrganization' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || []).map(entity =>\n            this._fillEmptyPropertiesWithModelObjects(entity)\n        );\n        payload = {\n            'externalcontacts/external-organizations': filledEntities,\n            meta: {\n                total: payload.total,\n                pageSize: payload.pageSize,\n                pageOffset: payload.pageNumber,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(payload) {\n        const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n        for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n            this._fillPropertyIfNecessary(property, payload);\n        }\n        return payload;\n    },\n\n    /**\n     * Updates the property value with the pre-filled model data if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and model to access\n     * @param {*} data the new data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData = EMPTY_ORGANIZATION_MODEL) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('facebook')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('line')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('twitter')\n});\n","import DS from 'ember-data';\nimport { modelKeyFor } from 'connections-ui/utils/message-channels';\n\nexport default DS.RESTSerializer.extend({\n    primaryKey: modelKeyFor('whatsapp')\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeFindRecordResponse(store, primaryModelClass, payload) {\n        let jsonapiPayload = {\n            data: {\n                type: 'geolocation-settings',\n                id: '1',\n                attributes: payload\n            }\n        };\n        return jsonapiPayload;\n    }\n});\n","import DS from 'ember-data';\nimport Ember from 'ember';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n    serializeIntoHash(data, type, record, options) {\n        Ember.merge(data, this.serialize(record, options));\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const data = {\n            geolocation: payload\n        };\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    extractId(modelClass, resourceHash) {\n        return resourceHash.subjectId + resourceHash.role.id + resourceHash.division.id;\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload.id) {\n            payload.id = id;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import ApplicationSerializer from './application';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport moment from 'ember-purecloud-components/utils/dates';\nimport uuid from 'connections-ui/utils/uuid';\n\nconst { inject } = Ember;\n\nconst OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nexport default ApplicationSerializer.extend({\n    session: inject.service(),\n    serialize(snapshot, options) {\n        const json = this._super(snapshot, options);\n\n        // Never update contactInfo.chat, thats autogenerated\n        if (json && json.contactInfo && json.contactInfo.chat) {\n            delete json.contactInfo.chat;\n        }\n        return json;\n    },\n\n    applyJabberIdFromChat(payload) {\n        if (!payload) {\n            return;\n        }\n        const chatJid =\n            payload.contactInfo &&\n            payload.contactInfo.chat &&\n            payload.contactInfo.chat[0] &&\n            payload.contactInfo.chat[0].value &&\n            payload.contactInfo.chat[0].value.jid;\n        if (chatJid) {\n            payload._id = this.getJabberId(chatJid);\n        }\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const meta = {};\n\n        if (requestType === 'deleteRecord') {\n            payload = payload.entities[0];\n            delete payload.entities;\n            payload.contactInfo = {\n                chat: []\n            };\n            payload.contactInfo.chat.push({\n                value: {\n                    jid: payload.chat.jabberId\n                },\n                labelKey: 'chat'\n            });\n            payload._id = this.getJabberId(payload.chat.jabberId);\n            delete payload.chat;\n        } else {\n            if (payload.general.links && payload.general.links.length > 0) {\n                this.generateGroupLinkIds(payload.general.links);\n            }\n            this.applyJabberIdFromChat(payload);\n        }\n\n        payload.guid = payload.id || payload.guid;\n\n        if (payload.guid) {\n            payload.policy = {\n                id: payload.guid,\n                type: 'group-policy'\n            };\n        }\n\n        if (requestType === 'deleteRecord' && !payload._id) {\n            payload._id = id;\n        }\n\n        payload.meta = meta;\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        // normalizeArrayResponse was only implmented to handle bevy group results.\n        let data = payload;\n        if (payload.entities) {\n            data = payload.entities;\n            delete payload.entities;\n        }\n\n        const finalData = {};\n        let meta = {};\n        if (typeof payload === 'object' && !Array.isArray(payload)) {\n            meta = payload;\n        }\n\n        const groups = {};\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            _.forEach(data, g => {\n                this.applyJabberIdFromChat(g);\n\n                if (g.general.links && g.general.links.length > 0) {\n                    this.generateGroupLinkIds(g.general.links);\n                }\n\n                g.guid = g.id;\n                g.orgGuid = g.id;\n\n                g.mt = moment(g.dateModified).unix();\n                g.search_key = g.general.name[0].value.toLowerCase();\n                groups[g._id] = g;\n            });\n        }\n        finalData.res = groups;\n        finalData.meta = meta;\n\n        return this._super(store, primaryModelClass, finalData, id, requestType);\n    },\n\n    getJabberId(id) {\n        const idParts = id.split('@');\n        return idParts.length > 0 ? idParts[0] : '';\n    },\n\n    /*  When using the public-api/bevy group requests\n        the group sub-objects don't contain a _id property.\n        Normally this is not an issue but for the general.links\n        it does.  The UI uses the _id  property on each link.\n        The following methods add/strip unique ids on the links.\n    */\n    generateGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (!link._id) {\n                link._id = uuid.generate();\n            }\n        });\n    },\n\n    cleanGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (link._id) {\n                delete link._id;\n            }\n        });\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend();\n","import Ember from 'ember';\n\nimport PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    session: Ember.inject.service(),\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        let location = data.location;\n        location.floors = [];\n        if (data.floors && data.floors.entities) {\n            location.floors = data.floors.entities.map(floor => store.push(store.normalize('location', floor)));\n        }\n        return this._super(store, model, location, guid);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        const type = primaryModelClass.modelName;\n        const data = {\n            [type]: payload.entities\n        };\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/message-communication\", [\"exports\", \"ember-purecloud-components/serializers/message-communication\"], function (_exports, _messageCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messageCommunication.default;\n    }\n  });\n});\n","define(\"connections-ui/serializers/participant\", [\"exports\", \"ember-purecloud-components/serializers/participant\"], function (_exports, _participant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _participant.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nimport PurecloudSerializer from './purecloud';\nimport { filterMissingFields } from './application';\nimport LoggerMixin from '../mixins/logger';\n\nimport Validators from '../components/entity-fields/validators';\n\nfunction cleanFields(record) {\n    var config = record.fieldConfig;\n    _.forEach(config.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            let type = field.get('type');\n\n            if (Validators[type]) {\n                let validator = Validators[type];\n                let values = record.getFieldValue(field.getFieldPath());\n\n                if (typeof validator.cleanFieldForEntity === 'function') {\n                    if (Array.isArray(values)) {\n                        _.forEach(values, function (value) {\n                            validator.cleanFieldForEntity(record, field, value);\n                        });\n                    } else {\n                        validator.cleanFieldForEntity(record, field, values);\n                    }\n                }\n            }\n        });\n    });\n}\n\nfunction extractSectionData(record, json) {\n    let section = record._currentSection;\n    if (section) {\n        let key = section.get('key');\n        if (Object.prototype.hasOwnProperty.call(json, key)) {\n            let data = {\n                _id: json._id\n            };\n            data[key] = json[key];\n            return data;\n        }\n    }\n    return json;\n}\n\nexport default PurecloudSerializer.extend(LoggerMixin, {\n    session: Ember.inject.service(),\n    phoneIntegrations: Ember.inject.service(),\n\n    serialize: function (snapshot, options) {\n        let record = snapshot.record;\n\n        cleanFields(record);\n\n        let json = this._super(snapshot, options);\n\n        json = extractSectionData(record, json);\n\n        delete json._id;\n\n        return filterMissingFields(record, json);\n    },\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        if (data) {\n            data.id = guid || data.guid || data.id;\n        }\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload || !payload.entities) {\n            return this._super(...arguments);\n        }\n\n        if (payload.meta && payload.meta.usingIntegrationSource && requestType === 'findMany') {\n            if (!payload.meta.integrationSource) {\n                this.logger.warn(\n                    \"We are using an integration source, but I'm not sure which integration source it is:\",\n                    {\n                        meta: payload.meta\n                    }\n                );\n                return this._super(...arguments);\n            }\n            let entities = (payload.entities || []).map(entity => {\n                let data = Object.assign({}, entity);\n                // note: we may not need to do this and instead just return 'data'\n                if (\n                    data.expands &&\n                    (data.expands.integrationPresence === undefined || data.expands.integrationPresence === null)\n                ) {\n                    // Default to empty\n                    data.expands.integrationPresence = {};\n                }\n\n                return data;\n            });\n            let data = Object.assign({}, payload, {\n                entities: entities\n            });\n            return this._super(store, primaryModelClass, data, id, requestType);\n        }\n\n        return this._super(...arguments);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id) {\n        payload.links = {\n            profile: `/api/v2/users/${id}/profile`\n        };\n        const normalized = this._super(...arguments);\n        return normalized;\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        // Support for search results\n        if (payload.results) {\n            data[type] = payload.results;\n            delete payload.results;\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudSerializer.extend({\n    normalizeArrayResponse: function (store, primaryModelClass, payload, id, requestType) {\n        _.forEach(payload.entities, function (entity) {\n            entity.type = 'queue';\n            return entity;\n        });\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse: function (store, primaryModelClass, payload, id, requestType) {\n        payload.type = 'queue';\n        // Queue lookup can either go through the typical detail API or through the divisionviews API\n        // so we can handle situations where you might run into queue lookups from a different division\n        // Handle that response type here\n        // See API docs: https://developer.inindca.com/api/rest/v2/routing/#get-api-v2-routing-queues-divisionviews\n        if (payload.entities && payload.entities.length === 1) {\n            payload = payload.entities[0];\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport DS from 'ember-data';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        conversation: { embedded: 'always' }\n    },\n    normalizeArrayResponse() {\n        const response = this._super(...arguments);\n\n        if (!response || !response.data) {\n            response.data = [];\n        }\n\n        response.data.forEach(entity => {\n            entity.relationships.conversation.data.type = 'conversation';\n        });\n\n        return response;\n    }\n});\n","define(\"connections-ui/serializers/recording\", [\"exports\", \"ember-purecloud-components/serializers/recording\"], function (_exports, _recording) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _recording.default;\n    }\n  });\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (requestType === 'query' && payload.results && payload.results.entities) {\n            data[type] = payload.results.entities;\n            delete payload.results.entities;\n\n            payload = _.merge(data, { meta: payload.results });\n        } else if (requestType === 'findMany' && payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","define(\"connections-ui/serializers/screenshare-communication\", [\"exports\", \"ember-purecloud-components/serializers/screenshare-communication\"], function (_exports, _screenshareCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _screenshareCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","define(\"connections-ui/serializers/social-communication\", [\"exports\", \"ember-purecloud-components/serializers/social-communication\"], function (_exports, _socialCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _socialCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    attrs: {\n        webrtcMediaDscp: 'webRtcMediaDscp',\n        webrtcForceTurn: 'webRtcForceTurn',\n        persistentConnection: 'webRtcPersistentEnabled',\n        requireMediaHelper: 'webRtcRequireMediaHelper'\n    }\n});\n","import ApplicationSerializer from './application';\n\nexport default ApplicationSerializer.extend();\n","define(\"connections-ui/serializers/video-communication\", [\"exports\", \"ember-purecloud-components/serializers/video-communication\"], function (_exports, _videoCommunication) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoCommunication.default;\n    }\n  });\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    extractMeta(store, typeClass, payload) {\n        const meta = payload.meta;\n        delete payload.meta;\n        return meta;\n    },\n\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        if (requestType === 'query') {\n            payload.entities = payload.results || [];\n            delete payload.results;\n        }\n\n        return this._super(...arguments);\n    },\n\n    serializeIntoHash(hash, type) {\n        this._super(...arguments);\n\n        const key = this.payloadKeyFromModelName(type.modelName);\n        Object.assign(hash, hash[key]);\n        delete hash[key];\n    },\n\n    serializeAttribute(snapshot, json, key, attributes) {\n        const changed = snapshot.changedAttributes();\n        if (snapshot.record.get('isNew') || changed[key]) {\n            this._super(snapshot, json, key, attributes);\n        }\n    }\n});\n","/* global intlTelInputUtils */\n\nimport Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport QueueModel from '../models/queue';\nimport PersonModel from '../models/person';\nimport ExternalContactModel from '../models/external-contact';\n\nimport { formatAddressForDisplay, formatSipAddressForDisplay } from 'ember-purecloud-components/utils/address-format';\n\nconst wordCharsRegex = /[^\\w]/g; // Matches anything that is a word character (i.e[a-zA-Z0-9_])\nconst nonDigitRegex = /\\D/g; // Matches anything that isn't a digit\nconst removeLeadingPlusRegex = /^[+]+/g; // Used to remove the pluses at the beginning of the number\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    store: Ember.inject.service(),\n    countryCode: Ember.computed('intl.isoLocale', function () {\n        if (this.get('intl.isoLocale')) {\n            return this.get('intl.isoLocale').toUpperCase().split('-').pop();\n        } else {\n            return null;\n        }\n    }),\n\n    /**\n     * This method is meant to take in a varying number of types and return the appropriate\n     * string to make a call. It is used primarily for phone:makeCall\n     *\n     * @param  {string|object|model} itemToFormat the item we are trying to format\n     * @return {string}              the formatted version of itemToFormat\n     */\n    format(itemToFormat) {\n        if (itemToFormat instanceof PersonModel) {\n            return itemToFormat.get('guid');\n        }\n        if (itemToFormat instanceof QueueModel) {\n            return itemToFormat.get('id');\n        }\n        if (itemToFormat instanceof ExternalContactModel) {\n            return itemToFormat.get('phone.rel.e164');\n        }\n        if (itemToFormat && typeof itemToFormat === 'object') {\n            return this.formatFieldConfigEntry(itemToFormat);\n        }\n        if (typeof itemToFormat === 'string') {\n            return this.formatAddress(itemToFormat);\n        }\n        return itemToFormat;\n    },\n\n    /**\n     * Format numbers to E164. If number has sip: prefix, format sipAddress\n     * @param  {string} phoneNumber the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {string}             the formatted number\n     */\n    formatAddress(phoneNumber, country, subMsgType) {\n        if (_.startsWith(phoneNumber, 'sip:')) {\n            return this.formatSipAddress(phoneNumber);\n        }\n        if (_.startsWith(phoneNumber, 'tel:')) {\n            phoneNumber = phoneNumber.split(':').pop();\n        }\n\n        if (subMsgType === 'whatsapp') {\n            phoneNumber = phoneNumber.replace(wordCharsRegex, '');\n        } else if (subMsgType === 'open') {\n            return phoneNumber;\n        } else {\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            if (intlTelInputUtils.isValidNumber(phoneNumber, countryCode)) {\n                const extension = intlTelInputUtils.getExtension(phoneNumber, countryCode);\n                const e164 = intlTelInputUtils.formatNumber(\n                    phoneNumber,\n                    countryCode,\n                    intlTelInputUtils.numberFormat.E164\n                );\n                if (intlTelInputUtils.isValidNumber(e164, countryCode)) {\n                    // check again b/c libphonenumber could 'E164' a number into an invalid (e.g., '5555555' => '+15555555')\n                    if (extension) {\n                        // add extension back b/c libphonenumber strips it out after E164ing the number\n                        return `${e164};ext=${extension}`;\n                    }\n                    return e164;\n                }\n            }\n        }\n\n        return phoneNumber;\n    },\n\n    /**\n     * Format sip numbers to remove extraneous parameters\n     * @param  {string} address the number to formatSipAddress\n     * @return {string}             the formatted address\n     */\n    formatSipAddress(address) {\n        const regex = /(sip:)([^;]*)?(?:[^@]*)(@.*)/;\n        const addressParts = address.match(regex);\n        if (!addressParts || addressParts.length < 3) {\n            return address;\n        }\n        if (\n            intlTelInputUtils.isValidNumber(addressParts[2]) ||\n            intlTelInputUtils.isValidNumber(addressParts[2], this.get('countryCode'))\n        ) {\n            return this.formatAddress(addressParts[2]);\n        }\n        return addressParts.slice(1).join('');\n    },\n\n    formatOrLookupAddressForDisplay(address, country) {\n        return Ember.RSVP.resolve(this.formatAddressForDisplay(address, country, undefined, { doLookup: true }));\n    },\n\n    lookupAddressFormatResultId(result = {}) {\n        const fallback = result.displayText || '';\n\n        try {\n            if (result.jid) {\n                const existingRecord = this.get('store').peekAll('person').findBy('jid', result.jid);\n\n                if (existingRecord) {\n                    return new DS.PromiseObject({ promise: Ember.RSVP.resolve(existingRecord.get('name')) });\n                }\n\n                const promise = this.get('store')\n                    .findMany('person', [result.jid])\n                    .then(records => {\n                        if (records && records.length === 1) {\n                            return records[0].get('name');\n                        }\n                        return fallback;\n                    })\n                    .catch(() => fallback); // don't log this, it just means the lookup failed, return fallback\n\n                return new DS.PromiseObject({ promise }); // has to be re-wrapped since we then/catch the original store promise\n            }\n\n            if (result.queueId) {\n                const promise = this.get('store')\n                    .findRecord('queue', result.queueId)\n                    .then(queue => queue.get('name'))\n                    .catch(() => fallback);\n                return new DS.PromiseObject({ promise });\n            }\n        } catch (e) {\n            // no op;\n        }\n\n        return new DS.PromiseObject({ promise: Ember.RSVP.resolve(fallback) });\n    },\n\n    resolveAddressFormatResult(result = {}, opts = {}) {\n        const fallback = result.displayText || '';\n\n        if (opts.doLookup) {\n            if (result.isEntity) {\n                return this.lookupAddressFormatResultId(result);\n            }\n\n            return new DS.PromiseObject({ promise: Ember.RSVP.resolve(fallback) });\n        }\n\n        return fallback;\n    },\n\n    /**\n     * Format International Numbers (e.g., +1 (919) 555-5555)\n     * If phoneNumber has 'sip:' prefix, call formatSipAddressForDisplay\n     * @param  {string} address     the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @param  {object} opts        options with `doLookup` bool for performing async lookup of username or queue name for sip addresses\n     * @return {string}             the formatted number (always string by default)\n     * @return {Promise}            a Promise which will resolve to the username of the associated sip address, if applicable (will return promise only if { doLookup: true } is provided)\n     */\n    formatAddressForDisplay(address, country, subMsgType, opts = {}) {\n        if (subMsgType === 'whatsapp') {\n            return address.replace(removeLeadingPlusRegex, '');\n        }\n        if (subMsgType === 'open') {\n            return address;\n        }\n        return this.resolveAddressFormatResult(formatAddressForDisplay(address, country), opts);\n    },\n\n    /**\n     * This is a mild improvement over our naiive formatting of just stripping 'sip:'\n     * it does a regex to try to find a jid, in the case that the address might identify a purecloud user\n     * otherwise, otherwise, see if the address part is a phone number, and try to format it as such. Otherwise, fallback\n     * to the original sip address, without the prefix\n     */\n    formatSipAddressForDisplay(address, opts) {\n        return this.resolveAddressFormatResult(formatSipAddressForDisplay(address), opts);\n    },\n\n    /**\n     * Checks to see if a number is valid. Passing in strict will not allow things to pass through.\n     * (strict option may seem weird but the intent is to allow individual authors to make the decision on\n     *  whether this method is blocking or should just pass the number through -- to the api for example)\n     * @param  {string}  phoneNumber the phone number to Checks\n     * @param  {string}  country     the country countryCode\n     * @param  {Boolean} strict      should return false if doesn't pass isValidNumber\n     * @param  {string}  subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {Boolean}\n     */\n    isValidNumber(phoneNumber, country, strict, subMsgType) {\n        try {\n            if (subMsgType === 'whatsapp') {\n                phoneNumber = phoneNumber.replace(removeLeadingPlusRegex, '');\n                return !phoneNumber.match(nonDigitRegex);\n            }\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.get('countryCode'); // make a guess on the country code\n            const isValid = intlTelInputUtils.isValidNumber(phoneNumber, countryCode);\n            return strict ? isValid : true;\n        } catch (e) {\n            return !strict;\n        }\n    },\n\n    /**\n     * Remove 'tel:' or 'sip:' from a string\n     * @param  {string} phoneNumber the number to format\n     * @return {string}             the number sans (tel:|sip:)\n     */\n    formatRawNumber(phoneNumber) {\n        if (_.includes(phoneNumber, 'tel')) {\n            return phoneNumber.replace(/tel:/gi, '');\n        } else if (_.includes(phoneNumber, 'sip')) {\n            return phoneNumber.replace(/sip:/gi, '');\n        } else {\n            return phoneNumber;\n        }\n    },\n\n    /**\n     * Format a field config entry value\n     * @param  {object} itemToFormat the thing to format\n     * @return {string}              the formatted string\n     */\n    formatFieldConfigEntry(itemToFormat) {\n        const e164 = Ember.get(itemToFormat, 'rel.e164');\n        if (e164) {\n            return e164;\n        }\n        let number = Ember.get(itemToFormat, 'value.number');\n        number = number != null ? number.replace(/\\D/g, '') : void 0;\n        let extension = Ember.get(itemToFormat, 'value.extension');\n        extension = extension != null ? extension.replace(/\\D/g, '') : void 0;\n        if (number) {\n            // number = this.formatAddress(number);\n            if (extension) {\n                itemToFormat = number + ';ext=' + extension;\n            } else {\n                itemToFormat = '' + number;\n            }\n        } else if (extension) {\n            itemToFormat = extension;\n        }\n        return itemToFormat;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport AjaxService from 'ember-ajax/services/ajax';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst RateLimitPromise = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin, {\n    isRateLimited: false,\n    rateLimitResetTime: 0\n});\n\n/**\n * A symbol to use as a key in the options hash of requests made through the ajax service to specify\n * subsection(s) of the app from which the request is being made. Provided values can be a string or string[].\n * Strings should not include `/` chars as they are the header primary separator.\n * leading/trailing ws will be dropped and slashes will be replaced.\n *\n * Examples:\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = 'my-cool-web-dir-section';\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = ['my-cool-web-dir-section', '1.0.0']\n */\nexport const REQUEST_TELEMETRY_APP_SUBSECTIONS = Symbol();\n\n// Exported for testing purposes\nexport function shouldRetryRequest(xhr) {\n    if (!xhr || xhr.status !== 429) {\n        return false;\n    }\n    const header = xhr.getResponseHeader('retry-after');\n    return !!header && retryStringToNumber(header) !== null;\n}\n\nfunction retryStringToNumber(value) {\n    const number = parseInt(value, 10);\n    if (isNaN(number) || number < 0) {\n        return null;\n    }\n    return number;\n}\n\nfunction retryResetTime(xhr) {\n    let headerRateLimit = xhr.getResponseHeader('retry-after');\n\n    if (!!headerRateLimit) {\n        return retryStringToNumber(headerRateLimit);\n    }\n    return null;\n}\n\nfunction getHeader(headers, name) {\n    if (!headers || !name) {\n        return;\n    }\n    let foundKey = Ember.A(Object.keys(headers)).find(key => {\n        return key.toLowerCase() === name.toLowerCase();\n    });\n    if (!foundKey) {\n        return;\n    }\n    return headers[foundKey];\n}\n\nfunction isRootAPIRequest(url) {\n    // Is a domain-root request and contains an API version path\n    return url.startsWith('/') && url.includes('/api/v2/');\n}\n\nexport default AjaxService.extend(LoggerMixin, Ember.Evented, {\n    session: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    _timers: null,\n\n    authData: null,\n    currentRequest: {}, // { url: ..., options: ... }\n\n    enableRetryHeaderParsing: Ember.computed.reads('session.features.enableUIAjaxRetryHeader'),\n    enableAPIDomainRewrites: Ember.computed.reads('session.rewriteRootAPIRequests'),\n\n    headers: Ember.computed(function () {\n        return {\n            'Content-Type': 'application/json'\n        };\n    }),\n\n    trustedHosts: Ember.computed('application.purecloudV2BaseUri', function () {\n        const purecloudV2BaseUri = this.get('application.purecloudV2BaseUri');\n        const purecloudV2Host = _.startsWith(purecloudV2BaseUri, 'https://')\n            ? purecloudV2BaseUri.substring(8)\n            : purecloudV2BaseUri;\n\n        return [purecloudV2Host];\n    }),\n\n    init() {\n        this._super(...arguments);\n        this._timers = Ember.A([]);\n    },\n\n    willDestroy() {\n        if (this._timers) {\n            this._timers.forEach(timer => Ember.run.cancel(timer));\n        }\n        this._super(...arguments);\n    },\n\n    post(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    put(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    patch(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    ajaxGet(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = $.param(options.data);\n        }\n        options.method = 'GET';\n\n        return this.request(url, options);\n    },\n\n    _scheduleRequest(url, options, retryTime, deferred) {\n        const scheduleTime = retryTime * 1000;\n        const timer = Ember.run.later(() => {\n            this._timers.removeObject(timer);\n            this.raw(url, options, deferred);\n        }, scheduleTime);\n        this._timers.pushObject(timer);\n    },\n\n    /**\n     * Overriden to make sure we are rate-limited by using `raw`, but returning the same payload as\n     * inherited `request` function.\n     * Please do not make heavy use of the retry option. It is meant as a last resort.\n     *\n     * @param url {string} request URL\n     * @param options {object}\n     * @param [options.retry=false] {boolean} Honor the retry header. Defaults to false. Pass true to retry the request automatically\n     */\n    request(url, options) {\n        let reqUrl = this.addApiDomainIfMissing(url);\n        return this.raw(reqUrl, options)\n            .then(({ response }) => Ember.RSVP.resolve(response))\n            .catch(({ response }) => Ember.RSVP.reject(response));\n    },\n\n    addApiDomainIfMissing(url) {\n        if (this.get('enableAPIDomainRewrites') && isRootAPIRequest(url)) {\n            let apiDomain = window.location.hostname.replace(/^app\\./, 'api.');\n            return `${window.location.protocol}//${apiDomain}${url}`;\n        } else {\n            return url;\n        }\n    },\n\n    raw(url, options = {}, deferred = null) {\n        const canParseHeaders = this.get('enableRetryHeaderParsing');\n        const retryDisabled = options && !options.retry;\n        if (retryDisabled || !canParseHeaders) {\n            return this._super(...arguments);\n        }\n\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n        }\n\n        const promiseProxy = RateLimitPromise.create({\n            promise: deferred.promise\n        });\n\n        this._super(...arguments)\n            .then(data => deferred.resolve(data))\n            .catch(data => {\n                const { jqXHR } = data;\n\n                const shouldRetry = shouldRetryRequest(jqXHR);\n                const retryTime = retryResetTime(jqXHR);\n                this._logPossibleRetryEvent(url, jqXHR, retryTime, shouldRetry);\n\n                if (!shouldRetry) {\n                    deferred.reject(data);\n                    return;\n                }\n\n                this._scheduleRequest(url, options, retryTime, deferred);\n\n                if (promiseProxy) {\n                    Ember.set(promiseProxy, 'isRateLimited', true);\n                    Ember.set(promiseProxy, 'rateLimitResetTime', retryTime);\n                }\n\n                this.trigger('rateLimited', {\n                    url,\n                    options,\n                    jqXHR\n                });\n            });\n\n        return promiseProxy;\n    },\n\n    /**\n     * Overridden here to preserve error data, since the base\n     * ember-ajax class ignored important parts of error responses.\n     */\n    normalizeErrorResponse(status, headers, payload) {\n        let err = this._super(status, headers, payload);\n        if (err && typeof error === 'object') {\n            err.errorResponse = payload;\n        }\n        return err;\n    },\n\n    _logPossibleRetryEvent(url, xhr, retryTime, shouldRetry) {\n        const headers = xhr.getAllResponseHeaders();\n        if (retryTime === null && !!xhr.getResponseHeader('retry-after')) {\n            this.logger.error('Found retry header, but unable to parse time:', {\n                url,\n                headers\n            });\n            return;\n        }\n\n        if (!shouldRetry) {\n            return;\n        }\n\n        this.logger.warn('Request failed, but a retry header was found. Scheduling to run in the future:', {\n            url,\n            headers,\n            seconds: retryTime\n        });\n    },\n\n    generateDetailedMessage(status, headers, payload, requestData) {\n        let url = requestData.url;\n        if (url) {\n            // Try to strip out everything but the host + path\n            try {\n                const urlObject = url.startsWith('/') ? new URL(url, window.location.origin) : new URL(url);\n                url = `${urlObject.origin}${urlObject.pathname}`;\n            } catch (_) {\n                this.logger.info('Redacted possibly sensitive URL:', {\n                    url\n                });\n                url = 'REDACTED';\n            }\n        }\n\n        let correlationId;\n        try {\n            const correlationHeaderKey = 'ININ-Correlation-Id';\n            const headerCorrelationId = getHeader(headers, correlationHeaderKey);\n            const payloadCorrelationId = !!payload && payload.contextId;\n            correlationId = headerCorrelationId || payloadCorrelationId || '(unknown)';\n        } catch (_) {\n            correlationId = '(unknown)';\n        }\n\n        return [\n            'Ember AJAX request',\n            `Method: ${requestData.type}`,\n            `URL: ${url}`,\n            `Status: ${status}`,\n            `Correlation ID: ${correlationId}`\n        ].join('\\n');\n    }\n});\n","import Ember from 'ember';\nimport * as PlatformJS from 'platform';\n\nexport default Ember.Service.extend({});\n\n/**\n * Builds common properties that could be useful in many telemetry and logging situations.\n * The data must ALWAYS be safe for logging.  i.e. no customer or PII data.\n */\nexport function buildCommonTelemetryContext({ applicationService, sessionService, intlService }) {\n    const isHosted = applicationService.get('hostedContext.isHostedProp');\n\n    const commonCtxt = {\n        applicationVersion: applicationService.get('semver'),\n        organizationId: sessionService.get('org.guid'),\n        organization: sessionService.get('org.shortName'),\n        userId: sessionService.get('person.guid'),\n        uiLanguage: intlService.get('isoLocale'),\n        envName: applicationService.get('runtime.name'),\n        isPopout: applicationService.get('isPopout'),\n        webDirAgent: isHosted ? 'desktop' : 'browser',\n        platformJsBrowserName: PlatformJS.name,\n        platformJsBrowserVersion: PlatformJS.version,\n        platformJsProduct: PlatformJS.product,\n        platformJsManufacturer: PlatformJS.manufacturer,\n        platformJsLayout: PlatformJS.layout,\n        platformJsOperatingSystem: PlatformJS.os.toString(),\n        platformJsDescription: PlatformJS.description\n    };\n\n    if (isHosted) {\n        return Object.assign({}, commonCtxt, {\n            desktopOS: applicationService.get('hostedContext._operatingSystem'),\n            desktopVersion: applicationService.get('hostedContext._version')\n        });\n    }\n\n    return commonCtxt;\n}\n","/* global navigator */\nimport Ember from 'ember';\nimport request from 'ember-ajax';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\nimport adapter from 'npm:webrtc-adapter';\nimport { APP_NAME } from './stash-logger';\nimport { EVENTS } from '../utils/hosted-context';\nimport netUtils from '../utils/net';\n// import { addPageAction } from '../utils/newrelic';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\n\nconst { computed, inject, observer } = Ember;\n\nconst BRIDGE_CONFIGURATION = {};\nconst deprecation = {\n    id: 'directory-core.deprecate-application-locale',\n    until: '6.0.0',\n    url: 'https://bitbucket.org/inindca/connections-ui/src/develop/DEPRECATIONS.md'\n};\n\nconst COOKIES = {\n    session: 'X-OrgSpan-Auth-Key',\n    proxyPersonId: 'proxy-person-id',\n    locale: 'locale',\n    prevU_id: '_pu_i',\n    activePersonId: '_ap_i',\n    activeGroupId: '_ag_i',\n    lastSearchQuery: '_lsq2',\n    lastProfileQuery: '_lpq2',\n    debug: 'debug',\n    debugOrgName: 'debug-orgName',\n    debugAppModeReadOnly: 'debug-readOnly',\n    debugMasonry: 'debug-masonry'\n};\n\nexport default Ember.Service.extend({\n    ajax: inject.service(),\n    chat: inject.service(),\n    intl: inject.service(),\n    store: inject.service(),\n    cookies: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    preferences: inject.service(),\n    pigeon: inject.service(),\n    feature: inject.service(),\n    webrtc: inject.service(),\n    mediaProviders: inject.service(),\n    stashLogger: inject.service(),\n    embedded: inject.service(),\n\n    envDetails: null,\n    // Runtime is injected via the instance-initializer and is resolved at runtime. It will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n    runtime: null,\n    dragging: false,\n    browserHidden: false,\n    iframeFocused: false,\n    currentRouteName: null,\n    urlprefix: '',\n    authUri: null,\n    cobrowseUri: null,\n    purecloudAppsUri: null,\n    streamingServiceUri: null,\n    orgspanBaseUri: '/directory',\n    purecloudBaseUri: '/platform',\n    purecloudV2BaseUri: '',\n    realtimeScriptUri: '/static-realtime-js/realtime.js',\n    hostedContext: null,\n\n    isMobile: false,\n    mobileQueryParameter: false,\n    belowMobileThreshold: false,\n\n    showAdminModal: false,\n    showLoader: false,\n\n    trialSupportDisplayed: false,\n\n    debugSettings: {},\n\n    offerMobilePreference: true,\n    offerMobilePreferenceRetreived: false,\n\n    currentYear: new Date().getFullYear(),\n\n    offerMobileApp: computed(\n        'mobileQueryParameter',\n        'isMobile',\n        'offerMobilePreference',\n        'offerMobilePreferenceRetreived',\n        {\n            get() {\n                if (this.get('mobileQueryParameter') || !this.get('offerMobilePreferenceRetreived')) {\n                    return false;\n                }\n\n                return this.get('isMobile') && this.get('offerMobilePreference');\n            },\n            set(key, value) {\n                this.get('preferences').setPreference('offerMobileApp', value);\n                this.set('offerMobilePreference', value);\n            }\n        }\n    ),\n\n    orgName: computed.alias('session.org.name'),\n    orgShortName: computed.alias('session.org.shortName'),\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) {\n            this.set('urlprefix', '/');\n        }\n        this.checkForDebugMode();\n        this.gatherEnvDetails();\n        this.initIframeFocusListener();\n        this.setVisibilityListener();\n\n        const pigeon = this.get('pigeon');\n        pigeon.on('connect', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n\n        let hasRecentlyLostSubscriptions = false;\n        pigeon.on('no_longer_subscribed', () => {\n            if (!hasRecentlyLostSubscriptions) {\n                Ember.Logger.info('Resubscribing to pigeon after no_longer_subscribed');\n                hasRecentlyLostSubscriptions = true;\n                Ember.run.later(() => (hasRecentlyLostSubscriptions = false), 2000);\n                pigeon._registerTopics(); // trigger immediate resubscribe\n                return;\n            }\n            Ember.Logger.warn(\n                'Multiple no_longer_subscribed events, showing warning to user and stopping resubscribe.'\n            );\n            // ENGAGEUI-1563: Warn users if channel limit\n            // has been hit and current channel will no longer\n            // receive updates.\n            this.set('session.shouldWarnNoLongerSubscribed', true);\n        });\n\n        this.get('preferences')\n            .getPreference('offerMobileApp')\n            .then(value => {\n                // needed for unit tests\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.set('offerMobilePreference', value !== false);\n                this.set('offerMobilePreferenceRetreived', true);\n            });\n\n        this.get('pigeon').on('topicsRegistered', () => {\n            let context = this.get('hostedContext');\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        });\n        this.get('pigeon').on('hawkSubscriptionError', err => {\n            this.get('stashLogger').error('Hawk Subscription Error', { err });\n        });\n\n        Ember.Logger.log('WebRTC Adapter loaded at application level', { adapter });\n    },\n\n    async openChatRoomWithVideo() {\n        // no op for now\n    },\n\n    destroy() {\n        if (this.get('csRunLater')) {\n            Ember.run.cancel(this.get('csRunLater'));\n        }\n        this._super(...arguments);\n    },\n\n    currentRouteClass: Ember.computed('currentRouteName', function () {\n        var name = this.get('currentRouteName');\n        if (name) {\n            return name.replace(/[./]+/g, '-');\n        }\n\n        return '';\n    }),\n\n    isoLocale: computed.deprecatingAlias('intl.isoLocale', deprecation),\n    systemLocale: computed.deprecatingAlias('intl.systemLocale', deprecation),\n    iso2LocaleCountry: computed.deprecatingAlias('intl.iso2LocaleCountry', deprecation),\n    setLocale(locale) {\n        const message =\n            'The \"setLocale\" method in \"connections-ui/service/application\" has been deprecated. Please use \"service:intl\" for all locale information.';\n        Ember.deprecate(message, false, deprecation);\n        return this.get('intl').setLocale(locale);\n    },\n\n    gatherEnvDetails() {\n        if (isTesting) {\n            return;\n        }\n        try {\n            this.set('envDetails', netUtils.getEnvDetails());\n        } catch (error) {\n            Ember.Logger.error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js', {\n                reason: error.message\n            });\n            this.set('errorState', { type: 'invalidEnv' });\n        }\n    },\n\n    initIframeFocusListener() {\n        const guid = Ember.guidFor(this);\n        Ember.$(window)\n            .on(`focus.${guid}`, () => this.set('iframeFocused', false))\n            .on(`blur.${guid}`, () => {\n                if (!document) {\n                    return;\n                }\n                const nodeName = Ember.get(document, 'activeElement.nodeName');\n                if (nodeName && nodeName.toLowerCase() === 'iframe') {\n                    this.set('iframeFocused', true);\n                }\n            });\n    },\n\n    setVisibilityListener() {\n        let hidden;\n        let visibilityChange;\n        if (typeof document.hidden !== 'undefined') {\n            hidden = 'hidden';\n            visibilityChange = 'visibilitychange';\n        } else if (typeof document.mozHidden !== 'undefined') {\n            hidden = 'mozHidden';\n            visibilityChange = 'mozvisibilitychange';\n        } else if (typeof document.msHidden !== 'undefined') {\n            hidden = 'msHidden';\n            visibilityChange = 'msvisibilitychange';\n        } else if (typeof document.webkitHidden !== 'undefined') {\n            hidden = 'webkitHidden';\n            visibilityChange = 'webkitvisibilitychange';\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(document).on(`${visibilityChange}.${guid}`, () => {\n            this.set('browserHidden', document[hidden]);\n        });\n        Ember.$(window)\n            .on(`blur.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', true);\n                }\n            })\n            .on(`focus.${guid}`, () => {\n                if (this.get('browserHidden') !== undefined) {\n                    this.set('browserHidden', false);\n                }\n            });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off('connect');\n        this.get('pigeon').off('topicsRegistered');\n        const pigeonUserSubscribed = this.get('pigeonUserSubcribed');\n        if (pigeonUserSubscribed) {\n            this.get('pigeon').off(pigeonUserSubscribed);\n        }\n        const guid = Ember.guidFor(this);\n        Ember.$(window).off(`.${guid}`);\n        Ember.$(document).off(`.${guid}`);\n    },\n\n    loadStreamingService() {\n        const authenticated = this.get('session.isAuthenticated');\n        if (isTesting || !authenticated) {\n            return Ember.RSVP.reject();\n        }\n        const scriptUri = this.realtimeScriptUri;\n        const streamingService = this.get('streaming');\n        streamingService.set('scriptUrl', scriptUri);\n        let features;\n        if (this.get('session.features')) {\n            features = Ember.RSVP.resolve(this.get('session.features'));\n        } else {\n            features = this.get('feature')\n                .getFeatureToggles('webrtcRelayOnly')\n                .catch(err => {\n                    Ember.Logger.warn('Failed to fetch toggles for realtime connection', { err });\n                    // do not rethrow, don't want this to prevent realtime connection\n                    return {};\n                });\n        }\n        return features.then(res => {\n            const runAsMediaHelper =\n                (this.get('hostedContext.isHostedProp') || window.testMediaHelperMode) &&\n                this.get('hostedContext.runAsMediaHelper');\n\n            if (runAsMediaHelper) {\n                Ember.Logger.info('Running in media helper mode');\n                this.set('mediaHelperMode', true);\n                Ember.Logger.info('Letting webrtcSdk set up media helper jid');\n            }\n\n            return streamingService.setupConnection({\n                jid: this.get('session.person.jid'),\n                accessToken: this.get('session.accessToken'),\n                iceTransportPolicy: res.webrtcRelayOnly ? 'relay' : 'all',\n                signalIceConnected: true,\n                disableEOCShortCircuit: true,\n                referenceStanza: true,\n                streamingServiceUri: this.get('streamingServiceUri'),\n                envDetails: this.get('envDetails'),\n                originAppName: APP_NAME,\n                originAppVersion: config.APP.semver,\n                originAppId: this.get('stashLogger.clientSessionId'),\n                splitHawkAndRealtime: true,\n                useServerSidePings: true,\n                customHeaders: {\n                    'Genesys-App': 'connections-ui-webui'\n                }\n            });\n        });\n    },\n\n    streamingServiceConnect: task(function* (debounce = 1000) {\n        yield timeout(debounce);\n        const authenticated = this.get('session.isAuthenticated');\n        const jid = this.get('session.person.jid');\n        const accessToken = this.get('session.accessToken');\n        const chatEnabled = this.get('session.org.hasChatEnabled');\n        const adminUIContext = this.get('adminUIContext');\n        const streamingService = this.get('streaming');\n        return this.loadStreamingService().then(() => {\n            if (authenticated && accessToken && chatEnabled && !adminUIContext) {\n                this.get('chat').set('enabled', true);\n\n                if (!this.get('pigeonUserSubscribed')) {\n                    const myGuid = this.get('session.person.guid');\n                    Ember.Logger.debug('Subscribing to user guid for system topic', { myGuid });\n                    this.set('pigeonUserSubscribed', myGuid);\n                    this.get('pigeon').on(myGuid, data => {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n                        Ember.Logger.debug('System topic', { data });\n                        if (data.systemTopicType === 'token_revoked') {\n                            this.get('session').invalidate({ notified: true });\n                        }\n                    });\n                }\n\n                return streamingService.connect(accessToken, jid).then(() => {\n                    this.get('pigeon')._registerTopics();\n                });\n            }\n        });\n    }).drop(),\n\n    /**\n     * This logic will ultimately be replaced by the pipeline\n     * script insertion logic, but we wanted to enabled with a\n     * feature toggle before migrating.\n     */\n    csEnabled: false,\n    csRunLater: null,\n    checkContentSquare: observer(\n        'session.features.ATLAS-536_EnableContentSquare',\n        'session.features.AGORA-137_connections-ui-contentsquare',\n        function () {\n            this.set(\n                'csRunLater',\n                Ember.run.later(() => {\n                    if (\n                        !this.get('csEnabled') &&\n                        this.get('session.features.ATLAS-536_EnableContentSquare') &&\n                        this.get('session.features.AGORA-137_connections-ui-contentsquare') &&\n                        !this.isDestroyed &&\n                        !this.isDestroying\n                    ) {\n                        const csLoaderScript = document.createElement('script');\n                        csLoaderScript.type = 'text/javascript';\n                        csLoaderScript.src = '/contentsquare/1632/loader.js';\n                        csLoaderScript.crossOrigin = 'anonymous';\n                        csLoaderScript.async = true;\n                        document.body.appendChild(csLoaderScript);\n                        this.set('csEnabled', true);\n                    }\n                }, 500)\n            );\n        }\n    ).on('init'),\n\n    syncStreamingConnectionToAuthState: observer(\n        'session.{isAuthenticated,accessToken}',\n        'session.org.hasChatEnabled',\n        'preferences.chat.disableStreaming',\n        function () {\n            this.get('streamingServiceConnect').perform();\n        }\n    ).on('init'),\n\n    syncVideoChatStateToAdminContext: observer(\n        'session.isAuthenticated',\n        _.debounce(function () {\n            if (this.get('adminUIContext')) {\n                this.set('session.features.videoChat', false);\n            }\n        }, 20)\n    ),\n\n    clearActiveRoomMessagesOnAppFocus: observer('browserHidden', function () {\n        if (this.get('browserHidden')) {\n            return;\n        }\n        this.get('_delayedRefocusChatRoom').perform();\n    }),\n\n    _delayedRefocusChatRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n        this.get('chat').refocusActiveRoom();\n    }),\n\n    displayTrialSupport() {\n        this.set('trialSupportDisplayed', true);\n    },\n\n    dismissTrialSupport() {\n        this.set('trialSupportDisplayed', false);\n    },\n\n    adminUIContext: false,\n\n    uvOptions: {\n        mode: 'feedback',\n        feedback_tab_name: 'Your Feedback or Idea',\n        primary_color: '#4498b4',\n        link_color: '#007dbf',\n        default_mode: 'feedback',\n        forum_id: 294075\n    },\n\n    navigateTo(routeType, routeId, queryParams) {\n        let newHash = '';\n        if (routeType === 'group') {\n            newHash = `#/admin/groupprofile/${routeId}`;\n        } else if (routeType === 'person') {\n            newHash = `#/admin/users/${routeId}`;\n        } else if (routeType === 'search') {\n            const searchParams = Object.entries(queryParams)\n                .map(([key, value]) => `${key}=${encodeURIComponent(value)}`)\n                .join('&');\n            if (searchParams) {\n                newHash = `#/search-v2/?${searchParams}`;\n            }\n        }\n\n        if (newHash && newHash !== window.top.location.hash) {\n            this.get('embedded').publishMessage('close', {}); // Close the \"Person Details\" in Users-UI\n            this.get('embedded').sendNavigationEvent({\n                hash: newHash\n            });\n        }\n    },\n\n    postMessageRouteChange(transition) {\n        if (!this.get('adminUIContext')) {\n            return;\n        }\n        const { targetName, params } = transition;\n        const routeType = _.head(targetName.split('.detail.index')) || false;\n        const route = params[`${routeType}.detail`];\n        const routeId = route && route[`${routeType}_id`];\n        if (this.get('session.features') && this.get('session.features')['PAUI-80.PeopleUiDecomposition']) {\n            // We are inside Users-UI, we can navigate through IFC.\n            this.navigateTo(routeType, routeId, transition.queryParams);\n        } else {\n            // We are inside Admin-UI, we navigate with a postMessage.\n            const data = {\n                type: 'directory:route:changed',\n                data: { routeType, routeId }\n            };\n            Ember.Logger.debug('postMessage -> window.parent', { data });\n            window.parent.postMessage(JSON.stringify(data), '*');\n        }\n    },\n\n    uri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.orgspanBaseUri, path).join('/');\n        }\n    },\n\n    pcUri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.purecloudBaseUri, path).join('/');\n        }\n    },\n\n    pcV2Uri(path) {\n        return [].concat(this.purecloudV2BaseUri, path).join('/');\n    },\n\n    localGCBAUri(path, port) {\n        return `https://127.0.0.1:${port}/${path}`;\n    },\n\n    changePreferredLanguage(lang) {\n        const path = this.uri(['api/v2/preferredLanguage']);\n        return request(path, {\n            type: 'post',\n            data: JSON.stringify({ lang })\n        }).then(() => {\n            window.location.reload(true);\n        });\n    },\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (error) {\n            return true;\n        }\n    },\n\n    sendDiagnostics(data) {\n        return this._sendDiagnostics(data, 'diagnostics');\n    },\n\n    sendFeedback(data) {\n        return this._sendDiagnostics(data, 'diagnostics/support');\n    },\n\n    checkForMobile: Ember.on('init', function () {\n        if (\n            /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet|Silk/i.test(\n                navigator.userAgent\n            )\n        ) {\n            return this.set('isMobile', true);\n        } else {\n            return this.set('isMobile', false);\n        }\n    }),\n\n    isMobilePhone: computed('isMobile', function () {\n        if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini|Silk/i.test(navigator.userAgent)) {\n            return true;\n        } else {\n            return false;\n        }\n    }),\n\n    showTinyNavMenu: computed.or('belowMobileThreshold', 'isMobilePhone'),\n\n    showContextualHelp: computed('showTinyNavMenu', function () {\n        const person = this.get('session.person');\n        return this.get('showTinyNavMenu') && (person.get('isEngageAgent') || person.get('isAdmin'));\n    }),\n\n    isPopout: computed('isPef', 'currentRouteName', function () {\n        if (this.get('isPef')) {\n            return true;\n        }\n\n        const route = this.get('currentRouteName');\n        const popoutRoutes = [\n            'chat-room',\n            'screen-share',\n            // TODO: Remove interactions route from popout\n            // The interactions route has historically been considered a popout\n            // route; however, I don't believe it's used in any production\n            // capacity which is reinforced by the currently broken styles.\n            // I suspect the interactions route will be repurposed for the AgentUI\n            // decomp and/or IA.  When that happens, we should remove this from the\n            // popout computed.  Ultimately, the popout concept needs to be reworked\n            // as well.\n            'interactions',\n            'phone',\n            'engage.quality.quality.interactions.screen-recordings'\n        ];\n        return popoutRoutes.includes(route);\n    }),\n\n    isScreenRecordingPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['engage.quality.quality.interactions.screen-recordings'];\n        return popoutRoutes.includes(route);\n    }),\n\n    /**\n     * Indicates if we're in the legacy, PEF-specific route used for embedding inside\n     * of other CRMs (aka the embedded framework).\n     *\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps externally.  Uses of this computed should be strictly limited to\n     * cases where behavior must diverge between standard CX and PEF mode.\n     * Furthermore, this computed should not be used within the MP/v2 fork of\n     * interactions as it's inherently checked.  If an interaction sub-view is\n     * shared between v1 and v2, then this computed can be used.\n     */\n    isPef: computed('currentRouteName', function () {\n        return this.get('currentRouteName') === 'interaction';\n    }),\n\n    /**\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps.  This computed can be used, however, it should not be used within\n     * the MP/v2 fork of interactions as it's inherently checked.  If an interaction\n     * sub-view is shared between v1 and v2, then this computed can be used.\n     *\n     * @deprecated Use isPef for PEF detection (note that embedded PEF is also\n     * soon to be removed).  A separate `isInteractionsPopout` utility shouldn't be needed,\n     * but a separate computed can be added if deemed necessary in the future.\n     */\n    isInteractionPopout: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n        const popoutRoutes = ['interaction', 'interactions'];\n        return popoutRoutes.includes(route);\n    }),\n\n    isAdminRoute: computed('currentRouteName', function () {\n        const route = this.get('currentRouteName');\n\n        if (route === 'engage.embedded') {\n            return window.location.hash.toLowerCase().includes('admin');\n        }\n\n        const adminRoutes = [\n            'admin',\n            'billing.upgrades',\n            'people-permissions.people-permissions.auth-orgs.access-to-my-org'\n        ];\n        return adminRoutes.some(r => route.search(r) === 0);\n    }),\n\n    _sendDiagnostics(data, uri) {\n        const request = {\n            url: this.pcUri(`api/v2/${uri}`),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(data),\n            cache: false,\n            context: this\n        };\n        function successHandler(data) {\n            Ember.Logger.debug('applicationService: sendFeedback', { id: data.id });\n            return data;\n        }\n        function errorHandler(jqXHR) {\n            Ember.onerror(jqXHR);\n            return jqXHR;\n        }\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendFeedback')\n            .then(successHandler)\n            .catch(errorHandler);\n    },\n\n    setBridgeConfiguration(type, data) {\n        return (BRIDGE_CONFIGURATION[type] = data);\n    },\n\n    checkForDebugMode() {\n        const cookies = this.get('cookies');\n        var params = this.getQueryParams();\n        var debugCookie = cookies.read(COOKIES.debug);\n\n        if (params[COOKIES.debug] !== undefined) {\n            this.set('debug', true);\n            cookies.write(COOKIES.debug, true);\n        } else if (debugCookie) {\n            this.set('debug', true);\n        }\n\n        if (this.get('debug')) {\n            this.buildDebugSettings();\n        }\n    },\n\n    buildDebugSettings() {\n        const cookies = this.get('cookies');\n        const params = this.getQueryParams();\n\n        var orgName = params[COOKIES.debugOrgName],\n            orgNameCookie = cookies.read(COOKIES.debugOrgName);\n\n        var readOnly = params[COOKIES.debugAppModeReadOnly],\n            readOnlyCookie = cookies.read(COOKIES.debugAppModeReadOnly);\n\n        var masonry = params[COOKIES.debugMasonry],\n            masonryCookie = cookies.read(COOKIES.debugMasonry);\n\n        if (orgName !== undefined && orgName.length > 0) {\n            this.set('debugSettings.orgName', orgName);\n            cookies.write(COOKIES.debugOrgName, orgName);\n        } else if (orgNameCookie) {\n            this.set('debugSettings.orgName', orgNameCookie);\n        }\n\n        if (readOnly !== undefined) {\n            this.set('debugSettings.readOnly', true);\n            cookies.write(COOKIES.debugAppModeReadOnly, true);\n        } else if (readOnlyCookie) {\n            this.set('debugSettings.readOnly', true);\n        }\n\n        if (masonry !== undefined) {\n            masonry = masonry !== 'false';\n\n            this.set('debugSettings.masonry', masonry);\n            cookies.write(COOKIES.debugMasonry, masonry);\n        } else if (masonryCookie) {\n            masonryCookie = masonryCookie !== 'false';\n\n            this.set('debugSettings.masonry', masonryCookie);\n        }\n    },\n\n    getQueryParams() {\n        const obj = {};\n        const params = window.location.search.slice(1).split('&');\n\n        _.each(params, function (param) {\n            const split = param.split('=');\n            obj[split[0]] = split.length > 1 ? split[1] : '';\n        });\n\n        return obj;\n    }\n});\n","import Ember from 'ember';\nconst { RSVP, getOwner, typeOf, inject } = Ember;\n\nexport const SHOW_PROFILE_APP_API_ACTION_NAME = 'showProfile';\nexport const SHOW_GROUP_APP_API_ACTION_NAME = 'showGroup';\n\nconst DirectoryNavHandler = Ember.Object.extend({\n    session: inject.service(),\n    routerService: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('routerService', getOwner(this).lookup('router:main'));\n    },\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalid. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME ||\n            appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME\n        );\n    },\n\n    handle(appApiCall) {\n        if (appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME) {\n            return this._handleShowProfile(appApiCall);\n        } else if (appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME) {\n            return this._handleShowGroup(appApiCall);\n        }\n    },\n\n    _handleShowProfile(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { profileId } = appApiCall.get('actionDetails');\n            if (!profileId) {\n                reject('profileId not found');\n                return;\n            }\n            if (typeOf(profileId) !== 'string') {\n                reject('profileId is not a string');\n                return;\n            }\n\n            const routerService = this.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('person.detail', profileId);\n            return resolve();\n        });\n    },\n\n    _handleShowGroup(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { groupId } = appApiCall.get('actionDetails');\n            if (!groupId) {\n                reject('groupId not found');\n                return;\n            }\n            if (typeOf(groupId) !== 'string') {\n                reject('groupId is not a string');\n                return;\n            }\n\n            const routerService = this.get('routerService');\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo('group.detail', groupId);\n            return resolve();\n        });\n    }\n});\n\nexport default DirectoryNavHandler;\n","import Ember from 'ember';\nimport pick from 'lodash/pick';\nimport pickBy from 'lodash/pickBy';\nimport mapKeys from 'lodash/mapKeys';\nimport omit from 'lodash/omit';\nconst { RSVP, inject } = Ember;\n\nexport const SHOW_TOAST_APP_API_ACTION_NAME = 'showToast';\n\nconst TOAST_MSG_PROPS = {\n    id: {\n        type: 'string',\n        internalPropName: 'tag'\n    },\n    type: {\n        type: 'enum',\n        values: ['info', 'success', 'error'],\n        required: true\n    },\n    title: {\n        type: 'string',\n        required: true\n    },\n    message: {\n        type: 'string',\n        required: true\n    },\n    markdownMessage: {\n        type: 'boolean',\n        internalPropName: 'markdownToHtml'\n    },\n    timeout: {\n        type: 'int',\n        internalPropName: 'hideAfter'\n    },\n    showCloseButton: {\n        type: 'boolean'\n    },\n    fallbackToInBrowser: {\n        type: 'boolean'\n    },\n    forceBrowserNotification: {\n        type: 'boolean'\n    },\n    showNotificationEverywhere: {\n        type: 'boolean'\n    }\n};\nconst TOAST_MSG_PROP_NAMES = Object.keys(TOAST_MSG_PROPS);\nconst REQUIRED_TOAST_MSG_PROP_NAMES = TOAST_MSG_PROP_NAMES.filter(prop => TOAST_MSG_PROPS[prop].required);\n\nexport default Ember.Object.extend({\n    notification: inject.service('notification-proxy'),\n    stashLogger: Ember.inject.service(),\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === SHOW_TOAST_APP_API_ACTION_NAME;\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const notification = this.get('notification');\n            const stashLogger = this.get('stashLogger');\n\n            let appId = appApiCall.get('appId') || 'localApp';\n            let apiActionDetails = appApiCall.get('actionDetails');\n\n            let {\n                errors,\n                invalidProps,\n                ignoredProps,\n                validatedToastData: data\n            } = this._processToastPayload(apiActionDetails);\n\n            if (errors.length > 0) {\n                return reject(errors);\n            }\n\n            if (ignoredProps.length > 0) {\n                let ignored = ignoredProps.join(', ');\n                stashLogger.warn('The following props were ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            if (invalidProps.length > 0) {\n                let ignored = invalidProps.join(', ');\n                stashLogger.warn('The following props were invalid and ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            let fullTag = data.tag ? `${appId}_${data.tag}` : appId;\n            data.tag = fullTag;\n\n            if (!['info', 'error', 'success'].includes(data.type)) {\n                return reject(`Unsupported notification type: ${data.type}`);\n            }\n\n            notification[data.type](data.title, data.message, data);\n            return resolve();\n        });\n    },\n\n    /**\n     * Filters, renames, and validates the toast message payload\n     *\n     * @returns the filtered, validated, renamed payload (if successful) and:\n     *  errors - unrecoverable errors\n     *  ignoredProps - props not applicable for toast messages\n     *  invalidProps - known props which were not provided in the correct format, etc.\n     */\n    _processToastPayload(apiActionDetails) {\n        let requiredCount = 0;\n        const invalidProps = [];\n        const errors = [];\n\n        const filteredPickData = pick(apiActionDetails, TOAST_MSG_PROP_NAMES);\n        const filteredData = pickBy(filteredPickData, (value, prop) => {\n            const config = TOAST_MSG_PROPS[prop];\n            const result = this._checkPropValid(config, value);\n\n            if (!result) {\n                invalidProps.push(prop);\n            }\n            if (config.required && result) {\n                requiredCount++;\n            }\n\n            return result;\n        });\n\n        if (requiredCount !== REQUIRED_TOAST_MSG_PROP_NAMES.length) {\n            errors.push(\n                'One or more of the following required toast message properties were missing or invalid' +\n                    REQUIRED_TOAST_MSG_PROP_NAMES.join(', ')\n            );\n        }\n\n        if (!filteredData.showCloseButton) {\n            if (filteredData.type === 'error') {\n                errors.push('Toasts with type error must have a close button');\n            } else if (filteredData.timeout === 0) {\n                errors.push('Toast must have either a nonzero timeout or a close button');\n            }\n        }\n\n        const ignoredProps = Object.keys(omit(apiActionDetails, TOAST_MSG_PROP_NAMES));\n        const validatedToastData = errors.length > 0 ? null : this._mapDataToInternalProperties(filteredData);\n\n        return {\n            errors,\n            invalidProps,\n            ignoredProps,\n            validatedToastData\n        };\n    },\n\n    _mapDataToInternalProperties(data) {\n        return mapKeys(data, (value, prop) => TOAST_MSG_PROPS[prop].internalPropName || prop);\n    },\n\n    _checkPropValid(config, value) {\n        if (!config) {\n            return false;\n        }\n\n        switch (config.type) {\n            case 'string':\n                return typeof value === 'string';\n            case 'int':\n                return Number.isFinite(value) && parseInt(value, 10) === value;\n            case 'boolean':\n                return typeof value === 'boolean';\n            case 'enum':\n                return typeof value === 'string' && config.values.includes(value);\n            default:\n                return false;\n        }\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport ENV from '../config/environment';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\nimport { addPageAction } from '../utils/newrelic';\nimport App, {\n    DISPLAY_TYPES as APP_DISPLAY_TYPES,\n    FEATURE_CATEGORIES as APP_FEATURE_CATEGORIES,\n    ASSET_CATEGORIES as APP_ASSET_CATEGORIES,\n    INTERAPPTION_COMMUNICATION_TYPE_FILTERS,\n    NO_SUPPORTED_COMMUNICATION_TYPE_FILTER\n} from '../models/app';\nimport InternallyHostedApp from '../models/internally-hosted-app';\nimport ApiCall from '../models/app-api-call';\nimport AppPool from '../models/app-pool';\nimport { APPS_API_PROTOCOL, parseMessage } from '../models/app-api-call';\nimport { SHOW_TOAST_APP_API_ACTION_NAME } from './apps-api-handlers/toast-handler';\nimport { SHOW_PROFILE_APP_API_ACTION_NAME } from './apps-api-handlers/directory-nav-handler';\n\nconst SHOW_HELP_APP_API_ACTION_NAME = 'showHelp';\nconst HIDE_HELP_APP_API_ACTION_NAME = 'hideHelp';\nconst SHOW_RC_ARTIFACT_APP_API_ACTION_NAME = 'showResourceCenterArtifact';\n\nexport const APP_SIDEBAR_PANEL_NAME_PREFIX = 'apps-';\n\nconst APPS_BASE_URL = 'api/v2/integrations/clientapps';\n\nconst REMOTE_APPS_CACHE_TTL_MILLIS = 5 * 60 * 1000;\nconst STANDALONE_LOAD_RETRY_BASE_MILLIS = 1000;\nconst STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst STANDALONE_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst STANDALONE_RELOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst WIDGET_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst WIDGET_RELOAD_RETRY_BASE_MILLIS = 1000;\n\n/**\n * List of SDK calls pre-dating the protocol field on the SDK payload.\n *\n * This list allows us to log internal usages of the SDK without the protocol field\n * as deprecations to ensure we're ready to remove the lenient parse of the sdk message.\n *\n * [IMPORTANT:] New SDK methods should not be added to this list.\n */\nconst PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES = [\n    SHOW_PROFILE_APP_API_ACTION_NAME,\n    SHOW_TOAST_APP_API_ACTION_NAME,\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n];\n\n/* App Parsing Props */\n\nconst APP_PROTOCOL_CHECK_REG_EXG = new RegExp(/^\\s*https?:\\/\\/.+$/);\nconst ALLOWED_SANDBOX_VALUES = [\n    'allow-forms',\n    'allow-modals',\n    'allow-popups',\n    'allow-presentation',\n    'allow-same-origin',\n    'allow-scripts',\n    'allow-downloads'\n];\nconst ALLOWED_PERMISSION_VALUES = [\n    'camera',\n    'clipboard-write',\n    'display-capture',\n    'fullscreen',\n    //\"fullscreen 'none'\" is explicitly required to disable fullscreen for nested iframes\n    \"fullscreen 'none'\",\n    'geolocation',\n    'microphone'\n];\nconst VECTOR_IMG_KEY = 'vector';\nconst RASTER_IMG_KEY_REG_EXP = /^(\\d+)x(\\d+)$/i;\n\nconst LIFECYCLE_HOOK_KEYS = ['blur', 'stop', 'focus', 'bootstrap'].map(hook => `hooks.${hook}`);\nconst LIFECYCLE_KEYS = ['ephemeral', ...LIFECYCLE_HOOK_KEYS];\nconst INTERAPPTION_PROP_MAPPING_CONFIG = {\n    name: {\n        type: 'string',\n        destPath: 'name'\n    },\n    sandbox: {\n        destPath: 'properties.sandbox',\n        convert(valueIn) {\n            let typeIn = Ember.typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    permissions: {\n        destPath: 'properties.permissions',\n        convert(valueIn) {\n            let typeIn = Ember.typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    url: {\n        type: 'string',\n        destPath: 'properties.url'\n    },\n    lifecycle: {\n        destPath: 'advanced.lifecycle',\n        convert(lifecycleObj) {\n            if (Ember.typeOf(lifecycleObj) !== 'object') {\n                throw new Error('lifecycle must be an object if specified');\n            }\n\n            const result = {};\n            for (let key of LIFECYCLE_KEYS) {\n                const value = _.get(lifecycleObj, key);\n                const valueType = Ember.typeOf(value);\n\n                // Set boolean/Boolean values and ignore undefined (use default)\n                if (valueType === 'boolean') {\n                    _.set(result, key, value.valueOf());\n                } else if (valueType !== 'undefined') {\n                    throw new Error(`Expected ${key} to be boolean or undefined`);\n                }\n            }\n            return result;\n        }\n    },\n    subdomain: {\n        type: 'string',\n        destPath: 'properties.subdomain',\n        trustedOnly: true\n    },\n    path: {\n        type: 'string',\n        destPath: 'properties.path',\n        trustedOnly: true\n    },\n    query: {\n        type: 'string',\n        destPath: 'properties.query',\n        trustedOnly: true\n    }\n};\n\nAPP_ASSET_CATEGORIES.forEach(currCategory => {\n    INTERAPPTION_PROP_MAPPING_CONFIG[currCategory] = {\n        type: 'object',\n        destPath: `advanced.${currCategory}`\n    };\n});\n\nexport default Ember.Service.extend({\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    intl: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    ajax: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    standaloneAppPool: null,\n    standaloneAppPoolVisible: false, // true when an app route is active\n    widgetAppPool: null,\n    externalUrlExemptIntegrationTypeIds: Ember.get(ENV, 'purecloud-apps.externalUrlExemptIntegrationTypeIds'),\n\n    // Exposed only for automation to test with smaller pool sizes.\n    // These can only be changed prior to loading any apps.\n    standaloneMaxActivePoolSize: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.standalone'),\n    widgetMaxActivePoolSize: Ember.get(ENV, 'purecloud-apps.maxActivePoolSize.widget'),\n\n    // Bypass all (client/server) app caching.  Should only be used internally (Testing/Automation)\n    _bypassAppCache: false,\n\n    // All globally available handlers (not pool or instance specific) will be injected by the instance initializer\n    globalApiHandlers: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set(\n            'standaloneAppPool',\n            AppPool.create(\n                {\n                    poolName: 'standaloneAppPool',\n                    getMaxActive: () => this.get('standaloneMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_findAllStandaloneApps').bind(this),\n                    loadRetryBaseMillis: STANDALONE_LOAD_RETRY_BASE_MILLIS,\n                    loadRetryMaxBackoffMillis: STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                    reloadAppsIntervalMillis: STANDALONE_RELOAD_INTERVAL_MILLIS,\n                    reloadAppsRetryBaseMillis: STANDALONE_RELOAD_RETRY_BASE_MILLIS\n                },\n                Ember.getOwner(this).ownerInjection()\n            )\n        );\n        this.set(\n            'widgetAppPool',\n            AppPool.create(\n                {\n                    poolName: 'widgetAppPool',\n                    getMaxActive: () => this.get('widgetMaxActivePoolSize'),\n                    fetchAppsFn: this.get('_findAllWidgetApps').bind(this),\n                    loadRetryBaseMillis: WIDGET_LOAD_RETRY_BASE_MILLIS,\n                    loadRetryMaxBackoffMillis: WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                    reloadAppsIntervalMillis: WIDGET_RELOAD_INTERVAL_MILLIS,\n                    reloadAppsRetryBaseMillis: WIDGET_RELOAD_RETRY_BASE_MILLIS\n                },\n                Ember.getOwner(this).ownerInjection()\n            )\n        );\n\n        // Listen to local PC-sourced app messages\n        let localMsgListener = Ember.run.bind(this, '_handleLocalMsg');\n        this.set('_localMsgListener', localMsgListener);\n        Ember.$(window).on('message onmessage', localMsgListener);\n    },\n\n    appsSupported: Ember.computed(function () {\n        /* globals Modernizr */\n        return !!(Modernizr && Modernizr.sandbox);\n    }),\n\n    /**\n     * Process the app api call from the app specified in app or appInstance\n     */\n    handleAppApiCall(apiCall, contextualApiHandlers) {\n        this._handleApiCall(apiCall, contextualApiHandlers);\n    },\n\n    /**\n     * Checks if an app instance (App) is trusted or not\n     * It's considered trusted if the App is an internal app (InternallyHostedApp)\n     * or if the app type is part of exempted external URLs.\n     *\n     * This should be used to check if an app can receive internal data or not.\n     *\n     * @param {App} appInstance The app instance\n     * @returns whether the app instance is considered trusted or not\n     */\n    isTrustedApp(appInstance) {\n        return (\n            appInstance instanceof InternallyHostedApp ||\n            this.get('externalUrlExemptIntegrationTypeIds').includes(appInstance.typeId)\n        );\n    },\n\n    /**\n     * Builds and validates Interapptions from the provided config.\n     *\n     * Config must conform to supported properties and the resulting app instance must be valid.\n     * Invalid config or the built app will log in addition to returning null.\n     *\n     * @param {string} typeId - The typeId of the interapption\n     * @param {string} id - The id of the interapption\n     * @param {Object} config - Interapption config\n     * @param {string} config.name - Interapption name\n     * @param {string|string[]} config.sandbox - Interapption sandbox (comma-separated string or array)\n     * @param {string|string[]} config.permissions - Interapption permissions (comma-separated string or array)\n     * @param {string} config.url - Interapption url. Only URL or path can be specified\n     * @param {Object} config.icon - URLs of assets for the icon class of images for this Interapption\n     * @param {Object} config.icon.vector - A URL to a vector icon asset\n     * @param {Object} config.icon.{width}x{height} - A URL to a raster icon asset of the size class indicated by the property\n     * @param {Object} config.monochromicIcon - URLs of assets for the monochrome icon class of images for this Interapption\n     * @param {Object} config.monochromicIcon.vector - A URL to a vector monochrome icon asset\n     * @param {Object} config.monochromicIcon.{width}x{height} - A URL to a raster monochrome icon asset of the size class indicated by the property\n     * @param {Object} config.lifecycle - Lifecycle config\n     * @param {boolean} config.lifecycle.ephemeral - Is app ephemeral\n     * @param {Object} config.lifecycle.hooks - Opt-in lifecycle hooks config\n     * @param {boolean} config.lifecycle.hooks.bootstrap - Should app receive bootstrap event\n     * @param {boolean} config.lifecycle.hooks.focus - Should app receive focus event\n     * @param {boolean} config.lifecycle.hooks.blur - Should app receive blur event\n     * @param {boolean} config.lifecycle.hooks.stop - Should app receive stop event\n     * @param {string} config.subdomain - A subdomain for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.path - A Path for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.query - A querystring for an InternallyHostedApp (Trusted Only)\n     * @param {boolean} trustedProvider - Indicates if this provider can generate trusted apps.\n     *  This should only be used for internal app providers that wish to register internal apps.\n     *  e.g. Altocloud, Relate, Scripter, etc.\n     *\n     * @returns an App or InternallyHostedApp instance if valid; null otherwise\n     */\n    buildValidInterapption(typeId, id, config, trustedProvider = false) {\n        // FUTURE: Support for i10n, full validation, etc. (See: ATEAM-152)\n        if (Ember.typeOf(typeId) !== 'string' || typeId.trim().length === 0) {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty typeId.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (Ember.typeOf(id) !== 'string' || id.trim().length === 0) {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty id.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (Ember.typeOf(config) !== 'object') {\n            this.get('stashLogger').debug(\n                appUtils.buildInterapptionsLogMsg(\n                    'Interapption is being ignored due to an invalid config object type.'\n                ),\n                {\n                    config,\n                    remoteData: {\n                        type: Ember.typeOf(config),\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let normalizedConfig = {\n            properties: {\n                displayType: APP_DISPLAY_TYPES.INTERAPPTION\n            },\n            advanced: {}\n        };\n\n        // Validate and map config properties to normalized config\n        let propError = null;\n\n        let configKeys = Object.keys(config);\n        for (let index = 0; index < configKeys.length; index++) {\n            let currKey = configKeys[index];\n            let currValue = config[currKey];\n            let currPropConfig = INTERAPPTION_PROP_MAPPING_CONFIG[currKey];\n\n            if (!currPropConfig) {\n                propError = `${currKey} is not a supported interapption property`;\n                break;\n            }\n\n            if (currPropConfig.convert) {\n                try {\n                    currValue = currPropConfig.convert(currValue);\n                } catch (e) {\n                    propError = `Failed to convert ${currKey} to a valid input`;\n                    break;\n                }\n            } else if (Ember.typeOf(currValue) !== currPropConfig.type) {\n                propError = `${currKey} should be of type ${currPropConfig.type}`;\n                break;\n            }\n\n            if (currPropConfig.trustedOnly && !trustedProvider) {\n                propError = `${currKey} is only allowed to be configured for trustedProviders`;\n                break;\n            }\n\n            Ember.set(normalizedConfig, currPropConfig.destPath, currValue);\n        }\n\n        if (\n            !propError &&\n            Object.prototype.hasOwnProperty.call(config, 'url') &&\n            (Object.prototype.hasOwnProperty.call(config, 'subdomain') ||\n                Object.prototype.hasOwnProperty.call(config, 'path') ||\n                Object.prototype.hasOwnProperty.call(config, 'query'))\n        ) {\n            propError = 'Cannot specify both a URL and any of subdomain, path, or query';\n        }\n\n        if (propError) {\n            this.get('stashLogger').error(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to invalid config.'),\n                {\n                    config,\n                    details: propError,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let result = this._buildApp(\n            typeId,\n            id,\n            normalizedConfig,\n            trustedProvider && Object.prototype.hasOwnProperty.call(config, 'path')\n        );\n\n        if (!this._isValidApp(result, 'Interapption')) {\n            return null;\n        }\n\n        return result;\n    },\n\n    /**\n     * Handles app postMessage events from the local frame to support app-like\n     * integrations.\n     */\n    _handleLocalMsg(evt) {\n        if (!evt.originalEvent.source || !this._isLocalMsg(evt.originalEvent.source)) {\n            // Not a valid internal app event\n            return;\n        }\n\n        let apiCall = null;\n\n        try {\n            // Strict parse\n            apiCall = parseMessage(evt.originalEvent.data, true);\n        } catch (parseError) {\n            // TECHDEBT: Remove lenient retry after deprecation period; will have to change logic to ensure only error cases are logged\n            if (parseError.message === 'missingProtocol') {\n                try {\n                    // Re-parse leniently to allow for short deprecation period and logging\n                    apiCall = parseMessage(evt.originalEvent.data, false);\n\n                    // Check the action to reduce deprecation log false positives further\n                    if (PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES.indexOf(apiCall.action) >= 0) {\n                        this.get('stashLogger').info(\n                            appUtils.buildApiLogMsg(\n                                'Potential internal apps message posted message without protocol information.  This will be deprecated soon.'\n                            ),\n                            {\n                                apiCall,\n                                remoteData: {\n                                    internalPcCall: apiCall.get('internalPcCall'),\n                                    appId: apiCall.get('appId')\n                                }\n                            }\n                        );\n                    } else {\n                        // No protocol and either an unknown or not a legacy action.\n                        // Safe to assume this is not an apps message or is a new action type which should require the protocol\n                        apiCall = null;\n                    }\n                } catch (ignored) {\n                    // Not a client-apps message (e.g. no action field)\n                }\n            } else if (\n                parseError.message === 'missingAction' &&\n                typeof evt.originalEvent.data === 'object' &&\n                evt.originalEvent.data.protocol\n            ) {\n                // Apps Protocol and no action\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg('(Local) sent an apps message with no action.'),\n                    evt.originalEvent.data\n                );\n            } else {\n                // Not a client-apps message (e.g. invalid payload, unknown protocol, no action)\n            }\n        }\n\n        if (apiCall) {\n            apiCall.set('internalPcCall', true);\n            this._handleApiCall(apiCall);\n        }\n    },\n\n    _isLocalMsg(msgSource) {\n        return msgSource === window;\n    },\n\n    _handleApiCall(apiCall, contextualApiHandlers = []) {\n        if (!apiCall || (!apiCall.get('internalPcCall') && !apiCall.get('appId'))) {\n            // Not a valid app call\n            return;\n        }\n\n        let apiHandlers = contextualApiHandlers.concat(this.get('globalApiHandlers'));\n\n        let appId = apiCall.get('appId');\n        let apiActionDetails = apiCall.get('actionDetails');\n        let asyncHandlerPromise;\n\n        if (apiHandlers.length > 0) {\n            let availHandler = apiHandlers.find(currHandler => {\n                try {\n                    let result = currHandler.canHandle(apiCall);\n\n                    if (Ember.typeOf(result) === 'boolean') {\n                        return result;\n                    } else {\n                        this.get('stashLogger').error(\n                            appUtils.buildApiLogMsg('Handler returned a non-boolean result from canHandle')\n                        );\n                    }\n                } catch (e) {\n                    this.get('stashLogger').error(\n                        appUtils.buildApiLogMsg('Handler threw an Error when running canHandle'),\n                        e\n                    );\n                }\n\n                return false;\n            });\n            if (availHandler) {\n                try {\n                    asyncHandlerPromise = availHandler.handle(apiCall);\n                } catch (error) {\n                    asyncHandlerPromise = Ember.RSVP.reject(error);\n                }\n            } else {\n                asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n            }\n        } else {\n            asyncHandlerPromise = Ember.RSVP.reject('No handler exists for the specified call');\n        }\n        asyncHandlerPromise\n            .then(() => {\n                this._instrumentApiCall(apiCall);\n            })\n            .catch(reason => {\n                this.get('stashLogger').error(\n                    appUtils.buildApiLogMsg(\n                        `${apiCall.get('internalPcCall') ? '(Local)' : 'App'} sent a message that could not be handled.`\n                    ),\n                    {\n                        apiActionDetails,\n                        msgFailureDetails: reason,\n                        remoteData: {\n                            appId,\n                            internalPcCall: apiCall.get('internalPcCall')\n                        }\n                    }\n                );\n            });\n    },\n\n    _instrumentApiCall(apiCall) {\n        if (!(apiCall instanceof ApiCall)) {\n            throw new Error('ApiCall instance must be provided');\n        }\n\n        // Redact any non-standard protocols/agents ... just in case\n        let pcAppProtocol = apiCall.get('protocol');\n        if (pcAppProtocol && pcAppProtocol !== APPS_API_PROTOCOL) {\n            pcAppProtocol = 'redactedProtocol';\n        }\n        let pcAppProtocolAgentName = apiCall.get('protocolAgentName');\n        let pcAppProtocolAgentVersion = apiCall.get('protocolAgentVersion');\n        if (pcAppProtocolAgentName && pcAppProtocolAgentName !== 'purecloud-client-app-sdk') {\n            pcAppProtocolAgentName = 'redactedProtocolAgentName';\n            pcAppProtocolAgentVersion = 'redactedProtocolAgentVersion';\n        }\n\n        // Note: Some details are not applicable in all cases.\n        // Providing the entire payload allows for easy filtering on the PageAction\n        this._addPageAction('clientAppApiCall', {\n            apiAction: apiCall.get('action'),\n            pcAppProtocol,\n            pcAppProtocolAgentName,\n            pcAppProtocolAgentVersion,\n\n            // App Details\n            internalPcCall: apiCall.get('internalPcCall'),\n            pcAppTypeId: apiCall.get('srcApp.typeId'),\n            pcAppId: apiCall.get('srcApp.id'),\n            pcAppDisplayType: apiCall.get('srcApp.displayType'),\n            pcAppInternallyHosted: apiCall.get('srcApp') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: apiCall.get('srcApp.featureCategory'),\n\n            // AppInstance Details\n            pcAppInstanceId: apiCall.get('srcAppInstance.instanceId'),\n            pcAppProblemName: apiCall.get('srcAppInstance.problem.name'),\n\n            // Interapption Details\n            interactionId: apiCall.get('srcApp.interactionId')\n        });\n    },\n\n    _addPageAction() {\n        addPageAction(...arguments);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let localMsgListener = this.get('_localMsgListener');\n        if (localMsgListener) {\n            Ember.$(window).off('message onmessage', localMsgListener);\n            this.set('_localMsgListener', null);\n        }\n\n        // Clean up pools\n        [this.get('standaloneAppPool'), this.get('widgetAppPool')].forEach(currPool => {\n            if (currPool && !currPool.isDestroying && !currPool.isDestroyed) {\n                currPool.destroy();\n            }\n        });\n    },\n\n    _findAllStandaloneApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.STANDALONE);\n    },\n\n    _findAllWidgetApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.WIDGET);\n    },\n\n    findAllInterapptions() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.INTERAPPTION);\n    },\n\n    _fetchAppsByType(type) {\n        return this._fetchAppsByTypeRemote(type);\n    },\n\n    /*\n     * Cache the list of apps for awhile reduce network traffic\n     * due to fetching multiple app types at boot and reload\n     */\n    _remoteAppPromise: null,\n    _remoteAppRequestTimestamp: null,\n    _fetchAppsByTypeRemote(type) {\n        let now = Date.now();\n        let allAppsPromise = this.get('_remoteAppPromise');\n        let lastRequestTs = this.get('_remoteAppRequestTimestamp');\n\n        if (\n            !allAppsPromise ||\n            this.get('_bypassAppCache') ||\n            (lastRequestTs && now - lastRequestTs > REMOTE_APPS_CACHE_TTL_MILLIS)\n        ) {\n            allAppsPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this._accumulateApps(\n                    apps => {\n                        if (apps && apps.length > 1) {\n                            apps.sort((app1, app2) => {\n                                return app1.get('name').localeCompare(app2.get('name'));\n                            });\n                        }\n\n                        resolve(apps);\n                    },\n                    reason => {\n                        // clear the instance's promise on falures so we dont cache failed requests\n                        this.set('_remoteAppPromise', null);\n                        reject(reason);\n                    },\n                    1,\n                    50,\n                    null\n                );\n            });\n            this.set('_remoteAppPromise', allAppsPromise);\n            this.set('_remoteAppRequestTimestamp', now);\n        }\n\n        return allAppsPromise.then(apps => {\n            return apps.filter(currApp => currApp.get('displayType') === type);\n        });\n    },\n\n    _accumulateApps(resolve, reject, pageNumber, pageSize, type, apps) {\n        if (typeof apps === 'undefined' || apps === null) {\n            apps = [];\n        }\n\n        let appsUrl = this.get('application').pcV2Uri(`${APPS_BASE_URL}`);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        appsUrl += `?${Ember.$.param(queryParams, true)}`;\n\n        let headers = {};\n\n        const primaryLocale = this._getPrimaryLocale();\n        if (primaryLocale) {\n            headers['Accept-Language'] = primaryLocale;\n        }\n        if (this.get('_bypassAppCache')) {\n            headers['Cache-Control'] = 'no-cache';\n        }\n\n        this.get('ajax')\n            .request(appsUrl, {\n                headers\n            })\n            .then(result => {\n                if (!result) {\n                    reject('Invalid clientapps return value');\n                    return;\n                }\n\n                if (Array.isArray(result.entities)) {\n                    let validAppObjs = _.chain(result.entities)\n                        .filter(currIntegration => {\n                            return (\n                                currIntegration &&\n                                typeof currIntegration === 'object' &&\n                                Ember.typeOf(Ember.get(currIntegration, 'integrationType.id')) === 'string' &&\n                                !_.isEmpty(Ember.get(currIntegration, 'config.effective.properties'))\n                            );\n                        })\n                        .map(currIntegration => {\n                            let internallyHosted = this._isInternallyHostedApp(currIntegration.integrationType.id);\n                            return this._buildApp(\n                                currIntegration.integrationType.id,\n                                currIntegration.id,\n                                currIntegration.config.effective,\n                                internallyHosted\n                            );\n                        })\n                        .filter(currApp => {\n                            return (\n                                !!currApp &&\n                                this._isValidApp(\n                                    currApp,\n                                    currApp.get('displayType') === APP_DISPLAY_TYPES.INTERAPPTION\n                                        ? 'Interapption'\n                                        : undefined\n                                ) &&\n                                (!type || currApp.get('displayType') === type)\n                            );\n                        })\n                        .value();\n\n                    apps.push(...validAppObjs);\n                }\n\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateApps(resolve, reject, result.pageNumber + 1, pageSize, type, apps);\n                } else {\n                    resolve(apps);\n                }\n            })\n            .catch(reject);\n    },\n\n    _getPrimaryLocale() {\n        let isoLocale = this.get('intl.isoLocale');\n\n        if (Ember.typeOf(isoLocale) === 'string' && Ember.isPresent(isoLocale)) {\n            return isoLocale;\n        } else {\n            this.get('stashLogger').warn(appUtils.buildLogMsg('Unable to find current locale'), {\n                remoteData: {\n                    intlLocale: this.get('intl.locale'),\n                    intlIsoLocale: this.get('intl.isoLocale')\n                }\n            });\n            return null;\n        }\n    },\n\n    _buildApp(typeId, id, config, internallyHosted = false) {\n        let result = null;\n        let langTag = this._getPrimaryLocale();\n\n        // Common app props\n        let appProps = {\n            typeId,\n            id,\n            name: this._parseLangTagProp(config, 'advanced.i10n', langTag, 'name') || Ember.get(config, 'name'),\n            sandbox: this._parseMultiValueProp(config, 'properties.sandbox', ALLOWED_SANDBOX_VALUES),\n            displayType: this._parseProp(config, 'properties.displayType', _.values(APP_DISPLAY_TYPES)),\n            featureCategory: this._parseProp(config, 'properties.featureCategory', _.values(APP_FEATURE_CATEGORIES)),\n            permissionsPolicy: this._parseMultiValueProp(config, 'properties.permissions', ALLOWED_PERMISSION_VALUES),\n            enabledQueueIds: this._parseProp(config, 'properties.queueIdFilterList'),\n            lifecycle: Ember.get(config, 'advanced.lifecycle'),\n            assets: {},\n            // Set runtime state for internal model use\n            langTag: langTag || '',\n            envTld: this.get('application.envDetails.envTld') || '',\n            usePopupAuth: !!this.get('session').get('popoutAuthForIframes'),\n            ucIntegrationKey: this._parseProp(config, 'properties.ucIntegrationKey'), // UC Integration use\n            integrationPresenceSource: this._parseProp(config, 'properties.integrationPresenceSource'), // UC Integration use\n            pbxPermission: this._parseProp(config, 'properties.pbxPermission'), // UC Integration use\n            gcHostOrigin: netUtils.getCurrentWindowOrigin(),\n            gcTargetEnv: this.get('application.runtime.name')\n        };\n\n        // Only attempt to parse communicationTypeFilter when specifed to differentiate undefined/null from []\n        if (!Ember.isNone(Ember.get(config, 'properties.communicationTypeFilter'))) {\n            appProps.enabledCommunicationTypes = this._parseMultiValueProp(\n                config,\n                'properties.communicationTypeFilter',\n                [...INTERAPPTION_COMMUNICATION_TYPE_FILTERS, NO_SUPPORTED_COMMUNICATION_TYPE_FILTER]\n            );\n        }\n\n        if (!internallyHosted) {\n            appProps.urlTemplate = Ember.get(config, 'properties.url');\n            result = App.create(Ember.getOwner(this).ownerInjection(), appProps);\n        } else {\n            appProps.subdomain = Ember.get(config, 'properties.subdomain');\n            appProps.envDetails = this.get('application.envDetails');\n            appProps.path = Ember.get(config, 'properties.path');\n            appProps.query = Ember.get(config, 'properties.query');\n\n            result = InternallyHostedApp.create(Ember.getOwner(this).ownerInjection(), appProps);\n        }\n\n        // Extract assets for each supported asset category\n        APP_ASSET_CATEGORIES.forEach(currAssetCategory => {\n            let currAssetCategoryCfg = {};\n\n            const currVector = Ember.get(config, `advanced.${currAssetCategory}.${VECTOR_IMG_KEY}`);\n            if (currVector) {\n                currAssetCategoryCfg.vector = currVector;\n            }\n            const currRasters = this._extractRasterImgs(config, `advanced.${currAssetCategory}`);\n            if (Object.keys(currRasters).length > 0) {\n                currAssetCategoryCfg.raster = currRasters;\n            }\n\n            const icon = Ember.get(config, `advanced.${currAssetCategory}`);\n            if (icon && icon.guxIcon) {\n                currAssetCategoryCfg.guxIcon = icon.guxIcon;\n            }\n\n            if (Object.keys(currAssetCategoryCfg).length > 0) {\n                result.set(`assets.${currAssetCategory}`, currAssetCategoryCfg);\n            } else if (config) {\n                const advanced = Ember.get(config, `advanced`);\n                if (advanced) {\n                    const assetCategory = Ember.get(advanced, currAssetCategory);\n                    if (assetCategory) {\n                        const classNames = Ember.get(assetCategory, 'classNames');\n                        if (classNames) {\n                            const assets = Ember.get(result, 'assets');\n                            if (!Ember.get(assets, currAssetCategory)) {\n                                Ember.set(assets, currAssetCategory, { classNames });\n                            } else {\n                                Ember.set(assets, `${currAssetCategory}.classNames`, classNames);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n\n        return result;\n    },\n\n    /**\n     * Extract all images of pattern digit(s)xdigit(s) from the basePath\n     */\n    _extractRasterImgs(config, basePath) {\n        let result = {};\n\n        let imgs = Ember.get(config, basePath);\n\n        if (imgs && typeof imgs === 'object') {\n            for (let currImgKey in imgs) {\n                if (currImgKey !== VECTOR_IMG_KEY) {\n                    let parseResult = RASTER_IMG_KEY_REG_EXP.exec(currImgKey);\n                    if (parseResult && parseResult[1] === parseResult[2]) {\n                        result[`x${parseResult[1]}`] = imgs[currImgKey];\n                    }\n                }\n            }\n        }\n\n        return result;\n    },\n\n    _isValidApp(app, appType = 'App') {\n        try {\n            this._validateApp(app);\n\n            return true;\n        } catch (e) {\n            let logMessageAppType = appType === 'App' ? 'App' : 'Interapption';\n            let logLevel;\n            let logMessage;\n\n            switch (e.message) {\n                case 'invalidTypeId':\n                case 'invalidId':\n                case 'invalidName':\n                case 'invalidDisplayType':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing typeId, id, name, or displayType.`;\n                    break;\n                case 'invalidPath':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to a missing/invalid path.`;\n                    break;\n                case 'invalidSubdomain':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an emptystring/invalid subdomain.`;\n                    break;\n                case 'invalidQuery':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an invalid query type.`;\n                    break;\n                case 'missingUrl':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing url.`;\n                    break;\n                case 'invalidUrlProtocol':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an invalid protocol.`;\n                    break;\n                case 'reservedPureCloudDomain':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to use of a PC reserved domain.`;\n                    break;\n                case 'malformedUrl':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unparsable URL.`;\n                    break;\n                case 'unexpectedInterapptionProperty':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unexpected Interaction Widget property.`;\n                    break;\n                default:\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored`;\n                    break;\n            }\n\n            let fullLogMsg = null;\n            if (appType === 'Interapption') {\n                fullLogMsg = appUtils.buildInterapptionsLogMsg(logMessage);\n            } else {\n                fullLogMsg = appUtils.buildLogMsg(logMessage);\n            }\n\n            this.get(`stashLogger.${logLevel}`)(fullLogMsg, {\n                appUrl: app.get('url'),\n                remoteData: { appId: app.get('id') }\n            });\n\n            return false;\n        }\n    },\n\n    _validateApp(app) {\n        if (Ember.typeOf(app.typeId) !== 'string' || app.typeId.trim().length === 0) {\n            throw new Error('invalidTypeId');\n        }\n\n        if (Ember.typeOf(app.id) !== 'string' || app.id.trim().length === 0) {\n            throw new Error('invalidId');\n        }\n\n        if (Ember.typeOf(app.name) !== 'string' || app.name.trim().length === 0) {\n            throw new Error('invalidName');\n        }\n\n        if (Ember.typeOf(app.displayType) !== 'string' || app.displayType.trim().length === 0) {\n            throw new Error('invalidDisplayType');\n        }\n\n        if (app instanceof InternallyHostedApp) {\n            let internalAppPath = app.get('path');\n            if (Ember.typeOf(internalAppPath) !== 'string' || Ember.isBlank(internalAppPath)) {\n                throw new Error('invalidPath');\n            }\n\n            // subdomain can be null, undefined, or non-empty String\n            let internalAppSubdomain = app.get('subdomain');\n            let subdomainType = Ember.typeOf(internalAppSubdomain);\n            if (\n                !(\n                    subdomainType === 'null' ||\n                    subdomainType === 'undefined' ||\n                    (subdomainType === 'string' && internalAppSubdomain.trim().length > 0)\n                )\n            ) {\n                throw new Error('invalidSubdomain');\n            }\n\n            // query can be null, undefined, or a string (blank allowed)\n            let internalAppQuery = app.get('query');\n            if (['null', 'undefined', 'string'].indexOf(Ember.typeOf(internalAppQuery)) < 0) {\n                throw new Error('invalidQuery');\n            }\n        }\n\n        if (Ember.isBlank(app.get('url'))) {\n            throw new Error('missingUrl');\n        }\n\n        // Enforce app URL protocol of http/https (http should primarily be used for development)\n        if (APP_PROTOCOL_CHECK_REG_EXG.exec(app.get('url')) === null) {\n            throw new Error('invalidUrlProtocol');\n        }\n\n        let externalUrl = null;\n        try {\n            // IMPORTANT: In addition to checking internal/external, this checks the validity of the url.  It must be run regardless of app type\n            externalUrl = netUtils.isExternalDomain(app.get('url'));\n        } catch (invalidUrl) {\n            throw new Error('malformedUrl');\n        }\n\n        if (\n            !externalUrl &&\n            !(app instanceof InternallyHostedApp) &&\n            this.get('externalUrlExemptIntegrationTypeIds').indexOf(app.get('typeId')) < 0\n        ) {\n            // Disallow internal URLs on external apps due to sandbox concerns\n            throw new Error('reservedPureCloudDomain');\n        }\n\n        // Interapptions validation\n        if (app.displayType !== APP_DISPLAY_TYPES.INTERAPPTION) {\n            ['interactionId', 'interactionType', 'enabledQueueIds', 'enabledCommunicationTypes'].forEach(currKey => {\n                if (app.get(currKey) !== undefined && app.get(currKey) !== null) {\n                    throw new Error('unexpectedInterapptionProperty');\n                }\n            });\n        }\n\n        return true;\n    },\n\n    _isInternallyHostedApp(integrationTypeId) {\n        return Ember.get(ENV, 'purecloud-apps.internallyHostedIntegrationTypeIds').indexOf(integrationTypeId) >= 0;\n    },\n\n    _parseProp(obj, prop, validItems = null) {\n        let propVal = Ember.get(obj, prop);\n        if (propVal && (validItems === null || validItems.indexOf(propVal) >= 0)) {\n            return propVal;\n        }\n    },\n\n    _parseBooleanProp(obj, prop) {\n        let propVal = Ember.get(obj, prop);\n        if (typeof propVal === 'boolean') {\n            return propVal;\n        }\n        return undefined;\n    },\n\n    _parseMultiValueProp(obj, prop, validItems = null, separator = ',') {\n        let result = [];\n\n        let propVal = Ember.get(obj, prop);\n        if (propVal) {\n            result = propVal.split(separator).reduce((validatedItems, curr) => {\n                if (curr) {\n                    let toCheck = curr.trim();\n\n                    if (toCheck.length > 0 && (validItems === null || validItems.indexOf(toCheck) >= 0)) {\n                        validatedItems.push(toCheck);\n                    }\n                }\n\n                return validatedItems;\n            }, []);\n        }\n\n        return result;\n    },\n\n    // Storage for previous langTag regexp instances\n    _langTagRegExps: {},\n\n    /**\n     * Leniently locate a langTag-specific property within the specified object and baseProp. The\n     * provided langTag will searched in a padding space and case insensitive manor.\n     *\n     * @param {Object} obj - The base object to search\n     * @param {String} baseProp - single or dot-separated list of hierarchical props identifying the base object to search\n     * @param {String} langTag - the bcp47 langTag to search for within obj[baseProp]\n     * @param {String} langTagRelProp - single or dot-separated list of hierarchical props identifying the langTag-relative property to return\n     *\n     * @returns the value of the prop if it is found for the current locale; undefined otherwise.\n     */\n    _parseLangTagProp(obj, baseProp, langTag, langTagRelProp) {\n        if (Ember.typeOf(langTag) !== 'string' || !langTag.trim()) {\n            // Log and return undefined as this is an internal method. No need to throw and handle outside\n            this.get('stashLogger').warn(\n                appUtils.buildLogMsg('Missing/Invalid langTag provided to parse langTag specific prop', {\n                    remoteData: {\n                        langTag\n                    }\n                })\n            );\n\n            return undefined;\n        }\n\n        let result = Ember.get(obj, `${baseProp}.${langTag}.${langTagRelProp}`);\n\n        if (typeof result === 'undefined') {\n            // Check for lenient langTags\n            let baseObj = Ember.get(obj, baseProp);\n            if (baseObj) {\n                let lenientLangTag = langTag.trim().toLowerCase();\n                let langTagRegExp = this._langTagRegExps[lenientLangTag];\n                if (!langTagRegExp) {\n                    langTagRegExp = new RegExp(`^\\\\s*${lenientLangTag}\\\\s*$`, 'i');\n                    this._langTagRegExps[lenientLangTag] = langTagRegExp;\n                }\n\n                let langKey = Object.keys(baseObj).find(key => {\n                    return langTagRegExp.test(key);\n                });\n\n                if (Ember.typeOf(langKey) === 'string') {\n                    result = Ember.get(baseObj, `${langKey}.${langTagRelProp}`);\n                }\n            }\n        }\n\n        return result;\n    }\n});\n","define(\"connections-ui/services/asset-loader\", [\"exports\", \"ember-asset-loader/services/asset-loader\"], function (_exports, _assetLoader) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _assetLoader.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getEntityObjectId, isDirectoryId } from 'ember-purecloud-components/utils/jid-helpers';\n\nconst { RSVP } = Ember;\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isJid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/(?!.*\\/).*@.*$/i);\n}\n\nexport default Ember.Service.extend(LoggerMixin, {\n    store: Ember.inject.service(),\n    peopleQueue: {},\n    groupQueue: {},\n\n    getUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(id, 'person', resolve);\n        });\n    },\n\n    refreshUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.queueEntity('person', id, resolve);\n        });\n    },\n\n    getChatUser(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'person', resolve);\n        });\n    },\n\n    getGroup(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'group', resolve);\n        });\n    },\n\n    checkCacheForEntity(objectId, entityType, resolve) {\n        let cachedModel = this.get('store').peekRecord(entityType, objectId);\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        if (objectId.indexOf('@') > -1) {\n            const possibleCache = this.get('store').peekAll(entityType);\n            if (possibleCache) {\n                cachedModel = possibleCache.findBy('jid', objectId);\n            }\n        }\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        this.queueEntity(entityType, objectId, resolve);\n    },\n\n    queueEntity(entityType, entityId, resolve) {\n        let possibleJid = entityId;\n        if (isJid(entityId)) {\n            entityId = getEntityObjectId(entityId);\n        }\n\n        if (!isGuid(entityId) && !isDirectoryId(entityId) && !isDirectoryId(getEntityObjectId(entityId))) {\n            const placeholder = this.get('store').push({\n                data: {\n                    type: entityType,\n                    id: entityId,\n                    _id: entityId,\n                    general: {\n                        name: [\n                            {\n                                labelKey: 'name',\n                                value: entityId\n                            }\n                        ]\n                    }\n                }\n            });\n            return resolve(placeholder);\n        }\n\n        let queue = {};\n        switch (entityType) {\n            case 'person':\n                queue = this.get('peopleQueue');\n                break;\n            case 'group':\n                queue = this.get('groupQueue');\n                break;\n        }\n        if (queue[possibleJid] == null) {\n            queue[possibleJid] = [];\n        }\n        queue[possibleJid].push(resolve);\n        this.scheduleQueues();\n    },\n\n    scheduleQueues() {\n        Ember.run.debounce(this, this._scheduleQueues, 500);\n    },\n\n    _scheduleQueues() {\n        Ember.run.once(this, this._handleQueues);\n    },\n\n    _handleQueues() {\n        if (!(this.isDestroyed || this.isDestroying)) {\n            const people = this.clearQueue('peopleQueue');\n            const groups = this.clearQueue('groupQueue');\n\n            if (!_.isEmpty(people)) {\n                this.processQueue('person', people);\n            }\n            if (!_.isEmpty(groups)) {\n                this.processQueue('group', groups);\n            }\n        }\n    },\n\n    clearQueue(queue) {\n        const value = this.get(queue);\n        this.set(queue, {});\n        return value;\n    },\n\n    processQueue(entityType, queue) {\n        const ids = _.keys(queue);\n        this.logger.debug('BATCH: Processing queue', entityType, ids.length);\n\n        return this.get('store')\n            .findMany(entityType, ids, FL[entityType])\n            .then(results => {\n                return this.resolveResults(entityType, queue, results);\n            })\n            .catch(err => {\n                this.logger.error('BATCH: Failed to fetch entities in bulk:', {\n                    entityType,\n                    ids: ids.length < 25 ? ids.join(',') : ids.length,\n                    err\n                });\n                return this.resolveResults(entityType, queue, []);\n            });\n    },\n\n    resolveResults(entityType, queue, results) {\n        const ids = Object.keys(queue);\n\n        _.forEach(results, entity => {\n            // entities are requested/queued by jid, id (guid) or id (_id, mongoid)\n            ['id', 'jid', '_id'].forEach(id => {\n                const entityId = entity.get(id);\n                const promises = queue[entityId];\n                if (promises) {\n                    promises.forEach(resolve => resolve(entity));\n                }\n                _.remove(ids, id => id === entityId);\n            });\n        });\n\n        if (ids.length > 0) {\n            const missingIds = ids.length < 100 ? ids.join(',') : ids.length;\n            this.logger.info(\n                'BATCH: Queue had remaining items not resolved, resolving with placeholder for single request:',\n                {\n                    entityType,\n                    missingIds\n                }\n            );\n            _.forEach(ids, id => {\n                const keyId = id;\n                if (isJid(id)) {\n                    id = getEntityObjectId(id);\n                }\n                const placeholder = this.get('store').push({\n                    data: {\n                        type: entityType,\n                        id: id,\n                        _id: id,\n                        general: {\n                            name: [\n                                {\n                                    labelKey: 'name',\n                                    value: id\n                                }\n                            ]\n                        }\n                    }\n                });\n\n                _.forEach(queue[keyId], resolve => resolve(placeholder));\n            });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport CacheChatRoomsMixin from '../mixins/cache-chat-rooms';\nimport ChatMessage from '../models/chat-message';\nimport ChatRoom from '../models/chat-room';\nimport ChatEvents from '../mixins/chat-service/chat-events';\nimport BatchDataRequests from '../mixins/batch-data-requests';\nimport MessageNotificationsMixin from '../mixins/chat-service/message-notifications';\nimport moment from '../utils/dates';\nimport timeoutPromise from '../utils/timeout-promise';\nimport { markdownToHtml } from '../utils/markdown';\nimport MessageSplitting from '../mixins/chat-service/message-splitting';\nimport {\n    compareJids,\n    getEntityObjectId,\n    isRoomJid,\n    isSupervisorJid,\n    isAcdJid\n} from 'ember-purecloud-components/utils/jid-helpers';\nimport { task, timeout } from 'ember-concurrency';\nimport { v4 as uuid } from 'uuid';\n\nconst Promise = Ember.RSVP.Promise;\nconst respondingTimeout = {};\nconst preferencePaths = {\n    interactionNotificationVolume: 'chat.interactionNotificationVolume',\n    chatNotificationVolume: 'chat.chatNotificationVolume'\n};\n\nconst mixins = [\n    Ember.Evented,\n    ChatEvents,\n    BatchDataRequests,\n    CacheChatRoomsMixin,\n    MessageNotificationsMixin,\n    MessageSplitting\n];\n\nexport const supportedChatWidgets = [\n    'jira',\n    'salesforce',\n    'pagerduty',\n    'videoNotification' // New stanza returned when using useVoltVideoMessages\n];\n\nexport default Ember.Service.extend(...mixins, {\n    batchDataRequests: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n    // timeline: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    store: Ember.inject.service(),\n    settings: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n\n    applicationController: null,\n\n    widgets: supportedChatWidgets,\n    firstRoomChosen: false,\n    responding: {},\n    popoutRoom: null,\n    activeRoom: null,\n    activeEmpty: null,\n    messagesPerHistoryRequest: 25,\n    maxHistoryRequestSize: 100,\n\n    dashboardRooms: [],\n    mutedRooms: [],\n    roomHistoryStack: [],\n    replyMessage: null,\n\n    collabChatShowChatSplat: false,\n\n    // clean up after chat decomp goes GA\n    useChatBetaCleanUp: true,\n\n    canCorrectMessages: Ember.computed.reads('connected'),\n\n    initializePreferences: Ember.on('init', function () {\n        let preferences = this.get('preferences');\n\n        preferences\n            .getPreference('chat.mutedRooms')\n            .then((mutedRoomsValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const mutedRooms = JSON.parse(mutedRoomsValue);\n                if (mutedRooms && !this.isDestroyed) {\n                    this.set('mutedRooms', mutedRooms);\n                }\n            })\n            .catch(e =>\n                Ember.Logger.error('Error getting preference (mutedRooms):', {\n                    error: e,\n                    remoteData: {\n                        preference: 'mutedRooms'\n                    }\n                })\n            );\n\n        preferences\n            .getPreference('chat.roomHistoryStack')\n            .then((roomHistoryStackValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const roomHistoryStack = JSON.parse(roomHistoryStackValue);\n                if (roomHistoryStack && !this.isDestroyed) {\n                    this.set('roomHistoryStack', roomHistoryStack);\n                }\n            })\n            .catch(e =>\n                Ember.Logger.error('Error getting preference:', {\n                    error: e,\n                    remoteData: {\n                        preference: 'roomHistoryStack'\n                    }\n                })\n            );\n    }),\n\n    isEditing: Ember.computed('activeRoom.messages.@each.isEditing', function () {\n        if (!this.get('activeRoom')) {\n            return false;\n        }\n\n        let messages = this.get('activeRoom.messages');\n        if (!messages) {\n            return false;\n        }\n\n        return !_.isEmpty(messages.filterBy('isEditing'));\n    }),\n\n    _chatNotificationVolume: 50,\n    chatNotificationVolume: Ember.computed('_chatNotificationVolume', {\n        get: function () {\n            return this.get('_chatNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.chatNotificationVolume, val);\n            this.set('_chatNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    _interactionNotificationVolume: 50,\n    interactionNotificationVolume: Ember.computed('_interactionNotificationVolume', {\n        get: function () {\n            return this.get('_interactionNotificationVolume');\n        },\n        set: function (key, val) {\n            this.get('preferences').setPreference(preferencePaths.interactionNotificationVolume, val);\n            this.set('_interactionNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    allowUserRemoval: false,\n\n    init() {\n        this._super(...arguments);\n        this._initNotificationVolumes();\n        this._setupRateLimitListener();\n        this._startWatchVideoParticipantCount();\n    },\n\n    _startWatchVideoParticipantCount() {},\n\n    _initNotificationVolumes: function () {\n        Ember.run.next(() => {\n            const preferences = this.get('preferences');\n            if (!preferences) {\n                return;\n            }\n\n            preferences.getPreference(preferencePaths.chatNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_chatNotificationVolume', val);\n                }\n            });\n\n            preferences.getPreference(preferencePaths.interactionNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_interactionNotificationVolume', val);\n                }\n            });\n        });\n    },\n\n    setMessageReply(message) {\n        this.set('replyMessage', message);\n    },\n\n    _setupRateLimitListener() {\n        this.get('ajax').on('rateLimited', this, this._handleRateLimit);\n    },\n\n    _handleRateLimit(data) {\n        if (data && data.url && data.options) {\n            try {\n                let url = new URL(data.url);\n                let options = data.options;\n                let requestingJids = options.data && options.data.jid && options.data.jid.length > 0;\n                if (url.pathname.indexOf('users') > -1 && requestingJids) {\n                    // We are loading up jids for chat and got rate limited. Let's notify the user.\n                    Ember.run.debounce(this, this._notifyRosterRateLimit, 500);\n                }\n            } catch (error) {\n                // Ignore error\n            }\n        }\n    },\n\n    _notifyRosterRateLimit() {\n        let title = this.get('intl').t('chat.roster.errors.rateLimit.title').toString();\n        let message = this.get('intl').t('chat.roster.errors.rateLimit.message').toString();\n        this.get('notification').info(title, message, {\n            tag: 'chat-rate-limit',\n            hideAfter: 20\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forEach(respondingTimeout, value => {\n            Ember.run.cancel(value);\n        });\n\n        this.get('ajax').off('rateLimited', this, this._handleRateLimit);\n    },\n\n    saveMutedRooms: Ember.observer('mutedRooms.[]', function () {\n        this.get('preferences').setPreference('chat.mutedRooms', JSON.stringify(this.get('mutedRooms')));\n    }),\n\n    saveRoomHistoryStack: Ember.observer('roomHistoryStack.[]', function () {\n        this.get('preferences').setPreference('chat.roomHistoryStack', JSON.stringify(this.get('roomHistoryStack')));\n    }),\n\n    addResponder(room, person) {\n        var responding, respondingTimeoutId;\n        if (!person.get('name') && isAcdJid(room)) {\n            person.set('name', this.get('intl').t('purecloud.acdInteraction.chats.customerName'));\n        }\n        if (person.get('id') !== this.get('session.person.id')) {\n            responding = this.get('responding');\n            if (!Object.prototype.hasOwnProperty.call(responding, room)) {\n                responding[room] = Ember.A();\n            }\n            responding[room].addObject(person.get('name'));\n            respondingTimeoutId = room + '-' + person.get('id');\n            Ember.run.cancel(respondingTimeout[respondingTimeoutId]);\n            respondingTimeout[respondingTimeoutId] = Ember.run.later(\n                this,\n                function () {\n                    return this.removeResponder(room, person.get('name'), person.get('jid'));\n                },\n                20000\n            );\n            return this.notifyPropertyChange('responding');\n        }\n    },\n\n    removeResponder(room, person, from) {\n        if (!_.isEmpty(this.get('responding')[room])) {\n            this.get('responding')[room].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n        if (!_.isEmpty(this.get('responding')[from])) {\n            this.get('responding')[from].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n    },\n\n    sendChatState(jid, state) {\n        return this.getChatRoom(jid).then(room => {\n            if (room.get('participants.length') < 2) {\n                return false;\n            }\n            return this.get('streaming.connection') && this.get('streaming.connection').sendChatState(jid, state);\n        });\n    },\n\n    toggleRoomMuted(roomJid) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.get('mutedRooms');\n            if (this.roomMuted(roomJid)) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    setRoomMuted(roomJid, muted) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.get('mutedRooms');\n            if (!muted) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    roomMuted(roomJid) {\n        var mutedRooms;\n        mutedRooms = this.get('mutedRooms');\n        return roomJid && mutedRooms && mutedRooms.any(jid => jid === roomJid);\n    },\n\n    getRecents() {\n        return new Promise(function (resolve, reject) {\n            this.get('streaming.connection').getRecents(function (error, recents) {\n                if (error) {\n                    reject(error);\n                } else {\n                    resolve(recents);\n                }\n            });\n        });\n    },\n\n    clearRoomUnreadMessages(room) {\n        return room.clearUnreadMessages();\n    },\n\n    addRoomToDashboard(room) {\n        return this.get('dashboardRooms').addObject(room);\n    },\n\n    messageFailedToSend(room, time) {\n        room.get('messages').forEach(function (message) {\n            if (message.id === null && message.time._d.toString() === time._d.toString()) {\n                message.setProperties({\n                    sendError: true,\n                    pending: false\n                });\n            }\n        });\n    },\n\n    sendMessageProxy(jid, room, message, options) {\n        if (message.length > 4000) {\n            let messageQueue = this._splitOverSizedMessage(message);\n            messageQueue = this._convertSplitMessagesToWidgets(room, messageQueue);\n            return this.sendSplitMessageQueue(room, messageQueue);\n        } else {\n            return this.sendMessageToRoom(jid, message, options);\n        }\n    },\n\n    sendMessageToRoom(jid, text, options) {\n        return new Promise((resolve, reject) => {\n            if (!jid || (text && text.length <= 0 && !options)) {\n                Ember.Logger.error(`JID and not-empty message required to send message ${jid}, ${text}`);\n                reject('send failure');\n            }\n\n            this.get('streaming.connection').setActive(jid);\n\n            this.getChatRoom(jid).then(room => {\n                let id, timeoutIdentifier;\n                this.clearRoomUnreadMessages(room);\n\n                const sendCallback = (error, message) => {\n                    Ember.run.cancel(timeoutIdentifier);\n                    if (error) {\n                        Ember.Logger.error('Error in message send', {\n                            jid,\n                            error\n                        });\n                        reject(id);\n                    } else {\n                        if (message.oid) {\n                            room.clearPending(message);\n                        }\n                        resolve(null);\n                    }\n                };\n\n                timeoutIdentifier = Ember.run.later(this, sendCallback, 'timeout-error', null, 25000);\n\n                if (options) {\n                    id = this.get('streaming.connection').sendMessage(options, sendCallback);\n                } else {\n                    id = this.get('streaming.connection').sendMessage(jid, text, sendCallback);\n                }\n            });\n        });\n    },\n\n    sendVideoProviderNotification(room, provider) {\n        if (room && !room.get('isAcdRoom')) {\n            let to = room.get('jid');\n            let body = provider.get('notification');\n            let data = provider.get('data') || {};\n\n            if (!body) {\n                return;\n            }\n\n            let stanza = {\n                name: `${provider.get('id')}-notification`,\n                contents: JSON.stringify(data)\n            };\n            let children = [stanza];\n            let options = { to, body, children };\n            this.get('streaming.connection').sendMessage(options, (error, message) => {\n                room.clearPending(message);\n            });\n        }\n    },\n\n    removeAttachment(fileDescriptor) {\n        let keys = Object.keys(fileDescriptor);\n        if (!keys.length) {\n            return Promise.resolve();\n        } else {\n            let url = fileDescriptor[keys[0]];\n            let request = this.get('ajax').del(url, { dataType: '' });\n            return Promise.cast(request);\n        }\n    },\n\n    joinScreenShareRoomViaHawk(roomJid, rejoiningRoom = false) {\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    room.set('joinError', null);\n                    room.set('activated', true);\n                    if (!rejoiningRoom) {\n                        room.set('lastMessageTime', moment());\n                    }\n                    resolve(room);\n                });\n            }),\n            8000,\n            `chat#joinRoomViaHawk: ${roomJid}`\n        );\n    },\n\n    checkJid(roomJid) {\n        if (!roomJid) {\n            return `adhoc-${uuid()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            return `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return roomJid;\n    },\n\n    joinRoom(roomJid, rejoiningRoom = false) {\n        if (!roomJid) {\n            roomJid = `adhoc-${uuid()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    this.get('streaming.connection').joinRoom(roomJid, err => {\n                        if (err) {\n                            room.set('joinError', err);\n                        } else {\n                            room.set('joinError', null);\n                            room.set('activated', true);\n                            room.loadDeferredParticipants();\n                        }\n\n                        this.get('streaming.connection').setActive(roomJid);\n                        if (!rejoiningRoom) {\n                            room.set('lastMessageTime', moment());\n                        }\n                        resolve(room);\n                    });\n                });\n            }),\n            8000,\n            `chat#joinRoom: ${roomJid}`\n        );\n    },\n\n    /**\n     * Used to do local updates when a room is joined. The actual work to join a room via\n     * realtime has been moved to collaborate-chat.\n     */\n    joinRoomEvent(room, err, rejoiningRoom = false) {\n        if (err) {\n            room.set('joinError', err);\n        } else {\n            room.set('joinError', null);\n            room.set('activated', true);\n            room.loadDeferredParticipants();\n        }\n        if (!rejoiningRoom) {\n            room.set('lastMessageTime', moment());\n        }\n        return room;\n    },\n\n    syncPendingRoomWithStreamingService(room) {\n        return new Promise(resolve => {\n            this.addRoomToCache(room);\n            const participants = room.get('participants');\n            //room.set('participants', []);\n            this.joinRoom(room.jid).then(room => {\n                this.changeActiveRoom(room);\n                room.set('pendingRoom', false);\n                room.set('showingVideo', true);\n                participants.forEach(person => {\n                    this.inviteToRoom(room, person);\n                });\n                resolve(room);\n            });\n        });\n    },\n\n    joinAcdRoom(roomJid) {\n        // ACD room jids from conversation service are in the form\n        // `{id}@conference.{orgId}.orgspan.com`\n        // but we should use the form\n        // `{id}@conference.{orgShortName}.orgspan.com`\n        const roomId = roomJid.split('@')[0];\n        roomJid = `${roomId}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n\n        return timeoutPromise(\n            new Promise((resolve, reject) => {\n                return this.get('streaming.connection').joinRoom(roomJid, () => {\n                    Ember.run(() => {\n                        Ember.run.schedule('actions', err => {\n                            if (err) {\n                                return reject(err);\n                            }\n                            this.get('streaming.connection').setActive(roomJid);\n                            return this.getChatRoom(roomJid).then(function (room) {\n                                room.set('lastMessageTime', moment());\n                                return resolve(room);\n                            });\n                        });\n                    });\n                });\n            }),\n            4000,\n            'chat#joinAcdRoom'\n        );\n    },\n\n    leaveAcdRoom(roomJid) {\n        let request = new Promise((resolve, reject) =>\n            this.get('streaming.connection').leaveRoom(roomJid, err => (err ? reject(err) : resolve()))\n        );\n        request = timeoutPromise(request, 4000, 'chat#leaveAcdRoom');\n\n        request.catch(err => {\n            Ember.Logger.error(`chat#leaveAcdRoom error for jid '${roomJid}'`, err);\n\n            return Ember.RSVP.reject(err);\n        });\n\n        return request;\n    },\n\n    newRoom(jid) {\n        return ChatRoom.create(\n            {\n                jid: jid,\n                objectId: getEntityObjectId(jid)\n            },\n            Ember.getOwner(this).ownerInjection()\n        );\n    },\n\n    makeNewEmptyRoom() {\n        return new Promise(resolve => {\n            this.joinRoom()\n                .then(room => {\n                    return this.changeActiveRoom(room);\n                })\n                .then(room => {\n                    this.addEmptyRoomObserver(room);\n                    resolve(room);\n                });\n        });\n    },\n\n    addEmptyRoomObserver(room) {\n        var handler, i, key, keys, len;\n        this.set('activeEmpty', room);\n        keys = ['messages.length', 'participants.length', 'activated', 'subject'];\n        handler = () => {\n            var i, key, len, roomIsDirty;\n            if (!room.get('initialSubject')) {\n                room.set('initialSubject', room.get('subject'));\n            }\n            roomIsDirty =\n                room.get('messages.length') > 0 ||\n                room.get('participants.length') > 1 ||\n                room.get('subject') !== room.get('initialSubject') ||\n                !room.get('activated');\n            if (roomIsDirty) {\n                this.set('activeEmpty', null);\n                for (i = 0, len = keys.length; i < len; i++) {\n                    key = keys[i];\n                    room.removeObserver(key, handler);\n                }\n            }\n            return null;\n        };\n        for (i = 0, len = keys.length; i < len; i++) {\n            key = keys[i];\n            room.addObserver(key, handler);\n        }\n    },\n\n    addPersonToRoom(room, person) {\n        if (room.get('pendingRoom')) {\n            room.addParticipant(person);\n        } else {\n            if (room.isOneToOneRoom()) {\n                const oneToOneTarget = room.get('oneToOneTarget');\n                return this.makeNewEmptyRoom().then(newRoom => {\n                    this.trigger('oneToOneChangeToGroup', room, newRoom);\n                    this.inviteToRoom(newRoom, oneToOneTarget);\n                    this.inviteToRoom(newRoom, person);\n                });\n            } else {\n                this.inviteToRoom(room, person);\n                return Ember.RSVP.resolve();\n            }\n        }\n    },\n\n    inviteToRoom(room, user) {\n        this.get('streaming').inviteToRoom(room, user);\n    },\n\n    requestHistory(room, options) {\n        return new Promise((resolve, reject) => {\n            if (!room.get('activated') && !room.get('oneToOneTarget')) {\n                return reject(new Error('room must be activated before you can request history'));\n            }\n\n            const historyOptions = {\n                jid: options.jid,\n                before: options.before,\n                after: options.after,\n                limit: options.limit || this.get('messagesPerHistoryRequest')\n            };\n            this.get('streaming.connection').getMessages(historyOptions, (err, messages) => {\n                if (err) {\n                    return reject(err);\n                }\n                if (options.history) {\n                    messages = this.markAsHistory(messages);\n                }\n                return resolve(this.loadUsersForHistory(messages));\n            });\n        });\n    },\n\n    markAsHistory(messages) {\n        var i, len, message;\n        for (i = 0, len = messages.length; i < len; i++) {\n            message = messages[i];\n            message.history = true;\n        }\n        return messages;\n    },\n\n    setRoomSubject(room, subject, callback) {\n        if ((subject != null ? subject.length : void 0) > 0) {\n            return this.get('streaming.connection').setRoomSubject(room.get('jid'), subject, callback);\n        }\n    },\n\n    setPresence(presence) {\n        return this.get('streaming.connection').setPresence(presence);\n    },\n\n    setOrganizationPresenceId(presenceId) {\n        return this.get('streaming.connection').setOrganizationPresenceId(presenceId);\n    },\n\n    setStatus(status) {\n        return this.get('streaming').setStatus(status, this.get('session.person'));\n    },\n\n    openRoom(jid) {\n        return this.oldOpenRoom(jid);\n    },\n\n    oldOpenRoom(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.changeActiveRoom(room);\n        });\n    },\n\n    /**\n       @desc Opens the video panel in the chat room with the given JID.\n       @param {string} jid\n       @returns {Promise}\n    */\n    async openChatRoomWithVideo(jid) {\n        this.get('application').openChatRoomWithVideo(jid);\n    },\n\n    /**\n       @desc Opens the video panel in the chat room for the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async openChatRoomWithVideoForPersonById(id) {\n        const person = await this.get('store').findRecord('person', id);\n        this.logger.info('opening chat room with video for', person);\n        return this.openChatRoomWithVideo(person.get('jid'));\n    },\n\n    async openChatRoomForPersonById() {},\n\n    loadChatRoom(jid) {\n        return this.getChatRoom(jid).then(room => this.changeActiveRoom(room));\n    },\n\n    /**\n     * Syncs the authenticated user's chat data.\n     * Goal is to sync roster sort order, fetch badges, and fetch recent messages.\n     */\n    async syncUserChatData() {\n        try {\n            // sync the roster order\n            await this.syncAllRoomsLastMessageTime();\n            // fetch all badges\n            const roster = this.get('roster');\n            await roster.getAllBadgeCounts();\n\n            // fetch recent messages\n            const activeRoom = this.get('activeRoom');\n\n            this.logger.debug('<services/chat> syncUserChatData loading room history for room: ', activeRoom);\n            await this.loadRoomHistory(activeRoom);\n        } catch (err) {\n            this.logger.error('<services/chat> syncUserChatData failed: ', err);\n        }\n    },\n\n    /**\n     * Fetch the active chats from Realtime\n     */\n    getActiveChatsFromRealtime() {\n        return new Promise((resolve, reject) => {\n            this.get('streaming.connection').getActiveChats((err, activeRooms) => {\n                if (err) {\n                    return reject(err);\n                }\n                resolve(activeRooms);\n            });\n        });\n    },\n\n    /**\n     * Use the active chats and sync the last message radix. If the user has their roster\n     * sort order as 'Most Recent', then this will sync their roster.\n     */\n\n    async syncAllRoomsLastMessageTime() {\n        const activeChatsFromRealtime = await this.getActiveChatsFromRealtime();\n        const jids = Object.keys(activeChatsFromRealtime);\n        for (let i = 0; i < jids.length; i++) {\n            const room = await this.getChatRoom(jids[i]);\n            const { last } = activeChatsFromRealtime[jids[i]];\n            if (last) {\n                const time = moment(last);\n                room.set('lastMessageTime', time);\n                room.set('lastMessageTimeRadix', time.valueOf());\n            }\n        }\n    },\n\n    checkActiveRoomAgainstHistory(room) {\n        var historyStack, jid, lastActiveRoom, mostRecent;\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        jid = room.get('jid');\n        historyStack = this.get('roomHistoryStack');\n        lastActiveRoom = this.get('roomHistoryStack.lastObject');\n        mostRecent = this.get('mostRecentActiveRoom');\n        if (!isSupervisorJid(jid)) {\n            if (!!this.get('popoutRoom')) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(this.get('popoutRoom'));\n            } else if (jid === lastActiveRoom) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(room);\n            } else if (!mostRecent || (historyStack && historyStack.indexOf(jid) > historyStack.indexOf(mostRecent))) {\n                this.set('mostRecentActiveRoom', jid);\n                this.get('selectHighestAppearingActiveRoom').perform();\n            }\n        }\n    },\n\n    selectHighestAppearingActiveRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n\n        if (this.get('firstRoomChosen')) {\n            return;\n        }\n        this.set('firstRoomChosen', true);\n        return this.getChatRoom(this.get('mostRecentActiveRoom')).then(room => this.changeActiveRoom(room));\n    }).drop(),\n\n    clearRoomNotificationCounts(room) {\n        return this.get('roster').clearRoomNotificationCounts(room);\n    },\n\n    changeActiveRoom(newActive) {\n        var previousActiveRoom;\n        previousActiveRoom = this.get('activeRoom');\n        return this.attemptRoomChange(newActive).then(() => {\n            this.removeRoomFromHistoryStack(newActive);\n            this.addRoomToHistoryStack(newActive);\n            if (previousActiveRoom) {\n                this.clearRoomNotificationCounts(newActive);\n                this.clearRoomUnreadMessages(previousActiveRoom);\n                previousActiveRoom.pruneMessages();\n            }\n\n            if (this.get('allowUserRemoval') && !newActive.isOneToOneRoom() && !newActive.get('isAcdRoom')) {\n                return this.setRoomDetails(newActive.get('jid'));\n            }\n            return newActive;\n        });\n    },\n\n    closeRoomAndClearCounts(room) {\n        return this.clearRoomNotificationCounts(room)\n            .catch(err => {\n                this.logger.error('Failed to clear counts, closing room anyway', { err, jid: this.room.get('jid') });\n            })\n            .finally(() => this.closeActiveRoom(room));\n    },\n\n    closeActiveRoom(room) {\n        room.set('showingVideo', false);\n        room.updateClosedTimeRadix();\n\n        return this.deactivateRoom(room).then(() => this.get('streaming').setRoomInactive(room));\n    },\n\n    deactivateRoom(room) {\n        var replacementRoomJid, selectRoomPromise;\n        this.removeRoomFromHistoryStack(room);\n        if (room.get('jid') === this.get('activeRoom.jid')) {\n            replacementRoomJid = this.get('roomHistoryStack.lastObject');\n            selectRoomPromise = replacementRoomJid\n                ? this.getChatRoom(replacementRoomJid)\n                : this.get('roster').getNextRoomFromActiveSection();\n            return selectRoomPromise.then(selectedRoom => this.attemptRoomChange(selectedRoom));\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('chatNotificationVolume', deviceVolumes.chatNotificationVolume);\n        this.set('interactionNotificationVolume', deviceVolumes.interactionNotificationVolume);\n        // depending on who calls updateVolumes, skip server could be undefined\n        // in those moments, we shouldn't need to 'save' the preference\n    },\n\n    removeRoomFromHistoryStack(room) {\n        if (room) {\n            return this.get('roomHistoryStack').removeObject(room.get('jid'));\n        }\n    },\n\n    addRoomToHistoryStack(room) {\n        var jid, historyStack;\n        if (room) {\n            jid = room.get('jid');\n            historyStack = this.get('roomHistoryStack');\n            historyStack.removeObject(jid).pushObject(jid);\n            if (historyStack.length > 10) {\n                historyStack = historyStack.slice(historyStack.length - 10);\n            }\n            this.set('roomHistoryStack', historyStack);\n        }\n    },\n\n    attemptRoomChange(room) {\n        return new Promise(resolve => {\n            var activeRoom, activeRoomJid, newRoomJid, ref;\n            activeRoom = this.get('activeRoom');\n            activeRoomJid = this.get('activeRoom.jid');\n            newRoomJid = room != null ? room.get('jid') : void 0;\n            if (activeRoomJid && activeRoomJid !== newRoomJid) {\n                activeRoom.set('active', false);\n            }\n            this.set('activeRoom', room);\n            if (room) {\n                room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n                room.set('active', true);\n                this.activateRoom(room).then(function () {\n                    resolve(room);\n                });\n            } else {\n                resolve(room);\n            }\n        });\n    },\n\n    trackRoomChange(room) {\n        var activeRoom, activeRoomJid, newRoomJid, ref;\n        activeRoom = this.get('activeRoom');\n        activeRoomJid = this.get('activeRoom.jid');\n        newRoomJid = room != null ? room.get('jid') : void 0;\n        if (activeRoomJid && activeRoomJid !== newRoomJid) {\n            activeRoom.set('active', false);\n        }\n        this.set('activeRoom', room);\n        if (room) {\n            room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n            room.set('active', true);\n        }\n        return room;\n    },\n\n    refocusActiveRoom() {},\n\n    activateRoom() {},\n\n    focusRoom(room) {\n        return this.get('streaming.connection').setFocused(room.get('jid'));\n    },\n\n    loadRecentHistoryForAllActiveRooms() {\n        let rooms = this.get('rooms');\n        for (let id in rooms) {\n            if (Object.prototype.hasOwnProperty.call(rooms, id)) {\n                let room = rooms[id];\n                if (\n                    room &&\n                    typeof room.get === 'function' &&\n                    room.get('activated') &&\n                    room.get('lastMessageTimeRadix') > 0\n                ) {\n                    this.loadRecentRoomHistory(room);\n                }\n            }\n        }\n    },\n\n    loadRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            before: room.get('firstMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistoryAfter(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadContextualRoomHistory(room, date) {\n        var afterDate, hash;\n        room.set('loadingHistory', true);\n        afterDate = moment(date).subtract(1, 'ms').toDate();\n        hash = Ember.RSVP.hash({\n            beforePromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                before: date,\n                history: true\n            }),\n            afterPromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                after: afterDate,\n                history: true\n            })\n        });\n        hash.then(hash => {\n            var combinedMessages;\n            combinedMessages = hash.beforePromise.concat(hash.afterPromise.reverse());\n            return this._addHistoryMessages(room, combinedMessages);\n        });\n        hash.catch(function (error) {\n            return Ember.Logger.error('Error loading history for chat room', {\n                jid: room.get('jid'),\n                error\n            });\n        });\n        return hash.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    requestRoomHistory(room, options) {\n        return this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._updateRoomStatus(room, options, messages);\n        });\n    },\n\n    loadRoomHistoryWithOptions(room, options) {\n        room.set('loadingHistory', true);\n        let history = this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._processHistoryResults(room, options, messages);\n        });\n        history.catch(function (error) {\n            Ember.Logger.error('Error loading history for chat room', {\n                error,\n                jid: room.get('jid')\n            });\n            room.set('historyError', true);\n        });\n        return history.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    _processHistoryResults(room, options, messages) {\n        this._updateRoomStatus(room, options, messages);\n        return this._addHistoryMessages(room, messages);\n    },\n\n    _updateRoomStatus(room, options, messages) {\n        if (options.after) {\n            room.set('moreForwardHistoryAvailable', messages.length >= this.get('messagesPerHistoryRequest'));\n        } else {\n            room.set('moreHistoryAvailable', messages.length >= this.get('messagesPerHistoryRequest'));\n        }\n        return messages;\n    },\n\n    _addHistoryMessages(room, messages) {\n        room.addHistoryMessages(messages);\n        return room.get('messages');\n    },\n\n    loadRecentRoomHistory(room) {\n        var maxHistoryRequestSize, options;\n        room.set('loadingHistory', true);\n        maxHistoryRequestSize = this.get('maxHistoryRequestSize');\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            limit: maxHistoryRequestSize\n        };\n        return this.requestHistory(room, options).then(messages => {\n            var i, len, message;\n            if (messages == null) {\n                messages = [];\n            }\n            for (i = 0, len = messages.length; i < len; i++) {\n                message = messages[i];\n                room.addMessage(message);\n            }\n            if (messages.length === maxHistoryRequestSize) {\n                return this.loadRecentRoomHistory(room);\n            } else {\n                room.set('loadingHistory', false);\n                return room;\n            }\n        });\n    },\n\n    _resolveRealtimeDependentCalls: Ember.observer('connected', function () {\n        if (this.get('connected') && this.get('streamingConnectDeferred')) {\n            this.get('streamingConnectDeferred').resolve();\n            this.set('streamingConnectDeferred', null);\n        }\n    }),\n\n    /**\n     * Uses Realtime Chat API to get room details and pass to room model.\n     * @param {string} jid room jid\n     * @returns\n     */\n    setRoomDetails(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.get('ajax')\n                .ajaxGet(this.get('application').pcV2Uri(`api/v2/chats/rooms/${jid}`))\n                .then(details => {\n                    room.processRoomDetails(details);\n                    return room;\n                })\n                .catch(err => {\n                    Ember.Logger.error('service/chat setRoomDetails: ', {\n                        error: err\n                    });\n                    return room;\n                });\n        });\n    },\n\n    async deleteParticipantFromChatRoom(room, participant) {\n        try {\n            await this.get('ajax').delete(\n                this.get('application').pcV2Uri(`api/v2/chats/rooms/${room.jid}/participants/${participant.id}`)\n            );\n            this.removeParticipantFromRoom(room, participant);\n        } catch (err) {\n            throw err;\n        }\n    },\n\n    getStreamingRoomInfo(roomJid) {\n        const getRoomInfo = () => {\n            return new Promise((resolve, reject) => {\n                return this.get('streaming.connection').getRoomInfo(roomJid, function (err, description) {\n                    if (err) {\n                        return reject(err);\n                    } else {\n                        return resolve(description);\n                    }\n                });\n            });\n        };\n\n        const deferred = this.get('streamingConnectDeferred');\n\n        if (deferred) {\n            return deferred.promise.then(getRoomInfo);\n        } else {\n            return getRoomInfo();\n        }\n    },\n\n    updateRoomSubject(room, subject) {\n        return room.set('rawSubject', subject);\n    },\n\n    getTargetRoomJid(arg) {\n        let { to, from } = arg;\n        if (isRoomJid(to)) {\n            return to;\n        } else if (compareJids(to, this.get('session.person.jid'))) {\n            return from;\n        } else {\n            return to;\n        }\n    },\n\n    addParticipantToRoom(room, person) {\n        if (room && person) {\n            return room.addParticipant(person);\n        }\n    },\n\n    removeParticipantFromRoom(room, person) {\n        if (room && person) {\n            return room.removeParticipant(person);\n        }\n    },\n\n    loadRoomAndUser(roomJid, userJid) {\n        return Ember.RSVP.hash({\n            room: this.getChatRoom(roomJid),\n            person: this.get('batchDataRequests').getChatUser(userJid)\n        });\n    },\n\n    loadUsersForHistory(historyMessages) {\n        var message;\n        if (_.isEmpty(historyMessages)) {\n            return Ember.RSVP.resolve(historyMessages);\n        }\n        return Ember.RSVP.all(\n            function () {\n                var i, len, results;\n                results = [];\n                for (i = 0, len = historyMessages.length; i < len; i++) {\n                    message = historyMessages[i];\n                    results.push(this.processNewChatMessage(message));\n                }\n                return results;\n            }.call(this)\n        );\n    },\n\n    processNewChatMessage(message) {\n        const owner = Ember.getOwner(this);\n        let messageBody = this.parseMessageBody(message);\n\n        delete message.body;\n\n        Ember.setOwner(message, owner);\n        let messageModel = ChatMessage.create(message);\n\n        this.parseWidgetData(messageModel);\n\n        messageModel.set('messageBody', messageBody);\n        messageModel.set('time', moment(message.time));\n\n        this.checkForMentions(messageModel);\n\n        return this.get('batchDataRequests')\n            .getChatUser(message.from)\n            .then(person => {\n                messageModel.set('chatUser', person);\n                this.setMessageReadState(messageModel);\n                return messageModel;\n            });\n    },\n\n    parseWidgetData(message) {\n        message.get('stanza.children').forEach(child => {\n            if (this.widgets.indexOf(child.name) >= 0) {\n                let data;\n\n                try {\n                    if (child.name === 'videoNotification' && child.children.length == 0) {\n                        data = child.attrs;\n                    } else {\n                        data = JSON.parse(child.children[0]);\n                    }\n                } catch (e) {\n                    Ember.Logger.error('Error parsing chat widget data', {\n                        name: child.name,\n                        child: child.children[0],\n                        error: e\n                    });\n                    return;\n                }\n\n                message.set('widgetType', child.name);\n                message.set('widget', Ember.Object.create({ data }));\n            }\n        });\n    },\n\n    parseMessageBody(message) {\n        var body, raw;\n        raw = message.raw;\n        body = message.body;\n        if (raw) {\n            return markdownToHtml(raw);\n        } else {\n            return body;\n        }\n    },\n\n    checkForMentions(message) {\n        /* eslint-disable */\n        var match, mention, mentionRegex, mentions, oid, raw;\n        mentions = [];\n        mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        raw = message.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            mention = match[0];\n            oid = match[1];\n            mentions.push(\n                Ember.Object.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        message.set('mentions', mentions);\n        return message.set('hasMentionLinks', mentions.length > 0);\n        /* eslint-enable */\n    },\n\n    setMessageReadState(message) {\n        var roomIsVisible, windowFocused;\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid')) || message.get('history')) {\n            return message.set('unread', false);\n        } else {\n            windowFocused = this.windowInFocus();\n            return message.set('unread', !roomIsVisible || !windowFocused);\n        }\n    },\n\n    isActiveRoom(room) {\n        return this.isActiveRoomJid(Ember.get(room, 'jid'));\n    },\n\n    isActiveRoomJid(jid) {\n        return jid && this.get('activeRoom.jid') === jid;\n    },\n\n    isRoomVisible() {\n        return false;\n    },\n\n    isChatVisible() {\n        return false;\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return !this.get('application.browserHidden');\n        }\n    },\n\n    async popoutChatRoom() {\n        // no op for now\n    },\n\n    handleXMPPReferenceMention(message) {\n        const {\n            stanza: { children },\n            from,\n            to\n        } = message;\n        const personJid = this.get('session.person.jid');\n        const referenceChildren = _.filter(children, {\n            name: 'reference',\n            attrs: {\n                uri: personJid,\n                action: 'SUCCEEDED'\n            }\n        });\n\n        referenceChildren.forEach(() => {\n            this.handleMentionEvent(from, to, message);\n        });\n    },\n\n    async handleMentionEvent(from, room, message) {\n        const user = await this.get('batchDataRequests').getChatUser(from);\n        const chatRoom = await this.getChatRoom(room);\n\n        this.sendMentionNotification(chatRoom, user, message);\n    },\n\n    handleCollaborateChatMessage(message) {\n        const children = message.stanza.children;\n        const isMention = children.findBy('name', 'reference') !== undefined;\n        if (isMention) {\n            this.handleXMPPReferenceMention(message);\n        }\n        const roomJid = this.getTargetRoomJid(message);\n        this.getChatRoom(roomJid).then(room => {\n            this.processNewChatMessage(message).then(async messageModel => {\n                messageModel.set('room', room);\n                if (room.isOneToOneRoom()) {\n                    // this.savePersonalChats(messageModel, room);\n                } else {\n                    // this.savePersonalMentions(messageModel);\n                    // this.saveRoomChats(messageModel, room);\n                    this.get('roster').incrementUnreadGroupMessage(messageModel, room);\n                }\n\n                if (this.get('permissions.canViewBusinessChat')) {\n                    this.sendNotification(messageModel);\n                }\n            });\n        });\n    }\n});\n","define(\"connections-ui/services/clock\", [\"exports\", \"ember-purecloud-components/services/clock\"], function (_exports, _clock) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _clock.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport _ from 'lodash';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport moment from 'connections-ui/utils/dates';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport UriBuilder from '../mixins/conversation-uri-builder';\nimport participantStatus from '../utils/acdParticipantStatuses';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { inject, Evented } = Ember;\nconst { Promise } = Ember.RSVP;\nconst INTERACTION_TYPE = {\n    call: 'calls',\n    chat: 'chats',\n    email: 'emails',\n    callback: 'callbacks',\n    message: 'messages'\n};\n\nexport default Ember.Service.extend(UriBuilder, LoggerMixin, ConversationMixin, Evented, {\n    // Note:\n    //\n    // Most of this was ported from the design pattern we had in Engage.\n    // We'll need to re-evaluate its usage here to determine if this is\n    // still something we want to do or if its a little heavy-handed since\n    // we're not abstracting this logic from all interaction types like\n    // we previously were.\n\n    application: inject.service(),\n    session: inject.service(),\n    store: inject.service(),\n    addressformat: inject.service(),\n    ajax: inject.service(),\n    phone: inject.service(),\n\n    validationWaitTime: isTesting ? 0 : 15000,\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('_timers').forEach(item => Ember.run.cancel(item));\n    },\n\n    getAllActiveConversations() {\n        const url = this.baseUri();\n        return this.makeRequest(url, {}, 'get').then(response => response.entities);\n    },\n\n    getAllActive(communicationType) {\n        const url = this.baseUri();\n        const options = { data: { communicationType } };\n        return this.makeRequest(url, options, 'get').then(response => response.entities);\n    },\n\n    /**\n     * Places a call on the participantForCurrentUser for the given interaction.\n     * @param {Interaction} interaction - the interaction to add a call to\n     * @param {string} number - the number to dial\n     * @param {string} phoneColumn - for a dialer preview/scheduled callback, the phone column associated with the number\n     */\n    addCall(interaction, number, phoneColumn) {\n        const id = interaction.get('id');\n        const url = this.callsUri(id);\n        const options = { data: { callNumber: number, phoneColumn: phoneColumn } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    /**\n     * Schedules a callback for an existing conversation.\n     *\n     * @param {Interaction} interaction - the interaction to schedule a callback for\n     * @param {object} data -\n     *              {array} callbackNumbers - the numbers for the callback\n     *              {string} callbackScheduledTime - ISO8601 string for when to send the callback\n     *                  {object} routingData -\n     *                  {array} preferredAgents - list of preferred agent ids\n     */\n    scheduleCallback(interaction, data) {\n        const customer = interaction.get('participantForCustomer');\n        let queueId = interaction.get('participantForCurrentUser.queueId') || customer.queueId;\n        const callbackUserName = customer.name ? customer.name.toString() : null;\n        const countryCode = this.get('addressformat.countryCode');\n        const id = interaction.get('id');\n\n        if (data && data.routingData) {\n            if (!data.routingData.queueId) {\n                Object.assign(data.routingData, { queueId: queueId });\n            } else {\n                queueId = data.routingData.queueId;\n            }\n        }\n\n        const uri = this.scheduleCallbackUri(id, customer.id);\n        const postData = Object.assign(\n            {},\n            {\n                callbackUserName: callbackUserName,\n                countryCode: countryCode,\n                queueId: queueId\n            },\n            data\n        );\n        const options = { data: postData };\n\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    answer(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interaction.id, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.CONNECTED } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', participantStatus.CONNECTED);\n        });\n    },\n\n    disconnectParticipant(interactionId, participantId, mediaType) {\n        const url = this.participantUri(interactionId, participantId, INTERACTION_TYPE[mediaType]);\n        const options = { data: { state: participantStatus.DISCONNECTED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    hold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: true } };\n\n        if (!Ember.get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to hold non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', true);\n        });\n    },\n\n    unhold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: false } };\n\n        if (!Ember.get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to set hold state for non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', false);\n        });\n    },\n\n    pause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'PAUSED' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', true);\n            }\n        });\n    },\n\n    unpause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'ACTIVE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            if (!this.get('session.features.acdSecurePause')) {\n                return this.validateActionSucceeded(interaction, 'isPaused', false);\n            }\n        });\n    },\n\n    requestAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: true } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    skipAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: false } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnect(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        let options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        //\n        // Note We only want to apply communicationWrapupSkipped to callbacks not within campains. We do this\n        // to prevent wrapup showing now where it did not use to show before.\n        //\n        const isDialerCampaign = Ember.get(interaction, 'isCampaignCallback');\n        const isSkippingPreviewCampaign =\n            isDialerCampaign && Ember.get(interaction, 'selectedWrapupCode.id') === 'ININ-OUTBOUND-PREVIEW-SKIPPED';\n        const hasPlacedCallsInCallback =\n            typeof Ember.get(interaction, 'participantForCurrentUser.calls.firstObject') === 'object';\n        if (\n            Ember.get(interaction, 'useCommunicationACW') &&\n            Ember.get(interaction, 'isCallback') &&\n            hasPlacedCallsInCallback &&\n            !isSkippingPreviewCampaign\n        ) {\n            options.data.communicationWrapupSkipped = true;\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', [\n                undefined,\n                participantStatus.DISCONNECTED\n            ]);\n        });\n    },\n\n    park(interaction) {\n        // PATCH /api/v2/conversations/emails/{id}/participants/{id} + state\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.PARKED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnectCall(interaction) {\n        const conversation = this.get('phone.conversations').findBy('id', interaction.get('id'));\n        if (conversation) {\n            this.trigger('endCall', conversation);\n        }\n    },\n\n    getWrapUpCodes(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const url = this.participantWrapupCodesUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getProvisionalACWNotes(interaction, participantId) {\n        const userId = participantId ? participantId : interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const communicationId = interaction.get('communicationMedia.id');\n        const options = {\n            type: 'GET',\n            data: { provisional: 'true' }\n        };\n        let url = this.participantWrapupUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n        }\n\n        return this.makeRequest(url, options, 'raw');\n    },\n\n    loadParticipantPerson(userId) {\n        if (userId) {\n            if (this.get('store').hasRecordForId('person', userId)) {\n                return Promise.resolve(this.get('store').peekRecord('person', userId));\n            }\n            return this.get('store')\n                .findRecord('person', userId)\n                .catch(error => {\n                    this.logger.error('Unable to retrieve person for participant', { userId, error });\n                    return Promise.resolve();\n                });\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    /**\n     * Fetches the notes based on the participant and their corresponding wrap up object within a\n     * specified interaction. If the notes are within the data already then it prevents the need to\n     * fetch the participants current provisional notes.\n     * @param interaction The currently active interaction\n     * @param {{ wrapup }} param1 Any data object that could contain the wrapup information\n     * @param participantId The id of the participant that the notes are coming from\n     * @returns A promise that resolves to a data object containing wrap up and note information\n     */\n    getParticipantNotes(interaction, { wrapup }, participantId) {\n        if (wrapup) {\n            return Promise.resolve(wrapup);\n        } else {\n            return this.getProvisionalACWNotes(interaction, participantId);\n        }\n    },\n\n    /**\n     * Iterates through all of the historical notes in an interaction and fetches additional information needed\n     * to populate the historical notes timeline. Based on the `useCommunicationACW` model function in an interaction,\n     * it determines where we are pulling the notes from.\n     * @param interaction The currently active interaction\n     * @returns An array of promises to fetch the notes of the interaction\n     */\n    getAllHistoricalACWNotes(interaction) {\n        const currentParticipantId = interaction.get('participantForCurrentUser.id');\n        let promiseArray = [];\n\n        interaction.participants.forEach(participant => {\n            const participantId = participant.id;\n            const userId = participant.userId;\n\n            if (participantId && userId) {\n                if (Ember.get(interaction, 'useCommunicationACW')) {\n                    const media = [...(participant[interaction.type] || participant[`${interaction.type}s`] || [])];\n\n                    //An agent receiving a callback should be able to read notes from all previous calls and callbacks\n                    //So callback interactions need to include data from previous calls (aka participant['calls']), and vice versa\n                    if (interaction.type === 'callback') {\n                        media.push(...(participant['calls'] || []));\n                    }\n\n                    if (interaction.type === 'call') {\n                        media.push(...(participant['callbacks'] || []));\n                    }\n\n                    if (!!media.length) {\n                        /**\n                         * For this implementation we are no longer fetching the other agents provisional notes\n                         * and adding them to the historical timeline. That is why this iteration is not using the\n                         * `getParticipantNotes` function like it is below. We do not need to check if the `purpose`\n                         * value on the participant is equal to `agent` since media items only show up on a\n                         * participants that can add notes and wrap up. In short, this will allow any participant to add\n                         * notes to the timeline if we ever decide to support that elsewhere.\n                         */\n                        promiseArray.push(\n                            ...media\n                                // This filter prevents empty promises and ensures that the array will not have duplicate messages\n                                .filter((data, index, array) => {\n                                    return (\n                                        !!data.wrapup &&\n                                        index ===\n                                            array.findIndex(\n                                                element =>\n                                                    !!element.wrapup &&\n                                                    element.wrapup.endTime === data.wrapup.endTime &&\n                                                    element.wrapup.notes === data.wrapup.notes\n                                            )\n                                    );\n                                })\n                                .map(async data => {\n                                    const { wrapup } = data;\n                                    const person = await this.loadParticipantPerson(userId);\n                                    if (person) {\n                                        wrapup.person = person;\n                                    }\n                                    return wrapup;\n                                })\n                        );\n                    }\n                } else if (\n                    /**\n                     * If the participant object has a `wrapup` object on it then allow it to pass through regardless no matter what the purpose\n                     * of the participant is. However, if there is not a `wrapup` object then we check the `id`'s to prevent the return of the\n                     * current users own provisional notes, and we only want to try and fetch the provisional notes if the purpose is of `agent`.\n                     * This implementation allows the fetching of other agents provisional notes. In contrast, the implementation above does NOT.\n                     * This is intentional and we will want to move to the implementation above eventually.\n                     */\n                    participant.wrapup ||\n                    (currentParticipantId !== participantId && participant.purpose !== 'agent')\n                ) {\n                    promiseArray.push(\n                        this.getParticipantNotes(interaction, participant, participantId).then(async response => {\n                            const result = response.payload || response;\n                            const person = await this.loadParticipantPerson(userId);\n                            if (person) {\n                                result.person = person;\n                            }\n                            return result;\n                        })\n                    );\n                }\n            }\n        });\n\n        return Promise.all(promiseArray);\n    },\n\n    saveProvisionalACW(interaction, { notes, wrapup }) {\n        if (!interaction) {\n            return Ember.RSVP.Promise.reject('No interaction provided.');\n        }\n\n        if (!notes && !wrapup) {\n            return Ember.RSVP.Promise.reject('Nothing to save to provisional ACW');\n        }\n\n        const interactionId = Ember.get(interaction, 'id');\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const mediaType = Ember.get(interaction, 'type');\n        const communicationId = Ember.get(interaction, 'communicationMedia.id');\n        const code = wrapup ? wrapup.id : Ember.get(interaction, 'selectedWrapupCode.id');\n        const name = wrapup ? wrapup.name : Ember.get(interaction, 'selectedWrapupCode.name');\n        notes = notes || Ember.get(interaction, 'notes');\n\n        let method = 'patch';\n        let url = this.participantUri(interactionId, userId, INTERACTION_TYPE[mediaType]);\n        let payload = {\n            wrapup: { provisional: true }\n        };\n\n        if (code && name) {\n            payload.wrapup.code = code;\n            payload.wrapup.name = name;\n        }\n\n        if (notes) {\n            payload.wrapup.notes = notes;\n        }\n\n        if (Ember.get(interaction, 'useCommunicationACW')) {\n            method = 'post';\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n            payload = payload.wrapup;\n        }\n\n        const options = { data: payload };\n        return this.makeRequest(url, options, method);\n    },\n\n    /**\n     * Start a monitor on a participant in a conversation\n     */\n    monitor(callId, participantId) {\n        const url = this.monitorUri(callId, participantId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    transfer(interaction, options, query, entityType = '') {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const interactionType = !this.get('session.features.acdTransferPermissions')\n            ? INTERACTION_TYPE[interaction.get('type')]\n            : null;\n        const url = this.replaceUri(interactionId, userId, null, interactionType, entityType);\n        const transferType = query.transferType || 'Unattended';\n\n        options = options || {};\n        options.data = query;\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this.trigger('callTransferred', interaction);\n\n            if (transferType === 'Attended') {\n                return this.validateActionSucceeded(interaction, 'isAttendedTransferring', true);\n            } else {\n                return this.validateActionSucceeded(interaction, 'interactionState', [\n                    participantStatus.DISCONNECTED,\n                    participantStatus.TERMINATED\n                ]);\n            }\n        });\n    },\n\n    cancelTransfer(interaction, participant) {\n        const interactionId = interaction.get('id');\n        const interactionType = INTERACTION_TYPE[interaction.get('type')];\n        const communicationId = participant[interactionType].get('firstObject.id');\n\n        return this.makeRequest(\n            this.communicationsUri(interactionId, participant.id, interactionType, communicationId),\n            { data: { state: 'disconnected' } },\n            'patch'\n        )\n            .then(() => this.validateActionSucceeded(interaction, 'wasTransferCanceled', true))\n            .catch(error => {\n                this.get('logger').error('There was an issue canceling the transfer', error);\n            });\n    },\n\n    // Once we move interactions to use Ember data, we'll extract this into a stand alone utility.\n    // (https://inindca.atlassian.net/browse/UI-2200)\n    validateActionSucceeded(interaction, attributeToMonitor, expectedValue) {\n        const logger = this.logger;\n        const ajax = this.get('ajax');\n        const userId = this.get('session.person.guid');\n\n        logger.debug('ACD: validateActionSucceeded: Validating interaction', interaction);\n\n        return new Promise((resolve, reject) => {\n            const requestUri = this.baseUri();\n            const communicationType = interaction.get('type');\n            const data = { communicationType };\n            const VALIDATION_INTERVAL = this.get('validationWaitTime');\n\n            const VALIDATION_TIMEOUT = Ember.run.later(function () {\n                return verifyViaAjax();\n            }, VALIDATION_INTERVAL);\n            this.get('_timers').push(VALIDATION_TIMEOUT);\n\n            if (!interaction) {\n                return valResolve();\n            }\n\n            checkForSuccessUpdate();\n            createObserver();\n\n            function valResolve() {\n                destroyObserver();\n                return resolve();\n            }\n\n            function valReject() {\n                destroyObserver();\n                return reject();\n            }\n\n            function createObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer created on ${attributeToMonitor}`);\n                interaction.addObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function destroyObserver() {\n                logger.debug(`ACD: validateActionSucceeded: Observer destroyed on ${attributeToMonitor}`);\n                interaction.removeObserver(`${attributeToMonitor}`, this, checkForSuccessUpdate);\n            }\n\n            function checkForSuccessUpdate() {\n                if (actionHasSucceeded()) {\n                    Ember.run.cancel(VALIDATION_TIMEOUT);\n                    return valResolve();\n                }\n            }\n\n            /**\n             * Formats the expected value to an array with all string expectations lowercase.\n             * @param {string|boolean|undefined|string[]} expectedValue\n             *          The expected value(s)\n             * @returns {[]} An array containing the expected value(s). All strings are lowercased, booleans and 'undefined' are unchanged.\n             */\n            function formatExpectedValue(expectedValue) {\n                if (Array.isArray(expectedValue)) {\n                    let lowercaseValues = _.chain(expectedValue)\n                        .filter(value => typeof value === 'string')\n                        .map(value => value.toLowerCase())\n                        .value();\n                    if (_.includes(expectedValue, undefined)) {\n                        lowercaseValues.push(undefined);\n                    }\n                    return lowercaseValues;\n                } else if (typeof expectedValue === 'string') {\n                    return [expectedValue.toLowerCase()];\n                } else if (typeof expectedValue === 'boolean') {\n                    return [expectedValue];\n                } else if (expectedValue === undefined) {\n                    return [expectedValue];\n                }\n                return [];\n            }\n\n            function actionHasSucceeded() {\n                let formattedExpectedValues = formatExpectedValue(expectedValue);\n\n                let currentValue = interaction.get(`${attributeToMonitor}`);\n                if (typeof currentValue === 'string') {\n                    currentValue = currentValue.toLowerCase();\n                }\n\n                const actionSucceeded = _.includes(formattedExpectedValues, currentValue);\n\n                if (actionSucceeded) {\n                    logger.debug('ACD: validateActionSucceeded: action succeeded for attr ', attributeToMonitor);\n                    return true;\n                }\n\n                return false;\n            }\n\n            function verifyViaAjax() {\n                return timeoutPromise(\n                    new Promise((resolve, reject) => {\n                        logger.debug('ACD: validateActionSucceeded: Will verify via ajax', attributeToMonitor);\n                        return ajax\n                            .ajaxGet(requestUri, { data })\n                            .then(interactions => {\n                                if (interaction && (interaction.isDestroyed || interaction.isDestroying)) {\n                                    logger.debug(\n                                        'ACD: validateActionSucceeded: interaction destroyed while verifying.'\n                                    );\n                                    return resolve();\n                                }\n\n                                let newInteraction = _.find(interactions.entities, { id: interaction.get('id') });\n\n                                if (interaction && newInteraction) {\n                                    interaction.setProperties(newInteraction);\n                                    if (Ember.get(interaction, 'conversation')) {\n                                        interaction.get('conversation').setProperties(newInteraction);\n                                    }\n                                }\n\n                                if (actionHasSucceeded()) {\n                                    return resolve();\n                                }\n\n                                logger.info('Conversation attribute resolved, but never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n\n                                reject('Attribute never updated.');\n                            })\n                            .catch(err => {\n                                logger.error('Conversation attribute never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    error: err,\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n                                reject(err);\n                            });\n                    }),\n                    VALIDATION_INTERVAL,\n                    'communication#verifyViaAjax'\n                )\n                    .then(function () {\n                        return valResolve();\n                    })\n                    .catch(function (err) {\n                        return valReject(err);\n                    });\n            }\n        });\n    },\n\n    /** Begins a consult transfer interaction for the provided participant\n     * with a given address.\n     * @param {string} interaction the model for the call\n     * @param {Object} destination the destination participant to consult with\n     * @param {string} entityType the type of entity participant is consulting with | Values queue, person, ''\n     */\n    initiateConsult(interaction, destination, entityType = '') {\n        const customerId = interaction.get('participantForCustomer.id');\n        const interactionId = interaction.get('id');\n        let data = {\n            speakTo: 'DESTINATION',\n            destination: destination\n        };\n        if (this.get('session.features.acdTransferPermissions') && typeof destination === 'object' && entityType) {\n            data = destination;\n        }\n        const options = { data };\n        const url = this.consultUri(interactionId, customerId, INTERACTION_TYPE[interaction.get('type')], entityType);\n\n        return !customerId\n            ? Ember.RSVP.reject(new Error('customer not present'))\n            : this.makeRequest(url, options, 'post');\n    },\n\n    /** Updates a consult transfer interaction to speak to both consulting parties\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultBoth(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'BOTH' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to Conference\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultConference(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'CONFERENCE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to the destination consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultDestination(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'DESTINATION' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', true),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /**\n     * Updates a consult transfer interaction to speak to the object (customer) consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultObject(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { speakTo: 'OBJECT' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return Ember.RSVP.all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', true)\n            ]);\n        });\n    },\n\n    /**\n     * Cancels a consult transfer interaction\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    cancelConsult(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')]);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    /**\n     * Initiates a shared session (screen share, co-browse, video)\n     *\n     * NOTE: This request does not require the mediaType in URL.  This\n     * is essentially the same URL pattern as v1.\n     *\n     * @param {object} interaction object\n     * @param {object} customer participant\n     */\n    initiateSessionShare(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const mediaType = 'screenshare';\n        const sessionCodeUrl = this.sessionShareCodeUri(interactionId, customerId);\n        const options = { data: { mediaType } };\n\n        if (interaction.get('isV2Provider')) {\n            return this.makeRequest(sessionCodeUrl, options, 'post').then(res => {\n                if (!res.sourceCommunicationId || !res.addCommunicationCode) {\n                    return Ember.RSVP.reject(new Error('No session share code.'));\n                }\n\n                const types = [];\n                if (interaction.get('canCobrowse')) {\n                    types.push('cobrowse');\n                }\n                if (interaction.get('canScreenShare')) {\n                    types.push('screenshare');\n                }\n\n                const url = this.mediaRequestUri(interactionId, 'chats');\n                const toId = interaction.get('participantForCustomer.chats.firstObject.id');\n                const fromId = interaction.get('participantForCurrentUser.chats.firstObject.id');\n                const mediaRequestOptions = {\n                    data: {\n                        types,\n                        state: 'PENDING',\n                        toCommunicationId: toId,\n                        fromCommunicationId: fromId,\n                        communicationId: res.sourceCommunicationId,\n                        securityKey: res.addCommunicationCode\n                    }\n                };\n                return Ember.RSVP.all([Ember.RSVP.resolve(res), this.makeRequest(url, mediaRequestOptions, 'post')]);\n            });\n        }\n\n        return Ember.RSVP.all([this.makeRequest(sessionCodeUrl, options, 'post')]);\n    },\n\n    /**\n     * Ends a shared session (screen share, co-browse, video)\n     * @param {object} interaction object\n     */\n    expireSessionShareCode(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const securityKey = interaction.get('sessionShareCode');\n        const url = this.expireSessionShareCodeUri(interactionId, customerId, securityKey);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    disconnectMediaType(interaction, mediaType, mediaId) {\n        const userId = Ember.get(interaction, 'participantForCurrentUser.id');\n        const interactionId = Ember.get(interaction, 'id');\n        const url = this.disconnectMediaTypeUri(interactionId, mediaId, userId, mediaType);\n        const options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'sessionShareState', 'disconnected');\n        });\n    },\n\n    createEmail: function (queueId, email, externalContactId) {\n        const url = '/platform/api/v2/conversations/emails';\n        const options = {\n            data: {\n                direction: 'OUTBOUND',\n                queueId: queueId,\n                toAddress: email\n            },\n            headers: {\n                'Content-Type': 'application/json'\n            },\n            method: 'post'\n        };\n        if (externalContactId) {\n            options.data.externalContactId = externalContactId;\n        }\n        return this.makeRequest(url, options);\n    },\n\n    /**\n     * Initializes the draft to be ready for use in editor.\n     * @param {string} emailId: id of conversation\n     * @param {object} options: object containing draft options\n     * @param {object} query: endpoint query paramaters\n     * @returns promise\n     */\n    initializeDraft(emailId, options, query) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    /**\n     * Discards the draft to be ready for initializing once more.\n     * @param {string} emailId: id of conversation\n     * @param {object} query: enpoint query paramaters\n     * @returns promise\n     */\n    discardDraft(emailId, options, query = { autoFill: false, discard: true }) {\n        const url = this.draftUri(emailId, 'emails', query);\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    loadSMSHistory: function (interactionId) {\n        const url = this.smsHistoryUri(interactionId);\n        return this.makeRequest(url, {}, 'get').then(response => {\n            let messageIds = [];\n            _.each(response.participants, participant => {\n                _.each(participant.messages, message => {\n                    _.each(message.messages, msg => {\n                        messageIds.push(msg.messageId);\n                    });\n                });\n            });\n            return _.uniq(messageIds);\n        });\n    },\n\n    sendSMSMessage: function (interactionId, communicationId, message) {\n        const url = this.sendSMSMessageUri(interactionId, communicationId);\n        const timestamp = moment().utc().format();\n        const options = {\n            data: {\n                direction: 'outbound',\n                timestamp: timestamp\n            },\n            method: 'post'\n        };\n        if (this.get('session.features.acdNormalizedMessages')) {\n            if (\n                message.normalizedMessage &&\n                message.normalizedMessage.content &&\n                message.normalizedMessage.content.length > 0 &&\n                message.normalizedMessage.content[0].attachment\n            ) {\n                if (message.normalizedMessage.content[0].attachment.mime === 'image/vnd.genesys.sticker')\n                    options.data.stickerIds = [message.normalizedMessage.content[0].attachment.id];\n                else options.data.mediaIds = [message.normalizedMessage.content[0].attachment.id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.normalizedMessage.text;\n            }\n        } else {\n            if (message.media && message.media.length > 0 && message.attachmentId) {\n                options.data.mediaIds = [message.attachmentId];\n            } else if (message.stickers && message.stickers.length > 0) {\n                options.data.stickerIds = [message.stickers[0].id];\n            } else if (message.messagingTemplate) {\n                options.data.messagingTemplate = message.messagingTemplate;\n            } else {\n                options.data.textBody = message.textBody;\n            }\n        }\n        return this.makeRequest(url, options);\n    },\n\n    createMediaAttachment: function (interactionId, communicationId) {\n        const url = this.createMediaAttachmentUri(interactionId, communicationId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    createMessage: function (options, useExistingConversation) {\n        const url = this.createCommunicationUri('messages');\n        const isExternalContact = Ember.get(options, 'entity.entity.type') === 'externalcontacts/contact';\n        const requestOptions = {\n            data: {\n                queueId: options.queueId,\n                toAddress: options.entity.value,\n                useExistingConversation,\n                toAddressMessengerType: options.toAddressMessengerType,\n                useUserFromAddress: options.useUserFromAddress,\n                externalContactId: isExternalContact ? options.entity.id : null\n            }\n        };\n        return this.makeRequest(url, requestOptions, 'post');\n    },\n\n    getMediaAttachment: function (interactionId, communicationId, mediaId) {\n        const url = this.getMediaAttachmentUri(interactionId, communicationId, mediaId);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getSMSDetails: function (interactionId, smsIds) {\n        if (_.isEmpty(smsIds)) {\n            return Promise.resolve([]);\n        }\n        const url = this.smsMessageBatchUri(interactionId);\n        const options = {\n            data: smsIds\n        };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    getMessageSupportedContent: function (interaction) {\n        const subMessageType = interaction.get('subMessageType');\n        if (subMessageType) {\n            const integrationId = interaction.get(\n                'participantForCustomer.messages.firstObject.toAddress.addressNormalized'\n            );\n            const deploymentId = interaction.get('participantForCustomer.messages.firstObject.toAddress.addressRaw');\n            if (integrationId && subMessageType !== 'webmessaging') {\n                const integrationUri = this.getSupportedContentUri(subMessageType, integrationId);\n                return this.makeRequest(integrationUri, {}, 'get');\n            } else if (deploymentId) {\n                return this.getDeploymentConfig(deploymentId, true);\n            }\n        }\n\n        return Ember.RSVP.reject(\n            new Error('Missing integration Id or sub message type from interaction ', Ember.get(interaction, 'id'))\n        );\n    },\n\n    getDeploymentConfig(deploymentId, getSupportedContent = false) {\n        if (deploymentId) {\n            const deploymentConfigUri = this.getDeploymentConfigUri(deploymentId, getSupportedContent);\n            return this.makeRequest(deploymentConfigUri, {}, 'get');\n        }\n        return Ember.RSVP.reject(new Error('Missing deployment Id', deploymentId));\n    },\n\n    getMessagingSettings(subMessageType, integrationId) {\n        if (integrationId && subMessageType) {\n            const integrationIdConfigUri = this.getIntegrationConfigUri(subMessageType, integrationId);\n            return this.makeRequest(integrationIdConfigUri, {}, 'get');\n        }\n        return Ember.RSVP.reject(new Error(`Missing integration Id: ${integrationId} or subtype: ${subMessageType}`));\n    },\n\n    createConversationSummaryFeedback(conversationId, summaryId, data) {\n        if (conversationId && summaryId) {\n            const url = this.getConversationSummaryFeedbackUri(conversationId, summaryId);\n            const options = data ? { data } : {};\n            return this.makeRequest(url, options, 'post');\n        }\n        return Ember.RSVP.reject(new Error(`Missing conversation Id: ${conversationId} or summary Id: ${summaryId}`));\n    }\n});\n","define(\"connections-ui/services/conversation\", [\"exports\", \"ember-purecloud-components/services/conversation\"], function (_exports, _conversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _conversation.default;\n    }\n  });\n});\n","import CookiesService from 'ember-cookies/services/cookies';\n\nexport default CookiesService;\n","import { observer } from '@ember/object';\nimport Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, inject, computed, Evented } = Ember;\n\nconst notificationTag = 'device-list-updated';\n\nfunction arrayComparerByDeviceId(otherArray) {\n    return current => {\n        const itemInOtherArray =\n            otherArray.filter(other => {\n                return other.deviceId === current.deviceId;\n            }).length === 0;\n\n        return itemInOtherArray;\n    };\n}\n\nfunction diffListsByDeviceId(existingList, newList) {\n    const itemsRemoved = (existingList || []).filter(arrayComparerByDeviceId(newList));\n    const itemsAdded = newList.filter(arrayComparerByDeviceId(existingList || []));\n\n    return { added: itemsAdded, removed: itemsRemoved };\n}\n\nfunction sanitizeDeviceLabel(deviceLabel) {\n    const idRegex = /(.*)\\s?\\(.*/;\n    const defaultTextRegex = /^(.*\\s-\\s)/;\n\n    // Remove the trailing numbers\n    let sanitizedLabel = deviceLabel ? deviceLabel.replace(idRegex, '$1').trim() : '';\n\n    // Remove the 'Default - ' text added by the browser\n    sanitizedLabel = sanitizedLabel ? sanitizedLabel.replace(defaultTextRegex, '').trim() : '';\n\n    return sanitizedLabel;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    session: inject.service(),\n    webrtcSettings: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n    intl: inject.service(),\n    phone: inject.service(),\n    chat: inject.service(),\n    settings: inject.service(),\n    feature: inject.service(),\n\n    selectedProfileId: null,\n    vanillaProfiles: [],\n    profiles: [],\n\n    microphone: null,\n    camera: null,\n    outputDevice: null,\n    notificationDevice: null,\n\n    notification: inject.service('notification-proxy'),\n    incomingInvitations: Ember.A(),\n    headset: inject.service(),\n\n    deviceUpdateDelay: 1500,\n    deviceChanges: null,\n    recentlyConnectedDevices: null,\n    allowDisableProfileNotifications: Ember.computed.readOnly(\n        'session.features.webrtcDisableDeviceProfileNotifications'\n    ),\n    // Returns settings once the webrtc-settings service has initialized and fetched settings.\n    profileSettingsPromise: computed.readOnly('webrtcSettings.userSettingsPromise'),\n    allowDefaultProfiles: computed.reads('session.features.webrtcDefaultDeviceProfile'),\n    initProfiles: observer('allowDefaultProfiles', async function () {\n        // Fetch profiles again when we have a value here.\n        await this._fetchProfiles();\n    }),\n\n    async init() {\n        this._super(...arguments);\n        this.get('webrtcSdkService').on('mediaStateChange', this._handleMediaStateChange.bind(this));\n        this.get('webrtcSettings').on('sdkSettingsUpdate', async () => {\n            await this._updateVolumes();\n        });\n        await this._fetchProfiles();\n        const currentMediaState = this.get('webrtcSdkService.mediaState');\n        if (currentMediaState) {\n            this._handleMediaStateChange(currentMediaState);\n        }\n    },\n\n    async _fetchProfiles() {\n        this.logger.debug('Fetching device profiles');\n        const settings = await this.get('profileSettingsPromise');\n        const selectedProfile = (settings.directorySettings && settings.directorySettings.selectedProfile) || '';\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        const defaultExists =\n            settings.directorySettings &&\n            settings.directorySettings.profiles &&\n            settings.directorySettings.profiles.find(profile => profile.id === defaultProfileId);\n\n        // If a default device profile isn't saved or no longer exists, resort to the last selected profile or computer settings.\n        this.setProperties({\n            selectedProfileId: defaultExists && this.get('allowDefaultProfiles') ? defaultProfileId : selectedProfile,\n            vanillaProfiles: (settings.directorySettings && settings.directorySettings.profiles) || []\n        });\n    },\n\n    async _handleMediaStateChange(mediaState) {\n        if (!mediaState.hasMicPermissions) {\n            return;\n        }\n\n        const camerasDiff = diffListsByDeviceId(this.get('mediaState.videoDevices'), mediaState.videoDevices);\n        const microphonesDiff = diffListsByDeviceId(this.get('mediaState.audioDevices'), mediaState.audioDevices);\n        const outputDevicesDiff = diffListsByDeviceId(this.get('mediaState.outputDevices'), mediaState.outputDevices);\n\n        const isInitialUpdate = !this.get('mediaState');\n\n        const added = {\n            cameras: camerasDiff.added,\n            microphones: microphonesDiff.added,\n            outputDevices: outputDevicesDiff.added,\n            total: camerasDiff.added.length + microphonesDiff.added.length + outputDevicesDiff.added.length\n        };\n        const removed = {\n            cameras: camerasDiff.removed,\n            microphones: microphonesDiff.removed,\n            outputDevices: outputDevicesDiff.removed,\n            total: camerasDiff.removed.length + microphonesDiff.removed.length + outputDevicesDiff.removed.length\n        };\n        this.set('mediaState', mediaState);\n        await this._updateProfileAvailability();\n        await this._maybeFixSelectedProfile();\n\n        if (added.total && !isInitialUpdate) {\n            this._updateRecentlyConnectedDevices(added);\n            await this._conditionallyShowToastForAddedDevices(added);\n        }\n\n        this.trigger('deviceListsUpdated', { added, removed });\n    },\n\n    async _updateProfileAvailability() {\n        const profiles = this.get('vanillaProfiles').map(profile => {\n            let canBeSelected = true;\n            let matchingCamera = null;\n            let matchingOutputDevice = null;\n            let matchingMicrophone = null;\n            let matchingNotificationDevice = null;\n\n            if (profile.camera) {\n                matchingCamera = this._findMatchingDevice(this.get('mediaState.videoDevices'), profile.camera);\n                const profileCameraIsNotDefault = profile.camera.deviceId !== 'default';\n                if (!matchingCamera && profileCameraIsNotDefault && !profile.validWithoutCamera) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.microphone) {\n                matchingMicrophone = this._findMatchingDevice(this.get('mediaState.audioDevices'), profile.microphone);\n                if (!matchingMicrophone) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.outputDevice) {\n                matchingOutputDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.outputDevice\n                );\n                if (!matchingOutputDevice) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.notificationDevice) {\n                matchingNotificationDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.notificationDevice\n                );\n                if (!matchingNotificationDevice) {\n                    canBeSelected = false;\n                }\n            }\n            return Object.assign({}, profile, {\n                canBeSelected: !!canBeSelected,\n                camera: matchingCamera || profile.camera,\n                microphone: matchingMicrophone || profile.microphone,\n                outputDevice: matchingOutputDevice || profile.outputDevice,\n                notificationDevice: matchingNotificationDevice || profile.outputDevice\n            });\n        });\n\n        this.set('profiles', profiles);\n\n        const settings = await this.get('profileSettingsPromise');\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        if (this.get('selectableProfiles').findBy('id', defaultProfileId)) {\n            this.setProfile(defaultProfileId);\n        }\n    },\n\n    async _maybeFixSelectedProfile() {\n        // start with default devices\n        let camera = this.mediaState.videoDevices && this.mediaState.videoDevices[0];\n        let mic = this.mediaState.audioDevices && this.mediaState.audioDevices[0];\n        let outputDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        let notificationDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        const currentProfile = this.get('profiles').findBy('id', this.get('selectedProfileId'));\n        const hasOutputDeviceSupport = this.mediaState.hasOutputDeviceSupport;\n\n        // check if selectedProfile is valid\n        if (currentProfile) {\n            const profileCamera = this._findMatchingDevice(this.mediaState.videoDevices, currentProfile.camera);\n            const profileMic = this._findMatchingDevice(this.mediaState.audioDevices, currentProfile.microphone);\n            const profileOutputDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.outputDevice\n            );\n            const profileNotificationDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.notificationDevice\n            );\n\n            const cameraValid =\n                currentProfile.validWithoutCamera ||\n                profileCamera ||\n                (currentProfile.camera && currentProfile.camera.deviceId === 'default');\n            const outputValid = !hasOutputDeviceSupport || profileOutputDevice;\n            const notificationsValid = !hasOutputDeviceSupport || profileNotificationDevice;\n\n            const profileValid = cameraValid && outputValid && notificationsValid && profileMic;\n\n            if (profileValid) {\n                camera = profileCamera || camera;\n                mic = profileMic;\n                outputDevice = profileOutputDevice || outputDevice;\n                notificationDevice = profileNotificationDevice || notificationDevice;\n            } else {\n                this._showNotificationForCurrentProfileNoLongerValid();\n\n                return await this.setProfile('');\n            }\n        }\n\n        // make sure devices match what is in the profile\n        const cameraMatches = this.get('camera') === camera;\n        const micMatches = this.get('microphone') === mic;\n        const outputDeviceMatches = !hasOutputDeviceSupport || this.get('outputDevice') === outputDevice;\n        const notificationDeviceMatches =\n            !hasOutputDeviceSupport || this.get('notificationDevice') === notificationDevice;\n\n        if (!cameraMatches || !micMatches || !outputDeviceMatches || !notificationDeviceMatches) {\n            const newDevices = {\n                camera,\n                microphone: mic,\n                outputDevice,\n                notificationDevice\n            };\n            this.setProperties(newDevices);\n            await this._updateVolumes();\n\n            this.get('webrtcSdkService').setDevices(newDevices);\n            this.trigger('profileDevicesChanged', newDevices);\n        }\n    },\n\n    async _updateVolumes() {\n        const outputDeviceVolumes = await this._getVolumesForDevice(this.get('outputDevice'));\n        this.get('phone').updateVolumes(outputDeviceVolumes);\n\n        this.get('webrtcSdkService').setCallVolume(outputDeviceVolumes.callVolume);\n\n        const notificationDeviceVolumes = await this._getVolumesForDevice(this.get('notificationDevice'));\n        this.get('chat').updateVolumes(notificationDeviceVolumes);\n    },\n\n    async _getVolumesForDevice(device) {\n        const defaults = {\n            callVolume: 100,\n            ringerVolume: 100,\n            chatNotificationVolume: 100,\n            interactionNotificationVolume: 100\n        };\n\n        if (!device) {\n            return defaults;\n        }\n\n        // It is possible to have saved settings for a device but also for that device to be the default system device with its own default system settings.\n        const sanitizedLabel = device.deviceId === 'default' ? 'default' : sanitizeDeviceLabel(device.label);\n        const settings = await this.get('profileSettingsPromise');\n        const volumes = settings.volumeSettings ? settings.volumeSettings[sanitizedLabel] : undefined;\n        return volumes || defaults;\n    },\n\n    _getActionHandler(label, { profileToSet, createProfile, showOptions } = {}) {\n        return {\n            label,\n            action: notification => {\n                if (profileToSet) {\n                    this.setProfile(profileToSet.id);\n                } else if (createProfile || showOptions) {\n                    this._openPhoneSettingsTab();\n                }\n\n                if (createProfile) {\n                    Ember.run.later(() => this.trigger('showProfileSelection'));\n                }\n\n                notification.hide();\n            }\n        };\n    },\n\n    _openPhoneSettingsTab() {},\n\n    _findMatchingDevice(deviceList, device) {\n        const foundDevice = deviceList.find(deviceA => this._deviceMatches(deviceA, device));\n\n        return foundDevice;\n    },\n\n    _deviceMatches(deviceA, deviceB) {\n        if (!deviceA || !deviceB) {\n            return false;\n        }\n\n        const hasSameId = deviceA.deviceId === deviceB.deviceId;\n\n        const formattedNameA = deviceA.label ? deviceA.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const formattedNameB = deviceB.label ? deviceB.label.replace(/(.*)\\s?\\(.*/, '$1') : '';\n        const hasSameName = formattedNameA === formattedNameB;\n\n        return hasSameId || hasSameName;\n    },\n\n    async _conditionallyShowToastForAddedDevices(addedDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n        /*\n          DESIRED BEHAVIOR\n          When a new device is connected:\n            if (theres a profile that contains newly connected device)\n              show toast asking if you'd like to switch to profile containing new device\n            else\n              ask if you'd like to create a new profile with this device\n        */\n        const filteredSelectableProfiles = [];\n\n        // find selectable profiles that contain the new device(s)\n        this.get('selectableProfiles').forEach(profile => {\n            if (addedDevices.cameras.length && this._deviceMatches(profile.camera, addedDevices.cameras[0])) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.microphones.length &&\n                this._deviceMatches(profile.microphone, addedDevices.microphones[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.outputDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.notificationDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            }\n        });\n\n        const intl = this.get('intl');\n\n        // devices added and profiles are available\n        if (filteredSelectableProfiles.length) {\n            const title = intl.t('deviceProfiles.notifications.hardwareChangeTitle');\n            let message;\n            let actionHandlers = {};\n\n            if (filteredSelectableProfiles.length > 1) {\n                message = intl.t('deviceProfiles.notifications.newDevicesMatchMultipleProfiles');\n            } else {\n                message = intl.t('deviceProfiles.notifications.profilesAvailable');\n            }\n\n            if (filteredSelectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            actionHandlers = filteredSelectableProfiles\n                .slice(0, 2)\n                .map(item => {\n                    return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                        profileToSet: item\n                    });\n                })\n                .reduce((acc, cur, i) => {\n                    acc[i] = cur;\n                    return acc;\n                }, actionHandlers);\n\n            this.get('notification').info(title, message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n        } else {\n            this.get('notification').info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.promptAddProfileForNewDevice'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: {\n                            label: intl.t('deviceProfiles.notifications.yesButton'),\n                            action: async notification => {\n                                notification.hide();\n                                await this.get('settings').openPreference('sound');\n                                this.trigger('showProfileSelection');\n                            }\n                        },\n                        no: {\n                            label: intl.t('deviceProfiles.notifications.noButton'),\n                            action: notification => {\n                                notification.hide();\n                            }\n                        }\n                    }\n                }\n            );\n        }\n    },\n\n    async _showNotificationForCurrentProfileNoLongerValid(hasNonDefaultDevices) {\n        const settings = await this.get('profileSettingsPromise');\n        if (this.get('allowDisableProfileNotifications') && settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n\n        const intl = this.get('intl');\n        const selectableProfiles = this.get('selectableProfiles');\n\n        // has profiles to choose from\n        if (selectableProfiles.length) {\n            let actionHandlers = {};\n\n            // option to go to the settings if there are too many possibilities\n            if (selectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            if (selectableProfiles.length >= 2) {\n                actionHandlers = selectableProfiles\n                    .slice(0, 2)\n                    .map(item => {\n                        return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                            profileToSet: item\n                        });\n                    })\n                    .reduce((acc, cur, i) => {\n                        acc[i] = cur;\n                        return acc;\n                    }, actionHandlers);\n            }\n\n            let message = !this.get('selectedProfileId')\n                ? intl.t('deviceProfiles.notifications.usingDefaultTextWithOptions')\n                : intl.t('deviceProfiles.notifications.switchDefaultTextWithOptions');\n\n            if (selectableProfiles.length === 1) {\n                message = intl.t('deviceProfiles.notifications.profileAvailable', { name: selectableProfiles[0].name });\n                if (this.get('selectedProfileId')) {\n                    message = intl.t('deviceProfiles.notifications.switchDefaultProfileAvailable', {\n                        name: selectableProfiles[0].name\n                    });\n                }\n\n                actionHandlers = {\n                    yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                        profileToSet: selectableProfiles[0]\n                    }),\n                    no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                };\n            }\n\n            this.get('notification').info(intl.t('deviceProfiles.notifications.hardwareChangeTitle'), message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n            return;\n        }\n\n        // does not have profiles to choose from but has non default devices\n        if (hasNonDefaultDevices) {\n            this.get('notification').info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.switchDefaultTextPromptCreateProfile'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                            createProfile: true\n                        }),\n                        no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                    }\n                }\n            );\n\n            return;\n        }\n\n        // no profiles and no devices that aren't default\n        this.get('notification').info(\n            intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n            intl.t('deviceProfiles.notifications.switchDefaultText'),\n            {\n                target: this,\n                tag: notificationTag\n            }\n        );\n    },\n\n    _updateRecentlyConnectedDevices(addedDevices) {\n        const deviceConfig = {};\n\n        if (addedDevices.cameras && addedDevices.cameras.length) {\n            deviceConfig.camera = addedDevices.cameras[0];\n        }\n        if (addedDevices.microphones && addedDevices.microphones.length) {\n            deviceConfig.microphone = addedDevices.microphones[0];\n        }\n        if (addedDevices.outputDevices && addedDevices.outputDevices.length) {\n            deviceConfig.outputDevice = addedDevices.outputDevices[0];\n        }\n\n        this.set('recentlyConnectedDevices', deviceConfig);\n    },\n\n    // Select an already created profile.\n    async setProfile(profileId, skipProfileSave) {\n        this.set('recentlyConnectedDevices', null);\n        if (!skipProfileSave) {\n            this.get('webrtcSettings').updateSetting('directorySettings.selectedProfile', profileId);\n        }\n\n        this.set('selectedProfileId', profileId);\n        await this._maybeFixSelectedProfile();\n        await this._updateVolumes();\n    },\n\n    selectableProfiles: computed('profiles', function () {\n        return Ember.A(this.get('profiles').filter(p => p.canBeSelected));\n    }),\n\n    async deleteProfile(profileId) {\n        const profiles = [].concat(this.get('vanillaProfiles'));\n        const profileObj = profiles.find(p => p.id === profileId);\n        const index = profiles.indexOf(profileObj);\n        profiles.splice(index, 1);\n        this.set('vanillaProfiles', profiles);\n\n        if (this.get('selectedProfileId') === profileId) {\n            await this.setProfile('');\n        }\n\n        // Remove profile from stored profiles.\n        const settingsService = this.get('webrtcSettings');\n        await settingsService.updateSetting('directorySettings.profiles', profiles);\n        await this._updateProfileAvailability();\n    },\n\n    // Profile creation.\n    async saveAndSelectProfile(profile) {\n        try {\n            const vanillaProfiles = [].concat(this.get('vanillaProfiles'));\n            let savedProfile = vanillaProfiles.find(p => p.id === profile.id);\n\n            if (!savedProfile) {\n                vanillaProfiles.push(profile);\n            } else {\n                const index = vanillaProfiles.indexOf(savedProfile);\n                vanillaProfiles.splice(index, 1, profile);\n            }\n\n            this.set('vanillaProfiles', vanillaProfiles);\n\n            const settings = await this.get('profileSettingsPromise');\n            settings.directorySettings.selectedProfile = profile.id;\n            settings.directorySettings.profiles = this.get('vanillaProfiles');\n\n            await this.get('webrtcSettings').updateSettings(settings);\n            await this._updateProfileAvailability();\n            // Set the profile but skip the save because it's already been updated as the selected.\n            await this.setProfile(profile.id, true);\n        } catch (error) {\n            this.logger.error('Failed to save and select device profile', error);\n        }\n    },\n\n    clearRecentlyConnectedDevices() {\n        this.set('recentlyConnectedDevices', null);\n    }\n});\n","import Ember from 'ember';\nimport { Client } from 'iframe-coordinator/dist/client.js';\nimport { setCustomAttribute } from 'ember-purecloud-components/utils/newrelic-legacy';\nimport { getEnvDetails } from 'connections-ui/utils/net';\n\nconst { run } = Ember;\nconst defaultLocale = 'en-us';\nconst hostResponseTimeout = 10000;\nconst embeddedStatus = window.self !== window.parent;\nconst urlSearchParams = new URLSearchParams(window.location.search);\nconst isLocallyIntegrated = urlSearchParams.get('host-is-local') === 'false';\nconst integrationContext = urlSearchParams.get('context');\n\nexport const EmbeddedEvents = {\n    ENVIRONMENTAL_DATA: 'environmentalData',\n    NOTIFICATION: 'notificationEvent',\n    DISMISS_NOTIFICATION: 'dismissToast',\n    SHOW_NOTIFICATION: 'showToast',\n    PAGE_DATA: 'page.data',\n    LAUNCH_VIDEO_WITH_PERSON_BY_ID: 'launchVideoWithPersonById',\n    LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID: 'launchVideoProviderWithPersonById',\n    START_CHAT_WITH_PERSON_BY_ID: 'startChatWithPersonById',\n    UPDATE_PROFILE_IMAGE: 'updateProfileImage',\n    START_CHAT_BY_JID: 'startChatByJid',\n    FAVORITE_ENTITY_BY_ID: 'favoriteEntityById',\n    START_CALL_PERSON_BY_ID: 'callPersonById',\n    START_CALL_BY_NUMBER: 'phone.makeCall',\n    USER_GENERAL_FIELD_UPDATED: 'userGeneralFieldUpdated',\n    EMERGENCY_ADDR_UPDATED: 'emergencyAddrUpdated',\n    STREAMING_TOPIC_SUBSCRIBE: 'streamingTopicSubscribe',\n    STREAMING_TOPIC_UNSUBSCRIBE: 'streamingTopicUnsubscribe'\n};\n\nconst LISTENERS = {\n    NOTIFICATION_ACTION: 'toastAction',\n    ENTITY_FAVORITE_ACTION: 'entityFavoriteAction',\n    STREAMING_TOPIC_MESSAGE: 'streamingTopicMessage',\n    STREAMING_TOPIC_SUBSCRIBE_ERROR: 'streamingTopicSubscribeError'\n};\n\nclass IframeClientTimeoutError extends Error {\n    constructor(event, timeout) {\n        super('Iframe coordinator client event listener timed out');\n        this.name = 'IframeClientTimeoutError';\n        this.event = event;\n        this.timeout = timeout;\n    }\n}\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    stashLogger: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    application: Ember.inject.service(),\n    favorites: Ember.inject.service(),\n    session: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n\n    isEmbedded: embeddedStatus,\n\n    getHostOrigin() {\n        let env = getEnvDetails();\n        if (isLocallyIntegrated) {\n            return `https://apps.${env.runtime.currentDomainName}/`;\n        }\n        // Hardcoding localhost:4300 breaks IFC publish (postMessage targetOrigin mismatch → silent drop)\n        return window.location.origin;\n    },\n\n    setLocale(locale) {\n        if (!locale) {\n            return;\n        }\n\n        setCustomAttribute('uiLanguage', locale);\n        return this.get('intl').setLocale(locale);\n    },\n\n    checkForHostRedirect() {\n        // noop for now\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initializeFrame();\n    },\n\n    async initializeFrame() {\n        await this.initializeClient();\n    },\n\n    async initializeClient() {\n        if (integrationContext === 'adminui') {\n            this.set('application.adminUIContext', true);\n        }\n\n        // Do not initialize client if not rendered in a frame\n        if (!this.get('isEmbedded')) {\n            this.setLocale(defaultLocale);\n            return;\n        }\n\n        // Only initialize client once\n        if (this.get('client')) {\n            return;\n        }\n\n        const client = new Client({\n            hostOrigin: this.getHostOrigin()\n        });\n\n        this.set('client', client);\n\n        const environmentalDataListener = new Promise((resolve, reject) => {\n            client.addListener(EmbeddedEvents.ENVIRONMENTAL_DATA, data => {\n                this.set('hostRootUrl', data.hostRootUrl);\n\n                if (data.custom) {\n                    this.set('application.browserHidden', data.custom.browserHidden);\n                }\n\n                resolve(this.setLocale(data.locale));\n            });\n\n            run.later(\n                this,\n                () => reject(new IframeClientTimeoutError(EmbeddedEvents.ENVIRONMENTAL_DATA, hostResponseTimeout)),\n                hostResponseTimeout\n            );\n        });\n\n        client.start();\n\n        try {\n            await environmentalDataListener;\n        } catch (e) {\n            if (\n                this.get('application.adminUIContext') &&\n                !(this.get('session.features') && this.get('session.features')['PAUI-80.PeopleUiDecomposition'])\n            ) {\n                return; // We are embedded in Admin-UI, and we don't need IFC,\n                // only when we are embedded in Web-Directory or Users-UI, we needs IFC.\n            }\n            this.setLocale(defaultLocale);\n            this.get('stashLogger').error(e.message, e);\n        }\n\n        this.registerEventHandlers();\n    },\n\n    //==========================================================\n    // Handle events from IFC\n    //==========================================================\n\n    registerEventHandlers() {\n        if (!this.get('client')) {\n            return;\n        }\n\n        const client = this.get('client');\n        Object.keys(LISTENERS).forEach(key => {\n            client.messaging.addListener(LISTENERS[key], event => {\n                if (event && event.payload) {\n                    this[LISTENERS[key]](event);\n                }\n            });\n        });\n    },\n\n    toastAction(event) {\n        const { action, id } = event.payload;\n        this.get('notification').handleNotificationAction(action, id);\n    },\n\n    entityFavoriteAction(event) {\n        this.get('favorites').handleEntityFavoriteAction(event.payload);\n    },\n\n    streamingTopicMessage(message) {\n        this.get('pigeon').onMessage('streaming', message.payload);\n    },\n    streamingTopicSubscribeError(message) {\n        this.get('pigeon').onSubscriptionError(message.payload);\n    },\n\n    //==========================================================\n    // Publish events to IFC\n    //==========================================================\n\n    requestNotification(notification) {\n        const client = this.get('client');\n\n        if (!client || !notification) {\n            return;\n        }\n        client.requestNotification(notification);\n    },\n\n    publishMessage(topic, payload) {\n        const client = this.get('client');\n\n        if (!topic || !payload || !client) {\n            return;\n        }\n\n        return client.publish({\n            topic,\n            payload\n        });\n    },\n\n    dismissNotification(id) {\n        this.publishMessage(EmbeddedEvents.DISMISS_NOTIFICATION, { id });\n    },\n\n    showNotification(options) {\n        this.publishMessage(EmbeddedEvents.SHOW_NOTIFICATION, { options });\n    },\n\n    notifyAcdCount(count) {\n        this.publishMessage(EmbeddedEvents.ACDCOUNT_EVENT, { count });\n    },\n\n    sendSidebarEvent(event, panel, key, value) {\n        if (!this.get('isEmbedded')) {\n            return;\n        }\n\n        const options = {\n            type: event\n        };\n\n        if (panel) {\n            options.panel = panel;\n        }\n\n        if (key) {\n            options.key = key;\n        }\n\n        if (value) {\n            options.value = value;\n        }\n\n        this.publishMessage(EmbeddedEvents.SIDEBAR_EVENT, options);\n    },\n\n    sendNavigationEvent({ hash }) {\n        const client = this.get('client');\n\n        if (!client || !hash) return;\n\n        const url = new URL(window.location.origin);\n        url.hash = hash;\n\n        if (!url) {\n            this.get('stashLogger').error('Unable to parse provided hash into url.', {\n                hash\n            });\n            return;\n        }\n\n        client.requestNavigation({ url: url.href });\n    },\n\n    sendPageData(options) {\n        this.publishMessage(EmbeddedEvents.PAGE_DATA, options);\n    },\n\n    launchVideoWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    launchVideoProviderWithPersonById(personId, providerId) {\n        this.publishMessage(EmbeddedEvents.LAUNCH_VIDEO_PROVIDER_WITH_PERSON_BY_ID, { personId, providerId });\n    },\n\n    startChatWithPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CHAT_WITH_PERSON_BY_ID, personId.toString());\n    },\n\n    notifyUserGeneralFieldUpdated(entityId) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, {});\n        }\n    },\n\n    notifyEmergencyAddrUpdated() {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADDR_UPDATED, {});\n    },\n\n    notifyUpdateProfileImage(images, entityJid) {\n        this.publishMessage(EmbeddedEvents.UPDATE_PROFILE_IMAGE, {\n            image: images,\n            entityJid\n        });\n    },\n\n    startChatByJid(jid) {\n        if (!jid) return;\n        this.publishMessage(EmbeddedEvents.START_CHAT_BY_JID, { jid: jid.toString() });\n    },\n\n    favoriteEntityById(options) {\n        this.publishMessage(EmbeddedEvents.FAVORITE_ENTITY_BY_ID, options);\n    },\n\n    startCallPersonById(personId) {\n        this.publishMessage(EmbeddedEvents.START_CALL_PERSON_BY_ID, personId.toString());\n    },\n\n    startCallByNumber(phoneNumber) {\n        this.publishMessage(EmbeddedEvents.START_CALL_BY_NUMBER, { phoneNumber });\n    },\n\n    entityGeneralFieldUpdated(entityId, field) {\n        // trigger userGeneralFieldUpdated event to Web-Directory if entity is current user.\n        if (entityId === this.get('session.person.id')) {\n            this.publishMessage(EmbeddedEvents.USER_GENERAL_FIELD_UPDATED, field);\n        }\n    },\n\n    emergencyAdrUpdated(emergencyAdr) {\n        this.publishMessage(EmbeddedEvents.EMERGENCY_ADR_UPDATED, emergencyAdr);\n    },\n\n    streamingTopicSubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_SUBSCRIBE, topic);\n    },\n\n    streamingTopicUnsubscribe(topic) {\n        this.publishMessage(EmbeddedEvents.STREAMING_TOPIC_UNSUBSCRIBE, topic);\n    }\n});\n","import Ember from 'ember';\nimport moment from '../utils/dates';\nimport EmergencyLocationUtil from '../utils/emergency-location-util';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { computed, inject } = Ember;\n\nconst POLL_INTERVAL = 1200000; //20min\n\nexport default Ember.Service.extend({\n    session: inject.service(),\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n    intl: inject.service(),\n    logger: inject.service('stash-logger'),\n    addressformat: inject.service(),\n    embedded: inject.service(),\n\n    eLocation: null,\n    isAuthenticated: computed.reads('session.isAuthenticated'),\n    isEligibleForE911: false,\n    eLocationInlineWarning: null,\n    primaryVoice: null,\n\n    emergencyLocationData: computed(\n        'eLocation',\n        'isEligibleForE911',\n        'eLocationInlineWarning',\n        'primaryVoice',\n        function () {\n            return {\n                eLocation: this.get('eLocation'),\n                eLocationInlineWarning: this.get('eLocationInlineWarning'),\n                primaryVoice: this.get('primaryVoice'),\n                isEligibleForE911: this.get('isEligibleForE911')\n            };\n        }\n    ),\n\n    /**\n     * Gets emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise} promise wraps object containing address location\n     */\n    getEmergencyLocation(phoneNumber) {\n        phoneNumber = !!phoneNumber ? phoneNumber : this.get('primaryVoice.number');\n        phoneNumber = this.get('addressformat').formatAddress(phoneNumber);\n\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('ajax').request(url, options);\n    },\n\n    /**\n     * Fetches and loads primary contact information for user and sets primary number in service\n     * @param  {string} userId Optional userId for whom the primary contact information is fetched.\n     * @return {promise} returns promise containing number and also sets primaryVoice in this service\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadUserPrimaryNumber(userId) {\n        let url = this.get('application').pcV2Uri(`api/v2/users/me`);\n        if (userId) {\n            url = this.get('application').pcV2Uri(`api/v2/users/${userId}`);\n        }\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                let number = null;\n                if (data && data.primaryContactInfo) {\n                    const primaryPhoneObject = data.primaryContactInfo.findBy('mediaType', 'PHONE');\n\n                    if (primaryPhoneObject && (primaryPhoneObject.address || primaryPhoneObject.display)) {\n                        number = this.get('addressformat').formatAddress(\n                            primaryPhoneObject.address || primaryPhoneObject.display\n                        );\n                        this.set('primaryVoice', {\n                            number,\n                            display: this.get('addressformat').formatAddressForDisplay(number)\n                        });\n                        return number;\n                    }\n                }\n                this.set('primaryVoice', {\n                    number,\n                    display: ''\n                });\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                );\n                return Ember.RSVP.reject({\n                    err: 'No primary number found',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberNotFound')\n                });\n            })\n            .catch(err => {\n                if (err.softError) {\n                    return Ember.RSVP.reject(err);\n                }\n                this.set(\n                    'eLocationInlineWarning',\n                    this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                );\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: this.get('intl').lookup('emergencyLocation.errors.primaryNumberLookup')\n                });\n            });\n    },\n\n    /**\n     * Fetches e911 eligibility status for a given phone number and sets isEligibleForE911 service property\n     * @param  {string} phoneNumber e164 formatted phone number that is checked for e911 eligibility\n     * @return {promise resolved} returns promise containing eligibility status\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadELocationEligibility(phoneNumber) {\n        let url = this.get('application').pcV2Uri(\n            'api/v2/carrierservices/integrations/emergencylocations/verifyphonenumber'\n        );\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.get('ajax')\n            .post(url, options)\n            .then(data => {\n                if (data && data.supported) {\n                    this.set('isEligibleForE911', true);\n                    return data;\n                }\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.resolve({\n                    supported: false\n                });\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                return Ember.RSVP.reject({\n                    err,\n                    softError: this.get('intl').lookup('emergencyLocation.errors.e911IsSupported')\n                });\n            });\n    },\n\n    /**\n     *  Resets the eLocation property to an emty address.\n     */\n    clearElocation() {\n        const emptyAddress = {\n            id: '',\n            address: {\n                street1: '',\n                street2: '',\n                city: '',\n                state: '',\n                zipcode: '',\n                country: ''\n            },\n            did: '',\n            source: ''\n        };\n\n        this.set('eLocation', emptyAddress);\n    },\n\n    /**\n     * Refreshes the eLocation property containing the emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise resolved} returns promise containing emergency address\n     * @return {promise rejected} returns error message to display in notification\n     */\n    refreshEmergencyLocation(phoneNumber) {\n        return this.getEmergencyLocation(phoneNumber)\n            .then(result => {\n                this.set('isEligibleForE911', true);\n                this.set('eLocation', result);\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                this.clearElocation();\n                const defaultMessage = this.get('intl').lookup('emergencyLocation.errors.e911LocationLookup', {\n                    number: this.get('primaryVoice.display')\n                });\n\n                const errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err, defaultMessage));\n\n                // Trigger an emergencyAddrUpdated event to Web-Directory.\n                this.get('embedded').notifyEmergencyAddrUpdated();\n\n                return Ember.RSVP.reject({\n                    err,\n                    softError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Refreshes all emergency contact information properties:\n     *     1 - eLocation\n     *     2 - primaryVoice\n     *     3 - isEligibleForE911\n     * @return {promise} returns promise\n     */\n    refreshAllEmergencylocationInfo() {\n        this.set('eLocationInlineWarning', null);\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return Ember.RSVP.resolve();\n        }\n        if (!this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                if (number) {\n                    return this.refreshEmergencyLocation(number);\n                }\n                this.clearElocation();\n                throw {\n                    err: 'Number not supported.',\n                    softError: this.get('intl').lookup('emergencyLocation.errors.e911NotEligible')\n                };\n            })\n            .catch(errObject => {\n                const messageBody = errObject.softError;\n                if (messageBody && !this.get('eLocationInlineWarning')) {\n                    this.set('eLocationInlineWarning', messageBody);\n                }\n\n                return Ember.RSVP.reject(errObject);\n            });\n    },\n\n    /**\n     * Begins polling to refresh all eLocation data\n     */\n    startPolling() {\n        if (isTesting) return;\n\n        const service = this;\n        const pollingIntervalInMinutes = moment.duration(POLL_INTERVAL).minutes();\n        let pollCounter = 0;\n        const pollingIntervalId = setInterval(() => {\n            this.get('logger').info(\n                `E911UI: Polling count: ${pollCounter++} - Polling time: ${moment().format()} - Polling every ${pollingIntervalInMinutes}min.`\n            );\n            service._refreshAllEmergencylocationInfo();\n        }, POLL_INTERVAL);\n        this.set('pollingIntervalId', pollingIntervalId);\n    },\n\n    init() {\n        this._super(...arguments);\n        if (this.get('session.features.emergencyLocation')) {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n            this.startPolling();\n        }\n    },\n\n    /**\n     * Wrapper function to put in runloop\n     */\n    _refreshAllEmergencylocationInfo() {\n        Ember.run.later(() => {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n        }, 100);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        clearInterval(this.get('pollingIntervalId'));\n    },\n\n    /**\n     * Sets eLocation on backend\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    setElocation(newAddress, number) {\n        let url = this.get('application').pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                did: number,\n                address: newAddress,\n                source: 'User'\n            }\n        };\n        return this.get('ajax')\n            .post(url, options)\n            .catch(err => {\n                let errorMessage = this.get('intl').lookup(EmergencyLocationUtil.getErrorString(err));\n                return Ember.RSVP.reject({\n                    err,\n                    hardError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Saves eLocation property on this service\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    saveElocation(newAddress) {\n        if (!this.get('session.features.emergencyLocation')) {\n            return;\n        }\n        this.set('eLocationInlineWarning', null);\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                return this.setElocation(newAddress, number);\n            })\n            .then(() => {\n                return this.refreshAllEmergencylocationInfo();\n            });\n    }\n});\n","import Service from '@ember/service';\nimport Evented from '@ember/object/evented';\n\nexport const TOGGLE_EVENT = 'system.event.toggle';\nexport const TOGGLE_NAV_EVENT = 'system.event.navtoggle';\nexport const TOGGLE_ACTIVE_DRAWER_EVENT = 'system.event.drawerselect';\n\nconst eventsService = Service.extend(Evented, {\n    triggerEvent(event: any, payload: any) {\n        console.log('jrr: event triggered', {\n            event,\n            payload\n        });\n        this.trigger(event, payload);\n    }\n});\n\nexport default eventsService;\nexport class EventsService extends eventsService {}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        events: EventsService;\n    }\n}\n","import Ember from 'ember';\nimport { createContactPojo } from 'connections-ui/utils/acd';\nconst { Service, inject, setProperties, get, computed } = Ember;\n\nexport const CONTACT_CHANGED_EVENT = 'contact-changed-event';\nexport const CONTACT_MERGED_EVENT = 'contact-merged-event';\n\nconst CONTACT_CHANGED = 'contact-changed';\nconst EXTERNAL_CONTACT = 'externalcontacts/contact';\nconst EXPANDED_PARTICIPANT_PURPOSES = ['customer', 'external'];\n\nconst TOPIC_PREFIX = 'v2.externalcontacts.contacts.';\n\n/**\n * Service supports expansion of external contacts for interactions and observation of changes associated with\n * with those contacts.  This dispatches an change event when an external contact is changed and a merge event\n * along with a change event when an external contact is merged with another contact\n */\nexport default Service.extend(Ember.Evented, {\n    store: inject.service(),\n    pigeon: inject.service(),\n    names: inject.service(),\n    permissions: inject.service(),\n    logger: inject.service('stash-logger'),\n\n    _trackedContacts: [],\n    contacts: computed.oneWay('_trackedContacts'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedContacts', []);\n        this.set('contactCallbackData', []);\n        this.get('pigeon').on(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    /**\n     * Mutates (sets or resets) the provided interactionModel with the externalContact info.  This method\n     * assumes that the interactionModel participants have already been sync'd with the payload.\n     *\n     * @returns A promise which always resolves with undefined.  Any errors in expansion will be logged.\n     */\n    async setExternalContactInfo(interactionModel, payload) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        const participantsToExpand = (interactionModel.get('participants') || []).filter(currParticipant => {\n            return currParticipant && EXPANDED_PARTICIPANT_PURPOSES.includes(Ember.get(currParticipant, 'purpose'));\n        });\n\n        if (!participantsToExpand.length) {\n            return;\n        }\n\n        for (let index = 0; index < participantsToExpand.length; index++) {\n            const currParticipant = participantsToExpand[index];\n\n            const rawParticipant =\n                payload && payload.participants ? payload.participants.find(p => p.id === currParticipant.id) : null;\n            if (!rawParticipant) {\n                this.get('logger').warn('ACD Relate: Could not correlate a model participant with a rawParticipant', {\n                    remoteData: {\n                        conversationId: interactionModel.get('id'),\n                        participantId: currParticipant.id\n                    }\n                });\n\n                continue;\n            }\n\n            if (!rawParticipant.externalContactId) {\n                setProperties(currParticipant, {\n                    isExternal: false,\n                    name: rawParticipant.name || '',\n                    externalContact: null\n                });\n            } else {\n                const externalContact = (await this._getContact(rawParticipant.externalContactId)) || null;\n                const name = externalContact ? this.get('names').fullName(externalContact) : null;\n\n                setProperties(currParticipant, {\n                    isExternal: true,\n                    name: name || rawParticipant.name || '',\n                    externalContact\n                });\n            }\n        }\n    },\n\n    /**\n     * Attempts to get a local contact model from the store and if none is found gets a remote model\n     * @param id - the contact id to load\n     * @param reload - if true - forces a reload of the contact\n     * @param errorMessage - specific error message for retrieval of contact context\n     * @returns {Promise.<*|{id}>}\n     */\n    async _getContact(id, reload, errorMessage = 'ACD Relate: failed to fetch contact') {\n        if (!id) return;\n        const store = this.get('store');\n        let contact = reload ? null : store.peekRecord(EXTERNAL_CONTACT, id);\n        if (!contact) {\n            try {\n                contact = await store.findRecord(EXTERNAL_CONTACT, id, { reload: true });\n            } catch (e) {\n                const { message: generalMessage, errors } = e;\n                const [errorData] = errors || [];\n                const { status, title, detail } = errorData || {};\n                const { message, contextId } = detail || {};\n                this.get('logger').error(errorMessage, {\n                    remoteData: {\n                        externalContactId: id,\n                        generalMessage,\n                        status,\n                        title,\n                        message,\n                        contextId\n                    }\n                });\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Gets the canonical contact based on the current contact.  It retrieves the local store's record first for\n     * both contact types if possible.  Changes to the contacts would have triggered updates through the update handler.\n     * @param id - the contact ID that will be used to retrieve the canonical contact.\n     * @param reload - if true forces reload of the contact and the canonical contact if applicable\n     * @returns {Promise.<*>} resolves to the current canonical contact for the passed in contact id\n     */\n    async getCanonicalExternalContact(id, reload = false) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        let contact;\n        if (id) {\n            contact = await this._getContact(id, reload, 'ACD Relate: Failed to fetch External Contact from store');\n            const canonicalId = get(contact || {}, 'canonicalId');\n            if (canonicalId && canonicalId !== id) {\n                contact = await this._getContact(\n                    canonicalId,\n                    reload,\n                    'ACD Relate: Failed to fetch canonical External Contact from store'\n                );\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Synchronously gets the local contact canonical contact being tracked based on the passed in id.\n     * if nothing can be found - returns undefined\n     * @param contactId\n     */\n    getCanonicalContactSync(contactId) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        // gets the contacts array since it is gated by the feature toggle\n        const contacts = this.get('contacts') || [];\n        let contact = contacts.findBy('id', contactId);\n        if (contact) {\n            const canonicalId = get(contact, 'canonicalId');\n            if (canonicalId && canonicalId !== contactId) {\n                contact = contacts.findBy('id', canonicalId);\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Adds change listener for customer participant bound contacts on their id in the payloads participant array.  It diffs the\n     * previous interaction states participants array to remove listeners that were previously attached.\n     * @param ModelBuilder - The Ember Class or a function to create an interaction model\n     * @param payload - the payload from an interaction update\n     * @param prevRaw - the previous payload for an the payload - for determining removed contacts\n     * @param callback - the callback that will be fired when a contact changes - The callbacks are invoked without\n     * contact binding to an appropriate context will be necessary\n     */\n    async addContactChangeListenersForInteraction(ModelBuilder, payload, prevRaw, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n\n        const currInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n            ? ModelBuilder.create(payload, Ember.getOwner(this).ownerInjection())\n            : ModelBuilder(payload);\n        const externalContactId = get(currInteraction, 'participantForCustomer.externalContactId');\n        currInteraction.destroy();\n\n        if (prevRaw) {\n            const prevInteraction = Object.prototype.hasOwnProperty.call(ModelBuilder, 'create')\n                ? ModelBuilder.create(prevRaw, Ember.getOwner(this).ownerInjection())\n                : ModelBuilder(prevRaw);\n            const previousContactId = get(prevInteraction, 'participantForCustomer.externalContactId');\n            prevInteraction.destroy();\n            if (previousContactId && previousContactId !== externalContactId) {\n                this.removeContactChangeListener(previousContactId, callback);\n            }\n        }\n\n        if (externalContactId) {\n            await this.addContactChangeListener(externalContactId, callback);\n        }\n    },\n\n    /**\n     * Cleans up listeners in an interaction payload attached to external contacts attached to the participants\n     * @param model\n     * @param callback\n     */\n    removeContactChangeListenersForInteraction(model, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!model) {\n            return;\n        }\n\n        const externalContactId = get(model, 'participantForCustomer.externalContactId');\n        this.removeContactChangeListener(externalContactId, callback);\n    },\n\n    /**\n     * Adds a change listener for the canonical contact associated with the passed in external contact id\n     * as well as the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    async addContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) return;\n        if (!(contactId && callback)) return;\n\n        const contact = await this._getContact(contactId);\n        if (!contact) {\n            throw new Error('ACD Relate: failed to load external contact', { cause: contactId });\n        }\n\n        const divisionId = Ember.get(contact, 'division.id') || '*';\n\n        if (!this.get('permissions').validateDonutPermission('externalContacts:contact:view', divisionId)) {\n            throw new Error('ACD Relate: insufficient privileges to add contact listeners');\n        }\n\n        const canonicalId = get(contact, 'canonicalId');\n        const canonicalContact = await this._getContact(canonicalId);\n        if (!canonicalContact) {\n            throw new Error('ACD Relate: failed to load canonical external contact', { cause: canonicalId });\n        }\n\n        const contactData = this.get('contactCallbackData').findBy('contactId', contactId);\n\n        if (!contactData) {\n            this.get('contactCallbackData').pushObject({ contactId, canonicalId, callbacks: [callback] });\n        } else {\n            const { callbacks } = contactData;\n            if (callbacks.indexOf(callback) === -1) {\n                callbacks.pushObject(callback);\n            }\n        }\n\n        if (!this.get('_trackedContacts').findBy('id', contactId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(contact));\n        }\n        if (canonicalId !== contactId && !this.get('_trackedContacts').findBy('id', canonicalId)) {\n            this.get('_trackedContacts').pushObject(createContactPojo(canonicalContact));\n        }\n        if (contactId) {\n            this._watchContactForChanges(contactId);\n        }\n        if (canonicalId && canonicalId !== contactId) {\n            this._watchContactForChanges(canonicalId);\n        }\n    },\n\n    /**\n     * Removes a change listener for a canonical contact based on the passed in external contact is as well as\n     * the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    removeContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!(contactId && callback)) return;\n\n        const contactCallbackData = this.get('contactCallbackData');\n        const contactData = contactCallbackData.findBy('contactId', contactId);\n        if (contactData) {\n            const { callbacks } = contactData;\n            callbacks.removeObject(callback);\n            if (!callbacks.length) {\n                contactCallbackData.removeObject(contactData);\n            }\n        }\n        this._updateTrackedContactsAndTopics();\n    },\n\n    /**\n     * Adds watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _watchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) === -1) {\n                this.get('pigeon').registerPriorityTopic(topic, CONTACT_CHANGED);\n            }\n        }\n    },\n\n    /**\n     * Removes watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _unwatchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) !== -1) {\n                this.get('pigeon').unRegisterPriorityTopic(topic);\n            }\n        }\n    },\n\n    _invokeCallbacks(callbacks = [], data = {}) {\n        callbacks.forEach(callback => {\n            if (typeof callback === 'function') {\n                callback(data);\n            }\n        });\n    },\n\n    /**\n     * Rolls through tracked contacts and topics to remove any orphan contacts or topics that\n     * whose callback data has been removed.\n     */\n    _updateTrackedContactsAndTopics() {\n        const trackedContactIds = this.get('trackedContactIds');\n        const trackedContacts = this.get('_trackedContacts');\n        for (let i = trackedContacts.length - 1; i >= 0; i--) {\n            const { id } = trackedContacts.objectAt(i);\n            if (id && trackedContactIds.indexOf(id) === -1) {\n                trackedContacts.splice(i, 1);\n                this._unwatchContactForChanges(id);\n            }\n        }\n    },\n\n    /**\n     * Returns an array of all the contact ids that are currently being tracked\n     */\n    trackedContactIds: computed('contactCallbackData.[]', function () {\n        return this.get('contactCallbackData')\n            .reduce((trackedIds, callbackData) => {\n                const { contactId, canonicalId, callbacks } = callbackData;\n                if (callbacks.length) {\n                    trackedIds.pushObject(contactId);\n                    if (contactId !== canonicalId) {\n                        trackedIds.pushObject(canonicalId);\n                    }\n                }\n                return trackedIds;\n            }, [])\n            .uniq();\n    }),\n\n    /**\n     * Reloads an external contact when it has changed and dispatches an external contact changed event.  If the change\n     * in question was a merger of contacts, a merge event is also generated containing the initial contact and the\n     * canonical contact that resulted from the merge event.\n     * @param externalContactId - an object that contains a single id property corresponding to which contact changed\n     * @returns {Promise.<void>}\n     */\n    async _handleContactChanged({ id: contactId }) {\n        if (contactId) {\n            try {\n                if (!this.get('contactCallbackData.length')) {\n                    return;\n                }\n                const contacts = this.get('_trackedContacts');\n                const contactCallbackData = this.get('contactCallbackData');\n\n                const staleContact = await this._getContact(contactId);\n                const staleCanonicalId = get(staleContact, 'canonicalId');\n\n                const freshContact = await this._getContact(contactId, true);\n                const freshCanonicalId = get(freshContact, 'canonicalId');\n                const freshCanonicalContact = await this._getContact(freshCanonicalId);\n\n                if (freshContact && freshCanonicalContact) {\n                    contacts.removeObject(contacts.findBy('id', contactId));\n                    contacts.pushObject(createContactPojo(freshContact));\n\n                    if (freshCanonicalId !== contactId) {\n                        contacts.removeObject(contacts.findBy('id', freshCanonicalId));\n                        contacts.pushObject(createContactPojo(freshCanonicalContact));\n                    }\n\n                    let callbacks, type, eventData;\n                    if (staleCanonicalId === freshCanonicalId) {\n                        type = CONTACT_CHANGED_EVENT;\n                    } else {\n                        type = CONTACT_MERGED_EVENT;\n\n                        //if this is a base contact - it will have a contactCallbackData\n                        // update it if it does to give it the new canonical contact id\n                        const callbackData = contactCallbackData.findBy('contactId', contactId);\n                        if (callbackData) {\n                            const { callbacks } = callbackData;\n                            contactCallbackData.removeObject(callbackData);\n\n                            // update the contact data with the new canonical and watch the news canonical\n                            contactCallbackData.pushObject({ contactId, canonicalId: freshCanonicalId, callbacks });\n                            this._watchContactForChanges(freshCanonicalId);\n                        }\n\n                        // removes orphan contacts and topics based on the currently tracked contact information\n                        this._updateTrackedContactsAndTopics();\n                    }\n\n                    callbacks = contactCallbackData\n                        .filter(data => data.contactId === contactId || data.canonicalId === contactId)\n                        .flatMap(({ callbacks }) => callbacks)\n                        .uniq();\n\n                    eventData = { type, contact: freshContact, canonicalContact: freshCanonicalContact };\n\n                    if (callbacks && type && eventData) {\n                        Ember.run.schedule('actions', this, '_invokeCallbacks', callbacks, eventData);\n                        this.trigger(type, eventData);\n                    }\n                }\n            } catch (e) {\n                this.get('logger').error('ACD Relate: Error occurred when handling external contact change event', {\n                    remoteData: {\n                        contactId\n                    }\n                });\n            }\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, observer, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, LoggerMixin, {\n    intl: inject.service(),\n    ajax: inject.service(),\n    chat: inject.service(),\n    store: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    embedded: inject.service(),\n\n    initialized: false,\n\n    _favorites: null,\n    favoritePromise: Ember.RSVP.defer(),\n\n    init() {\n        this._super(...arguments);\n\n        this.setProperties({\n            _favorites: []\n        });\n\n        this.loadFavoritesForSessionPerson();\n    },\n\n    enabled: computed('session.user.isTrustee', function () {\n        return !this.get('session.user.isTrustee');\n    }),\n\n    apiVersion: computed(function () {\n        return 'v3';\n    }),\n\n    loadFavoritesForSessionPerson: observer(\n        'session.{isAuthenticated,person}',\n        'session.user.{isTrustee,isSuper}',\n        function () {\n            if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n                this.favoritePromise.resolve(this.get('_favorites'));\n                return;\n            }\n\n            if (this.get('session.isAuthenticated') && this.get('session.person')) {\n                if (this.get('initialized')) {\n                    this.favoritePromise.resolve(this.get('_favorites'));\n                } else {\n                    this.initFavorites().then(\n                        () => {\n                            this.favoritePromise.resolve(this.get('_favorites'));\n                        },\n                        () => {\n                            this.favoritePromise.resolve(this.get('_favorites'));\n                        }\n                    );\n                }\n            }\n        }\n    ),\n\n    initFavorites() {\n        return this.getFavorites().then(peopleAndGroups => {\n            if (this.isDestroyed) {\n                return;\n            }\n            this.setFavorites(peopleAndGroups);\n            this.set('initialized', true);\n        });\n    },\n\n    getFavorites() {\n        return this.get('store')\n            .findFavorites()\n            .then(data => {\n                return this._handleHiddenGroups(data);\n            });\n    },\n\n    getLoadedFavorites() {\n        return this.favoritePromise.promise;\n    },\n\n    setFavorites(peopleAndGroups) {\n        const favorites = _.chain([])\n            .concat(peopleAndGroups)\n            .compact()\n            .uniq(false, x => x.get('id'))\n            .value();\n        this.set('_favorites', favorites);\n\n        favorites.forEach(entity => {\n            entity.set('isFavorite', true);\n        });\n    },\n\n    // Handle favorite action performed in Web-Directory.\n    async handleEntityFavoriteAction(event) {\n        if (!event) {\n            return;\n        }\n        if (event.action === 'Favorited') {\n            if (!event.data || !event.data.entityType || !event.entityId) {\n                return;\n            }\n            await this.getLoadedFavorites(); // Wait for favorites to be fully loaded.\n            const entity = await this.get('store').findRecord(event.data.entityType, event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').addObject(entity);\n            entity.set('isFavorite', true);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: true,\n                action: 'Favorited'\n            });\n        } else if (event.action === 'Unfavorited') {\n            if (!event.entityId) {\n                return;\n            }\n            await this.getLoadedFavorites(); // Wait for favorites to be fully loaded.\n            const entity = this.get('_favorites').findBy('id', event.entityId);\n            if (!entity) {\n                return;\n            }\n            this.get('_favorites').removeObject(entity);\n            entity.set('isFavorite', false);\n            this.trigger('favoriteChange', {\n                entityId: event.entityId,\n                favoriteStatus: false,\n                action: 'Unfavorited'\n            });\n        }\n    },\n\n    favoriteEntity(entity) {\n        // Trigger a favorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: true\n        });\n    },\n\n    unfavoriteEntity(entity) {\n        // Trigger an unfavorite event to Web-Directory.\n        this.get('embedded').favoriteEntityById({\n            entityId: entity.get('id') || entity.get('jid'),\n            entityType: entity.get('type'),\n            favoriteStatus: false\n        });\n    },\n\n    toggleFavorite(entity) {\n        if (entity.get('isFavorite')) {\n            this.unfavoriteEntity(entity);\n        } else {\n            this.favoriteEntity(entity);\n        }\n    },\n\n    _handleHiddenGroups(models) {\n        const loadedIds = [...models.mapBy('entityId'), ...models.mapBy('guid'), ...models.mapBy('_id')].filter(\n            id => !!id\n        );\n        models._payload\n            .filter(object => object.entityType === 'group')\n            .forEach(object => {\n                const guid = object.entityId;\n                if (!_.includes(loadedIds, guid)) {\n                    // group wasn't loaded due to permissions\n                    const placeholder = this.get('store').push({\n                        data: {\n                            type: 'group',\n                            id: guid,\n                            attributes: {\n                                guid: guid,\n                                general: {\n                                    name: []\n                                }\n                            }\n                        }\n                    });\n\n                    this.logger.info('Favorites: Adding placeholder', { guid });\n\n                    models.pushObject(placeholder);\n                }\n            });\n\n        return models;\n    }\n});\n","define(\"connections-ui/services/feature\", [\"exports\", \"ember-purecloud-components/services/feature\"], function (_exports, _feature) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _feature.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport AjaxService from 'ember-ajax/services/ajax';\n\nexport default AjaxService.extend({\n    application: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n\n    trustedHosts: Ember.computed.alias('ajax.trustedHosts'),\n\n    upload(uri, formData) {\n        return this.raw(uri, {\n            contentType: false,\n            processData: false,\n            data: formData,\n            method: 'POST'\n        });\n    },\n\n    async uploadGreetingWithPreSigned(file, groupId) {\n        const urlPath = `api/v2/groups/${groupId}/greetings/uploads`;\n        const presignedUrl = this.get('application').pcV2Uri(urlPath);\n        try {\n            const presignedUrlResponse = await this.get('ajax').post(presignedUrl, {\n                data: {\n                    tags: {\n                        ownerType: 'group',\n                        ownerId: groupId,\n                        name: 'voicemail',\n                        greetingType: 'voicemail'\n                    },\n                    fileName: file.name,\n                    contentType: file.type\n                }\n            });\n            await this.get('ajax').raw(presignedUrlResponse.url, {\n                contentType: false,\n                processData: false,\n                data: file,\n                method: 'PUT',\n                noAuthorizationHeader: true, // Prevent to use the classic GC Auth header\n                headers: presignedUrlResponse.headers,\n                dataType: 'text' // Upload will have an empty response\n            });\n            Ember.Logger.info(`Successful voicemail greeting upload: \"${file.name}\"`);\n        } catch (err) {\n            Ember.Logger.error('Error uploading voicemail file:', { error: err });\n            throw err;\n        }\n    },\n\n    /**\n     * Fax upload using provided headers. This will use the Darth service for upload.\n     * @param {*} uri\n     * @param {*} formData\n     * @param {*} headers\n     * @returns\n     */\n    faxUploadWithHeaders(uri, formData, headers) {\n        const file = formData.get('file');\n        if (file) {\n            return this.raw(uri, {\n                contentType: false,\n                processData: false,\n                // darth upload doesn't like the form data object for all file types\n                // using the raw file appears to work consistently\n                data: file,\n                method: 'PUT',\n                headers,\n                dataType: 'text' // fax upload will have an empty response\n            });\n        } else {\n            Ember.Logger.error('<file-upload/faxUploadWithHeaders> file is undefined!');\n        }\n    }\n});\n","import Ember from 'ember';\n\nconst { inject, Service } = Ember;\n\nexport default Service.extend(Ember.Evented, {\n    session: inject.service(),\n\n    isFullScreen: false,\n\n    handleFullScreenChange: function () {\n        Ember.run(() => {\n            if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n                let fullScreen = document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement;\n                this.set('isFullScreen', !!fullScreen);\n\n                if (!this.get('isFullScreen')) {\n                    this.endFullScreen();\n                }\n            }\n        });\n    },\n\n    init() {\n        this._super(...arguments);\n        Ember.$(document).on('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).on('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        Ember.$(document).off('webkitfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('fullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('mozfullscreenchange', this.handleFullScreenChange.bind(this));\n        Ember.$(document).off('MSFullscreenChange', this.handleFullScreenChange.bind(this));\n    },\n\n    startFullScreen(isAcd = false, requestingElem) {\n        //Ensure messengerElement in under orgspan-app element to support toast notification while in fullscreen\n        const messengerElement = Ember.$('ul.messenger');\n        const orgspanApp = Ember.$('.orgspan-app');\n        if (!Ember.$.contains(orgspanApp, messengerElement)) {\n            messengerElement.appendTo(orgspanApp);\n        }\n\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').addClass('hosted-fullscreen');\n        } else {\n            const elem = requestingElem ? $(requestingElem)[0] : $('.orgspan-app')[0];\n            const requestFullscreen =\n                elem.requestFullscreen ||\n                elem.webkitRequestFullscreen ||\n                elem.mozRequestFullScreen ||\n                elem.msRequestFullscreen;\n            requestFullscreen.apply(elem);\n        }\n\n        if (!isAcd) {\n            $('.orgspan-app').removeClass('fullscreen-v1');\n            $('.orgspan-app').addClass('fullscreen-v2');\n        } else {\n            $('.orgspan-app').removeClass('fullscreen-v2');\n            $('.orgspan-app').addClass('fullscreen-v1');\n        }\n\n        this.trigger('startFullscreen');\n    },\n\n    endFullScreen() {\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            $('.orgspan-app').removeClass('hosted-fullscreen');\n        } else {\n            const exitFullscreen =\n                document.exitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.mozCancelFullScreen ||\n                window.msExitFullscreen;\n            const ret = exitFullscreen.apply(document);\n            if (ret && ret.catch) {\n                ret.catch(() => {});\n            }\n        }\n\n        this.trigger('endFullscreen');\n    }\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport geoUtil from '../utils/geolocation';\nimport uuid from '../utils/uuid';\nimport { task } from 'ember-concurrency';\nimport moment from '../utils/dates';\n\nconst REPORT_FREQUENCY_IN_MINUTES = 60;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    currentPosition: {},\n    store: Ember.inject.service(),\n    session: Ember.inject.service(),\n    preferences: Ember.inject.service(),\n    application: Ember.inject.service(),\n    streaming: Ember.inject.service(),\n    geoUtil,\n    uuid: uuid,\n\n    isEnabled: Ember.computed.reads('isSwitchedOn'),\n    isSwitchedOn: false,\n\n    intervalReference: null,\n    isStarted: Ember.computed.and('geoWatchId', 'intervalReference'),\n\n    init() {\n        this._super(...arguments);\n        let context = this.get('application.hostedContext');\n        if (context && context.isHosted()) {\n            this.get('_desktopStart').perform();\n        } else {\n            this.get('start').perform();\n        }\n\n        this.get('geoUtil').setContext(context);\n    },\n\n    _lastReport: null,\n    report: Ember.observer('isSwitchedOn', 'streaming.connected', 'clientId', function () {\n        this.logger.debug(`GEOLOCATION: report observer fired`);\n        if (!this.get('isSwitchedOn') || !this.get('streaming.connected')) {\n            return;\n        }\n        const lastReport = this.get('_lastReport');\n        if (lastReport && moment().diff(lastReport, 'minutes') < REPORT_FREQUENCY_IN_MINUTES) {\n            return;\n        }\n        const clientId = this.get('clientId');\n        if (!clientId) {\n            return;\n        }\n        if (!this.get('geoUtil').isGeolocationAvailable()) {\n            this.logger.debug('GEOLOCATION: Not available');\n            return;\n        }\n        this.logger.debug(`GEOLOCATION: report observer triggering geo report`);\n        this.set('_lastReport', moment());\n        this.get('_reportCurrentPosition').perform(clientId);\n    }),\n\n    _desktopStart: task(function* () {\n        this.logger.debug('GEOLOCATION: Using desktop start');\n        let prefs = yield this.get('application.hostedContext').requestDesktopPromise({\n            cmd: 'getPreferences',\n            prefs: ['permission_geolocation']\n        });\n        if (prefs.permission_geolocation) {\n            this.logger.debug('GEOLOCATION: desktop preference on');\n            this.get('start').perform();\n        } else {\n            this.logger.debug('GEOLOCATION: desktop preference off', prefs);\n            try {\n                let result = yield this.get('store').findRecord('geolocation-settings', '1');\n                this.logger.debug(`GEOLOCATION: Got settings result`, result);\n                if (result.get('enabled')) {\n                    this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n                    this.set('isSwitchedOn', true);\n                }\n            } catch (e) {\n                this.logger.error('failed to get information about geolocation for this client', { error: e });\n            }\n        }\n    }),\n\n    start: task(function* () {\n        if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n            return;\n        }\n\n        try {\n            let result = yield this.get('store').findRecord('geolocation-settings', '1');\n            this.logger.debug(`GEOLOCATION: Got settings result`, result);\n            if (!result.get('enabled')) {\n                return;\n            }\n            this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n\n            let clientId = yield this.get('preferences').getPreference('geolocation.clientId');\n            this.logger.debug(`GEOLOCATION: client id is ${clientId}`);\n            if (!clientId) {\n                clientId = this.get('uuid').generate();\n                try {\n                    yield this.get('preferences').setPreference('geolocation.clientId', clientId, false);\n                    this.logger.debug('GEOLOCATION: client ID saved to preferences, start monitoring');\n                } catch (e) {\n                    this.logger.error(\n                        'GEOLOCATION: client id could not be saved locally.  Not sending geolocation...',\n                        e\n                    );\n                    return;\n                }\n            }\n\n            // will trip observer and report current position\n            this.setProperties({\n                isSwitchedOn: true,\n                clientId\n            });\n        } catch (e) {\n            this.logger.error('failed to get information about geolocation for this client', { error: e });\n        }\n    }),\n\n    _reportCurrentPosition: task(function* (clientId) {\n        let position = yield this.get('geoUtil').fetchCurrentPostion();\n        this.logger.debug('GEOLOCATION: checking if primary');\n        this.logger.debug('GEOLOCATION: session geolocation', this.get('session.publicApiUser.geolocation'));\n        try {\n            if (!this.get('session').get('isAuthenticated')) {\n                //geolocation is requested at session authentication, if we are authenticated we got it\n                yield this.get('session').refreshPublicApiUser('geolocation');\n            }\n            this.logger.debug('GEOLOCATION: refreshed logged in user', this.get('session.publicApiUser'));\n            let primary = this._isPrimary();\n            this.logger.debug('GEOLOCATION: reporting position to server', position, clientId);\n            let resultPosition = this.get('store').push({\n                data: {\n                    type: 'geolocation',\n                    attributes: {\n                        primary,\n                        id: clientId,\n                        latitude: position.coords.latitude,\n                        longitude: position.coords.longitude,\n                        type: 'web'\n                    },\n                    id: clientId\n                }\n            });\n            yield resultPosition.save();\n            this.set('currentPosition', position);\n            this._onPositionSaved(position);\n        } catch (e) {\n            this._onErrorSavingPosition(e);\n        }\n    }),\n\n    _isPrimary() {\n        let isPrimary =\n            !this.get('session.publicApiUser.geolocation.type') ||\n            (this.get('session.publicApiUser.geolocation.type') !== 'ios' &&\n                this.get('session.publicApiUser.geolocation.type') !== 'android');\n        this.logger.debug('GEOLOCATION: is primary: ', isPrimary);\n        return isPrimary;\n    },\n\n    _onPositionSaved(position) {\n        this.logger.debug('GEOLOCATION: position saved', position);\n    },\n\n    _onErrorSavingPosition(e) {\n        // 405 for the geolocation api means its turned off thru admin for this org\n        if (e.code === 405) {\n            this.set('isSwitchedOn', false);\n            this.logger.debug('GEOLOCATION: Geolocation services are disabled for this org');\n        } else {\n            // In the case of another geolocation error, we assume that it is switched on, but unable\n            // to send from the browser.  In this case we want to still see other's and our own.\n            this.set('isSwitchedOn', true);\n            this.logger.error('GEOLOCATION: an error occurred saving current position', { error: e });\n        }\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\n// service for tracking a group's assigned roles and those roles' associated divisions\nexport default Ember.Service.extend({\n    // key: \"The role id\n    // value: An object containing the following\n    //      id: \"The role id\"\n    //      role: \"The role object\"\n    //      divisions: \"An array of division objects assigned to the role\"\n    _map: {},\n\n    changeCount: 0,\n\n    list: Ember.computed('_map', 'changeCount', function () {\n        return _.map(this.get('_map'), roleWithDivisions => {\n            return roleWithDivisions;\n        });\n    }),\n\n    addRole(roleId, { divisions, id, role }) {\n        this.get('_map')[roleId] = { divisions, id, role };\n        this.incrementChangeCount();\n    },\n\n    removeRole(roleId) {\n        delete this.get('_map')[roleId];\n        this.incrementChangeCount();\n    },\n\n    getRoleWithDivisions(roleId) {\n        return this.get('_map')[roleId];\n    },\n\n    setMap(assignedRolesMap) {\n        this.clear();\n        this.set('_map', assignedRolesMap);\n    },\n\n    incrementChangeCount() {\n        this.set('changeCount', this.get('changeCount') + 1);\n    },\n\n    containsRole(roleId) {\n        return !!this.get('_map')[roleId];\n    },\n\n    clear() {\n        this.incrementChangeCount();\n        this.set('_map', {});\n    }\n});\n","define(\"connections-ui/services/headset\", [\"exports\", \"ember-softphone-integration/services/headset\"], function (_exports, _headset) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _headset.default;\n    }\n  });\n});\n","define(\"connections-ui/services/iframe-state\", [\"exports\", \"ember-purecloud-components/services/iframe-state\"], function (_exports, _iframeState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _iframeState.default;\n    }\n  });\n});\n","import Service from 'smoke-and-mirrors/services/in-viewport';\n\nexport default Service;\n","import Ember from 'ember';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport moment from 'connections-ui/utils/dates';\nimport { batchEntityIds } from './store';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\nconst { computed, inject } = Ember;\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst DEFAULT_PRESENCE_INTERVAL_SEC = 60;\nconst INTEGRATIONS_LOADED_EVENT = 'integrationsLoaded';\nconst PRESENCE_BATCH_SIZE_V2 = 25;\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\nconst USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT = 'gcucc.ui.useIntegrationPresenceSourceDirectorySearch';\nconst REDUCE_PRESENCE_POLLING_FT = 'gcucc-ui-PCUCC-3734';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    apps: inject.service(),\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    phoneIntegrations: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n    presencePollIntervalSec: DEFAULT_PRESENCE_INTERVAL_SEC,\n    presenceIntervalTimers: {},\n    presenceErrors: null,\n\n    presencePollInterval: computed('presencePollIntervalSec', function () {\n        return this.get('presencePollIntervalSec') * 1000;\n    }),\n\n    reducePresencePolling: computed('session.features', function () {\n        return this.getFeatureToggle(REDUCE_PRESENCE_POLLING_FT);\n    }),\n\n    useIntegrationPresenceDirectorySearch: Ember.computed('session.features', function () {\n        return this.getFeatureToggle(USE_PRESENCE_SOURCE_DIRECTORY_SEARCH_FT);\n    }),\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    alreadyTriggeredPresenceInterval: false,\n\n    triggerPresenceInterval: Ember.on(\n        'init',\n        // set up an observer to fire when integrations change\n        Ember.observer('phoneIntegrations.integrations.[]', function () {\n            const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n            // only trigger presence interval if we haven't already and we have integrations\n            if (phoneIntegrations.length > 0 && !this.get('alreadyTriggeredPresenceInterval')) {\n                this.toggleProperty('alreadyTriggeredPresenceInterval');\n                this.trigger(INTEGRATIONS_LOADED_EVENT);\n            }\n        })\n    ),\n\n    presenceUpdateInterval: Ember.on(INTEGRATIONS_LOADED_EVENT, function () {\n        const phoneIntegrations = this.get('phoneIntegrations.integrations').filter(\n            integration => integration.pollingEnabled\n        );\n        if (phoneIntegrations.length > 0) {\n            phoneIntegrations.forEach(integration => this._managePolling(integration));\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('presenceErrors', {});\n\n        // remove intervals if 401 happens\n        this.get('session').on('invalidatingAuthSession', this.removeAllPresenceIntervals.bind(this));\n    },\n\n    _managePolling(integration) {\n        const interval =\n            integration.pollIntervalSec && integration.pollIntervalSec > 0\n                ? integration.pollIntervalSec\n                : DEFAULT_PRESENCE_INTERVAL_SEC;\n        const presenceTimer = Ember.run.later(\n            this,\n            function () {\n                this._handlePresenceInterval(integration);\n                this._managePolling(integration);\n            },\n            interval * 1000\n        );\n        if (!this.get(`presenceIntervalTimers.${integration.key}`)) {\n            this.get('logger').debug(`Starting presence interval for ${integration.key}`, { integration });\n            this.set(`presenceIntervalTimers.${integration.key}`, {\n                timer: presenceTimer,\n                hasSession: false\n            });\n        }\n    },\n\n    removeAllPresenceIntervals() {\n        const timers = this.get('presenceIntervalTimers');\n        this.get('logger').info('Stopping all presence intervals due to 401', {\n            intervals: this.get('presenceIntervalTimers')\n        });\n        Object.keys(timers).forEach(timerKey => {\n            Ember.run.cancel(this.get(`presenceIntervalTimers.${timerKey}`));\n        });\n    },\n    removePresenceInterval(integration) {\n        this.get('logger').info(`Stopping the presence interval for ${integration.key}`, {\n            integration\n        });\n        const timer = this.get(`presenceIntervalTimers.${integration.key}`);\n        Ember.run.cancel(timer);\n    },\n\n    async updateSessionData(integration) {\n        const url = this.get('application').pcV2Uri(\n            `api/v2/integrations/unifiedcommunications/${integration.key}/auth/users/status`\n        );\n        const sessionData = await this.get('ajax').request(url);\n        if (sessionData) {\n            if (sessionData.code === 'session.not.available') {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n            } else {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, true);\n            }\n        }\n        return sessionData;\n    },\n\n    async _handlePresenceInterval(integration) {\n        try {\n            if (this.get('reducePresencePolling')) {\n                const hasSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                if (!hasSession) {\n                    await this.updateSessionData(integration);\n                    const fetchedSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                    if (!fetchedSession) {\n                        return;\n                    }\n                }\n            }\n            // try looking at the cache instead of making an api call\n            const users = this.get('store').peekAll('person');\n            const currentDate = moment();\n            const filteredUsers = users.filter(\n                user =>\n                    user.integrationContactInfo(integration.key) !== undefined &&\n                    user.integrationContactInfo(integration.key) !== null\n            );\n\n            // filter users based on presence modified date\n            let integrationUsers = filteredUsers.filter(user => {\n                const modifiedDate = user.get('integrationPresence.modifiedDate');\n                if (!modifiedDate) {\n                    return true;\n                }\n                return modifiedDate && this._isPresenceStale(currentDate, modifiedDate);\n            });\n\n            if (integrationUsers.length > 0) {\n                const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n                let batchSize = PRESENCE_BATCH_SIZE_V2;\n                // batch integration user ids\n                const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n\n                const authError = await this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds);\n                if (authError) {\n                    this._handleAuthError(integration);\n                    if (this.get('reducePresencePolling')) {\n                        this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n                    }\n                }\n            } else {\n                // log no users found\n                this.get('logger').info(\n                    `services/phone-integration: (${integration.key}): Did not find users to refresh presence.`\n                );\n            }\n        } catch (err) {\n            // scary err happened, stop the interval\n            this.removePresenceInterval(integration);\n            this.get('logger').error(`services/phone-integration: error fetching presence in interval`, {\n                err\n            });\n        }\n    },\n\n    /**\n     * Handle batch presence requests\n     * @param {*} integration client app integration\n     * @param {*} batchedIds 2d array, inner array is list of integration user ids\n     * @param {*} authErrors list of client app integration's that errored on auth\n     */\n    async _handleBatchPresenceRequest(integration, integrationUsers, batchedIds, bypassCache = false) {\n        let authError;\n        for (let i = 0; i < batchedIds.length; i++) {\n            const ids = batchedIds[i];\n            const idParams = ids.join(',');\n            const ucIntegrationId = integration.key;\n            const requestLatest = bypassCache ? 'true' : 'false'; // tells api to bypass cache if true\n            const url = this.get('application').pcV2Uri(\n                `api/v2/integrations/unifiedcommunications/${ucIntegrationId}/presences?requestLatest=${requestLatest}&id=${idParams}`\n            );\n            // ucIntegrationId should be the integration.key\n            try {\n                const presenceUserList = await this.get('ajax').request(url);\n\n                // for each presence response, find the user\n                // and update the presence for that user\n                // each user is an Ember model object so should update entire app\n                presenceUserList.forEach(presenceResponse =>\n                    this._handleIndividualPresenceResponse(integrationUsers, presenceResponse)\n                );\n            } catch (err) {\n                if (\n                    err.payload &&\n                    err.payload.message === 'Session not available, new authorization code must be defined!'\n                ) {\n                    authError = err;\n                    this.get('logger').warn(\n                        `services/phone-integration: You are not authenticated with the following 3rd party integration: ${integration.key}`,\n                        {\n                            err\n                        }\n                    );\n                    break;\n                } else {\n                    throw err;\n                }\n            }\n        }\n        return authError;\n    },\n\n    /**\n     * Finds and updates presence for integration user.\n     * @param {*} integrationUsers list of integration users\n     * @param {*} presenceResponse individual presence response\n     */\n    _handleIndividualPresenceResponse(integrationUsers, presenceResponse) {\n        const user = integrationUsers.find(u => u.get('id') === Ember.get(presenceResponse, 'userId'));\n        if (user) {\n            const presence = {\n                source: Ember.get(presenceResponse, 'source'),\n                message: Ember.get(presenceResponse, 'message'),\n                modifiedDate: Ember.get(presenceResponse, 'modifiedDate'),\n                presenceDefinition: Ember.get(presenceResponse, 'presenceDefinition')\n            };\n            Ember.set(user, 'activities.integrationPresence', presence);\n        }\n    },\n\n    _handleAuthError(integration) {\n        const hasShownError = this.get(`presenceErrors.${integration.key}`);\n        if (!hasShownError) {\n            const title = this.get('intl').t('integrationPresence.errors.auth.title');\n            // show specific toast with action handler\n            let message = this.get('intl').t(`integrationPresence.errors.auth.${integration.key}.message`);\n            this.get('notification').show({\n                title: title,\n                message: message,\n                hideAfter: 8,\n                type: 'info',\n                clickHandler: () => {}\n            });\n            this.set(`presenceErrors.${integration.key}`, true);\n        }\n    },\n\n    async alterUsersWithIntegration(users) {\n        const groupedUsers = this._groupUsersByIntegration(users);\n        const presenceSources = Object.keys(groupedUsers);\n        const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n        const promises = presenceSources.map(presenceSource => {\n            const integration = phoneIntegrations.find(\n                phoneIntegration =>\n                    phoneIntegration.integrationPresenceSource.toLowerCase() === presenceSource.toLowerCase()\n            );\n            const integrationUsers = groupedUsers[presenceSource];\n            const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n            let batchSize = PRESENCE_BATCH_SIZE_V2;\n            // batch integration user ids\n            const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n            // ensure that bypassCache is true to get latest presence requests\n            return this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds, true);\n        });\n\n        try {\n            await Promise.all(promises);\n        } catch (err) {\n            this.get('logger').error('services/integrations-presence: error occurred with alterUsersWithIntegration', {\n                err\n            });\n        }\n\n        return users;\n    },\n\n    _groupUsersByIntegration(users) {\n        const usersGroupedByIntegration = {};\n\n        for (const user of users) {\n            let integrationPhone = Ember.get(user, 'integrationPhone');\n            let integrationKey = integrationPhone && integrationPhone.value.integration;\n            const integrationConfig = this.get('phoneIntegrations').getIntegration(integrationKey);\n            if (integrationConfig) {\n                const presenceSource = integrationConfig.integrationPresenceSource;\n                if (!usersGroupedByIntegration[presenceSource]) {\n                    usersGroupedByIntegration[presenceSource] = [];\n                }\n                usersGroupedByIntegration[presenceSource].push(user);\n            }\n        }\n\n        return usersGroupedByIntegration;\n    },\n\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    },\n    _isPresenceStale(currentDate, modifiedDate) {\n        let diffInMS = moment(currentDate).diff(moment(modifiedDate));\n        return diffInMS > this.get('presencePollInterval');\n    },\n    _isGCOffline(user) {\n        const presenceDefinition = user.get('activities.presence.presenceDefinition');\n        return isPresence(this.get('session.presenceMap'), presenceDefinition, 'offline');\n    }\n});\n","import Ember from 'ember';\nexport default Ember.Service.extend({});\n","define(\"connections-ui/services/interval\", [\"exports\", \"ember-purecloud-components/services/interval\"], function (_exports, _interval) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _interval.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport IntlService from 'ember-intl/services/intl';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport config from 'connections-ui/config/environment';\nimport moment from 'connections-ui/utils/dates';\nimport escape from 'connections-ui/utils/escape';\nimport missingMessage from 'connections-ui/utils/intl/missing-message';\nimport { getEnvCookieDomain } from 'connections-ui/utils/net';\nimport { isTesting } from 'connections-ui/utils/testing';\n\nconst { get, inject, computed, RSVP } = Ember;\n\nconst addServerPrefix = function (key) {\n    return `server_translations.${key}`;\n};\n\nconst safeString = function (s) {\n    return Ember.String.htmlSafe(s);\n};\n\nconst rtlLangs = ['he', 'ar'];\n\n// Object [locale String]: languageName String\n// values come directly from each locale's `languageName` key\nconst languages = config.APP.INTL_LANGUAGES;\nconst localeCookie = 'pcAuth-userPrefLangTag';\nconst localeCookieOptions = {\n    path: '/',\n    expires: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000)\n    // expiration is 90 days into the future\n};\n\nexport default IntlService.extend({\n    ajax: inject.service(),\n    cookies: inject.service(),\n    application: inject.service(),\n\n    loaded: false,\n    loadedPromise: null,\n\n    languages,\n    baseLocale: 'en-us',\n    supportedLocales: Object.keys(languages),\n\n    systemLocale: computed('baseLocale', function () {\n        const { languages, language, userLanguage } = window.navigator;\n        const lang = Array.isArray(languages) && languages[0];\n        const navLocale = lang || language || userLanguage;\n        if (navLocale) {\n            return navLocale;\n        }\n        return this.get('baseLocale');\n    }),\n\n    isRTL: computed('isoLocale', function () {\n        const isoLocale = this.get('isoLocale');\n        return rtlLangs.includes(isoLocale);\n    }),\n\n    isoLocale: computed('locale.firstObject', function () {\n        return this.get('locale.firstObject');\n    }),\n\n    iso2LocaleCountry: computed('isoLocale', function () {\n        const isoLocale = this.get('isoLocale');\n        if (isoLocale) {\n            const countryData = window.intlTelInputGlobals.getCountryData();\n            const region = isoLocale.split('-')[1] || isoLocale;\n            if (region) {\n                return _.find(countryData, country => country && country.iso2 === region);\n            }\n        }\n        return null;\n    }),\n\n    isoRegionalLocale: computed('isoLocale', function () {\n        const [locale, region] = this.get('isoLocale').split('-');\n        if (region) {\n            return `${locale}-${region.toUpperCase()}`;\n        }\n        return locale;\n    }),\n\n    t(key, opts, noEscape) {\n        if (!key) {\n            Ember.Logger.warn('There was no key provided to translate.');\n            return '';\n        }\n\n        if (noEscape === true) {\n            return this._super(key, opts);\n        }\n        if (!opts) {\n            return this._super(key);\n        }\n\n        return this._super(key, escape(opts));\n    },\n\n    _initialLocale() {\n        const authLocale = this.get('cookies').read(localeCookie);\n        const systemLocale = this.get('systemLocale');\n        return authLocale || systemLocale;\n    },\n\n    _normalizeLocale(locale, localeRootFallback = true) {\n        locale = locale.toLowerCase().replace('_', '-');\n        if (locale.startsWith('en')) {\n            locale = 'en-us';\n        }\n        if (locale.startsWith('nn') || locale.startsWith('nb')) {\n            // Norwegian: nn-NO; nb-NO in Windows\n            locale = 'no';\n        }\n        const supportedLocales = this.get('supportedLocales');\n        if (!supportedLocales.includes(locale)) {\n            const rootLocale = locale.slice(0, 2);\n            if (supportedLocales.includes(rootLocale)) {\n                return rootLocale;\n            } else if (localeRootFallback) {\n                return supportedLocales.find(lang => {\n                    return lang.slice(0, 2) === rootLocale;\n                });\n            } else {\n                return null;\n            }\n        }\n        return locale;\n    },\n\n    getWithServerKey(key) {\n        return safeString(this.t(addServerPrefix(key)));\n    },\n\n    lookup(key, replacements, suppressError) {\n        if (this.exists(addServerPrefix(key))) {\n            return this.getWithServerKey(key);\n        }\n\n        if (!this.exists(key)) {\n            if (!isTesting && this.get('loaded')) {\n                Ember.Logger.warn('Undefined intl key', { key, locale: this.get('locale') });\n            }\n            return missingMessage(key, [this.get('locale')], suppressError);\n        }\n\n        //Achieves parity with old i18n functionality: all HTML was allowed in all translation strings\n        return safeString(this.t(key, replacements || {}));\n    },\n\n    query(key) {\n        return this.exists(key) || this.exists(addServerPrefix(key));\n    },\n\n    setLocale(locales) {\n        if (!Array.isArray(locales)) {\n            locales = [locales];\n        }\n\n        let validLocales = locales.map(l => this._normalizeLocale(l)).filter(l => l);\n\n        const baseLocale = this.get('baseLocale');\n        if (!validLocales.includes(baseLocale)) {\n            validLocales.push(baseLocale);\n        }\n\n        if (validLocales.length) {\n            // Set the moment locale\n            const lang = moment.locale(validLocales[0]);\n\n            // Set HTML locale (moment.locale returns just the language portion)\n            Ember.$('html').attr('lang', lang);\n        }\n\n        return this._super(validLocales);\n    },\n\n    setPreferredLanguage(locale) {\n        const safeLocale = this._normalizeLocale(locale);\n        if (!safeLocale) {\n            const error = new Error(`\"${locale}\" is not a supported locale.`);\n            return RSVP.reject(error);\n        }\n\n        try {\n            let dynamicCookieOptions = {\n                domain: getEnvCookieDomain()\n            };\n\n            if (window && window.location && window.location.protocol === 'https:') {\n                dynamicCookieOptions.secure = true;\n            }\n\n            if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n                dynamicCookieOptions.sameSite = 'none';\n            }\n\n            const options = Ember.assign(dynamicCookieOptions, localeCookieOptions);\n            this.get('cookies').write(localeCookie, safeLocale, options);\n\n            return RSVP.resolve();\n        } catch (e) {\n            let msg = 'Failed to persist new locale setting.';\n            if (e && e.message) {\n                msg += `  Details: ${e.message}`;\n            }\n            return RSVP.reject(new Error(msg));\n        }\n    },\n\n    isLocale12Hour() {\n        return moment.localeData(this.get('locale')).longDateFormat('LT').indexOf('A') > -1;\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_cache', {});\n        this.setLocale(this._initialLocale());\n\n        const defer = RSVP.defer();\n        this.setProperties({\n            _loadedResolve: defer.resolve,\n            loadedPromise: defer.promise\n        });\n    },\n\n    loadLanguage(locale) {\n        return this.get('ajax')\n            .request(`${this.get('application.urlprefix')}translations/${locale}.json`, { contentType: 'text/plain' })\n            .then(text => {\n                if (!text) {\n                    return RSVP.resolve();\n                }\n\n                try {\n                    // gotta be careful here...\n                    let lang = text;\n                    if (typeof text === 'string') {\n                        lang = JSON.parse(text);\n                    }\n                    if (lang) {\n                        get(this, '_cache')[locale] = lang;\n                        return this.addTranslations(locale, lang);\n                    }\n                } catch (e) {\n                    return RSVP.resolve();\n                }\n            });\n    },\n\n    loadTranslations() {\n        const baseLocale = this.get('baseLocale');\n        const isoLocale = this.get('isoLocale');\n        const locales = [baseLocale];\n        if (isoLocale !== baseLocale) {\n            locales.push(isoLocale);\n        }\n        const translations = locales.map(locale => {\n            let cache = get(this, '_cache');\n            const cached = get(cache, locale);\n            if (cached) {\n                return Ember.RSVP.resolve(cached);\n            }\n            return this.loadLanguage(locale);\n        });\n        return Ember.RSVP.all(translations).then(() => {\n            this.set('loaded', true);\n            this.get('_loadedResolve')();\n        });\n    },\n\n    setupServerTranslations() {\n        // go ahead and kick off local file loading\n        this.loadTranslations();\n\n        const locale = this.get('isoLocale');\n        const url = this.get('application').pcV2Uri('api/v2/languages/translations/organization');\n\n        const defaultRequest = this.get('ajax').request(url, {\n            data: {\n                language: 'en-us'\n            }\n        });\n\n        let localeRequest = Ember.RSVP.resolve({});\n        if (locale !== 'en-us') {\n            localeRequest = this.get('ajax').request(url, {\n                data: {\n                    language: locale\n                }\n            });\n        }\n\n        return Ember.RSVP.allSettled([defaultRequest, localeRequest])\n            .then(([defaultTranslationsResult, localeTranslationsResult]) => {\n                const defaultTranslations = defaultTranslationsResult.value;\n                const localeTranslations = localeTranslationsResult.value;\n\n                if (!defaultTranslations) {\n                    Ember.Logger.warn(\"Couldn't load API translations\", {\n                        remoteData: {\n                            reason: defaultTranslationsResult.reason\n                        }\n                    });\n                    return;\n                }\n\n                if (_.isEmpty(localeTranslations)) {\n                    return this.addTranslations(locale, { server_translations: defaultTranslations });\n                }\n\n                _.forIn(defaultTranslations, (value, key) => {\n                    if (!Object.prototype.hasOwnProperty.call(localeTranslations, key)) {\n                        localeTranslations[key] = value;\n                    }\n                });\n\n                return this.addTranslations(locale, { server_translations: localeTranslations });\n            })\n            .catch(err => {\n                Ember.Logger.warn(\"Couldn't load API translations:\", { err });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { PROVIDER_ID as INTERNAL_VIDEO_PROVIDER_ID } from 'connections-ui/media-providers/purecloud';\nimport LoggerMixin from '../mixins/logger';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    chat: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    webrtc: Ember.inject.service(),\n    session: Ember.inject.service(),\n    permissions: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n\n    defaultVideoProviders: null,\n\n    activeProvider: null,\n\n    getProvidersForUser(type, user, chatRoom) {\n        if (type === 'video') {\n            return this.getVideoProviders(user, chatRoom);\n        }\n        return [];\n    },\n\n    getProvider(name, user) {\n        return this.lookup(name, user);\n    },\n\n    getVideoProviders(user, chatRoom = null) {\n        if (!user && !chatRoom) {\n            return [];\n        }\n\n        return [\n            this.lookup('purecloud', user, chatRoom),\n            this.lookup('zoom', user, chatRoom),\n            this.lookup('teams', user, chatRoom)\n        ];\n    },\n\n    usingVideoProvider: Ember.computed('activeProvider.type', function () {\n        return this.get('activeProvider.type') === 'video';\n    }),\n\n    enabled: Ember.computed.or('teamsEnabled', 'zoomMeetingsEnabled'),\n    zoomMeetingsEnabled: Ember.computed.readOnly('permissions.canViewZoomMeetings'),\n    teamsEnabled: Ember.computed.readOnly('permissions.canViewTeamsMeetings'),\n\n    // Internal\n\n    handleLogout(blockLogoutCb) {\n        if (this.get('usingVideoProvider')) {\n            blockLogoutCb('add', this);\n\n            let title = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.title');\n            let message = this.get('intl').t('mediaProviders.zoom.errors.cannotLogout.message');\n            this.get('notification').error(title, message);\n        } else {\n            blockLogoutCb('remove', this);\n        }\n    },\n\n    lookup(providerName, user, chatRoom) {\n        const provider = Ember.getOwner(this).lookup(`media-provider:${providerName}`);\n        provider.set('user', user);\n        provider.set('room', chatRoom);\n        provider.set('debug', this.get('debug'));\n        provider.loadData();\n        return provider;\n    },\n\n    userHasVideoMediaProviders(user) {\n        const providers = this.getProvidersForUser('video', user).filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }\n});\n\n/**\n * Returns true if the provided list of providers contains an enabled,\n * supplemental (e.g. teams, zoom) video provider.\n * @param {Ember.Object[]} providers A list of provider Ember instances\n * @returns true if providers contains an enabled, supplemental provider;  false otherwise.\n */\nexport function hasSupplementalVideoProvider(providers) {\n    return providers.some(\n        currProvider =>\n            currProvider.get('type') === 'video' &&\n            currProvider.get('haveAccess') &&\n            currProvider.get('id') &&\n            currProvider.get('id') !== INTERNAL_VIDEO_PROVIDER_ID\n    );\n}\n","import Ember from 'ember';\nimport ENV from '../config/environment';\n\nconst { computed, Service } = Ember;\n\nfunction computedFromConfig(prop) {\n  return computed(function(){\n    return ENV['ember-modal-dialog'] && ENV['ember-modal-dialog'][prop];\n  });\n}\n\nexport default Service.extend({\n  hasEmberTether: computedFromConfig('hasEmberTether'),\n  hasLiquidWormhole: computedFromConfig('hasLiquidWormhole'),\n  hasLiquidTether: computedFromConfig('hasLiquidTether'),\n  destinationElementId: computed(function() {\n    /*\n      everywhere except test, this property will be overwritten\n      by the initializer that appends the modal container div\n      to the DOM. because initializers don't run in unit/integration\n      tests, this is a nice fallback.\n    */\n    if (ENV.environment === 'test') {\n      return 'ember-testing';\n    }\n  })\n});\n","import Ember from 'ember';\nimport MomentService from 'ember-moment/services/moment';\nimport config from '../config/environment';\n\nconst { get } = Ember;\n\nexport default MomentService.extend({\n  defaultFormat: get(config, 'moment.outputFormat')\n});\n","import Ember from 'ember';\n\nexport default Ember.Service.extend({\n    intl: Ember.inject.service(),\n    session: Ember.inject.service(),\n\n    _getNamePart: function (externalContact, namePart) {\n        const result = externalContact[namePart];\n        return (\n            (typeof result === 'string' ? result : false) || (externalContact.get ? externalContact.get(namePart) : '')\n        );\n    },\n\n    _getNames: function (externalContact) {\n        return {\n            familyName: this._getNamePart(externalContact, 'lastName'),\n            givenName: this._getNamePart(externalContact, 'firstName')\n        };\n    },\n\n    initials: function (externalContact) {\n        // TODO: RELATE-1038 UI - ACD Need to localize the code for harvesting initials for display when transferring a call to a Relate External contact\n        const { familyName, givenName } = this._getNames(externalContact);\n\n        if (givenName) {\n            const givenNameInitial = givenName.charAt(0).toUpperCase();\n            if (familyName) {\n                const familyNameInitial = familyName.charAt(0).toUpperCase();\n                return this.get('intl').t('purecloud.acdInteraction.relate.misc.initials', {\n                    givenNameInitial,\n                    familyNameInitial\n                });\n            }\n            return givenNameInitial;\n        }\n        if (familyName) {\n            return familyName.charAt(0).toUpperCase();\n        }\n        return '';\n    },\n\n    fullName: function (externalContact) {\n        if (!externalContact) {\n            return;\n        }\n\n        const { familyName, givenName } = this._getNames(externalContact);\n        const optionalMiddleName = this._getNamePart(externalContact, 'middleName') || null;\n        if (familyName) {\n            if (givenName) {\n                return this.get('intl').lookup('purecloud.acdInteraction.relate.misc.fullName', {\n                    familyName,\n                    givenName,\n                    optionalMiddleName\n                });\n            } else {\n                return familyName;\n            }\n        }\n        return givenName;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\n\nconst { Evented } = Ember;\n\nexport default Ember.Service.extend(Evented, {\n    notification: Ember.inject.service(),\n    embedded: Ember.inject.service(),\n    logger: Ember.inject.service('stash-logger'),\n\n    _notificationId: 0,\n    _actionHandles: {},\n    _clickHandlers: [],\n\n    nextNotificationId: Ember.computed('_notificationId', function () {\n        const currentNotificationId = this.get('_notificationId');\n        return (currentNotificationId || 0) + 1;\n    }),\n\n    _cleanUpHandlers(id) {\n        const handles = this.get('_actionHandles');\n        delete handles[id];\n    },\n\n    handleNotificationAction(action, id) {\n        const handles = this.get('_actionHandles');\n        const clickHandlers = this.get('_clickHandlers');\n\n        if (handles[id]) {\n            const handler = _.find(handles[id], v => {\n                return v.actionKey === action;\n            });\n\n            if (handler && typeof handler.action === 'function') {\n                handler.action(handler.target);\n                this._cleanUpHandlers(id);\n            } else if (handler && handler.target && handler.target[handler.actionKey]) {\n                handler.target[handler.actionKey](handler.target);\n                this._cleanUpHandlers(id);\n            } else {\n                this.get('logger').error('Attempted to invoke undefined notification handler.');\n            }\n\n            this.set('_actionHandles', handles);\n        }\n\n        if (action === 'clickHandlerTriggered') {\n            if (typeof clickHandlers[id] === 'function') {\n                clickHandlers[id]();\n            } else {\n                this.get('logger').error(\n                    `Attempted to trigger a click handler that isnt a function or was not registered. Click handler at id: ${id} is ${clickHandlers[\n                        id\n                    ].toString()}\\n`\n                );\n            }\n        }\n    },\n\n    requestNotification(title, message = '', custom = {}, type = 'info') {\n        let options = _.pick(custom, [\n            'id',\n            'hideAfter',\n            'tag',\n            'type',\n            'forceBrowserNotification',\n            'icon',\n            'showCloseButton',\n            'messageStyle',\n            'shouldShowPopup',\n            'shouldPlaySound',\n            'markdownToHtml',\n            'fallbackToInBrowser',\n            'showNotificationEverywhere'\n        ]);\n\n        // Legacy api was tag only. Copy as id for events, etc.\n        if (options.tag && !options.id) {\n            options.id = options.tag;\n        }\n\n        // Escape safe srings\n        if (title && title.string) {\n            title = title.string;\n        }\n\n        // Set notification id\n        if (!options.id) {\n            const nextNotificationId = this.get('nextNotificationId');\n            const generatedIdentifier = `connections-ui-notification-${nextNotificationId}`;\n\n            // Add an ID to the notification so it can be associated with notification actions from the iframe host\n            options.id = generatedIdentifier;\n            options.tag = generatedIdentifier;\n\n            // Messages after this one should have a different gnerated identifier\n            this.incrementProperty('_notificationId');\n        }\n\n        if (custom.clickHandler) {\n            let clickHandlers = this.get('_clickHandlers') || [];\n            let clickHandlerFunction = custom.clickHandler;\n            let id = options.id;\n            if (!clickHandlers[id] && typeof clickHandlerFunction === 'function') {\n                clickHandlers[id] = clickHandlerFunction;\n            }\n            options.clickHandler = true;\n        }\n\n        // Store action handles\n        if (custom.actionHandlers && custom.target) {\n            let handles = this.get('_actionHandles') || [];\n            let id = options.id;\n\n            if (!handles[id]) {\n                handles[id] = {};\n            }\n\n            // Normalize and store handlers\n            _.forEach(custom.actionHandlers, (value, key) => {\n                let action, label;\n                if (value.action) {\n                    action = value.action;\n                    label = value.label;\n                } else {\n                    action = '';\n                    label = value;\n                }\n\n                handles[id][key] = {\n                    actionKey: key,\n                    action: action,\n                    target: custom.target,\n                    label: label\n                };\n            });\n\n            this.set('_actionHandles', handles);\n\n            // Normalize labels before sending to web-dir\n            let handlers = {};\n            _.forEach(custom.actionHandlers, (value, key) => {\n                if (value.action) {\n                    handlers[key] = value.label;\n                } else {\n                    handlers[key] = value;\n                }\n            });\n\n            options.actionHandlers = handlers;\n        }\n\n        options.type = type;\n\n        const notification = {\n            message,\n            custom: options\n        };\n\n        if (title) {\n            notification.title = title;\n        }\n        this.get('embedded').requestNotification(notification);\n        return notification;\n    },\n\n    info(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').info(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'info');\n    },\n\n    error(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').error(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'error');\n    },\n\n    success(title, message, options = {}) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').success(...arguments);\n        }\n        if (title && typeof title !== 'string') {\n            title = title.toString();\n        }\n        if (message && typeof message !== 'string') {\n            message = message.toString();\n        }\n        return this.requestNotification(title, message, options, 'success');\n    },\n\n    dismiss(id) {\n        if (!this.get('embedded.isEmbedded')) {\n            this._cleanUpHandlers(id);\n            return this.get('notification').dismissNotification(id);\n        }\n        this.get('embedded').dismissNotification(id);\n    },\n\n    // TODO: we'll need to replumb defined action handlers\n    // on this legacy option for things like answering from toasts\n    show(options) {\n        if (!this.get('embedded.isEmbedded')) {\n            return this.get('notification').show(options);\n        }\n        return this.requestNotification(options.title, options.message, options, options.type);\n    }\n});\n","define(\"connections-ui/services/notification\", [\"exports\", \"ember-purecloud-components/services/notification\"], function (_exports, _notification) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _notification.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst {\n    inject: { service },\n    RSVP: { resolve }\n} = Ember;\n\nexport default Ember.Service.extend(LoggerMixin, {\n    ajax: service(),\n    application: service(),\n\n    /**\n     * Fetches organization settings from the API\n     * @returns {Promise} A promise that resolves with the updated preferences\n     */\n    fetchOrgSettings(orgSettings) {\n        const path = 'api/v2/organizations/settings';\n        const url = this.get('application').pcV2Uri(path);\n\n        return this.get('ajax')\n            .ajaxGet(url)\n            .then(response => {\n                // Create or update the orgSettings object\n                if (!orgSettings) {\n                    orgSettings = Ember.Object.create();\n                }\n\n                orgSettings.set('freeSeating', response.freeSeating);\n                orgSettings.set('popoutAuthForIframes', response.popoutAuthForIframes);\n\n                return orgSettings;\n            })\n            .catch(error => {\n                this.logger.error('Failed to fetch org settings:', { error });\n                return resolve({});\n            });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { inject, computed, Service } = Ember;\nconst WILDCARD = '*';\n\nfunction isPermissionInList(item, targetList) {\n    let inList = item === WILDCARD || targetList === WILDCARD;\n\n    if (!inList) {\n        const listItems = targetList.split(',');\n\n        inList = _.includes(listItems, item);\n    }\n\n    return inList;\n}\n\n/**\n * Compare provided permission divisions against a secific division\n *\n * @item the division to look for\n * @targetList comma-delimited string representation of permission divisions\n */\nfunction shouldAllowBasedOnDivision(item, targetList) {\n    // if the wildcard is present in permission list\n    // if no divisions are returned from PAPI\n    // if the requested division is the WILDCARD\n    // if the requested division was an empty string\n    // -- bypass the division check\n    if (targetList.length === 0 || targetList === WILDCARD || item === WILDCARD || item.length === 0) {\n        return true;\n    }\n\n    const divisions = targetList.split(',');\n    return divisions.includes(item);\n}\n\nfunction isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction) {\n    let domainPermissionMap = _.head(_.map(_.filter(allowedOrgPermissions, { domain: targetDomain }), 'permissionMap'));\n\n    domainPermissionMap = _.flatten(_.map(domainPermissionMap, value => value));\n\n    return (\n        domainPermissionMap &&\n        domainPermissionMap.length &&\n        (targetEntity === WILDCARD || _.find(domainPermissionMap, { entityType: targetEntity })) &&\n        (targetAction === WILDCARD || _.find(domainPermissionMap, { action: targetAction }))\n    );\n}\n\nexport function checkDonutPermission(permissions, permissionValue, allowedOrgPermissions, targetDivision) {\n    let isAllowed = false;\n\n    if (!permissions) {\n        permissions = [];\n    }\n\n    //change domain:* -> domain:*:*\n    if (permissionValue.match(/^[a-zA-Z0-9]+:\\*$/)) {\n        permissionValue = permissionValue.replace('*', '*:*');\n    }\n\n    const permissionsToValidate = permissionValue.split(':'),\n        targetDomain = permissionsToValidate[0],\n        targetEntity = permissionsToValidate[1],\n        targetAction = permissionsToValidate[2];\n\n    if (isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction)) {\n        permissions.forEach(function (permission) {\n            const permissions = permission.split(':'),\n                domain = permissions[0],\n                entity = permissions[1],\n                actionSet = permissions[2],\n                divisions = permissions[3] || '';\n\n            if (targetDomain === domain) {\n                const matchesEntity = isPermissionInList(targetEntity, entity);\n                const matchesAction = isPermissionInList(targetAction, actionSet);\n                const matchesDivision = shouldAllowBasedOnDivision(targetDivision, divisions);\n\n                if (matchesEntity && matchesAction && matchesDivision) {\n                    isAllowed = true;\n                }\n            }\n        });\n    }\n\n    return isAllowed;\n}\n\nexport default Service.extend(LoggerMixin, {\n    session: inject.service(),\n\n    permissions: computed.reads('session.permissions'),\n    rolePermissions: computed.reads('session.roleNames'), //Deprecated\n    allowedOrgPermissions: computed.reads('session.allowedOrgPermissions'),\n    trusteeOrg: computed.reads('session.trusteeOrg'),\n\n    hasUnifiedCommunications: computed('session.org.hasUnifiedCommunications', 'trusteeOrg', function () {\n        return !!(\n            this.get('session.org.hasUnifiedCommunications') || this.get('trusteeOrg.features.unifiedCommunications')\n        );\n    }),\n\n    directoryPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, '_');\n        });\n    }),\n\n    donutPermissions: computed('permissions.[]', function () {\n        const permissions = this.get('permissions');\n        return _.filter(permissions, permission => {\n            return _.includes(permission, ':');\n        });\n    }),\n\n    validateDonutPermission: function (permission, division = '*') {\n        const isAuthenticated = this.get('session.isAuthenticated');\n        const logger = this.get('logger');\n\n        if (!isAuthenticated) {\n            logger.debug('attempted to check a permission before authenticated', { permission });\n        }\n\n        if (typeof division !== 'string') {\n            logger.error('Division argument for permission check must be a string.');\n            return false;\n        }\n\n        return checkDonutPermission(\n            this.get('donutPermissions'),\n            permission,\n            this.get('allowedOrgPermissions'),\n            division.trim()\n        );\n    },\n\n    validateAllPermissions: function (permissionsList) {\n        return (permissionsList || []).every(permission => this.validateDonutPermission(permission));\n    },\n\n    validateAnyPermissions: function (permissionsList) {\n        const permissionsSet = permissionsList || [];\n        return permissionsSet.some(permission => this.validateDonutPermission(permission));\n    },\n\n    canCreateGroups: computed('directoryPermissions.[]', 'donutPermissions.[]', function () {\n        const permissions = this.get('directoryPermissions');\n        const hasDirectoryPermissions =\n            _.includes(permissions, 'group_creation') || _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:add');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canDeleteGroups: computed('directoryPermissions.[]', 'donutPermissions', function () {\n        const permissions = this.get('directoryPermissions');\n        const hasDirectoryPermissions = _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:edit');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canInvitePeople: computed('directoryPermissions.[]', function () {\n        const permissions = this.get('directoryPermissions');\n        return _.includes(permissions, 'person_administration');\n    }),\n\n    canViewQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:view');\n    }),\n\n    canViewQueueObservations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:queueObservation:view');\n    }),\n\n    canViewAcdScreenShare: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('acdscreenshare:session:view');\n    }),\n\n    canViewAcdCoBrowseForCall: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:voice:escalate')\n        );\n    }),\n\n    canViewAcdCoBrowseForChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:chat:escalate')\n        );\n    }),\n\n    canViewBusinessChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:chat:access');\n    }),\n\n    canViewCollaborateVideo: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('video:video:access');\n    }),\n\n    hasVoicemailAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('voicemail:*:*');\n    }),\n\n    canViewAnAgentsSchedule: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            (this.validateDonutPermission('wfm:activityCode:administer') ||\n                this.validateDonutPermission('wfm:activityCode:view')) &&\n            (this.validateDonutPermission('wfm:schedule:administer') ||\n                this.validateDonutPermission('wfm:schedule:view')) &&\n            this.get('hasAgentSupervisorAccess')\n        );\n    }),\n\n    hasAgentSupervisorAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('ui:supervisorAgentDetails:view') && this.get('canViewUsers');\n    }),\n\n    hasRelateAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:*:*');\n    }),\n\n    hasExternalContactsViewContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:view');\n    }),\n\n    // Checking against the donut permission: conversation:call:add or unified_communications\n    // Eventually when unified_communications is removed, we can remove the check here\n    phoneEnabled: computed(\n        'hasUnifiedCommunications',\n        'donutPermissions',\n        'directoryPermissions.[]',\n        'allowedOrgPermissions.[]',\n        function () {\n            const hasUnifiedCommunications = this.get('hasUnifiedCommunications');\n            const legacyUnifiedCommunicationsPermission = _.includes(\n                this.get('directoryPermissions'),\n                'unified_communications'\n            );\n            const canCall = this.validateDonutPermission('conversation:call:add');\n\n            const phoneEnabled = hasUnifiedCommunications && (legacyUnifiedCommunicationsPermission || canCall);\n            return phoneEnabled;\n        }\n    ),\n\n    conferenceEnabled: true,\n\n    canCallForward: computed('phoneEnabled', 'donutPermissions', 'allowedOrgPermissions.[]', function () {\n        return this.validateDonutPermission('conversation:callForwarding:edit') && this.get('phoneEnabled');\n    }),\n\n    canRecord: computed('rolePermissions', 'donutPermisions', 'allowedOrgPermissions.[]', function () {\n        const canRecord = this.validateDonutPermission('conversation:call:record');\n        const isBusinessUserOrSupervisor =\n            this.get('rolePermissions').indexOf('businessUser') > -1 ||\n            this.get('rolePermissions').indexOf('supervisor') > -1;\n        return isBusinessUserOrSupervisor || canRecord;\n    }),\n\n    hasEngageAccess: computed('session.org.enabledFeatures.{purecloud,contactCenter}', function () {\n        let hasContactCenter = this.get('session.org').getFieldValue('enabledFeatures.contactCenter');\n        return hasContactCenter && hasContactCenter.value;\n    }),\n\n    canViewUsers: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canEditProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:edit');\n    }),\n\n    canReadProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canViewGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:view');\n    }),\n\n    canEditGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:edit');\n    }),\n\n    canDeleteParticipantFromGroup: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:participant:delete');\n    }),\n\n    canViewZoomMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:zoomMeetings:view');\n    }),\n\n    canViewTeamsMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:microsoftTeamsMeetings:view');\n    }),\n\n    canTargetUserSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canTargetQueueSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canViewIntegrationPresence: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('integration:presence:view');\n    }),\n\n    canViewUCIntegrations: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:unifiedCommunications:view');\n    }),\n\n    canViewPresenceDefinition: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('presence:presenceDefinition:view');\n    }),\n\n    canViewSummary: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:summary:view');\n    }),\n\n    canEditGroupTelephonySettings: computed(\n        'donutPermissions',\n        'allowedOrgPermissions',\n        'session.features',\n        function () {\n            return this.validateDonutPermission('telephony:plugin:all');\n        }\n    )\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nconst { computed, inject } = Ember;\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst CONFIG_PAGE_SIZE = 25;\nconst CONFIGS_API_URL_V2 = 'api/v2/integrations/unifiedcommunications/clientapps'; // New integrations config endpoint\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, {\n    application: inject.service(),\n    ajax: inject.service(),\n    session: inject.service(),\n    intl: inject.service(),\n    permissions: inject.service(),\n    store: inject.service(),\n    notification: inject.service('notification-proxy'),\n    integrationsPresence: inject.service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n\n    integrations: computed('allApps', 'permissions.donutPermissions', 'permissions.allowedOrgPermissions', function () {\n        const allApps = this.get('allApps');\n        return allApps.filter(this._isValidIntegrationTab.bind(this));\n    }),\n\n    allApps: [],\n    integrationConfigs: [],\n\n    onAuthenticated: Ember.on(\n        'init',\n        Ember.observer('session.isAuthenticated', async function () {\n            // only try to fetch configs if we're authenticated\n            if (this.get('session.isAuthenticated') && !this.get('integrationConfigsInitialized')) {\n                this.toggleProperty('integrationConfigsInitialized');\n\n                this._fetchConfigs()\n                    .then(configs => {\n                        this.set('integrationConfigs', configs);\n\n                        // configs have enough information to gate users\n                        this.set('allApps', configs);\n                    })\n                    .catch(err => {\n                        this.get('logger').error(\n                            `services/phone-integration: Phone Integration Service: error fetching integration configurations`,\n                            { err }\n                        );\n                    });\n            }\n        })\n    ),\n\n    init() {\n        this._super(...arguments);\n\n        // use this to trigger observer to fetch configs\n        this.get('session.isAuthenticated');\n    },\n    getIntegrationTabs() {\n        const integrations = this.get('integrations');\n        const tabs = [\n            GENESYS_SEARCH_TAB,\n            ...integrations.map(integration => {\n                return {\n                    key: integration.key,\n                    integrationPresenceSource: integration.integrationPresenceSource,\n                    icon: integration.icon,\n                    translation: integration.translation\n                };\n            })\n        ];\n        return integrations.length > 0 ? tabs : [];\n    },\n    getIntegration(key) {\n        const integrations = this.getIntegrationTabs();\n        return integrations.find(i => i.key === key);\n    },\n\n    canViewThirdPartyPresence(source) {\n        const integration = this.getIntegrationFromSource(source);\n        return integration && this._isValidIntegrationTab(integration);\n    },\n\n    getIntegrationFromSource(source) {\n        const allApps = this.get('allApps');\n        return allApps.find(integration => {\n            return (\n                integration.integrationPresenceSource &&\n                integration.integrationPresenceSource.toLowerCase() === source.toLowerCase()\n            );\n        });\n    },\n\n    async getIntegrationTransferTarget(person, integrationKey) {\n        if (!person || !person.integrationContactInfo || !integrationKey) {\n            return null;\n        }\n\n        let contact = person.integrationContactInfo(integrationKey);\n        if (contact) {\n            try {\n                // make users api call to get address\n                const url = this.get('application').pcV2Uri(`api/v2/users/${person.get('id')}`);\n                const user = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n                const addressObj = user.addresses.find(add => add.integration && add.integration === integrationKey);\n                if (addressObj) {\n                    return addressObj.address;\n                }\n            } catch (err) {\n                // if error, we'll fallback to how we were initially attempting with e164 data\n                this.logger.warn(\n                    'PBX Transfer: attempted to fetch user address, but failed. Falling back to e164 data.',\n                    {\n                        err\n                    }\n                );\n            }\n\n            // fallback\n            if (contact.rel && contact.rel.e164) {\n                return contact.rel.e164;\n            } else {\n                this.logger.warn('Attempted transfer to integration user, but e164 data not found:', {\n                    remoteData: {\n                        userId: person.get('id'),\n                        integration: integrationKey\n                    }\n                });\n            }\n        }\n        return null;\n    },\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    _fetchConfigs() {\n        let allConfigsPromise = new Ember.RSVP.Promise((resolve, reject) => {\n            this._accumulateConfigs(\n                configs => {\n                    resolve(configs);\n                },\n                reason => {\n                    reject(reason);\n                },\n                1,\n                CONFIG_PAGE_SIZE,\n                null\n            );\n        });\n        return allConfigsPromise;\n    },\n\n    /**\n     * Recursively get integration configuration objects.\n     * @param {function} resolve resolver function to call with the configurations as the parameter\n     * @param {function} reject rejection function to call with the rejection reason as the parameter\n     * @param {number} pageNumber current page number\n     * @param {number} pageSize current page size\n     * @param {object} configs accumulated configuration objects\n     */\n    _accumulateConfigs(resolve, reject, pageNumber, pageSize, configs) {\n        if (typeof configs === 'undefined' || configs === null) {\n            configs = [];\n        }\n        let configsUrl = this.get('application').pcV2Uri(CONFIGS_API_URL_V2);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        configsUrl += `?${Ember.$.param(queryParams, true)}`;\n        if (!this.get('permissions.canViewUCIntegrations')) {\n            resolve(configs); //empty result because no permission\n            return;\n        }\n        this.get('ajax')\n            .request(configsUrl)\n            .then(result => {\n                if (!result) {\n                    reject('Invalid integration configs return value');\n                    return;\n                }\n                if (Array.isArray(result.entities)) {\n                    let validConfigObjs = _.chain(result.entities)\n                        .filter(config => this._isValidIntegrationConfig(config))\n                        .map(config => this._mapIntegrationConfig(config))\n                        .value();\n\n                    configs.push(...validConfigObjs);\n                }\n                // continue accumulating configs if more pages exist\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateConfigs(resolve, reject, result.pageNumber + 1, pageSize, configs);\n                } else {\n                    resolve(configs);\n                }\n            })\n            .catch(reject);\n    },\n\n    _isValidIntegrationConfig(config) {\n        return (\n            config &&\n            typeof config === 'object' &&\n            Ember.typeOf(Ember.get(config, 'id')) === 'string' &&\n            Ember.typeOf(Ember.get(config, 'ucIntegrationKey.id')) === 'string'\n        );\n    },\n\n    _mapIntegrationConfig(config) {\n        const key = Ember.get(config, 'ucIntegrationKey.id');\n\n        const i10n = Ember.get(config, 'i10n');\n        const systemLocale = this.get('intl.systemLocale').toLowerCase();\n        let translation = key;\n\n        if (i10n !== undefined) {\n            if (i10n[systemLocale] && i10n[systemLocale].name) {\n                translation = i10n[systemLocale].name;\n            }\n        }\n\n        return {\n            id: Ember.get(config, 'id'),\n            key,\n            integrationPresenceSource: Ember.get(config, 'integrationPresenceSource'),\n            icon: Ember.get(config, 'icon.vector'),\n            badgeIcons: {\n                light: Ember.get(config, 'badgeIcons.light.vector'),\n                dark: Ember.get(config, 'badgeIcons.dark.vector')\n            },\n            translation,\n            pbxPermission: Ember.get(config, 'pbxPermission'),\n            pollingEnabled: Ember.get(config, 'polledPresence'),\n            pollIntervalSec: Ember.get(config, 'pollIntervalSec'),\n            includeBadge: Ember.get(config, 'includeBadge')\n        };\n    },\n\n    _isValidIntegrationTab(clientApp) {\n        const key = Ember.get(clientApp, 'key');\n        const hasUcIntegrationKey = key && key !== '';\n        const pbxPermission = Ember.get(clientApp, 'pbxPermission');\n        // gate the integration tab based on pbx permission\n        if (pbxPermission !== undefined) {\n            const permissionService = this.get('permissions');\n            const canViewPbxTab = permissionService.validateDonutPermission(pbxPermission);\n            return hasUcIntegrationKey && canViewPbxTab;\n        }\n        return hasUcIntegrationKey;\n    },\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.get('newRelicNamespace'), {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\n\n// models\nimport ConversationModel from 'connections-ui/models/conversation-legacy';\n\n// mixins\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport AcdUtilitiesMixin from 'connections-ui/mixins/acd-utilities';\nimport ConversationMixin from 'connections-ui/mixins/conversation';\nimport UriBuilderMixin from 'connections-ui/mixins/conversation-uri-builder';\nimport ActiveCallMixin from 'connections-ui/mixins/phone-service/active-call';\nimport CallControlsMixin from 'connections-ui/mixins/phone-service/call-controls';\nimport CallForwardMixin from 'connections-ui/mixins/phone-service/call-forward';\nimport ConversationManagerMixin from 'connections-ui/mixins/phone-service/conversation-manager';\nimport EventsMixin from 'connections-ui/mixins/phone-service/events';\nimport PhoneNotificationsMixin from 'connections-ui/mixins/phone-service/notifications';\nimport StationMixin from 'connections-ui/mixins/phone-service/station';\n\n// utils\nimport webrtcConversationTypes from 'ember-webrtc-components/utils/webrtc-conversation-types';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport QueuedProcessingChain from 'connections-ui/utils/queued-processing-chain';\n\nexport function isDefinedAndLengthGreaterThan(obj, n) {\n    if (obj) {\n        if (!obj.length) {\n            return false;\n        } else if (obj.length > n) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n}\nconst { computed, inject, observer, Evented, Logger } = Ember;\n\nconst VOICEMAIL_URL = '@127.0.0.1;user=voicemail';\n\nconst mixins = [\n    AcdUtilitiesMixin,\n    ActiveCallMixin,\n    CallControlsMixin,\n    CallForwardMixin,\n    ConversationMixin,\n    ConversationManagerMixin,\n    EventsMixin,\n    LoggerMixin,\n    PhoneNotificationsMixin,\n    StationMixin,\n    UriBuilderMixin\n];\n\nexport default Ember.Service.extend(Evented, ...mixins, {\n    isDefinedAndLengthGreaterThan: isDefinedAndLengthGreaterThan,\n\n    // services\n    session: inject.service(),\n    application: inject.service(),\n    pigeon: inject.service(),\n    streaming: inject.service(),\n    communication: inject.service(),\n    permissions: inject.service(),\n    webrtc: inject.service(),\n    intl: inject.service(),\n    addressformat: inject.service(),\n    notification: inject.service('notification-proxy'),\n    ajax: inject.service(),\n    preferences: inject.service(),\n    externalContacts: inject.service(),\n    headset: inject.service(),\n    webrtcSdkService: inject.service('webrtcSdk'),\n\n    applicationController: null, // needed?\n\n    _processingChain: null,\n    _contactObservers: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n        this._initializeProcessingChain();\n        try {\n            this.get('preferences')\n                .getPreference('phone.thisBrowserIsTheOneToAnswerFrom')\n                .then(value => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('thisBrowserIsTheOneToAnswerFrom', value);\n                    }\n                });\n\n            this.get('communication').on('callTransferred', this, this._handleCallTransferred);\n        } catch (err) {\n            if (!isTesting) throw err;\n        }\n    },\n\n    _initializeProcessingChain() {\n        const interactionProcessingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'phone service: interaction processing chain'\n        });\n        this.set('_processingChain', interactionProcessingChain);\n        interactionProcessingChain.setProcessingChain([\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) return false;\n\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (\n                        !interactionType.isCall ||\n                        (interactionType.isCall && interactionType.isCallback) ||\n                        interactionType.isFax\n                    ) {\n                        return false;\n                    }\n\n                    const calls = this.get('conversations');\n                    let interactionModel = calls.findBy('id', payload.id);\n                    const newInteraction = !interactionModel;\n                    const prevRaw = interactionModel && interactionModel.get('__interaction_metadata__');\n                    const currentCallState = interactionModel ? this._getCallState(interactionModel) : null;\n                    const participants = Ember.get(payload, 'participants');\n                    const isAgentCall = participants.any(party => party.purpose && party.purpose === 'agent');\n\n                    const participant = _.last(participants.filterBy('userId', this.get('personGuid')));\n                    const participantCall = this.getParticipantCall(participant);\n                    const participantOnCall = participantCall\n                        ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(\n                              participantCall.state.toLowerCase()\n                          ) > -1\n                        : false;\n                    const participantIsNotVoicemail = (participant.purpose || '').toLowerCase() !== 'voicemail';\n                    const isActiveOnCall = participantCall && participantOnCall && participantIsNotVoicemail;\n                    const newCallState = participantCall.state.toLowerCase();\n\n                    const onCall = interactionModel && interactionModel.get('onCall');\n                    const shouldUpdate = isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated';\n\n                    if (newInteraction) {\n                        interactionModel = ConversationModel.create(payload, Ember.getOwner(this).ownerInjection());\n                        if (isAgentCall && Ember.get(interactionModel, 'callState.initialState') === 'connected') {\n                            // i.e. call was auto answered\n                            this.trigger('autoAnswer', Ember.get(interactionModel, 'id'));\n                        }\n                    }\n\n                    // Log a message for the webrtc timeline if the state changes\n                    if (!currentCallState || currentCallState !== newCallState) {\n                        this.logger.info('Received conversationUpdate with new call state', {\n                            remoteData: { conversationId: payload.id, participantState: newCallState }\n                        });\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        prevRaw,\n                        isAgentCall,\n                        isActiveOnCall,\n                        currentCallState,\n                        interactionModel,\n                        newCallState,\n                        newInteraction,\n                        participantIsNotVoicemail,\n                        shouldUpdate\n                    };\n                }\n            },\n            {\n                label: 'Answer Call',\n                process: ({ payload, currentCallState, newCallState, participantIsNotVoicemail }) => {\n                    if (\n                        currentCallState &&\n                        participantIsNotVoicemail &&\n                        currentCallState !== 'connected' &&\n                        newCallState === 'connected' &&\n                        !this.get('webrtcSdkService.useSdk')\n                    ) {\n                        this.get('headset').answerCall(payload.id, this.get('connectedConversations.length') >= 1);\n                    }\n                }\n            },\n            {\n                label: 'End Call',\n                process: ({ payload, currentCallState, newCallState }) => {\n                    if (!currentCallState) {\n                        return;\n                    }\n\n                    if (this.get('webrtcSdkService.useSdk')) {\n                        return;\n                    }\n\n                    if (currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n                        this.get('headset').endCall(payload.id, this.get('connectedConversations.length') > 1);\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ prevRaw, payload, interactionModel }) => {\n                    const modelsToDestroy = [];\n                    const buildModel = rawData => {\n                        const conversationModel = ConversationModel.create(\n                            rawData,\n                            Ember.getOwner(this).ownerInjection()\n                        );\n                        Ember.set(conversationModel, 'type', 'call');\n                        modelsToDestroy.push(conversationModel);\n\n                        const interactionModel = Ember.Object.create({});\n                        return interactionModel;\n                    };\n                    const { id } = payload;\n                    const contactObserver = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, contactObserver);\n                    const externalContacts = this.get('externalContacts');\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            buildModel,\n                            payload,\n                            prevRaw,\n                            contactObserver\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on phone interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, contactObserver);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    modelsToDestroy.forEach(m => m.destroy());\n                }\n            },\n            {\n                label: 'Update State Step',\n                process: ({\n                    payload,\n                    isAgentCall,\n                    currentCallState,\n                    interactionModel,\n                    newCallState,\n                    newInteraction,\n                    shouldUpdate\n                }) => {\n                    if (shouldUpdate) {\n                        if (!newInteraction) {\n                            interactionModel.setProperties(payload);\n                        }\n\n                        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n                            Ember.set(interactionModel, 'acceptedByClient', false);\n                        }\n                    }\n\n                    // the consultParticipantId needs to be retained even when the call is no longer\n                    // on consult because of use cases identified in SERVOPS-11175\n                    const consultParticipantId = _.last(\n                        interactionModel.participants.filterBy('purpose', 'customer').mapBy('consultParticipantId')\n                    );\n                    if (consultParticipantId) {\n                        Ember.set(interactionModel, 'consultParticipantId', consultParticipantId);\n                    }\n\n                    if (shouldUpdate) {\n                        if (newInteraction) this.get('conversations').pushObject(interactionModel);\n                        this.trigger(`conversations.${interactionModel.get('id')}`);\n                    }\n\n                    if (shouldUpdate || newCallState === 'terminated') {\n                        this.notifyPropertyChange('conversations');\n                        this.notifyPropertyChange('recentDisconnectedAgentCalls');\n                        this._logConversationDetails(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ shouldUpdate, interactionModel, payload }) => {\n                    if (!shouldUpdate) {\n                        return;\n                    }\n\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.get('externalContacts').setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD Phone: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Cleanup Step',\n                process: () => {\n                    // Ideally, we would definitively know when a conversation is inactive\n                    // and only clean up that instance.  However, isInteractionActive is not\n                    // supported on conversation models. Rather than build an interim\n                    // model, we'll just call the throttled cleanup method.\n                    this.get('_throttledRemoveDisconnectedConversations').perform();\n                }\n            }\n        ]);\n    },\n\n    _onMyConversationEvent(conversation) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        if (!conversation || !conversation.id) return;\n        this.get('_processingChain').enqueueEvent(conversation.id, {\n            eventSource: 'realtime',\n            payload: conversation\n        });\n    },\n\n    _onPigeonConnect() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n        this.fetchActiveCallConversations()\n            .then(conversations => {\n                conversations.forEach(conversation => {\n                    if (!conversation || !conversation.id) return;\n                    this.get('_processingChain').enqueueEvent(conversation.id, {\n                        eventSource: 'api',\n                        payload: conversation\n                    });\n                });\n            })\n            .catch(err => {\n                this.get('logger').error('ACD Phone Service: Failed to load active conversations', { err });\n            })\n            .finally(() => {\n                this.get('_throttledRemoveDisconnectedConversations').perform();\n            });\n    },\n\n    _getCallState(interaction) {\n        const participant = interaction.get('participants').findBy('userId', this.get('personGuid'));\n        if (!participant) {\n            Logger.error(\n                `Expected to find person {{personGuid}} on conversation {{conversationId}} but person was not found`,\n                { personGuid: this.get('personGuid'), conversationId: interaction.get('id') }\n            );\n            return;\n        }\n        const participantCall = this.getParticipantCall(participant);\n        return participantCall.state ? participantCall.state.toLowerCase() : null;\n    },\n\n    fetchActiveCallConversations() {\n        const url = this.pcUri(`api/${this.get('convAPIVersion')}/conversations`) + '?communicationType=Call';\n        return this.makeRequest(url, { type: 'get' }).then(response => response.entities);\n    },\n\n    // Returns conversation version to use\n    convAPIVersion: 'v2',\n\n    // presence and carrier pigeon stuff\n    presence: computed.reads('session.person.presence'),\n    onQueue: computed.equal('presence', 'on_queue'),\n    carrierPigeonConnected: computed.reads('pigeon.connected'),\n\n    // permissions\n    enabled: computed.reads('permissions.phoneEnabled'),\n    conferenceEnabled: computed.reads('permissions.conferenceEnabled'),\n    canRecord: computed.reads('permissions.canRecord'),\n    canCallForward: computed.reads('permissions.canCallForward'),\n\n    // user info\n    user: computed.reads('session.publicApiUser'),\n    personGuid: computed.reads('session.person.guid'),\n\n    // stations and phone permissions\n    phoneDisabled: computed('webrtc.canUseWebrtcSoftphone', 'station.isWebrtc', function () {\n        return this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone');\n    }),\n\n    phoneDisabledMessage: computed('phoneDisabled', 'webrtc.{hasMicrophone,audioCallCapable}', function () {\n        if (this.get('phoneDisabled') === false) {\n            return '';\n        }\n        const webrtc = this.get('webrtc');\n        const audioCallCapable = webrtc.get('audioCallCapable');\n        const hasMicrophone = webrtc.get('hasMicrophone');\n        let key = 'notification.purecloud.selectPhone.unsupportedPhone';\n        if (audioCallCapable && !hasMicrophone) {\n            key = 'notification.purecloud.selectPhone.noMicrophone';\n        }\n        return this.get('intl').lookup(key).toString();\n    }),\n    phoneAvailable: computed('noStationSelected', 'phoneDisabled', function () {\n        return !(this.get('noStationSelected') || this.get('phoneDisabled'));\n    }),\n    stationHasPersistentConnection: computed.and('station.persistentConnection', 'station.isWebrtc'),\n    persistentConnectionActive: computed(\n        'webrtc.conversations.@each._state',\n        'stationHasPersistentConnection',\n        'webrtcSdkService.{useSdk,isPersistentConnection,hasActiveSoftphoneSession}',\n        function () {\n            if (this.get('webrtcSdkService.useSdk')) {\n                return (\n                    this.get('webrtcSdkService.isPersistentConnection') &&\n                    this.get('webrtcSdkService.hasActiveSoftphoneSession')\n                );\n            }\n\n            if (!this.get('stationHasPersistentConnection')) {\n                return false;\n            }\n            const conversations = this.get('webrtc.conversations');\n            return conversations && !!conversations.findBy('conversationType', webrtcConversationTypes.SOFTPHONE);\n        }\n    ),\n\n    // Toggle to enable answering of calls from this browser session.\n    thisBrowserIsTheOneToAnswerFrom: false,\n    toggleBrowserAnswer() {\n        this.toggleProperty('thisBrowserIsTheOneToAnswerFrom');\n        this.get('preferences').setPreference(\n            'phone.thisBrowserIsTheOneToAnswerFrom',\n            this.get('thisBrowserIsTheOneToAnswerFrom')\n        );\n    },\n\n    // debounce timers and timeout values\n    timeOutToRemove: 8000,\n\n    lastConversationError: null,\n    callsWithErrors: [],\n\n    loaded: false,\n    loading: {\n        muted: false,\n        held: false\n    },\n\n    dtmf: true, // HACK: enable/disable calling pub api for sending dtmf\n\n    // utils\n    guidFromUri(uri) {\n        return uri.substring(uri.lastIndexOf('/') + 1);\n    },\n    generateConversationsUrl(callId, participantId, action, query) {\n        const origin = `api/v2/conversations/calls`;\n        let parts = [origin, callId, 'participants', participantId];\n        if (action) {\n            parts.push(action);\n        }\n        if (query) {\n            parts.push(query);\n        }\n        return this.pcUri(parts);\n    },\n    generateCommunicationUrl(conversationId, participantId, communicationId) {\n        return this.get('application').pcV2Uri(\n            `api/v2/conversations/calls/${conversationId}/participants/${participantId}/communications/${communicationId}`\n        );\n    },\n    generateConversationUrl(conversationId) {\n        return this.get('application').pcV2Uri(`api/v2/conversations/calls/${conversationId}`);\n    },\n    _findPendingSessionsByConversationId(id) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService.pendingSessions').findBy('conversationId', id);\n        } else {\n            return this.get('webrtc.pendingSessions').findBy('callInfo.conversationId', id);\n        }\n    },\n    _logConversationDetails(conversation) {\n        if (conversation != null) {\n            let logObject = {};\n            Ember.get(conversation, 'participants').forEach(party => {\n                const communication = this.getParticipantCall(party) || Ember.get(party, 'callbacks.firstObject');\n                if (communication) {\n                    const { id, userId, name, address, purpose } = party;\n                    const { state, confined, muted, held } = communication;\n                    return (logObject[id] = { userId, name, address, state, confined, muted, held, purpose });\n                }\n            });\n            if (console.table) {\n                return console.table(logObject);\n            }\n            return console.log(logObject);\n        }\n    },\n    isDisconnected(conversation) {\n        if (!conversation) {\n            return false;\n        }\n        const callState = Ember.get(conversation, 'callState');\n        if (!callState) {\n            return false;\n        }\n        return callState.state ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1 : false;\n    },\n    // helper to get participant.calls[0] and return false if any of it is undefined\n    getParticipantCall(participant) {\n        if (!participant) {\n            return false;\n        }\n        if (participant.calls) {\n            if (participant.calls.length) {\n                return participant.calls[0];\n            }\n        }\n        return false;\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('callVolume', deviceVolumes.callVolume);\n        this.set('ringerVolume', deviceVolumes.ringerVolume);\n    },\n    // end utils\n\n    // UI state helpers\n    isInteractionViewOpen: false,\n    isShowCallControlsViewOpen: false,\n    showFloatingCalls: false,\n\n    showNavbarAlert: computed(\n        'activeAcdCalls.[]',\n        'activeCall',\n        'incomingNonAcdConversations.[]',\n        'isShowCallControlsViewOpen',\n        'isInteractionViewOpen',\n        function () {\n            const activeAcdCallState = this.get('activeAcdCalls.firstObject.callState.state');\n            const state = typeof activeAcdCallState === 'string' ? activeAcdCallState.toLowerCase() : null;\n            if (\n                this.get('isShowCallControlsViewOpen') ||\n                (this.get('isInteractionViewOpen') && state === 'connected')\n            ) {\n                return false;\n            }\n\n            const hasIncomingNonAcdCalls = this.get('incomingNonAcdConversations.length') > 0;\n            const alertingCall =\n                !this.get('activeCall.isIncoming') && hasIncomingNonAcdCalls\n                    ? this.get('incomingNonAcdConversations.firstObject')\n                    : this.get('activeCall');\n\n            const isAlertingCallACD =\n                alertingCall &&\n                Ember.get(alertingCall, 'isAgentCall') &&\n                !Ember.get(alertingCall, 'myselfIsMonitor') &&\n                !Ember.get(alertingCall, 'myselfIsCoach') &&\n                !Ember.get(alertingCall, 'myselfIsBarged')\n                    ? true\n                    : false;\n            return !isAlertingCallACD && hasIncomingNonAcdCalls;\n        }\n    ),\n    // end UI state helpers\n\n    activeRoom: null,\n\n    bootstrapPurecloudApiOnAuth: observer('session.isAuthenticated', 'enabled', 'canCallForward', function () {\n        if (!this.get('enabled')) {\n            return;\n        }\n        if (this.get('session.isAuthenticated')) {\n            if (this.get('canCallForward')) {\n                this.fetchCallForwarding();\n            }\n            if (!isTesting && !this.get('loaded')) {\n                this.set('loaded', true);\n                this.doLoginAssociationLogic();\n                return this.get('delayedNotification').perform();\n            }\n        } else {\n            this.set('loaded', false);\n        }\n    }),\n\n    delayedNotification: task(function* (delay = 5000) {\n        yield timeout(delay);\n\n        if (this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone')) {\n            const message = this.get('phoneDisabledMessage');\n            const title = this.get('intl').t('notification.purecloud.selectPhone.selectPhone');\n            return this.get('notification').error(title, message);\n        }\n    }),\n\n    refreshPublicApiUser() {\n        return this.get('session').refreshPublicApiUser();\n    },\n\n    handleMuteParticipants: observer('activeConversations.@each.isMuted', function () {\n        this.get('activeConversations').forEach(conversation => {\n            if (conversation.get('webrtcSession')) {\n                let webrtcConversation = this.get('webrtc').getConversation({\n                    conversationId: conversation.get('id'),\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                if (webrtcConversation) {\n                    if (conversation.get('isMuted')) {\n                        webrtcConversation.muteAudio();\n                    } else {\n                        webrtcConversation.unmuteAudio();\n                    }\n                }\n            }\n        });\n    }),\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    },\n\n    transferToVoicemail(selectedUserUserId, participantId, conversationId) {\n        const voicemailPolicy = this.get('application').pcV2Uri('api/v2/voicemail/userpolicies/' + selectedUserUserId);\n        return this.makeRequest(voicemailPolicy)\n            .then(policy => {\n                if (!policy.enabled) {\n                    throw new Error('voicemail not enabled');\n                }\n                const data = {};\n                const vmAdressString = selectedUserUserId + VOICEMAIL_URL;\n                data.address = vmAdressString;\n                data.transferType = 'Unattended';\n                const options = { data };\n                const url = this.replaceUri(conversationId, participantId, null, 'calls');\n                return this.makeRequest(url, options, 'post').then(() => {\n                    this._handleCallTransferred();\n                });\n            })\n            .catch(error => {\n                const title = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.error');\n                const message = this.get('intl').t('purecloud.acdInteraction.voicemail.errors.transferToVoicemail');\n                this.get('notification').error(title, message);\n                this.get('logger').error('Error while tranferring to voicemail', { error });\n            });\n    }\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { assert } from '@ember/debug';\nimport { get, observer } from '@ember/object';\nimport { copy } from 'ember-copy';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service, Evented, inject, run, computed } = Ember;\n\nconst topicPriority = {\n    presence: 1,\n    routingStatus: 2,\n    conversationsummary: 3,\n    other: 4,\n    outofoffice: 5,\n    geolocation: 6\n};\n\nexport function eventFromTopic(topic) {\n    if (topic.indexOf('v2.system.no_longer_subscribed') > -1) {\n        return 'no_longer_subscribed';\n    }\n    return [].concat(topic.split('.')).pop();\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    connected: false,\n    topics: A(),\n    priorityTopics: A(),\n    customTopicNames: {},\n    registerTopicsDebouncePeriod: 1000,\n    embedded: inject.service(),\n\n    prioritizedTopics: computed('topics.length', function () {\n        const sortedTopics = this.get('topics').slice(0);\n\n        const sortFunction = (topicA, topicB) => {\n            return this.getTopicPriority(topicA) - this.getTopicPriority(topicB);\n        };\n\n        sortedTopics.sort(sortFunction);\n\n        return sortedTopics;\n    }),\n\n    getTopicPriority(topic) {\n        const priorities = topicPriority;\n        return priorities[topic.split('.').pop()] || priorities.other;\n    },\n\n    // eslint-disable-next-line no-unused-vars\n    initialize({ features, subscribeUrl, publicApiUser, accessToken }) {\n        if (this.get('initialized')) {\n            return;\n        }\n\n        if (publicApiUser) {\n            this.logger.info('CXNUI-CP: Initializing', {\n                userId: get(publicApiUser, 'id'),\n                features\n            });\n        } else {\n            this.logger.warn('CXNUI-CP: pigeon service not provided with api user');\n        }\n\n        this.set('initialized', true);\n    },\n\n    registerPriorityTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a priority topic for subscription.', topic !== null);\n        this.get('priorityTopics').addObject(topic);\n\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterPriorityTopic(topic) {\n        this.get('priorityTopics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    registerTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a topic for subscription.', topic !== null);\n        this.get('topics').unshiftObject(topic);\n        if (customName) {\n            this.get('customTopicNames')[topic] = customName;\n        }\n    },\n\n    unRegisterTopic(topic) {\n        this.get('topics').removeObject(topic);\n        const customNames = this.get('customTopicNames');\n        delete customNames[topic];\n    },\n\n    _observeTopics: observer('priorityTopics.[]', 'topics.[]', 'connected', 'initialized', function () {\n        if (this.get('connected') && this.get('initialized')) {\n            this.set(\n                'registerDebounce',\n                run.debounce(this, this._registerTopics, this.get('registerTopicsDebouncePeriod'))\n            );\n        }\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.get('topicKeepAlive'));\n        run.cancel(this.get('registerDebounce'));\n    },\n\n    _registerTopics() {\n        run.cancel(this.get('topicKeepAlive'));\n        const topicKeepAlive = run.later(\n            this,\n            function () {\n                this.logger.info('CXNUI-CP: _register: topicKeepAlive triggered');\n                this._registerTopics();\n            },\n            23 * 60 * 60 * 1000 // 23h\n        );\n        this.set('topicKeepAlive', topicKeepAlive);\n\n        const prioritizedTopics = this.get('prioritizedTopics');\n        const priorityTopics = this.get('priorityTopics');\n        const topics = [...priorityTopics, ...prioritizedTopics];\n\n        if (!this.get('connected')) {\n            this.set('connected', true);\n            this.trigger('connect');\n        }\n\n        topics.forEach(topic => this.get('embedded').streamingTopicSubscribe(topic));\n        this.trigger('topicsRegistered', topics);\n    },\n\n    triggerTopicEvent(topic, eventName, eventBody, data, source) {\n        this.logger.debug('CXNUI-CP: topic triggered', {\n            source,\n            carrierPigeonTopic: eventName,\n            update: eventBody\n        });\n        this.trigger(eventName, copy(eventBody), copy(data));\n    },\n\n    onMessage(source, data) {\n        if (!data) {\n            return;\n        }\n\n        const topic = data.topicName;\n        const eventBody = data.eventBody;\n        const eventName = this.get('customTopicNames')[topic] || eventFromTopic(topic);\n\n        if (topic !== 'channel.metadata') {\n            this.triggerTopicEvent(topic, eventName, eventBody, data, source);\n        }\n\n        if (topic !== eventName) {\n            this.triggerTopicEvent(topic, topic, eventBody, data, source);\n        }\n    },\n\n    onSubscriptionError(error) {\n        this.trigger('hawkSubscriptionError', error);\n    }\n});\n","import Ember from 'ember';\nimport localforage from 'localforage';\nimport _ from 'lodash';\n\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport safeSet from 'connections-ui/utils/safeSet';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst { on, get, set, run, inject, computed, RSVP, Service } = Ember;\n\nconst PREFERENCE_LOAD_TIME_ALLOWANCE = 5000;\n\nexport default Service.extend(LoggerMixin, {\n    logger: inject.service('stash-logger'),\n    session: inject.service(),\n    feature: inject.service(),\n    ajax: inject.service(),\n    application: inject.service(),\n\n    namespaces: [\n        'chat',\n        'geolocation',\n        'notifications',\n        'webrtc',\n        'test',\n        'widgets',\n        'meta',\n        'meetings',\n        'phone',\n        'scripts',\n        'deviceVolumes',\n        'panelManager',\n        'panelManagerLayoutTemplateV1',\n        'agentUiMainstage',\n        'interactions',\n        'relateSparkification'\n    ],\n\n    error: false,\n\n    syncEnabled: false,\n\n    deferredPersistRequests: null,\n    settingsPath: 'api/v2/settings',\n\n    registerNamespaces: on('init', function () {\n        localforage.config({\n            name: 'orgspan',\n            version: 1.0,\n            storeName: 'preferences',\n            description: 'Storing local preferences for the web client'\n        });\n\n        //need to wrap in a run since there is a lot of non-ember asynchonicity in this code path\n        const promises = this.get('namespaces').map(namespace => {\n            return localforage.getItem(namespace).then(data => {\n                run(() => this._initializeNamespace(namespace, data));\n            });\n        });\n\n        const ready = timeoutPromise(\n            RSVP.all(promises),\n            PREFERENCE_LOAD_TIME_ALLOWANCE,\n            'preferences#registerNamespaces'\n        )\n            .then(() => this._waitForAccessToken())\n            .then(() => this._enableService())\n            .catch(error => {\n                this._disableService(error);\n            });\n\n        this.set('ready', ready);\n        this.set('deferredPersistRequests', []);\n\n        // used to resolve races in setPreference('namespace.property');\n        this.set('pendingSets', Ember.Object.create());\n    }),\n\n    getPreference(path) {\n        const ready = this.get('ready');\n        return ready.then(() => {\n            return this._getPreference(path);\n        });\n    },\n\n    setPreference(path, value, persist = true) {\n        const ready = this.get('ready');\n        return ready.then(() => this._setPreference(path, value, persist));\n    },\n\n    _getPreference(path) {\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            return localforage.getItem(path);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        return previousSet\n            .then(() => {\n                return localforage.getItem(namespace);\n            })\n            .then(settings => {\n                if (!settings) {\n                    return;\n                }\n                let setting = get(settings, keyPath);\n                return setting;\n            })\n            .catch(err => {\n                if (!isTesting) throw err;\n                // swallow the error in tests\n                return RSVP.Promise.resolve();\n            });\n    },\n\n    _setPreference(path, value) {\n        if (this.isDestroyed) {\n            return RSVP.resolve({});\n        }\n\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            if (value && !Array.isArray(value) && typeof value === 'object') {\n                this.set(path, Ember.Object.create(value));\n            } else {\n                this.set(path, value);\n            }\n\n            return localforage.setItem(path, value);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        let currentNamespaceObject = this.get(namespace);\n        if (!currentNamespaceObject) {\n            this.set(namespace, Ember.Object.create());\n            currentNamespaceObject = this.get(namespace);\n        }\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        const pendingSet = previousSet\n            .then(() => {\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                set(data, keyPath, value);\n\n                return localforage.setItem(namespace, data);\n            })\n            .finally(() => {\n                this.set(`pendingSets.${namespace}`, null);\n            });\n        this.set(`pendingSets.${namespace}`, pendingSet);\n\n        // after localforage\n        return pendingSet\n            .then(() => {\n                // get the namespace again in case there were multiple sets on the namespace\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                safeSet(data, keyPath, value);\n                currentNamespaceObject.set(keyPath, value);\n                return setting;\n            })\n            .catch(error => {\n                if (isTesting) return RSVP.resolve();\n                this.logger.warn('Error saving preferences', { path, error });\n                return RSVP.reject(error);\n            });\n    },\n\n    async _waitForAccessToken() {\n        if (this.get('session.accessToken') || isTesting) {\n            return RSVP.Promise.resolve();\n        }\n\n        return new RSVP.Promise(resolve => {\n            this.logger.info('Preferences: waiting for access token');\n\n            const handler = () => {\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    _enableService() {\n        let enableServicePromise = RSVP.resolve();\n\n        if (this._isNotDead() && this.get('session.accessToken')) {\n            this.logger.info('Enabling preference API sync');\n            return this._enableSync()\n                .then(() => {\n                    this.logger.info('Initial preferences loaded successfully');\n                })\n                .catch(error => {\n                    this.logger.info('There was an issue enabling sync:', error);\n                    this.set('profileSyncSupport', false);\n                });\n        }\n\n        return enableServicePromise;\n    },\n\n    _disableService(error) {\n        if (this._isNotDead()) {\n            this.logger.error('Error loading preferences', { error });\n            this.set('error', true);\n        }\n    },\n\n    _initializeNamespace(namespace, data) {\n        if (this._isNotDead()) {\n            if (!data) {\n                data = {};\n                localforage.setItem(namespace, data);\n            }\n            this.set(namespace, Ember.Object.create(data));\n        }\n    },\n\n    _isNotDead() {\n        return !this.get('isDestroyed') && !this.get('isDestroying');\n    },\n\n    _enableSync() {\n        const logger = this.get('logger');\n        const settingsPath = this.get('settingsPath');\n        const settingsUrl = this.get('application').pcV2Uri(settingsPath);\n        const ajax = this.get('ajax');\n\n        if (this.get('syncEnabled')) {\n            return RSVP.reject('Preference sync can only be enabled once.');\n        }\n\n        this.set('syncEnabled', true);\n        return ajax\n            .ajaxGet(settingsUrl)\n            .then(preferencesToSync => this._saveSettingsFromServer(preferencesToSync))\n            .then(() => {\n                logger.info('Loaded preferences from server');\n                return RSVP.resolve();\n            })\n            .catch(err => {\n                logger.error('Error getting preferences from server', { err });\n                return RSVP.reject(err);\n            });\n    },\n\n    _saveSettingsFromServer(settings) {\n        const promises = [];\n\n        _.forIn(settings, (data, namespace) => {\n            if (this.namespaces.includes(namespace)) {\n                promises.push(this._setPreference(namespace, data, false));\n            }\n        });\n\n        return RSVP.all(promises).then(() => {\n            return Ember.RSVP.resolve();\n        });\n    },\n\n    profileSyncSupport: computed('session.person.fieldConfig.preferences.preferences', function () {\n        const field = this.get('session.person.fieldConfig.preferences.preferences');\n        return !_.isEmpty(field);\n    }),\n\n    userPreferences: computed('session.person.preferences.preferences.[]', function () {\n        let entry = this.get('session.person').getFieldValue('preferences.preferences');\n        if (entry && typeof entry.value === 'string') {\n            return JSON.parse(entry.value);\n        } else if (entry && entry.value && typeof entry.value === 'object') {\n            return entry.value;\n        }\n        return {};\n    }),\n\n    allLocalPreferences: computed('namespaces.[]', function () {\n        return this.getProperties(this.get('namespaces'));\n    })\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport StreamingService from 'ember-purecloud-components/services/streaming';\nimport moment from '../utils/dates';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { isPurecloudSource } from 'connections-ui/utils/presence-utils';\nimport { isPresence } from 'connections-ui/mixins/entity-presence';\n\nconst { inject, observer, run, Service } = Ember;\n\nexport default Service.extend(LoggerMixin, {\n    eventMap: {\n        presence: 'primaryPresenceEvent',\n        outofoffice: 'outOfOfficeEvent',\n        conversationsummary: 'conversationSummaryEvent',\n        routingStatus: 'routingStatusEvent',\n        geolocation: 'geolocationEvent'\n    },\n\n    trackedGuids: null,\n\n    intl: inject.service(),\n    ajax: inject.service(),\n    store: inject.service(),\n    pigeon: inject.service(),\n    session: inject.service(),\n    streaming: inject.service(),\n    application: inject.service(),\n    notification: inject.service('notification-proxy'),\n    batchDataRequests: inject.service(),\n    presenceService: inject.service('presence'),\n    permissions: inject.service(),\n\n    phoneIntegrations: inject.service(),\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('permissions.canViewIntegrationPresence')) {\n            this.eventMap.integrationpresence = 'integrationpresence';\n            delete this.eventMap.presence;\n            this.set('eventMap', this.eventMap);\n        }\n\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').on(key, this, this.events[value]));\n\n        this.set('trackedGuids', Ember.Object.create());\n        this.subscribeToMyself();\n        this.get('streaming').subscribeToConnection(this);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forIn(this.eventMap, (value, key) => this.get('pigeon').off(key, this, this.events[value]));\n    },\n\n    _getPresenceDefinition(presence) {\n        if (typeof presence === 'string') {\n            return this.get('session').getPresence(presence);\n        } else {\n            return this.get('presenceService').getPresenceDefinition(presence);\n        }\n    },\n\n    isPresence(presence, testValue) {\n        const definition = this._getPresenceDefinition(presence);\n        return isPresence(this.get('session.presenceMap'), definition, testValue);\n    },\n\n    subscribeToMyself() {\n        const guid = this.get('session.person.guid');\n        const id = this.get('session.person.id');\n\n        if (guid && id) {\n            const pigeon = this.get('pigeon');\n            this.logger.debug('subscribing to myself');\n\n            this.set(`trackedGuids.${guid}`, true);\n            this._getTopicsForUser(guid).forEach(topic => pigeon.registerPriorityTopic(topic));\n        }\n    },\n\n    _getTopicsForUser(guid) {\n        if (!guid) {\n            return [];\n        }\n\n        return [`v2.users.${guid}?${Object.keys(this.eventMap).join('&')}`];\n    },\n\n    _guidFromTopicName(topic) {\n        const guidPattern = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n        const guids = topic.match(guidPattern);\n\n        if (guids && guids.length > 0) {\n            return guids[0];\n        }\n        return '';\n    },\n\n    connect: StreamingService.streamingEvent(function () {\n        run.debounce(this, this.refreshPeopleActivityState, 1000);\n    }),\n\n    refreshPeopleActivityState() {\n        const personId = this.get('session.person.guid');\n        const ids = Object.keys(this.get('trackedGuids'));\n\n        if (personId) {\n            ids.push(personId);\n        }\n\n        if (!_.isEmpty(ids)) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: Reloading activity state for people: ', ids.length);\n            this.get('store').findMany('person', ids, FL.person);\n        }\n    },\n\n    watchAuthForSubscribe: observer('session.isAuthenticated', 'session.person.guid', function () {\n        this.subscribeToMyself();\n    }),\n\n    subscribeToPresence(person) {\n        const pigeon = this.get('pigeon');\n\n        const id = person.get('id');\n        const guid = person.get('guid');\n        const jid = person.get('jid');\n\n        this.set(`trackedGuids.${guid}`, true);\n        let callback = function () {};\n\n        if (this.get('streaming.connection') && jid && jid !== this.get('session.person.jid')) {\n            if (0 === person.get('presenceSubscriptionCounter')) {\n                this._getTopicsForUser(guid).forEach(topic => pigeon.registerTopic(topic));\n                Ember.run.once(this, this.refreshUser, id);\n            }\n\n            person.incrementProperty('presenceSubscriptionCounter');\n\n            callback = () => {\n                if (0 < person.get('presenceSubscriptionCounter')) {\n                    person.decrementProperty('presenceSubscriptionCounter');\n                }\n\n                if (0 === person.get('presenceSubscriptionCounter')) {\n                    this._getTopicsForUser(guid).forEach(topic => pigeon.unRegisterTopic(topic));\n                    this.set(`trackedGuids.${guid}`, undefined);\n                }\n            };\n        }\n\n        return callback;\n    },\n\n    refreshUser(id) {\n        this.get('batchDataRequests').refreshUser(id);\n    },\n\n    bulkSubscribeToPresence(people) {\n        let callbacks = people.map(p => this.subscribeToPresence(p));\n        return () => {\n            callbacks.forEach(cb => cb());\n        };\n    },\n\n    autoSubscribe(people, context, type = '') {\n        let callbackKey = `${type}PresenceSubscriptionCallback`;\n        let previousCallback = context.get(callbackKey);\n        let newCallback = null;\n\n        if (people) {\n            newCallback = this.bulkSubscribeToPresence(people);\n        }\n\n        if (typeof previousCallback === 'function') {\n            previousCallback();\n        }\n\n        try {\n            context.set(callbackKey, newCallback);\n        } catch (e) {\n            // sometimes we are trying to clear out subscription callbacks after an object was destroyed by ember\n            // we dont want to run the function, but we can't use `set`, so clear it out forcefully\n            if (!newCallback) {\n                context[callbackKey] = newCallback;\n            }\n        }\n    },\n\n    _alertDeletedPresence(presence) {\n        const intl = this.get('intl');\n        const title = intl.t('chat.presence.errorSettingDeletedPresence.title');\n        const message = intl.t('chat.presence.errorSettingDeletedPresence.message');\n        this.get('notification').error(title, message);\n\n        this.get('presenceService').removeDeletedPresence(presence);\n    },\n\n    changeRoutingStatus(status) {\n        const id = this.get('session.person.guid');\n        const url = this.get('application').pcV2Uri(`api/v2/users/${id}/routingStatus`);\n        const data = {\n            userId: id,\n            status: status,\n            startTime: new Date(moment.now()).toISOString()\n        };\n\n        this.get('ajax')\n            .put(url, { data })\n            .catch(error => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Error when changing routing status', {\n                    error\n                });\n            });\n    },\n\n    doUserPresenceStatusChanged(person, statusUpdate) {\n        const { source } = statusUpdate;\n        const phoneIntegrations = this.get('phoneIntegrations');\n\n        const isSourceOnUsableList = phoneIntegrations.canViewThirdPartyPresence(source);\n        if (isSourceOnUsableList) {\n            // set the integration presence value\n            // using Ember.set as person is an object by this point\n            Ember.set(person, 'activities.integrationPresence', statusUpdate);\n        } else {\n            let existingPresenceIndex = null;\n            let existingPresenceObj = null;\n            if (person.get('presenceList')) {\n                existingPresenceObj = person.get('presenceList').find(function (presence, index) {\n                    if (presence.source.toLowerCase() === source.toLowerCase()) {\n                        existingPresenceIndex = index;\n                        return true;\n                    }\n                });\n            }\n\n            if (existingPresenceObj && existingPresenceIndex > -1) {\n                const presenceListStored = person.get('presenceList');\n                presenceListStored[existingPresenceIndex] = Ember.Object.create(statusUpdate);\n                person.notifyPropertyChange('presenceList');\n            } else {\n                person.get('presenceList').pushObject(Ember.Object.create(statusUpdate));\n            }\n        }\n    },\n\n    doUserPrimaryPresenceSourceChanged(person, statusUpdate) {\n        let newSource = statusUpdate.source;\n        const phoneIntegrations = this.get('phoneIntegrations');\n        const isThirdPartySource = !!phoneIntegrations.getIntegrationFromSource(newSource);\n        if (!isThirdPartySource) {\n            // convert PURECLOUD -> default\n            if (isPurecloudSource(newSource)) {\n                newSource = 'default';\n            }\n            person.set('currentPresenceSource', newSource);\n        }\n    },\n\n    handleIntegrationPresenceEvent(presenceEvent) {\n        Ember.run.join(() => {\n            this.get('batchDataRequests')\n                .getUser(presenceEvent.userId)\n                .then(person => {\n                    const { eventType } = presenceEvent;\n                    if (eventType === 'UserPresenceStatusChanged') {\n                        this.doUserPresenceStatusChanged(person, presenceEvent);\n                    } else if (eventType === 'UserPrimaryPresenceSourceChanged') {\n                        this.doUserPrimaryPresenceSourceChanged(person, presenceEvent);\n                    }\n                });\n        });\n    },\n\n    startOfTime: () => '1970-01-01T12:00:00.000Z',\n    endOfTime: () => '9999-12-31T00:00:00.000Z',\n    rightAboutMeow: () => moment().subtract(1, 'year').toISOString(),\n    handleRoutingStatusError(errorCode) {\n        if (typeof errorCode === 'string' && errorCode.toLowerCase() === 'user.noskills') {\n            const intl = this.get('intl');\n            const title = intl.t('notification.purecloud.errorSkillsRouting.title');\n            const message = intl.t('notification.purecloud.errorSkillsRouting.message');\n            this.get('notification').error(title, message);\n        }\n    },\n\n    events: {\n        conversationSummaryEvent(conversationSummary, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.conversationSummary', conversationSummary);\n                    });\n            });\n        },\n\n        outOfOfficeEvent(outOfOfficeDef, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => person.set('activities.outOfOffice', outOfOfficeDef));\n            });\n        },\n\n        routingStatusEvent({ errorInfo, id, routingStatus }) {\n            if (errorInfo && errorInfo.errorCode) {\n                this.handleRoutingStatusError(errorInfo.errorCode);\n            }\n\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(id)\n                    .then(person => person.set('activities.routingStatus', routingStatus));\n            });\n        },\n\n        integrationpresence(event) {\n            if (this.get('permissions.canViewIntegrationPresence')) {\n                this.handleIntegrationPresenceEvent(event);\n            }\n        },\n\n        primaryPresenceEvent(primaryPresence, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            Ember.run.join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.presence', primaryPresence);\n                    });\n            });\n        },\n\n        geolocationEvent(geolocation, { topicName }) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: geolocationEvent', arguments);\n            const guid = this._guidFromTopicName(topicName);\n            if (geolocation && (geolocation.city || geolocation.region || geolocation.country)) {\n                this.logger.debug(\n                    'PRESENCE-SUBSCRIPTION: gelocationEvent user/self',\n                    guid,\n                    this.get('session.person.guid')\n                );\n                if (guid && guid === this.get('session.person.guid')) {\n                    this.logger.debug('PRESENCE-SUBSCRIPTION: adding geolocation to self');\n                    this.set('session.person.activities.geolocation', geolocation);\n                }\n                Ember.run.join(() => {\n                    this.get('batchDataRequests')\n                        .getUser(guid)\n                        .then(person => {\n                            person.set('activities.geolocation', geolocation);\n                        });\n                });\n            }\n        }\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport Presence from 'ember-purecloud-components/models/presence';\nimport { formatPresenceLanguageLabelLocale } from 'ember-purecloud-components/utils/intl';\nimport TimeoutPromise from 'ember-purecloud-components/utils/timeout-promise';\nimport groupBy from 'lodash.groupby';\nimport isEmpty from 'lodash.isempty';\nimport RSVP from 'rsvp';\n\nlet _mapping;\n\nconst getPresenceMappings = function (lookup) {\n    // This is a function because the lookups need to happen after the app is boostrapped.\n    // Attempts made to refactor that have ended in failure: 2.5\n    // last attempt date: 01/05/2015 - eric lifka\n    // most recent attempt: 06/02/2015 - sam wenke\n    // Ability to lookup via entity.presence, entity.presence, presence code, or guid.\n    if (!_mapping) {\n        _mapping = {\n            available: lookup('chat.presence.available').toString(),\n            online: lookup('chat.presence.available').toString(),\n            busy: lookup('chat.presence.busy').toString(),\n            idle: lookup('chat.presence.away').toString(),\n            away: lookup('chat.presence.away').toString(),\n            on_queue: lookup('chat.presence.onQueue').toString(),\n            out_of_office: lookup('chat.presence.outOfOffice.title').toString(),\n            offline: lookup('chat.presence.offline').toString(),\n            not_responding: lookup('chat.presence.notResponding').toString(),\n            meal: lookup('chat.presence.meal').toString(),\n            training: lookup('chat.presence.training').toString(),\n            break: lookup('chat.presence.break').toString(),\n            meeting: lookup('chat.presence.meeting').toString()\n        };\n    }\n\n    return _mapping;\n};\n\nexport default Service.extend(LoggerMixin, {\n    ajax: service(),\n    intl: service(),\n    notification: service(),\n\n    presenceDefinitions: null,\n\n    // Dynamically injected services\n    session: null,\n    application: null,\n    presenceSubscription: null,\n\n    acdDivisionPresenceProfileToggle: computed.readOnly('session.features.acdDivisionPresenceProfileToggle'),\n\n    init() {\n        this._super(...arguments);\n\n        const owner = getOwner(this);\n        const session = owner.lookup('service:session');\n        const application = owner.lookup('service:application');\n        const presenceSubscription = owner.lookup('service:presenceSubscription');\n        if (!application || !session || !presenceSubscription) {\n            this.logger.error('Application, session, and presence subscriptions services are required, but not found');\n            return;\n        }\n\n        this.setProperties({\n            session,\n            application,\n            presenceSubscription,\n            presenceDefinitions: A([]),\n            outOfBandPresenceDefinitions: A([])\n        });\n    },\n\n    allPresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.get('allSecondaryPresences') || {}).flat();\n        return [].concat(this.get('primaryPresences'), secondary);\n    }),\n\n    allActivePresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.get('allSecondaryPresences') || {}).flat();\n        return [].concat(this.get('primaryPresences'), secondary).reject(presence => presence.get('deactivated'));\n    }),\n\n    primaryPresences: computed('presenceDefinitions.[]', function () {\n        return this.get('presenceDefinitions')\n            .filter(presence => {\n                if (Object.prototype.hasOwnProperty.call(presence, 'type')) {\n                    return presence.type.toLowerCase() === 'system';\n                }\n            })\n            .map(presence => {\n                return Presence.create(\n                    {\n                        presence\n                    },\n                    getOwner(this).ownerInjection()\n                );\n            });\n    }),\n\n    secondaryPresences: computed('allSecondaryPresences.[]', function () {\n        const presences = this.get('allSecondaryPresences') || {};\n        const keys = Object.keys(presences);\n        keys.forEach(key => {\n            if (presences[key]) {\n                presences[key] = A(presences[key]).reject(presence => presence.get('deactivated'));\n            }\n        });\n        return presences;\n    }),\n\n    allSecondaryPresences: computed('presenceDefinitions.[]', function () {\n        const secondaryPresenceDefinitions = (this.get('presenceDefinitions') || [])\n            .filter(presence => {\n                return Object.prototype.hasOwnProperty.call(presence, 'type') && presence.type.toLowerCase() === 'user';\n            })\n            .map(presence => {\n                return Presence.create({ presence }, getOwner(this).ownerInjection());\n            });\n\n        return groupBy(secondaryPresenceDefinitions, presence => presence.get('key'));\n    }),\n\n    loadPresences() {\n        const definitions = this.loadAllPresenceDefinitions();\n\n        const promise = RSVP.resolve(definitions);\n\n        promise\n            .then((definitions = []) => {\n                this.set('presenceDefinitions', A(definitions));\n\n                const definitionIds = this.get('presenceDefinitions').mapBy('id');\n                const currentId = this.get('session.person.presenceDefinition.id');\n                if (currentId && definitionIds.indexOf(currentId) === -1) {\n                    return this.findPresence(currentId).catch(error => {\n                        this.get('logger').error('Presence: Could not fetch out-of-band presence.', {\n                            error,\n                            remoteData: {\n                                currentId\n                            }\n                        });\n                    });\n                }\n            })\n            .catch(error => {\n                this.get('logger').error('Presence: Could not get presence definitions:', {\n                    error\n                });\n\n                this.set('presenceDefinitions', []);\n\n                Ember.Logger.error('presenceDefinitionsFetchFailure');\n                return;\n            });\n\n        return promise;\n    },\n\n    loadAllPresenceDefinitions() {\n        const deferred = RSVP.defer();\n\n        this.loadPresenceDefinitions().then(data => {\n            this.handlePresenceData(data, deferred);\n        });\n        let presenceTimeout = Ember.testing ? 2000 : 20000;\n        return TimeoutPromise(deferred.promise, presenceTimeout, 'presence#loadAllPresenceDefinitions');\n    },\n    loadPresenceDefinitions() {\n        const url = this.get('application').pcV2Uri('api/v2/presence/definitions');\n        return this.get('ajax').request(url, {\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    },\n\n    handlePresenceData(data, deferred) {\n        const presences = data.entities.map(value => {\n            if (value.systemPresence.toLowerCase() === 'onqueue') {\n                value.systemPresence = 'ON_QUEUE';\n            }\n            return value;\n        });\n        return deferred.resolve(presences);\n    },\n\n    localizePresenceString(presence) {\n        const intl = this.get('intl');\n        const lookup = intl.t.bind(intl);\n        const mapping = getPresenceMappings(lookup);\n        return mapping[presence] || mapping.offline;\n    },\n\n    getPresence(presenceString) {\n        const primary = this.get('primaryPresences');\n        const secondary = this.get('secondaryPresences')[presenceString.toLowerCase()];\n\n        let collection = primary;\n        if (!isEmpty(secondary)) {\n            collection = A(secondary).sortBy('presence.createdDate');\n        }\n\n        return A(collection).find(mapPresence => {\n            const rawPresence = mapPresence.get('presence');\n            const mapHasPresence = rawPresence.id === presenceString.toString();\n            const systemPresence = rawPresence.systemPresence;\n            const mapHasSystemPresence =\n                systemPresence &&\n                (systemPresence.toLowerCase() === presenceString.toLowerCase() ||\n                    systemPresence.toLowerCase() === presenceString.toLowerCase().replace(/-|\\s/g, '_'));\n            if (mapHasPresence || mapHasSystemPresence) {\n                return rawPresence;\n            }\n        });\n    },\n\n    getPresenceDefinition(presence) {\n        const presenceMap = this.get('presenceDefinitions');\n        return presenceMap.find(mapPresence => {\n            return mapPresence.id === presence.id;\n        });\n    },\n\n    getPresenceFallback(presence) {\n        if (presence) {\n            return presence.toLowerCase().replace(/-|\\s/g, '_');\n        }\n    },\n\n    localizePresence(presence, fallback) {\n        if (typeof fallback === 'string' && fallback.toLowerCase() === 'out_of_office') {\n            return this.localizePresenceString(fallback);\n        }\n\n        if (typeof presence === 'string' && !fallback) {\n            return this.localizePresenceString(presence);\n        }\n\n        if (presence) {\n            if (typeof presence === 'object') {\n                presence = this.getPresenceDefinition(presence);\n            }\n\n            if (presence && presence.languageLabels && presence.systemPresence !== 'IDLE') {\n                // en-us => en_US\n                let locale = formatPresenceLanguageLabelLocale(this.get('intl.locale.0'));\n                let languageLabel = get(presence.languageLabels, locale);\n                if (this.get('acdDivisionPresenceProfileToggle') && !languageLabel) {\n                    languageLabel = get(presence.languageLabels, locale.toLowerCase());\n                }\n                if (fallback === undefined) {\n                    fallback = this.getPresenceFallback(presence.systemPresence);\n                }\n                return languageLabel || this.localizePresenceString(fallback);\n            }\n        }\n\n        return this.localizePresenceString(fallback);\n    },\n\n    removeDeletedPresence(presence) {\n        this.get('presenceDefinitions').removeObject(presence);\n    },\n\n    findPresence(id, presenceDef = false) {\n        if (!id) {\n            return RSVP.resolve({});\n        }\n\n        const currentPresence = this.get('presenceDefinitions').find(presence => presence.id === id);\n        if (currentPresence) {\n            const instance = Presence.create(\n                {\n                    presence: currentPresence\n                },\n                getOwner(this).ownerInjection()\n            );\n            return RSVP.resolve(instance);\n        }\n\n        const url = this.get('application').pcV2Uri(['api/v2/presence/definitions', id]);\n        return this.get('ajax')\n            .request(url)\n            .then(presence => {\n                const model = Presence.create(\n                    {\n                        presence\n                    },\n                    getOwner(this).ownerInjection()\n                );\n\n                this.get('presenceDefinitions').addObject(presence);\n\n                return model;\n            })\n            .catch(error => {\n                if (this.get('session.features.acdDivisionPresenceProfileToggle')) {\n                    if (id && presenceDef && presenceDef.systemPresence) {\n                        // We need to map the out of band presence to a primary presence for translation sake.\n                        return this.get('primaryPresences').find(presence => {\n                            const matchingPrimaryPresence =\n                                presence.get('presence.systemPresence').toLowerCase() ===\n                                presenceDef.systemPresence.toLowerCase();\n                            if (matchingPrimaryPresence) {\n                                const newPresence = presence.get('presence');\n                                // Replace the id of the actual def instead of the primary presences id\n                                set(newPresence, 'id', presenceDef.id);\n                                const instance = Presence.create(\n                                    {\n                                        presence: newPresence\n                                    },\n                                    getOwner(this).ownerInjection()\n                                );\n                                this.get('outOfBandPresenceDefinitions').addObject(instance);\n                                return instance;\n                            }\n                            return false;\n                        });\n                    }\n                }\n                this.get('logger').error('Presence: Couldnt find given presence', {\n                    error,\n                    remoteData: {\n                        presenceId: id\n                    }\n                });\n            });\n    },\n\n    setUsersStatus(entity, status) {\n        const url = this.get('application').pcV2Uri(['api/v2/users', get(entity, 'id'), 'presences/PURECLOUD']);\n        return this.get('ajax').patch(url, {\n            contentType: 'application/json',\n            data: {\n                message: status\n            }\n        });\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport moment from '../utils/dates';\n\nconst LOGOUT_BOUNCE_COOKIE_NAME = 'lastLogoutTimestamp';\nconst LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS = 5000;\nconst LOGOUT_BOUNCE_THREASHOLD_MILLIS = 5000;\n\nconst { inject, typeOf, Logger, Service } = Ember;\n\n/**\n *  Service containing utility methods and metadata used in the PureCloud OAuth flows\n *\n *  service:purecloud-oauth - utilities and state for the oauth flow\n *  authenticator:directory - Handles direct interface with the auth endpoints\n *  service:session - holds state for the current user authentication/authorization context\n *  authorizer:directory - Handles future request authorization\n */\nexport default Service.extend({\n    cookies: inject.service(),\n    session: inject.service(),\n\n    _restoreState: null,\n\n    // Flag to indicate if we're in the logout/login bounce used to re-prime the oauth flow to Collaborate upon logout\n    inLogoutBounce: false,\n\n    init() {\n        this._super(...arguments);\n        if (this._isInLogoutBounce()) {\n            this.set('inLogoutBounce', true);\n            this._clearLogoutTime();\n        }\n    },\n\n    /**\n     * Generates a string value that can be passed via the state parameter\n     * to restore the current state post authentication\n     */\n    serializeRestoreState(baseLocation = window.location) {\n        let result = null;\n\n        const searchString = baseLocation.search;\n        const internalRoute = this.get('session.attemptedTransition.intent.url');\n\n        if (searchString && _.trim(searchString).length > 0) {\n            result = (result || '') + searchString;\n        }\n\n        if (internalRoute && _.trim(internalRoute).length > 0) {\n            result = (result || '') + `#${internalRoute}`;\n        }\n\n        // Make sure we don't redirect to login-oauth; should never be the case though\n        return result && result.indexOf('login-oauth') === -1 ? result : null;\n    },\n\n    /**\n     * Parse and store the state param for later use to restore the app to\n     * pre-auth state.\n     */\n    deserializeRestoreState(stateParamValue, baseLocation = window.location) {\n        let redirectUrl = null;\n        let prunedStateParamValue = typeOf(stateParamValue) === 'string' ? stateParamValue.trim() : undefined;\n\n        if (prunedStateParamValue) {\n            let firstChar = prunedStateParamValue.charAt(0);\n            if (firstChar === '?' || firstChar === '#') {\n                // Rebuild pre-redirect state\n                try {\n                    // ensure pathname ends with .html or / for s3 redirect\n                    let s3SafePathname = baseLocation.pathname;\n                    if (!s3SafePathname.endsWith('.html') && !s3SafePathname.endsWith('/')) {\n                        s3SafePathname += '/';\n                    }\n\n                    let parsedStateParam = new URL(prunedStateParamValue, 'https://example.com');\n                    // if no search was provided via state, use the current\n                    // FUTURE: We could merge the query params if we wanted, but not currently applicable and probably overkill\n                    let finalSearch = parsedStateParam.search || baseLocation.search;\n                    // if no hash was provided via state, use the current\n                    let finalHash = parsedStateParam.hash || baseLocation.hash;\n\n                    redirectUrl = new URL(\n                        `${s3SafePathname}${finalSearch}${finalHash}`,\n                        baseLocation.origin || `${baseLocation.protocol}//${baseLocation.host}`\n                    ).toString();\n                } catch (e) {\n                    if (baseLocation) {\n                        // prunedStateParamValue or final url is invalid\n                        Logger.error('Failed to restore URL state after authentication', { error: e });\n                    }\n\n                    redirectUrl = null;\n                }\n            }\n        }\n\n        if (redirectUrl) {\n            this.set('_restoreState', { url: redirectUrl });\n        } else {\n            this.set('_restoreState', null);\n        }\n    },\n\n    /**\n     * Pop the restore state object {url: 'url'}\n     * to restore the app to pre-auth state\n     */\n    popRestoreState() {\n        const result = this.get('_restoreState');\n        this.set('_restoreState', null);\n        return result;\n    },\n\n    /**\n     * Persist the logout time in browser storage for logout bounce detection on\n     * the next application load\n     */\n    recordLogoutTime() {\n        let now = moment();\n\n        let cookieOptions = {\n            expires: moment(now).add(LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS, 'milliseconds').toDate()\n        };\n\n        if (window && window.location && window.location.protocol === 'https:') {\n            cookieOptions.secure = true;\n        }\n\n        if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n            cookieOptions.sameSite = 'none';\n        }\n\n        this.get('cookies').write(LOGOUT_BOUNCE_COOKIE_NAME, '' + now.valueOf(), cookieOptions);\n    },\n\n    _clearLogoutTime() {\n        this.get('cookies').clear(LOGOUT_BOUNCE_COOKIE_NAME);\n    },\n\n    _isInLogoutBounce() {\n        let result = false;\n\n        let now = moment();\n        let lastLogout = Number(this.get('cookies').read(LOGOUT_BOUNCE_COOKIE_NAME));\n\n        if (lastLogout) {\n            result = now.diff(moment(lastLogout)) <= LOGOUT_BOUNCE_THREASHOLD_MILLIS;\n        }\n\n        return result;\n    }\n});\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport RelateFeaturesMixin from 'connections-ui/mixins/relate/relate-features';\n\nexport const RELATE_FRAME_ID = '#relateFrame';\n\nconst DEFAULT_ROUTE_MAP = {\n    'relate-engine': {\n        list: {\n            contacts: 'contacts',\n            organizations: 'organizations'\n        },\n        contact: {\n            edit: 'contacts/profile/edit',\n            show: 'contacts/profile',\n            new: 'contacts/add'\n        },\n        organization: {\n            edit: 'organizations/profile/edit',\n            show: 'organizations/profile',\n            new: 'organizations/add'\n        },\n        upload: 'csv'\n    }\n};\n\nexport const VERIFICATION_RELEVANT_DATA_MESSAGE = {\n    command: 'verificationRelevantData'\n};\n\nexport const CONTACTS_ENDPOINT = 'api/v2/externalcontacts/contacts/';\nexport const CONVERSATIONS_ENDPOINT = 'api/v2/externalcontacts/conversations/';\n\nconst STRICT = true;\nconst NO_OP = 'noop';\n\nconst PROFILE_VERIFICATION_EVENT_NAME = 'profileVerified';\nconst SHOW_PROFILE_EVENT_NAME = 'showProfile';\n\nexport const EXTERNAL_CONTACT = 'externalcontacts/contact';\n\nconst ADAPTER_CACHE_TIMEOUT = 3 * 1000;\n\nexport const CHANNEL_MODEL_TYPE = 'externalcontacts/channel-record';\n\nexport default Ember.Service.extend(Ember.Evented, LoggerMixin, RelateFeaturesMixin, {\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    addressformat: Ember.inject.service(),\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    store: Ember.inject.service(),\n    notification: Ember.inject.service('notification-proxy'),\n    names: Ember.inject.service(),\n\n    adapterCache: {},\n\n    isRelateActive: false,\n    route: NO_OP,\n    navigationRoute: null,\n    redirectRoute: null,\n    externalContactProfiles: [],\n    navTree: null,\n    helpURL: Ember.computed.alias('route'),\n    relateFrameOrigin: null,\n    profileVerificationEventName: PROFILE_VERIFICATION_EVENT_NAME,\n    showProfileEventName: SHOW_PROFILE_EVENT_NAME,\n\n    /**\n     * The list of contacts associated with an interaction\n     *\n     * Contacts with 'wasAutoverified' were automatically associated\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactAssociationMap: {},\n\n    /**\n     * The list of contacts that have been manually disassociated with an interaction\n     *   Will remove this when conversation service keeps track of the dissassociation list\n     *   For now, users will have to manually disassociate contacts again if the app is refreshed\n     *\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactDisassociationMap: {},\n\n    findMatchingExternalContacts(searchTerm, pageOffset, pageSize, expandField, originator) {\n        if (!searchTerm) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        let url = this.get('application').pcUri(CONTACTS_ENDPOINT);\n\n        if (this.get('addressformat').isValidNumber(searchTerm, null, STRICT)) {\n            searchTerm = this.get('addressformat').formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageOffset) {\n            data.pageNumber = pageOffset;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n\n        return this.get('ajax').ajaxGet(url + `?${Ember.$.param(data)}`, {\n            timeout: 2000 //msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n        });\n    },\n\n    registerSidebarState() {},\n\n    getEngineHelp(currentRouteName) {\n        const contextHelpUrls = this.get('contextHelpUrls') || {};\n        const path = Ember.get(_.merge(DEFAULT_ROUTE_MAP, contextHelpUrls), currentRouteName);\n        return path ? `relate.${path}` : currentRouteName;\n    },\n\n    handleNavigation(navEvent) {\n        this.set('navigationRoute', navEvent);\n    },\n\n    handleRedirect(navEvent) {\n        this.propertyWillChange('redirectRoute');\n        this.set('redirectRoute', navEvent);\n        this.propertyDidChange('redirectRoute');\n    },\n\n    registerNavEntries(navEntries) {\n        this.set('navTree', navEntries);\n    },\n\n    /**\n     * Binds a non-agent participant to an external contact the given external contact between the conversation, communication, and the media type\n     *  Note: Currently we only support a 1:1 relationship between interaction and contact. In the future we plan to adjust this\n     *          to be a 1:n relationship between interaction and its associated contacts\n     *\n     * @param conversationId - the conversation ID to which the external contact should be bound.\n     * @param externalContactId - (optional) if the external contact ID is missing the association is removed.\n     * @param communicationId - (optional) the communication ID for the conversation.\n     * @param mediaType - (optional)  Should be one of 'call', 'email', 'chat',\n     * @returns An Ember RSVP promise\n     */\n    associateConversationWithInteraction(conversationId, communicationId, externalContactId, mediaType) {\n        const url = this.get('application').pcUri(CONVERSATIONS_ENDPOINT + conversationId);\n        const data = {\n            communicationId: communicationId,\n            mediaType: mediaType,\n            conversationId: conversationId\n        };\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        return this.get('ajax').put(url, { data: data, dataType: 'text' });\n    },\n\n    profileVerified(verificationInteractionData, displayNotification) {\n        if (displayNotification) {\n            verificationInteractionData.shouldNotify = true;\n        }\n        this.trigger(this.get('profileVerificationEventName'), verificationInteractionData);\n        this.processFrameVerificationEvent(verificationInteractionData);\n    },\n\n    closeRelateFrame(isClosedInteraction) {\n        if (!isClosedInteraction) {\n            this.trigger(this.get('showProfileEventName'), true);\n        }\n    },\n\n    postMessage(message) {\n        try {\n            const relateIframe = $(RELATE_FRAME_ID).get(0);\n            if (!relateIframe) {\n                return;\n            }\n\n            relateIframe.contentWindow.postMessage(message, this.get('relateFrameOrigin'));\n        } catch (e) {\n            this.logger.error('Could not postMessage', { error: e, message });\n        }\n    },\n\n    postVerificationRelevantDataV2(conversationId, communicationId, mediaType, contactId) {\n        let message = Object.assign({}, VERIFICATION_RELEVANT_DATA_MESSAGE);\n\n        const contactAssociationMap = this.get('contactAssociationMap');\n        const associatedContacts = contactAssociationMap[conversationId] || [];\n        const hasActiveAssociation = associatedContacts.length;\n\n        const verified =\n            hasActiveAssociation &&\n            associatedContacts.find(contact => {\n                return contact.get('id') === contactId;\n            });\n\n        const wasAutoVerified = verified && verified.get('wasAutoverified');\n\n        message.verificationRelevantData = {\n            mediaType: mediaType,\n            contactId,\n            conversationId,\n            communicationId,\n            wasAutoVerified,\n            isVerified: !!hasActiveAssociation,\n            activeProfileIsVerified: !!verified\n        };\n        this.postMessage(message);\n    },\n\n    getCachedAdapter(queryData, context, timeout) {\n        if (!context.ajax) {\n            this.logger.error(`Relate Service: Relate Service: adapter not valid`);\n            return Ember.RSVP.reject({});\n        }\n        const { url, data, TIME_OUT } = queryData;\n        const adapterCache = this.get('adapterCache');\n\n        const q = data.lookupVal || data.q;\n        const exp = data.expand || '';\n        const num = data.pageNumber || 0;\n        const siz = data.pageSize || 0;\n        const ord = data.sortOrder || 0;\n\n        const key = `${url}_${q}_${exp}_${num}_${siz}_${ord}`;\n\n        let { promise, timer } = adapterCache[key] || {};\n\n        if (!promise) {\n            promise = context.ajax(url, 'GET', { data, timeout: TIME_OUT }).catch(error => {\n                this.clearCachedAdapter(key);\n                const errorType = data.lookupVal ? 'reverse whitePage lookup' : 'search';\n\n                this.logger.error(`Relate Service: error getting data`, {\n                    remoteData: {\n                        error,\n                        errorType,\n                        sensitive: {\n                            data\n                        }\n                    }\n                });\n                return error;\n            });\n        }\n        if (timer) {\n            Ember.run.cancel(timer);\n        }\n        timer = Ember.run.later(this, 'clearCachedAdapter', key, timeout || ADAPTER_CACHE_TIMEOUT);\n        adapterCache[key] = { promise, timer };\n        return promise;\n    },\n\n    clearCachedAdapter(key) {\n        if (!key) {\n            return this.set('adapterCache', {});\n        }\n        const adapterCache = this.get('adapterCache');\n        const { timer } = adapterCache[key] || {};\n        if (timer) {\n            Ember.run.cancel(timer);\n        }\n        delete adapterCache[key];\n    },\n\n    interactionEnded(interactionId) {\n        const clear = map => {\n            interactionId &&\n                map[interactionId] &&\n                map[interactionId].clear() &&\n                map[interactionId].length === 0 &&\n                delete map[interactionId];\n        };\n        clear(this.contactAssociationMap);\n        clear(this.contactDisassociationMap);\n    }\n});\n","define(\"connections-ui/services/resize-detector\", [\"exports\", \"ember-element-resize-detector/services/resize-detector\"], function (_exports, _resizeDetector) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _resizeDetector.default;\n    }\n  });\n});\n","import Service, { inject } from '@ember/service';\n\nexport interface IMediaMetadata {\n    trackId: string;\n    screenId: string;\n    originX: number;\n    originY: number;\n    resolutionX: number;\n    resolutionY: number;\n    primary: boolean;\n    main?: boolean;\n}\n\nexport interface IShareableScreenInfo {\n    shareid: string;\n    width: number;\n    height: number;\n    isPrimary: boolean;\n    isMain: boolean;\n    x: number;\n    y: number;\n}\n\nexport class BrowserScreenRecordingError extends Error {}\n\nexport default class ScreenMediaService extends Service {\n    application = inject('application');\n    session = inject('session');\n    logger = inject('stash-logger');\n\n    // set this through Orgpsan for testing\n    allowScreenRecordingInBrowser!: false;\n    debugScreenSelectionOpen = false;\n\n    _getHostedContext() {\n        return (this.get as any)('application.hostedContext');\n    }\n\n    _isHosted(): boolean {\n        return this._getHostedContext().isHosted();\n    }\n\n    canDoScreenRecording(): boolean {\n        return this._isHosted() || this.get('allowScreenRecordingInBrowser');\n    }\n\n    async _debugScreenRecordingInBrowser(): Promise<MediaStream> {\n        this.set('debugScreenSelectionOpen', true);\n        const stream = await navigator.mediaDevices.getDisplayMedia();\n        this.set('debugScreenSelectionOpen', false);\n\n        return stream;\n    }\n\n    async getMediaStreamWithAllMonitors(\n        conversationId: string\n    ): Promise<{ stream: MediaStream; metadatas: IMediaMetadata[] }> {\n        if (!this._isHosted()) {\n            this.get('logger').warn('screenMedia was requested in non-hosted env', { remoteData: { conversationId } });\n        }\n\n        if (this.get('allowScreenRecordingInBrowser')) {\n            const stream = await this._debugScreenRecordingInBrowser();\n            const track = stream.getTracks()[0];\n            const { height, width, deviceId } = track.getSettings();\n            const metadata: IMediaMetadata = {\n                trackId: track.id,\n                screenId: deviceId!, // some applications give you a deviceId on the track which is uniquely tied to a specific monitor\n                originX: 0,\n                originY: 0,\n                resolutionX: width!,\n                resolutionY: height!,\n                primary: true\n            };\n\n            return { stream, metadatas: [metadata] };\n        } else if (!this._isHosted()) {\n            throw new BrowserScreenRecordingError('Cannot do screen recording in browser env');\n        }\n\n        // get a list of monitors so we can gather media for each one\n        const screens = await this._getHostedContext().getShareableScreens();\n\n        const stream = this.createMediaStream();\n        const metadatas = [];\n\n        for (const screen of screens) {\n            const track = await this.getVideoTrackForScreenId(screen.shareid, conversationId);\n\n            // if we have a track, create the metadata to go with it\n            if (track) {\n                stream.addTrack(track);\n                metadatas.push(this.createTrackMetadata(screen, track));\n            }\n        }\n\n        return { stream, metadatas };\n    }\n\n    createMediaStream() {\n        return new MediaStream();\n    }\n\n    // tries 3 times to add a screen to the media stream\n    async getVideoTrackForScreenId(\n        screenId: string,\n        conversationId: string,\n        attemptsRemaining = 3\n    ): Promise<MediaStreamTrack | undefined> {\n        try {\n            const stream = await this.getHostedScreenMedia(screenId);\n\n            if (stream && stream.getVideoTracks().length) {\n                return stream.getVideoTracks()[0];\n            }\n\n            return;\n        } catch (err) {\n            if (!attemptsRemaining) {\n                this.get('logger').error(new Error('Failed to initialize screen recording for screen') as any, {\n                    remoteData: { screenId, conversationId, error: err }\n                });\n                return;\n            }\n\n            return this.getVideoTrackForScreenId(screenId, conversationId, attemptsRemaining - 1);\n        }\n    }\n\n    getHostedScreenMedia(screenId: string, maxFrameRate = 3): Promise<MediaStream> {\n        return window.navigator.mediaDevices.getUserMedia({\n            audio: false,\n            video: {\n                mandatory: {\n                    chromeMediaSource: 'desktop',\n                    chromeMediaSourceId: screenId,\n                    maxFrameRate\n                }\n            } as any\n        });\n    }\n\n    createTrackMetadata(screenInfo: IShareableScreenInfo, track: MediaStreamTrack): IMediaMetadata {\n        const isWindows = navigator.appVersion.indexOf('Win') > -1;\n        // purecloud-mac uses the bottom-left corner of the screen as its origin, with positive numbers representing higher origins\n        // purecloud-directory-window uses the top-left corner of the screen as its origin, with positive numbers representing lower origins\n        return {\n            trackId: track.id,\n            screenId: screenInfo.shareid,\n            originX: screenInfo.x,\n            originY: isWindows ? screenInfo.y : -1 * screenInfo.y,\n            resolutionX: screenInfo.width,\n            resolutionY: screenInfo.height,\n            primary: !!screenInfo.isPrimary,\n            main: !!screenInfo.isMain\n        };\n    }\n}\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        screenMedia: ScreenMediaService;\n        'screen-media': ScreenMediaService;\n    }\n}\n","define(\"connections-ui/services/scroll-activity\", [\"exports\", \"ember-user-activity/services/scroll-activity\"], function (_exports, _scrollActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _scrollActivity.default;\n    }\n  });\n});\n","import Ember from 'ember';\nimport { isAbortError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport EsaSessionService from 'ember-simple-auth/services/session';\nimport _ from 'lodash';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport FieldConfig from '../field-config/field-config';\nimport moment from '../utils/dates';\nimport featureToggles from '../utils/feature-toggles';\nimport { addPageAction, setCustomAttribute } from '../utils/newrelic';\nimport { getLoggableRequestFailureDetails } from '../utils/request';\nimport { executeChain, isChainStepFailure } from '../utils/serial-processing-chain';\nimport { loadTheme, setThemeCookie } from '../utils/theme-loader';\nimport { buildCommonTelemetryContext } from './analytics';\n\n// TECHDEBT: Make this a proper type/error and part of the method signature when moving to TS\nexport const SESSION_BOOTSTRAP_ERROR_TYPE = 'sessionBootstrapError';\n\nexport default EsaSessionService.extend(LoggerMixin, {\n    ajax: Ember.inject.service(),\n    intl: Ember.inject.service(),\n    clock: Ember.inject.service(),\n    pigeon: Ember.inject.service(),\n    stashLogger: Ember.inject.service('stash-logger'),\n    cookies: Ember.inject.service(),\n    application: Ember.inject.service(),\n    featureService: Ember.inject.service('feature'),\n    presence: Ember.inject.service(),\n    presenceSubscription: Ember.inject.service(),\n    // Store conflicts with ESA Session Service property\n    dataStore: Ember.inject.service('store'),\n    permissionService: Ember.inject.service('permissions'),\n    orgSettings: Ember.inject.service('orgSettings'),\n\n    accessToken: null,\n\n    person: null,\n    presenceMap: Ember.computed.reads('presence.presenceDefinitions'),\n\n    user: null, // Legacy - Directory session user - Move to permissions where possible.\n    namedPermissions: Ember.computed.reads('permissions'), // Backwards compatibility - Directory namedPermissions now point to public-api permissions\n\n    permissions: Ember.computed.reads('publicApiUser.authorization.permissions'),\n    roleNames: Ember.computed.map('publicApiUser.authorization.roles', role => role.name),\n\n    readWritePermissionsDeferred: null,\n\n    allowedOrgPermissions: null,\n    features: null,\n    enabledFeatures: [],\n\n    products: [],\n\n    authInProgress: false,\n    /**\n     * Marker boolean to indicate that the current session is being torn down\n     */\n    logoutInProgress: false,\n    /**\n     * Marker boolean to indicate that a hard logout has been requested\n     */\n    singleSignOutInProgress: false,\n\n    offset: 0,\n\n    blockers: [],\n\n    _timeAuthenticated: null,\n\n    init() {\n        this._super(...arguments);\n\n        let deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            deferred = Ember.RSVP.defer();\n            this.set('readWritePermissionsDeferred', deferred);\n        }\n    },\n\n    // isAuthenticated conflicts with ESA Session Service property\n    isAuthenticated: Ember.computed('session.isAuthenticated', 'user', 'person', function () {\n        return this.get('session.isAuthenticated') && !_.isEmpty(this.get('user'));\n    }),\n\n    hasAppAccess: Ember.computed('namedPermissions', 'user.isSuper', 'user.isTrustee', function () {\n        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n            return true;\n        }\n\n        var permissions = this.get('namedPermissions');\n\n        const hasDirectoryUserViewPermission = (permissions || []).some(perm => {\n            return perm.indexOf('directory:user:view') > -1;\n        });\n\n        return (\n            _.includes(permissions, 'employee') ||\n            _.includes(permissions, 'external') ||\n            _.includes(permissions, 'associate') ||\n            hasDirectoryUserViewPermission\n        );\n    }),\n\n    hasTrusteeAccess: Ember.computed('user.isTrustee', function () {\n        return this.get('user.isTrustee');\n    }),\n\n    // Has permission that is division aware.\n    hasPermissionAndDivision: function (permission, division) {\n        const result = {\n            hasPermission: false,\n            divisions: [],\n            hasDivision: false,\n            hasDivisions: false\n        };\n\n        if (!permission) {\n            return result;\n        }\n\n        const permissions = this.get('namedPermissions');\n        const expression = '^'.concat(permission, ':', '([0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12},|)+');\n        const regEx = new RegExp(expression);\n        let isPermission = false;\n        let isPermissionWithDivisions = false;\n        let permissionDivisions = [];\n\n        const foundPermission = _.find(permissions, p => {\n            isPermission = p === permission;\n            isPermissionWithDivisions = regEx.test(p);\n            if (isPermissionWithDivisions) {\n                permissionDivisions = _.last(p.split(':'));\n            }\n            return isPermission || isPermissionWithDivisions;\n        });\n\n        if (foundPermission) {\n            result.hasPermission = true;\n            if (isPermissionWithDivisions) {\n                result.hasDivisions = true;\n                if (permissionDivisions && permissionDivisions.length > 0) {\n                    result.divisions = permissionDivisions.split(',');\n                    if (division && _.includes(permissionDivisions, division)) {\n                        result.hasDivision = true;\n                    }\n                }\n            }\n            return result;\n        }\n        return result;\n    },\n\n    readWritePermissions: Ember.computed(function () {\n        const deferred = this.get('readWritePermissionsDeferred');\n        if (!deferred) {\n            // return dummy on the off chance that the laws of physics no longer apply\n            if (this.logger) {\n                this.logger.warn('readWritePermissionsDeferred never instantiated in Session `init` call');\n            }\n            return Ember.RSVP.defer().promise;\n        }\n        return deferred.promise;\n    }),\n\n    useEmailDraftEvent: true,\n\n    popoutAuthForIframes: Ember.computed('org.orgSettings.popoutAuthForIframes', function () {\n        return !!this.get('org.orgSettings.popoutAuthForIframes');\n    }),\n\n    /**\n     * Determines if the app should try to detect API requests to the UI hosting domain and\n     * rewrite them to our API domain. This is to help with the transition to our new\n     * hosting where API calls are not available on the same domain.\n     */\n    rewriteRootAPIRequests: Ember.computed('features.comui-disable-legacy-api-url', function () {\n        // Only do this we are on the new hosting and the feature toggle is enabled.\n        return window.location.hostname.startsWith('app.') && this.get('features.comui-disable-legacy-api-url');\n    }),\n\n    createFieldConfigs: function (fieldConfigs) {\n        for (const value of Object.values(fieldConfigs)) {\n            this.createFieldConfig(value);\n        }\n    },\n\n    createFieldConfig: function (fieldConfig) {\n        FieldConfig.createFieldConfig(fieldConfig, Ember.getOwner(this));\n    },\n\n    createPresences: function () {\n        return this.get('presence').loadPresences();\n    },\n\n    loadAllowedOrgPermissions: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/permissions?pageSize=99999');\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('allowedOrgPermissions', data.entities);\n            })\n            .catch(error => {\n                this.set('allowedOrgPermissions', null);\n                this.logger.error('Could not get org permissions:', { error });\n                return Ember.RSVP.reject('orgPermissionsFetchFailure');\n            });\n    },\n\n    loadOrgProducts: function () {\n        const url = this.get('application').pcV2Uri('api/v2/authorization/products');\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('products', data.entities);\n            })\n            .catch(error => {\n                this.set('products', []);\n                this.logger.error('Could not get org products:', { error });\n                return Ember.RSVP.reject('orgProductsFetchFailure');\n            });\n    },\n\n    async getOrganizationTranscriptSettings() {\n        const ajax = this.get('ajax');\n        const application = this.get('application');\n        const hasPermission = (this.get('permissions') || []).includes('routing:transcriptionSettings:view');\n\n        if (!hasPermission) {\n            return {};\n        }\n\n        let transcriptSettings = {};\n\n        try {\n            const settingsUri = application.pcV2Uri('api/v2/routing/settings/transcription');\n            const response = await ajax.request(settingsUri);\n\n            transcriptSettings = response || {};\n        } catch (error) {\n            this.logger.error('directory failed to retrieve org transcript settings', { error });\n        }\n\n        this.set('transcriptSettings', transcriptSettings);\n        return transcriptSettings;\n    },\n\n    getPresence(presence) {\n        return this.get('presence').getPresence(presence);\n    },\n\n    authenticateWithSession(forceDirectory = false) {\n        if (this.get('isAuthenticated')) {\n            return Ember.RSVP.resolve();\n        }\n\n        this.set('authInProgress', true);\n\n        const bootstrapStartTime = performance.now();\n\n        return executeChain(\n            [\n                {\n                    stepDesc: 'loadFeatureToggles',\n                    process: () => this.getFeatures()\n                },\n                {\n                    stepDesc: 'loadOrgPermissions',\n                    process: () => this.loadAllowedOrgPermissions()\n                },\n                {\n                    stepDesc: 'setupTheme',\n                    processSync: () => setThemeCookie(loadTheme(this))\n                },\n                {\n                    stepDesc: 'setupUserAndTrustee',\n                    process: () => {\n                        if (!forceDirectory) {\n                            return this.trusteeBootstrap();\n                        }\n\n                        return Ember.RSVP.resolve();\n                    }\n                },\n                {\n                    stepDesc: 'establishDirectorySession',\n                    process: () => {\n                        // Don't call directory session for login when we have trustee features on\n                        if (this.get('user.isTrustee')) {\n                            return Ember.RSVP.resolve();\n                        }\n\n                        const path = 'api/v2/apps/legacy/session';\n                        const url = this.get('application').pcV2Uri(path);\n                        const data = { lang: this.get('intl.isoLocale') };\n                        return this.get('ajax')\n                            .post(url, { data })\n                            .then(data => this.establishSession(data));\n                    }\n                },\n                {\n                    stepDesc: 'initServerTranslations',\n                    process: () => this.get('intl').setupServerTranslations()\n                },\n                {\n                    stepDesc: 'loadPresences',\n                    process: () => this.createPresences()\n                },\n                {\n                    stepDesc: 'loadUserDetails',\n                    process: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return Ember.RSVP.resolve([]);\n                        }\n                        return this.refreshPublicApiUser();\n                    }\n                },\n                {\n                    stepDesc: 'loadUserFavorites',\n                    processSync: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return;\n                        }\n\n                        return this.get('person.favorites');\n                    }\n                },\n                {\n                    stepDesc: 'setupCarrierPigeon',\n                    process: () => this.setupCarrierPigeon()\n                },\n                {\n                    stepDesc: 'initAppSession',\n                    process: () => this.updateAppSession()\n                },\n                {\n                    stepDesc: 'loadOrgProducts',\n                    process: () => {\n                        const hasAssistantsQueueViewPermission = (this.get('namedPermissions') || []).some(perm => {\n                            return perm.indexOf('assistants:queue:view') > -1;\n                        });\n                        if (hasAssistantsQueueViewPermission) {\n                            return this.loadOrgProducts();\n                        }\n                    }\n                },\n                {\n                    stepDesc: 'loadOrgTranscriptSettings',\n                    process: () => this.getOrganizationTranscriptSettings()\n                },\n                {\n                    stepDesc: 'loadPerson',\n                    processSync: () => this.get('person')\n                }\n                // DO NOT add additional processing blocks here unless it is REQUIRED for app bootstrap\n            ],\n            {\n                loggingConfig: {\n                    logger: this.get('stashLogger'),\n                    logMsgPrefix: 'Session Bootstrap Chain: '\n                }\n            }\n        )\n            .then(() => {\n                this.set('authInProgress', false);\n                const bootstrapDuration = performance.now() - bootstrapStartTime;\n                addPageAction('sessionBootstrapSuccess', {\n                    duration: bootstrapDuration\n                });\n            })\n            .catch(reason => {\n                this.set('authInProgress', false);\n\n                let error = reason;\n                let failedStep;\n\n                // Theoretically, reason should always be a ChainStepFailure, but .. promise rejection typings\n                if (isChainStepFailure(reason)) {\n                    error = reason.origReason;\n                    failedStep = reason.stepDesc;\n                }\n\n                /* Legacy Checks */\n                let legacyInvalidSessionToken = false;\n                let legacyErrorCode = null;\n                if (error && error.status === 200) {\n                    legacyErrorCode = 'directorySessionParseFailure';\n                }\n\n                if (error && error.status === 403) {\n                    legacyInvalidSessionToken = true;\n                    legacyErrorCode = 'invalidSessionToken';\n                }\n                /* End Legacy Checks */\n\n                const telemetryContext = buildCommonTelemetryContext({\n                    applicationService: this.get('application'),\n                    sessionService: this,\n                    intlService: this.get('intl')\n                });\n                const loggableRequestFailureDetails = getLoggableRequestFailureDetails(error);\n\n                this.get('stashLogger').error('Session bootstrap failed', {\n                    error,\n                    remoteData: Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode,\n                            requestFailureDetails: loggableRequestFailureDetails\n                        },\n                        telemetryContext\n                    )\n                });\n\n                addPageAction(\n                    'sessionBootstrapFailure',\n                    Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode\n                        },\n                        loggableRequestFailureDetails,\n                        telemetryContext\n                    )\n                );\n\n                return Ember.RSVP.reject({\n                    type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                    failedStep,\n                    status: loggableRequestFailureDetails ? loggableRequestFailureDetails.status : undefined,\n                    legacyInvalidSessionToken\n                });\n            });\n    },\n\n    trusteeBootstrap() {\n        const expands = ['fieldconfigs', 'organization'];\n\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            this.refreshPublicApiUser(expands)\n                .then(data => {\n                    this.setServerTimeOffset();\n                    moment.now = () => {\n                        const offset = this.get('offset');\n                        return +new Date() + offset;\n                    };\n\n                    this.set('_timeAuthenticated', moment.now());\n\n                    this.createFieldConfigs(data.fieldConfigs);\n\n                    const user = this.setupStoreData('public-api-user', data);\n                    this.set('user', user);\n                    this.set('trusteeOrg', data.organization);\n\n                    // See if the person exists, if not, trustee user.\n                    // This will be changed to an directory session call when they support\n                    // trustees...soon...\n                    this.get('dataStore')\n                        .find('person', user.get('id'))\n                        .then(person => {\n                            this.set('person', person);\n\n                            // the profile load was triggerred by refreshPublicApiUser(expands) above\n\n                            resolve(person);\n                        })\n                        .catch(error => {\n                            const serverError = Ember.get(error, 'errors.0');\n                            if (serverError && serverError.status === 404) {\n                                this.set('user.isTrustee', true);\n\n                                const person = this.get('dataStore').createRecord('person', {\n                                    id: 'trustee',\n                                    general: {\n                                        name: [{ value: user.get('name') }],\n                                        department: [{ value: user.get('department') }],\n                                        title: [{ value: user.get('title') }]\n                                    }\n                                });\n                                this.set('person', person);\n\n                                resolve();\n                            } else {\n                                reject(error);\n                            }\n                        });\n                })\n                .catch(error => {\n                    if (error.status === 404 || _.includes(error.message, 'not found')) {\n                        resolve(this.authenticateWithSession(true));\n                    } else {\n                        this.get('logger').error('trusteeBootstrap failed', {\n                            error,\n                            remoteData: {\n                                error: error\n                            }\n                        });\n                        reject(error);\n                    }\n                });\n        });\n    },\n\n    /**\n     * Initiates logout if the user is deleted outside of a logout request\n     */\n    onLegacySessionInvalidation: Ember.observer('user', function () {\n        if (_.isEmpty(this.get('user')) && !this.get('logoutInProgress')) {\n            this.invalidate();\n        }\n    }),\n\n    /**\n     * If no critical work is in progress, invalidates the session with both ESA\n     * and any local cleanup triggering the 'invalidationSucceeded' event when complete.\n     * This method should be used to invalidate the current session as opposed to\n     * logging out of PureCloud.  For a full, single-sign-out logout, call logout.\n     *\n     * This method triggers 'invalidatingAuthSession' to allow any listeners to\n     * register critical functionality that cannot be currently aborted.\n     *\n     * Note: This method is multi-call, burst tolerant to handle multiple\n     * 401 responses from the ajaxError handler and bubbling logout events.\n     *\n     * @returns A rejected promise if any listeners have registered critical functionality\n     * in progress; Otherwise, a logout promise that will be the same instance for the duration\n     * of the logout attempt.  It will only be reattempted if the logout attempt\n     * fails.\n     */\n    invalidate(options) {\n        options = options || {};\n        const LOGOUT_PROMISE_PROP_NAME = '_logoutPromise';\n        let logoutPromise = this.get(LOGOUT_PROMISE_PROP_NAME);\n\n        //workaround for an odd bug that is causing the call to super below to hit the wrong super class.\n        //the context of `this` does not change, but _super does.\n        let _super = this._super.bind(this);\n\n        // notify services that we're attempting to logout.\n        this.trigger('invalidatingAuthSession', this.addRemoveBlockers.bind(this));\n\n        if (this.get('blockers.length') > 0) {\n            this.set('shouldPreventLogout', true);\n            const unauthorized = !!(options.unauthorized || options.notified);\n            // Force a boolean value\n            this.set('logoutSinceUnauthorized', unauthorized);\n            return Ember.RSVP.reject('prevent this logout');\n\n            // if we got blocked due to webrtc sessions, we want to bypass this because it means they've already seen a notification\n        } else if (!this.get('logoutSinceUnauthorized')) {\n            this.set('shouldPreventLogout', false);\n            this.set('logoutSinceUnauthorized', false);\n        }\n        if (!logoutPromise) {\n            logoutPromise = new Ember.RSVP.Promise((resolve, reject) => {\n                this.set('logoutInProgress', true);\n\n                Ember.RSVP.resolve().finally(() => {\n                    if (this.get('session.isAuthenticated')) {\n                        _super(...arguments)\n                            .then(resolve)\n                            .catch(() => {\n                                // Currently, this will only happen if ESA fails to remove the auth creds\n\n                                this.set('logoutInProgress', false);\n\n                                // kill user to force isAuthenticated computed to false\n                                // Note: user observer fires immediately and gets same rejected promise; no duplicate call risk\n                                this.set('user', null);\n\n                                // Reset the promise so they can attempt to logout again\n                                this.set(LOGOUT_PROMISE_PROP_NAME, null);\n\n                                // ESA will fire a failure event\n                                reject();\n                            });\n                    } else {\n                        /* ESA is already unauth'd (Ex: no-access route).\n                         * Simply do some local cleanup and redirect to the login screen\n                         * Note: This op could have no effect and result in the user landing back on the same page.\n                         * For Example: The no-access page\n                         */\n\n                        const authenticator = Ember.getOwner(this).lookup('authenticator:directory');\n                        if (authenticator) {\n                            authenticator.cleanCustomBrowserStorage();\n                        }\n                        this.trigger('invalidationSucceeded');\n\n                        resolve();\n                    }\n                });\n            }); // end logoutPromise\n\n            this.set(LOGOUT_PROMISE_PROP_NAME, logoutPromise);\n        } // end if (!logoutPromise)\n\n        return logoutPromise;\n    },\n\n    addRemoveBlockers(action, blocker) {\n        let arr = this.get('blockers');\n        if (action === 'add') {\n            arr.pushObject(blocker);\n        }\n        if (action === 'remove') {\n            arr.removeObject(blocker);\n        }\n        this.get('blockers').setObjects(arr.uniq());\n    },\n\n    proxyLogin(orgId, hash) {\n        this.set('proxyLoginInfo', { org: orgId, hash: hash });\n        return this.invalidate({ notified: true }).catch(() => {\n            this.set('proxyLoginInfo', null);\n        });\n    },\n\n    retrieveProxyLoginInfo() {\n        return this.get('proxyLoginInfo');\n    },\n\n    /**\n     * If no critical work is in progress, log out of entire PureCloud suite.\n     *\n     * Kills currently issued auth token and all other tokens issued within the\n     * current auth session.  Also kills RememberMe context (if applicable).\n     *\n     * @returns A rejected promise if critical work is in progress; otherwise, a\n     * \"singleton\" promise that will reject or resolve on eventual completion. The\n     * promise allows burst calls of logout to be debounced until the promise\n     * resolves.\n     *\n     * @see #invalidate() for burst and critical work details\n     */\n    logout() {\n        this.set('singleSignOutInProgress', true);\n        return this.invalidate({ notified: true }).catch(reason => {\n            // Invalidate failed due to active call, interal issue, etc.\n\n            // Clear the SSO boolean for recoverable failure cases\n            this.set('singleSignOutInProgress', false);\n            return Ember.RSVP.reject(reason);\n        });\n    },\n\n    setupStoreData(type, data) {\n        let store = this.get('dataStore');\n        let model = store.modelFor(type);\n        let serializer = store.serializerFor(type);\n        data = serializer.normalizeSingleResponse(store, model, data, data.guid);\n        return store.push(data);\n    },\n\n    /**\n     * Safely checks if a feature flag is enabled, ensuring features are loaded first\n     * @param {string} featureName - The name of the feature flag to check\n     * @returns {boolean} - Whether the feature is enabled\n     */\n    isFeatureEnabled(featureName) {\n        if (!this.get('features')) {\n            return false;\n        }\n        return !!this.get(`features.${featureName}`);\n    },\n\n    establishSession(data, redirect) {\n        let response = data.res;\n\n        if (!_.isEmpty(redirect)) {\n            Ember.run.later(\n                this,\n                function () {\n                    window.location = redirect;\n                },\n                100\n            );\n\n            return;\n        }\n\n        this.setServerTimeOffset();\n        moment.now = () => {\n            const offset = this.get('offset');\n            return +new Date() + offset;\n        };\n\n        this.createFieldConfigs(response.fieldConfigs);\n\n        let person = null;\n        if (response.person && response.person.guid) {\n            person = this.setupStoreData('person', response.person);\n            this.set('person', person);\n        }\n\n        let user = this.setupStoreData('user', response.user);\n\n        this.set('app', response.app);\n        this.set('_rawResponse', response);\n\n        if (response.org && response.org._id) {\n            let org = this.setupStoreData('org', response.org);\n            this.set('org', org);\n            this.get('orgSettings')\n                .fetchOrgSettings(this.get('org.orgSettings'))\n                .then(orgSettings => {\n                    this.set('org.orgSettings', orgSettings);\n                })\n                .catch(error => {\n                    this.logger.error('Error fetching org settings:', error);\n                });\n        }\n\n        const cookieProxyPerson = this.get('cookies').read('proxyPerson');\n        const personId = cookieProxyPerson || user.get('personGuid');\n\n        if (personId && !person) {\n            let store = this.get('dataStore');\n            let shouldReload = store.hasRecordForId('person', personId);\n            let promise = store\n                .find('person', personId)\n                .then(person => {\n                    if (shouldReload) {\n                        person.reload();\n                    }\n\n                    this.set('user', user);\n                    this.set('person', person);\n\n                    // Notify read-write perm handlers\n                    const deferred = this.get('readWritePermissionsDeferred');\n                    if (deferred) {\n                        deferred.resolve(person.get('readWritePermissions'));\n                    }\n\n                    return person;\n                })\n                .finally(() => {\n                    this.set('authInProgress', false);\n                });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n\n        return new Ember.RSVP.Promise(resolve => {\n            this.set('authInProgress', false);\n            if (!Ember.get(user, 'isSuper')) {\n                return resolve(person);\n            }\n            let superPerson = this.get('dataStore').createRecord('person', { id: 'super' });\n\n            this.set('user', user);\n            this.set('person', superPerson);\n\n            return resolve(person);\n        });\n    },\n\n    _reloadApplication: function () {\n        this.get('cookies').clear(this.get('application.cookies.session'));\n\n        var href = window.location.href;\n        var hashIndex = href.indexOf('#');\n        if (hashIndex > -1) {\n            href = href.substring(0, hashIndex);\n        }\n        window.location.replace(href);\n    },\n\n    getFeatures: function (forceUpdate = false) {\n        const featureService = this.get('featureService');\n\n        const localFeatures = [];\n        // filters out the feature toggles that are locally set to `false`\n        Object.entries(featureToggles).forEach(([key, value]) => (value ? localFeatures.push(key) : null));\n\n        return featureService\n            .getFeatureToggles(...localFeatures, forceUpdate)\n            .then(features => {\n                // Sometimes it's nicer to just have a list of all of the enabled features\n                this.set('features', features);\n\n                this.set(\n                    'enabledFeatures',\n                    Object.keys(features).filter(feature => {\n                        return features[feature];\n                    })\n                );\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    this.logger.error('Could not fetch feature toggles:', {\n                        error,\n                        remoteData: {\n                            error: error\n                        }\n                    });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    setServerTimeOffset: Ember.observer('isAuthenticated', 'clock.day', function () {\n        const BASE_URI = 'api/v2/date';\n        const CLIENT_REQUEST_TIME_DIFF = 30000; //30 sec in milliseconds; Represents the acceptable time gap on the client between t3 and t0\n\n        this.get('clock.day'); //force consumption\n\n        if (this.get('isAuthenticated')) {\n            const t0 = moment(new Date());\n            const url = this.get('application').pcV2Uri(BASE_URI);\n            this.get('ajax')\n                .raw(url)\n                .then(response => {\n                    const serverDate = response.response;\n                    const t1 = moment(serverDate.currentDate);\n                    let correlationId = null;\n                    if (response.jqXHR) {\n                        correlationId = response.jqXHR.getResponseHeader('ININ-Correlation-id');\n                    }\n                    // TODO: Pull DATE header from response to get better measure of when the\n                    // response was sent.\n                    const t2 = t1;\n                    const t3 = moment(new Date());\n                    const clientSystemTimeSuspect = t3.diff(t0) >= CLIENT_REQUEST_TIME_DIFF;\n\n                    if (clientSystemTimeSuspect) {\n                        this.set('offset', t2.diff(t3));\n                    } else {\n                        this.set('offset', (t1.diff(t0) + t2.diff(t3)) / 2); //Offset algorithm:  http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_synchronization_algorithm\n                    }\n\n                    this.logger.debug(\n                        `Session timer offset: Server time offset is ${this.get('offset') / 1000} seconds`\n                    );\n                    this.set('sessionTimers', {\n                        serverTimet1: t1.format(),\n                        clientTimet3: t3.format(),\n                        clientTimet0: t0.format(),\n                        offsetCalculated: this.get('offset'),\n                        clientSystemTimeSuspect,\n                        correlationId\n                    });\n                })\n                .catch(err => {\n                    this.logger.debug(\n                        'Session timer offset: An error occured when getting the server time to calculate offset. Using offset 0.',\n                        err\n                    );\n                    this.set('offset', 0);\n                });\n        } else {\n            this.set('offset', 0);\n        }\n    }),\n\n    setupCarrierPigeon() {\n        const subscription = this.get('presenceSubscription');\n        const pigeon = this.get('pigeon');\n        const channelId = this.get('accessToken');\n        const subscribeUrl = this.get('application').pcUri(`api/v2/notifications/channels/${channelId}/subscriptions`);\n        pigeon.initialize({\n            // Use public-api v2 and the access token as the channel id until realtime can use real channels\n            subscribeUrl,\n            features: this.get('features'),\n            publicApiUser: this.get('publicApiUser'),\n            accessToken: channelId\n        });\n\n        // application service will tell pigeon to register topics after streaming service is connected\n\n        if (isTesting) return Ember.RSVP.resolve();\n        subscription.subscribeToMyself();\n    },\n\n    /**\n     * Updates the session with public api used for things such as Download.\n     * A valid session establishment will set a cookie used for auth on certain routes.\n     */\n    updateAppSession() {\n        const url = this.get('application').pcV2Uri(['api/v2/apps/session']);\n        return this.get('ajax')\n            .post(url, {\n                xhrFields: {\n                    withCredentials: true\n                },\n                headers: {\n                    Authorization: `bearer ${this.get('accessToken')}`\n                }\n            })\n            .catch(reason => {\n                this.logger.error('Failed to obtain Apps Session', { error: reason });\n\n                // This request is allowed to fail since its only required for embeds\n                // We shouldnt break the app for that...\n                return Ember.RSVP.resolve();\n            });\n    },\n\n    refreshPublicApiUser(expand) {\n        const url = this.get('application').pcV2Uri('api/v2/users/me');\n        const options = {};\n\n        let baseExpands = [\n            'authorization',\n            'conversationSummary',\n            //'date'\n            'fieldconfigs',\n            'geolocation',\n            //'geolocationsettings'\n            //'locations'\n            'dateLastLogin',\n            'organization',\n            'outOfOffice',\n            'presence',\n            //'presencedefinitions'\n            //'profileSkills'\n            'routingStatus',\n            'station',\n            'token'\n        ];\n\n        //make a unique request during session initialization\n        if (!this.get('isAuthenticated')) {\n            if (this.get('publicApiUser')) {\n                return this.get('publicApiUser');\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        } else {\n            if (expand) {\n                options.data = {\n                    expand: _.uniq(baseExpands.concat(expand)).join(',')\n                };\n            } else {\n                options.data = {\n                    expand: baseExpands.join(',')\n                };\n            }\n        }\n\n        return this.get('ajax')\n            .request(url, options)\n            .then(data => {\n                this.set('publicApiUser', data);\n                return data;\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    Ember.Logger.warn('Failed to fetch purecloud user in session:', { error });\n                }\n                return Ember.RSVP.reject(error);\n            });\n    },\n\n    resetPassword(type, email, newPassword, resetToken, currentPassword) {\n        Ember.assert('Please specify `set` or `change` as reset type', type);\n\n        if (type === 'set') {\n            Ember.assert('Please specify reset token to set password', resetToken);\n        }\n\n        let url;\n        let data;\n\n        if (type === 'change') {\n            Ember.assert('Please provide the current password', currentPassword);\n\n            url = this.get('application').pcV2Uri('api/v2/users/me/password');\n            data = {\n                oldPassword: currentPassword,\n                newPassword: newPassword\n            };\n        } else if (type === 'set') {\n            url = this.get('application').uri('api/v1/setPassword');\n            data = {\n                email: email,\n                password: newPassword,\n                verifyPassword: newPassword,\n                resetToken: resetToken\n            };\n        }\n\n        return this.get('ajax').post(url, { data });\n    },\n\n    publicApiUserObserver: Ember.observer('publicApiUser', function () {\n        const user = this.get('publicApiUser');\n        const version = this.get('application.semver');\n\n        if (user && user.id) {\n            setCustomAttribute('User Id', user.id);\n        }\n        if (user && user.organization && user.organization.id) {\n            setCustomAttribute('Organization Id', user.organization.id);\n        }\n        if (user && user.organization && user.organization.name) {\n            setCustomAttribute('Organization', user.organization.name);\n        }\n        if (version) {\n            setCustomAttribute('App Version', version);\n        }\n    }),\n\n    // Forward ESA Events from internal session to this session service\n    _setupSessionInvalidationFailed: Ember.on('init', function () {\n        const session = this.get('session');\n        if (session) {\n            session.on('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    }),\n\n    _forwardSessionInvalidationFailedEvent() {\n        this.trigger('sessionInvalidationFailed', ...arguments);\n    },\n\n    _teardownSessionInvalidationFailed: Ember.on('willDestroy', function () {\n        const session = this.get('session');\n        if (session) {\n            session.off('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    })\n});\n","import Ember from 'ember';\nimport BrowserUtils from 'ember-purecloud-components/utils/browser';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\nimport { getThemeList } from '../utils/theme-loader';\n\nconst { computed, inject, run, Service, Evented } = Ember;\n\nexport default Service.extend(Evented, LoggerMixin, {\n    intl: inject.service(),\n    phone: inject.service(),\n    session: inject.service(),\n    application: inject.service(),\n    permissions: inject.service(),\n    ajax: inject.service(),\n\n    _isDesktop: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        return context && context.isHosted();\n    }),\n\n    _isDesktopUnifiedPreferences: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        if (context) {\n            return context.isHosted() && context.supportsUnifiedPreferences();\n        }\n\n        return false;\n    }),\n\n    canShowChatPreference: computed.not('session.user.isTrustee'),\n    canShowAgentGreeting: computed.bool('session.features.ACT-1205'),\n    canShowGeneralPreference: computed.alias('_isDesktop'),\n    canShowPasswordPreference: computed('session.isAuthenticated', 'session.user.isTrustee', function () {\n        if (this.get('session.user.isTrustee')) {\n            return false;\n        }\n\n        return this.get('session.isAuthenticated');\n    }),\n\n    canShowNotificationsPreference: computed('_isDesktop', '_isDesktopUnifiedPreferences', function () {\n        if (BrowserUtils.isIE) {\n            return false;\n        }\n\n        const isDesktop = this.get('_isDesktop');\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n        return !(isDesktop && !isUnified);\n    }),\n\n    canShowVoiceMailPinPreference: computed.and('permissions.hasVoicemailAccess', 'permissions.phoneEnabled'),\n\n    canShowDirectRoutingPreference: computed.alias('directRouting.canViewOwnSettings'),\n\n    _commonPreferenceComponents: computed('_isDesktopUnifiedPreferences', function () {\n        const isUnified = this.get('_isDesktopUnifiedPreferences');\n\n        return {\n            chat: 'preferences-chat',\n            general: 'preferences-general',\n            language: 'preferences-language',\n            notifications: isUnified ? 'preferences-notifications-desktop' : 'preferences-notifications',\n            password: 'change-password',\n            pin: 'change-pin',\n            sound: 'application-preferences/preferences-sound',\n            theme: 'application-preferences/theme-picker',\n            video: 'preferences-video',\n            direct_routing: 'preferences-direct-routing',\n            agent_greeting: 'agent-greeting'\n        };\n    }),\n\n    commonPreferences: computed(\n        'intl.isoLocale',\n        'canShowChatPreference',\n        'canShowGeneralPreference',\n        'canShowNotificationsPreference',\n        'canShowPasswordPreference',\n        'canShowSoundPreference',\n        'canShowVoiceMailPinPreference',\n        '_commonPreferenceComponents',\n        'session.features.webUiDarkTheme',\n        'canShowAgentGreeting',\n        function () {\n            const intl = this.get('intl');\n            const components = this.get('_commonPreferenceComponents');\n            return [\n                {\n                    key: 'chat',\n                    name: intl.lookup('preferences.tabs.chat'),\n                    canShow: this.get('canShowChatPreference'),\n                    component: components.chat\n                },\n                {\n                    key: 'general',\n                    name: intl.lookup('preferences.tabs.general'),\n                    canShow: this.get('canShowGeneralPreference'),\n                    component: components.general\n                },\n                {\n                    key: 'language',\n                    name: intl.lookup('preferences.tabs.language'),\n                    canShow: true,\n                    component: components.language\n                },\n                {\n                    key: 'notifications',\n                    name: intl.lookup('preferences.tabs.notifications'),\n                    canShow: this.get('canShowNotificationsPreference'),\n                    component: components.notifications\n                },\n                {\n                    key: 'password',\n                    name: intl.lookup('preferences.tabs.password'),\n                    canShow: this.get('canShowPasswordPreference'),\n                    component: components.password\n                },\n                {\n                    key: 'pin',\n                    name: intl.lookup('preferences.tabs.pin'),\n                    canShow: this.get('canShowVoiceMailPinPreference'),\n                    component: components.pin\n                },\n                {\n                    key: 'sound',\n                    name: intl.lookup('preferences.tabs.sound'),\n                    canShow: true,\n                    component: components.sound\n                },\n                {\n                    key: 'theme',\n                    name: intl.lookup('preferences.tabs.theme'),\n                    canShow: getThemeList(this.get('session')).length > 1,\n                    component: components.theme\n                },\n                {\n                    key: 'video',\n                    name: intl.lookup('preferences.tabs.video'),\n                    canShow: true,\n                    component: components.video\n                },\n                {\n                    key: 'direct_routing',\n                    name: intl.lookup('preferences.tabs.direct-routing'),\n                    canShow: this.get('canShowDirectRoutingPreference'),\n                    component: components.direct_routing\n                },\n                {\n                    key: 'agent_greeting',\n                    name: intl.lookup('preferences.tabs.agent-greeting'),\n                    canShow: this.get('canShowAgentGreeting'),\n                    component: components.agent_greeting\n                }\n            ];\n        }\n    ),\n\n    commonPreferencesSortOrder: computed(function () {\n        return [\n            'notifications',\n            'general',\n            'theme',\n            'chat',\n            'password',\n            'pin',\n            'language',\n            'sound',\n            'video',\n            'direct_routing',\n            'agent_greeting'\n        ];\n    }),\n\n    customPreferences: [],\n\n    preferences: computed('commonPreferences', 'customPreferences', function () {\n        const commonPreferences = this.get('commonPreferences');\n        const customPreferences = this.get('customPreferences');\n        return [...commonPreferences, ...customPreferences];\n    }),\n\n    // <Custom Preference API>\n    addPreference(key, options) {\n        const { name, component } = options;\n        if (!(key && name && component)) {\n            throw new Error('Custom preferences require a key, name, and component name');\n        }\n        const existingPreference = this.get('preferences').find(preference => preference.key === key);\n        if (existingPreference) {\n            throw new Error(`Preference with key \"${key}\" already exists`);\n        }\n        const canShow = true; // otherwise remove the preference\n        const newPreference = { key, name, component, canShow };\n        this.set('customPreferences', this.get('customPreferences').concat(newPreference));\n    },\n\n    removePreference(key) {\n        const customPreferences = this.get('customPreferences');\n        const otherPreferences = customPreferences.filter(preference => preference.key !== key);\n        this.set('customPreferences', otherPreferences);\n    },\n    // </Custom Preference API>\n\n    // <Global Preferences API>\n    isOpen: false,\n\n    open() {\n        this.set('isOpen', true);\n    },\n\n    close() {\n        this.set('isOpen', false);\n    },\n\n    canOpenPreference(preferenceKey) {\n        const preferences = this.get('preferences');\n        const preference = preferences.find(preference => preference.key === preferenceKey);\n        return preference && preference.canShow;\n    },\n\n    openPreference(preferenceKey) {\n        return new Ember.RSVP.Promise(resolve => {\n            const preferences = this.get('preferences');\n            const preference = preferences.find(preference => preference.key === preferenceKey);\n            if (!preference) {\n                throw new Error(`\"${preference}\" is not a valid preference name`);\n            }\n            if (!preference.canShow) {\n                throw new Error(`Preference \"${preference}\" cannot be shown`);\n            }\n            this.open();\n            run.later(() => {\n                // this delay lets the listening components open first\n                this.trigger('openPreference', preferenceKey);\n                resolve();\n            }, 100);\n        });\n    },\n\n    // common preferences access\n    openChatPreference() {\n        this.openPreference('chat');\n    },\n\n    openGeneralPreference() {\n        this.openPreference('general');\n    },\n\n    openLanguagePreference() {\n        this.openPreference('language');\n    },\n\n    openNotificationsPreference() {\n        this.openPreference('notifications');\n    },\n\n    openPasswordPreference() {\n        this.openPreference('password');\n    },\n\n    openSoundPreference() {\n        this.openPreference('sound');\n    },\n    openVideoPreference() {\n        this.openPreference('video');\n    },\n\n    openVoiceMailPinPreference() {\n        this.openPreference('pin');\n    },\n    // </Global Preferences API>\n\n    /**\n     * Gets the current value for the user's send email notifications\n     * @returns sendEmailNotifications @boolean\n     */\n    async getUserVoicemailEmailNotification() {\n        const url = this.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        try {\n            const { sendEmailNotifications } = await this.get('ajax').ajaxGet(url, { dataType: 'json' });\n            return sendEmailNotifications;\n        } catch (err) {\n            this.get('logger').error(`services/settings: error fetching user's voicemail policy`, {\n                err\n            });\n        }\n        return false;\n    },\n    /**\n     * Sets the user's send email notification value in the voicemail policy.\n     * @param {boolean} sendEmailNotifications\n     * @returns Promise\n     */\n    async setUserVoicemailEmailNotification(sendEmailNotifications) {\n        const url = this.get('application').pcV2Uri(`api/v2/voicemail/me/policy`);\n        return this.get('ajax').patch(url, {\n            data: {\n                sendEmailNotifications\n            },\n            timeout: 5000\n        });\n    }\n});\n","define(\"connections-ui/services/sound\", [\"exports\", \"ember-purecloud-components/services/sound\"], function (_exports, _sound) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sound.default;\n    }\n  });\n});\n","/* eslint no-console: \"off\" */\n\n/**\n * Welcome to the stash-logger service. This service is responsible for logging data locally to your console as well\n * as gathering logs to send to Sumo. There are a couple rules, though.\n *\n * In order to ensure that customer data does not flow into Sumo, all logging that is intended to leave\n * a customer's machine is opt-in. We will not send any object information up to Sumo unless you wrap it\n * in a specific key.\n *\n * If you tend to log data in the usual manner:\n * [\n *  \"Bunch of descriptive information\",\n *  { ... some data in an object ... }\n * ]\n * What will be sent to Sumo will only be: \"Bunch of descriptive information\"\n *\n * If you wish to send an object of information, you need to use a specific key, \"remoteData\":\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *     data: \"Data\"\n *   }\n *  }\n * ]\n * The data that will be sent will be the string AND everything in the remoteData object.\n *\n * Do you need to send customer data? Really? If so, PLEASE mark it as sensitive. You do this by including that data\n * under the \"sensitive\" key. For example:\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *    data: \"Data\",\n *    sensitive: {\n *     data: \"Data\"\n *    }\n *   }\n *  }\n * ]\n * The sensitive data will be wrapped with GCPII[] in order to be hashed by Sumo hashing rules. Any questions? Reach\n * out to the Web UI team.\n */\n\nimport Ember from 'ember';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport { LOG_LEVELS } from 'ember-purecloud-components/utils/logger';\nimport { v4 as uuid } from 'uuid';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport config from '../config/environment';\nimport moment from '../utils/dates';\nimport ExponentialIntervalGenerator from '../utils/exponential-interval-generator';\nimport { extractRawData } from '../utils/objects';\n\nconst DEBUG = true;\n\nconst TRUNCATED_TRACE_MESSAGE = 'TRUNCATED LOG: ';\nexport const APP_NAME = 'connections-ui-webui';\nconst LOG_INTERVAL = 2000;\nconst MAX_LOG_INTERVAL = 30000;\nconst MAX_LOG_SIZE = 14500;\nconst SERVER_LOG_LEVEL = 'warn';\nconst GLOBAL_ERROR = /Global Error Caught/;\n// strings equality regex by item (string), item.message (item is object) or JSON.stringify(item) (item is object)\n// or by matcher function\n// i.e.,\n// 'someLog' will filter 'someLog' or { message: 'someLog' }. Will not filter 'someLog with more info'.\n// /someLog.*/ will filter 'someLog', 'someLog with more info', or { message: 'someLog with info' }\n// (item) => item && item.status === 0 && item.statusText === 'error' will filter { status: \"0\", statusText: 'error' } regardless of property order\n// DO NOT USE STATEFUL REGEXES - no /g flag\nconst SILENCED_ERRORS = [\n    /TransitionAborted/,\n    /Request Cancelled/,\n    /Request cancelled/, // PCUI-132\n    /Undefined intl key/,\n    /Error encountered while ensuring trace data is clean/, // PCM-1574\n    /ResizeObserver loop limit exceeded/,\n\n    /safeScroll/,\n    /_scrollToBottom called before DOM insertion/,\n    /The ajax operation was aborted/, // PCUI-131\n    /SEARCHPANE: Search Failed:/, // PCUI-132\n    /Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node./, // https://github.com/yapplabs/ember-tether/issues/35\n    /Uncaught Error: only one instance of babel-polyfill is allowed/,\n    /Error getting timeOffRequests/, // PCUI-135\n    /Failed to fetch time off requests:/, // PCUI-135\n    /Script error\\./, // PCUI-138\n    /^TimeoutPromise.*/, // PCUI-133\n    /You do not belong to any management unit/,\n    /supervisorassistance/, // PCUI-134\n    /Request was rejected because user is not permitted to perform/, // PCUI-137\n    item => item && item.status === '0' && (item.statusText === 'error' || item.statusText === 'abort'), // PCUI-136\n    item => isAbortError(item), // PCUI-136\n    (item, all, isLocal) => all.length > 1 && all[0] === 'Failed to obtain Apps Session' && isLocal\n];\n\n// http://stackoverflow.com/questions/5515869/string-length-in-bytes-in-javascript\nconst lengthInUtf8Bytes = function (str) {\n    // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.\n    const m = encodeURIComponent(str).match(/%[89ABab]/g);\n    return str.length + (m ? m.length : 0);\n};\n\nexport default Ember.Service.extend({\n    MAX_INTERNAL_LOG_ITEMS: 1000,\n    internalLogs: [],\n\n    logCounts: null,\n    failureCount: 0,\n\n    _originalLogger: Ember.Logger,\n    application: Ember.inject.service(),\n    session: Ember.inject.service(),\n    conversation: Ember.inject.service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('exponentialBackoff', new ExponentialIntervalGenerator(LOG_INTERVAL, MAX_LOG_INTERVAL));\n        this.set('logs', []);\n        this.set('logCounts', {});\n        this.set('clientSessionId', uuid());\n        LOG_LEVELS.forEach(level => this.set(`logCounts.${level}`, 0));\n        this.bindLogMethods();\n        this.resetLogLimit();\n    },\n\n    loggingOptions: Ember.computed('session.org.orgPreferences.loggerOptions', function () {\n        let items = [\n            {\n                topic: 'service:webrtc',\n                serverLevel: 'info',\n                localLevel: 'debug'\n            },\n            {\n                topic: 'webrtc',\n                serverLevel: 'info',\n                localLevel: 'debug'\n            },\n            {\n                regex: 'RtcSession Log', // OPTIONAL if topic is provided.\n                propertyToMatch: 'kind', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n                localLevel: 'debug'\n            },\n            {\n                regex: 'webrtc',\n                localLevel: 'debug'\n            },\n            {\n                regex: /^Running\\sin\\smedia\\shelper\\smode$/,\n                serverLevel: 'info',\n                localLevel: 'info'\n            },\n            {\n                regex: /^SERVOPS-33410/,\n                serverLevel: 'debug',\n                localLevel: 'debug'\n            }\n\n            // EXAMPLE:\n            // {\n            //     topic: 'service:webrtc',    // OPTIONAL\n            //     regex: 'RECORDINGS',   // OPTIONAL if topic is provided. If adding through orgPrefs, use a simple string without the surrounding slashes.\n            //     propertyToMatch: 'message', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n            //     serverLevel: 'info',\n            //     localLevel: 'debug'\n            // }\n        ];\n\n        const options = this.get('session.org.orgPreferences.loggerOptions');\n        if (options && options.length) {\n            items = items.concat(options);\n        }\n\n        items.forEach(item => {\n            if (typeof item.regex === 'string') {\n                item.regex = new RegExp(item.regex);\n            }\n        });\n\n        return items;\n    }),\n\n    bindLogMethods() {\n        LOG_LEVELS.forEach(level => {\n            this[level] = this.bufferLog.bind(this, level, 'logger:general');\n        });\n    },\n\n    getOriginalLogger() {\n        return this._originalLogger;\n    },\n\n    // Scope is the object that JSON.stringify is turning into a string.\n    restrictedTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (isAjaxError(item)) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    fullTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (item instanceof Error) {\n            const application = this.get('application');\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                errors: item.errors,\n                payload: item.payload,\n                currentRoute: application.get('currentRouteName'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    createTrace(level, topic, logItem) {\n        if (logItem === null || logItem === undefined) {\n            throw new Error('You must log a value and/or context; attempted to log null or undefined');\n        }\n\n        // try default json stringify, if it fails, log the error\n        let itemToLog = logItem;\n        try {\n            JSON.stringify(logItem);\n        } catch (err) {\n            itemToLog = err;\n        }\n\n        const type = typeof itemToLog;\n        const isError = type === 'object' && itemToLog instanceof Error;\n        if (!isError && (type === 'array' || type === 'object')) {\n            try {\n                itemToLog = this._restrictTraceData(itemToLog);\n\n                // After stripped, we want readable client logs so when they are exported\n                // by the customer, we can accurately read them\n                this._originalLogger[level].call(\n                    this._originalLogger,\n                    JSON.stringify(logItem, this.fullTypeConverter.bind(this))\n                );\n            } catch (error) {\n                this._originalLogger[level].call(this._originalLogger, 'Error parsing log item', {\n                    error,\n                    itemToLog\n                });\n                itemToLog = ['Error encountered while ensuring trace data is clean', error.message];\n            }\n        } else if (!isError) {\n            this._originalLogger[level].call(this._originalLogger, 'Log item in bad format', {\n                itemToLog\n            });\n            itemToLog = ['Log item was not in the expected data format'];\n        } else {\n            // Errors should be parsed out by the typeConverter later\n            itemToLog = { error: logItem };\n        }\n\n        const clientTime = moment().toISOString();\n        let message;\n        try {\n            message = JSON.stringify(\n                {\n                    clientTime,\n                    log: itemToLog,\n                    clientSessionId: this.get('clientSessionId')\n                },\n                this.restrictedTypeConverter.bind(this)\n            );\n        } catch (err) {\n            message = `Error serializing log data: ${err.message}`;\n            level = 'error';\n        }\n\n        return {\n            topic: `${APP_NAME}.${topic}`,\n            level: level.toUpperCase(),\n            time: clientTime,\n            message\n        };\n    },\n\n    /**\n     * Restrict log data to format that will ensure customer data is only sent when the\n     * consumer has opted-in\n     * @param {Array} itemToLog - an array with a string description as the first element and an object of data as the second\n     * @throws\n     * @returns a restricted version of itemToLog array\n     */\n    _restrictTraceData(itemToLog) {\n        const remoteDataKey = 'remoteData';\n        if (\n            typeof itemToLog === 'string' ||\n            typeof itemToLog === 'number' ||\n            (Array.isArray(itemToLog) && itemToLog.length === 0)\n        ) {\n            return itemToLog;\n        }\n        if (!Array.isArray(itemToLog) || typeof itemToLog[0] !== 'string') {\n            throw new Error('Log data was in an unexpected format');\n        }\n        try {\n            // First we remove everything except for our blessed data\n            let allowedKeys = [remoteDataKey, 'activeConversations'];\n            let [message, data, conversationIds] = itemToLog;\n\n            // Just a plain message, e.g. logger.error(\"Got an error\")\n            if (!data) {\n                return [message];\n            }\n\n            // The usual message, e.g. logger.error(\"Got an error\", { ... data ... })\n            // Filter out everything that is not under the remoteDataKey\n            let keyFilter = (path, key) => {\n                return allowedKeys.includes(key) || allowedKeys.includes(path[0]);\n            };\n\n            data = extractRawData(data, {\n                maxDepth: 5,\n                keyFilter\n            });\n\n            if (typeof conversationIds !== 'object' || Array.isArray(conversationIds)) {\n                conversationIds = {};\n            }\n\n            // Check the rest of the data, it might contain conversation ids\n            // but we filter out EVERYTHING else\n            conversationIds = extractRawData(conversationIds, {\n                maxDepth: 2,\n                keyFilter\n            });\n\n            if (data[remoteDataKey]) {\n                data[remoteDataKey] = this._augmentSensitiveData(data[remoteDataKey]);\n            }\n\n            let finalLogItem = [message, data, conversationIds].filter(elem => {\n                // Strings, arrays\n                if (Object.prototype.hasOwnProperty.call(elem, 'length')) {\n                    return elem.length > 0;\n                }\n                return Object.keys(elem).length > 0;\n            });\n\n            return finalLogItem;\n        } catch (error) {\n            throw error;\n        }\n    },\n\n    _augmentSensitiveData(remoteData) {\n        if (!remoteData) {\n            return;\n        }\n        if (!remoteData.sensitive) {\n            return remoteData;\n        }\n        let sensitive = remoteData.sensitive;\n        let wrappedSensitive;\n        if (typeof sensitive !== 'object') {\n            wrappedSensitive = `GCPII[${sensitive.toString()}]`;\n        } else {\n            wrappedSensitive = Object.keys(sensitive).reduce((data, key) => {\n                let value = { [key]: `GCPII[${sensitive[key]}]` };\n                return Object.assign(data, value);\n            }, {});\n        }\n        return Object.assign({}, remoteData, {\n            sensitive: wrappedSensitive\n        });\n    },\n\n    checkItemsAgainstOptions(logOption, level, topic, itemsToLog) {\n        const defaultAnswer = {\n            server: false,\n            local: false\n        };\n\n        if (logOption.topic && topic && logOption.topic !== topic) {\n            return defaultAnswer;\n        }\n\n        if (logOption.regex) {\n            let matches;\n            if (logOption.propertyToMatch) {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        typeof item[logOption.propertyToMatch] === 'string' &&\n                        item[logOption.propertyToMatch].match(logOption.regex)\n                );\n            } else {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        ((typeof item === 'string' && item.match(logOption.regex)) ||\n                            (typeof item.message === 'string' && item.message.match(logOption.regex)))\n                );\n            }\n\n            if (!matches) {\n                return defaultAnswer;\n            }\n        }\n\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        return {\n            server: logOption.serverLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.serverLevel.toLowerCase()),\n            local: logOption.localLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.localLevel.toLowerCase())\n        };\n    },\n\n    bufferLog(level, topic, ...itemsToLog) {\n        let logResult = { server: false, local: false };\n        const isLocal = this.get('application.runtime.local');\n\n        if (itemsToLog && itemsToLog.length > 0) {\n            for (let j = 0; j < itemsToLog.length; j++) {\n                const item = itemsToLog[j];\n                if (typeof item === 'undefined' || item === null || item === '') {\n                    if (isLocal && DEBUG) {\n                        console.debug(\n                            new Error('Local Only Error: Undefined error reported to stash logger'),\n                            itemsToLog\n                        );\n                    }\n                    return;\n                }\n\n                let checkForSilence;\n                if (typeof item === 'string') {\n                    checkForSilence = item;\n                }\n                if (!checkForSilence) {\n                    try {\n                        checkForSilence = JSON.stringify(item);\n                    } catch (err) {\n                        checkForSilence = `Error serializing log data: ${err.message}`;\n                    }\n                }\n\n                // expose global errors\n                if (GLOBAL_ERROR.test(checkForSilence)) {\n                    console.error(item);\n                    return;\n                }\n\n                if (!DEBUG && (level === 'debug' || level === 'info')) {\n                    return;\n                }\n\n                for (let i = 0; i < SILENCED_ERRORS.length; i++) {\n                    const SILENCED = SILENCED_ERRORS[i];\n                    const silencedByStringMatch = typeof SILENCED === 'string' && checkForSilence === SILENCED;\n                    const silencedByRegex = typeof SILENCED.test === 'function' && SILENCED.test(checkForSilence);\n                    let silencedByMatcher;\n                    try {\n                        silencedByMatcher = typeof SILENCED === 'function' && SILENCED(item, itemsToLog, isLocal);\n                    } catch (e) {\n                        silencedByMatcher = false;\n                    }\n                    if (silencedByStringMatch || silencedByRegex || silencedByMatcher) {\n                        if (isLocal && DEBUG) {\n                            console.debug('local-only error', itemsToLog[j]);\n                        }\n                        return logResult;\n                    }\n                }\n            }\n        }\n        const serverLogLevelIndex = LOG_LEVELS.indexOf(SERVER_LOG_LEVEL.toLowerCase());\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        const options = this.get('loggingOptions');\n        let logServer = itemLogIndex >= serverLogLevelIndex;\n        let logLocal = false;\n        for (let i = 0; i < options.length; i++) {\n            logResult = this.checkItemsAgainstOptions(options[i], level, topic, itemsToLog);\n\n            logServer = logServer || logResult.server;\n            logLocal = logLocal || logResult.local;\n\n            if (logServer && logLocal) {\n                break;\n            }\n        }\n\n        let skipSumoSend;\n\n        if (level === 'error') {\n            skipSumoSend = false;\n            const activeConversations = this.get('conversation.activeConversations') || [];\n            itemsToLog.push({ activeConversations: activeConversations.map(c => c.get('id')) });\n        }\n\n        if (logServer && !skipSumoSend) {\n            const trace = this.createTrace.call(this, level, topic, itemsToLog);\n            this.get('logs').pushObject(trace);\n        }\n\n        if (logLocal || level.toLowerCase() === 'error') {\n            this.get('internalLogs').pushObject({ topic, level, itemsToLog: itemsToLog, time: moment().toISOString() });\n\n            if (this.get('internalLogs.length') > this.MAX_INTERNAL_LOG_ITEMS) {\n                this.get('internalLogs').shiftObject();\n            }\n        }\n\n        this.get('logCounts')[level]++;\n        this._originalLogger[level].apply(this._originalLogger, itemsToLog);\n\n        return { local: logLocal, server: logServer };\n    },\n\n    decreaseLogLimit(currentLimit) {\n        this.maxTracesByteLength = currentLimit - 500;\n    },\n\n    resetLogLimit() {\n        this.maxTracesByteLength = MAX_LOG_SIZE;\n    },\n\n    getTracesToLog(logs) {\n        let toLog = [];\n        let totalLogSize = 0;\n        for (let i = 0; i < logs.length; i++) {\n            const log = logs[i];\n            let logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            if (toLog.length === 0 && logSize > this.maxTracesByteLength) {\n                // single log is too big to log\n                // slice it to 90% of the max (allow room for json chars)\n                log.message = (TRUNCATED_TRACE_MESSAGE + log.message).slice(\n                    0,\n                    Math.floor(0.9 * (this.maxTracesByteLength - TRUNCATED_TRACE_MESSAGE.length))\n                );\n                logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            }\n            if (totalLogSize + logSize < this.maxTracesByteLength) {\n                toLog.push(log);\n                totalLogSize += logSize;\n            } else {\n                break; // break out, log the rest on next run\n            }\n        }\n        return toLog;\n    },\n\n    saveLogs: Ember.observer('logs.[]', 'backOffTask.isRunning', 'session.isAuthenticated', function () {\n        this.get('_saveLogsTask').perform();\n    }),\n\n    _saveLogsTask: task(function* () {\n        const logs = this.get('logs');\n        if (logs.length <= 0 || this.get('backOffTask.isRunning') || !this.get('session.isAuthenticated')) {\n            return;\n        }\n        const toSend = this.getTracesToLog.call(this, logs);\n        logs.removeObjects(toSend);\n        yield timeout(LOG_INTERVAL);\n        this.sendLogTraces(toSend)\n            .then(() => {\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                logs.addObjects(toSend);\n                if (error.status === 413) {\n                    this.decreaseLogLimit(toSend.length);\n                    this._originalLogger.error(\n                        `# of logs to send limited due to server size limit. Last sent size of <= ${this.maxTracesByteLength}.`\n                    );\n                } else if (error.status === 400) {\n                    this._originalLogger.error('Failed to log traces', error);\n                    if (this.get('failureCount') === 0) {\n                        logs.removeObjects(toSend);\n                        this.incrementProperty('failureCount');\n                    } else {\n                        logs.clear();\n                    }\n                } else {\n                    this._originalLogger.error('Failed to log traces', error);\n                    this.get('exponentialBackoff').fail();\n\n                    // ACE-1903: Dump logs if we fail to send on expo. backup to avoid them\n                    // potentially backing up continuously.\n                    logs.clear();\n                }\n            })\n            .finally(() => {\n                this.get('backOffTask').perform();\n            });\n    })\n        .keepLatest()\n        .maxConcurrency(1), // comment below\n    // if this gets called more than once while its currently executing,\n    // it will cancel earlier calls that haven't started yet and just keep the latest\n\n    backOffTask: task(function* () {\n        yield timeout(this.get('exponentialBackoff').getInterval());\n    }),\n\n    immediateSaveLogs() {\n        const logs = this.get('logs');\n        const toSend = this.getTracesToLog.call(this, logs);\n        return this.sendLogTraces(toSend)\n            .then(() => {\n                logs.removeObjects(toSend);\n\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                // If the immediate send doesn't work, we do not remove the logs and they will\n                // be processed by the usual task\n                this._originalLogger.warn('STASH-LOGGER: immediateSaveLogs error', {\n                    error\n                });\n            });\n    },\n\n    sendLogTraces(traces) {\n        if (isTesting) return Ember.RSVP.resolve();\n\n        // this._originalLogger.log('STASH-LOGGER: sendLogTraces', traces, this);\n        const data = JSON.stringify({\n            app: {\n                appId: 'connections-ui-webui',\n                appVersion: config.APP.semver\n            },\n            traces: traces\n        });\n\n        //Do not log traces when running locally\n        if (this.get('application.runtime.local')) {\n            return Ember.RSVP.resolve();\n        }\n\n        const request = {\n            url: this.get('session.application').pcV2Uri('api/v2/diagnostics/trace'),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'text',\n            data,\n            cache: false,\n            context: this\n        };\n        return Ember.RSVP.cast($.ajax(request), 'applicationService#sendLogTraces');\n    },\n\n    _resetLogsOnSuccessfulSave() {\n        this.set('failureCount', 0);\n        this.resetLogLimit();\n        this.get('exponentialBackoff').reset();\n    }\n});\n","import Ember from 'ember';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\n\nimport ApplicationAdapter from '../adapters/application';\nimport PromiseArray from '../utils/promise-array';\n\nimport GroupStoreMixin from '../group/store-mixin';\nimport SearchStoreMixin from '../search/store-mixin';\n\nimport { FL } from '../utils/entity-fields';\n\n/* Batch entity ids into lists of 50. */\nexport function batchEntityIds(ids, size = 50) {\n    ids = _.clone(ids);\n\n    const guids = ids.filter(id => id.indexOf('@') === -1);\n    const jids = ids.filter(id => id.indexOf('@') > -1);\n\n    var batches = [];\n\n    while (guids.length > 0) {\n        batches.push(guids.splice(0, size));\n    }\n    while (jids.length > 0) {\n        batches.push(jids.splice(0, size));\n    }\n\n    return batches;\n}\n\nfunction updateGroup(group, data) {\n    const updateKeys = ['contactInfo', 'general', 'privacy'];\n    if (data.attributes) {\n        updateKeys.forEach(key => {\n            if (data.attributes[key] !== undefined) {\n                group.set(key, data.attributes[key], { overwrite: true });\n            }\n        });\n    }\n}\n\nvar ApplicationStore = DS.Store.extend(GroupStoreMixin, SearchStoreMixin, {\n    session: Ember.inject.service(),\n\n    adapter: ApplicationAdapter,\n\n    applicationAdapter() {\n        return Ember.getOwner(this).lookup('adapter:application');\n    },\n\n    findQuery(type, query) {\n        var store = this;\n        var promiseLabel = 'ApplicationStore#_findQuery for: ' + type;\n        var adapter = this.adapterFor(type);\n\n        Ember.assert('You tried to load a query but you have no adapter (for ' + type + ')', adapter);\n        Ember.assert(\n            'You tried to load a query but your adapter does not implement `findQuery`',\n            typeof adapter.findQuery === 'function'\n        );\n\n        var result = adapter.query(store, type, query);\n\n        var promise = Ember.RSVP.Promise.cast(result, promiseLabel).then(\n            function (payload) {\n                var collection = [];\n                if (payload.res) {\n                    _.forEach(payload.res, function (entity) {\n                        const id = entity.guid || entity._id;\n                        if (id) {\n                            entity.id = id;\n                            collection.push(store.push(type, entity, true));\n                        }\n                    });\n                } else {\n                    // if no payload.res then we are not dealing with the application adapter,\n                    // but we still want to keep the result in case we are using a fixture adapter\n                    _.forEach(payload, function (item) {\n                        collection.push(store.push(type, item, true));\n                    });\n                }\n                return {\n                    collection: collection,\n                    payload: payload\n                };\n            },\n            null,\n            'ApplicationStore#_findQuery: Extract payload from findQuery'\n        );\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findMultiEntity(params, requestType) {\n        let store = this;\n        let promiseLabel = 'ApplicationStore#findMultiEntity';\n        let adapter = this.applicationAdapter();\n        let serializer = this.serializerFor('application');\n\n        let result = adapter.findMultiEntity(store, params, requestType);\n\n        let promise = Ember.RSVP.Promise.cast(result, promiseLabel).then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(store, null, payload, null, requestType || 'query');\n                if (!payload.data && payload.included) {\n                    payload.data = payload.included;\n                    payload.included = [];\n                }\n\n                let records = store.push(payload);\n                Ember.set(records, 'meta', payload.meta);\n                return records;\n            },\n            null,\n            'ApplicationStore#findMultiEntity: Extract payload from multi-entity search'\n        );\n\n        return DS.PromiseArray.create({\n            promise: promise,\n            meta: Ember.computed.reads('content.meta')\n        });\n    },\n\n    findFavorites() {\n        return this.findFavoritesPublicApiV2().then(result => {\n            addPageAction('conn-ui-fav-load', {\n                'conn-ui-fav-nb': result ? result.length : 0\n            });\n            return result;\n        });\n    },\n\n    findFavoritesPublicApiV2() {\n        const promiseLabel = 'Store: Application#findFavoritesPublicApiV2';\n        const adapter = this.adapterFor('application');\n        const result = adapter.findFavorites(this);\n        const promise = Ember.RSVP.Promise.resolve(result, promiseLabel).then(res => {\n            const promises = [];\n            const personResult = res.filter(item => item.entityType === 'person');\n            if (personResult.length) {\n                promises.push(this.findMany('person', Ember.A(personResult).mapBy('entityId'), FL['person']));\n            }\n            const groupResult = res.filter(item => item.entityType === 'group');\n            if (groupResult.length) {\n                promises.push(this.findMany('group', Ember.A(groupResult).mapBy('entityId'), FL['group']));\n            }\n            if (promises.length) {\n                return Ember.RSVP.Promise.all(promises).then(function (favorites) {\n                    return {\n                        payload: res,\n                        collection: favorites.flat()\n                    };\n                });\n            } else {\n                return {\n                    payload: res,\n                    collection: []\n                };\n            }\n        });\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    forwardVoicemail(voicemail, recipient, type) {\n        const adapter = this.adapterFor(voicemail.type);\n        return adapter.forwardVoicemail(voicemail.id, recipient.get('guid'), type);\n    },\n\n    findSuperiors(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const promise = Ember.RSVP.cast(adapter.findSuperiors(type, id, params)).then(payload => {\n            payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n            const records = store.push(payload);\n            return records || [];\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findDirectReports(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        return new Ember.RSVP.Promise(resolve => {\n            adapter.findDirectReports(type, id, params).then(payload => {\n                payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                const records = store.push(payload);\n                resolve(records);\n            });\n        });\n    },\n\n    findLatestCalls(type, ids) {\n        return this.query(type, {\n            latestCalls: true,\n            ids: ids\n        });\n    },\n\n    findMany(type, ids, params) {\n        if (Array.isArray(type)) {\n            return this._super(...arguments);\n        }\n\n        const store = this;\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const modelClass = this.modelFor(type);\n        const batches = batchEntityIds(ids, 25);\n        const batchLimit = 3;\n\n        if (type === 'person' && this.get('session.features.enableUIAjaxRetryHeader')) {\n            return new Ember.RSVP.Promise((resolve, reject) => {\n                let promises = batches.map(batch => {\n                    return adapter.findMany(store, modelClass, batch, params).then(payload => {\n                        payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                        const records = store.push(payload);\n                        return records;\n                    });\n                });\n                Ember.RSVP.allSettled(promises).then(results => {\n                    let successfulRequests = results.filter(r => r.state === 'fulfilled').map(r => r.value);\n                    let failedRequests = results.filter(r => r.state === 'rejected').map(r => r.value);\n                    if (failedRequests.length > 0) {\n                        reject('store:application#findMany request failed:', {\n                            failedRequests\n                        });\n                        return;\n                    }\n                    resolve(_.flatten(successfulRequests));\n                });\n            });\n        }\n        return new Ember.RSVP.Promise((resolve, reject) => {\n            window.async.mapLimit(\n                batches,\n                batchLimit,\n                function (batch, callback) {\n                    Ember.run.join(() => {\n                        adapter\n                            .findMany(store, modelClass, batch, params)\n                            .then(function (payload) {\n                                payload = serializer.normalizeArrayResponse(\n                                    store,\n                                    modelClass,\n                                    payload,\n                                    null,\n                                    'findMany'\n                                );\n                                const records = store.push(payload);\n                                callback(null, records);\n                            })\n                            .catch(function (err) {\n                                callback(err);\n                            });\n                    });\n                },\n                function (err, bulkResults) {\n                    Ember.run.join(() => {\n                        if (err) {\n                            return reject('store:application#findMany(): async.mapLimit failed' + err);\n                        }\n                        resolve(_.flatten(bulkResults));\n                    });\n                }\n            );\n        }, 'store:application#findMany(): async.mapLimit');\n    },\n\n    /**\n     * Overrides adapterFor to support type being passed into 'find' as a string.\n     */\n    adapterFor(type) {\n        if (type.modelName) {\n            return this._super(type.modelName);\n        }\n        return this._super(type);\n    },\n\n    didSaveRecord(internalModel, data) {\n        // The api returns data instead of an empty object, so we do not want to update\n        // our deleted record, otherwise an error is thrown\n        let recordInfo = data;\n        if (data && data.data) {\n            recordInfo = data.data;\n        }\n\n        if (!internalModel.currentState.isDeleted && recordInfo && recordInfo.id) {\n            if (internalModel.currentState.isSaving && recordInfo.attributes.version) {\n                const record = internalModel.record || internalModel.getRecord();\n\n                if (record) {\n                    record.set('version', recordInfo.attributes.version);\n\n                    if (record.get('type') === 'group') {\n                        updateGroup(record, recordInfo);\n                    }\n                }\n            }\n        }\n\n        return this._super(internalModel, data);\n    }\n});\n\nexport default ApplicationStore;\n","import Ember from 'ember';\nimport LoggerMixin from 'ember-purecloud-components/mixins/logger';\n\nconst { Service } = Ember;\n\nconst StreamingService = Service.extend(LoggerMixin, {\n    connection: {},\n    connected: false,\n    connectedV2: false,\n    v2Deferred: null,\n    v2Promise: null,\n\n    init() {\n        this._super(...arguments);\n        const deferred = Ember.RSVP.defer();\n        this.set('v2Deferred', deferred);\n        this.set('v2Promise', deferred.promise);\n    },\n\n    connect() {\n        return this.get('connectionPromise') || Ember.RSVP.resolve();\n    },\n\n    subscribeToConnection() {},\n\n    setStatus() {\n        return Ember.RSVP.reject(new Error('Entity is required'));\n    },\n\n    setRoomInactive() {},\n\n    inviteToRoom() {},\n\n    setupConnection() {\n        if (this.get('connectionPromise')) {\n            return this.get('connectionPromise');\n        }\n\n        const connectionPromise = Ember.RSVP.resolve();\n        this.set('connectionPromise', connectionPromise);\n        return connectionPromise;\n    }\n});\n\nexport default StreamingService;\n","define(\"connections-ui/services/text-measurer\", [\"exports\", \"ember-text-measurer/services/text-measurer\"], function (_exports, _textMeasurer) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _textMeasurer.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-activity\", [\"exports\", \"ember-user-activity/services/user-activity\"], function (_exports, _userActivity) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userActivity.default;\n    }\n  });\n});\n","define(\"connections-ui/services/user-idle\", [\"exports\", \"ember-user-activity/services/user-idle\"], function (_exports, _userIdle) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _userIdle.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nvar set = Ember.set;\n\nexport default Ember.Service.extend({\n  init: function() {\n    set(this, 'cache', {});\n  }\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-chrome\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-chrome\"], function (_exports, _jabraChrome) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraChrome.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/jabra-native\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/jabra-native\"], function (_exports, _jabraNative) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _jabraNative.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/plantronics\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/plantronics\"], function (_exports, _plantronics) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _plantronics.default;\n    }\n  });\n});\n","define(\"connections-ui/services/vendor-implementations/sennheiser\", [\"exports\", \"ember-softphone-integration/services/vendor-implementations/sennheiser\"], function (_exports, _sennheiser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.default;\n    }\n  });\n  Object.defineProperty(_exports, \"eventTypes\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.eventTypes;\n    }\n  });\n  Object.defineProperty(_exports, \"events\", {\n    enumerable: true,\n    get: function get() {\n      return _sennheiser.events;\n    }\n  });\n});\n","import UserIdleService from 'ember-user-activity/services/user-activity';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 seconds\n    activeEvents: [] // no listeners by default\n});\n","// app/services/user-idle.js\nimport UserIdleService from 'ember-user-activity/services/user-idle';\nimport Ember from 'ember';\n\nexport default UserIdleService.extend({\n    IDLE_TIMEOUT: 3000, // 3 second\n\n    userActivity: Ember.inject.service('videoActivity'),\n\n    setListening(value) {\n        if (value) {\n            this.get('userActivity').enableEvent('mousemove');\n        } else {\n            this.get('userActivity').disableEvent('mousemove');\n        }\n    }\n});\n","import Ember from 'ember';\n\nimport { Promise } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\nimport Evented from '@ember/object/evented';\n\nimport Service from '@ember/service';\nimport {\n    ApplicationService,\n    IntlService,\n    PhoneService,\n    SessionService,\n    StashLoggerService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { WebrtcSettingsService } from './webrtc-settings';\nimport {\n    IExtendedMediaSession,\n    ISdkMediaState,\n    IPendingSession,\n    IStation,\n    ISdkConversationUpdateEvent,\n    IStartSoftphoneSessionParams,\n    SessionTypes,\n    IEndSessionRequest,\n    ISessionMuteRequest,\n    IConversationHeldRequest,\n    GenesysCloudWebrtcSdk,\n    IPendingSessionActionParams\n} from 'genesys-cloud-webrtc-sdk';\nimport { ExpandedDeviceConnectionStatus } from 'genesys-cloud-webrtc-sdk/dist/es/headsets/headset-types';\nimport { IWebrtcSettings } from '../types/webrtc-settings.type';\nimport ComputedProperty from '@ember/object/computed';\nimport EmberObject from '@ember/object';\nimport { addPageAction } from '../utils/newrelic';\n\nexport interface MediaDevices {\n    camera?: { deviceId: string };\n    microphone?: { deviceId: string };\n    outputDevice?: { deviceId: string };\n}\n\nexport type WebrtcEvents = {\n    deviceAnsweredCall: undefined;\n    deviceEndedCall: undefined;\n    deviceMuteStatusChanged: boolean;\n    deviceRejectedCall: string; // conversationId\n    autoAnswer: string; // conversationId\n    mediaStateChange: ISdkMediaState;\n};\n\nexport interface BasicConversationLegacy extends EmberObject {\n    id: string;\n    shouldAutoProceedWebrtc: boolean;\n    acceptedByClient: boolean;\n    isOutbound: boolean;\n    participants: [\n        {\n            bargedParticipantId?: string;\n            monitoredParticipantId?: string;\n            coachedParticipantId?: string;\n            userId: string;\n        }\n    ];\n}\n\nexport interface IPendingSessionEmber extends IPendingSession, EmberObject {}\n\nexport interface WebrtcSdkService extends EmberObject {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof WebrtcEvents>(name: K, args: WebrtcEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    session: SessionService;\n    application: ApplicationService;\n    phone: PhoneService;\n    webrtcSettings: WebrtcSettingsService;\n    ajax: AjaxServiceClass;\n    intl: IntlService;\n\n    logger: StashLoggerService;\n    sdk: GenesysCloudWebrtcSdk;\n\n    pendingSessions: Ember.MutableArray<IPendingSessionEmber>;\n    station: IStation;\n    headsetState: ExpandedDeviceConnectionStatus;\n    mediaState: ISdkMediaState;\n    showPermissionsModal: boolean;\n    previousAutoAnswerProps: {\n        pendingSessions: { id: string; sessionType: SessionTypes }[];\n        conversationsToAutoAnswer: { id: string }[];\n    };\n    lastConversationUpdate: ISdkConversationUpdateEvent;\n    userId: ComputedProperty<string>;\n    hasActiveSoftphoneConversation: boolean;\n    hasActiveSoftphoneSession: boolean;\n    _instrumentSdkUsage(sdkFunction: string): void;\n    isPersistentConnection: ComputedProperty<boolean>;\n    useSdk: ComputedProperty<boolean>;\n    useHeadsets: ComputedProperty<boolean>;\n    settingsPromise: ComputedProperty<IWebrtcSettings>;\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(startParams: IStartSoftphoneSessionParams): Promise<{ id: string; selfUri: string }>;\n    setDevices(devices: MediaDevices): void;\n    setCallVolume(volume: number): void;\n    ensureVideoPermissions(): Promise<void>;\n    ensureAudioPermissions(): Promise<void>;\n    acceptPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    rejectPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    findRemainingSessionsBasedOnParams(\n        conversationId: string,\n        sessionType?: SessionTypes\n    ): Ember.MutableArray<IPendingSessionEmber>;\n    endSession(endSessionParams: IEndSessionRequest): Promise<void>;\n    setMute(muteOptions: ISessionMuteRequest): Promise<void>;\n    setHold(heldOptions: IConversationHeldRequest): Promise<void>;\n    endAllSoftphoneSessions(): void;\n    getAllActiveSessions(): IExtendedMediaSession[];\n}\n\nexport default Service.extend(LoggerMixin, Evented, {\n    init(this: WebrtcSdkService) {\n        (this as any)._super(...arguments);\n\n        this.set('session', {} as SessionService);\n        this.set('application', {} as ApplicationService);\n        this.set('phone', {} as PhoneService);\n        this.set('webrtcSettings', {} as WebrtcSettingsService);\n        this.set('ajax', {} as AjaxServiceClass);\n        this.set('intl', {} as IntlService);\n        this.set('pendingSessions', Ember.A());\n        this.set('headsetState', 'noVendor');\n        this.set('showPermissionsModal', false);\n        this.set('sdk', {} as GenesysCloudWebrtcSdk);\n        this.set('station', {} as IStation);\n        this.set('mediaState', {} as ISdkMediaState);\n        this.set('previousAutoAnswerProps', { pendingSessions: [], conversationsToAutoAnswer: [] });\n        this.set('lastConversationUpdate', {} as ISdkConversationUpdateEvent);\n        this.set('hasActiveSoftphoneConversation', false);\n        this.set('hasActiveSoftphoneSession', false);\n        this.set('userId', '');\n        this.set('isPersistentConnection', false);\n        this.set('useSdk', false);\n        this.set('useHeadsets', false);\n        this.set('settingsPromise', {} as IWebrtcSettings);\n    },\n\n    _instrumentSdkUsage(sdkFunction: string) {\n        const pageActionName = `used-webrtc-sdk-${sdkFunction}`;\n        addPageAction(pageActionName);\n    },\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(this: WebrtcSdkService, _startParams: IStartSoftphoneSessionParams) {\n        this._instrumentSdkUsage('startSoftphoneSession');\n    },\n\n    setDevices(this: WebrtcSdkService, _devices: MediaDevices) {\n        this._instrumentSdkUsage('setDevices');\n    },\n\n    setCallVolume(this: WebrtcSdkService, _volume: number) {\n        this._instrumentSdkUsage('setCallVolume');\n    },\n\n    ensureVideoPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureVideoPermissions');\n    },\n\n    ensureAudioPermissions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('ensureAudioPermissions');\n    },\n\n    acceptPendingSession(this: WebrtcSdkService, _params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('acceptPendingSession');\n    },\n\n    rejectPendingSession(this: WebrtcSdkService, _params: IPendingSessionActionParams) {\n        this._instrumentSdkUsage('rejectPendingSession');\n    },\n\n    findRemainingSessionsBasedOnParams(this: WebrtcSdkService, _conversationId: string, _sessionType?: SessionTypes) {\n        this._instrumentSdkUsage('findRemainingSessionsBasedOnParams');\n        return null;\n    },\n\n    endSession(this: WebrtcSdkService, _endSessionParams: IEndSessionRequest) {\n        this._instrumentSdkUsage('endSession');\n    },\n\n    setMute(this: WebrtcSdkService, _muteOptions: ISessionMuteRequest) {\n        this._instrumentSdkUsage('setMute');\n    },\n\n    setHold(this: WebrtcSdkService, _heldOptions: IConversationHeldRequest) {\n        this._instrumentSdkUsage('setHold');\n    },\n\n    endAllSoftphoneSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('endAllSoftphoneSessions');\n    },\n\n    getAllActiveSessions(this: WebrtcSdkService) {\n        this._instrumentSdkUsage('getAllActiveSessions');\n        return [];\n    }\n});\n\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSdk: WebrtcSdkService;\n        'webrtc-sdk': WebrtcSdkService;\n    }\n}\n","import Ember from 'ember';\n\nimport Evented from '@ember/object/evented';\nimport { Promise, resolve } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\n\nimport { computed } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport {\n    IntlService,\n    NotificationService,\n    PreferencesService,\n    SessionService,\n    StashLoggerService,\n    ApplicationService\n} from '@connections-ui/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { isTesting } from 'connections-ui/utils/testing';\nimport { IDirectorySettings, IGeneralSettings, IWebrtcSettings } from '../types/webrtc-settings.type';\n\nconst SETTINGS_PATH = 'api/v2/settings/webrtc/users';\n\nexport type SettingsEvents = {\n    sdkSettingsUpdate: IWebrtcSettings;\n};\n\nexport const defaultGeneralSettings: IGeneralSettings = {\n    ringtoneSelection: 'phone',\n    advancedMicSettings: {\n        autoGain: true,\n        echoCancellation: true,\n        noiseSuppression: true\n    }\n};\n\nexport const defaultDirectorySettings: IDirectorySettings = {\n    alwaysPopoutVideo: false,\n    selectedProfile: '',\n    profiles: [],\n    defaultProfileId: ''\n};\n\nexport interface WebrtcSettingsService {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof SettingsEvents>(name: K, args: SettingsEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    get<K extends keyof WebrtcSettingsService>(name: K | string): WebrtcSettingsService[K];\n    set<K extends keyof WebrtcSettingsService>(\n        name: K | string,\n        value: WebrtcSettingsService[K]\n    ): WebrtcSettingsService[K];\n    removeObserver(depName: string, target: any, handler: Function): void;\n    addObserver(depName: string, target: any, handler: Function): void;\n\n    ajax: AjaxServiceClass;\n    preferences: PreferencesService;\n    session: SessionService;\n    logger: StashLoggerService;\n    notification: NotificationService;\n    intl: IntlService;\n    application: ApplicationService;\n\n    _ready: Promise<any>;\n    settings: IWebrtcSettings | null;\n    failedSettingsFetch: boolean;\n    reallyWaitForToken?: boolean;\n    _fetchSettingsPromise: Promise<IWebrtcSettings> | null;\n    _updatePromise: Promise<any> | null;\n\n    _super(...args: any[]): void;\n    _handleSettingsChanged(settings: IWebrtcSettings): void;\n    _waitForAccessToken(): Promise<any>;\n    _fetchSettings(): Promise<IWebrtcSettings>;\n    _checkAndFixSettings(settings: IWebrtcSettings): boolean;\n    _updateSettings(settings: IWebrtcSettings): void;\n\n    getSettings(forceRefresh?: boolean, retryOnFail?: boolean): Promise<IWebrtcSettings>;\n    updateSettings(settings: IWebrtcSettings): Promise<void>;\n    updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]): Promise<void>;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    preferences: inject('preferences'),\n    session: inject('session'),\n    ajax: inject('ajax'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n    application: inject('application'),\n\n    error: false,\n    syncEnabled: false,\n    deferredPersistRequests: null,\n\n    settings: null,\n    // Wait for the service to be initialized and have settings.\n    userSettingsPromise: computed('_ready', 'settings', async function () {\n        try {\n            await this.get('_ready');\n            return this.get('settings');\n        } catch (err) {\n            this.logger.error('Failed to fetch settings - userSettingsPromise', err);\n            // Even if we get an error, we will still set some non-persisting defaults and should return those.\n            return this.get('settings');\n        }\n    }),\n    failedSettingsFetch: false,\n    _fetchSettingsPromise: null,\n    _updatePromise: null,\n\n    init(this: WebrtcSettingsService) {\n        this._super(...arguments);\n        // Wait until we have a token to grab settings and only resolve ready once we have/set settings.\n        const ready = this._waitForAccessToken()\n            .then(async () => {\n                this.logger.debug('Ready to fetch WebRTC settings');\n                const settings = (await this._fetchSettings()) || {};\n                // Check if we are missing some/all settings.\n                if (this._checkAndFixSettings(settings)) {\n                    // Persist adjusted settings.\n                    await this._updateSettings(settings);\n                }\n            })\n            .catch(err => {\n                this.set('failedSettingsFetch', true);\n                this._checkAndFixSettings({});\n                return Promise.reject(err);\n            });\n        this.set('_ready', ready);\n    },\n\n    async _waitForAccessToken(this: WebrtcSettingsService) {\n        if (this.get('session.accessToken') || (isTesting && !this.reallyWaitForToken)) {\n            return;\n        }\n\n        return new Promise(resolve => {\n            const handler = () => {\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    async getSettings(this: WebrtcSettingsService, forceRefresh?: boolean, retryOnFail = true) {\n        if (!forceRefresh && this.get('settings')) {\n            return this.get('settings');\n        }\n\n        try {\n            await this.get('_ready');\n            const settings = await this._fetchSettings();\n            this.set('settings', settings);\n            this.set('failedSettingsFetch', false);\n            return settings;\n        } catch (err) {\n            this.logger.error('Failed to fetch settings:', { err });\n            this.set('failedSettingsFetch', true);\n            // If we fail to fetch settings, retry one time.\n            if (retryOnFail) {\n                return this.getSettings(forceRefresh, false);\n            }\n            this._checkAndFixSettings({});\n            return Promise.reject(err);\n        }\n    },\n\n    _fetchSettings(this: WebrtcSettingsService) {\n        if (this.get('_fetchSettingsPromise')) {\n            return this.get('_fetchSettingsPromise');\n        }\n\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n        const promise = this.get('ajax')\n            .request(settingsUrl)\n            .then(settings => Ember.Object.create(settings))\n            .catch(e => this.logger.error('Failed to fetch webrtc settings', { err: e }))\n            .finally(() => this.set('_fetchSettingsPromise', null));\n\n        this.set('_fetchSettingsPromise', promise as Promise<IWebrtcSettings>);\n        return promise;\n    },\n\n    // Trigger PATCH request on webrtc user settings. Used only internally in this service.\n    async _updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // Always make settings changes immediate\n        const cached = Object.assign({}, this.get('settings') || {}, settings);\n        this.set('settings', cached);\n\n        const existingPromise = this.get('_updatePromise') || resolve();\n        const settingsUrl = this.get('application').pcV2Uri(SETTINGS_PATH);\n\n        const promise = existingPromise\n            .then(() => {\n                this.get('ajax').request(settingsUrl, {\n                    method: 'PATCH',\n                    dataType: 'text',\n                    data: settings\n                });\n            })\n            .catch(e => this.logger.error('Failed to update webrtc settings', { err: e }))\n            .finally(() => {\n                this.trigger('sdkSettingsUpdate', this.get('settings') ?? {});\n                if (this.get('_updatePromise') === promise) {\n                    this.set('_updatePromise', null);\n                }\n            });\n\n        this.set('_updatePromise', promise);\n    },\n\n    _checkAndFixSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // If some important settings are missing, set some defaults.\n        if (!settings.directorySettings || !settings.generalSettings || !settings.generalSettings.advancedMicSettings) {\n            if (!settings.directorySettings) {\n                settings.directorySettings = defaultDirectorySettings;\n            }\n            if (!settings.generalSettings) {\n                settings.generalSettings = defaultGeneralSettings;\n            }\n            if (!settings.generalSettings.advancedMicSettings) {\n                settings.generalSettings.advancedMicSettings = defaultGeneralSettings.advancedMicSettings;\n            }\n            this.logger.warn('Some WebRTC settings were missing, setting defaults.', settings);\n            // Set the settings locally if fixes were applied and return true.\n            // These do NOT persist automatically.\n            this.set('settings', settings);\n            return true;\n        }\n        this.set('settings', settings);\n        return false;\n    },\n\n    async updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        try {\n            // If we have no access token, we don't want to try updating settings.\n            await this.get('_ready');\n        } catch (error) {\n            this.logger.error('Failed to fetch WebRTC settings, cannot update WebRTC settings.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        // If we failed to fetch settings, we don't want a user to update them because they could override their saved settings.\n        if (this.get('failedSettingsFetch')) {\n            this.logger.warn('Cannot update settings because they failed to fetch.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        await this._updateSettings(settings);\n    },\n\n    /**\n     * This fn can take a dot-delimited path and update that single setting\n     */\n    async updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]) {\n        const pieces = settingPath.split('.');\n        const settings = Object.assign({}, this.get('settings'));\n\n        let ref = settings;\n\n        pieces.forEach((piece, index) => {\n            if (index === pieces.length - 1) {\n                Ember.set(ref, piece, value);\n            } else {\n                Ember.set(ref, piece, ref[piece] || {});\n            }\n\n            ref = ref[piece];\n        });\n\n        // only update the top-level object\n        const topLevelKey = pieces[0];\n        return this.updateSettings({ [topLevelKey]: settings[topLevelKey] });\n    },\n\n    // If we get an update from another client, sync settings to latest update.\n    _handleSettingsChanged(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        const updatedSettings = Object.assign({}, this.get('settings'), settings);\n        // Immediately set new webrtc settings\n        this.set('settings', updatedSettings);\n        // Trigger settings event so SDK can update if being used.\n        this.trigger('sdkSettingsUpdate', updatedSettings);\n    }\n});\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSettings: WebrtcSettingsService;\n        'webrtc-settings': WebrtcSettingsService;\n    }\n}\n","define(\"connections-ui/services/webrtc\", [\"exports\", \"ember-webrtc-components/services/webrtc\"], function (_exports, _webrtc) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtc.default;\n    }\n  });\n});\n","import config from '../config/environment';\nimport LocalStorageStore from 'ember-simple-auth/session-stores/local-storage';\nimport netUtils from '../utils/net';\n\nconst DEFAULT_STORAGE_KEY = 'connections_ui_auth';\n\nconst CURRENT_PROP = 'authenticated';\n\nlet BaseStore = LocalStorageStore;\nlet storageKey = DEFAULT_STORAGE_KEY;\n\nif (config.environment === 'development') {\n    try {\n        let currEnvDetails = netUtils.getEnvDetails();\n        if (currEnvDetails && currEnvDetails.local) {\n            storageKey = `${DEFAULT_STORAGE_KEY}-localhost-${currEnvDetails.env}`;\n        }\n    } catch (e) {\n        // Unknown env, prob testing ... just use base storage key\n    }\n}\n\nexport default BaseStore.extend({\n    init() {\n        let storeProps = {\n            key: storageKey\n        };\n        this.setProperties(storeProps);\n        this._super(...arguments);\n    },\n\n    restore() {\n        return this._super(...arguments).then(data => {\n            let payload = data[CURRENT_PROP] || {};\n            // Force our ESA authenticator to get a token from the host.\n            payload.authenticator = 'authenticator:directory';\n            return {\n                [CURRENT_PROP]: payload\n            };\n        });\n    }\n});\n","export default Ember.HTMLBars.template({\"id\":\"kKl62LJd\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/agent-ui.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"y+Bia1zY\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"canSelectDevices\\\"]],[33,[\\\"not\\\"],[[28,[\\\"webrtc\\\",\\\"canUseWebrtcSoftphone\\\"]]],null]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[1,[26,[\\\"webrtc-issues\\\"]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"callForwardingActive\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showEnableCallForwarding\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"forward-calls \\\",[33,[\\\"if\\\"],[[28,[\\\"webrtcStation\\\"]],\\\"webrtc-station\\\"],null]]]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-link btn-sm btn-link-bordered btn-block begin-forwarding\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"callForwarding\\\"],[[\\\"bubbles\\\"],[false]]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.callForwarding.enableCallForwarding\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"        \\\"],[1,[33,[\\\"call-forwarding-v2\\\"],null,[[\\\"configuringCallForwarding\\\"],[[28,[\\\"configuringCallForwarding\\\"]]]]],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/call-forwarding-partial.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"59cslhog\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-detail\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner\\\"],[15,\\\"role\\\",\\\"banner\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"h3\\\",[]],[13],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.cardView\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"banner-nav\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"link-to\\\"],[\\\"card.tree\\\",[28,[\\\"currentPerson\\\",\\\"id\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[11,\\\"span\\\",[]],[16,\\\"aria-label\\\",[34,[[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null]]]],[13],[0,\\\"\\\\n                    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-tree-view\\\"],[15,\\\"id\\\",\\\"tree-view-icon\\\"],[13],[14],[0,\\\"\\\\n                    \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"tree-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.treeView\\\"],null],false]]}],[0,\\\"\\\\n                \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"card-view-icon-container\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-card-view\\\"],[15,\\\"id\\\",\\\"card-view-icon\\\"],[13],[14],[0,\\\"\\\\n                \\\"],[9,\\\"gux-tooltip\\\",{\\\"attrs\\\":[[15,\\\"for\\\",\\\"card-view-icon\\\"],[15,\\\"placement\\\",\\\"bottom\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[[1,[33,[\\\"t\\\"],[\\\"tooltip.person.cardView\\\"],null],false]]}],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"role\\\",\\\"main\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"card-view\\\"],null,[[\\\"entity\\\",\\\"setCurrentPerson\\\"],[[28,[\\\"model\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setCurrentPerson\\\"],null]]]],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"aFUOXhwO\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"card-tree\\\"],null,[[\\\"model\\\"],[[28,[\\\"model\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/card/tree.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"jBs6fTqh\",\"block\":\"{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"not\\\"],[[28,[\\\"permissions\\\",\\\"canViewBusinessChat\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-access\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"strong\\\",[]],[13],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessErrorTitle\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n        \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"t\\\"],[\\\"chat.permissions.accessError\\\"],null],false],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/chat-room.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"0kkMWKWy\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"hidden\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"showSeparatorBefore\\\"]]],null,{\\\"statements\\\":[[1,[28,[\\\"previous\\\",\\\"separator\\\"]],false]],\\\"locals\\\":[]},null],[6,[\\\"if\\\"],[[28,[\\\"template\\\"]]],null,{\\\"statements\\\":[[18,\\\"default\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[1,[26,[\\\"title\\\"]],false]],\\\"locals\\\":[]}],[6,[\\\"if\\\"],[[28,[\\\"showSeparatorAfter\\\"]]],null,{\\\"statements\\\":[[1,[26,[\\\"separator\\\"]],false]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[\\\"default\\\"],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/document-title.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"FHUG/v5v\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"media-item webhooks collapsible \\\",[33,[\\\"unless\\\"],[[28,[\\\"expanded\\\"]],\\\"collapsed\\\"],null]]]],[13],[0,\\\"\\\\n    \\\"],[11,\\\"button\\\",[]],[15,\\\"class\\\",\\\"collapse-toggle btn btn-link\\\"],[15,\\\"type\\\",\\\"button\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"toggleExpanded\\\"]],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"ion-arrow-down-b\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"expanded\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-body\\\"],[13],[0,\\\"\\\\n            \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksTitle\\\"]]],null],false],[0,\\\"\\\\n            \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"webhooks-details\\\"],[13],[0,\\\"\\\\n                \\\"],[11,\\\"div\\\",[]],[13],[0,\\\" \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksDetails\\\"]]],null],false],[0,\\\" \\\"],[14],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks-collapsible.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"iy8S2P5P\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"media-item webhooks collapsed\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"webhooks-header\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"div\\\",[]],[16,\\\"class\\\",[34,[\\\"status \\\",[26,[\\\"webhooksStatus\\\"]]]]],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"html-safe\\\"],[[28,[\\\"webhooksHeader\\\"]]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/components/webhooks.hbs\"}});","define(\"connections-ui/templates/components/x-select\", [\"exports\", \"emberx-select/templates/components/x-select\"], function (_exports, _xSelect) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _xSelect.default;\n    }\n  });\n});\n","export default Ember.HTMLBars.template({\"id\":\"KKBGetCl\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"group-profile\\\"],null,[[\\\"model\\\",\\\"isEditing\\\"],[[28,[\\\"model\\\"]],[28,[\\\"isEditing\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/group/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"55yjh1Xz\",\"block\":\"{\\\"statements\\\":[[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"index\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.index\\\"],null],false],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/index.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Bgiz6Huu\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"login-oauth\\\"],null,[[\\\"offerMobileApp\\\",\\\"mobileOfferDeclined\\\",\\\"authenticate\\\"],[[28,[\\\"model\\\",\\\"offerMobileApp\\\"]],[33,[\\\"route-action\\\"],[\\\"mobileOfferDeclined\\\"],null],[33,[\\\"route-action\\\"],[\\\"authenticate\\\"],null]]]],false],[0,\\\"\\\\n\\\"],[1,[26,[\\\"icon-bootstrap\\\"]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/login-oauth.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"09fWonJq\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"title text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"titleKey\\\"],null]],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"hasDesc\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"desc text-center\\\"],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"descKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"action-container text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"p\\\",[]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[[33,[\\\"get\\\"],[[28,[\\\"messageKeys\\\"]],\\\"actionKey\\\"],null]],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"reloadApp\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"unrecoverableAppFailure.reloadApp\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/maintenance.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"nv+hrZq0\",\"block\":\"{\\\"statements\\\":[[11,\\\"h3\\\",[]],[15,\\\"class\\\",\\\"text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissionsHeader\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[1,[33,[\\\"t\\\"],[\\\"auth.noPermissions\\\"],null],false],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\\n\\\"],[11,\\\"p\\\",[]],[15,\\\"class\\\",\\\"text text-center\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[15,\\\"class\\\",\\\"btn btn-default\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"logout\\\"]],[13],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"components.navMenu.logout\\\"],null],false],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14],[0,\\\"\\\\n\\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"genesys-logo-container\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"brand-footer-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[28,[\\\"applicationService\\\",\\\"currentYear\\\"]]]]],false],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/no-access.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"t3+KfQhb\",\"block\":\"{\\\"statements\\\":[[11,\\\"div\\\",[]],[15,\\\"class\\\",\\\"no-station-notification\\\"],[13],[0,\\\"\\\\n    \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-phone-off\\\"],[13],[14],[0,\\\"\\\\n    \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"no-phone-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.noPhoneSelected\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[11,\\\"button\\\",[]],[15,\\\"type\\\",\\\"button\\\"],[15,\\\"class\\\",\\\"btn btn-link action-open-station-picker-v2\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openStationPicker\\\"]],[13],[0,\\\"\\\\n            \\\"],[11,\\\"span\\\",[]],[15,\\\"class\\\",\\\"select-text\\\"],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.station.change\\\"],null],false],[14],[0,\\\"\\\\n            \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc pc-angle-right\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/partials/-no-station-notification.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"XmYZvT94\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"entity-profile\\\"],null,[[\\\"entity\\\",\\\"user\\\",\\\"editing\\\",\\\"editEmergencyLocation\\\",\\\"setEditingSection\\\"],[[28,[\\\"model\\\",\\\"person\\\"]],[28,[\\\"model\\\",\\\"user\\\"]],[28,[\\\"editing\\\"]],[28,[\\\"editEmergencyLocation\\\"]],[33,[\\\"action\\\"],[[28,[null]],\\\"setEditingSection\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/person/detail.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"moJeOwBU\",\"block\":\"{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"dialpadShouldSendDtmf\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"phone\\\",\\\"dtmf\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"show-dtmf-dialpad\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"openDtmfDialPad\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.openDialpad\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"canRecord\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"record\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"record\\\"]],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"isRecording\\\"]]],null,{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.stopRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.recording.startRecording\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}],[0,\\\"        \\\"],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[0,\\\"    \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"add-participant\\\"],[13],[0,\\\"\\\\n        \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"showAddParticipants\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.addParticipant\\\"],null],false],[14],[0,\\\"\\\\n    \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"unless\\\"],[[33,[\\\"or\\\"],[[28,[\\\"conversation\\\",\\\"onConference\\\"]],[28,[\\\"isMonitoring\\\"]],[28,[\\\"isCoaching\\\"]]],null]],null,{\\\"statements\\\":[[6,[\\\"unless\\\"],[[28,[\\\"conversation\\\",\\\"onConsult\\\"]]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"transfer\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"transfer\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.transfer.default\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[28,[\\\"conferenceEnabled\\\"]]],null,{\\\"statements\\\":[[6,[\\\"if\\\"],[[33,[\\\"and\\\"],[[28,[\\\"eligibleCallsToMerge\\\"]],[28,[\\\"isConnected\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"merge\\\"],[13],[0,\\\"\\\\n            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"merge\\\"]],[13],[1,[33,[\\\"t\\\"],[\\\"purecloud.merge\\\"],null],false],[14],[0,\\\"\\\\n        \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},null]],\\\"locals\\\":[]},null],[0,\\\"\\\\n\\\"],[11,\\\"li\\\",[]],[15,\\\"class\\\",\\\"flag-action\\\"],[13],[0,\\\"\\\\n\\\"],[6,[\\\"if\\\"],[[33,[\\\"or\\\"],[[28,[\\\"flagInteraction\\\",\\\"isRunning\\\"]],[28,[\\\"unflagInteraction\\\",\\\"isRunning\\\"]]],null]],null,{\\\"statements\\\":[[0,\\\"        \\\"],[11,\\\"i\\\",[]],[15,\\\"class\\\",\\\"pc-moon pc-loading pc-spin\\\"],[13],[14],[0,\\\"\\\\n        \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[6,[\\\"if\\\"],[[28,[\\\"isFlagged\\\"]]],null,{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"unflag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"class\\\",\\\"unflag-icon\\\"],[15,\\\"icon-name\\\",\\\"flag\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.unflagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]},{\\\"statements\\\":[[0,\\\"            \\\"],[11,\\\"a\\\",[]],[15,\\\"href\\\",\\\"#\\\"],[5,[\\\"action\\\"],[[28,[null]],\\\"flag\\\"]],[13],[0,\\\"\\\\n                \\\"],[9,\\\"gux-icon\\\",{\\\"attrs\\\":[[15,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"class\\\",\\\"flag-icon\\\"],[16,\\\"title\\\",[33,[\\\"t\\\"],[\\\"purecloud.flagInteraction\\\"],null],null],[15,\\\"decorative\\\",\\\"true\\\"]],\\\"args\\\":[[],[]],\\\"locals\\\":[],\\\"statements\\\":[]}],[0,\\\"\\\\n                \\\"],[1,[33,[\\\"t\\\"],[\\\"purecloud.voiceQualityIssue\\\"],null],false],[0,\\\"\\\\n            \\\"],[14],[0,\\\"\\\\n\\\"]],\\\"locals\\\":[]}]],\\\"locals\\\":[]}],[14]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/purecloud/partials/conversation-controls-menu.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"Wq9VakQB\",\"block\":\"{\\\"statements\\\":[[19,\\\"partials/signup-reset\\\"]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":true}\",\"meta\":{\"moduleName\":\"connections-ui/templates/reset-password.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"HGIIpodG\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"search-page\\\"],null,[[\\\"entity\\\",\\\"query\\\",\\\"queryFacets\\\",\\\"saveHistory\\\"],[[28,[\\\"entity\\\"]],[28,[\\\"query\\\"]],[28,[\\\"queryFacets\\\"]],[28,[\\\"saveHistory\\\"]]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/search.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"NjP1jyRV\",\"block\":\"{\\\"statements\\\":[],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/third-party/app-embed.hbs\"}});","export default Ember.HTMLBars.template({\"id\":\"z5f7z+A1\",\"block\":\"{\\\"statements\\\":[[1,[33,[\\\"time-machine-confirmation\\\"],null,[[\\\"buildTag\\\",\\\"confirm\\\",\\\"cancel\\\"],[[28,[\\\"model\\\",\\\"buildTag\\\"]],[33,[\\\"route-action\\\"],[\\\"confirm\\\"],null],[33,[\\\"route-action\\\"],[\\\"cancel\\\"],null]]]],false]],\\\"locals\\\":[],\\\"named\\\":[],\\\"yields\\\":[],\\\"hasPartials\\\":false}\",\"meta\":{\"moduleName\":\"connections-ui/templates/time-machine.hbs\"}});","import Transform from 'ember-data/transform';\n\nexport default Transform.extend({\n    deserialize(serialized) {\n        return new Date(serialized);\n    },\n\n    serialize(deserialized) {\n        return deserialized.toISOString();\n    }\n});\n","define(\"connections-ui/transforms/json\", [\"exports\", \"ember-data-change-tracker/transforms/json\"], function (_exports, _json) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _json.default;\n    }\n  });\n});\n","define(\"connections-ui/transforms/object\", [\"exports\", \"ember-data-change-tracker/transforms/object\"], function (_exports, _object) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _object.default;\n    }\n  });\n});\n","define(\"connections-ui/types/agent-assist.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/conversation.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","export * from './maybe.type';\nexport * from './conversation.type';\nexport * from './pigeon.type';\n","define(\"connections-ui/types/maybe.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/pigeon.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/types/webrtc-settings.type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","import { CommunicationType } from '@genesys/genesys-cloud-conversation-utils';\nimport { UnionFromTuple, assertNever } from 'connections-ui/utils/types';\nimport { AppContext } from './apps';\n\nexport const COMMUNICATION_TYPE_SINGULAR = ['call', 'email', 'message', 'chat', 'callback'] as const;\ntype CommunicationTypeSingular = UnionFromTuple<typeof COMMUNICATION_TYPE_SINGULAR>;\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName: string, args: any = {}): any {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    console.warn(message, { arguments: args });\n}\n\nexport function singularizeMediaType(type: CommunicationType): CommunicationTypeSingular {\n    return type.substring(0, type.length - 1) as CommunicationTypeSingular;\n}\n\n/**\n * Retrieves the queue ID from the given app context.\n *\n * This function extracts the queue ID based on the type of the app context.\n * For 'conversation' type, it attempts to retrieve the queue ID from the participant payload.\n * For 'workitem' type, it retrieves the queue ID directly from the workitem payload.\n * If the type is not recognized, it asserts an error.\n */\nexport function getQueueIdFromAppContext({ type, payload }: AppContext): string | undefined {\n    switch (type) {\n        case 'conversation': {\n            return payload.get('participantForCurrentUser.queueId') || payload.get('participantForQueue.queueId');\n        }\n        default: {\n            assertNever(type);\n        }\n    }\n}\n","export const replaceHtmlSpecialChars = (str: string): string =>\n    str\n        ?.replace(/&quot;/g, '\"')\n        .replace(/&#39;/g, \"'\")\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&')\n        .replace(/&#8217;/g, \"'\");\n","import _ from 'lodash';\nimport Ember from 'ember';\nimport { pluralize } from 'ember-inflector';\nimport moment from 'connections-ui/utils/dates';\n\nconst { typeOf, get } = Ember;\n\nconst MEDIA_TYPES = ['callbacks', 'calls', 'chats', 'emails', 'messages'];\n\nfunction participantHasMedia(participants, media) {\n    return !!participants.find(participant => !!participant[media]);\n}\n\n// Assigns the interaction data sent from carrier pigeon or REST API response\n// to a property on the model that can be used to retrieve an interaction's \"raw\" data\nexport function setInteractionModelMetadata(model, interactionMetadata) {\n    try {\n        let metadataClone = _.cloneDeep(interactionMetadata);\n\n        if (typeOf(model) === 'instance') {\n            model.set('__interaction_metadata__', metadataClone);\n        } else {\n            model.__interaction_metadata__ = metadataClone;\n        }\n    } catch (err) {\n        Ember.Logger.error('Unable to clone and set the interaction metadata for interaction', {\n            err,\n            remoteData: {\n                interactionId: Ember.get(model, 'id')\n            }\n        });\n    }\n}\n\nexport function getCommunicationType(interactionModel) {\n    if (!interactionModel) return null;\n    return interactionModel.get('subMessageType') || interactionModel.get('type');\n}\n\nexport function getInteractionTypeFromCP(interaction, myGuid) {\n    if (!interaction || !myGuid || !interaction.participants) {\n        return {};\n    }\n\n    const myParticipants = interaction.participants.filter(participant => {\n        return participant.userId === myGuid;\n    });\n\n    const active = {};\n    MEDIA_TYPES.forEach(type => {\n        active[type] = participantHasMedia(myParticipants, type);\n    });\n\n    return active;\n}\n\nexport function interactionHasSipErrors(interaction) {\n    if (!interaction) {\n        return false;\n    }\n\n    let callsError = false;\n    const calls = interaction.get('participantForCurrentUser.calls');\n\n    if (calls) {\n        callsError = Ember.A(calls).some(call => {\n            const code = Ember.get(call, 'disconnectReasons.firstObject.code');\n\n            // 487 is Voicemail Not Available, which is not treated as an error\n            // 410 is a queue call that gets transfered to an agent for some reason\n            return code && code >= 300 && code !== 487 && code !== 410;\n        });\n    }\n\n    return callsError;\n}\n\n/**\n * Gets the true customer participant - whether it is the consultParticipant true customer or the last connected customer\n * @param interaction\n * @returns {*}\n */\nexport function getTrueCustomerIfMultipleCustomersExist(interaction) {\n    if (interaction) {\n        const participants = get(interaction, 'participants') || [];\n        const type = get(interaction, 'type');\n        const customerParticipants =\n            participants.filter(({ purpose }) => purpose === 'customer' || purpose === 'external') || Ember.A([]);\n\n        const hasMultipleCustomers = customerParticipants.length > 1;\n\n        if (hasMultipleCustomers) {\n            const consultParticipantId =\n                get(interaction, 'consultParticipantId') || customerParticipants.mapBy('consultParticipantId').pop();\n            const isCallOrCallback = interaction.get('isCall') || interaction.get('isCallback');\n\n            if (isCallOrCallback) {\n                if (consultParticipantId) {\n                    return customerParticipants.findBy('id', consultParticipantId);\n                } else {\n                    // SERVOPS-13490  when there are multiple customers on a blind transfer call from a previous consult\n                    // call there can be more than one customer participant in the list so deriving the correct communication\n                    // ID for the true customer can be wrong.  Since the blind transfer happened - there is no longer information\n                    // about what user is the consultParticipant so we will take the most recently connected\n                    // customer as the inferred true customer\n                    let participant;\n                    for (let i = 0; i < customerParticipants.length; i++) {\n                        let customer = customerParticipants[i];\n\n                        const communicationType = pluralize(type).camelize();\n                        const communications = customer[communicationType] || [];\n                        const { state } = communications[0] || {};\n                        if (!get(customer, 'endTime') || state === 'connected') {\n                            return customer;\n                        }\n                        const customerEndTime = moment(get(customer, 'endTime'));\n                        const lastParticipantEndTime = participant ? moment(get(participant, 'endTime')) : null;\n\n                        if (!participant || customerEndTime.isAfter(lastParticipantEndTime)) {\n                            participant = customer;\n                        }\n                    }\n                    return participant;\n                }\n            }\n        }\n    }\n}\n\nexport function isOutboundEmailInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'emails.firstObject.direction') === 'outbound';\n}\n\nexport function isOutboundMessagingInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'messages.firstObject.direction') === 'outbound';\n}\n\n/**\n * Util for creating an immutable pojo for a given contact\n * @param contact\n * @returns {*}\n */\nexport function createContactPojo(contact) {\n    if (!contact) return;\n    const derivedProperties = ['name', 'canonicalId', 'isCanonical'];\n    const contactJSON = typeof contact.toJSON === 'function' ? contact.toJSON({ includeId: true }) : {};\n    const derived = derivedProperties.reduce((accumulator, property) => {\n        const value = get(contact, property);\n        if (value) {\n            accumulator[property] = value;\n        }\n        return accumulator;\n    }, {});\n    return Object.assign(contactJSON, derived);\n}\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName, args) {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    Ember.Logger.warn(message, { arguments: args });\n}\n","const participantStatuses = {\n    ALERTING: 'ALERTING',\n    CONNECTING: 'CONNECTING',\n    CONNECTED: 'CONNECTED',\n    CONTACTING: 'CONTACTING',\n    DIALING: 'DIALING',\n    DISCONNECTED: 'DISCONNECTED',\n    PARKED: 'PARKED',\n    OFFERING: 'OFFERING',\n    TERMINATED: 'TERMINATED',\n    TRANSMITTING: 'TRANSMITTING'\n};\n\nexport default participantStatuses;\n","export const MEDIA_TYPES = {\n    CHAT: 'chat',\n    EMAIL: 'email',\n    VOICE: 'voice'\n};\n\nexport const STAT_KEYS = {\n    ABANDONED: 'tAbandon',\n    ACW: 'tAcw',\n    ANSWERED: 'tAnswered',\n    CUSTOMERS_WAITING: 'oWaiting',\n    HANDLE: 'tHandle',\n    HELD: 'tHeld',\n    INTERACTING: 'oInteracting',\n    IVR: 'tIvr',\n    OFFERED: 'nOffered',\n    OVERSLA: 'nOverSla',\n    SERVICE_LEVEL: 'serviceLevel',\n    SERVICE_TARGET: 'serviceTarget',\n    TALK: 'tTalk',\n    TIME_IN_STATUS: 'tIS', // tIS.<Status ID> ms  The time in status for the given status id. At status change time.\n    TRANSFERRED: 'nTransferred',\n    WAIT_TIME: 'tWait',\n    ACTIVE_MEMBERS: 'nActive', // Number of active members\n    MEMBERS: 'nMembers' // Active members\n};\n","/**\n * Params from the URL in the router. Pattern could be any of the following.\n *   - engage/admin/interactions/:interactionId/\n *   - engage/admin/interactions/:interactionId/*interactionDetailPath\n *   - engage/agent/interactions/:interactionId/\n *   - engage/agent/interactions/:interactionId/*interactionDetailPath\n */\ninterface InteractionDetailRedirectUrlParams {\n    /** GUID for the interaction. */\n    interactionId: string;\n\n    /** Sub-path within the interaction detail view like /details or /transcript. May not be present if the path ends with the interaction ID like engage/agent/interactions/:interactionId/ */\n    interactionDetailPath?: string;\n}\n\nexport interface InteractionDetailRedirectArgs {\n    /** Params from the URL in the router. */\n    urlParams: InteractionDetailRedirectUrlParams;\n\n    /** Query params from the URL. */\n    queryParams?: Record<string, string | undefined>;\n\n    /** URL segment for routing to either the admin or agent interaction detail path. */\n    adminAgentSegment: 'admin' | 'agent';\n}\n\n/** Builds a path to the analytics-ui iframe coordinator route for the interaction detail view given parameters from the old /engage/admin/interactions/ path. */\nexport function buildInteractionDetailRedirectPath(args: InteractionDetailRedirectArgs): string {\n    const queryParams = args.queryParams || {};\n    const queryParamSegments: Array<string> = [];\n\n    Object.entries(queryParams).forEach(keyValuePair => queryParamSegments.push(keyValuePair.join('=')));\n\n    const queryParamString = queryParamSegments.join('&');\n    const interactionId = args.urlParams.interactionId;\n    const interactionDetailPath = args.urlParams.interactionDetailPath;\n    const adminAgentSegment = args.adminAgentSegment;\n\n    let url = `/analytics/interactions/${interactionId}/${adminAgentSegment}/`;\n\n    if (interactionDetailPath) {\n        url += interactionDetailPath;\n    }\n\n    if (queryParamString) {\n        url += `?${queryParamString}`;\n    }\n\n    return url;\n}\n","import { getEvaluator, parse } from 'boon-js';\nimport { buildSymbolMap } from 'connections-ui/utils/boolean-expressions';\nimport { computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport const _buildAppProviderComputed = function (providerConfig) {\n    let dependencies = ['permissions.donutPermissions.[]', 'session.features'];\n    let keys = Object.keys(providerConfig);\n    keys.forEach(currKey => {\n        if (providerConfig[currKey].dependencies) {\n            dependencies = [...dependencies, ...providerConfig[currKey].dependencies];\n        }\n    });\n    dependencies = [...new Set(dependencies)];\n    let evaluateProviderExpression = function (expr, features, permissions) {\n        return buildSymbolMap(expr, {\n            ft: keyName => {\n                return features[keyName];\n            },\n            perm: keyName => {\n                return permissions.validateDonutPermission(keyName);\n            },\n            bool: keyName => {\n                return keyName === 'true';\n            }\n        });\n    };\n    return computed(...dependencies, function () {\n        let validProviders = [];\n        const permissions = this.get('permissions');\n        const features = this.get('session.features');\n        keys.forEach(currKey => {\n            const boolExpr = providerConfig[currKey].boolExpr;\n            const oldProvider = providerConfig[currKey].providerInstance;\n            let validProvider;\n            if (boolExpr) {\n                try {\n                    validProvider = providerConfig[currKey].evaluator(\n                        evaluateProviderExpression(boolExpr, features, permissions)\n                    );\n                } catch (error) {\n                    validProvider = false;\n                }\n            } else {\n                validProvider = true;\n                this.logger.warn('There are no feature toggle or permission restrictions for provider: ', {\n                    key: currKey\n                });\n            }\n            if (validProvider) {\n                if (!oldProvider) {\n                    providerConfig[currKey].providerInstance = getOwner(this).lookup('app-provider:' + currKey);\n                }\n                validProviders.push(providerConfig[currKey].providerInstance);\n            } else {\n                if (oldProvider) {\n                    oldProvider.destroy();\n                    providerConfig[currKey].providerInstance = null;\n                }\n            }\n        });\n        return validProviders;\n    });\n};\n\nexport const _buildProviderConfig = function (providerConfigMap, logger) {\n    if (!providerConfigMap) {\n        return {};\n    }\n    let keys = Object.keys(providerConfigMap);\n    let providerConfig = {};\n    keys.forEach(currKey => {\n        const boolExpr = providerConfigMap[currKey];\n        providerConfig[currKey] = { providerInstance: null, boolExpr };\n        try {\n            if (boolExpr) {\n                providerConfig[currKey].evaluator = getEvaluator(boolExpr);\n\n                let currDependencies = parse(boolExpr)\n                    .filter(curr => {\n                        return curr.name === 'IDENTIFIER';\n                    })\n                    .map(curr => {\n                        const [valueTag, value] = curr.value.split(':');\n                        if (!value || value === '') {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                        if (valueTag === 'ft') {\n                            return 'session.features.' + value;\n                        } else if (\n                            valueTag === 'perm' ||\n                            (valueTag === 'bool' && (value === 'true' || value === 'false'))\n                        ) {\n                            return '';\n                        } else {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                    })\n                    .filter(curr => {\n                        return curr !== '';\n                    });\n                providerConfig[currKey].dependencies = currDependencies;\n            }\n        } catch (err) {\n            delete providerConfig[currKey];\n            logger.warn('Invalid feature toggle and permission restrictions expression for provider: ', {\n                key: currKey\n            });\n        }\n    });\n    return providerConfig;\n};\n\nexport const validatePortNumber = function (portToValidate, defaultPort) {\n    const portInt = +portToValidate;\n    if (isNaN(portInt) || portInt <= 0 || portInt >= 65535) {\n        return defaultPort;\n    }\n    return portInt;\n};\n\nexport default { _buildProviderConfig, _buildAppProviderComputed };\n","import { assertNever } from 'connections-ui/utils/types';\nimport { RenderedInstanceState } from '@genesys/apps-v2-host';\nimport { isKnown } from '@genesys/service-discovery-web-internal';\n\nexport const isTrusted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internal types are trusted and allowed\n            break;\n        case 'iframe':\n            if (!appDef.trustedDataPassing) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\nexport const isActive = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING';\n};\n\nexport const isVisible = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING' && renderedInstance.userVisible;\n};\n\nexport const isInternallyHosted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internallyHosted types are trusted and allowed\n            break;\n        case 'iframe':\n            // isKnown throws is the url is invalid, so we catch it and return false\n            try {\n                if (!isKnown(appDef.src.href, {})) {\n                    return false;\n                }\n            } catch (error) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\n//exported for testing\nexport const validationChecks = {\n    isTrusted: {\n        check: isTrusted,\n        invalidReason: 'appDefNotTrusted'\n    },\n    isActive: {\n        check: isActive,\n        invalidReason: 'instanceNotActive'\n    },\n    isVisible: {\n        check: isVisible,\n        invalidReason: 'instanceNotVisible'\n    }\n};\n\nexport type ValidationKey = keyof typeof validationChecks;\ntype InvalidReason = (typeof validationChecks)[ValidationKey]['invalidReason'];\n\ntype ValidateRenderedInstanceResult =\n    | {\n          type: 'valid';\n      }\n    | { type: 'invalid'; reasons: InvalidReason[] };\n\nexport const validateRenderedInstance = (\n    renderedInstance: RenderedInstanceState,\n    ...validations: ValidationKey[]\n): ValidateRenderedInstanceResult => {\n    const invalidReasons: InvalidReason[] = [];\n\n    for (const validation of validations) {\n        const validationConfig = validationChecks[validation];\n        const result = validationConfig.check(renderedInstance);\n        if (!result) invalidReasons.push(validationConfig.invalidReason);\n    }\n    if (invalidReasons.length > 0) {\n        return { type: 'invalid', reasons: invalidReasons };\n    }\n    return { type: 'valid' };\n};\n","import { typeOf, isPresent } from '@ember/utils';\nimport { assertNever, hasKey } from './types';\nimport { AppDef, AppLogDetails, Asset } from '@genesys/apps-v2-host';\nimport { StashLoggerLogPayload } from '@connections-ui/services';\n\n// General Constants\nexport const SDK_REPO_URL = 'https://github.com/MyPureCloud/client-app-sdk';\n\n// Namespaces for logging, metrics, etc\nexport const LOG_ROOT_NAMESPACE = 'PureCloud Client Apps';\nexport const LOG_STANDALONE_APP_NAMESPACE = 'Standalone App';\nexport const LOG_API_NAMESPACE = 'API';\nexport const LOG_INTERAPPTIONS_NAMESPACE = 'Interapptions';\nconst LOG_SEPARATOR = ' - ';\n\nexport * as AppsV2 from '@genesys/apps-v2-host';\n\ntype ConversationAppContext = {\n    type: 'conversation';\n    // TODO: The actual type is an ember model, InteractionModel; use when this type is available.\n    payload: any;\n    id: string;\n};\n\nexport type AppContext = ConversationAppContext;\n\ntype AppDefV1VectorAsset = { vector: string };\ntype AppDefV1GuxAsset = { guxIcon: { name: string; decorative: boolean } };\ntype AppDefV1AssetSrcSet = { raster: Record<`x${number}`, string> };\nexport type AppDefV1Asset = Partial<AppDefV1GuxAsset & AppDefV1VectorAsset & AppDefV1AssetSrcSet>;\n\ntype AppLogDetailsObject = ReturnType<AppLogDetails['getLogs']>;\n\nexport default {\n    SDK_REPO_URL,\n    LOG_ROOT_NAMESPACE,\n    LOG_STANDALONE_APP_NAMESPACE,\n    LOG_API_NAMESPACE,\n    LOG_INTERAPPTIONS_NAMESPACE,\n\n    buildLogMsg(msg: string, ...subNamespaces: string[]) {\n        let tokens = [LOG_ROOT_NAMESPACE];\n\n        if (subNamespaces.length > 0) {\n            subNamespaces.forEach(currNamespace => {\n                if (typeOf(currNamespace) !== 'string' || !isPresent(currNamespace)) {\n                    throw new Error('invalidNamespaceValue');\n                } else {\n                    tokens.push(currNamespace);\n                }\n            });\n        }\n\n        if (typeOf(msg) !== 'string' || !isPresent(msg)) {\n            throw new Error('invalidMessage');\n        } else {\n            tokens.push(msg);\n        }\n\n        return tokens.join(LOG_SEPARATOR);\n    },\n\n    buildApiLogMsg(msg: string) {\n        return this.buildLogMsg(msg, LOG_API_NAMESPACE);\n    },\n\n    buildStandaloneAppLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_STANDALONE_APP_NAMESPACE, ...subNamespaces);\n    },\n\n    buildInterapptionsLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_INTERAPPTIONS_NAMESPACE, ...subNamespaces);\n    },\n\n    buildStashLoggerDetails(logDetails: Partial<AppLogDetailsObject> = {}): StashLoggerLogPayload {\n        const details: StashLoggerLogPayload = { ...logDetails.data };\n        details.remoteData = { ...logDetails.remote };\n        if (logDetails.mask) {\n            details.remoteData.sensitive = { ...logDetails.mask };\n        }\n        return details;\n    },\n\n    buildViewId(id: string) {\n        return `app_${id.replaceAll('&', '_')}`;\n    },\n\n    isAppDefV2(toCheck: unknown): toCheck is AppDef {\n        if (!toCheck || typeof toCheck !== 'object' || !hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n            return false;\n        }\n        return (\n            ['iframe', 'elementSingletonAppDef', 'elementFactoryAppDef', 'dynaWebComp'] as ReadonlyArray<string>\n        ).includes(toCheck.type);\n    },\n\n    isAppContext(toCheck: unknown): toCheck is AppContext {\n        if (!toCheck || typeof toCheck !== 'object') {\n            return false;\n        }\n\n        if (\n            !hasKey(toCheck, 'type') ||\n            typeof toCheck.type !== 'string' ||\n            !['conversation'].includes(toCheck.type)\n        ) {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'id') || typeof toCheck.id !== 'string') {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'payload') || typeof toCheck.payload !== 'object' || !toCheck.payload) {\n            return false;\n        }\n\n        return true;\n    },\n\n    buildV1IconAsset(asset: Asset): AppDefV1Asset {\n        const { type } = asset;\n        switch (type) {\n            case 'remoteVectorImage':\n                return {\n                    vector: asset.url.href\n                };\n            case 'remoteRasterImage':\n                if (asset.width !== asset.height) {\n                    return {};\n                }\n                return {\n                    raster: {\n                        [`x${asset.width}`]: asset.url.href\n                    }\n                };\n            case 'remoteRasterImageSet':\n                const raster = Object.fromEntries(\n                    asset.images\n                        .filter(curr => curr.width === curr.height)\n                        .map<[string, string]>(curr => {\n                            return [`x${curr.width}`, curr.url.href];\n                        })\n                );\n\n                if (Object.keys(raster).length === 0) {\n                    return {};\n                }\n\n                return {\n                    raster\n                };\n            case 'sparkV3SvgSprite':\n                return {\n                    guxIcon: {\n                        name: asset.classNames.join(' '),\n                        decorative: true\n                    }\n                };\n            default:\n                assertNever(type);\n        }\n    },\n\n    buildV2IconAsset(asset: AppDefV1Asset): Asset | undefined {\n        if (!asset || typeof asset !== 'object') {\n            return undefined;\n        }\n        if (asset.guxIcon && typeof asset.guxIcon.name === 'string') {\n            return {\n                type: 'sparkV3SvgSprite',\n                classNames: [asset.guxIcon.name]\n            };\n        } else if (typeof asset.vector === 'string') {\n            try {\n                return {\n                    type: 'remoteVectorImage',\n                    url: new URL(asset.vector)\n                };\n            } catch (_) {\n                return undefined;\n            }\n        } else if (asset.raster && typeof asset.raster === 'object') {\n            // Look though raster props and validate the url\n            const RASTER_PROP_PATTERN = /^x(\\d+)$/;\n            const rasterEntries = Object.entries(asset.raster)\n                .filter(([currProp]) => RASTER_PROP_PATTERN.test(currProp))\n                .filter((toCheck): toCheck is [string, string] => typeof toCheck[1] === 'string');\n            const images = rasterEntries.reduce<Array<{ width: number; height: number; url: URL }>>(\n                (result, [currRasterProp, currRasterValue]) => {\n                    let url;\n                    try {\n                        url = new URL(currRasterValue);\n                    } catch (_) {\n                        // TODO: Log invalid asset url\n                        return result;\n                    }\n\n                    const match = RASTER_PROP_PATTERN.exec(currRasterProp);\n                    if (!match) {\n                        return result;\n                    }\n\n                    const size = parseInt(match[1], 10);\n                    if (isNaN(size)) {\n                        return result;\n                    }\n\n                    result.push({\n                        width: size,\n                        height: size,\n                        url\n                    });\n\n                    return result;\n                },\n                []\n            );\n\n            if (images.length === 1) {\n                const { url, width, height } = images[0];\n                return {\n                    type: 'remoteRasterImage',\n                    url,\n                    width,\n                    height\n                };\n            }\n\n            if (images.length > 1) {\n                return {\n                    type: 'remoteRasterImageSet',\n                    images\n                };\n            }\n        }\n        return undefined;\n    }\n};\n","import { noop } from 'lodash';\n\nexport type PromiseResolve<T> = NonNullable<Parameters<Promise<T>['then']>[0]>;\nexport type PromiseReject<T> = NonNullable<Parameters<Promise<T>['catch']>[0]>;\n\nexport type DeferredPromise<T> = {\n    promise: Promise<T>;\n    resolve: PromiseResolve<T>;\n    reject: PromiseReject<T>;\n};\n\nexport const deferPromise = <T>(): DeferredPromise<T> => {\n    let resolve: PromiseResolve<T> = noop;\n    let reject: PromiseReject<T> = noop;\n\n    const promise = new Promise<T>((res, rej) => {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise, resolve, reject };\n};\n","import { parse } from 'boon-js';\n\nexport function buildSymbolMap(expression, symbolEvaluator) {\n    if (typeof expression !== 'string' || expression === '') {\n        throw new Error('Missing/invalid expression');\n    }\n    if (typeof symbolEvaluator !== 'object' || symbolEvaluator === null || Object.keys(symbolEvaluator).length === 0) {\n        throw new Error('Missing/invalid symbol evaluator');\n    }\n\n    const symbolMap = {};\n\n    const identifiers = parse(expression)\n        .filter(curr => {\n            return curr.name == 'IDENTIFIER';\n        })\n        .map(curr => {\n            return curr.value;\n        });\n\n    if (identifiers.length === 0) {\n        throw new Error('No Identifiers Found');\n    }\n\n    identifiers.forEach(currIdentifier => {\n        const ns = currIdentifier.split(':')[0];\n        let variable = currIdentifier.substring(ns.length + 1);\n        if (!ns || !variable || ns === '' || variable === '') {\n            throw new Error('Invalid identifier');\n        }\n        const nsSymbolEvaluator = symbolEvaluator[ns];\n        if (typeof nsSymbolEvaluator !== 'function') {\n            throw new Error('Missing/Invalid namespace symbol evaluator');\n        }\n        try {\n            symbolMap[`${ns}:${variable}`] = nsSymbolEvaluator(variable);\n        } catch (error) {\n            throw new Error('Namespace symbol evaluator threw');\n        }\n    });\n\n    return symbolMap;\n}\n\nconst expressionBuilder = (operator, conditions) => {\n    return `(${conditions.join(` ${operator} `)})`;\n};\n\nexport const and = function (...conditions) {\n    return expressionBuilder('AND', conditions);\n};\n\nexport const or = function (...conditions) {\n    return expressionBuilder('OR', conditions);\n};\n\nexport const not = condition => `(NOT (${condition}))`;\n\nexport const ft = name => `ft:${name}`;\n\nexport const perm = name => `perm:${name}`;\n\nexport const bool = name => `bool:${name}`;\n","define(\"connections-ui/utils/browser\", [\"exports\", \"ember-purecloud-components/utils/browser\"], function (_exports, _browser) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _browser.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/code-utils\", [\"exports\", \"ember-purecloud-components/utils/code-utils\"], function (_exports, _codeUtils) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _codeUtils.default;\n    }\n  });\n});\n","export function isGuid(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isAppleURN(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^urn:mbid:/);\n}\n/**\n * Get userId\n * @param user participant.\n * @returns {string or undefined} the userId\n */\nexport const userGuidFromParticipant = (user: any) => {\n    if (!user) {\n        return;\n    }\n\n    const { userId, userUri } = user;\n\n    if (userId) {\n        return userId;\n    }\n    if (userUri) {\n        return userUri.substring(userUri.lastIndexOf('/') + 1);\n    }\n};\n\n/**\n * Convert size in bytes to KB, MB, GB or GB.\n * @param contentLength file size in bytes to be converted against.\n * @returns {string} the converted value with the correct unit.\n */\nexport function formatSize(contentLength: number): string {\n    const units = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n    const i = Math.floor(Math.log(contentLength) / Math.log(1000));\n\n    if (!+contentLength) return '0bytes';\n    return `${parseFloat((contentLength / Math.pow(1000, i)).toFixed(1))}${units[i]}`;\n}\n","/*\n  DEPRECATION NOTICE:  this file has been moved to `ember-purecloud-components`\n  and will be removed.  Please use './node_modules/ember-purecloud-components/addon/utils/dates.js'\n  instead.\n*/\n\nimport moment from 'ember-purecloud-components/utils/dates';\nimport {\n    displayDateRelativeToToday,\n    generateCurrentInterval,\n    splitIntervalString,\n    timeInMillis\n} from 'ember-purecloud-components/utils/dates';\n\nexport default moment;\n\nexport { displayDateRelativeToToday, generateCurrentInterval, splitIntervalString, timeInMillis };\n","define(\"connections-ui/utils/debug-backburner\", [\"exports\", \"ember-purecloud-components/utils/debug-backburner\"], function (_exports, _debugBackburner) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugBackburner.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/debug-rsvp\", [\"exports\", \"ember-purecloud-components/utils/debug-rsvp\"], function (_exports, _debugRsvp) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _debugRsvp.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/display-geolocation\", [\"exports\", \"ember-purecloud-components/utils/display-geolocation\"], function (_exports, _displayGeolocation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _displayGeolocation.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/email-types/draft-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email-types/email-type\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","define(\"connections-ui/utils/email\", [\"exports\", \"ember-purecloud-components/utils/email\"], function (_exports, _email) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _email.default;\n    }\n  });\n});\n","define(\"connections-ui/utils/ember-types\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n});\n","const API_ERROR_MESSAGES = {\n    userNotAssignedNumber: 'USER_NOT_ASSIGNED_TO_NUMBER',\n    e911Support: 'NUMBER_DOES_NOT_SUPPORT_ENHANCED_911',\n    invalidCity: 'INVALID_CITY',\n    notValidNumber: 'PHONE_NUMBER_NOT_US_OR_CA'\n};\n\nconst getErrorString = function (err, defaultMessage) {\n    let errorMessage = defaultMessage || 'emergencyLocation.errors.e911LocationSet';\n\n    if (err.payload && err.payload.message) {\n        const messageType = err.payload.message;\n        switch (messageType) {\n            case API_ERROR_MESSAGES.userNotAssignedNumber:\n                errorMessage = 'emergencyLocation.errors.userNotAssignedNum';\n                break;\n            case API_ERROR_MESSAGES.e911Support:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n            case API_ERROR_MESSAGES.invalidCity:\n                errorMessage = 'emergencyLocation.errors.invalidAddressProvided';\n                break;\n            case API_ERROR_MESSAGES.notValidNumber:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n        }\n    }\n    return errorMessage;\n};\n\nexport default {\n    getErrorString\n};\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😆',\n        '😂',\n        '😉',\n        '😏',\n        '😊',\n        '😍',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😝',\n        '😜',\n        '😢',\n        '😭',\n        '😨',\n        '😰',\n        '😱',\n        '😠',\n        '😕',\n        '🙁',\n        '😮',\n        '😦',\n        '😧',\n        '😑',\n        '😶',\n        '😒',\n        '😬',\n        '😳',\n        '😞',\n        '😓',\n        '😅',\n        '😇',\n        '😔',\n        '😪',\n        '🥳',\n        '😷',\n        '😺',\n        '😹',\n        '😻',\n        '😼',\n        '🙀',\n        '😿',\n        '😾',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '🙌',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '🙌🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '🙌🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '🙌🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '🙌🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '🙌🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📢',\n        '📣',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    people: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊',\n        '👶',\n        '👦',\n        '👧',\n        '👨',\n        '👩',\n        '👴',\n        '👵',\n        '👨‍🎓',\n        '👩‍🎓',\n        '👨‍🏫',\n        '👩‍🏫',\n        '👨‍🌾',\n        '👩‍🌾',\n        '👨‍🍳',\n        '👩‍🍳',\n        '👨‍🔧',\n        '👩‍🔧',\n        '👨‍🏭',\n        '👩‍🏭',\n        '👨‍💼',\n        '👩‍💼',\n        '👨‍🔬',\n        '👩‍🔬',\n        '👨‍💻',\n        '👩‍💻',\n        '👨‍🎤',\n        '👩‍🎤',\n        '👨‍🎨',\n        '👩‍🎨',\n        '👨‍✈️',\n        '👩‍✈️',\n        '👨‍🚀',\n        '👩‍🚀',\n        '👨‍🚒',\n        '👩‍🚒',\n        '👮',\n        '🕵',\n        '💂',\n        '👷',\n        '💇🏼',\n        '🚶',\n        '🏃',\n        '🛌',\n        '🏇',\n        '🏂',\n        '🏌',\n        '🏄',\n        '🚣',\n        '🏊',\n        '⛹',\n        '🏋',\n        '🚴',\n        '🚵',\n        '👪',\n        '👨‍👩‍👦',\n        '👨‍👩‍👧',\n        '👨‍👩‍👧‍👦',\n        '👨‍👩‍👦‍👦',\n        '👨‍👩‍👧‍👧',\n        '👨‍👨‍👦',\n        '👨‍👨‍👧',\n        '👨‍👨‍👧‍👦',\n        '👨‍👨‍👦‍👦',\n        '👨‍👨‍👧‍👧',\n        '👩‍👩‍👦',\n        '👩‍👩‍👧',\n        '👩‍👩‍👧‍👦',\n        '👩‍👩‍👦‍👦',\n        '👩‍👩‍👧‍👧',\n        '💪',\n        '👈',\n        '👉',\n        '☝',\n        '👇',\n        '✌',\n        '🖐',\n        '✋',\n        '👌',\n        '👍',\n        '👎',\n        '👊',\n        '👋',\n        '✍',\n        '👏'\n    ],\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","const formattedEmoji = {\n    smiles: [\n        '😀',\n        '😁',\n        '😂',\n        '😉',\n        '😊',\n        '😋',\n        '😎',\n        '😐',\n        '😣',\n        '😯',\n        '😫',\n        '😴',\n        '😌',\n        '😜',\n        '😕',\n        '🙁',\n        '😳',\n        '😇',\n        '😺',\n        '😹',\n        '🙈',\n        '🙉',\n        '🙊'\n    ],\n    people: {\n        defaultSkinTone: [\n            '👶',\n            '👦',\n            '👧',\n            '🧑',\n            '👨',\n            '👩',\n            '👴',\n            '👵',\n            '👨‍🎓',\n            '👩‍🎓',\n            '👨‍🏫',\n            '👩‍🏫',\n            '👨‍🌾',\n            '👩‍🌾',\n            '👨‍🍳',\n            '👩‍🍳',\n            '👨‍🔧',\n            '👩‍🔧',\n            '👨‍🏭',\n            '👩‍🏭',\n            '👨‍💼',\n            '👩‍💼',\n            '👨‍🔬',\n            '👩‍🔬',\n            '👨‍💻',\n            '👩‍💻',\n            '👨‍🎤',\n            '👩‍🎤',\n            '👨‍🎨',\n            '👩‍🎨',\n            '👨‍✈️',\n            '👩‍✈️',\n            '👨‍🚀',\n            '👩‍🚀',\n            '👨‍🚒',\n            '👩‍🚒',\n            '👮‍♂️',\n            '👮‍♀️',\n            '🕵️‍♂️',\n            '🕵️‍♀️',\n            '💂‍♂️',\n            '💂‍♀️',\n            '👷‍♂️',\n            '👷‍♀️',\n            '💇‍♂️',\n            '💇‍♀️',\n            '🚶',\n            '🏃',\n            '🛌',\n            '🏇',\n            '🏂',\n            '🏌',\n            '🏄',\n            '🚣',\n            '🏊',\n            '⛹',\n            '🏋',\n            '🚴',\n            '🚵',\n            '💪',\n            '👈',\n            '👉',\n            '👆',\n            '👇',\n            '🖐',\n            '✋',\n            '👌',\n            '👍',\n            '👎',\n            '👊',\n            '👋',\n            '👏'\n        ],\n        lightSkinTone: [\n            '👶🏻',\n            '👦🏻',\n            '👧🏻',\n            '🧑🏻',\n            '👨🏻',\n            '👩🏻',\n            '👴🏻',\n            '👵🏻',\n            '👨🏻‍🎓',\n            '👩🏻‍🎓',\n            '👨🏻‍🏫',\n            '👩🏻‍🏫',\n            '👨🏻‍🌾',\n            '👩🏻‍🌾',\n            '👨🏻‍🍳',\n            '👩🏻‍🍳',\n            '👨🏻‍🔧',\n            '👩🏻‍🔧',\n            '👨🏻‍🏭',\n            '👩🏻‍🏭',\n            '👨🏻‍💼',\n            '👩🏻‍💼',\n            '👨🏻‍🔬',\n            '👩🏻‍🔬',\n            '👨🏻‍💻',\n            '👩🏻‍💻',\n            '👨🏻‍🎤',\n            '👩🏻‍🎤',\n            '👨🏻‍🎨',\n            '👩🏻‍🎨',\n            '👨🏻‍✈️',\n            '👩🏻‍✈️',\n            '👨🏻‍🚀',\n            '👩🏻‍🚀',\n            '👨🏻‍🚒',\n            '👩🏻‍🚒',\n            '👮🏻‍♂️',\n            '👮🏻‍♀️',\n            '🕵🏻‍♂️',\n            '🕵🏻‍♀️',\n            '💂🏻‍♂️',\n            '💂🏻‍♀️',\n            '👷🏻‍♂️',\n            '👷🏻‍♀️',\n            '💇🏻‍♂️',\n            '💇🏻‍♀️',\n            '🚶🏻',\n            '🏃🏻',\n            '🛌🏻',\n            '🏇🏻',\n            '🏂🏻',\n            '🏌🏻',\n            '🏄🏻',\n            '🚣🏻',\n            '🏊🏻',\n            '⛹🏻',\n            '🏋🏻',\n            '🚴🏻',\n            '🚵🏻',\n            '💪🏻',\n            '👈🏻',\n            '👉🏻',\n            '👆🏻',\n            '👇🏻',\n            '🖐🏻',\n            '✋🏻',\n            '👌🏻',\n            '👍🏻',\n            '👎🏻',\n            '👊🏻',\n            '👋🏻',\n            '👏🏻'\n        ],\n        mediumLightSkinTone: [\n            '👶🏼',\n            '👦🏼',\n            '👧🏼',\n            '🧑🏼',\n            '👨🏼',\n            '👩🏼',\n            '👴🏼',\n            '👵🏼',\n            '👨🏼‍🎓',\n            '👩🏼‍🎓',\n            '👨🏼‍🏫',\n            '👩🏼‍🏫',\n            '👨🏼‍🌾',\n            '👩🏼‍🌾',\n            '👨🏼‍🍳',\n            '👩🏼‍🍳',\n            '👨🏼‍🔧',\n            '👩🏼‍🔧',\n            '👨🏼‍🏭',\n            '👩🏼‍🏭',\n            '👨🏼‍💼',\n            '👩🏼‍💼',\n            '👨🏼‍🔬',\n            '👩🏼‍🔬',\n            '👨🏼‍💻',\n            '👩🏼‍💻',\n            '👨🏼‍🎤',\n            '👩🏼‍🎤',\n            '👨🏼‍🎨',\n            '👩🏼‍🎨',\n            '👨🏼‍✈️',\n            '👩🏼‍✈️',\n            '👨🏼‍🚀',\n            '👩🏼‍🚀',\n            '👨🏼‍🚒',\n            '👩🏼‍🚒',\n            '👮🏼‍♂️',\n            '👮🏼‍♀️',\n            '🕵🏼‍♂️',\n            '🕵🏼‍♀️',\n            '💂🏼‍♂️',\n            '💂🏼‍♀️',\n            '👷🏼‍♂️',\n            '👷🏼‍♀️',\n            '💇🏼‍♂️',\n            '💇🏼‍♀️',\n            '🚶🏼',\n            '🏃🏼',\n            '🛌🏼',\n            '🏇🏼',\n            '🏂🏼',\n            '🏌🏼',\n            '🏄🏼',\n            '🚣🏼',\n            '🏊🏼',\n            '⛹🏼',\n            '🏋🏼',\n            '🚴🏼',\n            '🚵🏼',\n            '💪🏼',\n            '👈🏼',\n            '👉🏼',\n            '👆🏼',\n            '👇🏼',\n            '🖐🏼',\n            '✋🏼',\n            '👌🏼',\n            '👍🏼',\n            '👎🏼',\n            '👊🏼',\n            '👋🏼',\n            '👏🏼'\n        ],\n        mediumSkinTone: [\n            '👶🏽',\n            '👦🏽',\n            '👧🏽',\n            '🧑🏽',\n            '👨🏽',\n            '👩🏽',\n            '👴🏽',\n            '👵🏽',\n            '👨🏽‍🎓',\n            '👩🏽‍🎓',\n            '👨🏽‍🏫',\n            '👩🏽‍🏫',\n            '👨🏽‍🌾',\n            '👩🏽‍🌾',\n            '👨🏽‍🍳',\n            '👩🏽‍🍳',\n            '👨🏽‍🔧',\n            '👩🏽‍🔧',\n            '👨🏽‍🏭',\n            '👩🏽‍🏭',\n            '👨🏽‍💼',\n            '👩🏽‍💼',\n            '👨🏽‍🔬',\n            '👩🏽‍🔬',\n            '👨🏽‍💻',\n            '👩🏽‍💻',\n            '👨🏽‍🎤',\n            '👩🏽‍🎤',\n            '👨🏽‍🎨',\n            '👩🏽‍🎨',\n            '👨🏽‍✈️',\n            '👩🏽‍✈️',\n            '👨🏽‍🚀',\n            '👩🏽‍🚀',\n            '👨🏽‍🚒',\n            '👩🏽‍🚒',\n            '👮🏽‍♂️',\n            '👮🏽‍♀️',\n            '🕵🏽‍♂️',\n            '🕵🏽‍♀️',\n            '💂🏽‍♂️',\n            '💂🏽‍♀️',\n            '👷🏽‍♂️',\n            '👷🏽‍♀️',\n            '💇🏽‍♂️',\n            '💇🏽‍♀️',\n            '🚶🏽',\n            '🏃🏽',\n            '🛌🏽',\n            '🏇🏽',\n            '🏂🏽',\n            '🏌🏽',\n            '🏄🏽',\n            '🚣🏽',\n            '🏊🏽',\n            '⛹🏽',\n            '🏋🏽',\n            '🚴🏽',\n            '🚵🏽',\n            '💪🏽',\n            '👈🏽',\n            '👉🏽',\n            '👆🏽',\n            '👇🏽',\n            '🖐🏽',\n            '✋🏽',\n            '👌🏽',\n            '👍🏽',\n            '👎🏽',\n            '👊🏽',\n            '👋🏽',\n            '👏🏽'\n        ],\n        mediumDarkSkinTone: [\n            '👶🏾',\n            '👦🏾',\n            '👧🏾',\n            '🧑🏾',\n            '👨🏾',\n            '👩🏾',\n            '👴🏾',\n            '👵🏾',\n            '👨🏾‍🎓',\n            '👩🏾‍🎓',\n            '👨🏾‍🏫',\n            '👩🏾‍🏫',\n            '👨🏾‍🌾',\n            '👩🏾‍🌾',\n            '👨🏾‍🍳',\n            '👩🏾‍🍳',\n            '👨🏾‍🔧',\n            '👩🏾‍🔧',\n            '👨🏾‍🏭',\n            '👩🏾‍🏭',\n            '👨🏾‍💼',\n            '👩🏾‍💼',\n            '👨🏾‍🔬',\n            '👩🏾‍🔬',\n            '👨🏾‍💻',\n            '👩🏾‍💻',\n            '👨🏾‍🎤',\n            '👩🏾‍🎤',\n            '👨🏾‍🎨',\n            '👩🏾‍🎨',\n            '👨🏾‍✈️',\n            '👩🏾‍✈️',\n            '👨🏾‍🚀',\n            '👩🏾‍🚀',\n            '👨🏾‍🚒',\n            '👩🏾‍🚒',\n            '👮🏾‍♂️',\n            '👮🏾‍♀️',\n            '🕵🏾‍♂️',\n            '🕵🏾‍♀️',\n            '💂🏾‍♂️',\n            '💂🏾‍♀️',\n            '👷🏾‍♂️',\n            '👷🏾‍♀️',\n            '💇🏾‍♂️',\n            '💇🏾‍♀️',\n            '🚶🏾',\n            '🏃🏾',\n            '🛌🏾',\n            '🏇🏾',\n            '🏂🏾',\n            '🏌🏾',\n            '🏄🏾',\n            '🚣🏾',\n            '🏊🏾',\n            '⛹🏾',\n            '🏋🏾',\n            '🚴🏾',\n            '🚵🏾',\n            '💪🏾',\n            '👈🏾',\n            '👉🏾',\n            '👆🏾',\n            '👇🏾',\n            '🖐🏾',\n            '✋🏾',\n            '👌🏾',\n            '👍🏾',\n            '👎🏾',\n            '👊🏾',\n            '👋🏾',\n            '👏🏾'\n        ],\n        darkSkinTone: [\n            '👶🏿',\n            '👦🏿',\n            '👧🏿',\n            '🧑🏿',\n            '👨🏿',\n            '👩🏿',\n            '👴🏿',\n            '👵🏿',\n            '👨🏿‍🎓',\n            '👩🏿‍🎓',\n            '👨🏿‍🏫',\n            '👩🏿‍🏫',\n            '👨🏿‍🌾',\n            '👩🏿‍🌾',\n            '👨🏿‍🍳',\n            '👩🏿‍🍳',\n            '👨🏿‍🔧',\n            '👩🏿‍🔧',\n            '👨🏿‍🏭',\n            '👩🏿‍🏭',\n            '👨🏿‍💼',\n            '👩🏿‍💼',\n            '👨🏿‍🔬',\n            '👩🏿‍🔬',\n            '👨🏿‍💻',\n            '👩🏿‍💻',\n            '👨🏿‍🎤',\n            '👩🏿‍🎤',\n            '👨🏿‍🎨',\n            '👩🏿‍🎨',\n            '👨🏿‍✈️',\n            '👩🏿‍✈️',\n            '👨🏿‍🚀',\n            '👩🏿‍🚀',\n            '👨🏿‍🚒',\n            '👩🏿‍🚒',\n            '👮🏿‍♂️',\n            '👮🏿‍♀️',\n            '🕵🏿‍♂️',\n            '🕵🏿‍♀️',\n            '💂🏿‍♂️',\n            '💂🏿‍♀️',\n            '👷🏿‍♂️',\n            '👷🏿‍♀️',\n            '💇🏿‍♂️',\n            '💇🏿‍♀️',\n            '🚶🏿',\n            '🏃🏿',\n            '🛌🏿',\n            '🏇🏿',\n            '🏂🏿',\n            '🏌🏿',\n            '🏄🏿',\n            '🚣🏿',\n            '🏊🏿',\n            '⛹🏿',\n            '🏋🏿',\n            '🚴🏿',\n            '🚵🏿',\n            '💪🏿',\n            '👈🏿',\n            '👉🏿',\n            '👆🏿',\n            '👇🏿',\n            '🖐🏿',\n            '✋🏿',\n            '👌🏿',\n            '👍🏿',\n            '👎🏿',\n            '👊🏿',\n            '👋🏿',\n            '👏🏿'\n        ]\n    },\n    nature: [\n        '🐒',\n        '🐕',\n        '🐈',\n        '🐅',\n        '🐆',\n        '🐎',\n        '🦌',\n        '🐄',\n        '🐖',\n        '🐑',\n        '🐐',\n        '🐪',\n        '🐘',\n        '🐁',\n        '🐇',\n        '🦃',\n        '🐓',\n        '🐤',\n        '🐦',\n        '🐧',\n        '🐊',\n        '🐢',\n        '🐍',\n        '🐉',\n        '🐳',\n        '🐬',\n        '🐟',\n        '🐙',\n        '🦀',\n        '🐌',\n        '🐛',\n        '🐜',\n        '🐝',\n        '🐞',\n        '🌻',\n        '🌼',\n        '🌷',\n        '🌲',\n        '🌳',\n        '🌵',\n        '🍀',\n        '🍇',\n        '🍉',\n        '🍊',\n        '🍋',\n        '🍌',\n        '🍍',\n        '🍎',\n        '🍏',\n        '🍐',\n        '🍑',\n        '🍒',\n        '🍓',\n        '🍅',\n        '🍆',\n        '🌽',\n        '🍄'\n    ],\n    objects: [\n        '👓',\n        '👔',\n        '👕',\n        '👖',\n        '👗',\n        '👛',\n        '👜',\n        '👞',\n        '👟',\n        '👠',\n        '👢',\n        '👑',\n        '🎓',\n        '💍',\n        '🍞',\n        '🧀',\n        '🍖',\n        '🍗',\n        '🍔',\n        '🍟',\n        '🍕',\n        '🌭',\n        '🌮',\n        '🌯',\n        '🍳',\n        '🍦',\n        '🍩',\n        '🍪',\n        '🎂',\n        '🍫',\n        '🍬',\n        '🍭',\n        '🍼',\n        '☕',\n        '🎭',\n        '🎨',\n        '🚂',\n        '🚃',\n        '🚇',\n        '🚋',\n        '🚌',\n        '🚑',\n        '🚒',\n        '🚓',\n        '🚕',\n        '🚗',\n        '🚚',\n        '🚜',\n        '🚲',\n        '🚏',\n        '⛵',\n        '🛶',\n        '🚤',\n        '🚢',\n        '🛫',\n        '🚁',\n        '🚀',\n        '⌚',\n        '⏰',\n        '⏱',\n        '⭐',\n        '🌈',\n        '🌂',\n        '☔',\n        '⛄',\n        '🌊',\n        '🎃',\n        '🎄',\n        '🎈',\n        '🎉',\n        '🎊',\n        '🎁',\n        '🏆',\n        '🏅',\n        '⚽',\n        '⚾',\n        '🏀',\n        '🏐',\n        '🏈',\n        '🏉',\n        '🎾',\n        '🎱',\n        '🎳',\n        '🏏',\n        '🏑',\n        '🏒',\n        '🏓',\n        '🏸',\n        '🎯',\n        '⛳',\n        '🎣',\n        '🎿',\n        '🎮',\n        '🎤',\n        '🎧',\n        '🎷',\n        '🎸',\n        '🎹',\n        '🎺',\n        '🎻',\n        '📱',\n        '📞',\n        '📠',\n        '🔋',\n        '💻',\n        '💿',\n        '📀',\n        '🎬',\n        '📺',\n        '📷',\n        '📹',\n        '📼',\n        '🔍',\n        '🔬',\n        '🔭',\n        '💡',\n        '🔦',\n        '📕',\n        '📖',\n        '📰',\n        '💰',\n        '💳',\n        '📦',\n        '📫',\n        '📪',\n        '📝',\n        '💼',\n        '📁',\n        '📅',\n        '📋',\n        '📎',\n        '📏',\n        '📐',\n        '🔑',\n        '🔨',\n        '🔧',\n        '🔌',\n        '📡',\n        '📌'\n    ],\n    places: [\n        '🌍',\n        '🌎',\n        '🗾',\n        '🌋',\n        '🗻',\n        '🏠',\n        '🏢',\n        '🏤',\n        '🏥',\n        '🏦',\n        '🏨',\n        '🏪',\n        '🏫',\n        '🏬',\n        '🏭',\n        '🏰',\n        '⛪',\n        '⛺',\n        '🌄',\n        '🌅',\n        '🌆',\n        '🌇',\n        '🌉',\n        '🎡',\n        '🎢',\n        '💈',\n        '📍',\n        '🇦🇨',\n        '🇦🇩',\n        '🇦🇪',\n        '🇦🇫',\n        '🇦🇬',\n        '🇦🇮',\n        '🇦🇱',\n        '🇦🇲',\n        '🇦🇴',\n        '🇦🇶',\n        '🇦🇷',\n        '🇦🇸',\n        '🇦🇹',\n        '🇦🇺',\n        '🇦🇼',\n        '🇦🇽',\n        '🇦🇿',\n        '🇧🇦',\n        '🇧🇧',\n        '🇧🇩',\n        '🇧🇪',\n        '🇧🇫',\n        '🇧🇬',\n        '🇧🇭',\n        '🇧🇮',\n        '🇧🇯',\n        '🇧🇱',\n        '🇧🇲',\n        '🇧🇳',\n        '🇧🇴',\n        '🇧🇶',\n        '🇧🇷',\n        '🇧🇸',\n        '🇧🇹',\n        '🇧🇻',\n        '🇧🇼',\n        '🇧🇾',\n        '🇧🇿',\n        '🇨🇦',\n        '🇨🇨',\n        '🇨🇩',\n        '🇨🇫',\n        '🇨🇬',\n        '🇨🇭',\n        '🇨🇮',\n        '🇨🇰',\n        '🇨🇱',\n        '🇨🇲',\n        '🇨🇳',\n        '🇨🇴',\n        '🇨🇵',\n        '🇨🇷',\n        '🇨🇺',\n        '🇨🇻',\n        '🇨🇼',\n        '🇨🇽',\n        '🇨🇾',\n        '🇨🇿',\n        '🇩🇪',\n        '🇩🇬',\n        '🇩🇯',\n        '🇩🇰',\n        '🇩🇲',\n        '🇩🇴',\n        '🇩🇿',\n        '🇪🇦',\n        '🇪🇨',\n        '🇪🇪',\n        '🇪🇬',\n        '🇪🇭',\n        '🇪🇷',\n        '🇪🇸',\n        '🇪🇹',\n        '🇪🇺',\n        '🇫🇮',\n        '🇫🇯',\n        '🇫🇰',\n        '🇫🇲',\n        '🇫🇴',\n        '🇫🇷',\n        '🇬🇦',\n        '🇬🇧',\n        '🇬🇩',\n        '🇬🇪',\n        '🇬🇫',\n        '🇬🇬',\n        '🇬🇭',\n        '🇬🇮',\n        '🇬🇱',\n        '🇬🇲',\n        '🇬🇳',\n        '🇬🇵',\n        '🇬🇶',\n        '🇬🇷',\n        '🇬🇸',\n        '🇬🇹',\n        '🇬🇺',\n        '🇬🇼',\n        '🇬🇾',\n        '🇭🇰',\n        '🇭🇲',\n        '🇭🇳',\n        '🇭🇷',\n        '🇭🇹',\n        '🇭🇺',\n        '🇮🇨',\n        '🇮🇩',\n        '🇮🇪',\n        '🇮🇱',\n        '🇮🇲',\n        '🇮🇳',\n        '🇮🇴',\n        '🇮🇶',\n        '🇮🇷',\n        '🇮🇸',\n        '🇮🇹',\n        '🇯🇪',\n        '🇯🇲',\n        '🇯🇴',\n        '🇯🇵',\n        '🇰🇪',\n        '🇰🇬',\n        '🇰🇭',\n        '🇰🇮',\n        '🇰🇲',\n        '🇰🇳',\n        '🇰🇵',\n        '🇰🇷',\n        '🇰🇼',\n        '🇰🇾',\n        '🇰🇿',\n        '🇱🇦',\n        '🇱🇧',\n        '🇱🇨',\n        '🇱🇮',\n        '🇱🇰',\n        '🇱🇷',\n        '🇱🇸',\n        '🇱🇹',\n        '🇱🇺',\n        '🇱🇻',\n        '🇱🇾',\n        '🇲🇦',\n        '🇲🇨',\n        '🇲🇩',\n        '🇲🇪',\n        '🇲🇫',\n        '🇲🇬',\n        '🇲🇭',\n        '🇲🇰',\n        '🇲🇱',\n        '🇲🇲',\n        '🇲🇳',\n        '🇲🇴',\n        '🇲🇵',\n        '🇲🇶',\n        '🇲🇷',\n        '🇲🇸',\n        '🇲🇹',\n        '🇲🇺',\n        '🇲🇻',\n        '🇲🇼',\n        '🇲🇽',\n        '🇲🇾',\n        '🇲🇿',\n        '🇳🇦',\n        '🇳🇨',\n        '🇳🇪',\n        '🇳🇫',\n        '🇳🇬',\n        '🇳🇮',\n        '🇳🇱',\n        '🇳🇴',\n        '🇳🇵',\n        '🇳🇷',\n        '🇳🇺',\n        '🇳🇿',\n        '🇴🇲',\n        '🇵🇦',\n        '🇵🇪',\n        '🇵🇫',\n        '🇵🇬',\n        '🇵🇭',\n        '🇵🇰',\n        '🇵🇱',\n        '🇵🇲',\n        '🇵🇳',\n        '🇵🇷',\n        '🇵🇸',\n        '🇵🇹',\n        '🇵🇼',\n        '🇵🇾',\n        '🇶🇦',\n        '🇷🇪',\n        '🇷🇴',\n        '🇷🇸',\n        '🇷🇺',\n        '🇷🇼',\n        '🇸🇦',\n        '🇸🇧',\n        '🇸🇨',\n        '🇸🇩',\n        '🇸🇪',\n        '🇸🇬',\n        '🇸🇭',\n        '🇸🇮',\n        '🇸🇯',\n        '🇸🇰',\n        '🇸🇱',\n        '🇸🇲',\n        '🇸🇳',\n        '🇸🇴',\n        '🇸🇷',\n        '🇸🇸',\n        '🇸🇹',\n        '🇸🇻',\n        '🇸🇽',\n        '🇸🇾',\n        '🇸🇿',\n        '🇹🇦',\n        '🇹🇨',\n        '🇹🇩',\n        '🇹🇫',\n        '🇹🇬',\n        '🇹🇭',\n        '🇹🇯',\n        '🇹🇰',\n        '🇹🇱',\n        '🇹🇲',\n        '🇹🇳',\n        '🇹🇴',\n        '🇹🇷',\n        '🇹🇹',\n        '🇹🇻',\n        '🇹🇼',\n        '🇹🇿',\n        '🇺🇦',\n        '🇺🇬',\n        '🇺🇸',\n        '🇺🇾',\n        '🇺🇿',\n        '🇻🇦',\n        '🇻🇨',\n        '🇻🇪',\n        '🇻🇬',\n        '🇻🇮',\n        '🇻🇳',\n        '🇻🇺',\n        '🇼🇫',\n        '🇼🇸',\n        '🇽🇰',\n        '🇾🇪',\n        '🇾🇹',\n        '🇿🇦',\n        '🇿🇲',\n        '🇿🇼'\n    ],\n    symbols: [\n        '🚦',\n        '🚧',\n        '⚡',\n        '🔈',\n        '🔔',\n        '🎵',\n        '💱',\n        '💲',\n        '📈',\n        '📉',\n        '📊',\n        '🔒',\n        '🔓',\n        '⛔',\n        '🚫',\n        '▶',\n        '⏩',\n        '⏭',\n        '⏯',\n        '⏪',\n        '⏮',\n        '⏸',\n        '⏹',\n        '⏺',\n        '✅',\n        '✔',\n        '✖',\n        '➕',\n        '➖',\n        '➗',\n        '‼',\n        '⁉',\n        '❔',\n        '❕',\n        '💯',\n        '🔀',\n        '🔁'\n    ]\n};\nexport default formattedEmoji;\n","define(\"connections-ui/utils/emoji\", [\"exports\", \"ember-purecloud-components/utils/emoji\"], function (_exports, _emoji) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _emoji.default;\n    }\n  });\n});\n","import _ from 'lodash';\n\nimport { BASE_GROUP_FIELDS, BASE_GROUP } from '../models/group';\nimport { BASE_LOCATION_FIELDS, BASE_LOCATION } from '../models/location';\nimport { BASE_PERSON_FIELDS, BASE_PERSON } from '../models/person';\n\nexport const MULTI_ENTITY_FIELDS = _.uniq(\n    [].concat(BASE_GROUP_FIELDS).concat(BASE_LOCATION_FIELDS).concat(BASE_PERSON_FIELDS)\n);\n\nexport const FL = {\n    all: {\n        fl: MULTI_ENTITY_FIELDS.join(',')\n    },\n    group: {\n        fl: BASE_GROUP\n    },\n    person: BASE_PERSON,\n    location: BASE_LOCATION\n};\n","export default ['error.ininedgecontrol.sesion.inactive'];\n","import Ember from 'ember';\n\nconst HTMLChars = [\n    {\n        char: '&',\n        escaped: '&amp;'\n    },\n    {\n        char: '<',\n        escaped: '&lt;'\n    },\n    {\n        char: '>',\n        escaped: '&gt;'\n    },\n    {\n        char: '\"',\n        escaped: '&quot;'\n    },\n    {\n        char: \"'\",\n        escaped: '&apos;'\n    }\n];\n\nfunction regExpEscape(literal_string) {\n    return literal_string.replace(/[-[\\]{}()*+!<=:?.\\/\\\\^$|#\\s,]/g, '\\\\$&');\n}\n\nexport default function escape(obj) {\n    if (obj === null || typeof obj === 'function') {\n        return null;\n    }\n    if (typeof obj === 'string') {\n        const escapedString = Ember.Handlebars.Utils.escapeExpression(obj);\n        // [RELATE-2592] allow single quotes to make it through the escape pass\n        return escapedString.replace(/&#x27;/g, `'`);\n    }\n    if (typeof obj !== 'object') {\n        return obj;\n    }\n    const clone = JSON.parse(JSON.stringify(obj));\n    Object.keys(clone).forEach(k => {\n        clone[k] = escape(clone[k]);\n    });\n    // maintain keys with value of undefined (these get lost in the clone)\n    Object.keys(obj).forEach(k => {\n        // fixup SafeString items that looked like objects\n        if (Ember.String.isHTMLSafe(obj[k])) {\n            clone[k] = obj[k].toString();\n        }\n        if (Object.prototype.hasOwnProperty.call(obj, k) && typeof obj[k] === 'undefined') {\n            clone[k] = undefined;\n        }\n    });\n    return clone;\n}\n\nexport function unescape(obj) {\n    if (typeof obj === 'string') {\n        let theString = obj;\n        HTMLChars.forEach(char => {\n            // replaceAll isn't available until Chrome 85, so unit tests failed\n            // This regex method works, just not as clean\n            theString = theString.replace(new RegExp(regExpEscape(char.escaped), 'g'), char.char);\n        });\n\n        return theString;\n    } else {\n        return obj;\n    }\n}\n","class ExponentialIntervalGenerator {\n    constructor(maxInterval, baselineInterval = 0) {\n        this._failures = 0;\n        this._baselineInterval = baselineInterval;\n        this._maxAdditionalInterval = maxInterval - baselineInterval;\n    }\n\n    fail() {\n        this._failures++;\n    }\n\n    reset() {\n        this._failures = 0;\n    }\n\n    getInterval() {\n        /*\n         The max interval is determined by the following equation:\n\n         2^k - 1\n\n         We then multiple it by 1000 to convert it to milliseconds.\n         */\n        var expInterval = (Math.pow(2, this._failures) - 1) * 1000;\n        var generatedMaxInterval = Math.min(expInterval, this._maxAdditionalInterval);\n\n        // Get a random interval amount so that we don't flood the server with reconnect\n        // requests from every single user at the same time.\n        var interval = this._baselineInterval + Math.random() * generatedMaxInterval;\n        return interval;\n    }\n}\n\nexport default ExponentialIntervalGenerator;\n","import { messagingChannelTypes, getDisplayOrScreenName, messagingChannelTypeFor } from './message-channels';\nimport Ember from 'ember';\nimport { CHANNEL_MODEL_TYPE } from 'connections-ui/services/relate';\n\nexport const I18N_INFO = {\n    updateChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPrompt',\n    updateChannelInfoPromptPlural: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPromptPlural',\n    updateAllChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateAllChannelInfoPrompt',\n    newChannelPrompt: 'purecloud.acdInteraction.relate.displayProfile.newChannelPrompt',\n    pleaseWaitForFullContactInfo: 'purecloud.acdInteraction.relate.displayProfile.pleaseWaitForFullContactInfo',\n    propertyChanged: 'purecloud.acdInteraction.relate.channelTypes'\n};\n\nexport const ID = 'id';\nexport const IDS = 'ids';\nexport const USER_ID = 'userId';\nconst CHANNEL_ID_PROPERTY = 'channelIdProperty';\nconst CHANNEL_TYPE = 'type';\nconst IS_NEW_CHANNEL = 'isNewChannel';\nconst AGENT_RESPONDED_TO_PROMPT = 'agentRespondedToPrompt';\nconst CHANGES_IGNORED_BY_AGENT = 'changesIgnoredByAgent';\n\nexport const CHANNEL_RECORD_PROPERTIES = [\n    CHANNEL_TYPE,\n    CHANNEL_ID_PROPERTY,\n    IS_NEW_CHANNEL,\n    CHANGES_IGNORED_BY_AGENT,\n    AGENT_RESPONDED_TO_PROMPT,\n    USER_ID,\n    IDS,\n    ID\n];\n\n// Refer to the message-interaction.js MESSENGER_TYPE const for these values.  Could use DRYing\nexport const KNOWN_INBOUND_MESSAGE_SUBTYPES = [\n    ...messagingChannelTypes.map(messagingChannelType => messagingChannelType.type)\n];\n\n/**\n * Used to return the \"class\" of an Ember component `call`ing this function; e.g.\n * `componentClassName.call(this)`\n *\n * Used primarily to include a query parameter in a REST endpoint call to identify a component responsible for making the call.\n */\nexport function componentClassName() {\n    try {\n        return encodeURIComponent(this.toString());\n    } catch (e) {\n        return 'COMPONENT_UNKNOWN';\n    }\n}\n\nexport function isInboundMessageType(interaction) {\n    return interaction && KNOWN_INBOUND_MESSAGE_SUBTYPES.includes(getMessengerType(interaction));\n}\n\nexport function getMessengerType(interaction) {\n    return interaction && interaction.get('subMessageType');\n}\n\nexport function getIdentifier(interaction) {\n    if (!interaction) {\n        return null;\n    }\n\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && messagingChannelType.getReverseWhitepagesLookupValue(interaction);\n}\n\nexport function getDisplayableName(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressDisplayable');\n}\n\nexport function isNewId(id, messengerType, externalContact) {\n    if (!externalContact) {\n        return true; // If the caller supplies no externalContact instance, then consider the id as being new\n    }\n    const messagingChannelType = messagingChannelTypes.find(mct => {\n        return mct.type === messengerType;\n    });\n    if (!messagingChannelType) {\n        return false; // An unrecognized messenger type, so can't determine if the ID is new or not, so return\n    }\n\n    return messagingChannelType.isNewId(messagingChannelType.getIdsFromExternalContact(externalContact), id);\n}\n\nexport function getMessageChannelType(messengerType) {\n    return messagingChannelTypes.find(messagingChannelType => {\n        return messagingChannelType.type === messengerType;\n    });\n}\n\n// Returns an external contact channel object that's specific to the interaction's `subMessageType` type,\n// populated with properties mapping to Relate's Java message channel type models (e.g. FacebookId, LineId, TwitterId, and WhatsappId).\nexport function getInteractionChannel(interaction, logger = null) {\n    if (!interaction) {\n        return null;\n    }\n    const interactionId = interaction.get('id');\n    const interactionType = interaction.get('type');\n    const messengerType = getMessengerType(interaction);\n    const messagingChannelType = messagingChannelTypeFor(messengerType);\n\n    if (!messagingChannelType) {\n        if (logger) {\n            logger.error(\n                `ACD Relate: Could not determine the messenger channel type for interaction id \"${interactionId}\" where messenger type is \"${messengerType}\" and the interaction type is \"${interactionType}\"`\n            );\n        }\n        return null;\n    }\n    const id = getIdentifier(interaction);\n    const displayOrScreenName = getDisplayOrScreenName(interaction);\n    const handle = getDisplayableName(interaction); // Returns undefined if not a Twitter interaction and that's OK because the other modelProperties functions will just ognore it\n\n    return messagingChannelType.modelProperties(id, displayOrScreenName, handle);\n}\n\nexport function notExcluded(key) {\n    return !CHANNEL_RECORD_PROPERTIES.includes(key);\n}\n\n/**\n * Sets new values into the channel record for purposes of change detection\n * @param interactionChannelProperties An object with properties and values based on a channel-record; e.g. for Facebook:\n * { displayName: 'Don Herkimer', ids: [ { scopedId: '23456' } ] }.  The source of \"new\" values for the channel gotten\n * from an interaction.\n * @param isNewChannel true if this is a new channel for the contact\n * @param contact An external contact that may (or may not) already have a channel for this interaction.  The source of\n * \"old\" values for the channel.\n * @param channelIdProperty E.g. 'id', 'ids', 'phoneNumber' etc. (see the message-channels util for details)\n * @param idPropertyName E.g. 'userId' or 'scopedId', if the channel is capable of having an array of ID objects\n * whose every key is the given property name.  Null otherwise.\n * @param channelRecord A channel-record model instance that will track changed attributes (ref. Ember DS.Model's changedAttributes method)\n */\nexport function setNewValuesInChannelRecord(\n    interactionChannelProperties,\n    isNewChannel,\n    contact,\n    channelIdProperty,\n    idPropertyName,\n    channelRecord\n) {\n    const messagingChannelType = messagingChannelTypeFor(channelRecord.get('type'));\n    // Iterate over the interaction's channel-related properties to get potentially new values\n    Object.keys(interactionChannelProperties).forEach(key => {\n        const modelKey = `${messagingChannelType.modelKey}`;\n        const contactChannelIds = !isNewChannel && IDS === key && contact.get(`${modelKey}.${key}`);\n        if (key === IDS && (contactChannelIds || isNewChannel)) {\n            addOrReplaceIdsInChannelRecord(\n                idPropertyName,\n                channelRecord,\n                interactionChannelProperties,\n                contactChannelIds\n            );\n        } else {\n            if ('id' === key) {\n                // We don't use an 'id' key in the channel record, since Ember DS will consider that to be the ID of the record.\n                // We use 'userId' to hold the value of the inbound message's (user) 'id' property.\n                channelRecord.set(USER_ID, interactionChannelProperties[key]);\n            } else if (deepNotEqual(channelRecord.get(`${key}`), interactionChannelProperties[key])) {\n                // Set this legit new value in the record\n                channelRecord.set(`${key}`, interactionChannelProperties[key]);\n            }\n        }\n    });\n}\n\nfunction getChannelRecordInfo(type, freshContactSnapshot, channelIdProperty, interaction, logger) {\n    const interactionChannel = getInteractionChannel(interaction, logger);\n    if (!interactionChannel) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return {};\n    }\n\n    const messagingChannelType = getMessageChannelType(type);\n    let attributes = {};\n    if (freshContactSnapshot) {\n        Object.assign(attributes, freshContactSnapshot.get(messagingChannelType.modelKey)); // The source for old (WRT the Ember DS channel record) values\n    }\n    const interactionChannelProperties = interactionChannel[messagingChannelType.modelKey]; // The source for new (WRT the Ember DS channelRecord) values\n    const isNewChannel = !attributes || !attributes[messagingChannelType.channelId]; // The channel's new if either there is no lineId, or twitterId, or ... property, *or* said property has no channel ID\n    if (isNewChannel) {\n        attributes = interactionChannel;\n    }\n    attributes.type = type;\n    attributes.channelIdProperty = channelIdProperty;\n    attributes.isNewChannel = isNewChannel;\n    attributes.changesIgnoredByAgent = false;\n    attributes.agentRespondedToPrompt = false;\n    const messengerType = messagingChannelType.type;\n    const idAttribute = messagingChannelType.channelId;\n    const idOrIDs =\n        freshContactSnapshot.get(`${messengerType}Id.${idAttribute}`) ||\n        interactionChannelProperties[interactionChannel.channelId];\n    if (idAttribute === IDS) {\n        attributes.userId = idOrIDs;\n    } else {\n        attributes.userId = idOrIDs;\n    }\n    // The ids, name, displayName, screenName, and phoneNumber properties for the channel record under-construction\n    // (see the channel-record model)\n    return { attributes, isNewChannel, interactionChannelProperties };\n}\n\n// Returns an Ember DS channel-record; see the model for more info.\n// The ID of the returned record is that of the interaction\nexport function push(store, interaction, freshContactSnapshot, type, channelIdProperty, logger) {\n    const { attributes, isNewChannel, interactionChannelProperties } = getChannelRecordInfo(\n        type,\n        freshContactSnapshot,\n        channelIdProperty,\n        interaction,\n        logger\n    );\n    if (!attributes) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return null;\n    }\n\n    // The channelRecord's changedAttributes function will return an object\n    // with properties storing arrayed pairs denoting an oldValue and\n    // a newValue: [oldValue, newValue], plus the numberOfChanges method that helps\n    // to determine if the inbound message introduces changes that need to be applied\n    // to the freshContactSnapshot's channel.\n    //\n    // We leverage that capability by setting values below.\n    let channelRecord;\n    Ember.run(() => {\n        // A run is required here for a successful run of the interaction-relate-profile-v2's \"should display a confirmation prompt if...\" integration test\n        channelRecord = store.push({\n            data: {\n                id: interaction.get('id'), // Use the interaction's ID as the ID for the record to allow peeks (see the peekForChannelRecord method)\n                type: CHANNEL_MODEL_TYPE,\n                attributes: attributes // The set of \"old\" values that may be updated by the forEach iterator below\n            }\n        });\n        // Add a numberOfChanges function to the channelRecord object so the confirmation prompt component can use it to\n        // determine what sort of prompt to offer the user\n        channelRecord.numberOfChanges = () => {\n            return Object.keys(channelRecord.changedAttributes()).length;\n        };\n\n        // See if the channel identifies users with an _array_ of IDs\n        const ids = interactionChannelProperties.ids;\n        // If so, grab the property of the first of those IDs to use as a property name if IDs are being added (below)\n        const idPropertyName = ids ? Object.keys(ids[0])[0] : null;\n        setNewValuesInChannelRecord(\n            interactionChannelProperties,\n            isNewChannel,\n            freshContactSnapshot,\n            channelIdProperty,\n            idPropertyName,\n            channelRecord\n        );\n    });\n    return channelRecord;\n}\n\n/**\n * Updates the contact with changes recorded by the channel Ember DS record\n * @param channelRecord\n * @param contact\n */\nexport function updateContactWithChannelChanges(channelRecord, contact) {\n    if (!channelRecord) {\n        return;\n    }\n\n    const channelRecordData = channelRecord.data;\n    const changedAttributes = channelRecord.changedAttributes();\n    const messagingChannelType = messagingChannelTypeFor(channelRecordData.type);\n    const modelKey = `${messagingChannelType.modelKey}`;\n    const modelProperties = Object.keys(messagingChannelType.modelProperties()[modelKey]);\n    Ember.run.join(() => {\n        if (channelRecordData.isNewChannel) {\n            // Set up the new channel and its id(s)\n            contact.set(`${modelKey}`, channelRecordData[`${modelKey}`]);\n        } else {\n            // Copy the updated channel's data into the contact\n            Object.keys(changedAttributes).forEach(key => {\n                if (key === USER_ID) {\n                    const channelIdProperty = `${messagingChannelType.modelKey}.${messagingChannelType.channelId}`;\n                    // We don't use an 'id' key in the record because Ember DS will consider that to be the ID of the record.\n                    // We use 'channelId' to hold the value of the inbound message's 'id' property.\n                    if (messagingChannelType.idPropertyName) {\n                        // If the there's an idPropertyName, that means the channel uses an array of objects to denote IDs\n                        const id = messagingChannelType.getIdFrom(changedAttributes[key][1]);\n                        const contactChannelIds = contact.get(`${channelIdProperty}`);\n                        contact.set(`${channelIdProperty}`, [id].concat(contactChannelIds));\n                    } else {\n                        contact.set(`${channelIdProperty}`, messagingChannelType.getIdFrom(changedAttributes[key][1]));\n                    }\n                } else if (notExcluded(key) && modelProperties.includes(key)) {\n                    contact.set(`${modelKey}.${key}`, changedAttributes[key][1]);\n                }\n            });\n        }\n\n        // Delete irrelevant, channel-record-specific properties\n        CHANNEL_RECORD_PROPERTIES.forEach(property => {\n            delete contact.get(`${modelKey}.${property}`);\n        });\n    });\n}\n\nfunction deepNotEqual(a, b) {\n    return JSON.stringify(a) !== JSON.stringify(b);\n}\n\nfunction addOrReplaceIdsInChannelRecord(idPropertyName, channelRecord, interactionChannel, contactChannelIds) {\n    // Currently, FacebookId and LineId (contacts-service Java model class names) objects\n    // (facebook-id and line-id Ember DS models) use a property named 'ids' that has an array of\n    // objects whose key/value pairs are an ID name ('scopedId' and 'userId' respectively)\n    // paired with an ID string value.\n    //\n    // E.g. a facebook-id model object will have a property named 'ids', and its value could be\n    // [ { scopedId: '1234' }, { scopedId: '5678' } ]\n    const contactChannelIdValues = contactChannelIds ? contactChannelIds.map(id => id[idPropertyName]) : [];\n    const interactionIdValues = interactionChannel.ids.map(id => {\n        return id[idPropertyName];\n    });\n    let addedIds = false;\n    const newIdValues = interactionIdValues.map(interactionId => {\n        if (!contactChannelIdValues.includes(interactionId)) {\n            addedIds = true;\n            return interactionId;\n        }\n    });\n    if (addedIds) {\n        // As of this writing (31AUG2018), there is only one element in any contact's ids array.\n        //\n        // The uncommented statement map invocation below works under this assumption.  To relax that assumption at\n        // some point in the future, use the commented-out map line below instead.\n        const ids = newIdValues.map(idVal => {\n            // const ids = contactChannelIdValues.concat(newIdValues).map(idVal => {\n            const id = {};\n            id[idPropertyName] = idVal;\n            return id;\n        });\n        // Invoking the setter on the record engages the Ember DS changed attribute logic for models\n        channelRecord.set(IDS, ids);\n    }\n}\n","export default {\n    acdDivisionPresenceProfileToggle: true, // Secondary translation fix for regions | ACE-3661\n    acdHybridToastNoActiveQueue: true, // Partially Enabled | ACE-1440\n    acdNormalizedMessages: true, // ACE-2199\n    acdOutboundWhatsApp: true, // PURE-2802 | ACE-2511\n    acdSecurePause: true, // ACE-2443\n    acdTransferPermissions: true, //PURE-4261\n    'ACT-1205': true, // ACT-1205 Adding Agent Greeting from Agent UI Settings to Preferences\n    'AGORA-137_connections-ui-contentsquare': true,\n    'ATLAS-536_EnableContentSquare': true,\n    auraACWGadgets: true, //AURA-88\n    'comui-disable-legacy-api-url': true,\n    conversationSummary3256: true, // ATEAM-1229\n    digitalFirstPURE2942: true,\n    'EC-760': true,\n    emergencyLocation: true,\n    enableUIAjaxRetryHeader: true,\n    epcDecompPresenceLabel: true,\n    'gcucc-ui-PCUCC-3734': true, // PCUCC-3734\n    'gcucc.ui.useIntegrationPresenceSourceDirectorySearch': true, // PCUCC-1007\n    groupProileNoIndividualsSave: true, // PLUG-188\n    hawkClientScreenShare: true,\n    interactionNameQueueCallingQueue: true, // ACE-1872\n    notificationOutputPicker: true,\n    'PAUI-80.PeopleUiDecomposition': true, // AGORA-446\n    playRecordingFromSelectedOutput: true,\n    'PURE-3256_useConversationDetails': true, // // ATEAM-1229\n    'PURE-6186_Scripter_Gadget_GCUI': true, // CC-4815\n    'PURE-7064_search_favorites': true,\n    'PURE3301-dynamicGroups': true,\n    'qm.release.evaluation.assignee': true, // WEM-742\n    'qm.release.evaluation.disputes': true, // WEM-689\n    relateDynamicSchema: true,\n    showVideoInThumbnail: true, // Show video on thumbnail if there is a screen stream, and participant is major, and video is not muted\n    userRecordingDownload: true, // CM-5713: feature toggle for new API to download user recordings for Calls.\n    webrtcClientNetworkProbeAutoAdjust: true,\n    webrtcDefaultDeviceProfile: true, //PURE-5609\n    webrtcDisableDeviceProfileNotifications: true, // PURE-5609\n    webrtcMMSDnsCheck: true,\n    webrtcRelayOnly: true,\n    webrtcTrackBasedActions: true,\n    webUiDarkTheme: true\n} as const;\n","export const imageTypes = [\n    'apng',\n    'avif',\n    'bmp',\n    'cur',\n    'eps',\n    'gif',\n    'ico',\n    'jpeg',\n    'jpg',\n    'png',\n    'svg',\n    'svg+xml',\n    'tif',\n    'tiff',\n    'webp'\n] as const;\nexport type ImageType = (typeof imageTypes)[number];\n\nexport const audioTypes = [\n    'aac',\n    'aif',\n    'aifc',\n    'aiff',\n    'caf',\n    'flac',\n    'm4a',\n    'm4r',\n    'mogg',\n    'mp3',\n    'oga',\n    'ogg',\n    'pcm',\n    'wav',\n    'wave',\n    'wma',\n    'wmf'\n] as const;\nexport type AudioType = (typeof audioTypes)[number];\n\nexport const videoTypes = [\n    '3g2',\n    '3gp',\n    'amv',\n    'asf',\n    'avi',\n    'f4a',\n    'f4b',\n    'f4p',\n    'f4v',\n    'flv',\n    'gifv',\n    'm4p',\n    'm4v',\n    'mkv',\n    'mng',\n    'mod',\n    'mov',\n    'mp2',\n    'mp4',\n    'mpe',\n    'mpeg',\n    'mpg',\n    'mpv',\n    'mxf',\n    'nsv',\n    'ogv',\n    'qt',\n    'rm',\n    'roq',\n    'rrc',\n    'svi',\n    'vob',\n    'webm',\n    'wmv',\n    'yuv'\n] as const;\nexport type VideoType = (typeof videoTypes)[number];\n\nexport const textDocTypes = ['doc', 'docm', 'docx', 'dot', 'dotm', 'dotx', 'odt', 'txt'] as const;\nexport type TextDocType = (typeof textDocTypes)[number];\n\nexport const pdfTypes = ['pdf'] as const;\nexport type PdfType = (typeof pdfTypes)[number];\n\nexport const powerPointTypes = ['key', 'pptx', 'pptm', 'ppt'] as const;\nexport type PowerPointType = (typeof powerPointTypes)[number];\n\nexport const excelTypes = ['xlsx', 'xls'] as const;\nexport type ExcelType = (typeof excelTypes)[number];\n","import Ember from 'ember';\n\nfunction _isSafeToFocus(selector) {\n    const currentSelectedElement = Ember.$(window.document.activeElement);\n\n    switch (selector) {\n        case '#roster-action-answer-button button':\n            // interaction roster\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.incoming-controls button.answer-call':\n            // active-call-entry\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        case '.answer-call-action-bar button.answer-call':\n            // call toast\n            if (currentSelectedElement) {\n                return currentSelectedElement.parent().hasClass('toggle-switch-container');\n            }\n            return false;\n        default:\n            return false;\n    }\n}\n\nexport function doFocus(component, selector) {\n    Ember.run.scheduleOnce('afterRender', component, function () {\n        const target = component.$(selector);\n        if (target) {\n            target.focus();\n        }\n    });\n}\n\nexport function requestFocus(scope = Ember, selector) {\n    let isSafe;\n    try {\n        isSafe = _isSafeToFocus(selector);\n    } catch (e) {\n        isSafe = false;\n    }\n\n    if (isSafe) {\n        Ember.run.next(() => {\n            doFocus(scope, selector);\n        });\n    }\n}\n","import Ember from 'ember';\nconst geolocation = navigator.geolocation;\n\nconst GeolocationUtil = Ember.Object.create({\n    hostedContext: null,\n\n    setContext(context) {\n        this.hostedContext = context;\n    },\n    fetchCurrentPostion() {\n        let context = this.get('hostedContext');\n        if (context !== null && context.isHosted() && context.requiresNativeGeolocation()) {\n            return context.requestDesktopPromise({ cmd: 'getGeolocationPosition' });\n        } else {\n            return new Ember.RSVP.Promise(function (resolve, reject) {\n                geolocation.getCurrentPosition(\n                    position => resolve(position),\n                    error => reject(error)\n                );\n            });\n        }\n    },\n\n    watchPosition(onPositionChangedFn, onErrorFn, options) {\n        return geolocation.watchPosition(onPositionChangedFn, onErrorFn, options);\n    },\n\n    clearWatch(watcher) {\n        geolocation.clearWatch(watcher);\n    },\n\n    isGeolocationAvailable() {\n        return 'geolocation' in navigator;\n    },\n\n    getCurrentPosition(success, failure) {\n        return geolocation.getCurrentPosition(success, failure);\n    }\n});\n\nexport default GeolocationUtil;\n","import request from 'ember-ajax';\n\n// see https://github.com/Giphy/GiphyAPI\n\nclass Giphy {\n    constructor(options) {\n        options = options || {};\n        this.baseUrl = 'https://api.giphy.com/v1/gifs';\n        this.apiKey = options.apiKey || 'fsibTNreYj3Co';\n    }\n\n    search(query, limit, offset) {\n        const url = `${this.baseUrl}/search`;\n        const data = {\n            q: query,\n            api_key: this.apiKey,\n            rating: 'pg',\n            fmt: 'json',\n            limit,\n            offset\n        };\n        return request(url, { data }).then(res => (Array.isArray(res.data) ? res.data : []));\n    }\n\n    random(query) {\n        const url = `${this.baseUrl}/random`;\n        const data = {\n            tag: query,\n            api_key: this.apiKey\n        };\n        return request(url, { data }).then(res => res && res.data);\n    }\n}\n\nexport default new Giphy({});\n","const gsm7Chars = [\n    '@',\n    '£',\n    '$',\n    '¥',\n    'è',\n    'é',\n    'ù',\n    'ì',\n    'ò',\n    'Ç',\n    '\\n',\n    'Ø',\n    'ø',\n    '\\r',\n    'Å',\n    'å',\n    'Δ',\n    '_',\n    'Φ',\n    'Γ',\n    'Λ',\n    'Ω',\n    'Π',\n    'Ψ',\n    'Σ',\n    'Θ',\n    'Ξ',\n    'Æ',\n    'æ',\n    'ß',\n    'É',\n    ' ',\n    '!',\n    '\"',\n    '#',\n    '¤',\n    '%',\n    '&',\n    \"'\",\n    '(',\n    ')',\n    '*',\n    '+',\n    ',',\n    '-',\n    '.',\n    '/',\n    '0',\n    '1',\n    '2',\n    '3',\n    '4',\n    '5',\n    '6',\n    '7',\n    '8',\n    '9',\n    ':',\n    ';',\n    '<',\n    '=',\n    '>',\n    '?',\n    '¡',\n    'A',\n    'B',\n    'C',\n    'D',\n    'E',\n    'F',\n    'G',\n    'H',\n    'I',\n    'J',\n    'K',\n    'L',\n    'M',\n    'N',\n    'O',\n    'P',\n    'Q',\n    'R',\n    'S',\n    'T',\n    'U',\n    'V',\n    'W',\n    'X',\n    'Y',\n    'Z',\n    'Ä',\n    'Ö',\n    'Ñ',\n    'Ü',\n    '§',\n    '¿',\n    'a',\n    'b',\n    'c',\n    'd',\n    'e',\n    'f',\n    'g',\n    'h',\n    'i',\n    'j',\n    'k',\n    'l',\n    'm',\n    'n',\n    'o',\n    'p',\n    'q',\n    'r',\n    's',\n    't',\n    'u',\n    'v',\n    'w',\n    'x',\n    'y',\n    'z',\n    'ä',\n    'ö',\n    'ñ',\n    'ü',\n    'à'\n];\nconst gsm7CharsExt = ['\\f', '^', '{', '}', '\\\\', '[', '~', ']', '|', '€'];\n\nexport default { gsm7Chars, gsm7CharsExt };\n","import Ember from 'ember';\nimport _ from 'lodash';\nimport { PUBLIC_ENVS } from './net';\n\n//For CEF:\n//_HostedContextFunctions functions:\n// - register(initData)\n// - showNotification(messageData)\n// - setUnreadMessageCount(count)\n// - doTerminateNow()\n\n//The app is considered hosted if it's running in an iframe, -or-. This class helps facilitate communication between\n//the app and its parent.\nvar HostedContext = Ember.Object.extend(Ember.Evented, {\n    applicationService: Ember.inject.service('application'),\n    logger: Ember.inject.service('stash-logger'),\n    applicationController: null,\n\n    _applicationHasFocus: true,\n    _hostType: null, //This determines whether we are actually hosted or not. Possible values: 'CEF', or null\n    _operatingSystem: '', //Mac or Windows\n    _version: '(unknown)', //Desktop application version\n\n    _hostRegion: null,\n    _supportsRegions: false,\n    _supportsUnifiedPreferences: false,\n    _supportsJabra: true,\n    _additionalPreferences: [],\n    _requiresNativeGeolocation: false,\n    runAsMediaHelper: false,\n    previousPresence: null,\n    isScreenLockedOrSleep: false,\n    hasUserAlreadyReturn: false,\n    desktopSleptAt: null,\n\n    init: function () {\n        this._super(...arguments);\n\n        const owner = Ember.getOwner(this);\n        this.set('applicationController', owner.lookup('controller:application'));\n    },\n\n    isHosted: function () {\n        return this._hostType !== null;\n    },\n\n    isHostedProp: Ember.computed(function () {\n        return this.isHosted();\n    }),\n\n    requiresNativeGeolocation: function () {\n        return this._requiresNativeGeolocation;\n    },\n\n    getRegion: function () {\n        return this._hostRegion;\n    },\n\n    supportsRegions: function () {\n        return this._supportsRegions;\n    },\n\n    supportsUnifiedPreferences: function () {\n        return this._supportsUnifiedPreferences;\n    },\n\n    supportsJabra: function () {\n        return this._supportsJabra;\n    },\n\n    isMac: function () {\n        return this._operatingSystem === 'Mac';\n    },\n\n    isWindows: function () {\n        return this._operatingSystem === 'Windows';\n    },\n\n    getAdditionalPreferences: function () {\n        return this._additionalPreferences;\n    },\n\n    doTerminateApplication: function (completion) {\n        this.get('logger').log('in doTerminationApplication with completion: ' + completion);\n        setTimeout(function () {\n            if (completion) {\n                completion();\n            }\n        }, 2000);\n    },\n\n    applicationHasFocus: function () {\n        return window._HostedContextFunctions && window._HostedContextFunctions.doesAppHaveFocus();\n    },\n\n    showNativeNotification: function (data) {\n        window._HostedContextFunctions.showNativeNotification(data);\n    },\n\n    setUnreadMessageCount: function (count) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.setUnreadMessageCount(count);\n            }\n        } catch (e) {\n            this.get('logger').error('Error setting unread message count', { error: e });\n        }\n    },\n\n    //Send a Jabra event to the desktop.\n    //deviceID - ID of the device\n    //event - 'offhook', 'hold', 'mute', ringer'\n    //value - true or false\n    sendJabraEventToDesktop: function (deviceID, event, value) {\n        this.sendEventToDesktop(EVENTS.JABRA_EVENT, {\n            deviceID: deviceID,\n            event: event,\n            value: value\n        });\n    },\n\n    requestJabraDevices: function () {\n        return this.requestDesktopPromise({ cmd: 'requestJabraDevices' });\n    },\n\n    sendEventToDesktop: function (event, data) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.sendEventToDesktop(event, data);\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending event to desktop', { error: e });\n        }\n    },\n\n    getScreenMedia: function (callback) {\n        this.requestDesktopPromise({\n            cmd: 'getUserSelectedScreenMedia'\n        })\n            .then(function (obj) {\n                callback(obj.id);\n            })\n            .catch(function (/*reason*/) {\n                callback(null);\n            });\n    },\n\n    sendRegionToDesktop: function (region) {\n        this._hostRegion = region;\n\n        try {\n            if (this.isHosted()) {\n                let matchedRegion = _.find(PUBLIC_ENVS, { desktopId: region });\n                if (matchedRegion) {\n                    let url = `https://apps.${matchedRegion.envTld}/directory`;\n                    this.get('logger').log('Region: ' + region + ' URL: ' + url);\n                    window._HostedContextFunctions.sendRegionToDesktop(region, url);\n                } else {\n                    this.get('logger').error(`Unable to send region to desktop.  Unknown Region '${region}'`);\n                }\n            }\n        } catch (e) {\n            this.get('logger').error('Error sending region to desktop', { error: e });\n        }\n    },\n\n    getShareableScreens() {\n        return this.requestDesktopPromise({\n            cmd: 'getShareableScreens'\n        });\n    },\n\n    requestDesktopPromise: function (cmd) {\n        return new Ember.RSVP.Promise(function (resolve, reject) {\n            try {\n                var sCmd = JSON.stringify(cmd);\n                window.cefQuery({\n                    request: sCmd,\n                    persistent: false,\n                    onSuccess: function (response) {\n                        try {\n                            var obj = JSON.parse(response);\n                            resolve(obj);\n                        } catch (e) {\n                            resolve({});\n                        }\n                    },\n                    onFailure: function (response) {\n                        reject(response);\n                    }\n                });\n            } catch (e) {\n                this.get('logger').error('Error requesting desktop promise', {\n                    error: e\n                });\n                reject();\n            }\n        });\n    }\n});\n\nexport var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded',\n    JABRA_EVENT: 'jabraEvent'\n};\n\nexport default HostedContext;\n","const INSTAGRAM_PROP = {\n    FILE_SIZE: 8,\n    MESSAGE_TYPE: 'instagram',\n    CHARACTER_LIMIT: 1000\n};\n\nexport default INSTAGRAM_PROP;\n","import Ember from 'ember';\n\nconst I18N_FALLBACKS = {\n    selectedCountry: 'Selected country',\n    countryList: 'List of countries',\n    searchPlaceholder: 'Search',\n    zeroSearchResults: 'No Results Found',\n    oneSearchResult: '1 result found',\n    multipleSearchResults: '${count} results found'\n};\n\nfunction translate(intl, key, fallback, opts) {\n    try {\n        if (!intl || typeof intl.t !== 'function') {\n            return fallback;\n        }\n        if (typeof intl.exists === 'function' && !intl.exists(key)) {\n            return fallback;\n        }\n        const value = opts ? intl.t(key, opts) : intl.t(key);\n        if (value == null) {\n            return fallback;\n        }\n        const text = value.toString();\n        return text || fallback;\n    } catch (e) {\n        return fallback;\n    }\n}\n\nexport function getLocalizedCountryName(iso2, intl, fallbackName) {\n    if (!iso2) {\n        return fallbackName || '';\n    }\n\n    try {\n        const locale = (intl.get('isoLocale') || 'en-us').split('-')[0];\n        if (typeof Intl !== 'undefined' && Intl.DisplayNames) {\n            const displayNames = new Intl.DisplayNames([locale], { type: 'region' });\n            const name = displayNames.of(iso2.toUpperCase());\n            if (name) {\n                return name;\n            }\n        }\n    } catch (e) {\n        // Intl.DisplayNames unavailable or unsupported locale — fall back below\n    }\n\n    return fallbackName || iso2.toUpperCase();\n}\n\nexport function buildSelectedCountryAriaLabel(intl, countryData, fieldName) {\n    const selectedCountryLabel = translate(\n        intl,\n        'entity.fieldTypes.phone.countrySelector.selectedCountry',\n        I18N_FALLBACKS.selectedCountry\n    );\n\n    const countryName =\n        countryData && countryData.iso2 ? getLocalizedCountryName(countryData.iso2, intl, countryData.name) : '';\n\n    const phoneType = fieldName ? String(fieldName).trim() : '';\n\n    if (phoneType && countryName) {\n        const fallback = `${phoneType}, ${countryName}, ${selectedCountryLabel}`;\n        return translate(intl, 'entity.fieldTypes.phone.countrySelector.selectedCountryWithField', fallback, {\n            name: phoneType,\n            country: countryName,\n            selectedCountry: selectedCountryLabel\n        });\n    }\n\n    if (phoneType) {\n        return `${phoneType}, ${selectedCountryLabel}`;\n    }\n\n    if (countryName) {\n        return `${countryName}, ${selectedCountryLabel}`;\n    }\n\n    return selectedCountryLabel;\n}\n\nexport function updateSelectedCountryAriaLabel($input, intl, fieldName) {\n    if (!$input || !$input.length || !$input.intlTelInput) {\n        return;\n    }\n\n    const selectedFlag = $input.closest('.iti').find('.iti__selected-flag')[0];\n    if (!selectedFlag) {\n        return;\n    }\n\n    try {\n        const countryData = $input.intlTelInput('getSelectedCountryData');\n        selectedFlag.setAttribute('aria-label', buildSelectedCountryAriaLabel(intl, countryData, fieldName));\n    } catch (e) {\n        // Plugin may not be fully initialised yet\n    }\n}\n\nexport function setupIntlTelInputAccessibility($input, intl, fieldName) {\n    if (!$input || !$input.length) {\n        return;\n    }\n\n    const update = () => updateSelectedCountryAriaLabel($input, intl, fieldName);\n\n    $input.off('countrychange.intlTelInputA11y');\n    $input.on('countrychange.intlTelInputA11y', update);\n    Ember.run.next(update);\n}\n\nexport function buildIntlTelInputI18n(intl) {\n    return {\n        selectedCountryAriaLabel: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.selectedCountry',\n            I18N_FALLBACKS.selectedCountry\n        ),\n        countryListAriaLabel: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.countryList',\n            I18N_FALLBACKS.countryList\n        ),\n        searchPlaceholder: translate(intl, 'components.navMenu.search', I18N_FALLBACKS.searchPlaceholder),\n        zeroSearchResults: translate(intl, 'groups.expressions.noResults', I18N_FALLBACKS.zeroSearchResults),\n        oneSearchResult: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.oneSearchResult',\n            I18N_FALLBACKS.oneSearchResult\n        ),\n        multipleSearchResults: translate(\n            intl,\n            'entity.fieldTypes.phone.countrySelector.multipleSearchResults',\n            I18N_FALLBACKS.multipleSearchResults\n        )\n    };\n}\n\nexport function buildIntlTelInputOptions(intl, application, extraOptions = {}) {\n    const urlprefix = (application && application.get && application.get('urlprefix')) || '';\n    return {\n        nationalMode: false,\n        utilsScript: `${urlprefix}assets/intltelinput/utils.js`,\n        i18n: buildIntlTelInputI18n(intl),\n        ...extraOptions\n    };\n}\n","const serverPrefix = 'server_translations';\n\nexport default function missingMessage(key, locales, suppressError) {\n    if (typeof suppressError === 'string') {\n        return suppressError;\n    } else if (!key) {\n        return '';\n    } else if (key.indexOf(serverPrefix) !== -1) {\n        // When a labelKey is typed in, it is user specified and typed in manually.\n        // Show this value rather than the full key if no translation was found.\n        return key.split('_').pop();\n    } else {\n        return key;\n    }\n}\n","export * from 'ember-purecloud-components/utils/jid-helpers';\n","const WHITE_SPACE_KEYCODES = {\n    TAB: 9,\n    ENTER: 13,\n    SPACE: 32\n};\n\nconst WHITE_SPACE_KEYS = {\n    TAB: 'Tab'\n};\n\nconst CAP_ALPHA_KEYCODES = {\n    A: 65,\n    B: 66,\n    C: 67,\n    D: 68,\n    E: 69,\n    F: 70,\n    G: 71,\n    H: 72,\n    I: 73,\n    J: 74,\n    K: 75,\n    L: 76,\n    M: 77,\n    N: 78,\n    O: 79,\n    P: 80,\n    Q: 81,\n    R: 82,\n    S: 83,\n    T: 84,\n    U: 85,\n    V: 86,\n    W: 87,\n    X: 88,\n    Y: 89,\n    Z: 90\n};\n\nconst LOW_ALPHA_KEYCODES = {\n    A: 97,\n    B: 98,\n    C: 99,\n    D: 100,\n    E: 101,\n    F: 102,\n    G: 103,\n    H: 104,\n    I: 105,\n    J: 106,\n    K: 107,\n    L: 108,\n    M: 109,\n    N: 110,\n    O: 111,\n    P: 112,\n    Q: 113,\n    R: 114,\n    S: 115,\n    T: 116,\n    U: 117,\n    V: 118,\n    W: 119,\n    X: 120,\n    Y: 121,\n    Z: 122\n};\n\nconst NUM_KEYCODES = {\n    0: 48,\n    1: 49,\n    2: 50,\n    3: 51,\n    4: 52,\n    5: 53,\n    6: 54,\n    7: 55,\n    8: 56,\n    9: 57\n};\n\nconst NAV_KEYCODES = {\n    LEFT_ARROW: 37,\n    UP_ARROW: 38,\n    RIGHT_ARROW: 39,\n    DOWN_ARROW: 40\n};\n\nconst ESCAPE_KEYCODE = 27;\n\ntype KeyCodeSet = { [x: string]: number };\n\nexport function keyForKeyCode(keyCode: number, object: KeyCodeSet) {\n    let key: string;\n    for (key in object) {\n        if (object.hasOwnProperty(key) && object[key] === keyCode) {\n            return key;\n        }\n    }\n    return null;\n}\n\nexport function isNumber(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NUM_KEYCODES[0] && keyCode <= NUM_KEYCODES[9];\n}\n\nexport function isAlphabet(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        (keyCode >= CAP_ALPHA_KEYCODES.A && keyCode <= CAP_ALPHA_KEYCODES.Z) ||\n        (keyCode >= LOW_ALPHA_KEYCODES.A && keyCode <= LOW_ALPHA_KEYCODES.Z)\n    );\n}\n\nexport function isNavigation(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NAV_KEYCODES.LEFT_ARROW && keyCode <= NAV_KEYCODES.DOWN_ARROW;\n}\n\nexport function isWhitespace(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        keyCode === WHITE_SPACE_KEYCODES.SPACE ||\n        keyCode === WHITE_SPACE_KEYCODES.ENTER ||\n        keyCode === WHITE_SPACE_KEYCODES.TAB\n    );\n}\n\nexport function isEscape(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode === ESCAPE_KEYCODE;\n}\n\nexport function isTab(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    const key = evt.key;\n    return keyCode === WHITE_SPACE_KEYCODES.TAB || key === WHITE_SPACE_KEYS.TAB;\n}\n\nexport function eventToString(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    if (isAlphabet(evt) || isNumber(evt)) {\n        return String.fromCharCode(keyCode);\n    } else if (isNavigation(evt)) {\n        return keyForKeyCode(keyCode, NAV_KEYCODES);\n    } else if (isWhitespace(evt)) {\n        return keyForKeyCode(keyCode, WHITE_SPACE_KEYCODES);\n    } else if (isEscape(evt)) {\n        return 'ESCAPE';\n    }\n\n    return '' + keyCode;\n}\n\nexport default {\n    isAlphabet,\n    isEscape,\n    isNavigation,\n    isNumber,\n    isTab,\n    isWhitespace,\n    eventToString\n};\n","define(\"connections-ui/utils/logger\", [\"exports\", \"ember-purecloud-components/utils/logger\"], function (_exports, _logger) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _logger.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nconst hljs = window.hljs;\nhljs.configure({\n    languages: [\n        'bash',\n        'clojure',\n        'coffeescript',\n        'cpp',\n        'cs',\n        'css',\n        'elm',\n        'go',\n        'xml',\n        'handlebars',\n        'http',\n        'ini',\n        'java',\n        'javascript',\n        'json',\n        'makefile',\n        'objectivec',\n        'python',\n        'ruby',\n        'rust',\n        'sql',\n        'swift',\n        'typescript'\n    ]\n});\n\nconst markdown = window.markdownit;\n\nconst md = markdown({\n    html: false,\n    linkify: true,\n    typographer: false,\n    highlight(code, lang) {\n        if (lang === 'no-highlight') {\n            return Ember.Handlebars.Utils.escapeExpression(code);\n        } else if (lang) {\n            try {\n                return hljs.highlight(lang, code).value;\n            } catch (e) {\n                return Ember.Handlebars.Utils.escapeExpression(code);\n            }\n        } else {\n            return hljs.highlightAuto(code).value;\n        }\n    }\n});\n\nfunction isMailTo(href) {\n    return href.indexOf('mailto:') === 0;\n}\n\nfunction initializeMarkdownRendering(isApplicationRoute) {\n    const defaultRender =\n        md.renderer.rules.link_open ||\n        function (tokens, idx, options, env, self) {\n            return self.renderToken(tokens, idx, options);\n        };\n\n    md.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n        const token = tokens[idx];\n        const targetIndex = token.attrIndex('href');\n        if (targetIndex !== -1) {\n            let href = token.attrGet('href');\n            if (!isApplicationRoute(href) && !isMailTo(href)) {\n                token.attrPush(['target', '_blank']);\n                token.attrPush(['rel', 'noopener noreferrer']);\n\n                const pattern = /:\\/\\//i;\n                if (!pattern.test(href)) {\n                    token.attrSet('href', `http://${href}`);\n                }\n            }\n        }\n\n        // pass token to default renderer.\n        return defaultRender(tokens, idx, options, env, self);\n    };\n}\n\nfunction markdownToHtml(markdown) {\n    return markdown ? md.render(markdown) : '';\n}\n\nexport { markdownToHtml, initializeMarkdownRendering };\n","import _ from 'lodash';\n\nconst LAYOUTS = {};\n\nfunction registerLayout(layoutId, layout) {\n    deregisterLayout(layoutId);\n    LAYOUTS[layoutId] = layout;\n}\n\nfunction deregisterLayout(layoutId) {\n    LAYOUTS[layoutId] = null;\n    delete LAYOUTS[layoutId];\n}\n\nfunction rerunLayouts() {\n    _.forOwn(LAYOUTS, layout => {\n        if (layout && layout.rerun) {\n            layout.rerun();\n        }\n    });\n}\n\nexport { registerLayout, deregisterLayout, rerunLayouts };\n","/* global intlTelInputUtils */\n\nimport { getMessengerType, getDisplayableName, getIdentifier } from './external-contact-messaging';\n\n/**\n * A list of all the available messaging channel types in the external contact model\n */\n\nfunction getNameFrom(interaction) {\n    return interaction.get('participantForCustomer.messages.firstObject.fromAddress.name');\n}\n\nfunction getTwitterDisplayNameFrom(interaction) {\n    return (\n        getDisplayableName(interaction) ||\n        interaction.get('participantForCustomer.messages.firstObject.fromAddress.name')\n    );\n}\n\nfunction getRawAddress(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressRaw');\n}\n\nexport function getDisplayOrScreenName(interaction) {\n    if (!interaction) {\n        return null;\n    }\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && getNameFrom(interaction);\n}\n\n// Returns an object representing a channel property of an Ember DS contact model instance.\n// E.g. messagingChannelTypes[0].modelProperties(...)\nfunction getModelProperties(channelId, idProperties) {\n    const properties = {};\n    properties[channelId] = idProperties;\n    return properties;\n}\n\nexport function messagingChannelTypeFor(messageType) {\n    return messagingChannelTypes.find(messagingChannelType => messagingChannelType.type === messageType);\n}\n\nexport function modelKeyFor(messageType) {\n    const messagingChannelType = messagingChannelTypeFor(messageType);\n    return messagingChannelType ? messagingChannelType.modelKey : null;\n}\n\n// New message channel types must expose a `modelProperties` method that\n// creates an object whose structure is the same as that for that message channel's identifier\n// field in a contact model object.\n//\n// For example, a contact model instance with a Twitter channel looks like this:\n//      {\n//          id: 'df445345abdc',\n//          firstName: 'Elon',\n//          lastName: 'Musk',\n//          address: {\n//                      ...\n//                   }\n//          ...\n//          twitterId: {\n//              id: 'df445345abdc',\n//              name: 'Elon Musk'\n//              screenName: '@elonmusk\n//          }\n//          ...\n//      }\n//\n//     Thus,\n//          messagingChannelTypes.modelProperties('df445345abdc', 'Elon Musk', '@elonmusk')\n//     for a Twitter channel will return\n//          {\n//              twitterId: {\n//                  id: 'df445345abdc',\n//                  name: 'Elon Musk'\n//                  screenName: '@elonmusk\n//             }\n//          }\n//\n\n// The contacts-service returns a displayable phone number, while Smooch may send\n// an e164.  Use this to hopefully match them up.\nexport function getDisplayablePhoneNumberFrom(phoneNumber) {\n    // Assume a US country code;\n    // obviously a short-term kludge that will be unnecessary when the real bug is (hopefully quickly) fixed!\n    return intlTelInputUtils.formatNumber(phoneNumber, 'US', intlTelInputUtils.numberFormat.INTERNATIONAL);\n}\n\nfunction _getChannelPropertiesFromInteraction(interaction, channelType) {\n    const messagingChannelType = messagingChannelTypeFor(channelType);\n\n    const id = getIdentifier(interaction);\n    const displayableName = getDisplayableName(interaction);\n    const name = getDisplayableName(interaction);\n    return messagingChannelType.modelProperties(id, name, displayableName);\n}\n\n// The array of objects below represent the various inbound messaging channels.\n// The properties and functions exposed by message channel types are used for display purposes and other things.\n//\n//\n// For the hasCrucialChannelInfo functions: they should return true iff their condition holds, in service of\n// https://inindca.atlassian.net/browse/RELATE-2536: WhatsApp ACD: Allow the ACD UI to tolerate missing inbound message channel information\n//\n// \"The ACD UI should be aware of and behave tolerably in response to Smooch's updating their messaging protocol and payload, and the consequential\n// implication for possibly missing channel property values (e.g. a missing Twitter ID or handle).\"\n//\n// Although missing information should happen very rarely, the UI still needs to cope. The coping strategy is the same for any message type.\n// There are two cases:\n//\n// 1) The agent is creating a new external contact for an inbound message. The UI should not automatically populate any messaging fields.\n// Whatever info the agent supplies for the contact should be accepted and saved.\n//\n// 2) The agent has an existing contact to associate with the message. Because the message may be missing crucial information, the contact\n// is not automatically updated with the new/incomplete message channel information.\nexport const messagingChannelTypes = [\n    {\n        modelKey: 'twitterId', // The Ember DS externalcontacts/contact model's\n        channelId: 'id',\n        type: 'twitter',\n        idPropertyName: null,\n        modelProperties: function (id, name, twitterHandle) {\n            return getModelProperties(this.modelKey, {\n                id: id,\n                name: name,\n                screenName: twitterHandle\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('twitterId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'twitter'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('twitterId.id')],\n        getIdFrom: id => id,\n        display: channelId => (channelId ? (channelId.screenName ? channelId.screenName : '') : ''),\n        present: channelId => !!(channelId && channelId.screenName),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.id && channelId.screenName),\n        displayNameFrom: interaction => getTwitterDisplayNameFrom(interaction),\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null or a single-element string array with a Twitter ID\n        svgIconKey: '#icon-twitter-white-on-blue'\n    },\n    {\n        modelKey: 'lineId',\n        channelId: 'ids',\n        type: 'line',\n        idPropertyName: 'userId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ userId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('lineId')],\n        getChannelPropertiesFromInteraction: interaction => _getChannelPropertiesFromInteraction(interaction, 'line'),\n        getIdsFromExternalContact: externalContact => externalContact.get('lineId.ids'),\n        getIdFrom: userId => {\n            return {\n                userId: userId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.userId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(lineId => lineId.userId !== id),\n        svgIconKey: '#icon-line-messenger'\n    },\n    {\n        modelKey: 'facebookId',\n        channelId: 'ids',\n        type: 'facebook',\n        idPropertyName: 'scopedId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ scopedId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('facebookId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'facebook'),\n        getIdsFromExternalContact: externalContact => externalContact.get('facebookId.ids'),\n        getIdFrom: scopedId => {\n            return {\n                scopedId: scopedId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.scopedId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(facebookId => facebookId.scopedId !== id),\n        svgIconKey: '#icon-facebook-messenger'\n    },\n    {\n        modelKey: 'whatsAppId',\n        channelId: 'phoneNumber',\n        nestedIdProperty: 'display',\n        type: 'whatsapp',\n        idPropertyName: null,\n        modelProperties: function (phoneNumber, displayName) {\n            return getModelProperties(this.modelKey, {\n                displayName: displayName,\n                phoneNumber: {\n                    display: getDisplayablePhoneNumberFrom(phoneNumber)\n                }\n            });\n        },\n        getReverseWhitepagesLookupValue: interaction => {\n            const address = getRawAddress(interaction);\n            if (address && /^\\+?[\\d]+$/.test(address)) {\n                return /^\\+/gi.test(address) ? address : `+${address}`;\n            }\n            return address;\n        },\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('whatsAppId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'whatsapp'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('whatsAppId.phoneNumber')],\n        getIdFrom: phoneNumber => {\n            return {\n                display: getDisplayablePhoneNumberFrom(phoneNumber)\n            };\n        },\n        display: channelId =>\n            channelId.displayName\n                ? channelId.displayName\n                : channelId.phoneNumber.display\n                ? channelId.phoneNumber.display\n                : channelId.phoneNumber.e164\n                ? channelId.phoneNumber.e164\n                : '',\n        present: channelId => !!(channelId && channelId.phoneNumber),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.phoneNumber && channelId.phoneNumber.display),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n\n        // These two value getters are used by the confirmation-prompt component to\n        // get changes to a whatpsapp channel's displayed phone number in order to prompt\n        // the agent properly.\n        oldIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][0].display,\n        newIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][1].display,\n\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null, or a single-element string array containing an e164 phone number; id is an e164 number\n        svgIconKey: '#icon-whatsapp'\n    }\n];\n","// eslint-disable-next-line no-control-regex\nconst OnlyLatinChars = /^[\\u0000-\\u024F\\s]+$/i;\n\n/**\n * Determines if the provided name can have initials generated from it. Not all languages support\n * the ability to reduce a name to initials, such as Latin.\n *\n * @note\n * The currently unsupported characters are:\n * - Latin\n *\n * @param name the name to test with\n * @returns boolean value depicting if initials can be generated\n */\nexport function initialsSupported(name: string) {\n    return OnlyLatinChars.test(name);\n}\n\n/**\n * Generates the initials from a given name. If initials are not supported based on the characters of\n * the name provided then `null` will be returned.\n *\n * @note\n * This will adhere to a name string that has been formatted by a comma such as \"Last, First\" and will give\n * the correct initials of \"FL\" (for that instance).\n *\n * @param name the name of the initials in which to generate from\n * @returns the generated initials from the provided name, if none could be generated then `null` is returned\n */\nexport function getInitials(name: string) {\n    if (!initialsSupported(name)) return null;\n\n    const commaIndex = name.indexOf(',') > -1;\n    const spaceIndex = name.indexOf(' ') > -1;\n    const left = name[0].toUpperCase();\n    const right = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n    if (commaIndex) {\n        return right + left;\n    } else if (!spaceIndex) {\n        return left;\n    }\n    return left + right;\n}\n","import serviceDiscovery from '@genesys/service-discovery-web-internal';\n\nconst VALID_LOCAL_HOSTNAMES = ['localhost', 'localhost.mypurecloud.com'];\n\n// Change me if you want to proxy locally to a higher environment.\nconst TARGET_ENV = 'dev';\n\nconst ENV_TRANSITIONS = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'pca'\n    // DO NOT ADD NEW ENVS HERE\n    // New envs will be defaulted to their true value in service-discovery-web\n};\n\nconst DEPLOYMENT_ID_MAP = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'us',\n    'prod-apne1': 'jp',\n    'prod-apne2': 'apne2',\n    'prod-aps1': 'aps1',\n    'prod-apse2': 'au',\n    'prod-cac1': 'cac1',\n    'prod-euc1': 'de',\n    'prod-euw1': 'ie',\n    'prod-euw2': 'euw2',\n    'prod-usw2': 'usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to their name in service-discovery-web\n};\n\nconst REGION_TRANSLATION_KEY_MAP = {\n    prod: 'components.region.global',\n    'prod-apne1': 'components.region.japan',\n    'prod-apne2': 'components.region.apne2',\n    'prod-aps1': 'components.region.aps1',\n    'prod-apse2': 'components.region.australia',\n    'prod-cac1': 'components.region.cac1',\n    'prod-euc1': 'components.region.germany',\n    'prod-euw1': 'components.region.ireland',\n    'prod-euw2': 'components.region.euw2',\n    'prod-usw2': 'components.region.usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to 'name': `components.region.${name}`\n};\n\nconst getPcApplicationsSubdomain = (_window = window) => {\n    // window passed in for testing\n    const subdomain = _window.location.hostname.split('.')[0];\n    return subdomain.toLowerCase() === 'app' ? 'app' : 'apps';\n};\n\nconst getEnv = ({ env }) => ENV_TRANSITIONS[env] || env;\nconst getRegion = ({ name, region }) => DEPLOYMENT_ID_MAP[name] || region;\nconst getDeploymentId = ({ name }) => DEPLOYMENT_ID_MAP[name] || name;\nconst getRegionTranslationKey = ({ name }) => REGION_TRANSLATION_KEY_MAP[name] || `components.region.${name}`;\nconst getDesktopId = environment => {\n    const deploymentId = getDeploymentId(environment);\n    return deploymentId === 'us' ? 'global' : deploymentId;\n};\n\nconst publicEnvFilter = { env: ['prod', 'fedramp'], status: ['beta', 'stable'] };\nexport const PUBLIC_ENVS = serviceDiscovery.getEnvironments(publicEnvFilter).map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName,\n    envStatus: environment.status\n}));\n\nexport const STABLE_PUBLIC_ENVS = serviceDiscovery.getEnvironments().map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName\n}));\n\nexport const parseRuntimeCustom = (url = window.location.href) => {\n    url = url.replace(/connections-ui/, TARGET_ENV);\n    return (\n        serviceDiscovery.parseRuntimeFromLocalPath(VALID_LOCAL_HOSTNAMES)(url) ||\n        serviceDiscovery.parseDeployedRuntime(url)\n    );\n};\n\nexport const getEnvDetails = (url = window.location.href) => {\n    if (!url || typeof url !== 'string') throw new Error('url must be a non-empty string');\n    const runtime = parseRuntimeCustom(url);\n    if (!runtime) throw new Error(`'${url}' is not a valid, known Genesys Cloud app location`);\n    return {\n        runtime, // Attach the service-discovery-web runtime\n        local: runtime.local,\n        envTld: runtime.local ? new URL(url).hostname : runtime.currentDomainName,\n        env: getEnv(runtime),\n        region: ['prod', 'fedramp'].includes(runtime.env) ? getRegion(runtime) : null\n    };\n};\n\nexport const getEnvCookieDomain = (hostname = window.location.hostname) => {\n    if (!hostname || typeof hostname !== 'string') {\n        throw new Error('hostname must be a non-empty string');\n    }\n    // Handle the local special cases\n    if (hostname === 'localhost') return '';\n    if (hostname === 'localhost.mypurecloud.com') return `.localhost.mypurecloud.com`;\n\n    const result = serviceDiscovery.parseDeployedRuntime(`https://${hostname}`);\n    if (!result) throw new Error(`'${hostname}' is not a valid, known Genesys Cloud app location`);\n    return `.${result.currentDomainName}`;\n};\n\nexport const isExternalDomain = url => !serviceDiscovery.isKnown(url, {});\n\nexport const getCurrentWindowOrigin = () => window.location.origin;\n\nexport default {\n    PUBLIC_ENVS,\n    STABLE_PUBLIC_ENVS,\n    getPcApplicationsSubdomain,\n    getEnvDetails,\n    getEnvCookieDomain,\n    isExternalDomain,\n    getCurrentWindowOrigin\n};\n","define(\"connections-ui/utils/newrelic-legacy\", [\"exports\", \"ember-purecloud-components/utils/newrelic-legacy\"], function (_exports, _newrelicLegacy) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _newrelicLegacy.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\n/*\n * This is a simple wrapper for New Relic's browser agent.  The goal is to no-op\n * when the browser agent is not available on the page (due to adblockers,\n * unit-tests, etc).\n */\n\nfunction addPageAction(actionName: string, attributes?: null | Record<string, any>) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'addPageAction' in window.newrelic &&\n        typeof window.newrelic.addPageAction === 'function'\n    ) {\n        if (typeof actionName !== 'string' || !actionName.trim()) {\n            //actionName cannot be an empty string\n            Ember.Logger.error('Invalid actionName for addPageAction ->', {\n                remoteData: {\n                    actionName,\n                    actionNameType: typeof actionName\n                }\n            });\n            return;\n        }\n        if (attributes !== undefined && attributes !== null) {\n            // if not null and not undefined, attributes can be null/undefined\n            if (typeof attributes !== 'object' || Array.isArray(attributes)) {\n                Ember.Logger.error('Invalid attributes for addPageAction ->', {\n                    remoteData: {\n                        actionName,\n                        attrType: typeof attributes\n                    }\n                });\n                return;\n            } else {\n                const reservedKeys = ['accountId', 'timestamp', 'appId'];\n                attributes = Object.fromEntries(\n                    Object.entries(attributes)\n                        .map<[string, any] | null>(([key, value]) => {\n                            if (reservedKeys.includes(key)) {\n                                Ember.Logger.warn('Invalid reserved keys for addPageAction ->', {\n                                    remoteData: {\n                                        actionName,\n                                        attrKey: key\n                                    }\n                                });\n                                return null;\n                            }\n                            return [key, value];\n                        })\n                        .filter((curr): curr is [string, any] => {\n                            return !!curr;\n                        })\n                );\n            }\n        }\n        window.newrelic.addPageAction(actionName, attributes);\n    }\n}\n\nfunction setCustomAttribute(key: string, value: string | number | null | boolean, persist?: boolean) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'setCustomAttribute' in window.newrelic &&\n        typeof window.newrelic.setCustomAttribute === 'function'\n    ) {\n        if (typeof key !== 'string') {\n            Ember.Logger.error('Invalid key for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    keyType: typeof key\n                }\n            });\n            return;\n        }\n        if (value !== null && !['string', 'number', 'boolean'].includes(typeof value)) {\n            Ember.Logger.error('Invalid value for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    valueType: typeof value\n                }\n            });\n            return;\n        }\n        if (typeof persist !== 'undefined' && typeof persist !== 'boolean') {\n            Ember.Logger.error('Invalid persist for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    persistType: typeof persist\n                }\n            });\n            return;\n        }\n        window.newrelic.setCustomAttribute(key, value, persist);\n    }\n}\n\nexport { addPageAction, setCustomAttribute };\n","import Ember from 'ember';\nimport moment from './dates';\n\nconst { typeOf, Service, Application, get } = Ember;\n\n/**\n * @callback extractRawDataKeyFilter\n * @param {Array.<string>} path - An array of the ancesteral keys of this key. Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be empty for root props/indices.\n * @param {string} key The current key to evaluate; Array indices will be converted to strings\n * @returns {boolean} true if the key and its associated value should be included; false to exclude.\n *\n * @callback extractRawDataValueFilter\n * @param {Array.<string>} path - An array of the keys down to the current value.  Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be of length 1 for root values.\n * @param {*} value The current value to evaluate\n * @returns {boolean} true if the value and it's associated key should be included; false to exclude.\n */\n\nconst ALLOWED_VALUE_TYPES = [\n    'null',\n    'undefined',\n    'regexp',\n    'date',\n    'moment',\n    'boolean',\n    'number',\n    'string',\n    'array',\n    'object',\n    'instance'\n];\n\n/**\n * Extract raw data from the provided input. Practically, this can be\n * used for extracting the raw data from Ember Object instances with some gotchas:\n *\n * * Non-string keys are NOT included\n * * All non-enumerable properties are NOT included\n *   * This implicitly excludes prototype properties\n * * Certain value types are NOT included\n *   * symbol, filelist, class, error\n *   * function (computeds, observers, etc.)\n *\n * Other important items to note:\n *\n * * If any object (other than Date or moment instances) in the hierarchy implements toJSON, it will be called with the current key and the result will then be processed through the depth check, key filters, and value filters.\n * * Cycles are replaced with [Cycle] and are more likely if services or the container are referenced (Best Practice: Use the defaults to filter underscore keys and Ember Services)\n * * Depth of objects will affect efficiency (Best Practice: Remove unnecessary keys/values with filters and built-in options)\n * * Objects and arrays will be truncated with '[Object]' and '[Array(<length>)]' if the maxDepth is exceeded.\n *\n * @param {null|undefined|Array|object} input - The object to extract\n * @param {Object} options - Options for parsing the object\n * @param {number?} options.maxDepth - An integer indicating the max allowed traversal depth.  Once reached, Objects and Arrays will be replaced with '[Object]' and '[Array(<length>)]' respectively. Root properties considered at depth 1.  Defaults to no max depth.\n * @param {boolean?} options.excludeUnderscoreKeys [true] - if keys starting with _ should be excluded; defaults to true\n * @param {boolean?} options.excludeEmberServices [true] - if Ember Service values should be excluded; defaults to true\n * @param {extractRawDataKeyFilter?} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {extractRawDataValueFilter?} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @throws Error if the provided input is not undefined, null, a custom object, an Ember instance, or an array\n * @throws Error if the provided input cannot be extracted.  This could occur because of excessive depth, invalid input parameter or object structure, a faulty toJSON nested implementation, etc.\n * @throws Error if any options are invalid\n * @returns {null|undefined|Array|object} output\n */\nexport function extractRawData(input, options = {}) {\n    let safeOptions = {\n        maxDepth: Number.MAX_SAFE_INTEGER,\n        excludeUnderscoreKeys: true,\n        excludeEmberServices: true,\n        excludeEmberApplications: true\n    };\n\n    if (typeOf(options) !== 'object') {\n        throw new Error('options can only be an object if specified');\n    } else {\n        if (Object.prototype.hasOwnProperty.call(options, 'maxDepth')) {\n            if (typeOf(options.maxDepth) === 'number' && options.maxDepth < Number.MAX_SAFE_INTEGER) {\n                safeOptions.maxDepth = Math.floor(options.maxDepth);\n            } else {\n                throw new Error('maxDepth must be a number less than Number.MAX_SAFE_INTEGER if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'keyFilter')) {\n            if (typeof options.keyFilter === 'function') {\n                safeOptions.keyFilter = options.keyFilter;\n            } else {\n                throw new Error('keyFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'valueFilter')) {\n            if (typeof options.valueFilter === 'function') {\n                safeOptions.valueFilter = options.valueFilter;\n            } else {\n                throw new Error('valueFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeUnderscoreKeys')) {\n            if (typeOf(options.excludeUnderscoreKeys) === 'boolean') {\n                safeOptions.excludeUnderscoreKeys = options.excludeUnderscoreKeys.valueOf();\n            } else {\n                throw new Error('excludeUnderscoreKeys must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberServices')) {\n            if (typeOf(options.excludeEmberServices) === 'boolean') {\n                safeOptions.excludeEmberServices = options.excludeEmberServices.valueOf();\n            } else {\n                throw new Error('excludeEmberServices must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberApplications')) {\n            if (typeOf(options.excludeEmberApplications) === 'boolean') {\n                safeOptions.excludeEmberApplications = options.excludeEmberApplications;\n            } else {\n                throw new Error('excludeEmberApplications must be a boolean if specified');\n            }\n        }\n    }\n\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined'].indexOf(inputType) >= 0) {\n        return input;\n    } else if (['array', 'object', 'instance'].indexOf(inputType) >= 0) {\n        return _extractRawDataHelper(null, input, safeOptions);\n    } else {\n        throw new Error(\n            'Input must be undefined, null, a custom object (not date, moment, regexp, filelist, error, etc), an Ember Instance, or an array'\n        );\n    }\n}\n\n/**\n * Recursive raw data extraction util.\n *\n * An item of the stack used to track history in traversing a nested array/object.\n * @typedef {Object} ContextStackItem\n * @property {array|object} scope - The parent object or array of the specified property\n * @property {string} propertyName - The name of the property (or index for arrays)\n *\n * A stack used track history while traversing a nested array/object.\n * @typedef {Array.<ContextStackItem>} ContextStack\n *\n * @param {ContextStack} contextStack The stack representing the lineage of the input parameter.  If null, input is considered the root input to extract.\n * @param {*} input The current object to extract\n * @param {*} options Type-safe and valid extraction options\n * @returns {Object|string|null} raw data representation of input\n */\nfunction _extractRawDataHelper(contextStack, input, options) {\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined', 'regexp', 'date', 'moment'].indexOf(inputType) >= 0) {\n        return input;\n    }\n\n    if (['boolean', 'number', 'string'].indexOf(inputType) >= 0) {\n        if (typeof input.valueOf === 'function') {\n            return input.valueOf();\n        }\n\n        return input;\n    }\n\n    // Return null for all other cases: 'function', 'symbol', 'filelist', 'class', 'error'\n    if (['array', 'object', 'instance'].indexOf(inputType) < 0) {\n        return null;\n    }\n\n    // Found an array, object, or instance that may need to be recursed\n\n    // Check for cycles before decending\n    if (contextStack) {\n        let found = contextStack.find(currStackItem => currStackItem.scope === input);\n        if (found) {\n            return '[Cycle]';\n        }\n    }\n\n    // Check maxDepth before decending\n    let currLevel = contextStack ? contextStack.length : 0;\n\n    if (currLevel + 1 > options.maxDepth) {\n        if (inputType === 'array') {\n            return `[Array(${input.length})]`;\n        } else {\n            return '[Object]';\n        }\n    }\n\n    // Safe to recurse sub-object or array\n\n    if (inputType === 'array') {\n        return input.reduce((result, currItem, currIndex) => {\n            let currStack = buildNewContextStack(contextStack, input, currIndex.toString());\n            if (isAllowed(currStack, currItem, options)) {\n                result.push(_extractRawDataHelper(currStack, currItem, options));\n            }\n\n            return result;\n        }, []);\n    } else {\n        if (typeof input.toJSON === 'function') {\n            try {\n                let customJsonValue = input.toJSON(\n                    (contextStack && contextStack[contextStack.length - 1].propertyName) || ''\n                );\n\n                // Process the custom json value back through the _extractRawDataHelper to process filters, rules, and depth checks (max depth, fitlers, etc.)\n                // The original stack should be kept\n                return _extractRawDataHelper(contextStack, customJsonValue, options);\n            } catch (e) {\n                let wrappedJsonError = new Error('Failed to marshal nested toJSON representation');\n                wrappedJsonError.baseError = e;\n                throw wrappedJsonError;\n            }\n        }\n\n        // iterate on props\n        return Object.keys(input).reduce((acc, currKey) => {\n            let currValue = input[currKey];\n\n            let currStack = buildNewContextStack(contextStack, input, currKey);\n            if (!isAllowed(currStack, currValue, options)) {\n                return acc;\n            }\n\n            acc[currKey] = _extractRawDataHelper(currStack, input[currKey], options);\n\n            return acc;\n        }, {});\n    }\n}\n\n/**\n * Assesses if provided stack (containing the implicit curr key) and value pass various filters to be\n * included in the extracted object.\n *\n * @param {ContextStack} contextStack The historical stack from the root down to the current key\n * @param {*} value The value to check\n * @param {object} options The configurable filtering options (assumed to be valid)\n * @param {?boolean} options.excludeUnderscoreKeys [false] - if keys starting with _ should be excluded\n * @param {?boolean} options.excludeEmberServices [false] - if Ember Service values should be excluded\n * @param {?extractRawDataKeyFilter} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {?extractRawDataValueFilter} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will includ the key/value pair, false will exclude\n */\nfunction isAllowed(contextStack, value, options) {\n    let key = contextStack[contextStack.length - 1].propertyName;\n    let path = contextStack.slice(0, -1).map(curr => curr.propertyName);\n\n    // Check Filters\n    if (key) {\n        if (myTypeOf(key) !== 'string') {\n            return false;\n        }\n\n        if (options.excludeUnderscoreKeys && key.charAt(0) === '_') {\n            return false;\n        }\n\n        let keyFilter = options.keyFilter || null;\n        if (keyFilter && !keyFilter(path, key)) {\n            return false;\n        }\n    }\n\n    let valueType = myTypeOf(value);\n    if (ALLOWED_VALUE_TYPES.indexOf(valueType) < 0) {\n        return false;\n    }\n\n    if (options.excludeEmberServices && valueType === 'instance' && value instanceof Service) {\n        return false;\n    }\n\n    if (options.excludeEmberApplications && valueType === 'instance' && value instanceof Application) {\n        return false;\n    }\n\n    let valueFilter = options.valueFilter || null;\n    if (valueFilter && !valueFilter([...path, key], value)) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction buildNewContextStack(currStack, scope, propertyName) {\n    let newStackItem = {\n        scope,\n        propertyName\n    };\n\n    if (currStack) {\n        return [...currStack, newStackItem];\n    } else {\n        return [newStackItem];\n    }\n}\n\nfunction myTypeOf(value) {\n    if (typeof value === 'symbol') {\n        return 'symbol';\n    }\n\n    if (value instanceof moment) {\n        return 'moment';\n    }\n\n    return typeOf(value);\n}\n\n/**\n * Utility to determine if object is destroyed\n * or being destroyed.\n * @param obj - Ember object to check\n * @returns boolean\n */\nexport function isDestroyed(obj) {\n    return get(obj, 'isDestroyed') || get(obj, 'isDestroying');\n}\n\nexport default {\n    extractRawData\n};\n","/**\n * A common regex for many different number formats. Includes the following and more:\n *\n * 18005551234\n * 1 800 555 1234\n * +1 800 555-1234\n * +86 800 555 1234\n * 1-800-555-1234\n * 1 (800) 555-1234\n * (800)555-1234\n * (800) 555-1234\n * (800)5551234\n * 800-555-1234\n * 800.555.1234\n * 800 555 1234x5678\n * 8005551234 x5678\n * 1    800    555-1234\n * 1----800----555-1234\n */\nconst PHONE_NUMBER_REGEX = /^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-. )]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$/;\n\n/**\n * Tests the value provided against a phone number regex to determine if the number is valid.\n * @param value phone number to test against\n * @returns boolean depicting whether or not the number provided is valid\n */\nexport function isValidPhoneNumber(value: string): boolean {\n    return value ? PHONE_NUMBER_REGEX.test(value.trim()) : false;\n}\n","import type { Models } from 'purecloud-platform-client-internal-v2';\n\nexport function activityCounter(\n    contactCenter: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number,\n    enterprise: Models.MediaSummaryDetail | Models.UserConversationsEventMediaSummaryDetail | number\n): number {\n    let contactCenterCount = 0;\n    let enterpriseCount = 0;\n\n    if (typeof contactCenter === 'number') {\n        contactCenterCount = contactCenter;\n    } else if (contactCenter && contactCenter.active) {\n        contactCenterCount = contactCenter.active;\n    }\n\n    if (typeof enterprise === 'number') {\n        enterpriseCount = enterprise;\n    } else if(enterprise && enterprise.active){\n        enterpriseCount = enterprise.active;\n    }\n\n    return contactCenterCount + enterpriseCount;\n}\n","/**\n * Checks if the presence source is a default presence source.\n * @param {string} source the presence source to check\n * @param {boolean} useDefaultName should we use 'default' as a presence source\n * @returns\n */\nexport function isDefaultPresence(source) {\n    // we will want to switch completely to 'default'\n    // as the only default presence source but will be blocked until\n    // the Presence Service is only returning 'default'.\n    return isPurecloudSource(source) || source === 'default';\n}\n/**\n * Checks if the presence source is PURECLOUD.\n * @param {string} source the presence source to check\n * @returns\n */\nexport function isPurecloudSource(source) {\n    return source && source.toLowerCase() === 'purecloud';\n}\n","export * from 'ember-purecloud-components/utils/presence';\n","import Ember from 'ember';\nimport DS from 'ember-data';\n\nfunction tap(proxy, promise) {\n    Ember.set(proxy, 'isFulfilled', false);\n    Ember.set(proxy, 'isRejected', false);\n\n    return promise.then(\n        function (result) {\n            var payload;\n            var content = result;\n            if (result && typeof result === 'object') {\n                content = result.collection;\n                payload = result.payload;\n            }\n\n            Ember.set(proxy, 'isFulfilled', true);\n            Ember.set(proxy, 'content', content);\n\n            Ember.set(proxy, 'content._payload', payload);\n            Ember.set(proxy, '_payload', payload);\n\n            return content;\n        },\n        function (reason) {\n            Ember.set(proxy, 'isRejected', true);\n            Ember.set(proxy, 'reason', reason);\n            throw reason;\n        },\n        'Ember: PromiseProxy'\n    );\n}\n\nexport default DS.PromiseArray.extend({\n    _payload: null,\n\n    promise: Ember.computed({\n        get() {\n            throw Ember.Logger.error(\"PromiseProxy's promise must be set\");\n        },\n\n        set(key, promise) {\n            return tap(this, promise);\n        }\n    })\n});\n","import _ from 'lodash';\n\nexport function parseQueryParams() {\n    var obj = {};\n    var params = window.location.search.slice(1).split('&');\n\n    _.each(params, function (param) {\n        const split = param.split('=');\n        const key = decodeURIComponent(split[0]);\n        const value = split.length > 1 ? decodeURIComponent(split[1]) : '';\n        obj[key] = value;\n    });\n\n    return obj;\n}\n","import Ember from 'ember';\nimport { v4 as uuid } from 'uuid';\n\nconst { computed, typeOf } = Ember;\nconst MSG_NAMESPACE = 'QueuedProcessingChain';\n\n/**\n * Queues events by queueId and processes said events serially through a processor chain.\n * Events across queues will be processed \"concurrently\" via javascript's event loop.\n *\n * Chain:\n * A sequence of 1 or more processors which run serially for an event.\n *\n * Processors:\n * A synchronous or async function that performs work.  Regardless of whether a\n * processor is sync or async, each processor within a queue will be run serially.  While\n * processors could perform side-effects, it is preferable to mutate the data\n * in the context or the context itself.\n *\n * Processor Return Values:\n * false - Stops the event from progressing further in the chain\n * undefined (explicit or implicit) - Passes the current context, as is, into the next processor\n * object - Passes the returned object to the next processor as it's context\n *\n * Processor Errors:\n * If a processor throws or rejects, an error will be logged and the event will stop\n * propogating through the chain.  It is advised that processor blocks handle\n * their own errors internally and either recover or explicitly stop the chain by returning false.\n *\n * Lifecycle:\n * Both the QueuedProcessingChain instance and an optional lifecycleContainer can be used to manage events\n * and processors.  If either this instance or the optional lifecycleContainer is\n * destroying/destroyed, all active event processing will be haulted, any queued\n * work will be dropped, and any future attempt to enqueue new work will noop.\n */\nconst QueuedProcessingChain = Ember.Object.extend({\n    // An ember object (instance) whose lifecycle should bind this chain's event processing\n    lifecycleContainer: undefined,\n    label: null,\n    _defaultLabel: null,\n    _chain: null,\n    _processingQueueMap: null,\n\n    init() {\n        this._super(...arguments);\n        this._defaultLabel = `processingChain-${uuid()}`;\n        this._chain = [];\n        this._processingQueueMap = {};\n\n        if (!['undefined', 'instance'].includes(typeOf(this.lifecycleContainer))) {\n            throw new Error('if specified, the lifecycleContainer must be an Ember instance');\n        }\n    },\n\n    setProcessingChain(chain) {\n        if (!chain || !Array.isArray(chain)) {\n            throw new Error(this._buildErrorMessage('Only an array can be used as a processing chain.'));\n        }\n\n        chain.forEach((p, index) => {\n            if (!isValidProcessor(p)) {\n                throw new Error(this._buildErrorMessage(`Invalid Processor Provided at ${index}`));\n            }\n        });\n\n        this._chain = chain;\n    },\n\n    appendToChain(processor) {\n        if (!isValidProcessor(processor)) {\n            throw new Error(this._buildErrorMessage('Invalid Processor Provided'));\n        }\n        this._chain.push(processor);\n\n        return this._chain;\n    },\n\n    enqueueEvent(queueId, event) {\n        // NICETOHAVE/FUTURE: Optimize the chain by rejecting duplicate events\n        if (!this._isLifecycleValid()) {\n            // Do not enqueue more events if the chain or container are shutting down\n            return;\n        }\n\n        if (this._processingQueueMap[queueId]) {\n            this._processingQueueMap[queueId].workQueue.unshift(event);\n        } else {\n            this._processingQueueMap[queueId] = {\n                workQueue: [event]\n            };\n        }\n        this._checkForWork();\n    },\n\n    _checkForWork() {\n        let emptyQueueIds = [];\n        for (let currQueueId in this._processingQueueMap) {\n            const currQueue = this._processingQueueMap[currQueueId];\n            if (!currQueue.activeWorkItem) {\n                if (currQueue.workQueue.length > 0) {\n                    // start work\n                    let event = currQueue.workQueue.pop();\n                    currQueue.activeWorkItem = (async () => {\n                        try {\n                            await this._processEventThroughChain(event);\n                        } catch (error) {\n                            Ember.Logger.error(this._buildLoggerMessage('Exception thrown in process chain'), {\n                                event,\n                                error,\n                                remoteData: {\n                                    chainLabel: this.get('_safeLabel')\n                                }\n                            });\n                        }\n                        currQueue.activeWorkItem = null;\n                        this._checkForWork();\n                    })();\n                } else {\n                    emptyQueueIds.push(currQueueId);\n                }\n            }\n        }\n\n        emptyQueueIds.forEach(c => {\n            this._processingQueueMap[c] = undefined;\n            delete this._processingQueueMap[c];\n        });\n    },\n\n    async _processEventThroughChain(event) {\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and skip processing this event.\n            Ember.Logger.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Event will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    event,\n                    remoteData: {\n                        chainLabel: this.get('_safeLabel'),\n                        chainIndex: 0\n                    }\n                }\n            );\n\n            return;\n        }\n\n        const chain = this._chain;\n        if (chain && chain.length > 0) {\n            Ember.Logger.debug(this._buildLoggerMessage('Processing Event through chain'), {\n                event,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel')\n                }\n            });\n            await this._chainHelper(chain, 0, event);\n        }\n    },\n\n    async _chainHelper(chain, chainIndex, context) {\n        let processor = chain[chainIndex];\n        let { label, process } = processor;\n\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and end this processing chain.\n            Ember.Logger.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Processor will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    remoteData: {\n                        chainLabel: this.get('_safeLabel'),\n                        chainIndex,\n                        processorLabel: label\n                    }\n                }\n            );\n\n            return;\n        }\n\n        let processorResult;\n        try {\n            Ember.Logger.debug(this._buildLoggerMessage('Running Processor'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            processorResult = await process(context);\n        } catch (e) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor threw or rejected'), {\n                context,\n                e,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        let processorResultType = typeOf(processorResult);\n        if (\n            !['undefined', 'boolean', 'object'].includes(processorResultType) ||\n            (processorResultType === 'boolean' && processorResult !== false)\n        ) {\n            Ember.Logger.error(this._buildLoggerMessage('Processor returned unallowed value'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label,\n                    processorResultType\n                }\n            });\n            return;\n        }\n\n        if (processorResult === false) {\n            Ember.Logger.info(this._buildLoggerMessage('Processor haulted chain'), {\n                context,\n                remoteData: {\n                    chainLabel: this.get('_safeLabel'),\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        if (chainIndex + 1 < chain.length) {\n            // Call the next processor in the chain with the existing or mutated context\n            await this._chainHelper(chain, chainIndex + 1, !processorResult ? context : processorResult);\n        }\n    },\n\n    _buildLoggerMessage(msg) {\n        return [MSG_NAMESPACE, msg].join(' - ');\n    },\n\n    _buildErrorMessage(msg) {\n        return [MSG_NAMESPACE, this.get('_safeLabel'), msg].join(' - ');\n    },\n\n    _safeLabel: computed('label', '_defaultLabel', function () {\n        const { label, _defaultLabel } = this.getProperties('label', '_defaultLabel');\n        return label || _defaultLabel;\n    }),\n\n    _isLifecycleValid() {\n        const lifecycleContainer = this.get('lifecycleContainer');\n\n        return !(\n            this.get('isDestroying') ||\n            this.get('isDestroyed') ||\n            (lifecycleContainer && (lifecycleContainer.get('isDestroying') || lifecycleContainer.get('isDestroyed')))\n        );\n    }\n});\n\nfunction isValidProcessor(processor) {\n    if (!processor || !processor.process) {\n        return false;\n    }\n    return typeof processor === 'object' && typeof processor.process === 'function';\n}\n\nexport default QueuedProcessingChain;\n","import { isAjaxError, AjaxError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport { RawErrorResponse } from 'ember-ajax/-private/types';\nimport { hasKey } from './types';\n\nexport type RequestFailureLoggableDetails = {\n    status?: number;\n    correlationId?: string;\n};\n\nexport function getLoggableRequestFailureDetails(errorResponse: unknown): undefined | RequestFailureLoggableDetails {\n    if (!errorResponse || typeof errorResponse !== 'object') {\n        return undefined;\n    }\n\n    try {\n        if (errorResponse instanceof DS.AdapterError) {\n            return getAdapterErrorLoggableDetails(errorResponse);\n        } else if (isAjaxError(errorResponse)) {\n            return getAjaxErrorLoggableDetails(errorResponse);\n        } else if (isRawErrorResponse(errorResponse)) {\n            return getRawAjaxErrorLoggableDetails(errorResponse);\n        }\n    } catch (_) {}\n\n    return undefined;\n}\n\nfunction getAdapterErrorLoggableDetails(adapterError: DS.AdapterError): undefined | RequestFailureLoggableDetails {\n    if (hasKey(adapterError, 'errors') && Array.isArray(adapterError.errors) && adapterError.errors.length > 0) {\n        const error = adapterError.errors[0];\n        if (error && typeof error === 'object') {\n            // Tragically, all the various adapters in this baseline are inconsistent\n            // So, we need to check the root error as well as error.detail and error.details for the server payload\n            return Object.assign(\n                {},\n                ...[error, error.detail, error.details].map<undefined | RequestFailureLoggableDetails>(curr => {\n                    const payloadDetails = getLoggableRequestFailureDetailsPartial(curr);\n\n                    if (!payloadDetails) {\n                        return undefined;\n                    }\n\n                    // Prune out undefined values so they won't override previous, non-undefined values in Object.assign\n                    return Object.fromEntries(\n                        Object.entries(payloadDetails).filter(([, value]) => value !== undefined)\n                    );\n                })\n            );\n        }\n    }\n\n    return undefined;\n}\n\nfunction getAjaxErrorLoggableDetails({ status, payload }: AjaxError): undefined | RequestFailureLoggableDetails {\n    const result: RequestFailureLoggableDetails = {\n        status: status\n    };\n\n    if (\n        payload &&\n        typeof payload === 'object' &&\n        hasKey(payload, 'contextId') &&\n        typeof payload.contextId === 'string' &&\n        isUuid(payload.contextId)\n    ) {\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nfunction getRawAjaxErrorLoggableDetails(rawErrorResponse: RawErrorResponse): RequestFailureLoggableDetails {\n    return {\n        status: rawErrorResponse.jqXHR.status,\n        correlationId: rawErrorResponse.jqXHR.getResponseHeader('inin-correlation-id') || undefined\n    };\n}\n\nfunction getLoggableRequestFailureDetailsPartial(payload: unknown): undefined | RequestFailureLoggableDetails {\n    if (!payload || typeof payload !== 'object') {\n        return undefined;\n    }\n\n    let result: undefined | RequestFailureLoggableDetails = undefined;\n\n    if (hasKey(payload, 'status')) {\n        if (typeof payload.status === 'number' && Number.isInteger(payload.status)) {\n            result = result || {};\n            result.status = payload.status;\n        } else if (typeof payload.status === 'string') {\n            const statusInt = parseInt(payload.status, 10);\n            if (Number.isInteger(statusInt) && payload.status === statusInt + '') {\n                result = result || {};\n                result.status = statusInt;\n            }\n        }\n    }\n\n    if (hasKey(payload, 'contextId') && typeof payload.contextId === 'string' && isUuid(payload.contextId)) {\n        result = result || {};\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nconst UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;\nfunction isUuid(toCheck: string) {\n    return UUID_REGEXP.test(toCheck);\n}\n\nfunction isRawErrorResponse(toCheck: unknown): toCheck is RawErrorResponse {\n    if (!toCheck || typeof toCheck !== 'object') return false;\n\n    // We can reasonably assume this is a ember-ajax RawErrorResponse\n    return ['payload', 'textStatus', 'jqXHR', 'errorThrown', 'response'].every(currProp =>\n        Object.prototype.hasOwnProperty.call(toCheck, currProp)\n    );\n}\n","define(\"connections-ui/utils/routing-status\", [\"exports\", \"ember-purecloud-components/utils/routing-status\"], function (_exports, _routingStatus) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _routingStatus.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default function (object, property, value) {\n    const { set } = Ember;\n    if (property && isSafe(object)) {\n        return set(object, property, value);\n    }\n}\n\nexport function isSafe(object) {\n    const { get } = Ember;\n    return object && !(get(object, 'isDestroyed') || get(object, 'isDestroying'));\n}\n","import { Promise, resolve, reject } from 'rsvp';\nimport type { StashLoggerLogPayload, StashLoggerService } from '@connections-ui/services';\nimport { hasKey } from './types';\n\nexport type AsyncPromiseChainStep = {\n    stepDesc: string;\n    process: () => Promise<any>;\n};\nexport type SyncPromiseChainStep = {\n    stepDesc: string;\n    processSync: () => any;\n};\n\nexport type PromiseChainStep = AsyncPromiseChainStep | SyncPromiseChainStep;\nfunction isSyncPromiseChainStep(toCheck: PromiseChainStep): toCheck is SyncPromiseChainStep {\n    return 'processSync' in toCheck;\n}\n\nexport type LoggingConfig = {\n    logger: StashLoggerService;\n    logMsgPrefix?: string;\n};\n\nexport type ChainOptions = {\n    loggingConfig?: LoggingConfig;\n};\n\nexport type ChainStepFailure = {\n    origReason: any;\n    stepDesc: string;\n};\n\nexport function isChainStepFailure(toCheck: unknown): toCheck is ChainStepFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    return hasKey(toCheck, 'origReason') && hasKey(toCheck, 'stepDesc') && typeof toCheck.stepDesc === 'string';\n}\n\n/**\n * Serially executes a chain of synchronous and/or asynchronous steps utilizing RSVP promises\n * to work correctly with the Ember runloop.\n *\n * Work will not be started (no promise creation) until the previous step completes successfully\n * The chain will hault and reject with a ChainStepFailure upon the first encountered step rejection or thrown error\n */\nexport function executeChain(chain: PromiseChainStep[], { loggingConfig }: ChainOptions = {}): Promise<void> {\n    loggingConfig?.logger.debug(buildLogMsg('Chain begin', loggingConfig), {\n        remoteData: { chainLength: chain.length }\n    });\n\n    return chain\n        .reduce((acc, currChainStep, stepIndex) => {\n            const { stepDesc } = currChainStep;\n            const stepProgress = `${stepIndex + 1} of ${chain.length}`;\n            return acc.then(() => {\n                return resolve()\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step begin', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        if (isSyncPromiseChainStep(currChainStep)) {\n                            return currChainStep.processSync();\n                        } else {\n                            return currChainStep.process();\n                        }\n                    })\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step success', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return;\n                    })\n                    .catch(reason => {\n                        loggingConfig?.logger.warn(buildLogMsg('Step failure', loggingConfig), {\n                            reason,\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return reject({\n                            origReason: reason,\n                            stepDesc\n                        } as ChainStepFailure);\n                    });\n            });\n        }, resolve())\n        .then(() => {\n            loggingConfig?.logger.debug(buildLogMsg('Chain success', loggingConfig), {\n                remoteData: { chainLength: chain.length }\n            });\n        })\n        .catch(reason => {\n            const logPayload: StashLoggerLogPayload = {\n                remoteData: {\n                    chainLength: chain.length\n                }\n            };\n\n            // Theoretically, we ensure reason will always be a ChainStepFailure, but .. promise rejection typings\n            if (isChainStepFailure(reason)) {\n                logPayload.origReason = reason.origReason;\n                logPayload.remoteData!.failedStep = reason.stepDesc;\n            }\n\n            loggingConfig?.logger.warn(buildLogMsg('Chain failure', loggingConfig), logPayload);\n\n            return reject(reason);\n        });\n}\n\nfunction buildLogMsg(msg: string, loggingConfig: undefined | LoggingConfig) {\n    return `${loggingConfig?.logMsgPrefix ? loggingConfig.logMsgPrefix : ''}${msg}`;\n}\n","interface CacheItem<T> {\n    value: T;\n    timestamp: number;\n}\n\nexport default class SimpleCache {\n    private cache: Map<string, CacheItem<any>> = new Map();\n\n    set(id: string, value: any, ttlMinutes = 60): void {\n        const expirationTime = Date.now() + ttlMinutes * 60 * 1000;\n        this.cache.set(id, { value, timestamp: expirationTime });\n    }\n\n    get<T>(id: string): T | undefined {\n        const cachedItem = this.cache.get(id);\n\n        if (cachedItem && Date.now() < cachedItem.timestamp) {\n            return cachedItem.value;\n        }\n\n        this.cache.delete(id);\n        return undefined;\n    }\n\n    delete(id: string): void {\n        this.cache.delete(id);\n    }\n\n    clear(): void {\n        this.cache.clear();\n    }\n}\n","const SMS_PROP = {\n    FILE_SIZE: 5\n};\n\nexport default SMS_PROP;\n","import Ember from 'ember';\nimport computed from 'ember-computed';\nimport Howler from 'howler-but-with-updates';\nimport { isTesting } from './testing';\n\nconst Howl = Howler.Howl;\n\n// Recorder from: https://github.com/chris-rudmin/Recorderjs\nconst { MediaRecorder } = window;\n\nexport default Ember.Object.extend(Ember.Evented, {\n    ajax: Ember.inject.service(),\n    application: Ember.inject.service(),\n\n    recording: false,\n\n    blob: null,\n    recorder: null,\n\n    deferred: null,\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) return;\n        this.setupRecorder();\n    },\n\n    destroy() {\n        this._super(...arguments);\n        if (this.recorder) {\n            this.recorder.clearStream();\n            this.recorder.audioContext.suspend();\n        }\n    },\n\n    mimeType: computed(function () {\n        const mimeTypes = ['audio/mp3', 'audio/ogg', 'audio/wav', 'audio/webm'];\n        return mimeTypes.find(mimeType => MediaRecorder.isTypeSupported(mimeType));\n    }),\n\n    format: computed('mimeType', function () {\n        // Forcing OGG for now\n        // return _.last(this.get('mimeType').split('/'));\n        return 'ogg';\n    }),\n\n    blobURL: computed('blob', function () {\n        const blob = this.get('blob');\n        if (blob) {\n            return this.getBlobUrl(blob);\n        }\n\n        return null;\n    }),\n\n    setupRecorder() {\n        this.deferred = Ember.RSVP.defer();\n        this.loadEncoder()\n            .then(encoderPath => {\n                this.recorder = new window.Recorder({\n                    encoderPath\n                });\n\n                const context = this.recorder.audioContext;\n                if (context && context.state === 'suspended') {\n                    return context.resume();\n                }\n            })\n            .then(() => {\n                this.recorder.addEventListener('streamReady', this._streamReady.bind(this));\n                this.recorder.addEventListener('stop', this._stoppedRecording.bind(this));\n                this.recorder.addEventListener('dataAvailable', this._onDataAvailable.bind(this));\n\n                this.deferred.resolve();\n            });\n    },\n\n    reset() {\n        this.set('blob', null);\n    },\n\n    startRecording() {\n        this.deferred.promise.then(() => {\n            this.recorder.initStream();\n\n            this.set('blob', null);\n            this.set('chunks', []);\n        });\n    },\n\n    resumeRecording() {\n        this.recorder.resume();\n    },\n\n    pauseRecording() {\n        this.recorder.pause();\n    },\n\n    stopRecording() {\n        this.recorder.stop();\n    },\n\n    createHowlFromBlob(blob) {\n        const blobUrl = URL.createObjectURL(blob);\n        return new Howl({\n            src: [blobUrl],\n            loop: false,\n            format: [this.get('format')],\n            html5: true\n        });\n    },\n\n    getBlobUrl(blob) {\n        return URL.createObjectURL(blob);\n    },\n\n    loadEncoder() {\n        return this._loadSoundRecorder().then(() => this._loadWorker());\n    },\n\n    _onDataAvailable(event) {\n        const blob = new Blob([event.detail], { type: 'audio/ogg' });\n        this.set('blob', blob);\n\n        this.trigger('blobready');\n    },\n\n    _streamReady() {\n        this.set('recording', true);\n        this.recorder.start();\n    },\n\n    _stoppedRecording() {\n        this.set('recording', false);\n    },\n\n    _loadSoundRecorder() {\n        if (window.Recorder) {\n            return Ember.RSVP.resolve();\n        }\n\n        const path = 'assets/recorder.min.js';\n        return new Ember.RSVP.Promise(resolve => {\n            Ember.$.getScript(path, function success() {\n                resolve();\n            });\n        });\n    },\n\n    _loadWorker() {\n        const path = 'assets/workers/encoderWorker.min.js';\n        return Ember.$.get(path).then(contents => {\n            const blob = new Blob([contents]);\n            return window.URL.createObjectURL(blob);\n        });\n    }\n});\n","export const MESSAGING_SUBTYPES = [\n    'apple',\n    'facebook',\n    'instagram',\n    'line',\n    'open',\n    'sms',\n    'twitter',\n    'wechat',\n    'whatsapp',\n    'webmessaging'\n] as const;\n","import ENV from 'connections-ui/config/environment';\n\n/**\n * Determines if the app is currently running in a testing mode or not based on the ENV config used\n * at build time.\n *\n * @returns boolean detailing if the environment is in testing mode or not\n */\nexport const isTesting = ENV.environment === 'test';\n","import { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport { getEnvCookieDomain } from './net';\n\n/**\n * The current theme that the user has saved based on cookie value\n */\nlet currentTheme = null;\n\n/**\n * The name of the cookie being set.\n */\nexport const THEME_COOKIE = 'pureCloudTheme';\n/**\n * The time in seconds that the cookie will expire\n */\nexport const TEN_YEARS = 315360000; // in seconds\n\n/**\n * List of all possible themes that could be supported based on feature toggles and base classes. Key/value pair\n * to make sure values don't differ throughout the logic.\n * Please add a note next to the theme key/value detailing the ticket and feature toggle associated with it.\n *\n * Future Todo: We should move away from tacking on `-theme` to the end of the classes.\n */\nexport const THEME_CLASSES = {\n    LIGHT: 'light-theme', // default theme, always supported\n    DARK: 'dark-theme', // FT - webUiDarkTheme\n    BASE: 'purecloud-theme' // Legacy theme needed for app styling / TODO: Remove upon theme rework\n};\n/**\n * This is the theme that the app defaults to if a theme is not saved or selected yet.\n */\nexport const DEFAULT_THEME = THEME_CLASSES.LIGHT;\n/**\n * This is an array of the base themes that are always supported no matter what. Other themes may need to be hidden behind a feature toggle.\n */\nexport const BASE_THEME_LIST = [THEME_CLASSES.LIGHT];\n\n/**\n * This is the current theme list to select from. This function calculates all supported themes\n * based on feature toggles and returns a value of all themes that can be supported.\n * DEV NOTE: Add all new theme logic to this function to determine what themes to return.\n */\nexport function getThemeList(session) {\n    let extraThemes = [];\n\n    // Only check feature toggle based themes if session with features object is provided\n    if (session && session.features) {\n        if (session.features.webUiDarkTheme) {\n            extraThemes.push(THEME_CLASSES.DARK);\n        }\n    }\n\n    return [...BASE_THEME_LIST, ...extraThemes].sort((a, b) => {\n        if (a > b) {\n            return 1;\n        } else if (b > a) {\n            return -1;\n        } else {\n            return 0;\n        }\n    });\n}\n\n/**\n * Loads in the theme from the browsers cookies if there was a theme already set.\n * @param {string} cookies a long string of cookies that are character separated\n * @returns A new theming object used to set the applications theme\n */\nexport function loadTheme(session, cookies = document.cookie) {\n    const cookie = cookies\n        .split(/;[ \\t]?/)\n        .map(cookie => {\n            const [name, theme] = cookie.split('=');\n            return { name, theme };\n        })\n        .find(({ name }) => name === THEME_COOKIE);\n\n    if (cookie && getThemeList(session).find(theme => theme === cookie.theme)) {\n        return cookie;\n    } else {\n        return { theme: DEFAULT_THEME };\n    }\n}\n\n/**\n * Returns the current theme value being applied to the app\n * @returns the current theme value\n */\nexport function getThemeClass() {\n    return currentTheme;\n}\n\n/**\n * Sets the class of the provided element with the provided theme. Also removes the old theme class from the same element (if found), and sets the\n * `currentTheme` to the new value.\n * @param {{theme: THEME_CLASSES, element: HTMLELement}} param0 any object that contains at least the new theme and element to apply the class to.\n */\nexport function setThemeClass({ theme = THEME_CLASSES.LIGHT, element = document.body } = {}) {\n    if (currentTheme) {\n        element.classList.remove(currentTheme);\n    }\n\n    if (!element.classList.contains(THEME_CLASSES.BASE)) {\n        element.classList.add(THEME_CLASSES.BASE);\n    }\n\n    if (!element.classList.contains(theme)) {\n        element.classList.add(theme);\n    }\n\n    currentTheme = theme;\n}\n\n/**\n * Sets the theme cookie on the application to determine how the application should be styled when loaded in. Will alter the cookie values based on conditional values\n * such as the current locations protocol as well as the current browser being viewed on.\n * @param {{theme: THEME_CLASSES, duration: number, path: string, protocol: string, domain: string, setCookie: function, userAgent: string}} param0 an object used to set the new cookie value regarding the application theme\n */\nexport function setThemeCookie({\n    theme = THEME_CLASSES.LIGHT,\n    duration = TEN_YEARS,\n    path = '/',\n    protocol = _getCurrProtocol(),\n    domain = getEnvCookieDomain(),\n    setCookie = _setCookie, // mainly used for testing\n    userAgent = _getCurrUserAgent()\n} = {}) {\n    let cookieStmt = `${THEME_COOKIE}=${theme};path=${path};domain=${domain};max-age=${duration}`;\n\n    if (protocol === 'https:') {\n        cookieStmt += `;Secure`;\n    }\n\n    if (userAgent && typeof userAgent === 'string' && isSameSiteNoneCompatible(userAgent)) {\n        cookieStmt += `;SameSite=None`;\n    }\n\n    setCookie(cookieStmt);\n    setThemeClass({ theme });\n}\n\n/**\n * Resets the current theme back to undefined\n * Mainly used for testing purposes\n */\nexport function resetTheme() {\n    currentTheme = null;\n}\n\n/**\n * Private function to set the provided cookie on the document\n * @param {any} cookie the cookie w/ value to set\n */\nfunction _setCookie(cookie) {\n    document.cookie = cookie;\n}\n\n/**\n * Returns the windows current protocol. Expected `https:`\n * @returns the windows protocol\n */\nfunction _getCurrProtocol() {\n    if (window && window.location) {\n        return window.location.protocol;\n    }\n\n    return undefined;\n}\n\n/**\n * Returns the users current browser agent\n * @returns the users current browser agent\n */\nfunction _getCurrUserAgent() {\n    if (navigator && navigator.userAgent) {\n        return navigator.userAgent;\n    }\n\n    return undefined;\n}\n","define(\"connections-ui/utils/timeout-promise\", [\"exports\", \"ember-purecloud-components/utils/timeout-promise\"], function (_exports, _timeoutPromise) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _timeoutPromise.default;\n    }\n  });\n});\n","// Native Panels will eventually be replaced by providers and gadgets\nconst NATIVE_PANELS = ['details', 'scripts', 'responses', 'notes', 'scheduleCallback', 'wrapup'] as const;\ntype NativePanel = (typeof NATIVE_PANELS)[number];\n\nconst SCRIPTS_GADGET_PANEL_ID = 'scripts&scriptsProvider';\nconst deprecatedConversationSummaryPanelIds = ['interaction-details', 'agent-conversation-summary'].map(\n    currPanelId => `${currPanelId}&conversationSummaryInterapptionsProvider`\n);\nconst CONVERSATION_DETAILS_GADGET_PANEL_ID = 'conversation-details&conversationDetailsInterapptionsProvider';\nconst CANNED_RESPONSES_GADGET_PANEL_ID = 'responses&cannedResponsesProvider';\n// Assuming the provider and app id for Schedule Callbacks\nconst SCHEDULE_CALLBACK_GADGET_PANEL_ID = 'scheduleCallback&scheduleCallbackProvider';\nconst NOTES_GADGET_PANEL_ID = 'notesGadget&notesGadgetProvider';\nconst WRAPUP_GADGET_PANEL_ID = 'wrapupCodesGadget&wrapupCodesGadgetProvider';\n\nexport interface PanelSetting {\n    type: 'BuiltIn' | 'BuiltInInterapption' | 'Integration';\n    panelId: string;\n}\n\ninterface TransformationMap {\n    [key: string]: {\n        dependentFeatureToggles?: string[];\n        active: (features: Record<string, boolean>) => boolean;\n        shouldTransformPanelSetting: (panelSetting: PanelSetting) => boolean;\n        transformPanelSetting: () => PanelSetting;\n        // Supports both single and multipanel\n        shouldTransformAppDefId: (appDefId: string) => boolean;\n        transformAppDefId: () => string;\n    };\n}\n\nconst transformationMaps: TransformationMap = {\n    // Note: Conversation Summary will be replaced by Conversation Details before going GA\n    // CS options were never shipped to AUiB and CS used two different panel ids which complicates the transform\n    // As such, we're only supporting between details and conversation-details\n    details: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'details' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CONVERSATION_DETAILS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return ['details', addNativeProvider('details'), ...deprecatedConversationSummaryPanelIds].includes(\n                appDefId\n            );\n        },\n        transformAppDefId: () => {\n            return CONVERSATION_DETAILS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['conversationSummary3256', 'PURE-3256_useConversationDetails'],\n        active: features => {\n            return features.conversationSummary3256 && features['PURE-3256_useConversationDetails'];\n        }\n    },\n    reverseDetails: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CONVERSATION_DETAILS_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'details'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return [...deprecatedConversationSummaryPanelIds, CONVERSATION_DETAILS_GADGET_PANEL_ID].includes(appDefId);\n        },\n        transformAppDefId: () => {\n            return 'details';\n        },\n        active: features => {\n            return !transformationMaps.details.active(features);\n        }\n    },\n    notes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'notes' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: NOTES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'notes' || appDefId === addNativeProvider('notes');\n        },\n        transformAppDefId: () => {\n            return NOTES_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: features => {\n            return features['auraACWGadgets'];\n        }\n    },\n    reverseNotes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === NOTES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'notes'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === NOTES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'notes';\n        },\n        active: features => {\n            return !transformationMaps.notes.active(features);\n        }\n    },\n    wrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'wrapup' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: WRAPUP_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'wrapup' || appDefId === addNativeProvider('wrapup');\n        },\n        transformAppDefId: () => {\n            return WRAPUP_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: features => {\n            return features['auraACWGadgets'];\n        }\n    },\n    reverseWrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === WRAPUP_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'wrapup'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === WRAPUP_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'wrapup';\n        },\n        active: features => {\n            return !transformationMaps.wrapup.active(features);\n        }\n    },\n    responses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'responses' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CANNED_RESPONSES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'responses' || appDefId == addNativeProvider('responses');\n        },\n        transformAppDefId: () => {\n            return CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        active: () => true\n    },\n    reverseResponses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === CANNED_RESPONSES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'responses'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'responses';\n        },\n        active: features => {\n            return !transformationMaps.responses.active(features);\n        }\n    },\n    scheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scheduleCallback' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCHEDULE_CALLBACK_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scheduleCallback' || appDefId === addNativeProvider('scheduleCallback');\n        },\n        transformAppDefId: () => {\n            return SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['scheduleCallbackGadget'], // assumption for the ft\n        active: features => {\n            return features['scheduleCallbackGadget']; // assumption for the ft\n        }\n    },\n    reverseScheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === SCHEDULE_CALLBACK_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'scheduleCallback'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'scheduleCallback';\n        },\n        active: features => {\n            return !transformationMaps.scheduleCallback.active(features);\n        }\n    },\n    scripts: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scripts' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCRIPTS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scripts' || appDefId === addNativeProvider('scripts');\n        },\n        transformAppDefId: () => {\n            return SCRIPTS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['PURE-6186_Scripter_Gadget_GCUI'], // assumption for the ft\n        active: features => {\n            // Here, we do not have to check for workitem scripter FT\n            // PEF does not support workitems and therefore we only need to transform query params for conversations\n            // The Workitem scripter PM setting will use the built-in provider panel setting from the get-go\n            // The workitem scritper panel will use the built-in provider panelId from the get-go\n            // legacy scripter panel ids in layout models only need to be transformed for conversations;\n            //   again because workitem scripter panelIds will use provider from the get-go\n            return features['PURE-6186_Scripter_Gadget_GCUI'];\n        }\n    }\n};\n\nexport const transformationDependentFeatureToggles = [\n    ...new Set(\n        Object.values(transformationMaps).flatMap(({ dependentFeatureToggles }) => dependentFeatureToggles ?? [])\n    )\n];\n\nexport const buildTransformationFtComputedDepKey = (injectionPrefix: string): string => {\n    return `${injectionPrefix}.{${transformationDependentFeatureToggles.join(',')}}`;\n};\n\nexport const standardTransformationFtComputedDepKey = buildTransformationFtComputedDepKey('session.features');\n\nexport const transformPanelSetting = (panelSetting: PanelSetting, features: Record<string, boolean>) => {\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformPanelSetting(panelSetting)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformPanelSetting();\n    }\n    return panelSetting;\n};\n\n/**\n * Transforms the provided panelId to the target panelId based on the enable state of various transformers.\n * If no applicable transformer is found, the original panelId is returned. This\n * transformation will work for native src panels with and without a native provider, but note that\n * transformations back to native panels will not include the native provider.  If the native provider is needed,\n * callers should call `addNativeProvider` on the returned panelId.\n *\n * @param panelId The panelId (with or without native provider) to transform, when applicable\n * @param features The feature flags to use when determining which transformer to use\n * @returns A transformed panelId if applicable, otherwise the original panelId.  Native panelIds will not include the native provider.\n */\nexport const transformPanelId = (panelId: string, features: Record<string, boolean>) => {\n    // Normalize native panel ids to not include the native provider for searching transformers\n    const srcNativePanelMatch = findNativePanel(panelId);\n    const toSearch = srcNativePanelMatch ? srcNativePanelMatch.panelId : panelId;\n\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformAppDefId(toSearch)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformAppDefId();\n    }\n    return panelId;\n};\n\n/**\n * Appends the native provider to the end of the provided panelId if it represents a native panel.\n * This function is idempotent and safe to call on non-native panelIds as well as panelIds\n * which may already include the native provider.\n *\n * eg.\n * scheduleCallback -> scheduleCallback&native\n * scheduleCallback&native -> scheuldeCallback&native\n * nonNativePanelId -> nonNativePanelId\n * nonNativePanelId&nonNativeProviderId -> nonNativePanelId&nonNativeProviderId\n */\nexport const addNativeProvider = (panelId: string): string => {\n    const nativePanel = findNativePanel(panelId);\n    if (nativePanel) {\n        return `${nativePanel.panelId}&native`;\n    }\n\n    return panelId;\n};\n\ntype NativePanelMatch = {\n    panelId: NativePanel;\n    includedNativeProvider: boolean;\n};\nconst findNativePanel = (panelId: string): NativePanelMatch | undefined => {\n    const nativePanel = NATIVE_PANELS.find(\n        currNativePanel => panelId === currNativePanel || panelId === `${currNativePanel}&native`\n    );\n    if (!nativePanel) {\n        return;\n    }\n\n    return {\n        panelId: nativePanel,\n        includedNativeProvider: panelId.endsWith('&native')\n    };\n};\n","import { hasKey } from './types';\n\ntype CacheEntry<T> = {\n    expirationTimestamp?: number;\n    value: T;\n};\ntype TtlCacheConfig = {\n    defaultTtl?: number;\n};\n\n// A bit of jitter to ensure the TTL has been reached upon timer expiration\nconst TIMER_JITTER_MILLIS = 5;\n\nexport default class TtlCache<T> {\n    private config: TtlCacheConfig;\n    private cacheData: Record<string, CacheEntry<T>>;\n    private expiryCheck: {\n        timerRef?: number;\n        nextExpirationTimestamp?: number;\n    };\n    private tearingDown: boolean;\n\n    constructor({ defaultTtl }: TtlCacheConfig = {}) {\n        this.config = {\n            // <0, 0, and undefined all equate to no TTL (undefined)\n            defaultTtl: this.normalizeTtl(defaultTtl)\n        };\n        this.cacheData = {};\n        this.tearingDown = false;\n        this.expiryCheck = {};\n    }\n\n    keys(): string[] {\n        return Object.keys(this.cacheData);\n    }\n\n    /**\n     * Returns true if the key is in the cache, regardless of expiry; flase otherwise.\n     * Calls to has and get are stable within the same function.\n     *\n     * @param key The key to check\n     * @returns true if an item exists in the case under the specified key (regardless of expiry); false otherwise.\n     */\n    has(key: string): boolean {\n        return hasKey(this.cacheData, key);\n    }\n\n    get(key: string): undefined | T {\n        return this.cacheData[key]?.value;\n    }\n\n    /**\n     * @param key The key to use for this cache entry\n     * @param value The value to use for this cache entry\n     * @param ttl Unspecified/undefined uses the default ttl; <=0 indicates no caching, ttl otherwise\n     */\n    put(key: string, value: T, ttl?: number) {\n        const currTimeMillis = Date.now();\n\n        // Use the default ttl if item ttl is unspecified\n        // <=0 indicates no cache\n        const effectiveTtl = typeof ttl === 'undefined' ? this.config.defaultTtl : this.normalizeTtl(ttl);\n        const expirationTimestamp = typeof effectiveTtl === 'number' ? currTimeMillis + effectiveTtl : undefined;\n\n        this.cacheData[key] = {\n            expirationTimestamp,\n            value\n        };\n\n        if (expirationTimestamp) {\n            this.scheduleEviction(expirationTimestamp);\n        }\n    }\n\n    delete(key: string): boolean {\n        if (this.has(key)) {\n            const removedExpirationTimestamp = this.cacheData[key]?.expirationTimestamp;\n            delete this.cacheData[key];\n\n            if (removedExpirationTimestamp && removedExpirationTimestamp === this.expiryCheck.nextExpirationTimestamp) {\n                // We've removed an item which matches the next eviction timestamp\n\n                // Clear the existing timer.  Otherwise, scheduleEviction will still see\n                // the exiting timer as earlier than the new timer we're trying to set and noop\n                this.clearEvictionTimer();\n\n                // Re-schedule the eviction timer in case this is the last such entry at that eviction time\n                this.scheduleEviction();\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    clear() {\n        this.clearEvictionTimer();\n\n        this.cacheData = {};\n    }\n\n    tearDown(): void {\n        this.tearingDown = true;\n\n        this.clearEvictionTimer();\n\n        this.clear();\n    }\n\n    private clearEvictionTimer() {\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck = {};\n    }\n\n    /**\n     * Schedules an eviction timer to run approximately at the sprecified timestamp if no earlier timer already exists.\n     *\n     * If an earlier timer exists, this function will no-op; however, the \"interval\" will continue to be set\n     * based on the expiry timestamps of the cache, always selecting the nearest timestamp until no such timer is needed.\n     *\n     * @param requestedTimestamp The desired timestamp for the next timer. If no timestamp is provided, the next\n     *  timer will be calculated from the entries in the cache.\n     */\n    private scheduleEviction(requestedTimestamp = this.getEarliestExpirationTimestamp()) {\n        const currTimeMillis = Date.now();\n\n        if (this.tearingDown || typeof requestedTimestamp !== 'number' || requestedTimestamp < currTimeMillis) {\n            return;\n        }\n\n        if (\n            this.expiryCheck.nextExpirationTimestamp &&\n            this.expiryCheck.nextExpirationTimestamp <= requestedTimestamp\n        ) {\n            return;\n        }\n\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck.nextExpirationTimestamp = requestedTimestamp;\n        this.expiryCheck.timerRef = window.setTimeout(() => {\n            this.evictExpiredItems();\n            this.scheduleEviction();\n        }, requestedTimestamp - currTimeMillis + TIMER_JITTER_MILLIS);\n    }\n\n    private evictExpiredItems() {\n        const currTimeMillis = Date.now();\n        Object.entries(this.cacheData).forEach(([key, cacheEntry]) => {\n            if (cacheEntry.expirationTimestamp && cacheEntry.expirationTimestamp <= currTimeMillis) {\n                delete this.cacheData[key];\n            }\n        });\n    }\n\n    private getEarliestExpirationTimestamp() {\n        let earliestExpiration: undefined | number;\n\n        Object.values(this.cacheData).forEach(({ expirationTimestamp }) => {\n            if (expirationTimestamp && (!earliestExpiration || expirationTimestamp < earliestExpiration)) {\n                earliestExpiration = expirationTimestamp;\n            }\n        });\n\n        return earliestExpiration;\n    }\n\n    private normalizeTtl(ttl: undefined | number) {\n        if (typeof ttl === 'undefined') {\n            return undefined;\n        }\n\n        if (ttl <= 0) {\n            return undefined;\n        }\n\n        return ttl;\n    }\n}\n","const TWITTER_PROP = {\n    FILE_SIZE: 3,\n    MESSAGE_TYPE: 'twitter'\n};\n\nexport default TWITTER_PROP;\n","/*\n * Utility and Common types\n * Note: Feature-specific types should be kept within their own or separate util files.\n */\nexport function assertNever(x: never): never {\n    throw new Error(`Unexpected object: ${x}`);\n}\n\n// TS can't narrow `object` to an object with a known key, so we need a type-guard for that\nexport function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {\n    return key in obj;\n}\n\n// Includes type-guard/utility for readonly arrays/tuples/string unions\nexport function includes<S extends string>(haystack: readonly S[], needle: string): needle is S {\n    const _haystack: readonly string[] = haystack;\n    return _haystack.includes(needle);\n}\n\nexport type UnionFromTuple<T extends any[] | readonly any[]> = T[number];\n","const APPS_URI_V2 = 'api/v2/apps';\nconst BASE_URI_V2 = 'api/v2/conversations';\nconst PC_BASE_URI = 'platform';\n\nconst SEND_MESSAGING_TYPING_URI = 'messages/{conversationId}/communications/{communicationId}/typing';\nconst GET_APPS_DOWNLOAD_URI = 'downloads/{downloadId}?contentDisposition=INLINE';\n\n/**\n * Replaces patterns param names with provided values.\n * @param path - the string path to replace\n * @param values - the replacement values\n */\nfunction paramReplace(path: string, baseUri: string, values: Record<string, string>) {\n    for (const [key, value] of Object.entries(values)) {\n        const pattern = new RegExp(`\\{${key}\\}`);\n        path = path.replace(pattern, value);\n    }\n    return `/${PC_BASE_URI}/${baseUri}/${path}`;\n}\n\nexport default function UriBuilder() {\n    return {\n        /**\n         * Path to notify a message conversation's typing state\n         * @param conversationId - the conversation guid\n         * @param communicationId - the communication guid\n         */\n        sendMessagingTypingUri(conversationId: string, communicationId: string) {\n            const params = { conversationId, communicationId };\n            return paramReplace(SEND_MESSAGING_TYPING_URI, BASE_URI_V2, params);\n        },\n\n        /**\n         * Path to retrieve the download URL for the specified download.\n         * Used for cookie authentication.\n         * @param downloadId - the download guid\n         */\n        getAppsDownloadUri(downloadId: string) {\n            const params = { downloadId };\n            return paramReplace(GET_APPS_DOWNLOAD_URI, APPS_URI_V2, params);\n        }\n    };\n}\n","define(\"connections-ui/utils/uuid-generator\", [\"exports\", \"ember-uuid/utils/uuid-generator\"], function (_exports, _uuidGenerator) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.default;\n    }\n  });\n  Object.defineProperty(_exports, \"parse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.parse;\n    }\n  });\n  Object.defineProperty(_exports, \"unparse\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.unparse;\n    }\n  });\n  Object.defineProperty(_exports, \"v1\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v1;\n    }\n  });\n  Object.defineProperty(_exports, \"v4\", {\n    enumerable: true,\n    get: function get() {\n      return _uuidGenerator.v4;\n    }\n  });\n});\n","import { v4 } from 'uuid';\n\nfunction generate() {\n    return v4();\n}\n\nexport default {\n    generate\n};\n","define(\"connections-ui/utils/video-frame-checker\", [\"exports\", \"ember-webrtc-troubleshoot/utils/video-frame-checker\"], function (_exports, _videoFrameChecker) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoFrameChecker.default;\n    }\n  });\n});\n","const WEBMESSAGING_PROP = {\n    CHARACTER_LIMIT: 4000,\n    FILE_SIZE: 25\n};\n\nexport default WEBMESSAGING_PROP;\n","define(\"connections-ui/validators/alias\", [\"exports\", \"ember-cp-validations/validators/alias\"], function (_exports, _alias) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _alias.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/belongs-to\", [\"exports\", \"ember-cp-validations/validators/belongs-to\"], function (_exports, _belongsTo) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _belongsTo.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/collection\", [\"exports\", \"ember-cp-validations/validators/collection\"], function (_exports, _collection) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _collection.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/confirmation\", [\"exports\", \"ember-cp-validations/validators/confirmation\"], function (_exports, _confirmation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _confirmation.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/date\", [\"exports\", \"ember-cp-validations/validators/date\"], function (_exports, _date) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _date.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/dependent\", [\"exports\", \"ember-cp-validations/validators/dependent\"], function (_exports, _dependent) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dependent.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/ds-error\", [\"exports\", \"ember-cp-validations/validators/ds-error\"], function (_exports, _dsError) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _dsError.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/exclusion\", [\"exports\", \"ember-cp-validations/validators/exclusion\"], function (_exports, _exclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _exclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/format\", [\"exports\", \"ember-cp-validations/validators/format\"], function (_exports, _format) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _format.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/has-many\", [\"exports\", \"ember-cp-validations/validators/has-many\"], function (_exports, _hasMany) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _hasMany.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/inclusion\", [\"exports\", \"ember-cp-validations/validators/inclusion\"], function (_exports, _inclusion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _inclusion.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/length\", [\"exports\", \"ember-cp-validations/validators/length\"], function (_exports, _length) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _length.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/messages\", [\"exports\", \"ember-intl-cp-validations/validators/messages\"], function (_exports, _messages) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _messages.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/number\", [\"exports\", \"ember-cp-validations/validators/number\"], function (_exports, _number) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _number.default;\n    }\n  });\n});\n","define(\"connections-ui/validators/presence\", [\"exports\", \"ember-cp-validations/validators/presence\"], function (_exports, _presence) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _presence.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant-v2/model\", [\"exports\", \"ember-webrtc-components/models/video-participant-v2\"], function (_exports, _videoParticipantV) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipantV.default;\n    }\n  });\n});\n","define(\"connections-ui/video-participant/model\", [\"exports\", \"ember-webrtc-components/models/video-participant\"], function (_exports, _videoParticipant) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _videoParticipant.default;\n    }\n  });\n});\n","import Ember from 'ember';\n\nexport default Ember.Component.extend({\n    templateName: 'card/tree/tree',\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    attachTextInputListeners: Ember.on('didInsertElement', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.on('keydown', event => event.stopPropagation());\n    }),\n\n    removeTextInputListeners: Ember.on('willClearRender', function () {\n        const fields = $.merge(Ember.$('.ember-text-area'), Ember.$('.ember-text-field'));\n        return fields.off('keydown');\n    })\n});\n","define(\"connections-ui/webrtc-conversation/model\", [\"exports\", \"ember-webrtc-components/models/webrtc-conversation\"], function (_exports, _webrtcConversation) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  Object.defineProperty(_exports, \"default\", {\n    enumerable: true,\n    get: function get() {\n      return _webrtcConversation.default;\n    }\n  });\n});\n","define('connections-ui/config/environment', ['ember'], function(Ember) {\n  var prefix = 'connections-ui';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(unescape(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","if (!runningTests) {\n  require(\"connections-ui/app\")[\"default\"].create({\"version\":\"1.15.0\",\"semver\":\"1.15.0+89-master-db32b730940de2206243c6f1d44ff1974c3f1592\",\"urlprefix\":\"/connections-ui/build-assets/1.15.0-89/\",\"buildNumber\":\"89\",\"libs\":{\"@purecloud/ember-purecloud-components\":\"13.6.7\",\"@purecloud/ember-softphone-integration\":\"1.0.8\"},\"INTL_LANGUAGES\":{\"ar\":\"العربية (beta)\",\"cs\":\"Čeština\",\"da\":\"Dansk\",\"de\":\"Deutsch\",\"en-us\":\"English\",\"es\":\"Español\",\"fi\":\"Suomi\",\"fr-ca\":\"Français (Canada) (beta)\",\"fr\":\"Français\",\"he\":\"עברית (beta)\",\"hi\":\"हिन्दी\",\"it\":\"Italiano\",\"ja\":\"日本語\",\"ko\":\"한국어\",\"nl\":\"Nederlands\",\"no\":\"Norsk\",\"pl\":\"Polski\",\"pt-br\":\"Português do Brasil\",\"pt-pt\":\"Português\",\"ru\":\"Русский\",\"sv\":\"Svenska\",\"th\":\"ไทย\",\"tr\":\"Türkçe\",\"uk\":\"Українська\",\"zh-cn\":\"简体中文\",\"zh-tw\":\"繁體中文\"},\"name\":\"connections-ui\"});\n}\n"]}