/* /web/static/src/polyfills/object.js */ if(!Object.hasOwn){Object.hasOwn=(obj,key)=>Object.prototype.hasOwnProperty.call(obj,key);} if(!Object.groupBy){Object.defineProperty(Object,"groupBy",{configurable:true,enumerable:false,writable:true,value:function(items,callbackfn){const obj=Object.create(null);let i=0;for(const item of items){const key=callbackfn(item,i++);if(obj[key]){obj[key].push(item);}else{obj[key]=[item];}} return obj;},});}; /* /web/static/src/polyfills/array.js */ if(!Array.prototype.at){Object.defineProperty(Array.prototype,"at",{enumerable:false,value:function(index){if(index>=0){return this[index];} return this[this.length+index];},});}; /* /web/static/src/polyfills/promise.js */ if(!Promise.withResolvers){Promise.withResolvers=function withResolvers(){let resolve,reject;const promise=new Promise((res,rej)=>{resolve=res;reject=rej;});return{promise,resolve,reject};};}; /* /web/static/src/module_loader.js */ (function(odoo){"use strict";if(odoo.loader){return;} class ModuleLoader{bus=new EventTarget();checkErrorProm=null;factories=new Map();failed=new Set();jobs=new Set();modules=new Map();constructor(root){this.root=root;const strDebug=new URLSearchParams(location.search).get("debug");this.debug=Boolean(strDebug&&strDebug!=="0");} addJob(name){this.jobs.add(name);this.startModules();} define(name,deps,factory,lazy=false){if(typeof name!=="string"){throw new Error(`Module name should be a string, got: ${String(name)}`);} if(!Array.isArray(deps)){throw new Error(`Module dependencies should be a list of strings, got: ${String(deps)}`);} if(typeof factory!=="function"){throw new Error(`Module factory should be a function, got: ${String(factory)}`);} if(this.factories.has(name)){return;} this.factories.set(name,{deps,fn:factory,ignoreMissingDeps:globalThis.__odooIgnoreMissingDependencies,});if(!lazy){this.addJob(name);this.checkErrorProm||=Promise.resolve().then(()=>{this.checkErrorProm=null;this.reportErrors(this.findErrors());});}} findErrors(moduleNames){const findCycle=(currentModuleNames,visited)=>{for(const name of currentModuleNames||[]){if(visited.has(name)){const cycleModuleNames=[...visited,name];return cycleModuleNames.slice(cycleModuleNames.indexOf(name)).map((j)=>`"${j}"`).join(" => ");} const cycle=findCycle(dependencyGraph[name],new Set(visited).add(name));if(cycle){return cycle;}} return null;};moduleNames||=this.jobs;const dependencyGraph=Object.create(null);const missing=new Set();const unloaded=new Set();for(const moduleName of moduleNames){const{deps,ignoreMissingDeps}=this.factories.get(moduleName);dependencyGraph[moduleName]=deps;if(ignoreMissingDeps){continue;} unloaded.add(moduleName);for(const dep of deps){if(!this.factories.has(dep)){missing.add(dep);}}} const cycle=findCycle(moduleNames,new Set());const errors={};if(cycle){errors.cycle=cycle;} if(this.failed.size){errors.failed=this.failed;} if(missing.size){errors.missing=missing;} if(unloaded.size){errors.unloaded=unloaded;} return errors;} findJob(){for(const job of this.jobs){if(this.factories.get(job).deps.every((dep)=>this.modules.has(dep))){return job;}} return null;} async reportErrors(errors){if(!Object.keys(errors).length){return;} if(errors.failed){console.error("The following modules failed to load because of an error:",[...errors.failed,]);} if(errors.missing){console.error("The following modules are needed by other modules but have not been defined, they may not be present in the correct asset bundle:",[...errors.missing]);} if(errors.cycle){console.error("The following modules could not be loaded because they form a dependency cycle:",errors.cycle);} if(errors.unloaded){console.error("The following modules could not be loaded because they have unmet dependencies, this is a secondary error which is likely caused by one of the above problems:",[...errors.unloaded]);} const document=this.root?.ownerDocument||globalThis.document;if(document.readyState==="loading"){await new Promise((resolve)=>document.addEventListener("DOMContentLoaded",resolve));} if(this.debug){const style=document.createElement("style");style.className="o_module_error_banner";style.textContent=` body::before { font-weight: bold; content: "An error occurred while loading javascript modules, you may find more information in the devtools console"; position: fixed; left: 0; bottom: 0; z-index: 100000000000; background-color: #C00; color: #DDD; } `;document.head.appendChild(style);}} require(dependency){return this.modules.get(dependency);} startModules(){let job;while((job=this.findJob())){this.startModule(job);}} startModule(name){this.jobs.delete(name);const factory=this.factories.get(name);let module=null;try{module=factory.fn(this.require.bind(this));}catch(error){this.failed.add(name);throw new Error(`Error while loading "${name}":\n${error}`);} this.modules.set(name,module);this.bus.dispatchEvent(new CustomEvent("module-started",{detail:{moduleName:name,module},}));return module;}} const loader=new ModuleLoader();odoo.define=loader.define.bind(loader);odoo.loader=loader;if(odoo.debug&&!loader.debug){odoo.debug="";}})((globalThis.odoo||={}));; /* /web/static/src/polyfills/set.js */ odoo.define('@web/polyfills/set',[],function(require){'use strict';let __exports={};const difference=__exports.difference=function(s){if(!(s instanceof Set)){throw new Error("argument must be a Set");} return new Set([...this].filter((e)=>!s.has(e)));};if(!Set.prototype.difference){Object.defineProperty(Set.prototype,"difference",{enumerable:false,value:difference,});} return __exports;});; /* /web/static/src/polyfills/map.js */ odoo.define('@web/polyfills/map',[],function(require){'use strict';let __exports={};if(!Map.groupBy){Object.defineProperty(Map,"groupBy",{configurable:true,enumerable:false,writable:true,value:function(items,callbackfn){const map=new Map();let i=0;for(const item of items){const key=callbackfn(item,i++);if(map.has(key)){map.get(key).push(item);}else{map.set(key,[item]);}} return map;},});} return __exports;});; /* /web/static/src/session.js */ odoo.define('@web/session',[],function(require){'use strict';let __exports={};const session=__exports.session=odoo.__session_info__||{};delete odoo.__session_info__;return __exports;});; /* /web/static/src/core/browser/cookie.js */ odoo.define('@web/core/browser/cookie',[],function(require){'use strict';let __exports={};const COOKIE_TTL=24*60*60*365;const cookie=__exports.cookie={get _cookieMonster(){return document.cookie;},set _cookieMonster(value){document.cookie=value;},get(str){const parts=this._cookieMonster.split("; ");for(const part of parts){const[key,value]=part.split(/=(.*)/);if(key===str){return value||"";}}},set(key,value,ttl=COOKIE_TTL){let fullCookie=[];if(value!==undefined){fullCookie.push(`${key}=${value}`);} fullCookie=fullCookie.concat(["path=/",`max-age=${Math.floor(ttl)}`]);this._cookieMonster=fullCookie.join("; ");},delete(key){this.set(key,"kill",0);},};return __exports;});; /* /web/static/src/core/utils/ui.js */ odoo.define('@web/core/utils/ui',[],function(require){'use strict';let __exports={};__exports.closest=closest;function closest(elements,targetPos){let closestEl=null;let closestDistance=Infinity;for(const el of elements){const rect=el.getBoundingClientRect();const distance=getQuadrance(rect,targetPos);if(!closestEl||distance0&&el.offsetHeight>0;}else if("getBoundingClientRect"in el){const rect=el.getBoundingClientRect();_isVisible=rect.width>0&&rect.height>0;} if(!_isVisible&&getComputedStyle(el).display==="contents"){for(const child of el.children){if(isVisible(child)){return true;}}} return _isVisible;} __exports.getQuadrance=getQuadrance;function getQuadrance(rect,pos){const isPoint=!pos.width||!pos.height;if(isPoint){const dx=Math.max(rect.x-pos.x,0,pos.x-(rect.x+rect.width));const dy=Math.max(rect.y-pos.y,0,pos.y-(rect.y+rect.height));return dx**2+dy**2;} const rectCenter={x:rect.x+rect.width/2,y:rect.y+rect.height/2,};const posCenter={x:pos.x+pos.width/2,y:pos.y+pos.height/2,};const dx=Math.abs(rectCenter.x-posCenter.x);const dy=Math.abs(rectCenter.y-posCenter.y);const gapX=dx-(rect.width+pos.width)/2;const gapY=dy-(rect.height+pos.height)/2;if(gapX>=0||gapY>=0){return Math.max(0,gapX)**2+Math.max(0,gapY)**2;} const overlapRect={left:Math.max(rect.x,pos.x),right:Math.min(rect.x+rect.width,pos.x+pos.width),top:Math.max(rect.y,pos.y),bottom:Math.min(rect.y+rect.height,pos.y+pos.height),};const overlapArea=(overlapRect.right-overlapRect.left)*(overlapRect.bottom-overlapRect.top);const rectArea=rect.width*rect.height;return-(overlapArea/rectArea);} __exports.getVisibleElements=getVisibleElements;function getVisibleElements(activeElement,selector){const visibleElements=[];const elements=activeElement.querySelectorAll(selector);for(const el of elements){if(isVisible(el)){visibleElements.push(el);}} return visibleElements;} __exports.touching=touching;function touching(elements,targetRect){const r1={x:0,y:0,width:0,height:0,...targetRect};return[...elements].filter((el)=>{const r2=el.getBoundingClientRect();return(r2.x+r2.width>=r1.x&&r2.x<=r1.x+r1.width&&r2.y+r2.height>=r1.y&&r2.y<=r1.y+r1.height);});} const FOCUSABLE_SELECTORS=["[tabindex]","a","area","button","frame","iframe","input","object","select","textarea","details > summary:nth-child(1)",].map((sel)=>`${sel}:not(:disabled)`);const TABABLE_SELECTORS=FOCUSABLE_SELECTORS.map((sel)=>`${sel}:not([tabindex="-1"])`);__exports.isFocusable=isFocusable;function isFocusable(el){return el.matches(FOCUSABLE_SELECTORS.join(","))&&isVisible(el)&&!el.closest("[inert]");} __exports.getTabableElements=getTabableElements;function getTabableElements(container=document.body){const elements=[...container.querySelectorAll(TABABLE_SELECTORS.join(","))].filter((el)=>isVisible(el)&&!el.closest("[inert]"));const byTabIndex={};for(const el of[...elements]){if(!byTabIndex[el.tabIndex]){byTabIndex[el.tabIndex]=[];} byTabIndex[el.tabIndex].push(el);} const withTabIndexZero=byTabIndex[0]||[];delete byTabIndex[0];return[...Object.values(byTabIndex).flat(),...withTabIndexZero];} __exports.getNextTabableElement=getNextTabableElement;function getNextTabableElement(container=document.body){const tabableElements=getTabableElements(container);const index=tabableElements.indexOf(document.activeElement);return index===-1?tabableElements[0]:tabableElements[index+1]||null;} __exports.getPreviousTabableElement=getPreviousTabableElement;function getPreviousTabableElement(container=document.body){const tabableElements=getTabableElements(container);const index=tabableElements.indexOf(document.activeElement);return index===-1?tabableElements[tabableElements.length-1]:tabableElements[index-1]||null;} __exports.addLoadingEffect=addLoadingEffect;function addLoadingEffect(btnEl){let loaderContainerEl;if(!btnEl.classList.contains("o_btn_loading")){btnEl.classList.add("o_btn_loading","disabled","pe-none");btnEl.disabled=true;btnEl.setAttribute("aria-disabled","true");loaderContainerEl=document.createElement("span");loaderContainerEl.classList.add("o_btn_loading_spinner");const loaderEl=document.createElement("span");loaderEl.classList.add("spinner-border","spinner-border-sm");loaderContainerEl.appendChild(loaderEl);btnEl.prepend(loaderContainerEl);}else{btnEl.classList.add("o_btn_keep_loading");loaderContainerEl=btnEl.querySelector(".o_btn_loading_spinner");} return()=>{if(btnEl.classList.contains("o_btn_keep_loading")){btnEl.classList.remove("o_btn_keep_loading");return;} btnEl.classList.remove("o_btn_loading","disabled","pe-none");btnEl.disabled=false;btnEl.removeAttribute("aria-disabled");loaderContainerEl.remove();};} __exports.isClickable=isClickable;function isClickable(el){return isVisible(el)&&!el.closest(":disabled, [aria-disabled='true'], .disabled, [inert]");} return __exports;});; /* /web/static/src/public/utils.js */ odoo.define('@web/public/utils',['@web/core/utils/ui'],function(require){'use strict';let __exports={};const PairSet=__exports.PairSet=class PairSet{constructor(){this.map=new Map();} add(elem1,elem2){if(!this.map.has(elem1)){this.map.set(elem1,new Set());} this.map.get(elem1).add(elem2);} has(elem1,elem2){if(!this.map.has(elem1)){return false;} return this.map.get(elem1).has(elem2);} delete(elem1,elem2){if(!this.map.has(elem1)){return;} const s=this.map.get(elem1);s.delete(elem2);if(!s.size){this.map.delete(elem1);}}} const{addLoadingEffect}=require("@web/core/utils/ui");const DEBOUNCE=__exports.DEBOUNCE=400;const BUTTON_HANDLER_SELECTOR=__exports.BUTTON_HANDLER_SELECTOR='a, button, input[type="submit"], input[type="button"], .btn';__exports.makeAsyncHandler=makeAsyncHandler;function makeAsyncHandler(fct,preventEventPropagation=false){let pending=false;function _isLocked(){return pending;} function _lock(){pending=true;} function _unlock(){pending=false;} return function(ev){if(preventEventPropagation){ev.preventDefault();ev.stopPropagation();ev.stopImmediatePropagation();} if(_isLocked()){return;} _lock();const result=fct.apply(this,arguments);Promise.resolve(result).finally(_unlock);return result;};} __exports.makeButtonHandler=makeButtonHandler;function makeButtonHandler(fct,preventEventPropagation=false){fct=makeAsyncHandler(fct,preventEventPropagation);return function(ev){const handlerResult=fct.apply(this,arguments);const buttonEl=ev.target.closest(BUTTON_HANDLER_SELECTOR);if(!(buttonEl instanceof HTMLElement)){return handlerResult;} buttonEl.classList.add("pe-none");let showDebouncedLoading=false;const addLoadingIfPending=()=>{buttonEl.classList.remove("pe-none");if(showDebouncedLoading){const restore=addLoadingEffect(buttonEl);Promise.resolve(handlerResult).then(restore,restore);}};Promise.race([handlerResult,new Promise((resolve)=>setTimeout(resolve,DEBOUNCE)).then(()=>{showDebouncedLoading=true;}),]).then(addLoadingIfPending,addLoadingIfPending);return handlerResult;};} __exports.patchDynamicContentEntry=patchDynamicContentEntry;function patchDynamicContentEntry(dynamicContent,selector,t,replacement){dynamicContent[selector]=dynamicContent[selector]||{};const forSelector=dynamicContent[selector];if(replacement===undefined){delete forSelector[t];}else if(typeof replacement==="function"&&t!=="t-component"){if(!forSelector[t]){forSelector[t]=()=>{};} const oldFn=forSelector[t];if(["t-att-class","t-att-style"].includes(t)){forSelector[t]=(el,oldResult)=>{const result=oldResult||{};Object.assign(result,oldFn(el,result));Object.assign(result,replacement(el,result));return result;};}else if(t.startsWith("t-on-")){forSelector[t]=(el,...args)=>replacement(el,oldFn,...args);}else{forSelector[t]=(el,oldResult)=>{let result=oldResult;result=oldFn(el,result);result=replacement(el,result);return result;};}}else{forSelector[t]=replacement;}} __exports.patchDynamicContent=patchDynamicContent;function patchDynamicContent(dynamicContent,replacement){for(const[selector,forSelector]of Object.entries(replacement)){for(const[t,forT]of Object.entries(forSelector)){patchDynamicContentEntry(dynamicContent,selector,t,forT);}}} return __exports;});; /* /web/static/src/public/lazyloader.js */ odoo.define('@web/public/lazyloader',['@web/public/utils'],function(require){'use strict';let __exports={};const{BUTTON_HANDLER_SELECTOR,makeAsyncHandler,makeButtonHandler}=require("@web/public/utils");let allScriptsLoadedResolve=null;const _allScriptsLoaded=new Promise(resolve=>{allScriptsLoadedResolve=resolve;}).then(stopWaitingLazy);const retriggeringWaitingProms=[];const bufferedClicks=new Map();async function waitForLazyAndRetrigger(ev){const targetEl=ev.target;if(ev.type==="click"&&!bufferedClicks.has(targetEl)){bufferedClicks.set(targetEl,ev);} await _allScriptsLoaded;await Promise.all(retriggeringWaitingProms);setTimeout(()=>{if(targetEl.isConnected){targetEl.dispatchEvent(new ev.constructor(ev.type,ev));}},0);} const loadingEffectHandlers=[];function registerLoadingEffectHandler(el,type,handler){el.addEventListener(type,handler,{capture:true});loadingEffectHandlers.push({el,type,handler});} let waitingLazy=false;function waitLazy(){if(waitingLazy){return;} waitingLazy=true;document.body.classList.add('o_lazy_js_waiting');const mainEl=document.getElementById('wrapwrap')||document.body;const loadingEffectButtonEls=[...mainEl.querySelectorAll(BUTTON_HANDLER_SELECTOR)].filter(el=>{return!el.classList.contains('o_no_wait_lazy_js')&&!(el.nodeName==='A'&&el.href&&el.getAttribute('href')!=='#');});const loadingEffectEventTypes=['mouseover','mouseenter','mousedown','mouseup','click','mouseout','mouseleave'];for(const buttonEl of loadingEffectButtonEls){for(const eventType of loadingEffectEventTypes){const loadingEffectHandler=eventType==='click'?makeButtonHandler(waitForLazyAndRetrigger,true):makeAsyncHandler(waitForLazyAndRetrigger,true);registerLoadingEffectHandler(buttonEl,eventType,loadingEffectHandler);}} for(const formEl of document.querySelectorAll('form:not(.o_no_wait_lazy_js)')){registerLoadingEffectHandler(formEl,'submit',ev=>{ev.preventDefault();ev.stopImmediatePropagation();});}} function stopWaitingLazy(){if(!waitingLazy){return;} waitingLazy=false;document.body.classList.remove('o_lazy_js_waiting');for(const{el,type,handler}of loadingEffectHandlers){el.removeEventListener(type,handler,{capture:true});}} if(document.readyState!=='loading'){waitLazy();}else{document.addEventListener('DOMContentLoaded',function(){waitLazy();});} if(document.readyState==='complete'){setTimeout(_loadScripts,0);}else{window.addEventListener('load',function(){setTimeout(_loadScripts,0);});} function _loadScripts(scripts,index){if(scripts===undefined){scripts=document.querySelectorAll('script[data-src]');} if(index===undefined){index=0;} if(index>=scripts.length){allScriptsLoadedResolve();return;} const script=scripts[index];script.addEventListener('load',_loadScripts.bind(this,scripts,index+1));script.setAttribute('defer','defer');script.src=script.dataset.src;script.removeAttribute('data-src');} __exports[Symbol.for("default")]={loadScripts:_loadScripts,allScriptsLoaded:_allScriptsLoaded,registerPageReadinessDelay:retriggeringWaitingProms.push.bind(retriggeringWaitingProms),};return __exports;});; /* /html_editor/static/src/main/media/video/abstract_third_party_video.js */ odoo.define('@html_editor/main/media/video/abstract_third_party_video',['@html_editor/main/media/video/utils'],function(require){'use strict';let __exports={};const{getUrlOptions}=require("@html_editor/main/media/video/utils");const AbstractThirdPartyVideo=__exports.AbstractThirdPartyVideo=class AbstractThirdPartyVideo{static id="";static name="";static urlMatcher=/$/i;static optionsConfig={};static getEmbedUrl(videoId,options={}){return"";} static isValidVideoUrl(url){url=url.trim();if(!/^https?:\/\//.test(url)){url="https://"+url;} if(!URL.canParse(url)){return false;} return this.urlMatcher.exec(url)||false;} static getVideoUrlData(urlMatch,forcedOptions={}){const baseUrl=new URL(urlMatch[0]);const videoId=urlMatch.groups.id;const options={...getUrlOptions(baseUrl,this.optionsConfig||{}),...(this?.getCustomUrlOptions?.(baseUrl)||{}),...forcedOptions,};if(options.autoplay){options.muted=true;} return{baseUrl:urlMatch[0],platform:this.id,videoId,embedUrl:this.getEmbedUrl(videoId,options),thumbnailUrl:this.getThumbnailUrl?.(videoId)||"",options,};} static createPlayerElement(videoData,document=window.document){const iframeEl=document.createElement("iframe");iframeEl.setAttribute("loading","lazy");iframeEl.setAttribute("frameborder","0");iframeEl.setAttribute("contenteditable","false");iframeEl.setAttribute("allowfullscreen","allowfullscreen");iframeEl.src=videoData.embedUrl;return iframeEl;}} return __exports;});; /* /html_editor/static/src/main/media/video/providers/dailymotion.js */ odoo.define('@html_editor/main/media/video/providers/dailymotion',['@html_editor/main/media/video/abstract_third_party_video','@html_editor/main/media/video/utils'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const{encodeOptionsToParams}=require("@html_editor/main/media/video/utils");const Dailymotion=__exports.Dailymotion=class Dailymotion extends AbstractThirdPartyVideo{static id="dailymotion";static name="Dailymotion";static urlMatcher=/^(https?:\/\/)(www\.)?(dailymotion\.com\/(embed\/video\/|embed\/|video\/|hub\/.*#video=)|geo\.dailymotion\.com\/player\.html\?video=|dai\.ly\/)(?[A-Za-z0-9]{6,7})(?:[-_][-_a-z]*)?(?:[?&=](?:[0-9a-z]+))*$/i;static optionsConfig={startFrom:{default:0,type:Number,params:["startTime"]},};static getEmbedUrl(videoId,options={}){const params=encodeOptionsToParams(options,Dailymotion.optionsConfig);return`https://geo.dailymotion.com/player.html?video=${videoId}${ params ? "&" + params : "" }`;} static getThumbnailUrl(videoId){return`https://www.dailymotion.com/thumbnail/video/${videoId}`;} static exampleUrls={base:"https://www.dailymotion.com/video/x7svr6t",extra:"https://www.dailymotion.com/video/x2jvvep_hakan-yukur-klip_sport",embed:"https://geo.dailymotion.com/player.html?video=x7svr6t",minified:"dai.ly/x7svr6t",params:"https://www.dailymotion.com/video/x7svr6t?startTime=62",embedParams:"https://geo.dailymotion.com/player.html?video=x7svr6t&startTime=62",dailymotion_old_embed:"https://www.dailymotion.com/embed/video/x578has?autoplay=1",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/facebook.js */ odoo.define('@html_editor/main/media/video/providers/facebook',['@html_editor/main/media/video/abstract_third_party_video'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const Facebook=__exports.Facebook=class Facebook extends AbstractThirdPartyVideo{static id="facebook";static name="Facebook";static urlMatcher=/^(?:https?:\/\/)?(?:www\.)?facebook\.com(?:\/(?:[^/]+\/)?videos\/|\/watch\/?\?v=|(?:\/username)?\/reel\/|\/plugins\/video\.php\?[^ ]*?href=.*?(?:videos|reel)%2f)(?\d+)(\/|%2f)?$/i;static getEmbedUrl(videoId,options={}){const encodedUrl=encodeURIComponent(`https://www.facebook.com/username/videos/${videoId}/`);return`https://facebook.com/plugins/video.php?href=${encodedUrl}`;} static exampleUrls={base:"https://www.facebook.com/username/videos/2206239373151307/",watch:"facebook.com/watch/?v=2206239373151307",reel:"https://www.facebook.com/username/reel/2206239373151307/",embed:"https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fusername%2Fvideos%2F2206239373151307%2F",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/gdrive_video.js */ odoo.define('@html_editor/main/media/video/providers/gdrive_video',['@html_editor/main/media/video/abstract_third_party_video'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const GDriveVideo=__exports.GDriveVideo=class GDriveVideo extends AbstractThirdPartyVideo{static id="gDrive";static name="Google Drive";static urlMatcher=/^https:\/\/drive\.google\.com\/file\/d\/(?.*?)\/.*?(?:\?[0-9a-z_\-=&]+)?$/i;static getEmbedUrl(videoId,options={}){return`https://drive.google.com/file/d/${videoId}/preview`;} static exampleUrls={base:"https://drive.google.com/file/d/1A2B3C4D5E6F7G8H9I0J/view?usp=sharing",embed:"drive.google.com/file/d/1A2B3C4D5E6F7G8H9I0J/preview",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/instagram.js */ odoo.define('@html_editor/main/media/video/providers/instagram',['@html_editor/main/media/video/abstract_third_party_video'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const Instagram=__exports.Instagram=class Instagram extends AbstractThirdPartyVideo{static id="instagram";static name="Instagram";static urlMatcher=/^(?:https?:\/\/)?(?:(.*)instagram\.com|instagr\.am)(?:\/([a-zA-Z0-9\-_\\.]+))?\/(?:p|reels?)\/(?[a-zA-Z0-9\-_\\.]+)(?:\/embed)?\/?$/i;static optionsConfig={isVertical:{default:true,type:Boolean},};static getEmbedUrl(videoId,options={}){return`https://www.instagram.com/p/${videoId}/embed/`;} static getThumbnailUrl(videoId){return`https://www.instagram.com/p/${videoId}/media/?size=t`;} static exampleUrls={base:"https://www.instagram.com/p/B6dXGTxggTG",minified:"instagr.am/p/B6dXGTxggTG/",reel:"https://www.instagram.com/reel/B6dXGTxggTG/",reel2:"https://www.instagram.com/odoo.official/reel/B6dXGTxggTG/",reels:"https://www.instagram.com/reels/DPD1qwXDBwy/",embed:"https://www.instagram.com/p/B6dXGTxggTG/embed/",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/loom.js */ odoo.define('@html_editor/main/media/video/providers/loom',['@html_editor/main/media/video/abstract_third_party_video','@html_editor/main/media/video/utils'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const{encodeOptionsToParams,BooleanInt}=require("@html_editor/main/media/video/utils");const Loom=__exports.Loom=class Loom extends AbstractThirdPartyVideo{static id="loom";static name="Loom";static urlMatcher=/^https:\/\/(?:www\.)?loom\.com\/(?:embed|share)\/(?[0-9a-z]+)\\?(?:[?&]([0-9a-zA-Z_]+)=([0-9a-zA-Z_-]+))*$/i;static optionsConfig={startFrom:{default:0,type:Number,params:["t"]},autoplay:{default:false,type:BooleanInt,params:["autoplay"]},muted:{default:false,type:BooleanInt,params:["muted"]},hideControls:{default:false,type:BooleanInt,params:["hideEmbedTopBar"],linkedParams:["hide_share","hide_title","hide_owner","hide_speed"],reversed:true,},hideFullscreen:{default:false,type:BooleanInt,params:["fullscreen"],reversed:true,},};static getEmbedUrl(videoId,options={}){const params=encodeOptionsToParams(options,Loom.optionsConfig);return`https://www.loom.com/embed/${videoId}${params ? "?" + params : ""}`;} static exampleUrls={base:"https://www.loom.com/share/e5b8c04bca094dd8a5507925ab887002",embed:"https://www.loom.com/embed/e5b8c04bca094dd8a5507925ab887002",Params:"loom.com/share/e5b8c04bca094dd8a5507925ab887002?autoplay=1&t=62",embedParams:"https://www.loom.com/embed/e5b8c04bca094dd8a5507925ab887002?autoplay=1&t=62s&hide_share=1&hideEmbedTopBar=0&hide_title=0&hide_owner=1&hide_speed=1&fullscreen=1",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/twitch.js */ odoo.define('@html_editor/main/media/video/providers/twitch',['@html_editor/main/media/video/abstract_third_party_video','@html_editor/main/media/video/utils'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const{encodeOptionsToParams}=require("@html_editor/main/media/video/utils");const Twitch=__exports.Twitch=class Twitch extends AbstractThirdPartyVideo{static id="twitch";static name="Twitch";static urlMatcher=/^(?:https?:\/\/)?(?:www\.|player\.|clips\.)?twitch\.tv\/(?:(?:(?:videos\/|embed\?clip=)|\?(?:([0-9a-z]+)=([0-9a-z_\-.]+)&)*video=)|[0-9a-z_]{4,25}\/clip\/)(?[0-9a-zA-Z_-]+)(?:[?&=]([0-9a-z_\-.]+))*$/i;static optionsConfig={startFrom:{default:0,type:Number,params:["time"]},autoplay:{default:true,type:Boolean,params:["autoplay"]},muted:{default:false,type:Boolean,params:["muted"]},isClip:{default:false,type:Boolean},};static getEmbedUrl(videoId,options={}){const isClip=options.isClip;const params=encodeOptionsToParams(options,Twitch.optionsConfig);const parentDomain=window.location.hostname;let embedUrl="";if(isClip){embedUrl=`https://clips.twitch.tv/embed?clip=`;}else{embedUrl=`https://player.twitch.tv/?video=`;} embedUrl+=`${videoId}&parent=${parentDomain}${params ? "&" + params : ""}`;return embedUrl;} static getCustomUrlOptions(url){return{isClip:url.hostname.includes("clip")};} static exampleUrls={base:"https://www.twitch.tv/videos/1064007405",clip:"https://www.twitch.tv/monstercat/clip/UnrulyShySalamanderPogChamp?filter=clips&range=7d&sort=time",embed:"https://player.twitch.tv/?video=1064007405&parent=example.com",embedClip:"https://clips.twitch.tv/embed?clip=UnrulyShySalamanderPogChamp&parent=example.com",params:"twitch.tv/videos/1064007405?time=62&autoplay=true&muted=true",embedParams:"https://player.twitch.tv/?video=1064007405&parent=example.com&time=62&autoplay=true&muted=true",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/video_file.js */ odoo.define('@html_editor/main/media/video/providers/video_file',[],function(require){'use strict';let __exports={};const VideoFile=__exports.VideoFile=class VideoFile{static id="video_file";static name="Video file";static optionsConfig={autoplay:{default:false,type:Boolean},muted:{default:false,type:Boolean},loop:{default:false,type:Boolean},hideControls:{default:false,type:Boolean},isVertical:{default:false,type:Boolean},startFrom:{default:0,type:Number},};static parseUrl(url){url=(url||"").trim();if(!url){return false;} let parsedUrl;try{parsedUrl=new URL(url);}catch{return false;} return["http:","https:"].includes(parsedUrl.protocol)?parsedUrl:false;} static playableMimetypes=["video/mp4","video/webm","video/ogg"];static mimetypesByExtension={"3gp":"video/3gpp",avi:"video/x-msvideo",flv:"video/x-flv",m3u8:"application/vnd.apple.mpegurl",m4v:"video/mp4",mkv:"video/x-matroska",mov:"video/quicktime",mp4:"video/mp4",mpd:"application/dash+xml",mpeg:"video/mpeg",mpg:"video/mpeg",ogg:"video/ogg",ogv:"video/ogg",ts:"video/mp2t",webm:"video/webm",wmv:"video/x-ms-wmv",};static getMimetypeFromUrl(parsedUrl){const filename=parsedUrl.pathname.split("/").pop();const extension=filename.includes(".")?filename.split(".").pop().toLowerCase():"";return this.mimetypesByExtension[extension]||"";} static async isValidVideoUrl(url){const parsedUrl=this.parseUrl(url);if(!parsedUrl){return false;} const mimetype=this.getMimetypeFromUrl(parsedUrl);if(mimetype&&!this.playableMimetypes.includes(mimetype)){return false;} const isVideo=await new Promise((resolve)=>{const videoEl=document.createElement("video");const conclude=(isVideo)=>{clearTimeout(timeoutId);videoEl.onloadedmetadata=null;videoEl.onerror=null;videoEl.pause();videoEl.src="";videoEl.load();resolve(isVideo);};const timeoutId=setTimeout(()=>conclude(false),8000);videoEl.onloadedmetadata=()=>conclude(videoEl.videoWidth>0);videoEl.onerror=()=>conclude(false);videoEl.preload="metadata";videoEl.muted=true;videoEl.src=url;});return isVideo?[url.trim()]:false;} static getVideoUrlData(urlMatch,forcedOptions={}){const url=urlMatch[0].trim();const[baseUrl,fragment=""]=url.split(/#(.*)/);const startFrom=parseInt(fragment.match(/^t=(\d+)/)?.[1]||0,10);const options={...Object.fromEntries(Object.entries(this.optionsConfig).map(([name,config])=>[name,config.default])),startFrom,...forcedOptions,};if(options.autoplay){options.muted=true;} return{baseUrl,platform:this.id,videoId:"",embedUrl:this.getEmbedUrl(baseUrl,options),thumbnailUrl:"",options,};} static getEmbedUrl(url,options={}){const startFrom=parseInt(options.startFrom,10);return startFrom>0?`${url}#t=${startFrom}`:url;} static createPlayerElement(videoData,document=window.document){const{embedUrl,options={}}=videoData;const videoEl=document.createElement("video");videoEl.setAttribute("src",embedUrl);videoEl.setAttribute("playsinline","");videoEl.toggleAttribute("controls",!options.hideControls);videoEl.toggleAttribute("loop",!!options.loop);videoEl.toggleAttribute("autoplay",!!options.autoplay);videoEl.toggleAttribute("muted",!!options.muted);videoEl.muted=!!options.muted;videoEl.setAttribute("preload","none");videoEl.setAttribute("contenteditable","false");return videoEl;} static getOptionsFromElement(videoEl){return{autoplay:videoEl.hasAttribute("autoplay"),loop:videoEl.hasAttribute("loop"),hideControls:!videoEl.hasAttribute("controls"),};}} return __exports;});; /* /html_editor/static/src/main/media/video/providers/vimeo.js */ odoo.define('@html_editor/main/media/video/providers/vimeo',['@html_editor/main/media/video/abstract_third_party_video','@html_editor/main/media/video/utils'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const{encodeOptionsToParams,BooleanInt}=require("@html_editor/main/media/video/utils");const Vimeo=__exports.Vimeo=class Vimeo extends AbstractThirdPartyVideo{static id="vimeo";static name="Vimeo";static urlMatcher=/^(?:(?:https?:)?\/\/)?(player.)?vimeo.com\/([a-z]*\/)?(?[^?]+)(?:\/(?[^?]+))?(?:\?(?\S+))?$/i;static optionsConfig={startFrom:{default:0,type:Number},autoplay:{default:false,type:BooleanInt,params:["autoplay"]},muted:{default:false,type:BooleanInt,params:["muted"]},loop:{default:false,type:BooleanInt,params:["loop"]},hideControls:{default:false,type:BooleanInt,params:["controls"],reversed:true},hideFullscreen:{default:false,type:BooleanInt,params:["fullscreen"],reversed:true,},};static getEmbedUrl(videoId,options={}){const params=encodeOptionsToParams(options,Vimeo.optionsConfig);let embedUrl=`https://player.vimeo.com/video/${videoId}${params ? "?" + params : ""}`;if(options.startFrom){embedUrl+=`#t=${options.startFrom}`;} return embedUrl;} static async getThumbnailUrl(videoId){const apiResponse=await fetch(`https://vimeo.com/api/oembed.json?url=https://vimeo.com/${encodeURIComponent(videoId)}`);if(!apiResponse.ok){console.warn(`Failed to fetch thumbnail for vimeo video ${videoId} with status ${apiResponse.status}`);return"";} const data=await apiResponse.json();return data.thumbnail_url||"";} static exampleUrls={base:"https://vimeo.com/395399735",unlisted:"https://vimeo.com/795669787/0763fdb816",embed:"https://player.vimeo.com/video/395399735",embedUnlisted:"https://player.vimeo.com/video/795669787?h=0763fdb816",params:"vimeo.com/395399735?autoplay=1#t=62",embedParams:"https://player.vimeo.com/video/395399735?controls=0&fullscreen=1&autoplay=1#t=62",};} return __exports;});; /* /html_editor/static/src/main/media/video/providers/youtube.js */ odoo.define('@html_editor/main/media/video/providers/youtube',['@html_editor/main/media/video/abstract_third_party_video','@html_editor/main/media/video/utils'],function(require){'use strict';let __exports={};const{AbstractThirdPartyVideo}=require("@html_editor/main/media/video/abstract_third_party_video");const{encodeOptionsToParams,BooleanInt}=require("@html_editor/main/media/video/utils");const Youtube=__exports.Youtube=class Youtube extends AbstractThirdPartyVideo{static id="youtube";static name="YouTube";static urlMatcher=/^(?:https?:\/\/)?(?:www\.|m\.)?(?:youtu\.be\/|youtube(-nocookie)?\.com\/(?:embed\/|v\/|shorts\/|live\/|watch\?v=|watch\?.+&v=))(?(?:\w|-){11})\S*$/i;static optionsConfig={startFrom:{default:0,type:Number,params:["start","t"]},autoplay:{default:false,type:BooleanInt,params:["autoplay"]},muted:{default:false,type:BooleanInt,params:["mute"]},loop:{default:false,type:BooleanInt,params:["loop"]},hideControls:{default:false,type:BooleanInt,params:["controls"],reversed:true},hideFullscreen:{default:false,type:BooleanInt,params:["fs"],reversed:true},isVertical:{default:false,type:Boolean},noCookie:{default:false,type:Boolean},playlist:{default:"",type:String,linkedParams:["playlist"]},enableJsApi:{default:false,type:BooleanInt,params:["enablejsapi"]},showRelatedVideos:{default:true,type:BooleanInt,params:["rel"]},};static getEmbedUrl(videoId,options={}){const noCookie=options.noCookie?"-nocookie":"";if(options.loop){options.playlist=videoId;} const params=encodeOptionsToParams(options,Youtube.optionsConfig);return`https://www.youtube${noCookie}.com/embed/${videoId}${params ? "?" + params : ""}`;} static getThumbnailUrl(videoId){return`https://img.youtube.com/vi/${videoId}/0.jpg`;} static getCustomUrlOptions(url){return{noCookie:url.hostname.includes("youtube-nocookie"),enableJsApi:true,showRelatedVideos:false,};} static exampleUrls={base:"https://www.youtube.com/watch?v=jar2eqeMNjc",short:"https://www.youtube.com/shorts/qAgW3oG7Zmc",live:"https://www.youtube.com/live/fmVNEoxr7iU?feature=shared",mobile:"https://m.youtube.com/watch?v=xCvFZrrQq7k",minified:"youtu.be/xCvFZrrQq7k",noCookie:"https://www.youtube-nocookie.com/watch?v=xCvFZrrQq7k",embed:"https://www.youtube.com/embed/xCvFZrrQq7k",params:"https://www.youtube.com/watch?v=xCvFZrrQq7k&t=62&autoplay=1&loop=1&controls=0&fs=0",embedParams:"https://www.youtube.com/embed/xCvFZrrQq7k?start=62&autoplay=1&loop=1&controls=0&fs=0",};} return __exports;});; /* /html_editor/static/src/main/media/video/utils.js */ odoo.define('@html_editor/main/media/video/utils',[],function(require){'use strict';let __exports={};const BooleanInt=__exports.BooleanInt=class BooleanInt{} const convertOptionValueToUrlParam=(value,optionConfig)=>{const{type,reversed}=optionConfig;switch(type){case Boolean:{let convertedValue=[true,"1","true"].includes(value)?"true":"false";if(reversed){convertedValue=convertedValue==="true"?"false":"true";} return convertedValue;} case BooleanInt:{let convertedValue=[true,"1","true"].includes(value)?"1":"0";if(reversed){convertedValue=convertedValue==="1"?"0":"1";} return convertedValue;} case Number:return value.toString();case String:return value;} console.warn(`Unsupported option type: ${type}, returning raw option value.`);return value.toString();};const parseParams=(paramValue,optionConfig)=>{const{type,reversed}=optionConfig;switch(type){case BooleanInt:case Boolean:{let value=["1","true"].includes(paramValue);if(reversed){value=!value;} return value;} case Number:return parseInt(paramValue);case String:return paramValue;} console.warn(`Unsupported option type: ${type}, returning raw param value.`);return paramValue;};__exports.encodeOptionsToParams=encodeOptionsToParams;function encodeOptionsToParams(options,optionsConfig,useBoolean=false){const URLParams=[];for(const optionName of Object.keys(options).sort()){const optionValue=options[optionName];const config=optionsConfig?.[optionName];if(config?.params?.length){const paramName=config.params[0];const isDefaultValue=optionValue===config.default;if(!isDefaultValue){let paramValue=convertOptionValueToUrlParam(optionValue,config);if(useBoolean&&config.type===Boolean){paramValue=paramName?"true":"false";} URLParams.push(`${encodeURI(paramName)}=${encodeURI(paramValue)}`);}} if(config?.linkedParams?.length){for(const paramName of config.linkedParams){const isDefaultValue=optionValue===config.default;if(!isDefaultValue){let paramValue=convertOptionValueToUrlParam(optionValue,config);if(useBoolean&&config.type===Boolean){paramValue=paramName?"true":"false";} URLParams.push(`${encodeURI(paramName)}=${encodeURI(paramValue)}`);}}}} return URLParams.join("&");} function getOption(url,optionConfig){let value=optionConfig.default;const urlParams=url.searchParams;if(optionConfig.params){for(const param of optionConfig.params){const paramValue=urlParams.get(param);if(paramValue){value=parseParams(paramValue,optionConfig);break;}}} return value;} __exports.getUrlOptions=getUrlOptions;function getUrlOptions(url,optionsConfig){const options={};for(const[key,config]of Object.entries(optionsConfig)){const optionValue=getOption(url,config);options[key]=optionValue;} return options;} return __exports;});; /* /website/static/src/utils/misc.js */ odoo.define('@website/utils/misc',['@web/core/browser/cookie'],function(require){'use strict';let __exports={};const{cookie:cookieManager}=require("@web/core/browser/cookie");const EventBus=__exports.EventBus=class EventBus extends EventTarget{trigger(name,payload){this.dispatchEvent(new CustomEvent(name,{detail:payload}));}} __exports.getClosestLiEls=getClosestLiEls;function getClosestLiEls(selector){return Array.from(document.querySelectorAll(selector),(el)=>el.closest("li"));} __exports.unhideConditionalElements=unhideConditionalElements;function unhideConditionalElements(){const styleEl=document.createElement("style");styleEl.id="conditional_visibility";document.head.appendChild(styleEl);const conditionalEls=document.querySelectorAll('[data-visibility="conditional"]');const desktopMegaMenuLiEls=getClosestLiEls("header#top nav:not(.o_header_mobile) .o_mega_menu_toggle");const mobileMegaMenuLiEls=getClosestLiEls("header#top nav.o_header_mobile .o_mega_menu_toggle");for(const conditionalEl of conditionalEls){if(conditionalEl.parentElement.classList.contains("o_mega_menu")){const desktopMegaMenuLiEl=conditionalEl.closest("li");const index=desktopMegaMenuLiEls.indexOf(desktopMegaMenuLiEl);const mobileMegaMenuLiEl=mobileMegaMenuLiEls[index];const visibilityId=conditionalEl.dataset.visibilityId;desktopMegaMenuLiEl.dataset.visibilityId=visibilityId;mobileMegaMenuLiEl.dataset.visibilityId=visibilityId;} const selectors=conditionalEl.dataset.visibilitySelectors;styleEl.sheet.insertRule(`${selectors} { display: none !important; }`);} for(const conditionalEl of conditionalEls){conditionalEl.classList.remove("o_conditional_hidden");}} __exports.setUtmsHtmlDataset=setUtmsHtmlDataset;function setUtmsHtmlDataset(){const htmlEl=document.documentElement;const cookieNamesToDataNames={utm_source:"utmSource",utm_medium:"utmMedium",utm_campaign:"utmCampaign",};for(const[name,dsName]of Object.entries(cookieNamesToDataNames)){const cookie=cookieManager.get(`odoo_${name}`);if(cookie){htmlEl.dataset[dsName]=cookie.replace(/(^["']|["']$)/g,"");}}} __exports.verifyHttpsUrl=verifyHttpsUrl;function verifyHttpsUrl(link){const url=new URL(link,window.location.href);if(!/https?:/.test(url.protocol)){return"";} return url;} return __exports;});; /* /website/static/src/js/content/inject_dom.js */ odoo.define('@website/js/content/inject_dom',['@web/session','@website/utils/misc'],function(require){'use strict';let __exports={};const{session}=require("@web/session");const{setUtmsHtmlDataset,getClosestLiEls,unhideConditionalElements,}=require("@website/utils/misc");document.addEventListener("DOMContentLoaded",()=>{setUtmsHtmlDataset();const htmlEl=document.documentElement;const country=session.geoip_country_code;if(country){htmlEl.dataset.country=country;} htmlEl.dataset.logged=!session.is_website_user;unhideConditionalElements();document.querySelectorAll(".o_mega_menu > section.o_snippet_desktop_invisible").forEach((el)=>el.closest("li").classList.add("hidden_mega_menu_li"));const mobileInvisibleMegaMenuLiEls=getClosestLiEls(".o_mega_menu > section.o_snippet_mobile_invisible");if(!mobileInvisibleMegaMenuLiEls.length){return;} const desktopMegaMenuLiEls=getClosestLiEls("header#top nav:not(.o_header_mobile) .o_mega_menu_toggle");const mobileMegaMenuLiEls=getClosestLiEls("header#top nav.o_header_mobile .o_mega_menu_toggle");for(const mobileInvisibleMegaMenuLiEl of mobileInvisibleMegaMenuLiEls){const index=desktopMegaMenuLiEls.indexOf(mobileInvisibleMegaMenuLiEl);mobileMegaMenuLiEls[index].classList.add("hidden_mega_menu_li");}});return __exports;});; /* /website/static/src/js/content/auto_hide_menu.js */ odoo.define('@website/js/content/auto_hide_menu',[],function(require){'use strict';let __exports={};const BREAKPOINT_SIZES={sm:"575",md:"767",lg:"991",xl:"1199",xxl:"1399"};let ignoreDOMMutations;__exports.setupIgnoreDOMMutations=setupIgnoreDOMMutations;function setupIgnoreDOMMutations(fn){ignoreDOMMutations=fn;} async function autoHideMenu(el,options){if(!el){return;} const navbar=el.closest(".navbar");const[breakpoint="md"]=navbar?Object.keys(BREAKPOINT_SIZES).filter((suffix)=>navbar.classList.contains(`navbar-expand-${suffix}`)):[];const isNoHamburgerMenu=!!navbar&&navbar.classList.contains("navbar-expand");const minSize=BREAKPOINT_SIZES[breakpoint];let wasExtraMenuOpenBefore=false;const docSelection=el.ownerDocument.getSelection();let{anchorNode,anchorOffset,focusNode,focusOffset}=docSelection;options=Object.assign({unfoldable:"none",images:[],loadingStyleClasses:[],autoClose:()=>true,},options||{});const isUserNavbar=el.parentElement.classList.contains("o_main_navbar");const dropdownSubMenuClasses=["show","border-0","position-static"];const dropdownToggleClasses=["h-auto","py-2","text-secondary"];const autoMarginLeftRegex=/\bm[sx]?(?:-(?:sm|md|lg|xl|xxl))?-auto\b/;const autoMarginRightRegex=/\bm[ex]?(?:-(?:sm|md|lg|xl|xxl))?-auto\b/;var extraItemsToggle=null;const afterFontsloading=new Promise((resolve)=>{if(document.fonts){document.fonts.ready.then(resolve);}else{setTimeout(resolve,150);}});afterFontsloading.then(_adapt);if(options.images.length){await _afterImagesLoading(options.images);_adapt();} let pending=false;let refreshId=null;const onRefresh=()=>{if(pending){refreshId=window.requestAnimationFrame(onRefresh);_adapt();pending=false;}else{refreshId=null;}};const throttleAdapt=()=>{if(refreshId===null){refreshId=window.requestAnimationFrame(onRefresh);_adapt();}else{pending=true;}};const observer=new ResizeObserver(throttleAdapt);for(const child of el.parentElement.children){observer.observe(child);} observer.observe(el.parentElement);observer.observe(navbar);function _restore(){if(!extraItemsToggle){return;} [...extraItemsToggle.querySelector(".dropdown-menu").children].forEach((item)=>{if(!isUserNavbar){item.classList.add("nav-item");const itemLink=item.querySelector(".dropdown-item");if(itemLink){itemLink.classList.remove("dropdown-item");itemLink.classList.add("nav-link");}}else{item.classList.remove("dropdown-item");const dropdownSubMenu=item.querySelector(".dropdown-menu");const dropdownSubMenuButton=item.querySelector(".dropdown-toggle");if(dropdownSubMenu){dropdownSubMenu.classList.remove(...dropdownSubMenuClasses);} if(dropdownSubMenuButton){dropdownSubMenuButton.classList.remove(...dropdownToggleClasses);}} el.insertBefore(item,extraItemsToggle);});extraItemsToggle.remove();extraItemsToggle=null;} function _adapt(){if(ignoreDOMMutations){ignoreDOMMutations(__adapt);return;} __adapt();} function __adapt(){if(options.loadingStyleClasses.length){el.classList.add(...options.loadingStyleClasses);} const extraMenuEl=_getExtraMenuEl();wasExtraMenuOpenBefore=extraMenuEl&&extraMenuEl.classList.contains("show");({anchorNode,anchorOffset,focusNode,focusOffset}=docSelection);_restore();if(!el.getClientRects().length||el.closest(".show")||(window.matchMedia(`(max-width: ${minSize}px)`).matches&&!isNoHamburgerMenu)){return _endAutoMoreMenu();} const unfoldableItems=[];const items=[...el.children].filter((node)=>{if(node.matches&&!node.matches(options.unfoldable)){return true;} unfoldableItems.push(node);return false;});var nbItems=items.length;var menuItemsWidth=items.reduce((sum,el)=>sum+computeFloatOuterWidthWithMargins(el,true,true,false),0);let maxWidth=0;if(!maxWidth){maxWidth=computeFloatOuterWidthWithMargins(el,true,true,true);var style=window.getComputedStyle(el);maxWidth-=parseFloat(style.paddingLeft)+ parseFloat(style.paddingRight)+ parseFloat(style.borderLeftWidth)+ parseFloat(style.borderRightWidth);maxWidth-=unfoldableItems.reduce((sum,el)=>sum+computeFloatOuterWidthWithMargins(el,true,true,false),0);} if(maxWidth-menuItemsWidth>=-0.001){return _endAutoMoreMenu();} const dropdownMenu=_addExtraItemsButton(items[nbItems-1].nextElementSibling);menuItemsWidth+=computeFloatOuterWidthWithMargins(extraItemsToggle,true,true,false);do{menuItemsWidth-=computeFloatOuterWidthWithMargins(items[--nbItems],true,true,false);}while(!(maxWidth-menuItemsWidth>=-0.001)&&nbItems>0);const extraItems=items.slice(nbItems);extraItems.forEach((el)=>{if(!isUserNavbar){const navLink=el.querySelector(".nav-link, a");el.classList.remove("nav-item");if(navLink){navLink.classList.remove("nav-link");navLink.classList.add("dropdown-item");}}else{const dropdownSubMenu=el.querySelector(".dropdown-menu");const dropdownSubMenuButton=el.querySelector(".dropdown-toggle");el.classList.add("dropdown-item","p-0");if(dropdownSubMenu){dropdownSubMenu.classList.add(...dropdownSubMenuClasses);} if(dropdownSubMenuButton){dropdownSubMenuButton.classList.add(...dropdownToggleClasses);}} dropdownMenu.appendChild(el);});_endAutoMoreMenu();} function computeFloatOuterWidthWithMargins(el,mLeft,mRight,considerAutoMargins){var rect=el.getBoundingClientRect();var style=window.getComputedStyle(el);var outerWidth=rect.right-rect.left;const isRTL=style.direction==="rtl";if(mLeft!==false&&(considerAutoMargins||!(isRTL?autoMarginRightRegex:autoMarginLeftRegex).test(el.getAttribute("class")))){outerWidth+=parseFloat(style.marginLeft);} if(mRight!==false&&(considerAutoMargins||!(isRTL?autoMarginLeftRegex:autoMarginRightRegex).test(el.getAttribute("class")))){outerWidth+=parseFloat(style.marginRight);} return isNaN(outerWidth)?0:outerWidth;} function _addExtraItemsButton(target){const dropdownMenu=document.createElement("ul");extraItemsToggle=document.createElement("li");const extraItemsToggleIcon=document.createElement("i");const extraItemsToggleLink=document.createElement("a");dropdownMenu.className="dropdown-menu";extraItemsToggle.className="nav-item dropdown o_extra_menu_items";extraItemsToggle.setAttribute("role","presentation");extraItemsToggleIcon.className="oi";extraItemsToggleIcon.dataset.icon="add";const extraItemsToggleAriaLabel=el.closest("[data-extra-items-toggle-aria-label]")?.dataset.extraItemsToggleAriaLabel;Object.entries({role:"menuitem",href:"#",class:"nav-link dropdown-toggle o-no-caret","data-bs-toggle":"dropdown","aria-expanded":false,"aria-label":extraItemsToggleAriaLabel||" ",}).forEach(([key,value])=>{extraItemsToggleLink.setAttribute(key,value);});extraItemsToggleLink.appendChild(extraItemsToggleIcon);extraItemsToggle.appendChild(extraItemsToggleLink);extraItemsToggle.appendChild(dropdownMenu);el.insertBefore(extraItemsToggle,target);if(!options.autoClose()){extraItemsToggleLink.setAttribute("data-bs-auto-close","outside");} return dropdownMenu;} function _afterImagesLoading(images){const defs=images.map((image)=>{if(image.complete||!image.getClientRects().length){return null;} return new Promise(function(resolve,reject){if(!image.width){image.classList.add("o_menu_image_placeholder");} image.addEventListener("load",()=>{image.classList.remove("o_menu_image_placeholder");resolve();});});});return Promise.all(defs);} function _getExtraMenuEl(){return el.querySelector(".o_extra_menu_items .dropdown-toggle");} function _endAutoMoreMenu(){const extraMenuEl=_getExtraMenuEl();const setSelection=()=>docSelection.setBaseAndExtent(anchorNode,anchorOffset,focusNode,focusOffset);const anchorInExtra=anchorNode?.parentElement.closest(".o_extra_menu_items .dropdown-menu");if(extraMenuEl&&(anchorInExtra||wasExtraMenuOpenBefore)){if(anchorInExtra){el.addEventListener("shown.bs.dropdown",setSelection,{once:true});} const dropdown=window.Dropdown.getOrCreateInstance(extraMenuEl);extraMenuEl.addEventListener("hidden.bs.dropdown",()=>dropdown.dispose(),{once:true,});dropdown.show();} el.classList.remove(...options.loadingStyleClasses);}} document.addEventListener("DOMContentLoaded",async()=>{const header=document.querySelector("header#top");if(header){const topMenu=header.querySelector(".top_menu");const unfoldable=".divider, .divider ~ li, .o_no_autohide_item, .js_language_selector";if(!topMenu.querySelector(`:scope > :not(${unfoldable})`)||header.classList.contains("o_no_autohide_menu")){topMenu.classList.remove("o_menu_loading");return;} const excludedImagesSelector=".o_mega_menu, .o_offcanvas_logo_container, .o_lang_flag";const excludedImages=[...header.querySelectorAll(excludedImagesSelector)];const images=[...header.querySelectorAll("img")].filter((img)=>{excludedImages.forEach((node)=>{if(node.contains(img)){return false;}});return img.matches&&!img.matches(excludedImagesSelector);});autoHideMenu(topMenu,{unfoldable:unfoldable,images:images,loadingStyleClasses:["o_menu_loading"],autoClose:()=>!document.body.classList.contains("editor_enable"),});}});return __exports;});; /* /website/static/src/js/content/redirect.js */ odoo.define('@website/js/content/redirect',['@web/session'],function(require){'use strict';let __exports={};const{session}=require("@web/session");document.addEventListener("DOMContentLoaded",()=>{if(session.is_website_user){return;} if(!window.frameElement){const frontendToBackendNavEl=document.querySelector(".o_frontend_to_backend_nav");if(frontendToBackendNavEl){frontendToBackendNavEl.classList.add("d-flex");frontendToBackendNavEl.classList.remove("d-none");} const currentUrl=new URL(window.location.href);currentUrl.pathname=`/@${currentUrl.pathname}`;if(currentUrl.searchParams.get("enable_editor")||currentUrl.searchParams.get("edit_translations")){document.body.innerHTML="";window.location.replace(currentUrl.href);return;} const backendEditBtnEl=document.querySelector(".o_frontend_to_backend_edit_btn");if(backendEditBtnEl){backendEditBtnEl.href=currentUrl.href;document.addEventListener("keydown",(ev)=>{if(ev.key==="a"&&ev.altKey){currentUrl.searchParams.set("enable_editor",1);currentUrl.searchParams.set("edit_translations",1);window.location.replace(currentUrl.href);}},true);}}else{const backendUserDropdownLinkEl=document.getElementById("o_backend_user_dropdown_link");if(backendUserDropdownLinkEl){backendUserDropdownLinkEl.classList.add("d-none");backendUserDropdownLinkEl.classList.remove("d-flex");} window.frameElement.dispatchEvent(new CustomEvent("OdooFrameContentLoaded"));}});return __exports;});; /* /website/static/src/js/content/adapt_content.js */ odoo.define('@website/js/content/adapt_content',[],function(require){'use strict';let __exports={};document.addEventListener("DOMContentLoaded",()=>{const htmlEl=document.documentElement;const editTranslations=!!htmlEl.dataset.edit_translations;if(editTranslations){[...document.querySelectorAll("textarea")].map((textarea)=>{if(textarea.value.indexOf("data-oe-translation-source-sha")!==-1){textarea.classList.add("o_text_content_invisible");}});}});return __exports;});; /* /website/static/src/js/content/generate_video_iframe.js */ odoo.define('@website/js/content/generate_video_iframe',['@html_editor/main/media/video/providers/youtube','@html_editor/main/media/video/providers/dailymotion','@html_editor/main/media/video/providers/vimeo','@html_editor/main/media/video/providers/gdrive_video','@html_editor/main/media/video/providers/instagram','@html_editor/main/media/video/providers/facebook','@html_editor/main/media/video/providers/twitch','@html_editor/main/media/video/providers/loom','@html_editor/main/media/video/providers/video_file'],function(require){'use strict';let __exports={};const{Youtube}=require("@html_editor/main/media/video/providers/youtube");const{Dailymotion}=require("@html_editor/main/media/video/providers/dailymotion");const{Vimeo}=require("@html_editor/main/media/video/providers/vimeo");const{GDriveVideo}=require("@html_editor/main/media/video/providers/gdrive_video");const{Instagram}=require("@html_editor/main/media/video/providers/instagram");const{Facebook}=require("@html_editor/main/media/video/providers/facebook");const{Twitch}=require("@html_editor/main/media/video/providers/twitch");const{Loom}=require("@html_editor/main/media/video/providers/loom");const{VideoFile}=require("@html_editor/main/media/video/providers/video_file");const PLATFORMS=__exports.PLATFORMS={youtube:Youtube,instagram:Instagram,facebook:Facebook,gDrive:GDriveVideo,dailymotion:Dailymotion,vimeo:Vimeo,twitch:Twitch,loom:Loom,};function manageIframeSrcOnLoad(iframeEl,src){if(!iframeEl.closest("[data-need-cookies-approval]")){iframeEl.setAttribute("src",src);}else{iframeEl.dataset.nocookieSrc=src;iframeEl.setAttribute("src","about:blank");iframeEl.dataset.needCookiesApproval="true";}} __exports.generateVideoPlayer=generateVideoPlayer;function generateVideoPlayer(parentEl,manageIframeSrcFct){let src=parentEl.dataset.embedUrl||parentEl.dataset.src||parentEl.dataset.oeExpression;if(!src){return;} parentEl.replaceChildren();const extraEditionEl=document.createElement("div");extraEditionEl.className="css_editable_mode_display";const extraSizeEl=document.createElement("div");extraSizeEl.className=parentEl.dataset.isVertical?"media_iframe_video_size_for_vertical":"media_iframe_video_size";parentEl.append(extraEditionEl,extraSizeEl);if(src.startsWith("//")){src="https:"+src;} if(!URL.canParse(src)){return null;} if(parentEl.dataset.platform===VideoFile.id){const options=JSON.parse(parentEl.dataset.videoOptions||"{}");const videoEl=VideoFile.createPlayerElement({embedUrl:src,options});parentEl.append(videoEl);return videoEl;} let platform=false;let urlMatch;for(const[p,pClass]of Object.entries(PLATFORMS)){urlMatch=pClass.isValidVideoUrl(src);if(urlMatch){platform=p;break;}} if(!platform){return null;} src=PLATFORMS[platform].getVideoUrlData(urlMatch).embedUrl;const iframeEl=document.createElement("iframe");iframeEl.setAttribute("frameborder","0");iframeEl.setAttribute("allowfullscreen","allowfullscreen");iframeEl.setAttribute("referrerpolicy","strict-origin-when-cross-origin");parentEl.appendChild(iframeEl);manageIframeSrcFct?manageIframeSrcFct(iframeEl,src):manageIframeSrcOnLoad(iframeEl,src);return iframeEl;} document.addEventListener("DOMContentLoaded",()=>{for(const videoContainerEl of document.querySelectorAll(".media_iframe_video")){if(!videoContainerEl.querySelector(":scope > :is(iframe, video)")){generateVideoPlayer(videoContainerEl);}}});return __exports;});; /* /website/static/src/js/content/age_verification_content_blur.js */ odoo.define('@website/js/content/age_verification_content_blur',['@web/core/browser/cookie'],function(require){'use strict';let __exports={};const{cookie}=require("@web/core/browser/cookie");document.addEventListener("DOMContentLoaded",()=>{const ageVerificationPopupEl=document.querySelector(".s_age_verification_popup:has([data-blur-background='true'])");if(ageVerificationPopupEl){const isAgeVerified=cookie.get(ageVerificationPopupEl.id);ageVerificationPopupEl.dataset.ageVerificationPending=!isAgeVerified;}});return __exports;});