{"version":3,"file":"analytics_ia.min.js","sources":["Scripts/commun/lib/analytics_ia.js"],"sourcesContent":["/**\r\n * DOCUMENTATION: https://dev.azure.com/iadx/iA%20Digital%20Experience/_wiki/wikis/iA-Digital-Experience.wiki/89/Utilisation-du-Data-Layer-front-end\r\n */\n\n__cw__define(['jquery'], function ($) {\n  // eslint-disable-next-line\n  window.dataLayer = window.dataLayer || [];\n  var _autoTrackStartDate = null;\n  var _environnement;\n  var _pageId;\n\n  /*********************************** INIT AND SHARED METHODS *******************************************/\n\n  var initAutoTracking = function initAutoTracking(environnement, formType, pageId) {\n    try {\n      _environnement = environnement;\n      _pageId = pageId.replace('{', '').replace('}', '');\n      initFormTracking(formType);\n      _autoTrackStartDate = Date.now();\n    } catch (ex) {\n      consoleError(\"An unhandled exception occured during Data Layer initialization: \" + ex.toString());\n    }\n  };\n  function enableLogging() {\n    return _environnement != 'prod';\n  }\n  function consoleInfo(message) {\n    if (enableLogging()) {\n      console.info(message);\n    }\n  }\n  function consoleWarn(message) {\n    if (enableLogging()) {\n      console.warn(message);\n    }\n  }\n  function consoleError(message) {\n    if (enableLogging()) {\n      console.error(message);\n    }\n  }\n  function debounce(func, timeout) {\n    var _this = this;\n    if (timeout === void 0) {\n      timeout = 300;\n    }\n    var timer;\n    return function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      clearTimeout(timer);\n      timer = setTimeout(function () {\n        func.apply(_this, args);\n      }, timeout);\n    };\n  }\n\n  /******************************** Form Tracking ***************************************/\n\n  var MOUSE_FLOW_FORM_NAME_PREFIX = 'mf_feedback';\n  var FORM_COMPLETE_DELAY_MS = 500;\n  var _trackedForms = {};\n  var getHubSpotFormGuid = function getHubSpotFormGuid(form) {\n    var hubSpotProperties = getHubSpotProperties(form);\n    return hubSpotProperties ? hubSpotProperties['GA_HSFormGUID'] : null;\n  };\n  var getHubSpotUserGuid = function getHubSpotUserGuid(form) {\n    var hubSpotProperties = getHubSpotProperties(form);\n    return hubSpotProperties ? hubSpotProperties['GA_HSUserGUID'] : null;\n  };\n  function initFormTracking(formType) {\n    initSearchFormTracking();\n    $('form').each(function () {\n      if ($(this).attr('data-utag-ignore') == 'true') {\n        return;\n      }\n      trackForm(this, formType);\n    });\n    var debouncedRescan = debounce(function () {\n      observer.disconnect();\n      initFormTracking(formType);\n    }, 1000);\n    var observer = new MutationObserver(debouncedRescan);\n    var config = {\n      childList: true,\n      subtree: true\n    };\n    var targetNode = document.body;\n    observer.observe(targetNode, config);\n  }\n  function initFormControlTracking(formControlElement) {\n    var formName = getFormNameFromControlElement(formControlElement);\n    var formControlName = getFormControlName(formControlElement);\n    var formControlInstanceId = getFormControlInstanceId(formControlElement);\n    var isTracked = _trackedForms[formName].formControls[formControlName] && _trackedForms[formName].formControls[formControlName].instances[formControlInstanceId] && _trackedForms[formName].formControls[formControlName].instances[formControlInstanceId].isTracked;\n    if (!formName || !formControlName || !formControlInstanceId) {\n      return;\n    }\n    if ($(formControlElement).attr('type') == 'hidden' && !isTracked) {\n      enableHiddenInputChangeTracking(formControlElement);\n    } else if ($(formControlElement).hasClass('selectric')) {\n      $(formControlElement).off('selectric-change', trackFormControlInteraction).on('selectric-change', trackFormControlInteraction);\n    }\n    $(formControlElement).off('change', trackFormControlInteraction).on('change', trackFormControlInteraction);\n    if (_trackedForms[formName].formControls[formControlName] == undefined) {\n      _trackedForms[formName].formControls[formControlName] = {\n        instances: {}\n      };\n    }\n    _trackedForms[formName].formControls[formControlName].instances[formControlInstanceId] = {\n      isTracked: true\n    };\n  }\n  function initSearchFormTracking() {\n    if (_autoTrackStartDate != null) {\n      return;\n    }\n    $('.header-form-recherche .bouton-recherche, .CoveoSearchButton').on('click', function () {\n      trackFormComplete($(this).closest('form'));\n    });\n  }\n  function trackForm(form, formType) {\n    var formName = getFormName(form);\n    if (formName == null) {\n      return;\n    } else if (formName.startsWith(MOUSE_FLOW_FORM_NAME_PREFIX)) {\n      return;\n    }\n    if (!(_trackedForms[formName] && _trackedForms[formName].tracked)) {\n      if (getFormType(form) == 'unknown') {\n        if (formType != null && formType != '') {\n          $(form).attr('data-utag-form-type', formType);\n        } else {\n          consoleWarn(\"No form type provided for form \\\"\" + formName + \"\\\". Please define the \\\"data-utag-form-type\\\" attribute on the form or set the tag in Sitecore for page \\\"\" + _pageId + \"\\\".\");\n        }\n      }\n      if ($(form).attr('data-utag-ensure-visible') == 'true' && !$(form).is(':visible')) {\n        return;\n      }\n      _trackedForms[formName] = {\n        tracked: true,\n        formControls: {}\n      };\n      if ($(form).attr('data-utag-ignore-form-view') != 'true') {\n        trackFormInteraction(getFormName(form), getFormType(form), {\n          'form_guid': getHubSpotFormGuid(form),\n          'form_user_guid': getHubSpotUserGuid(form),\n          'form_value': getFormValue(form, 'form_view')\n        }, null, 'form_view');\n      }\n    }\n    $(form).find('select, input[type=text], input[type=number], input[type=range], input[type=checkbox], input[type=radio], input[type=tel], input[type=email], input[type=search], input[type=password], input[type=hidden][data-utag-force-track=true], textarea').each(function () {\n      initFormControlTracking(this);\n    });\n  }\n  function trackFormBegin(formControlElement) {\n    var $form = $(formControlElement).closest('form');\n    if ($form == null) {\n      return false;\n    }\n    var formName = getFormName($form);\n    if (_autoTrackStartDate && Date.now() - _autoTrackStartDate < 1000) {\n      return false;\n    } else if (_trackedForms[formName].trackFormBegin) {\n      return true;\n    }\n    trackFormInteraction(formName, getFormType($form), {\n      'form_guid': getHubSpotFormGuid($form),\n      'form_user_guid': getHubSpotUserGuid($form),\n      'form_value': getFormValue($form, 'form_begin')\n    }, null, 'form_begin');\n    _trackedForms[formName].trackFormBegin = true;\n    return true;\n  }\n  function trackFormComplete(form, callback, options) {\n    try {\n      var formName = getFormName(form);\n      if (_trackedForms[formName] == null) {\n        consoleWarn(\"trackFormComplete() called on untracked form '\" + formName + \"'.\");\n        if (callback) callback();\n        return;\n      } else if (_trackedForms[formName].formCompleteTracked) {\n        if (callback) callback();\n        return;\n      }\n      _trackedForms[formName].formCompleteTracked = true;\n      trackHubSpotProperties(form);\n      if ($(form).attr('data-utag-form-complete-delay') == 'true') {\n        window.setTimeout(function () {\n          trackFormCompleteImmediately(form, callback, options);\n        }, FORM_COMPLETE_DELAY_MS);\n      } else {\n        trackFormCompleteImmediately(form, callback, options);\n      }\n    } catch (ex) {\n      consoleError(\"An unhandled exception occured during form complete tracking: \" + ex.toString());\n    }\n  }\n  function trackFormCompleteImmediately(form, callback, options) {\n    options = options != null ? options : {};\n    trackFormInteraction(getFormName(form), getFormType(form), {\n      'form_guid': options.form_guid != null ? options.form_guid : getHubSpotFormGuid(form),\n      'form_user_guid': options.form_user_guid != null ? options.form_user_guid : getHubSpotUserGuid(form),\n      'form_value': options.form_value != null ? options.form_value : getFormValue(form, 'form_complete'),\n      'form_metric': options.form_metric != null ? options.form_metric : getFormMetric(form)\n    }, null, 'form_complete');\n    if (callback) {\n      callback();\n    }\n  }\n  function trackHubSpotProperties(form) {\n    var hubSpotProperties = getHubSpotProperties(form);\n    if (hubSpotProperties != null) {\n      window.dataLayer.push(hubSpotProperties);\n      consoleInfo(\"HubSpot properties tracked: \" + JSON.stringify(hubSpotProperties));\n    }\n  }\n  function trackFormError(form) {\n    return;\n  }\n  function trackFormInteraction(formName, formType, options, _callBack, eventName) {\n    var interaction = {\n      'form_type': formType,\n      'form_name': formName,\n      'form_value': null,\n      'form_metric': null,\n      'form_step': null,\n      'form_guid': null\n    };\n    if (options && options.form_value != undefined) interaction['form_value'] = options.form_value;\n    if (options && options.form_metric != undefined) interaction['form_metric'] = options.form_metric;\n    if (options && options.form_step != undefined) interaction['form_step'] = options.form_step;\n    if (options && options.form_guid != undefined) interaction['form_guid'] = options.form_guid;\n    if (options && options.form_user_guid != undefined) interaction['form_user_guid'] = options.form_user_guid;\n    window.dataLayer.push({\n      'event': eventName,\n      'interaction': interaction\n    });\n    if (_callBack) {\n      _callBack();\n    }\n    consoleInfo(\"Form interaction tracked. Event Name: \" + eventName + \", Interaction: \" + JSON.stringify(interaction) + \".\");\n  }\n  function trackFormStep(formControlElement) {\n    var $form = $(formControlElement).closest('form');\n    if ($form == null) {\n      return false;\n    }\n    var formName = getFormName($form);\n    var formControlName = getFormControlName(formControlElement);\n    if (_trackedForms[formName].formControls[formControlName].isStepTracked) {\n      return;\n    }\n    trackFormInteraction(getFormName($form), getFormType($form), {\n      'form_step': formControlName,\n      'form_guid': getHubSpotFormGuid($form),\n      'form_user_guid': getHubSpotUserGuid($form),\n      'form_value': getFormValue($form, 'interaction')\n    }, null, 'interaction');\n    _trackedForms[formName].formControls[formControlName].isStepTracked = true;\n  }\n  function trackFormControlInteraction() {\n    if (!$(this).val()) {\n      return;\n    }\n    if (!trackFormBegin(this)) {\n      return;\n    }\n    trackFormStep(this);\n  }\n  function enableHiddenInputChangeTracking(element) {\n    var observer = new MutationObserver(function (mutations, observer) {\n      if (mutations[0].attributeName == 'value') {\n        $(element).trigger('change');\n      }\n    });\n    observer.observe(element, {\n      attributes: true\n    });\n  }\n  function getHubSpotProperties(form) {\n    var dataLayer = $(form).find('input[name=JSonDataLayerValue]').val();\n    if (dataLayer == null || dataLayer == '') {\n      dataLayer = $(\"input[data-utag-target-form-name=\" + getFormName(form) + \"]\").val();\n    }\n    if (dataLayer == null || dataLayer == '') {\n      return null;\n    }\n    return JSON.parse(dataLayer);\n  }\n  function getFormName(formElement) {\n    var formName = $(formElement).attr(\"data-utag-fname-\" + _pageId);\n    if (formName == null || formName == '') {\n      formName = $(formElement).attr('data-utag-fname');\n    }\n    if (formName == null || formName == '') {\n      formName = $(formElement).attr('name');\n    }\n    if (formName == null || formName == '') {\n      formName = $(formElement).attr('id');\n    }\n    if (formName == null) {\n      return null;\n    }\n    return formName;\n  }\n  function getFormNameFromControlElement(formControlElement) {\n    var formElement = $(formControlElement).closest('form');\n    if (formElement == null) {\n      return;\n    }\n    return getFormName(formElement);\n  }\n  function getFormType(formElement) {\n    var formType = $(formElement).attr('data-utag-form-type');\n    if (formType == null) {\n      formType = 'unknown';\n    }\n    return formType;\n  }\n  function getFormControlName(formControlElement) {\n    var formControlName = $(formControlElement).attr('data-utag-form-control-name');\n    if (formControlName == null) {\n      formControlName = $(formControlElement).attr('name');\n    }\n    if (formControlName == null) {\n      formControlName = $(formControlElement).attr('id');\n    }\n    if (formControlName == null) {\n      consoleWarn('Cannot retrieve name of form control element. Form control must have the \"data-utag-form-control-name\", \"name\" or \"id\" attribute set.');\n      return false;\n    }\n    return formControlName;\n  }\n  function getFormControlInstanceId(formControlElement) {\n    var formControlInstanceId = $(formControlElement).attr('id');\n    if (formControlInstanceId == null) {\n      formControlInstanceId = getFormControlName(formControlElement);\n    }\n    return formControlInstanceId;\n  }\n  function getFormValue(form, eventName) {\n    var values = {};\n    $(form).find('[data-utag-enable-value-tracking=true]').each(function () {\n      if (eventName != 'form_complete' && $(this).attr('data-utag-enable-value-tracking-on-all-events') != 'true') {\n        return;\n      }\n      values[getFormControlName(this)] = getFormControlElementValue(this);\n    });\n    var validEntries = Object.entries(values).filter(function (entry) {\n      return entry[1] != undefined && entry[1] != '';\n    });\n    if (validEntries.length == 0) {\n      return null;\n    } else {\n      return validEntries.map(function (entry) {\n        return entry[0] + \"=\" + entry[1];\n      }).join(';');\n    }\n  }\n  function getFormMetric(form) {\n    var metric = null;\n    $(form).find('[data-utag-form-metric-value=true]').each(function () {\n      metric = Number(getFormControlElementValue(this));\n    });\n    return !isNaN(metric) ? metric : null;\n  }\n  function getFormControlElementValue(formControlElement) {\n    var value = null;\n    var source = $(formControlElement).attr('data-utag-enable-value-tracking-source');\n    if (source == 'label') {\n      value = $(formControlElement).next('label').text().trim().replace('\\n', '');\n    } else if (formControlElement.tagName.toLowerCase() == 'select') {\n      value = $(formControlElement).find('option:selected').text();\n    } else if (formControlElement.getAttribute('type') == 'checkbox') {\n      value = $(formControlElement).is(':checked');\n    } else if (formControlElement.getAttribute('type') == 'radio') {\n      value = $('input[name=\"' + $(formControlElement).attr('name') + '\"]:checked').val();\n    } else if (formControlElement.getAttribute('type') == 'file') {\n      value = $(formControlElement)[0].files.length > 0;\n    } else {\n      value = $(formControlElement).val();\n    }\n    if (value != null && typeof value === 'string') {\n      value = value.replace(/\\s+/g, ' ').trim();\n    }\n    return value;\n  }\n\n  /**************************************** Click Tracking ********************************************/\n\n  var CLICK_LOCATION_MAPPING = {\n    'header': ['header', '.nav-secondaire'],\n    'footer': ['footer'],\n    'pop-up': ['.remodal-wrapper'],\n    'overlay': ['.zone-sticky'],\n    'dropdown': ['.dropdown-menu', '.dropdown-primary'],\n    'carrousel': ['.swiper-slide'] //TODO: mapper la position de carrousel\n  };\n  var NO_LINK_CLICK_TYPE = {\n    'tab': ['.tuile-action', '.commun-element-onglet'],\n    'dropdown': ['.titre-accordeon', '.dropdown-toggle', '.dropdown-group', '.selectric-wrapper', '.dropdown-primary'],\n    'checkbox': ['.icon-star', '#toggle_favorites']\n  };\n  function initClickTracking() {\n    document.addEventListener('click', function (event) {\n      var clickElement = event.target;\n      var type = getNoLinkType(clickElement);\n      if (type) {\n        trackClickInteraction(type, getClickName(clickElement), null, getClickLocation(clickElement), null);\n        return;\n      }\n      var linkElement = clickElement.closest('a');\n      type = getLinkType(linkElement);\n      if (type) {\n        trackClickInteraction(type, getClickName(linkElement), linkElement.getAttribute('href'), getClickLocation(clickElement), null);\n      }\n    });\n    document.addEventListener('change', function (event) {\n      var inputElement = event.target;\n      if (inputElement.getAttribute('type') == 'checkbox') {\n        trackClickInteraction('checkbox', getClickName(inputElement.parentElement), null, getClickLocation(inputElement), null);\n      }\n    });\n  }\n  function trackClickInteraction(type, name, destination, location, value, _callBack) {\n    var clickData = {\n      'click_type': type,\n      'click_name': name,\n      'click_destination': destination,\n      'click_location': location\n    };\n    if (value) clickData['click_value'] = value;\n    window.dataLayer.push({\n      'event': 'click_interaction',\n      'interaction': clickData\n    });\n    if (_callBack) {\n      _callBack();\n    }\n  }\n  function getNoLinkType(clickElement) {\n    var type;\n    for (var clickType in NO_LINK_CLICK_TYPE) {\n      NO_LINK_CLICK_TYPE[clickType].map(function (mapping) {\n        if (clickElement.closest(mapping)) {\n          type = clickType;\n          consoleInfo('mapping click type to ' + clickType);\n        }\n      });\n    }\n    return type;\n  }\n  function getLinkType(linkElement) {\n    if (linkElement) {\n      var lien = linkElement.getAttribute('href');\n      if (lien.startsWith('mailto:')) {\n        return 'mail';\n      } else if (lien.startsWith('tel:')) {\n        return 'phone_number';\n      } else {\n        return 'link';\n      }\n    }\n    return;\n  }\n  function getClickLocation(clickElement) {\n    var location = 'body';\n    for (var locationMap in CLICK_LOCATION_MAPPING) {\n      CLICK_LOCATION_MAPPING[locationMap].map(function (mapping) {\n        if (clickElement.closest(mapping)) {\n          location = locationMap;\n          consoleInfo('mapping click location to ' + locationMap);\n        }\n      });\n    }\n    return location;\n  }\n\n  // TODO: Ameliorer pour obtenir le text au lieu des icones ou \"vide\" dependamment d'ou on clique dans l'element\n  function getClickName(clickElement) {\n    var name = clickElement.innerText;\n    if (!name) consoleInfo('No text mapped where the element was clicked.');\n    return name;\n  }\n\n  /************************************************** Video Tracking *****************************************************************/\n\n  var VIDEO_PROGRESS_TRACK_THRESHOLDS = [25, 50, 75];\n  var _trackedVideos = {};\n  function initVideoTracking() {\n    window.onYouTubeIframeAPIReady = function () {\n      $('iframe').each(function () {\n        var videoId = this.id;\n        if (videoId == null || _trackedVideos[videoId] && !_trackedVideos[videoId].tracked) {\n          return;\n        }\n        // eslint-disable-next-line\n        var player = YT.get(videoId);\n        if (player == null) {\n          // eslint-disable-next-line\n          player = new YT.Player(this);\n        }\n        _trackedVideos[videoId] = {\n          player: player,\n          progressTresholds: {},\n          title: this.title,\n          src: this.src\n        };\n        player.addEventListener('onStateChange', function (event) {\n          trackVideoStateChange(videoId, event.data);\n        });\n        window.setInterval(function () {\n          trackVideoProgress(videoId);\n        }, 1000);\n        _trackedVideos[videoId].tracked = true;\n      });\n    };\n  }\n  function trackVideoInteraction(title, duration, progress, link, _callBack, eventName) {\n    if (eventName === void 0) {\n      eventName = 'video_start';\n    }\n    var interaction = {\n      'video_title': title,\n      'video_duration': duration,\n      'video_link': link\n    };\n    if (progress) interaction['video_progress'] = progress;\n    window.dataLayer.push({\n      'event': eventName,\n      'interaction': interaction\n    });\n    if (_callBack) {\n      _callBack();\n    }\n    consoleInfo(\"Video interaction tracked. Event Name: \" + eventName + \", Interaction: \" + JSON.stringify(interaction) + \".\");\n  }\n  function trackVideoStateChange(videoId, state) {\n    var player = _trackedVideos[videoId].player;\n    if (state == 1 && !_trackedVideos[videoId].trackVideoStart) {\n      trackVideoInteraction(player.getVideoData().title, player.getDuration(), null, _trackedVideos[videoId].src, null, 'video_start');\n      _trackedVideos[videoId].trackVideoStart = true;\n    } else if (state == 0 && !_trackedVideos[videoId].trackVideoCompleted) {\n      trackVideoInteraction(player.getVideoData().title, player.getDuration(), 100, _trackedVideos[videoId].src, null, 'video_complete');\n      _trackedVideos[videoId].trackVideoCompleted = true;\n    }\n  }\n  function trackVideoProgress(videoId) {\n    var player = _trackedVideos[videoId].player;\n    var progressPercentage = player.getCurrentTime() / player.getDuration() * 100;\n    var newProgressTresholdsReached = VIDEO_PROGRESS_TRACK_THRESHOLDS.filter(function (threshold) {\n      return progressPercentage >= threshold && !_trackedVideos[videoId].progressTresholds[threshold];\n    });\n    newProgressTresholdsReached.forEach(function (threshold) {\n      trackVideoInteraction(player.getVideoData().title, player.getDuration(), threshold, _trackedVideos[videoId].src, null, 'video_progress');\n      _trackedVideos[videoId].progressTresholds[threshold] = true;\n    });\n  }\n\n  /************************************************** Misc Tracking *****************************************************************/\n\n  function initScrollDepthTracking() {\n    if (_autoTrackStartDate != null) {\n      return;\n    }\n    var hauteurMax = document.documentElement.scrollHeight - document.documentElement.clientHeight;\n    var tracking = [{\n      pourcentage: '50',\n      envoye: false\n    }, {\n      pourcentage: '90',\n      envoye: false\n    }];\n    document.addEventListener('scroll', function (event) {\n      var positionActuel = window.scrollY;\n      var pourcentage = Math.round(positionActuel / hauteurMax * 100);\n      tracking.map(function (track) {\n        if (pourcentage > track.pourcentage && !track.envoye) {\n          window.dataLayer.push({\n            'event': 'depth_reached',\n            'interaction': {\n              'scroll_depth': track.pourcentage\n            }\n          });\n          track.envoye = true;\n        }\n      });\n    });\n  }\n  return {\n    getHubSpotUserGuid: getHubSpotUserGuid,\n    getHubSpotFormGuid: getHubSpotFormGuid,\n    initAutoTracking: initAutoTracking,\n    trackFormBegin: trackFormBegin,\n    trackFormComplete: trackFormComplete,\n    trackFormError: trackFormError,\n    trackClickInteraction: trackClickInteraction,\n    trackFormInteraction: trackFormInteraction\n  };\n});"],"names":["__cw__define","$","window","dataLayer","_environnement","_pageId","_autoTrackStartDate","enableLogging","consoleInfo","message","console","info","consoleWarn","warn","consoleError","error","debounce","func","timeout","timer","_this","this","_len","arguments","length","args","Array","_key","clearTimeout","setTimeout","apply","MOUSE_FLOW_FORM_NAME_PREFIX","FORM_COMPLETE_DELAY_MS","_trackedForms","getHubSpotFormGuid","form","hubSpotProperties","getHubSpotProperties","getHubSpotUserGuid","initFormControlTracking","formControlElement","element","formName","formElement","closest","getFormName","formControlName","getFormControlName","formControlInstanceId","attr","isTracked","formControls","instances","hasClass","off","trackFormControlInteraction","on","MutationObserver","mutations","observer","attributeName","trigger","observe","attributes","undefined","initSearchFormTracking","trackFormComplete","trackForm","formType","startsWith","tracked","getFormType","is","trackFormInteraction","form_guid","form_user_guid","form_value","getFormValue","find","each","trackFormBegin","$form","Date","now","callback","options","formCompleteTracked","push","JSON","stringify","trackFormCompleteImmediately","ex","toString","metric","form_metric","Number","getFormControlElementValue","isNaN","_callBack","eventName","interaction","form_type","form_name","form_step","event","val","isStepTracked","parse","values","validEntries","Object","entries","filter","entry","map","join","value","next","text","trim","replace","tagName","toLowerCase","getAttribute","files","trackClickInteraction","type","name","destination","location","clickData","click_type","click_name","click_destination","click_location","initAutoTracking","environnement","pageId","initFormTracking","debouncedRescan","disconnect","config","childList","subtree","targetNode","document","body","trackFormError"],"mappings":"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"}