{"version":3,"sources":["lazy-images.js","novicell.dynamic-image.js","novicell.gallery.js","novicell.input-mask.js","novicell.map.js","novicell.persistent-field.js","novicell.search.js","novicell.slider.js","novicell.validation.js","svane-tvis.accordion.js","svane-tvis.form.js","svane-tvis.language-popup.js","svane-tvis.map.js","svane-tvis.markedplace-filters.js","svane-tvis.markedplace.js","svane-tvis.markerclusterer.js","svane-tvis.megamenu.js","svane-tvis.navigation.js","svane-tvis.overlay.js","svane-tvis.shopSelector.js","svane-tvis.video.js","validate.js","lazysizes.js","master.js"],"names":["novicell","lastRefreshWidth","refreshWidth","window","lazySizesConfig","expand","lazyload","e","src","url","query","preventDefault","Object","defineProperty","this","get","target","preventLoad","classList","contains","setMeasuredUrl","setSrcSet","hasAttribute","setSrc","setBg","dynamicImage","getUrl","parentNode","style","backgroundImage","visibility","getAttribute","srcset","split","newSrcset","forEach","trim","bp","newSrc","queryUrl","push","setAttribute","join","checkImages","innerWidth","document","body","querySelectorAll","el","remove","add","addEventListener","debounce","nextQuerySign","indexOf","queryObjStr","queryObj","JSON","parse","keys","key","baseUrl","parentHeight","innerHeight","offsetHeight","parentWidth","offsetWidth","width","height","gallery","init","querySelector","productPage","casePage","galleryNav","galleryItem","linkHolder","nameHolder","Flickity","cellAlign","contain","pageDots","bgLazyLoad","wrapAround","cellSelector","prevNextButtons","arrowShape","x0","x1","y1","x2","y2","x3","on","change","index","itemName","itemLink","innerHTML","asNavFor","groupCells","scrollTrigger","scrollTo","behavior","left","top","offsetTop","inputMasking","masks","selector","mask","pattern","i","length","input","masking","vanillaTextMask","maskInput","inputElement","guide","map","isLoaded","options","markers","load","script","createElement","type","apiKey","appendChild","isScrolledIntoView","elemTop","getBoundingClientRect","bottom","opts","element","onscroll","console","error","initialize","storeMaps","mobileZoomLevel","mobileLat","mobileLng","desktopZoomLevel","desktopLat","desktopLng","parseFloat","zoomLevel","lat","lng","merge_options","obj","mapOptions","zoom","disableDefaultUI","draggable","scrollwheel","center","google","maps","Map","icon","hasOwnProperty","infoWindow","InfoWindow","content","scaledSize","Size","size","_loop","marker","mapMarker","Marker","position","LatLng","title","event","addListener","setContent","open","panTo","getPosition","panBy","clusterIcon","clusterWidth","clusterHeight","MarkerClusterer","gridSize","styles","textColor","maxZoom","averageCenter","bounds","LatLngBounds","extend","fitBounds","listener","getZoom","setZoom","removeListener","persistentField","sessionStorage","value","_ref","match","name","_slicedToArray","opt","checked","selected","Number","save","_ref3","setItem","test","removeItem","search","searchIcon","searchForm","searchInput","closeSearch","stopPropagation","toggle","setTimeout","focus","evt","keyCode","clickOnBody","slider","sliders","autoPlay","video","videoElements","videoElement","videoSrc","mobileSrc","validate","form","requiredCheckboxes","isChecked","checkedCheckboxInput","removeAttribute","fieldClass","errorClass","messageValueMissing","messageValueMissingCheckbox","messageValueMissingSelect","messageValueMissingRadio","messageValueMissingSelectMulti","messageTypeMismatchEmail","messageTypeMismatchURL","messageTooShort","messageTooLong","messagePatternMismatch","messageBadInput","messageStepMismatch","messageRangeOverflow","messageRangeUnderflow","messageGeneric","disableSubmit","onSubmit","beforeShowError","afterShowError","beforeRemoveError","afterRemoveError","svaneTvis","accordion","accordionAnimate","contentItem","closest","nextElementSibling","elementContent","undefined","elementContentHeight","newHeight","heightAttr","dataset","accordionToggles","location","hash","firstElementChild","scrollIntoView","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","s","documentElement","parentElement","nodeType","inputs","shops","shopList","shopEmail","shopSecondrayEmail","shop","selectedStore","selectedStoreName","display","preselected","selectedIndex","setCookie","languagePopup","browserLanguage","navigator","language","siteLanguage","lang","toLowerCase","languageOverlayShownCookie","readCookie","getElementById","overlay","create","class","onLoaded","backdrop","stayLink","closeBtn","click","parts","cookie","pop","shift","isTvis","IconWidth","IconHeight","featureType","elementType","stylers","color","weight","markedplaceFilters","app","Vue","data","allShops","activeCategories","showModal","currentModalData","itemtype","mounted","_this","axios","marketplaceApiUrl","then","response","catch","log","methods","getShopItems","_this2","items","filter","item","includes","itemType","openModal","_this3","$nextTick","$refs","carousel","adaptiveHeight","lazyLoad","closeModal","showText","animateHeight","showMoreText","showLessText","textShowMore","computed","shopsWithItems","_this4","categories","temp","shopItems","reduce","list","concat","some","x","disabled","markedplace","apps","getElementsByClassName","shopName","$el","marketplaceType","opt_markers","opt_options","OverlayView","map_","markers_","clusters_","sizes","styles_","ready_","gridSize_","minClusterSize_","maxZoom_","imagePath_","MARKER_CLUSTER_IMAGE_PATH_","imageExtension_","MARKER_CLUSTER_IMAGE_EXTENSION_","zoomOnClick_","averageCenter_","setupStyles_","setMap","prevZoom_","that","minZoom","Math","min","mapTypes","getMapTypeId","max","resetViewport","redraw","addMarkers","Cluster","markerClusterer","markerClusterer_","getMap","getGridSize","getMinClusterSize","isAverageCenter","center_","bounds_","clusterIcon_","ClusterIcon","getStyles","cluster","opt_padding","getMarkerClusterer","padding_","cluster_","div_","sums_","visible_","obj1","obj2","object","property","apply","onAdd","setReady_","draw","fitMapToMarkers","getMarkers","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","getMaxZoom","calculator_","numStyles","count","dv","parseInt","text","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","addMarker","removeMarker_","m","splice","removeMarker","removed","removeMarkers","markersCopy","slice","r","ready","createClusters_","getTotalClusters","setGridSize","setMinClusterSize","getExtendedBounds","projection","getProjection","tr","getNorthEast","bl","getSouthWest","trPix","fromLatLngToDivPixel","y","blPix","ne","fromDivPixelToLatLng","sw","isMarkerInBounds_","clearMarkers","opt_hide","oldClusters","distanceBetweenPoints_","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","addToClosestCluster_","distance","clusterToAddTo","getCenter","d","isMarkerInClusterBounds","mapBounds","getBounds","isMarkerAlreadyAdded","l","calculateBounds_","len","updateIcon","getSize","mz","hide","sums","setCenter","setSums","show","triggerClusterClick","trigger","pos","getPosFromLatLng_","cssText","createCss","getPanes","overlayMouseTarget","addDomListener","latlng","width_","height_","zIndex","MAX_ZINDEX","onRemove","removeChild","text_","index_","useStyle","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","_typeof","txtColor","txtSize","o","result","megamenu","expandButtons","expandButton","megaMenuItems","megaMenuItem","hoverintent","timeout","interval","imageItems","j","imageHolder","currentImage","navigation","navButton","closeButton","scrollTriggers","cname","cvalue","exdays","Date","setTime","getTime","expires","toUTCString","overlayTriggers","u","currentTrigger","videoId","autoplay","overlayMarkedPlaces","overlayMarkedPlace","triggerMarkedPlace","flkty","destroy","span","onclick","checkboxes","shopselector","shopsOverlay","id","playVideo","videos","iframe","isInViewport","playing","elem","bounding","clientHeight","right","clientWidth","root","factory","define","amd","exports","module","global","settings","supports","defaults","matchesSelector","mozMatchesSelector","oMatchesSelector","ownerDocument","extended","deep","arguments","toString","call","merge","prop","hasError","field","localSettings","validity","valid","valueMissing","typeMismatch","tooShort","replace","tooLong","badInput","stepMismatch","rangeOverflow","rangeUnderflow","patternMismatch","showError","group","getElementsByName","label","message","className","getClosest","insertBefore","nextSibling","removeError","addNoValidate","forms","blurHandler","clickHandler","submitHandler","hasErrors","fields","elements","removeEventListener","lazySizes","lazysizes","docElem","supportPicture","HTMLPictureElement","_addEventListener","_getAttribute","requestAnimationFrame","requestIdleCallback","regPicture","loadEvents","regClassCache","Array","hasClass","ele","cls","RegExp","addClass","removeClass","reg","addRemoveLoadEvents","dom","fn","action","triggerEvent","detail","noBubbles","noCancelable","createEvent","instance","initCustomEvent","dispatchEvent","updatePolyfill","full","polyfill","picturefill","pf","reevaluate","getCSS","getComputedStyle","getWidth","parent","minSize","_lazysizesWidth","rAF","running","waiting","firstFns","secondFns","fns","run","runFns","rafBatch","queue","hidden","_lsFlush","rAFIt","simple","args","throttle","lastTime","gDelay","rICTimeout","ricTimeout","now","idleCallback","isPriority","delay","func","timestamp","wait","later","last","lazySizesDefaults","lazyClass","loadedClass","loadingClass","preloadClass","autosizesClass","srcAttr","srcsetAttr","sizesAttr","customMedia","expFactor","hFac","loadMode","loadHidden","lazysizesConfig","loader","preloadElems","isCompleted","resetPreloadingTimer","started","eLvW","elvH","eLtop","eLleft","eLright","eLbottom","defaultExpand","preloadExpand","regImg","regIframe","supportScroll","userAgent","shrinkExpand","currentExpand","isLoading","lowRuns","resetPreloading","isNestedVisible","elemExpand","outerRect","visible","offsetParent","checkElements","eLlen","rect","autoLoadElem","loadedSomething","elemNegativeExpand","elemExpandVal","beforeExpandVal","lazyloadElems","_lazyRace","unveilElement","preloadAfterLoad","throttledCheckElements","switchLoadingClass","rafSwitchLoadingClass","rafedSwitchLoadingClass","changeIframeSrc","contentWindow","handleSources","source","sourceSrcset","lazyUnveil","isAuto","isImg","isPicture","firesLoad","defaultPrevented","nodeName","clearTimeout","getElementsByTagName","complete","naturalWidth","autoSizer","updateElem","onload","afterScroll","_","MutationObserver","observe","childList","subtree","attributes","setInterval","readyState","checkElems","unveil","autosizesElems","sizeElement","sources","dataAttr","getSizeElement","updateElementsSizes","debouncedUpdateElementsSizes","cfg","uP","aC","rC","hC","fire","gW","svg4everybody"],"mappings":"AAAA,aASA,IAAIA,SAAWA,UAAY,GAEvBC,iBAAmB,EACnBC,aAAe,GAGnBC,OAAOC,gBAAkBD,OAAOC,iBAAmB,GACnDD,OAAOC,gBAAgBC,OAAS,IAKhCL,SAASM,SAAWN,SAASM,UAAY,SAAUC,GAK/C,IAAIC,EAAIC,EAAIC,EAHZH,EAAEI,eAAiB,WACfC,OAAOC,eAAeC,KAAM,mBAAoB,CAACC,IAAK,WAAa,OAAO,MAG9E,IAAIC,EAAST,EAAES,OACXC,EAAcD,EAAOE,UAAUC,SAAS,qBAAuBH,EAAOE,UAAUC,SAAS,eACzFC,EAAiBJ,EAAOE,UAAUC,SAAS,oBAC3CE,EAAYL,EAAOM,aAAa,gBAAkBN,EAAOM,aAAa,kBACtEC,EAASP,EAAOM,aAAa,aAAeN,EAAOM,aAAa,kBAKpE,GAJGL,GACCV,EAAEI,iBAGHS,EAAgB,CACf,IAAII,EAAQR,EAAOE,UAAUC,SAAS,eACtCV,EAAMT,SAASyB,aAAaC,OAAOV,GAChCQ,IACCR,EAAOW,WAAWC,MAAMC,gBAAkB,OAASpB,EAAM,IACzDO,EAAOY,MAAME,WAAa,UAE9Bd,EAAOR,IAAMC,OAGZ,GAAGY,EAAW,CACfX,EAAQM,EAAOe,aAAa,kBAC5B,IAAIC,EAAShB,EAAOe,aAAa,eAAeE,MAAM,KACtDzB,EAAMQ,EAAOe,aAAa,YAC1B,IAAIG,EAAY,GAChBF,EAAOG,QAAQ,SAAS3B,GAIpB,IAAIC,GAFJD,GADAA,EAAMA,EAAI4B,QACAH,MAAM,MAEF,GACVI,EAAK7B,EAAI,GACT8B,EAAStC,SAASyB,aAAac,SAAS9B,EAAKC,GAEjDwB,EAAUM,KAAKF,EAAS,IAAMD,KAElCrB,EAAOyB,aAAa,SAAUP,EAAUQ,KAAK,OAG7C1B,EAAOyB,aAAa,MAAOzC,SAASyB,aAAac,SAAS/B,EAAKE,SAG3Da,IACJb,EAAQM,EAAOe,aAAa,kBAC5BvB,EAAMQ,EAAOe,aAAa,YAC1BtB,EAAMT,SAASyB,aAAac,SAAS/B,EAAKE,GAC1CM,EAAOyB,aAAa,MAAOhC,KASnC,IAAIkC,YAAc,YACVxC,OAAOyC,WAAa3C,iBAAmBC,cAAgBC,OAAOyC,WAAa3C,iBAAmBC,gBACzE2C,SAASC,KAAKC,iBAAiB,eACrCZ,QAAQ,SAASa,GAC5BA,EAAG9B,UAAU+B,OAAO,cACpBD,EAAG9B,UAAUgC,IAAI,cAErBjD,iBAAmBE,OAAOyC,aAQlCC,SAASM,iBAAiB,mBAAoBnD,SAASM,UAAU,GACjEH,OAAOgD,iBAAiB,SAAUnD,SAASoD,SAAST,aAAc,KAAK,ICzFnE3C,SAAWA,UAAY,IAElByB,aAAezB,SAASyB,cAAgB,WAwB7C,SAAS4B,EAAc5C,GACnB,OAA2B,EAApBA,EAAI6C,QAAQ,KAAY,IAAM,IAGzC,SAASf,EAAS9B,EAAK8C,GACnB,GAAIA,EAAa,CACb,IAAIC,EAAWC,KAAKC,MAAMH,GAE1B3C,OAAO+C,KAAKH,GAAUrB,QAAQ,SAASyB,GACnCnD,GAAyB,OAAlB+C,EAASI,GAAgBP,EAAc5C,GAAOmD,EAAM,IAAMJ,EAASI,GAAO,KAGzF,OAAOnD,EAGX,MAAO,CACH8B,SAAUA,EACVb,OAvCJ,SAAgBsB,GACZ,IAAIa,EAAUb,EAAGjB,aAAa,YAC1B+B,EAAed,EAAGrB,WAAWoC,aAAef,EAAGrB,WAAWqC,aAC1DC,EAAcjB,EAAGrB,WAAWiB,YAAcI,EAAGrB,WAAWuC,YAQxDC,EALJF,EAA8B,OAAhBA,EAAuBA,EADjB,GACgDA,EADhD,GAC+E,KAM/FG,EAASD,IALbL,EAAgC,OAAjBA,EAAwBA,EAFnB,GAEmDA,EAFnD,GAEmF,MAEhEG,GAUvC,OALAJ,GAAWM,EAAQd,EAAcQ,GAAW,SAAWM,EAAQ,GAI/DN,EAAUtB,EAHVsB,GAAsB,OAAXO,EAAkBf,EAAcQ,GAAW,UAAYO,EAAS,GAEzDpB,EAAGjB,aAAa,qBAnBO,ICC7C/B,SAAWA,UAAY,IAElBqE,QAAUrE,SAASqE,SAAW,IAAI,WAEvCvD,KAAKwD,KAAO,WACR,IAAMD,EAAUxB,SAAS0B,cAAc,eACjCC,EAAc3B,SAAS0B,cAAc,oBACrCE,EAAW5B,SAAS0B,cAAc,iBAClCG,EAAa7B,SAAS0B,cAAc,mBACpCI,EAAc9B,SAASE,iBAAiB,kBACxC6B,EAAa/B,SAAS0B,cAAc,yBACpCM,EAAahC,SAAS0B,cAAc,yBAC1C,GAAIC,EACmB,IAAIM,SAAST,EAAS,CAErCU,UAAW,OACXC,SAAS,EACTC,UAAU,EACVC,WAAY,EACZC,YAAY,EACZC,aAAc,iBACdC,iBAAiB,EACjBC,WAAY,CACRC,GAAI,GACJC,GAAI,GAAIC,GAAI,GACZC,GAAI,GAAIC,GAAI,GACZC,GAAI,MAKhB,GAAInB,EACmB,IAAIK,SAAST,EAAS,CAErCU,UAAW,OACXC,SAAS,EACTC,UAAU,EACVC,WAAY,EACZC,YAAY,EACZC,aAAc,iBACdC,iBAAiB,EACjBC,WAAY,CACRC,GAAI,GACJC,GAAI,GAAIC,GAAI,GACZC,GAAI,GAAIC,GAAI,GACZC,GAAI,IAERC,GAAI,CACAC,OAAQ,SAAUC,GACd,IAAIC,EAAWrB,EAAYoB,GAAOhE,aAAa,aAC3CkE,EAAWtB,EAAYoB,GAAOhE,aAAa,aAC/C6C,EAAWnC,aAAa,OAAQwD,GAChCpB,EAAWqB,UAAYF,MAOvC,GAAItB,GAA4B,MAAdA,EACQ,IAAII,SAASJ,EAAY,CAC3CQ,WAAY,EACZiB,SAAU9B,EACVW,SAAS,EACTC,UAAU,EACVF,UAAW,OACXqB,YAAY,IAKpB,IAAMC,EAAgBxD,SAAS0B,cAAc,sBACvCvD,EAAS6B,SAAS0B,cAAc,iBACjB,MAAjB8B,GAAmC,MAAVrF,GACzBqF,EAAclD,iBAAiB,QAAS,SAAU5C,GAC9CA,EAAEI,iBACFR,OAAOmG,SAAS,CACZC,SAAY,SACZC,KAAQ,EACRC,IAAOzF,EAAO0F,UAAY,OAE/B,MChFX1G,SAAWA,UAAY,IAElB2G,aAAe3G,SAAS2G,cAAgB,IAAI,WAEjD7F,KAAKwD,KAAO,WAyBR,IAvBA,IAAMsC,EAAQ,CACV,CACIC,SAAY,kBACZC,KAAQ,CAAC,KAAM,KAAM,IAAK,KAAM,KAAM,IAAK,KAAM,KAAM,IAAK,KAAM,MAClEC,QAAW,IAEf,CACIF,SAAY,gBACZC,KAAQ,CAAC,KAAM,KAAM,IAAI,KAAM,KAAM,IAAK,KAAM,KAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,MACtFC,QAAW,IAEf,CACIF,SAAY,iBACZC,KAAQ,CAAC,KAAM,KAAM,KAAM,KAAM,IAAI,IAAI,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACpGC,QAAW,IAEf,CACIF,SAAY,kBACZC,KAAQ,CAAC,QAAS,KAAM,IAAK,QAAS,KAAM,IAAK,KAAM,KAAM,KAAM,MACnEC,QAAW,KAIVC,EAAI,EAAGA,EAAIJ,EAAMK,OAAQD,IAAK,CAEnC,IAAIE,EAAQrE,SAAS0B,cAAcqC,EAAMI,GAAGH,UACxCC,EAAOF,EAAMI,GAAGF,KAChBC,EAAUH,EAAMI,GAAGD,QAGpBG,GAASJ,IAGLC,GACCG,EAAMzE,aAAa,UAAWsE,GAGlCH,EAAMI,GAAGG,QAAUC,gBAAgBC,UAAU,CACzCC,aAAcJ,EACdJ,KAAMA,EACNS,OAAO,SChDvBvH,SAAWA,UAAY,IAClBwH,IAAMxH,SAASwH,KAAO,IAAI,WAC/B,IACIC,GAAW,EACXC,EAAU,GACVC,EAAU,GAoLd,SAASC,IACLH,GAAW,EAEX,IAAII,EAAShF,SAASiF,cAAc,UACpCD,EAAOE,KAAO,kBACdF,EAAOrH,IAAM,gFAAkFkH,EAAQM,OACvGnF,SAASC,KAAKmF,YAAYJ,GAG9B,SAASK,EAAmBlF,GACxB,IAAImF,EAAUnF,EAAGoF,wBAAwB3B,IAGzC,OAAsB,GAFLzD,EAAGoF,wBAAwBC,QAEfF,GAAWhI,OAAO4D,YA/LnDjD,KAAKwD,KAAO,SAAUgE,GAGlB,IAFAZ,EAAUY,GAEGzB,SAKb,GAAKa,EAAQM,OAAb,CAKA,IAAIO,EAAU1F,SAAS0B,cAAcmD,EAAQb,WAExCY,GAAYc,GAAWL,EAAmBK,GAC3CX,IAGA/E,SAAS2F,SAAW,YACXf,GAAYc,GAAWL,EAAmBK,IAC3CX,UAZRa,QAAQC,MAAM,8CALdD,QAAQC,MAAM,4CAuBtB5H,KAAK6H,WAAa,WACd,IAAIJ,EAAU1F,SAAS0B,cAAcmD,EAAQb,UAGzC+B,EAAY/F,SAAS0B,cAAc,kBACnCsE,EAAkB,EAClBC,EAAY,EACZC,EAAY,EACZC,EAAmB,EACnBC,EAAa,EACbC,EAAa,EAEbN,IACAC,EAAkBM,WAAWP,EAAU7G,aAAa,qBACpD+G,EAAYK,WAAWP,EAAU7G,aAAa,oBAC9CgH,EAAYI,WAAWP,EAAU7G,aAAa,oBAC9CiH,EAAmBG,WAAWP,EAAU7G,aAAa,sBACrDkH,EAAaE,WAAWP,EAAU7G,aAAa,qBAC/CmH,EAAaC,WAAWP,EAAU7G,aAAa,sBAInD,IAAIqH,EAAYJ,EACZK,EAAMJ,EACNK,EAAMJ,EAGN/I,OAAOyC,WAAa,MACpBwG,EAAYP,EACZQ,EAAMP,EACNQ,EAAMP,GAiBVrB,EAwHJ,SAAS6B,EAAcC,EAAKhJ,GAExBI,OAAO+C,KAAKnD,GAAK2B,QAAQ,SAAUyB,GAC3B4F,EAAI5F,aAAgBhD,OACpB2I,EAAcC,EAAI5F,GAAMpD,EAAIoD,IAE5B4F,EAAI5F,GAAOpD,EAAIoD,KAGvB,OAAO4F,EAjIGD,CAdK,CACXE,WAAY,CACRC,KAAMN,EACNO,kBAAkB,EAClBC,WAAW,EACXC,aAAa,EACbC,OAAQ,CACJT,IAAKA,EACLC,IAAKA,KAMiB5B,GAGlC,IAAIF,EAAM,IAAIuC,OAAOC,KAAKC,IAAI1B,EAASb,EAAQ+B,YAE3CS,EAAO,GAQX,GAAIxC,EAAQyC,eAAe,cACvB,IAAIC,EAAa,IAAIL,OAAOC,KAAKK,WAAW,CACxCC,QAAS,uBAKb5C,EAAQyC,eAAe,UACnBzC,EAAQwC,KAAKC,eAAe,SAC5BD,EAAKzJ,IAAMiH,EAAQwC,KAAKzJ,KAGxBiH,EAAQwC,KAAKC,eAAe,UAC5BD,EAAKK,WAAa,IAAIR,OAAOC,KAAKQ,KAAK9C,EAAQwC,KAAKO,KAAKtG,MAAOuD,EAAQwC,KAAKO,KAAKrG,UAK1F,IA9E0B,IAAAsG,EAAA,SA8EjB1D,GACL,IAAI2D,EAASjD,EAAQC,QAAQX,GAEzB4D,EAAY,IAAIb,OAAOC,KAAKa,OAAO,CACnCC,SAAU,IAAIf,OAAOC,KAAKe,OAAO5B,WAAWwB,EAAOtB,KAAMF,WAAWwB,EAAOrB,MAC3E0B,MAAOL,EAAOK,MACdd,KAAMA,EACN1C,IAAKA,IAGTG,EAAQnF,KAAKoI,GAEThC,GAEAmB,OAAOC,KAAKiB,MAAMC,YAAYN,EAAW,QAAS,WAC9CR,EAAWe,WAAWR,EAAOP,YAC7BA,EAAWgB,KAAK5D,EAAKoD,GAErBpD,EAAI6D,MAAMT,EAAUU,eACpB9D,EAAI+D,MAAM,GAAI,QAnBjBvE,EAAI,EAAGA,EAAIU,EAAQC,QAAQV,OAAQD,IAAK0D,EAAxC1D,GAwBT,IAEIwE,EAAc,6CACdC,EAAe,GACfC,EAAgB,GAJP7I,SAAS0B,cAAc,iBAOhCiH,EAAc,8CAEdE,EADAD,EAAe,IAkBC,IAAIE,gBAAgBnE,EAAKG,EAP7B,CACZiE,SAAU,GACVC,OATgB,CAAC,CACjBC,UAAW,QACXrL,IAAK+K,EACLpH,OAAQsH,EACRvH,MAAOsH,IAMPM,QAAS,GACTC,eAAe,IASnB,IADgBnJ,SAAS0B,cAAc,gBACzB,CACV,IAAI0H,EAAS,IAAIlC,OAAOC,KAAKkC,aAC7B,IAASlF,EAAI,EAAGA,EAAIW,EAAQV,OAAQD,IAChCiF,EAAOE,OAAOxE,EAAQX,GAAGsE,eAG7B9D,EAAI4E,UAAUH,GAGlB,IAAII,EAAWtC,OAAOC,KAAKiB,MAAMC,YAAY1D,EAAK,OAAQ,WAClC,GAAhBA,EAAI8E,WACJ9E,EAAI+E,QAAQ,IAEhBxC,OAAOC,KAAKiB,MAAMuB,eAAeH,uaClLzCrM,SAAWA,UAAY,IAElByM,gBAAkBzM,SAASyM,iBAAmB,IAAI,WAEvD3L,KAAKwD,KAAO,WAER,IAAK,IAAMV,KAAO8I,eAAgB,CAC9B,IAAMC,EAAQD,eAAe9I,GADCgJ,EAEbhJ,EAAIiJ,MAAM,eAAiB,GAAnCC,EAFqBC,eAAAH,EAAA,GAAA,GAG9B,GAAIE,EAAM,CACN,IACI,IAAME,EAAMnK,SAAS0B,cAAT,eAAsCuI,EAAtC,aAAuDH,EAAvD,aAAyEG,EAAzE,cAA2FH,EAA3F,MACZ,GAAIK,EAAK,CACLA,EAAIC,QAAUD,EAAIE,UAAW,EAC7B,UAEN,MAAM3M,IACR,IAAM2G,EAAQrE,SAAS0B,cAAT,UAAiCuI,EAAjC,MACd,GAAI5F,EAAO,CACP,GAAGA,EAAMhG,UAAUC,SAAS,sBACxB,OAIe,aAAf+F,EAAMa,KACNb,EAAM+F,QAAUE,OAAOR,GAEvBzF,EAAMyF,MAAQA,IAM9B,SAASS,EAATC,GAA4B,IAAJrG,EAAIqG,EAAZrM,OACTgG,EAAE9F,UAAUC,SAAS,uBAIxBuL,eAAeY,QAAQ,QAAUtG,EAAE8F,KAAiB,aAAX9F,EAAEe,KAAsBoF,OAAOnG,EAAEiG,SAAWjG,EAAE2F,OAI3F9J,SAASC,KAAKK,iBAAiB,QAASiK,GACxCvK,SAASC,KAAKK,iBAAiB,SAAUiK,GACzCvK,SAASC,KAAKK,iBAAiB,SAAU,WACrC,IAAK,IAAIS,KAAO8I,eACR,aAAaa,KAAK3J,IAClB8I,eAAec,WAAW5J,QCzD1C5D,SAAWA,UAAY,IAClByN,OAASzN,SAASyN,QAAU,WAEjC,IAAIC,EAAa7K,SAAS0B,cAAc,4BACpCoJ,EAAa9K,SAAS0B,cAAc,mBACpCqJ,EAAc/K,SAAS0B,cAAc,oBAwCzC,SAASsJ,IACLF,EAAWzM,UAAU+B,OAAO,oBAEhC,MAAO,CACHqB,KA1CJ,WAEqB,MAAdoJ,GACCA,EAAWvK,iBAAiB,QAAS,SAAU5C,GAC3CA,EAAEuN,kBA2BVH,EAAWzM,UAAU6M,OAAO,oBAC5BH,EAAYjB,MAAQ,GACpBqB,WAAW,WACPJ,EAAYK,SACb,MA7BI,GAIW,MAAfL,GACCA,EAAYzK,iBAAiB,QAAS,SAAU+K,GAExB,MADpBA,EAAMA,GAAO/N,OAAO8K,OACZkD,SACJN,MAEL,GAIU,MAAdF,GACC9K,SAASM,iBAAiB,QAAS,SAAU5C,GACzC,IAAI6N,EAAc7N,EAAES,QAAU2M,GAAcpN,EAAES,OAAOW,WAAWA,YAAcgM,EAC3EA,EAAWzM,UAAUC,SAAS,qBAAuBiN,GACpDP,MAEL,KAhCsB,ICOjC7N,SAAWA,UAAY,IAElBqO,OAASrO,SAASqO,QAAU,IAAI,WAErCvN,KAAKwD,KAAO,WAER,IADA,IAAMgK,EAAUzL,SAASE,iBAAiB,cACjCiE,EAAI,EAAGA,EAAIsH,EAAQrH,OAAQD,IAAK,CACrC,IAAMuB,EAAU+F,EAAQtH,GACxB,GAAIuB,GAAsB,MAAXA,EACC,IAAIzD,SAASyD,EAAS,CAE9BxD,UAAW,OACXC,SAAS,EACTE,WAAY,EACZqJ,SAAU,MAYtB,SAASC,IAEL,IADA,IAAMC,EAAgB5L,SAASE,iBAAiB,oBACvCiE,EAAI,EAAGA,EAAIyH,EAAcxH,OAAQD,IAAK,CAC3C,IAAM0H,EAAeD,EAAczH,GAC/B2H,EAAWD,EAAa3M,aAAa,oBACrC6M,EAAYF,EAAa3M,aAAa,mBAE1C,GAAI5B,OAAOyC,WAAa,IAAM,CAC1B,GAAiB,IAAbgM,EAGA,OAFAD,EAAWC,EAKnBF,EAAajM,aAAa,MAAOkM,IApBzCH,IAEArO,OAAOgD,iBAAiB,SAAU,WAC9BqL,SCtBRxO,SAAWA,UAAY,IAElB6O,SAAW7O,SAAS6O,UAAY,IAAI,WAEzC,IAAIC,EAAOjM,SAAS0B,cAAc,SAElCzD,KAAKwD,KAAO,WAGR,IADA,IAAIyK,EAAqBlM,SAASE,iBAAiB,sBAC1CiE,EAAI,EAAGA,EAAI+H,EAAmB9H,OAAQD,IAAK,CAC/B+H,EAAmB/H,GAC3B7D,iBAAiB,SAAU,WAEhC,IADA,IAAI6L,GAAY,EACPhI,EAAI,EAAGA,EAAI+H,EAAmB9H,OAAQD,IAAK,CAEjB,GADP+H,EAAmB/H,GACvBiG,UAChB+B,GAAY,GAGpB,IAAK,IAAIhI,EAAI,EAAGA,EAAI+H,EAAmB9H,OAAQD,IAAK,CAChD,IAAMiI,EAAuBF,EAAmB/H,GAC5CgI,GACAC,EAAqBC,gBAAgB,YACjCD,EAAqB/N,UAAUC,SAAS,UACxC8N,EAAqB/N,UAAU+B,OAAO,UAG1CgM,EAAqBxM,aAAa,WAAY,OAIvD,GAGHqM,GAEAD,SAASvK,KAAK,CAEVuC,SAAU,kBACVsI,WAAY,QACZC,WAAY,gBAGZC,oBAAqBP,EAAK/M,aAAa,2BACvCuN,4BAA6BR,EAAK/M,aAAa,2BAC/CwN,0BAA2BT,EAAK/M,aAAa,yBAC7CyN,yBAA0BV,EAAK/M,aAAa,wBAC5C0N,+BAAgC,gCAChCC,yBAA0BZ,EAAK/M,aAAa,iCAC5C4N,uBAAwB,wBACxBC,gBAAiB,4FACjBC,eAAgB,6FAChBC,uBAAwB,4CACxBC,gBAAiB,0BACjBC,oBAAqB,gCACrBC,qBAAsB,oCACtBC,sBAAuB,sCACvBC,eAAgB,kCAGhBC,eAAe,EACfC,SAAU,aAGVC,gBAAiB,SAAU/P,GACvBA,EAAEW,UAAUgC,IAAI,cAEpBqN,eAAgB,aAChBC,kBAAmB,aACnBC,iBAAkB,kBC9E9BC,UAAYA,WAAa,IAEnBC,UAAYD,UAAUC,WAAa,IAAI,WAmD7C,SAASC,EAAiBrI,GACtB,IAAIsI,EAActI,EAAQuI,QAAQ,wBAAwBC,mBAC1DF,EAAY3P,UAAU6M,OAAO,2BAC7BxF,EAAQrH,UAAU6M,OAAO,iCAEzB,IAAIiD,EAAiBH,EAAYtM,cAAc,yBAE/C,GAAsB0M,MAAlBD,EAA6B,CAC7B,IAAIE,EAAuBF,EAAehN,aACtCmN,OAAAA,EACAC,EAAaP,EAAYQ,QAAQjN,YAElB6M,IAAfG,GACAD,EAAYN,EAAY7M,aAAekN,EACvCL,EAAYQ,QAAQjN,OAASyM,EAAY7M,cAGrCmN,EADAC,EAAaP,EAAY7M,aACboN,EAEAP,EAAY7M,aAAekN,EAG/CL,EAAYjP,MAAMwC,OAAS+M,EAAY,MAxE/CrQ,KAAKwD,KAAO,WAKR,IAHA,IAAIgN,EAAmBzO,SAASE,iBAAiB,wBAGxCiE,GAFOnE,SAASE,iBAAiB,cAE7B,GAAGiE,EAAIsK,EAAiBrK,OAAQD,IACzCsK,EAAiBtK,GAAG7D,iBAAiB,QAAS,SAAU5C,GACpDA,EAAEI,iBAEFiQ,EADgBrQ,EAAES,UAM1B,IAAIuQ,EAAWpR,OAAOoR,SAASC,KAC/B,IAAkC,GAA9BD,EAASjO,QAAQ,SAAgB,CACjC,IAAIN,EAAKH,SAAS0B,cAAcgN,GAC5BvO,IACAA,EAAGyO,kBAAkBC,eAAe,CAChCnL,SAAY,WAEhBqK,EAAiB5N,EAAGyO,sBAO3BE,QAAQC,UAAUC,UACnBF,QAAQC,UAAUC,QAAUF,QAAQC,UAAUE,mBAC1CH,QAAQC,UAAUG,uBAGrBJ,QAAQC,UAAUd,UAEnBa,QAAQC,UAAUd,QAAU,SAAUkB,GAClC,IAAIhP,EAAKlC,KACT,IAAK+B,SAASoP,gBAAgB9Q,SAAS6B,GACnC,OAAO,KAEX,EAAG,CACC,GAAIA,EAAG6O,QAAQG,GACX,OAAOhP,EAEXA,EAAKA,EAAGkP,eAAiBlP,EAAGrB,iBAChB,OAAPqB,GAA+B,IAAhBA,EAAGmP,UAC3B,OAAO,SCjDfzB,UAAYA,WAAa,IAEnB5B,KAAO4B,UAAU5B,MAAQ,IAAI,WACnChO,KAAKwD,KAAO,WACR,IAAI8N,EAASvP,SAASE,iBAAiB,uBACnCsP,EAAQxP,SAASE,iBAAiB,oBAClCuP,EAAWzP,SAAS0B,cAAc,aAEtC,GAAe,MAAZ+N,GAAoBD,EAAMpL,OAAO,CAKhC,IAJA,IAAIsL,EAAY1P,SAAS0B,cAAc,cACnCiO,EAAqB3P,SAAS0B,cAAc,gBAFhBmG,EAAA,SAKvB1D,GACSoL,EAAOpL,GAEf7D,iBAAiB,SAAU,WAC7B,IAEIsP,EAAOJ,EAFMrL,EAAI,GAEQjF,aAAa,SAC1CuQ,EAAS3F,MAAQ8F,EAEjB,IAAIC,EAAgB7P,SAAS0B,cAAc,mBACvCoO,EAAoB9P,SAAS0B,cAAc,wBAE/CmO,EAAc9Q,MAAMgR,QAAU,QAC9BD,EAAkBzM,UAAYuM,EAG9B,IAAII,EAAcP,EAAS5K,QAAQ4K,EAASQ,eAE5CP,EAAU9P,aAAa,QAASoQ,EAAY9Q,aAAa,eACzDyQ,EAAmB/P,aAAa,QAASoQ,EAAY9Q,aAAa,mBAEnE,IArBEiF,EAAI,EAAGA,EAAIoL,EAAOnL,OAAQD,IAAK0D,EAA/B1D,GAyBTsL,EAASnP,iBAAiB,SAAU,SAAU5C,GAC1C,IAAI2M,EAAWoF,EAAS5K,QAAQ4K,EAASQ,eAEzCP,EAAU9P,aAAa,QAASyK,EAASnL,aAAa,eACtDyQ,EAAmB/P,aAAa,QAASyK,EAASnL,aAAa,sBCzC3E/B,SAAWA,UAAY,GAD3B,IAEI+S,UAAYA,WAAa,cAFzBrC,UAAYA,WAAa,IAInBsC,cAAgBtC,UAAUsC,eAAiB,IAAI,WACrDlS,KAAKwD,KAAO,WACR,IAAI2O,EAAkB9S,OAAO+S,UAAUC,SACnCC,EAAevQ,SAASoP,gBAAgBoB,KAAKC,cAC7CC,EAA6BC,WAAW,yBAChB3Q,SAAS4Q,eAAe,+BACOxC,IAA/BsC,GAA6D,OAAjBH,GAA8C,OAApBH,GAAgD,OAApBA,GAAgD,OAApBA,IACtJjT,SAAS0T,QAAQC,OAAO,CACpB9M,SAAW,yBACX+M,MAAS,iCACTC,SAAY,WACR,IAAIC,EAAWjR,SAAS4Q,eAAe,oBACvCK,EAAS5S,UAAUgC,IAAI,mCACvB,IAAI6Q,EAAWD,EAASvP,cAAc,2BACnCwP,GACCA,EAAS5Q,iBAAiB,QAAS,SAAS5C,GACxCA,EAAEI,iBACF,IAAIqT,EAAWnR,SAAS4Q,eAAe,yBACpCO,GACCA,EAASC,aAM7BlB,UAAU,uBAAwB,OAAQ,MAKtD,IAAIS,WAAa,SAAU1G,GACvB,IACIoH,GADQ,KAAOrR,SAASsR,QACVlS,MAAM,KAAO6K,EAAO,KACtC,GAAoB,GAAhBoH,EAAMjN,OACN,OAAOiN,EAAME,MAAMnS,MAAM,KAAKoS,SCpClC1M,SADA3H,SAAWA,UAAY,GACb2H,SAAW,IACrB2K,SAAWA,UAAY,IAHvB5B,UAAYA,WAAa,IAKnBlJ,IAAMkJ,UAAUlJ,KAAO,IAAI,WACjC,IAAI8M,EAASzR,SAAS0B,cAAc,eAEhC2F,EAAO,4CACPqK,EAAY,GACZC,EAAa,GAEbF,IACApK,EAAO,6CACPqK,EAAY,GACZC,EAAa,IAGjB1T,KAAKwD,KAAO,WACRtE,SAASwH,IAAIlD,KAAK,CACd0D,OAAQ,0CACRnB,SAAU,cACVqD,KAAM,CACFzJ,IAAKyJ,EACLO,KAAM,CACFtG,MAAOoQ,EACPnQ,OAAQoQ,IAIhBpK,WAAY,GACZX,WAAY,CACRE,kBAAkB,EAClBC,WAAW,EACXC,aAAa,EACbgC,OAAQ,CAAC,CAAC4I,YAAc,QAAQC,YAAc,gBAAgBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,UAAUE,QAAU,CAAC,CAACC,MAAQ,WAAW,CAAC9S,WAAa,SAAS,CAAC2S,YAAc,eAAeC,YAAc,kBAAkBC,QAAU,CAAC,CAAC7S,WAAa,MAAM,CAAC8S,MAAQ,aAAa,CAACH,YAAc,eAAeC,YAAc,gBAAgBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,aAAaC,YAAc,gBAAgBC,QAAU,CAAC,CAAC7S,WAAa,MAAM,CAAC8S,MAAQ,WAAW,CAACC,OAAS,OAAO,CAACJ,YAAc,aAAaC,YAAc,kBAAkBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,MAAMC,YAAc,gBAAgBC,QAAU,CAAC,CAAC7S,WAAa,MAAM,CAAC8S,MAAQ,aAAa,CAACH,YAAc,iBAAiBC,YAAc,WAAWC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,gBAAgBC,YAAc,gBAAgBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,gBAAgBC,YAAc,gBAAgBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,YAAYC,YAAc,gBAAgBC,QAAU,CAAC,CAAC7S,WAAa,MAAM,CAAC8S,MAAQ,aAAa,CAACH,YAAc,OAAOC,YAAc,mBAAmBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,iBAAiBC,YAAc,mBAAmBC,QAAU,CAAC,CAAC7S,WAAa,MAAM,CAAC8S,MAAQ,aAAa,CAACH,YAAc,MAAMC,YAAc,cAAcC,QAAU,CAAC,CAAC7S,WAAa,SAAS,CAAC2S,YAAc,MAAMC,YAAc,SAASC,QAAU,CAAC,CAAC7S,WAAa,SAAS,CAAC2S,YAAc,gBAAgBC,YAAc,kBAAkBC,QAAU,CAAC,CAACC,MAAQ,aAAa,CAACH,YAAc,OAAOC,YAAc,cAAcC,QAAU,CAAC,CAAC7S,WAAa,SAAS,GAAG,CAAC2S,YAAc,MAAMC,YAAc,gBAAgBC,QAAU,CAAC,CAACC,MAAQ,eAGtrDjN,QAAS2K,cCvCjB5B,UAAYA,WAAa,IAEnBoE,mBAAqBpE,UAAUoE,oBAAsB,IAAI,WAE1DnD,QAAQC,UAAUC,UACnBF,QAAQC,UAAUC,QAAUF,QAAQC,UAAUE,mBAC1CH,QAAQC,UAAUG,uBAGrBJ,QAAQC,UAAUd,UAEnBa,QAAQC,UAAUd,QAAU,SAAUkB,GAClC,IAAIhP,EAAKlC,KACT,IAAK+B,SAASoP,gBAAgB9Q,SAAS6B,GACnC,OAAO,KAEX,EAAG,CACC,GAAIA,EAAG6O,QAAQG,GACX,OAAOhP,EAEXA,EAAKA,EAAGkP,eAAiBlP,EAAGrB,iBAChB,OAAPqB,GAA+B,IAAhBA,EAAGmP,UAC3B,OAAO,OAIf,IAAM4C,EAAMlS,SAAS4Q,eAAe,OAC9B3Q,EAAOD,SAAS0B,cAAc,QAEhCwQ,GACA,IAAIC,IAAI,CACJhS,GAAI+R,EACJE,KAAM,CACFC,SAAU,GACVC,iBAAkB,GAClBC,WAAW,EACX7D,SAAU,IACV8D,iBAAkB,GAClBC,SAAU,WAEdC,QAVI,WAUM,IAAAC,EAAA1U,KACN2U,MAAM1U,IAAI2U,mBACLC,KAAK,SAACC,GACHJ,EAAKN,SAAWU,EAASX,KAAKxC,OAEjCoD,MAAM,SAACnN,GACJD,QAAQqN,IAAIpN,MAGxBqN,QAAS,CACLC,aADK,SACQvD,GAAM,IAAAwD,EAAAnV,KACf,OAAqC,IAAjCA,KAAKqU,iBAAiBlO,OAMnBwL,EAAKyD,MAAMC,OAAO,SAAAC,GAAA,OAAQH,EAAKd,iBAAiBkB,SAASD,EAAKrO,OAASqO,EAAKE,WAAaL,EAAKX,gBAL/ErE,IAAfwB,EAAKyD,MAGDzD,EAAKyD,MAAMC,OAAO,SAAAC,GAAA,OAAQA,EAAKE,WAAaL,EAAKX,gBAHxD,GAORiB,UAVK,SAUKH,GAAM,IAAAI,EAAA1V,KACZA,KAAKuU,iBAAmBe,EACxBtV,KAAKsU,WAAY,EACjBtU,KAAK2V,UAAU,WAEC,IAAI3R,SAAS0R,EAAKE,MAAMC,SAAU,CAC1C3R,SAAS,EACT4R,gBAAgB,EAChB3R,UAAU,EACV4R,UAAU,MAGlB/T,EAAK5B,UAAUgC,IAAI,cAGvB4T,WAzBK,WA0BDhW,KAAKsU,WAAY,EACjBtU,KAAKuU,iBAAmB,GACxBvS,EAAK5B,UAAU+B,OAAO,cAI1B8T,SAhCK,SAgCI9L,GACLnK,KAAKkW,cAAc/L,EAAMjK,SAG7BgW,cApCK,SAoCSzO,GACV,IACMsI,EADiBtI,EAAQuI,QAAQ,iBACJvM,cAAc,qBAC3CyM,EAAiBH,EAAYtM,cAAc,6BAC3C0S,EAAe1O,EAAQxG,aAAa,uBACpCmV,EAAe3O,EAAQxG,aAAa,uBAE1C,GAAsBkP,MAAlBD,EAA6B,CAC7B,IAAIE,EAAuBF,EAAehN,aACtCmN,OAAAA,EACAC,EAAaP,EAAYQ,QAAQjN,YAElB6M,IAAfG,GACAD,EAAYN,EAAY7M,aAAekN,EAAuB,IAC9DL,EAAYQ,QAAQjN,OAASyM,EAAY7M,aACzC6M,EAAYQ,QAAQ8F,cAAe,EACnC5O,EAAQuI,QAAQ,iBAAiB5P,UAAUgC,IAAI,wBAC/CqF,EAAQrC,UAAYgR,IAEoB,SAArCrG,EAAYQ,QAAQ8F,cACnBtG,EAAYQ,QAAQ8F,cAAe,EACnC5O,EAAQrC,UAAYgR,IAEpBrG,EAAYQ,QAAQ8F,cAAe,EACnC5O,EAAQrC,UAAY+Q,GAEpB7F,EAAaP,EAAY7M,cACzBmN,EAAYC,EACZ7I,EAAQuI,QAAQ,iBAAiB5P,UAAU+B,OAAO,0BAElDkO,EAAYN,EAAY7M,aAAekN,EAAuB,IAC9D3I,EAAQuI,QAAQ,iBAAiB5P,UAAUgC,IAAI,0BAGvD2N,EAAYjP,MAAMwC,OAAS+M,EAAY,QAInDiG,SAAU,CACNC,eADM,WAGF,IADA,IAAMhF,EAAQ,GACLrL,EAAI,EAAGA,EAAIlG,KAAKoU,SAASjO,OAAQD,IAAK,CAC3C,IAAMyL,EAAO3R,KAAKoU,SAASlO,GACvByL,EAAKyD,MAAMjP,QACXoL,EAAM7P,KAAKiQ,GAGnB,OAAOJ,GAEXC,SAXM,WAWK,IAAAgF,EAAAxW,KACHwR,EAAWxR,KAAKoU,SAIpB,MAHsB,MAAlBpU,KAAKyQ,WACLe,EAAWA,EAAS6D,OAAO,SAAAnE,GAAA,OAAKA,EAAES,KAAKa,gBAAkBgE,EAAK/F,SAAS+B,iBAEpEhB,GAEXiF,WAlBM,WAmBF,IAAIC,EAAO1W,KAAKoU,SACVqC,EAAa,GAGbE,EAAY3W,KAAKwR,SAASoF,OAAO,SAACC,EAAMlF,GAC1C,OAAOkF,EAAKC,OAAOnF,EAAKyD,QACzB,IAgBH,OAdAsB,EAAKhQ,IAAI,SAAAiL,GACLA,EAAKyD,MAAM1O,IAAI,SAAA4O,GACX,IAAKmB,EAAWM,KAAK,SAAAC,GAAA,OAAKA,EAAEhL,OAASsJ,EAAKrO,OAAO,CAE7C,IAAMgQ,GAAYN,EAAUI,KAAK,SAAAC,GAAA,OAAKA,EAAE/P,MAAQqO,EAAKrO,OACpC,IAAbqO,EAAKrO,MACLwP,EAAW/U,KAAK,CACZsK,KAAMsJ,EAAKrO,KACXgQ,SAAAA,SAMbR,QCnKvB7G,UAAYA,WAAa,IAEnBsH,YAActH,UAAUsH,aAAe,IAAI,WAE5CrG,QAAQC,UAAUC,UACnBF,QAAQC,UAAUC,QAAUF,QAAQC,UAAUE,mBAC1CH,QAAQC,UAAUG,uBAGrBJ,QAAQC,UAAUd,UAEnBa,QAAQC,UAAUd,QAAU,SAAUkB,GAClC,IAAIhP,EAAKlC,KACT,IAAK+B,SAASoP,gBAAgB9Q,SAAS6B,GACnC,OAAO,KAEX,EAAG,CACC,GAAIA,EAAG6O,QAAQG,GACX,OAAOhP,EAEXA,EAAKA,EAAGkP,eAAiBlP,EAAGrB,iBAChB,OAAPqB,GAA+B,IAAhBA,EAAGmP,UAC3B,OAAO,OAOf,IAHA,IAAM8F,EAAOpV,SAASqV,uBAAuB,kBACvCpV,EAAOD,SAAS0B,cAAc,QAzByBmG,EAAA,SA2BrD1D,GACJ,IAAM+N,EAAMkD,EAAKjR,GACXmR,EAAWpD,EAAIhT,aAAa,kBAAkBuR,cACpD,IAAI0B,IAAI,CACJhS,GAAI+R,EACJE,KAAM,CACFxC,KAAM,GACN2C,WAAW,EACX7D,SAAU,IACV8D,iBAAkB,GAClBC,SAAU,WAEdC,QATI,WASM,IAAAC,EAAA1U,KACNA,KAAKwU,SAA8C,UAAnCxU,KAAKsX,IAAI/G,QAAQgH,gBAA2B,OAAO,UACnE5C,MAAM1U,IAAI2U,kBAAoB,SAAWyC,GACpCxC,KAAK,SAACC,GACHJ,EAAK/C,KAAOmD,EAASX,KAAKxC,KAAK,KAElCoD,MAAM,SAACnN,GACJD,QAAQqN,IAAIpN,MAGxBqN,QAAS,CACLC,aADK,SACQvD,GAAM,IAAAwD,EAAAnV,KACf,QAAkBmQ,IAAfwB,EAAKyD,MAGR,OAAOzD,EAAKyD,MAAMC,OAAO,SAAAC,GAAA,OAAQA,EAAKE,WAAaL,EAAKX,YAE5DiB,UAPK,SAOKH,GAAM,IAAAI,EAAA1V,KACZA,KAAKuU,iBAAmBe,EACxBtV,KAAKsU,WAAY,EACjBtU,KAAK2V,UAAU,WAEC,IAAI3R,SAAS0R,EAAKE,MAAMC,SAAU,CAC1C3R,SAAS,EACT4R,gBAAgB,EAChB3R,UAAU,EACV4R,UAAU,MAGlB/T,EAAK5B,UAAUgC,IAAI,cAGvB4T,WAtBK,WAuBDhW,KAAKsU,WAAY,EACjBtU,KAAKuU,iBAAmB,GACxBvS,EAAK5B,UAAU+B,OAAO,cAI1B8T,SA7BK,SA6BI9L,GACLnK,KAAKkW,cAAc/L,EAAMjK,SAG7BgW,cAjCK,SAiCSzO,GACV,IACMsI,EADiBtI,EAAQuI,QAAQ,iBACJvM,cAAc,qBAC3CyM,EAAiBH,EAAYtM,cAAc,6BAC3C0S,EAAe1O,EAAQxG,aAAa,uBACpCmV,EAAe3O,EAAQxG,aAAa,uBAE1C,GAAsBkP,MAAlBD,EAA6B,CAC7B,IAAIE,EAAuBF,EAAehN,aACtCmN,OAAAA,EACAC,EAAaP,EAAYQ,QAAQjN,YAElB6M,IAAfG,GACAD,EAAYN,EAAY7M,aAAekN,EAAuB,IAC9DL,EAAYQ,QAAQjN,OAASyM,EAAY7M,aACzC6M,EAAYQ,QAAQ8F,cAAe,EACnC5O,EAAQuI,QAAQ,iBAAiB5P,UAAUgC,IAAI,wBAC/CqF,EAAQrC,UAAYgR,IAEoB,SAArCrG,EAAYQ,QAAQ8F,cACnBtG,EAAYQ,QAAQ8F,cAAe,EACnC5O,EAAQrC,UAAYgR,IAEpBrG,EAAYQ,QAAQ8F,cAAe,EACnC5O,EAAQrC,UAAY+Q,GAEpB7F,EAAaP,EAAY7M,cACzBmN,EAAYC,EACZ7I,EAAQuI,QAAQ,iBAAiB5P,UAAU+B,OAAO,0BAElDkO,EAAYN,EAAY7M,aAAekN,EAAuB,IAC9D3I,EAAQuI,QAAQ,iBAAiB5P,UAAUgC,IAAI,0BAGvD2N,EAAYjP,MAAMwC,OAAS+M,EAAY,QAInDiG,SAAU,CACNC,eADM,WAGF,IADA,IAAMhF,EAAQ,GACLrL,EAAI,EAAGA,EAAIlG,KAAK2R,KAAKxL,OAAQD,IAAK,CACvC,IAAMyL,EAAO3R,KAAK2R,KAAKzL,GACnByL,EAAKyD,MAAMjP,QACXoL,EAAM7P,KAAKiQ,GAGnB,OAAOJ,GAEXC,SAXM,WAWK,IAAAgF,EAAAxW,KACHwR,EAAWxR,KAAK2R,KAIpB,MAHsB,MAAlB3R,KAAKyQ,WACLe,EAAWA,EAAS6D,OAAO,SAAAnE,GAAA,OAAKA,EAAES,KAAKa,gBAAkBgE,EAAK/F,SAAS+B,iBAEpEhB,GAEXiF,WAlBM,WAmBF,IAAIC,EAAO1W,KAAK2R,KACV8E,EAAa,GAGbE,EAAY3W,KAAKwR,SAASoF,OAAO,SAACC,EAAMlF,GAC1C,OAAOkF,EAAKC,OAAOnF,EAAKyD,QACzB,IAgBH,OAdAsB,EAAKhQ,IAAI,SAAAiL,GACLA,EAAKyD,MAAM1O,IAAI,SAAA4O,GACX,IAAKmB,EAAWM,KAAK,SAAAC,GAAA,OAAKA,EAAEhL,OAASsJ,EAAKrO,OAAO,CAE7C,IAAMgQ,GAAYN,EAAUI,KAAK,SAAAC,GAAA,OAAKA,EAAE/P,MAAQqO,EAAKrO,OACpC,IAAbqO,EAAKrO,MACLwP,EAAW/U,KAAK,CACZsK,KAAMsJ,EAAKrO,KACXgQ,SAAAA,SAMbR,OAtIfvQ,EAAE,EAAEA,EAAGiR,EAAKhR,OAAOD,GAAG,EAAG0D,EAAzB1D,0NCoCZ,SAAS2E,gBAAgBnE,EAAK8Q,EAAaC,GAMvCzX,KAAKqL,OAAOR,gBAAiB5B,OAAOC,KAAKwO,aACzC1X,KAAK2X,KAAOjR,EAMZ1G,KAAK4X,SAAW,GAKhB5X,KAAK6X,UAAY,GAEjB7X,KAAK8X,MAAQ,CAAC,GAAI,GAAI,GAAI,GAAI,IAK9B9X,KAAK+X,QAAU,GAMf/X,KAAKgY,QAAS,EAEd,IAAIpR,EAAU6Q,GAAe,GAM7BzX,KAAKiY,UAAYrR,EAAA,UAAuB,GAKxC5G,KAAKkY,gBAAkBtR,EAAA,oBAAiC,EAOxD5G,KAAKmY,SAAWvR,EAAA,SAAsB,KAEtC5G,KAAK+X,QAAUnR,EAAA,QAAqB,GAMpC5G,KAAKoY,WAAaxR,EAAA,WACd5G,KAAKqY,2BAMTrY,KAAKsY,gBAAkB1R,EAAA,gBACnB5G,KAAKuY,gCAMTvY,KAAKwY,cAAe,EAEUrI,MAA1BvJ,EAAA,cACA5G,KAAKwY,aAAe5R,EAAA,aAOxB5G,KAAKyY,gBAAiB,EAEUtI,MAA5BvJ,EAAA,gBACA5G,KAAKyY,eAAiB7R,EAAA,eAG1B5G,KAAK0Y,eAEL1Y,KAAK2Y,OAAOjS,GAMZ1G,KAAK4Y,UAAY5Y,KAAK2X,KAAKnM,UAG3B,IAAIqN,EAAO7Y,KACXiJ,OAAOC,KAAKiB,MAAMC,YAAYpK,KAAK2X,KAAM,eAAgB,WAErD,IAAI/O,EAAOiQ,EAAKlB,KAAKnM,UACjBsN,EAAUD,EAAKlB,KAAKmB,SAAW,EAC/B7N,EAAU8N,KAAKC,IAAIH,EAAKlB,KAAK1M,SAAW,IACxC4N,EAAKlB,KAAKsB,SAASJ,EAAKlB,KAAKuB,gBAAgBjO,SACjDrC,EAAOmQ,KAAKC,IAAID,KAAKI,IAAIvQ,EAAMkQ,GAAU7N,GAErC4N,EAAKD,WAAahQ,IAClBiQ,EAAKD,UAAYhQ,EACjBiQ,EAAKO,mBAIbnQ,OAAOC,KAAKiB,MAAMC,YAAYpK,KAAK2X,KAAM,OAAQ,WAC7CkB,EAAKQ,WAIL7B,IAAgBA,EAAYrR,QAAUrG,OAAO+C,KAAK2U,GAAarR,SAC/DnG,KAAKsZ,WAAW9B,GAAa,GAsnBrC,SAAS+B,QAAQC,GACbxZ,KAAKyZ,iBAAmBD,EACxBxZ,KAAK2X,KAAO6B,EAAgBE,SAC5B1Z,KAAKiY,UAAYuB,EAAgBG,cACjC3Z,KAAKkY,gBAAkBsB,EAAgBI,oBACvC5Z,KAAKyY,eAAiBe,EAAgBK,kBACtC7Z,KAAK8Z,QAAU,KACf9Z,KAAK4X,SAAW,GAChB5X,KAAK+Z,QAAU,KACf/Z,KAAKga,aAAe,IAAIC,YAAYja,KAAMwZ,EAAgBU,YACtDV,EAAgBG,eAuNxB,SAASM,YAAYE,EAASpP,EAAQqP,GAClCD,EAAQE,qBAAqBhP,OAAO4O,YAAahR,OAAOC,KAAKwO,aAE7D1X,KAAK+X,QAAUhN,EACf/K,KAAKsa,SAAWF,GAAe,EAC/Bpa,KAAKua,SAAWJ,EAChBna,KAAK8Z,QAAU,KACf9Z,KAAK2X,KAAOwC,EAAQT,SACpB1Z,KAAKwa,KAAO,KACZxa,KAAKya,MAAQ,KACbza,KAAK0a,UAAW,EAEhB1a,KAAK2Y,OAAO3Y,KAAK2X,MAx1BrB9M,gBAAgBiG,UAAUuH,2BAA6B,cASvDxN,gBAAgBiG,UAAUyH,gCAAkC,MAW5D1N,gBAAgBiG,UAAUzF,OAAS,SAAUsP,EAAMC,GAC/C,OAAQ,SAAUC,GACd,IAAK,IAAIC,KAAYD,EAAO/J,UACxB9Q,KAAK8Q,UAAUgK,GAAYD,EAAO/J,UAAUgK,GAEhD,OAAO9a,MACR+a,MAAMJ,EAAM,CAACC,KAQpB/P,gBAAgBiG,UAAUkK,MAAQ,WAC9Bhb,KAAKib,WAAU,IAOnBpQ,gBAAgBiG,UAAUoK,KAAO,aAOjCrQ,gBAAgBiG,UAAU4H,aAAe,WACrC,IAAI1Y,KAAK+X,QAAQ5R,OAIjB,IAAK,IAAWwD,EAAPzD,EAAI,EAASyD,EAAO3J,KAAK8X,MAAM5R,GAAIA,IACxClG,KAAK+X,QAAQrW,KAAK,CACd/B,IAAKK,KAAKoY,YAAclS,EAAI,GAAK,IAAMlG,KAAKsY,gBAC5ChV,OAAQqG,EACRtG,MAAOsG,KAQnBkB,gBAAgBiG,UAAUqK,gBAAkB,WAGxC,IAFA,IAEgBtR,EAFZhD,EAAU7G,KAAKob,aACfjQ,EAAS,IAAIlC,OAAOC,KAAKkC,aACpBlF,EAAI,EAAW2D,EAAShD,EAAQX,GAAIA,IACzCiF,EAAOE,OAAOxB,EAAOW,eAGzBxK,KAAK2X,KAAKrM,UAAUH,IASxBN,gBAAgBiG,UAAUuK,UAAY,SAAUtQ,GAC5C/K,KAAK+X,QAAUhN,GASnBF,gBAAgBiG,UAAUoJ,UAAY,WAClC,OAAOla,KAAK+X,SAShBlN,gBAAgBiG,UAAUwK,cAAgB,WACtC,OAAOtb,KAAKwY,cAQhB3N,gBAAgBiG,UAAU+I,gBAAkB,WACxC,OAAO7Z,KAAKyY,gBAShB5N,gBAAgBiG,UAAUsK,WAAa,WACnC,OAAOpb,KAAK4X,UAShB/M,gBAAgBiG,UAAUyK,gBAAkB,WACxC,OAAOvb,KAAK4X,SAASzR,QASzB0E,gBAAgBiG,UAAU0K,WAAa,SAAUvQ,GAC7CjL,KAAKmY,SAAWlN,GASpBJ,gBAAgBiG,UAAU2K,WAAa,WACnC,OAAOzb,KAAKmY,UAYhBtN,gBAAgBiG,UAAU4K,YAAc,SAAU7U,EAAS8U,GAIvD,IAHA,IAAI1W,EAAQ,EACR2W,EAAQ/U,EAAQV,OAChB0V,EAAKD,EACK,IAAPC,GACHA,EAAKC,SAASD,EAAK,GAAI,IACvB5W,IAIJ,MAAO,CACH8W,KAAMH,EACN3W,MAHJA,EAAQ8T,KAAKC,IAAI/T,EAAO0W,KAgB5B9Q,gBAAgBiG,UAAUkL,cAAgB,SAAUC,GAChDjc,KAAK0b,YAAcO,GASvBpR,gBAAgBiG,UAAUoL,cAAgB,WACtC,OAAOlc,KAAK0b,aAUhB7Q,gBAAgBiG,UAAUwI,WAAa,SAAUzS,EAASsV,GACtD,GAAItV,EAAQV,OACR,IAAK,IAAID,EAAI,EAAW2D,EAAShD,EAAQX,GAAIA,IACzClG,KAAKoc,cAAcvS,QAEpB,GAAI/J,OAAO+C,KAAKgE,GAASV,OAC5B,IAAK,IAAI0D,KAAUhD,EACf7G,KAAKoc,cAAcvV,EAAQgD,IAG9BsS,GACDnc,KAAKqZ,UAWbxO,gBAAgBiG,UAAUsL,cAAgB,SAAUvS,GAEhD,GADAA,EAAOwS,SAAU,EACbxS,EAAA,UAAqB,CAGrB,IAAIgP,EAAO7Y,KACXiJ,OAAOC,KAAKiB,MAAMC,YAAYP,EAAQ,UAAW,WAC7CA,EAAOwS,SAAU,EACjBxD,EAAKyD,YAGbtc,KAAK4X,SAASlW,KAAKmI,IAUvBgB,gBAAgBiG,UAAUyL,UAAY,SAAU1S,EAAQsS,GACpDnc,KAAKoc,cAAcvS,GACdsS,GACDnc,KAAKqZ,UAYbxO,gBAAgBiG,UAAU0L,cAAgB,SAAU3S,GAChD,IAAI5E,GAAS,EACb,GAAIjF,KAAK4X,SAASpV,QACdyC,EAAQjF,KAAK4X,SAASpV,QAAQqH,QAE9B,IAAK,IAAW4S,EAAPvW,EAAI,EAAMuW,EAAIzc,KAAK4X,SAAS1R,GAAIA,IACrC,GAAIuW,GAAK5S,EAAQ,CACb5E,EAAQiB,EACR,MAKZ,OAAc,GAAVjB,IAKJ4E,EAAO8O,OAAO,MAEd3Y,KAAK4X,SAAS8E,OAAOzX,EAAO,IAErB,IAWX4F,gBAAgBiG,UAAU6L,aAAe,SAAU9S,EAAQsS,GACvD,IAAIS,EAAU5c,KAAKwc,cAAc3S,GAEjC,QAAKsS,IAAcS,KACf5c,KAAKoZ,gBACLpZ,KAAKqZ,UACE,IAafxO,gBAAgBiG,UAAU+L,cAAgB,SAAUhW,EAASsV,GAMzD,IAHA,IAGgBtS,EAHZiT,EAAcjW,IAAY7G,KAAKob,aAAevU,EAAQkW,QAAUlW,EAChE+V,GAAU,EAEL1W,EAAI,EAAW2D,EAASiT,EAAY5W,GAAIA,IAAK,CAClD,IAAI8W,EAAIhd,KAAKwc,cAAc3S,GAC3B+S,EAAUA,GAAWI,EAGzB,IAAKb,GAAcS,EAGf,OAFA5c,KAAKoZ,gBACLpZ,KAAKqZ,UACE,GAWfxO,gBAAgBiG,UAAUmK,UAAY,SAAUgC,GACvCjd,KAAKgY,SACNhY,KAAKgY,OAASiF,EACdjd,KAAKkd,oBAUbrS,gBAAgBiG,UAAUqM,iBAAmB,WACzC,OAAOnd,KAAK6X,UAAU1R,QAS1B0E,gBAAgBiG,UAAU4I,OAAS,WAC/B,OAAO1Z,KAAK2X,MAShB9M,gBAAgBiG,UAAU6H,OAAS,SAAUjS,GACzC1G,KAAK2X,KAAOjR,GAShBmE,gBAAgBiG,UAAU6I,YAAc,WACpC,OAAO3Z,KAAKiY,WAShBpN,gBAAgBiG,UAAUsM,YAAc,SAAUzT,GAC9C3J,KAAKiY,UAAYtO,GASrBkB,gBAAgBiG,UAAU8I,kBAAoB,WAC1C,OAAO5Z,KAAKkY,iBAQhBrN,gBAAgBiG,UAAUuM,kBAAoB,SAAU1T,GACpD3J,KAAKkY,gBAAkBvO,GAU3BkB,gBAAgBiG,UAAUwM,kBAAoB,SAAUnS,GACpD,IAAIoS,EAAavd,KAAKwd,gBAGlBC,EAAK,IAAIxU,OAAOC,KAAKe,OAAOkB,EAAOuS,eAAenV,MAClD4C,EAAOuS,eAAelV,OACtBmV,EAAK,IAAI1U,OAAOC,KAAKe,OAAOkB,EAAOyS,eAAerV,MAClD4C,EAAOyS,eAAepV,OAGtBqV,EAAQN,EAAWO,qBAAqBL,GAC5CI,EAAM7G,GAAKhX,KAAKiY,UAChB4F,EAAME,GAAK/d,KAAKiY,UAEhB,IAAI+F,EAAQT,EAAWO,qBAAqBH,GAC5CK,EAAMhH,GAAKhX,KAAKiY,UAChB+F,EAAMD,GAAK/d,KAAKiY,UAGhB,IAAIgG,EAAKV,EAAWW,qBAAqBL,GACrCM,EAAKZ,EAAWW,qBAAqBF,GAMzC,OAHA7S,EAAOE,OAAO4S,GACd9S,EAAOE,OAAO8S,GAEPhT,GAYXN,gBAAgBiG,UAAUsN,kBAAoB,SAAUvU,EAAQsB,GAC5D,OAAOA,EAAO9K,SAASwJ,EAAOW,gBAOlCK,gBAAgBiG,UAAUuN,aAAe,WACrCre,KAAKoZ,eAAc,GAGnBpZ,KAAK4X,SAAW,IAQpB/M,gBAAgBiG,UAAUsI,cAAgB,SAAUkF,GAEhD,IAAK,IAAWnE,EAAPjU,EAAI,EAAYiU,EAAUna,KAAK6X,UAAU3R,GAAIA,IAClDiU,EAAQhY,SAIP,IAAW0H,EAAhB,IAAS3D,EAAI,EAAW2D,EAAS7J,KAAK4X,SAAS1R,GAAIA,IAC/C2D,EAAOwS,SAAU,EACbiC,GACAzU,EAAO8O,OAAO,MAItB3Y,KAAK6X,UAAY,IAMrBhN,gBAAgBiG,UAAUwL,QAAU,WAChC,IAAIiC,EAAcve,KAAK6X,UAAUkF,QACjC/c,KAAK6X,UAAU1R,OAAS,EACxBnG,KAAKoZ,gBACLpZ,KAAKqZ,SAILha,OAAO6N,WAAW,WACd,IAAK,IAAWiN,EAAPjU,EAAI,EAAYiU,EAAUoE,EAAYrY,GAAIA,IAC/CiU,EAAQhY,UAEb,IAOP0I,gBAAgBiG,UAAUuI,OAAS,WAC/BrZ,KAAKkd,mBAaTrS,gBAAgBiG,UAAU0N,uBAAyB,SAAUC,EAAIC,GAC7D,IAAKD,IAAOC,EACR,OAAO,EAGX,IACIC,GAAQD,EAAGnW,MAAQkW,EAAGlW,OAASwQ,KAAK6F,GAAK,IACzCC,GAAQH,EAAGlW,MAAQiW,EAAGjW,OAASuQ,KAAK6F,GAAK,IACzCE,EAAI/F,KAAKgG,IAAIJ,EAAO,GAAK5F,KAAKgG,IAAIJ,EAAO,GACzC5F,KAAKiG,IAAIP,EAAGlW,MAAQwQ,KAAK6F,GAAK,KAAO7F,KAAKiG,IAAIN,EAAGnW,MAAQwQ,KAAK6F,GAAK,KACnE7F,KAAKgG,IAAIF,EAAO,GAAK9F,KAAKgG,IAAIF,EAAO,GAGzC,OARQ,MAMA,EAAI9F,KAAKkG,MAAMlG,KAAKmG,KAAKJ,GAAI/F,KAAKmG,KAAK,EAAIJ,MAYvDjU,gBAAgBiG,UAAUqO,qBAAuB,SAAUtV,GAIvD,IAHA,IAiBQsQ,EAjBJiF,EAAW,IACXC,EAAiB,KAEZnZ,GADC2D,EAAOW,cACJ,GAAY2P,EAAUna,KAAK6X,UAAU3R,GAAIA,IAAK,CACvD,IAAI8C,EAASmR,EAAQmF,YACrB,GAAItW,EAAQ,CACR,IAAIuW,EAAIvf,KAAKwe,uBAAuBxV,EAAQa,EAAOW,eAC/C+U,EAAIH,IACJA,EAAWG,EACXF,EAAiBlF,IAKzBkF,GAAkBA,EAAeG,wBAAwB3V,GACzDwV,EAAe9C,UAAU1S,KAErBsQ,EAAU,IAAIZ,QAAQvZ,OAClBuc,UAAU1S,GAClB7J,KAAK6X,UAAUnW,KAAKyY,KAU5BtP,gBAAgBiG,UAAUoM,gBAAkB,WACxC,GAAKld,KAAKgY,OAUV,IAJA,IAIgBnO,EAJZ4V,EAAY,IAAIxW,OAAOC,KAAKkC,aAAapL,KAAK2X,KAAK+H,YAAY9B,eAC/D5d,KAAK2X,KAAK+H,YAAYhC,gBACtBvS,EAASnL,KAAKsd,kBAAkBmC,GAE3BvZ,EAAI,EAAW2D,EAAS7J,KAAK4X,SAAS1R,GAAIA,KAC1C2D,EAAOwS,SAAWrc,KAAKoe,kBAAkBvU,EAAQsB,IAClDnL,KAAKmf,qBAAqBtV,IAiCtC0P,QAAQzI,UAAU6O,qBAAuB,SAAU9V,GAC/C,GAAI7J,KAAK4X,SAASpV,QACd,OAAyC,GAAlCxC,KAAK4X,SAASpV,QAAQqH,GAE7B,IAAK,IAAW4S,EAAPvW,EAAI,EAAMuW,EAAIzc,KAAK4X,SAAS1R,GAAIA,IACrC,GAAIuW,GAAK5S,EACL,OAAO,EAInB,OAAO,GAUX0P,QAAQzI,UAAUyL,UAAY,SAAU1S,GACpC,GAAI7J,KAAK2f,qBAAqB9V,GAC1B,OAAO,EAGX,GAAK7J,KAAK8Z,SAIN,GAAI9Z,KAAKyY,eAAgB,CACrB,IAAImH,EAAI5f,KAAK4X,SAASzR,OAAS,EAC3BoC,GAAOvI,KAAK8Z,QAAQvR,OAASqX,EAAI,GAAK/V,EAAOW,cAAcjC,OAASqX,EACpEpX,GAAOxI,KAAK8Z,QAAQtR,OAASoX,EAAI,GAAK/V,EAAOW,cAAchC,OAASoX,EACxE5f,KAAK8Z,QAAU,IAAI7Q,OAAOC,KAAKe,OAAO1B,EAAKC,GAC3CxI,KAAK6f,yBART7f,KAAK8Z,QAAUjQ,EAAOW,cACtBxK,KAAK6f,mBAWThW,EAAOwS,SAAU,EACjBrc,KAAK4X,SAASlW,KAAKmI,GAEnB,IAAIiW,EAAM9f,KAAK4X,SAASzR,OAMxB,GALI2Z,EAAM9f,KAAKkY,iBAAmBrO,EAAO6P,UAAY1Z,KAAK2X,MAEtD9N,EAAO8O,OAAO3Y,KAAK2X,MAGnBmI,GAAO9f,KAAKkY,gBAEZ,IAAK,IAAIhS,EAAI,EAAGA,EAAI4Z,EAAK5Z,IACrBlG,KAAK4X,SAAS1R,GAAGyS,OAAO,MAShC,OALImH,GAAO9f,KAAKkY,iBACZrO,EAAO8O,OAAO,MAGlB3Y,KAAK+f,cACE,GASXxG,QAAQzI,UAAUuJ,mBAAqB,WACnC,OAAOra,KAAKyZ,kBAShBF,QAAQzI,UAAU4O,UAAY,WAG1B,IAFA,IAEgB7V,EAFZsB,EAAS,IAAIlC,OAAOC,KAAKkC,aAAapL,KAAK8Z,QAAS9Z,KAAK8Z,SACzDjT,EAAU7G,KAAKob,aACVlV,EAAI,EAAW2D,EAAShD,EAAQX,GAAIA,IACzCiF,EAAOE,OAAOxB,EAAOW,eAEzB,OAAOW,GAOXoO,QAAQzI,UAAU3O,OAAS,WACvBnC,KAAKga,aAAa7X,SAClBnC,KAAK4X,SAASzR,OAAS,SAChBnG,KAAK4X,UAShB2B,QAAQzI,UAAUkP,QAAU,WACxB,OAAOhgB,KAAK4X,SAASzR,QASzBoT,QAAQzI,UAAUsK,WAAa,WAC3B,OAAOpb,KAAK4X,UAShB2B,QAAQzI,UAAUwO,UAAY,WAC1B,OAAOtf,KAAK8Z,SAShBP,QAAQzI,UAAU+O,iBAAmB,WACjC,IAAI1U,EAAS,IAAIlC,OAAOC,KAAKkC,aAAapL,KAAK8Z,QAAS9Z,KAAK8Z,SAC7D9Z,KAAK+Z,QAAU/Z,KAAKyZ,iBAAiB6D,kBAAkBnS,IAU3DoO,QAAQzI,UAAU0O,wBAA0B,SAAU3V,GAClD,OAAO7J,KAAK+Z,QAAQ1Z,SAASwJ,EAAOW,gBASxC+O,QAAQzI,UAAU4I,OAAS,WACvB,OAAO1Z,KAAK2X,MAOhB4B,QAAQzI,UAAUiP,WAAa,WAC3B,IAAInX,EAAO5I,KAAK2X,KAAKnM,UACjByU,EAAKjgB,KAAKyZ,iBAAiBgC,aAE/B,GAAIwE,GAAaA,EAAPrX,EAEN,IAAK,IAAWiB,EAAP3D,EAAI,EAAW2D,EAAS7J,KAAK4X,SAAS1R,GAAIA,IAC/C2D,EAAO8O,OAAO3Y,KAAK2X,WAK3B,GAAI3X,KAAK4X,SAASzR,OAASnG,KAAKkY,gBAE5BlY,KAAKga,aAAakG,WAFtB,CAMA,IAAIvE,EAAY3b,KAAKyZ,iBAAiBS,YAAY/T,OAC9Cga,EAAOngB,KAAKyZ,iBAAiByC,eAAtBlc,CAAsCA,KAAK4X,SAAU+D,GAChE3b,KAAKga,aAAaoG,UAAUpgB,KAAK8Z,SACjC9Z,KAAKga,aAAaqG,QAAQF,GAC1BngB,KAAKga,aAAasG,SAwCtBrG,YAAYnJ,UAAUyP,oBAAsB,WACxC,IAAI/G,EAAkBxZ,KAAKua,SAASF,qBAGpCpR,OAAOC,KAAKiB,MAAMqW,QAAQhH,EAAgB7B,KAAM,eAAgB3X,KAAKua,UAEjEf,EAAgB8B,iBAEhBtb,KAAK2X,KAAKrM,UAAUtL,KAAKua,SAASmF,cAS1CzF,YAAYnJ,UAAUkK,MAAQ,WAE1B,GADAhb,KAAKwa,KAAOzY,SAASiF,cAAc,OAC/BhH,KAAK0a,SAAU,CACf,IAAI+F,EAAMzgB,KAAK0gB,kBAAkB1gB,KAAK8Z,SACtC9Z,KAAKwa,KAAK1Z,MAAM6f,QAAU3gB,KAAK4gB,UAAUH,GACzCzgB,KAAKwa,KAAKpV,UAAYpF,KAAKya,MAAMsB,KAGzB/b,KAAK6gB,WACXC,mBAAmB3Z,YAAYnH,KAAKwa,MAE1C,IAAI3B,EAAO7Y,KACXiJ,OAAOC,KAAKiB,MAAM4W,eAAe/gB,KAAKwa,KAAM,QAAS,WACjD3B,EAAK0H,yBAYbtG,YAAYnJ,UAAU4P,kBAAoB,SAAUM,GAChD,IAAIP,EAAMzgB,KAAKwd,gBAAgBM,qBAAqBkD,GAGpD,OAFAP,EAAIzJ,GAAK8E,SAAS9b,KAAKihB,OAAS,EAAG,IACnCR,EAAI1C,GAAKjC,SAAS9b,KAAKkhB,QAAU,EAAG,IAC7BT,GAQXxG,YAAYnJ,UAAUoK,KAAO,WACzB,GAAIlb,KAAK0a,SAAU,CACf,IAAI+F,EAAMzgB,KAAK0gB,kBAAkB1gB,KAAK8Z,SACtC9Z,KAAKwa,KAAK1Z,MAAM6E,IAAM8a,EAAI1C,EAAI,KAC9B/d,KAAKwa,KAAK1Z,MAAM4E,KAAO+a,EAAIzJ,EAAI,KAC/BhX,KAAKwa,KAAK1Z,MAAMqgB,OAASlY,OAAOC,KAAKa,OAAOqX,WAAa,IAQjEnH,YAAYnJ,UAAUoP,KAAO,WACrBlgB,KAAKwa,OACLxa,KAAKwa,KAAK1Z,MAAMgR,QAAU,QAE9B9R,KAAK0a,UAAW,GAOpBT,YAAYnJ,UAAUwP,KAAO,WACzB,GAAItgB,KAAKwa,KAAM,CACX,IAAIiG,EAAMzgB,KAAK0gB,kBAAkB1gB,KAAK8Z,SACtC9Z,KAAKwa,KAAK1Z,MAAM6f,QAAU3gB,KAAK4gB,UAAUH,GACzCzgB,KAAKwa,KAAK1Z,MAAMgR,QAAU,GAE9B9R,KAAK0a,UAAW,GAOpBT,YAAYnJ,UAAU3O,OAAS,WAC3BnC,KAAK2Y,OAAO,OAQhBsB,YAAYnJ,UAAUuQ,SAAW,WACzBrhB,KAAKwa,MAAQxa,KAAKwa,KAAK3Z,aACvBb,KAAKkgB,OACLlgB,KAAKwa,KAAK3Z,WAAWygB,YAAYthB,KAAKwa,MACtCxa,KAAKwa,KAAO,OAYpBP,YAAYnJ,UAAUuP,QAAU,SAAUF,GACtCngB,KAAKya,MAAQ0F,EACbngB,KAAKuhB,MAAQpB,EAAKpE,KAClB/b,KAAKwhB,OAASrB,EAAKlb,MACfjF,KAAKwa,OACLxa,KAAKwa,KAAKpV,UAAY+a,EAAKpE,MAG/B/b,KAAKyhB,YAOTxH,YAAYnJ,UAAU2Q,SAAW,WAC7B,IAAIxc,EAAQ8T,KAAKI,IAAI,EAAGnZ,KAAKya,MAAMxV,MAAQ,GAC3CA,EAAQ8T,KAAKC,IAAIhZ,KAAK+X,QAAQ5R,OAAS,EAAGlB,GAC1C,IAAInE,EAAQd,KAAK+X,QAAQ9S,GACzBjF,KAAK0hB,KAAO5gB,EAAA,IACZd,KAAKkhB,QAAUpgB,EAAA,OACfd,KAAKihB,OAASngB,EAAA,MACdd,KAAK2hB,WAAa7gB,EAAA,UAClBd,KAAK4hB,QAAU9gB,EAAA,OACfd,KAAK6hB,UAAY/gB,EAAA,SACjBd,KAAK8hB,oBAAsBhhB,EAAA,oBAS/BmZ,YAAYnJ,UAAUsP,UAAY,SAAUpX,GACxChJ,KAAK8Z,QAAU9Q,GAUnBiR,YAAYnJ,UAAU8P,UAAY,SAAUH,GACxC,IAAI3f,EAAQ,GACZA,EAAMY,KAAK,wBAA0B1B,KAAK0hB,KAAO,MACjD,IAAIK,EAAqB/hB,KAAK8hB,oBAAsB9hB,KAAK8hB,oBAAsB,MAC/EhhB,EAAMY,KAAK,uBAAyBqgB,EAAqB,KAE7B,WAAxBC,QAAOhiB,KAAK4hB,UACmB,iBAApB5hB,KAAK4hB,QAAQ,IAAqC,EAAlB5hB,KAAK4hB,QAAQ,IACpD5hB,KAAK4hB,QAAQ,GAAK5hB,KAAKkhB,QACvBpgB,EAAMY,KAAK,WAAa1B,KAAKkhB,QAAUlhB,KAAK4hB,QAAQ,IAChD,mBAAqB5hB,KAAK4hB,QAAQ,GAAK,OAE3C9gB,EAAMY,KAAK,UAAY1B,KAAKkhB,QAAU,mBAAqBlhB,KAAKkhB,QAC5D,OAEuB,iBAApBlhB,KAAK4hB,QAAQ,IAAqC,EAAlB5hB,KAAK4hB,QAAQ,IACpD5hB,KAAK4hB,QAAQ,GAAK5hB,KAAKihB,OACvBngB,EAAMY,KAAK,UAAY1B,KAAKihB,OAASjhB,KAAK4hB,QAAQ,IAC9C,oBAAsB5hB,KAAK4hB,QAAQ,GAAK,OAE5C9gB,EAAMY,KAAK,SAAW1B,KAAKihB,OAAS,2BAGxCngB,EAAMY,KAAK,UAAY1B,KAAKkhB,QAAU,mBAClClhB,KAAKkhB,QAAU,aAAelhB,KAAKihB,OAAS,0BAGpD,IAAIgB,EAAWjiB,KAAK2hB,WAAa3hB,KAAK2hB,WAAa,QAC/CO,EAAUliB,KAAK6hB,UAAY7hB,KAAK6hB,UAAY,GAKhD,OAHA/gB,EAAMY,KAAK,uBAAyB+e,EAAI1C,EAAI,YACxC0C,EAAIzJ,EAAI,aAAeiL,EAAW,kCAClCC,EAAU,sDACPphB,EAAMc,KAAK,MAOtBvC,OAAA,gBAA4BwL,iBACZiG,UAAhB,UAAyCjG,gBAAgBiG,UAAUyL,UACnE1R,gBAAgBiG,UAAhB,WAA0CjG,gBAAgBiG,UAAUwI,WACpEzO,gBAAgBiG,UAAhB,aACIjG,gBAAgBiG,UAAUuN,aAC9BxT,gBAAgBiG,UAAhB,gBACIjG,gBAAgBiG,UAAUqK,gBAC9BtQ,gBAAgBiG,UAAhB,cACIjG,gBAAgBiG,UAAUoL,cAC9BrR,gBAAgBiG,UAAhB,YACIjG,gBAAgBiG,UAAU6I,YAC9B9O,gBAAgBiG,UAAhB,kBACIjG,gBAAgBiG,UAAUwM,kBAC9BzS,gBAAgBiG,UAAhB,OAAsCjG,gBAAgBiG,UAAU4I,OAChE7O,gBAAgBiG,UAAhB,WAA0CjG,gBAAgBiG,UAAUsK,WACpEvQ,gBAAgBiG,UAAhB,WAA0CjG,gBAAgBiG,UAAU2K,WACpE5Q,gBAAgBiG,UAAhB,UAAyCjG,gBAAgBiG,UAAUoJ,UACnErP,gBAAgBiG,UAAhB,iBACIjG,gBAAgBiG,UAAUqM,iBAC9BtS,gBAAgBiG,UAAhB,gBACIjG,gBAAgBiG,UAAUyK,gBAC9B1Q,gBAAgBiG,UAAhB,OAAsCjG,gBAAgBiG,UAAUuI,OAChExO,gBAAgBiG,UAAhB,aACIjG,gBAAgBiG,UAAU6L,aAC9B9R,gBAAgBiG,UAAhB,cACIjG,gBAAgBiG,UAAU+L,cAC9BhS,gBAAgBiG,UAAhB,cACIjG,gBAAgBiG,UAAUsI,cAC9BvO,gBAAgBiG,UAAhB,QACIjG,gBAAgBiG,UAAUwL,QAC9BzR,gBAAgBiG,UAAhB,cACIjG,gBAAgBiG,UAAUkL,cAC9BnR,gBAAgBiG,UAAhB,YACIjG,gBAAgBiG,UAAUsM,YAC9BvS,gBAAgBiG,UAAhB,WACIjG,gBAAgBiG,UAAU0K,WAC9B3Q,gBAAgBiG,UAAhB,MAAqCjG,gBAAgBiG,UAAUkK,MAC/DnQ,gBAAgBiG,UAAhB,KAAoCjG,gBAAgBiG,UAAUoK,KAE9D3B,QAAQzI,UAAR,UAAiCyI,QAAQzI,UAAUwO,UACnD/F,QAAQzI,UAAR,QAA+ByI,QAAQzI,UAAUkP,QACjDzG,QAAQzI,UAAR,WAAkCyI,QAAQzI,UAAUsK,WAEpDnB,YAAYnJ,UAAZ,MAAiCmJ,YAAYnJ,UAAUkK,MACvDf,YAAYnJ,UAAZ,KAAgCmJ,YAAYnJ,UAAUoK,KACtDjB,YAAYnJ,UAAZ,SAAoCmJ,YAAYnJ,UAAUuQ,SAE1DvhB,OAAO+C,KAAO/C,OAAO+C,MAAQ,SAAUsf,GACnC,IAAIC,EAAS,GACb,IAAK,IAAIpW,KAAQmW,EACTA,EAAE9Y,eAAe2C,IACjBoW,EAAO1gB,KAAKsK,GAGpB,OAAOoW,ICnyCPxS,UAAYA,WAAa,IACnByS,SAAWzS,UAAUyS,UAAY,IAAI,WAE3CriB,KAAKwD,KAAO,WAGR,IADA,IAAM8e,EAAgBvgB,SAASE,iBAAiB,qBAF5B2H,EAAA,SAGX1D,GACL,IAAMqc,EAAeD,EAAcpc,GACnCqc,EAAalgB,iBAAiB,QAAS,WAEnC,GAAIkgB,EAAanR,cAAchR,UAAUC,SAAS,sCAC9CkiB,EAAanR,cAAchR,UAAU+B,OAAO,0CACzC,CACH,IAAK,IAAI+D,EAAI,EAAGA,EAAIoc,EAAcnc,OAAQD,IAAK,CAC3Boc,EAAcpc,GACtBkL,cAAchR,UAAU+B,OAAO,sCAE3CogB,EAAanR,cAAchR,UAAUgC,IAAI,0CAX5C8D,EAAI,EAAGA,EAAIoc,EAAcnc,OAAQD,IAAK0D,EAAtC1D,GAgBT,GAAwB,KAApB7G,OAAOyC,WAAmB,CAE1B,IADA,IAAI0gB,EAAgBzgB,SAASE,iBAAiB,+BACrCiE,EAAI,EAAGA,EAAIsc,EAAcrc,OAAQD,IAAK,CAC3C,IAAIuc,EAAeD,EAActc,GACjCwc,YAAYD,EAAc,WACtBziB,KAAKI,UAAUgC,IAAI,0CACpB,WACCpC,KAAKI,UAAU+B,OAAO,2CACvByE,QAAQ,CACP+b,QAAS,IACTC,SAAU,KAKlB,IADA,IAAIC,EAAa9gB,SAASE,iBAAiB,mCAClC6gB,EAAI,EAAGA,EAAID,EAAW1c,OAAQ2c,IAAK,CACxBD,EAAWC,GACjBzgB,iBAAiB,YAAa,WAEpC,GADgBrC,KACFQ,aAAa,cAAe,CACtC,IACIuiB,EAHQ/iB,KAEagQ,QAAQ,yBACNvM,cAAc,0CACrCuf,EAJQhjB,KAIiBiB,aAAa,cAC1C8hB,EAAYphB,aAAa,MAAOqhB,WC7CpDpT,UAAYA,WAAa,IACnBqT,WAAarT,UAAUqT,YAAc,IAAI,WAC/CjjB,KAAKwD,KAAO,WACR,IAAI0f,EAAYnhB,SAAS0B,cAAc,gCACnC0f,EAAcphB,SAAS0B,cAAc,2BACrCzB,EAAOD,SAAS0B,cAAc,QAElC,IAAKyf,GAAcC,KAKnBD,EAAU7gB,iBAAiB,QAAS,WAChCL,EAAK5B,UAAU6M,OAAO,4BACvB,GAGHkW,EAAY9gB,iBAAiB,QAAS,WAC9BL,EAAK5B,UAAUC,SAAS,2BACxB2B,EAAK5B,UAAU+B,OAAO,4BAE3B,GAGkBJ,SAAS0B,cAAc,6BACxB,CAChB,IAAI2f,EAAiBrhB,SAASE,iBAAiB,yCAC/C,GAAsB,MAAlBmhB,EACA,IADwB,IAAAxZ,EAAA,WAEpB,IAAIrE,EAAgB6d,EAAeld,GAC/BhG,EAASqF,EAAcmL,KAC3BxQ,EAAS6B,SAAS0B,cAAcvD,GAChCqF,EAAclD,iBAAiB,QAAS,SAAU5C,GAC9CA,EAAEI,iBACFR,OAAOmG,SAAS,CACZC,SAAY,SACZC,KAAQ,EACRC,IAAOzF,EAAO0F,UAAY,OAE/B,IAXEM,EAAI,EAAGA,EAAIkd,EAAejd,OAAQD,IAAK0D,OC3B5D1K,SAAWA,UAAY,GCqB3B,SAAS+S,UAAUoR,EAAOC,EAAQC,GAC9B,IAAIhE,EAAI,IAAIiE,KACZjE,EAAEkE,QAAQlE,EAAEmE,UAAsB,GAATH,EAAc,GAAK,GAAK,KACjD,IAAII,EAAU,WAAapE,EAAEqE,cAC7B7hB,SAASsR,OAASgQ,EAAQ,IAAMC,EAAS,IAAMK,EAAU,WD1BzD/T,UAAYA,WAAa,IAGnBgD,QAAUhD,UAAUgD,SAAW,IAAI,WAEzC5S,KAAKwD,KAAO,WAKR,IAFA,IAAMqgB,EAAkB9hB,SAASE,iBAAiB,uBAEzC6hB,EAAI,EAAGA,EAAID,EAAgB1d,OAAQ2d,IACxCD,EAAgBC,GAAGzhB,iBAAiB,QAAS,SAAU5C,GACnDA,EAAEI,iBACF,IAAIkkB,EAAiBtkB,EAAES,OAAOW,WACsB,MAAhDkjB,EAAe9iB,aAAa,kBAC5B/B,SAAS0T,QAAQC,OAAO,CACpBmR,QAAWD,EAAe9iB,aAAa,iBACvCgG,KAAQ8c,EAAe9iB,aAAa,aACpC6R,MAAS,qBACTmR,SAAY,OAUhC,IAFA,IAAMC,EAAsBniB,SAASE,iBAAiB,4BAxBD2H,EAAA,SA0B5C1D,GACL,IAAMie,EAAqBD,EAAoBhe,GAEzClE,EAAOD,SAAS0B,cAAc,QAG9B2gB,EAAqBD,EAAmBtjB,WAAW4C,cAAc,oCAGjE0f,EAAcgB,EAAmB/M,uBAAuB,SAAS,GAGvEgN,EAAmB/hB,iBAAiB,QAAS,SAAU5C,GACnD,IAAMoW,EAAWsO,EAAmB1gB,cAAc,kBAClDhE,EAAEI,iBACFskB,EAAmB/jB,UAAUgC,IAAI,gBACjC+hB,EAAmBrjB,MAAMgR,QAAU,QACnC9P,EAAK5B,UAAUgC,IAAI,aAEnB,IAAIiiB,EAAQ,IAAIrgB,SAAS6R,EAAU,CAC/B3R,SAAS,EACT4R,gBAAgB,EAChB3R,UAAU,EACV4R,UAAU,IAIdoN,EAAY9gB,iBAAiB,QAAS,WAClCgiB,EAAMC,UACNtiB,EAAK5B,UAAU+B,OAAO,aACtBgiB,EAAmB/jB,UAAU+B,OAAO,kBAIxCgiB,EAAmB9hB,iBAAiB,QAAS,SAAU8H,GAC/CA,EAAMjK,QAAUF,OAChBqkB,EAAMC,UACNtiB,EAAK5B,UAAU+B,OAAO,aACtBnC,KAAKI,UAAU+B,OAAO,sBAtC7B+D,EAAI,EAAGA,EAAIge,EAAoB/d,OAAQD,IAAK0D,EAA5C1D,GA6CT,IAAM0M,EAAU7Q,SAAS0B,cAAc,yBACjCzB,EAAOD,SAAS0B,cAAc,QAE9B+c,EAAUze,SAAS0B,cAAc,4BAEvC,GAAImP,GAAW4N,EAAS,CAGpB,IAAM+D,EAAOxiB,SAASqV,uBAAuB,SAAS,GAGtDoJ,EAAQgE,QAAU,SAAU/kB,GACxBA,EAAEI,iBACF+S,EAAQxS,UAAUgC,IAAI,gBACtBJ,EAAK5B,UAAUgC,IAAI,cAIvBmiB,EAAKC,QAAU,WACXxiB,EAAK5B,UAAU+B,OAAO,aACtByQ,EAAQxS,UAAU+B,OAAO,iBAG7B,IAAMsiB,EAAa1iB,SAASE,iBAAiB,uBAC7C,IAASiE,EAAI,EAAGA,EAAIue,EAAWte,OAAQD,IAAK,CACvBue,EAAWve,GAEnBse,QAAU,WACfxiB,EAAK5B,UAAU+B,OAAO,aACtByQ,EAAQxS,UAAU+B,OAAO,iBAKjC9C,OAAOmlB,QAAU,SAAUra,GACnBA,EAAMjK,QAAU0S,IAChB5Q,EAAK5B,UAAU+B,OAAO,aACtByQ,EAAQxS,UAAU+B,OAAO,qBChHrCyN,UAAYA,WAAa,IACnB8U,aAAe9U,UAAU8U,cAAgB,IAAI,WACnD1kB,KAAKwD,KAAO,WAYR,IADA,IAAMmhB,EAAe5iB,SAASE,iBAAiB,0BACtC6hB,EAAI,EAAGA,EAAIa,EAAaxe,OAAQ2d,IACrCa,EAAab,GAAGzhB,iBAAiB,QAAS,SAAU5C,GAChD,IAAImlB,EAAKnlB,EAAES,OAAOe,aAAa,gBAC/BgR,UAAU,eAAgB2S,EAAI,QChB1ChV,UAAYA,WAAa,IAEnBlC,MAAQkC,UAAUlC,OAAS,IAAI,WAErC1N,KAAKwD,KAAO,WAEU,SAAZqhB,IACF,IAD0B,IAAAjb,EAAA,SACjB1D,GACL,IAAMwH,EAAQoX,EAAO5e,GACf6e,EAASrX,EAAMjK,cAAc,UAC7B/D,EAAMqlB,EAAO9jB,aAAa,YAC1Buf,EAAU9S,EAAMjK,cAAc,qBAEZ,IAApBpE,OAAOyC,WACHkjB,EAAatX,IACiB,KAA1BqX,EAAOxU,QAAQ0U,UACfF,EAAOpjB,aAAa,MAAOjC,GAC3BqlB,EAAOpjB,aAAa,eAAgB,MAI5C6e,EAAQne,iBAAiB,QAAS,WAC9B0iB,EAAOpjB,aAAa,MAAOjC,GAC3B8gB,EAAQ1f,MAAMgR,QAAU,UAhB3B5L,EAAI,EAAGA,EAAI4e,EAAO3e,OAAQD,IAAK0D,EAA/B1D,GAFb,IAAM4e,EAAS/iB,SAASE,iBAAiB,aAuBzC5C,OAAOgD,iBAAiB,OAAQ,SAAU8H,GAClC2a,GACAD,MAIRxlB,OAAOgD,iBAAiB,SAAU,SAAU8H,GACpC2a,GACAD,MAEL,GAGH,IAAMG,EAAe,SAAUE,GAC3B,IAAMC,EAAWD,EAAK5d,wBACtB,OACoB,GAAhB6d,EAASxf,KACQ,GAAjBwf,EAASzf,MACTyf,EAAS5d,SAAWlI,OAAO4D,aAAelB,SAASoP,gBAAgBiU,eACnED,EAASE,QAAUhmB,OAAOyC,YAAcC,SAASoP,gBAAgBmU,mOCvCjF,SAAWC,EAAMC,GACS,mBAAXC,QAAyBA,OAAOC,IACvCD,OAAO,GAAID,EAAQD,IACO,YAAnB,oBAAOI,QAAP,YAAA3D,QAAO2D,UACdC,OAAOD,QAAUH,EAAQD,GAEzBA,EAAKxX,SAAWyX,EAAQD,GANhC,CAQqB,oBAAXM,QAAkCxmB,QAATwmB,OAA4B,SAAUN,GAQrE,IAEIO,EAFA/X,EAAW,GACXgY,EAAW,kBAAmBhkB,UAAY,qBAAsBwjB,EAIhES,EAAW,CAGXjgB,SAAU,kBACVsI,WAAY,QACZC,WAAY,gBAGZC,oBAAqB,8BACrBE,0BAA2B,yBAC3BE,+BAAgC,oCAChCC,yBAA0B,iCAC1BC,uBAAwB,sBACxBC,gBAAiB,4GACjBC,eAAgB,gHAChBC,uBAAwB,qCACxBC,gBAAiB,yBACjBC,oBAAqB,+BACrBC,qBAAsB,oDACtBC,sBAAuB,oDACvBC,eAAgB,mDAGhBC,eAAe,EACfC,SAAU,aAGVC,gBAAiB,aACjBC,eAAgB,aAChBC,kBAAmB,aACnBC,iBAAkB,cAUjBkB,QAAQC,UAAUC,UACnBF,QAAQC,UAAUC,QACdF,QAAQC,UAAUmV,iBAClBpV,QAAQC,UAAUoV,oBAClBrV,QAAQC,UAAUE,mBAClBH,QAAQC,UAAUqV,kBAClBtV,QAAQC,UAAUG,uBAClB,SAAUC,GAGN,IAFA,IAAIH,GAAW/Q,KAAK+B,UAAY/B,KAAKomB,eAAenkB,iBAAiBiP,GACjEhL,EAAI6K,EAAQ5K,OACF,KAALD,GAAU6K,EAAQuE,KAAKpP,KAAOlG,OACvC,OAAY,EAALkG,IAWN,SAATmF,EAAS,GAGT,IAAIgb,EAAW,GACXC,GAAO,EACPpgB,EAAI,EACJC,EAASogB,UAAUpgB,OAG8B,qBAAjDrG,OAAOgR,UAAU0V,SAASC,KATrB,KAULH,EAVK,EAWLpgB,KAkBJ,IAdA,IAAIwgB,EAAQ,SAAUhe,GAClB,IAAK,IAAIie,KAAQje,EACT5I,OAAOgR,UAAUzH,eAAeod,KAAK/d,EAAKie,KAEtCL,GAAsD,oBAA9CxmB,OAAOgR,UAAU0V,SAASC,KAAK/d,EAAIie,IAC3CN,EAASM,GAAQtb,GAAO,EAAMgb,EAASM,GAAOje,EAAIie,IAElDN,EAASM,GAAQje,EAAIie,KAO9BzgB,EAAIC,EAAQD,IAAK,CAEpBwgB,EADUH,UAAUrgB,IAIxB,OAAOmgB,EAyBXtY,EAAS6Y,SAAW,SAAUC,EAAOjgB,GAGjC,IAAIkgB,EAAgBzb,EAAOya,GAAYE,EAAUpf,GAAW,IAG5D,IAAIigB,EAAM5P,UAA2B,SAAf4P,EAAM5f,MAAkC,UAAf4f,EAAM5f,MAAmC,WAAf4f,EAAM5f,MAAoC,WAAf4f,EAAM5f,KAA1G,CAGA,IAAI8f,EAAWF,EAAME,SAGrB,IAAIA,EAASC,MAAb,CAGA,GAAID,EAASE,aAET,MAAmB,oBAAfJ,EAAM5f,KAAmC6f,EAAcnY,+BAExC,eAAfkY,EAAM5f,KAA8B6f,EAAcrY,0BAE/CqY,EAAcvY,oBAIzB,GAAIwY,EAASG,aAAc,CAGvB,GAAmB,UAAfL,EAAM5f,KAAkB,OAAO6f,EAAclY,yBAGjD,GAAmB,QAAfiY,EAAM5f,KAAgB,OAAO6f,EAAcjY,uBAKnD,OAAIkY,EAASI,SAAiBL,EAAchY,gBAAgBsY,QAAQ,cAAeP,EAAM5lB,aAAa,cAAcmmB,QAAQ,WAAYP,EAAMhb,MAAM1F,QAGhJ4gB,EAASM,QAAgBP,EAAc/X,eAAeqY,QAAQ,cAAeP,EAAM5lB,aAAa,cAAcmmB,QAAQ,WAAYP,EAAMhb,MAAM1F,QAG9I4gB,EAASO,SAAiBR,EAAc7X,gBAGxC8X,EAASQ,aAAqBT,EAAc5X,oBAG5C6X,EAASS,cAAsBV,EAAc3X,qBAAqBiY,QAAQ,QAASP,EAAM5lB,aAAa,QAGtG8lB,EAASU,eAAuBX,EAAc1X,sBAAsBgY,QAAQ,QAASP,EAAM5lB,aAAa,QAGxG8lB,EAASW,gBAGLb,EAAMrmB,aAAa,SAAiBqmB,EAAM5lB,aAAa,SAGpD6lB,EAAc9X,uBAKlB8X,EAAczX,kBAWzBtB,EAAS4Z,UAAY,SAAUd,EAAOjf,EAAOhB,GAGzC,IAAIkgB,EAAgBzb,EAAOya,GAAYE,EAAUpf,GAAW,IAS5D,GANAkgB,EAActX,gBAAgBqX,EAAOjf,GAGrCif,EAAMzmB,UAAUgC,IAAI0kB,EAAczY,YAGf,UAAfwY,EAAM5f,MAAoB4f,EAAM7a,KAAM,CACtC,IAAI4b,EAAQ7lB,SAAS8lB,kBAAkBhB,EAAM7a,MAC7C,GAAmB,EAAf4b,EAAMzhB,OAAY,CAClB,IAAK,IAAID,EAAI,EAAGA,EAAI0hB,EAAMzhB,OAAQD,IAC1B0hB,EAAM1hB,GAAG8H,OAAS6Y,EAAM7Y,MAC5B4Z,EAAM1hB,GAAG9F,UAAUgC,IAAI0kB,EAAczY,YAEzCwY,EAAQe,EAAMA,EAAMzhB,OAAS,IAKrC,IAAIye,EAAKiC,EAAMjC,IAAMiC,EAAM7a,KAC3B,GAAK4Y,EAAL,CAIA,IAOQkD,EAPJC,EAAUlB,EAAM7Y,KAAKvK,cAAc,IAAMqjB,EAAcxY,WAAa,cAAgBsW,GACxF,IAAKmD,GACDA,EAAUhmB,SAASiF,cAAc,QACzBghB,UAAYlB,EAAcxY,WAClCyZ,EAAQnD,GAAK,aAAeA,EAIT,UAAfiC,EAAM5f,MAAmC,aAAf4f,EAAM5f,OAChC6gB,EAAQjB,EAAM7Y,KAAKvK,cAAc,cAAgBmhB,EAAK,OAhIjD,SAAUM,EAAMnf,GAC7B,KAAOmf,GAAQA,IAASnjB,SAAUmjB,EAAOA,EAAKrkB,WAC1C,GAAIqkB,EAAKnU,QAAQhL,GAAW,OAAOmf,EAEvC,OAAO,KA4HgE+C,CAAWpB,EAAO,WAE7EiB,EAAMjnB,WAAWqnB,aAAaH,EAASD,EAAMK,aAKhDL,GACDjB,EAAMhmB,WAAWqnB,aAAaH,EAASlB,EAAMsB,aAKrDtB,EAAMllB,aAAa,mBAAoB,aAAeijB,GAGtDmD,EAAQ3iB,UAAYwC,EAGpBmgB,EAAQjnB,MAAMgR,QAAU,GACxBiW,EAAQjnB,MAAME,WAAa,GAG3B8lB,EAAcrX,eAAeoX,EAAOjf,KAUxCmG,EAASqa,YAAc,SAAUvB,EAAOjgB,GAGpC,IAAIkgB,EAAgBzb,EAAOya,GAAYE,EAAUpf,GAAW,IAY5D,GATAkgB,EAAcpX,kBAAkBmX,GAGhCA,EAAMzY,gBAAgB,oBAGtByY,EAAMzmB,UAAU+B,OAAO2kB,EAAczY,YAGlB,UAAfwY,EAAM5f,MAAoB4f,EAAM7a,KAAM,CACtC,IAAI4b,EAAQ7lB,SAAS8lB,kBAAkBhB,EAAM7a,MAC7C,GAAmB,EAAf4b,EAAMzhB,OAAY,CAClB,IAAK,IAAID,EAAI,EAAGA,EAAI0hB,EAAMzhB,OAAQD,IAC1B0hB,EAAM1hB,GAAG8H,OAAS6Y,EAAM7Y,MAC5B4Z,EAAM1hB,GAAG9F,UAAU+B,OAAO2kB,EAAczY,YAE5CwY,EAAQe,EAAMA,EAAMzhB,OAAS,IAKrC,IAAIye,EAAKiC,EAAMjC,IAAMiC,EAAM7a,KAC3B,GAAK4Y,EAAL,CAGA,IAAImD,EAAUlB,EAAM7Y,KAAKvK,cAAc,IAAMqjB,EAAcxY,WAAa,cAAgBsW,GACnFmD,IAGLA,EAAQ3iB,UAAY,GACpB2iB,EAAQjnB,MAAMgR,QAAU,OACxBiW,EAAQjnB,MAAME,WAAa,SAG3B8lB,EAAcnX,iBAAiBkX,MASf,SAAhBwB,EAA0BlmB,GAE1B,IADA,IAAImmB,EAAQvmB,SAASE,iBAAiB6jB,EAAS/f,UACtCG,EAAI,EAAGA,EAAIoiB,EAAMniB,OAAQD,IAC1B/D,EACAmmB,EAAMpiB,GAAGkI,gBAAgB,cAG7Bka,EAAMpiB,GAAGvE,aAAa,cAAc,GAS1B,SAAd4mB,EAAwBpe,GAGxB,GAAKA,EAAMjK,OAAO8N,MAAS7D,EAAMjK,OAAO8N,KAAK+C,QAAQ+U,EAAS/f,UAA9D,CAGA,IAAI6B,EAAQmG,EAAS6Y,SAASzc,EAAMjK,QAGhC0H,EACAmG,EAAS4Z,UAAUxd,EAAMjK,OAAQ0H,GAKrCmG,EAASqa,YAAYje,EAAMjK,SASZ,SAAfsoB,EAAyBre,GAGzB,GAAKA,EAAMjK,OAAO8N,MAAS7D,EAAMjK,OAAO8N,KAAK+C,QAAQ+U,EAAS/f,UAA9D,CAGA,IAAIkB,EAAOkD,EAAMjK,OAAOe,aAAa,QACrC,GAAe,aAATgG,GAAgC,UAATA,EAA7B,CAGA,IAAIW,EAAQmG,EAAS6Y,SAASzc,EAAMjK,QAGhC0H,EACAmG,EAAS4Z,UAAUxd,EAAMjK,OAAQ0H,GAKrCmG,EAASqa,YAAYje,EAAMjK,UASX,SAAhBuoB,EAA0Bte,GAG1B,GAAKA,EAAMjK,OAAO6Q,QAAQ+U,EAAS/f,UAAnC,CAQA,IALA,IAII2iB,EAJAC,EAASxe,EAAMjK,OAAO0oB,SAKjB1iB,EAAI,EAAGA,EAAIyiB,EAAOxiB,OAAQD,IAAK,CACpC,IAAI0B,EAAQmG,EAAS6Y,SAAS+B,EAAOziB,IACjC0B,IACAmG,EAAS4Z,UAAUgB,EAAOziB,GAAI0B,GAE1B8gB,EADCA,GACWC,EAAOziB,KAM3BwiB,GAAa5C,EAASxW,gBACtBnF,EAAMtK,iBAIN6oB,EACAA,EAAUvb,QAKd2Y,EAASvW,SAASpF,EAAMjK,OAAQyoB,IA+DpC,OAvDA5a,EAASuW,QAAU,WAGf,GAAKwB,EAAL,CAGA/jB,SAAS8mB,oBAAoB,OAAQN,GAAa,GAClDxmB,SAAS8mB,oBAAoB,QAASL,GAAc,GACpDzmB,SAAS8mB,oBAAoB,SAAUJ,GAAe,GAItD,IADA,IAAIE,EAAS5mB,SAASE,iBAAiB6jB,EAASxX,YACvCpI,EAAI,EAAGA,EAAIyiB,EAAOxiB,OAAQD,IAC/B6H,EAASqa,YAAYO,EAAOziB,IAIhCmiB,GAAc,GAGdvC,EAAW,OASf/X,EAASvK,KAAO,SAAUoD,GAGjBmf,IAGLhY,EAASuW,UAGTwB,EAAWza,EAAO2a,EAAUpf,GAAW,IAGvCyhB,IAGAtmB,SAASM,iBAAiB,OAAQkmB,GAAa,GAC/CxmB,SAASM,iBAAiB,QAASmmB,GAAc,GACjDzmB,SAASM,iBAAiB,SAAUomB,GAAe,KAShD1a,uNChgBV,SAAS1O,GACT,IAAIypB,EAKK,SAAWzpB,EAAQ0C,GAC5B,aAEA,IAAIA,EAASqV,uBAAuB,CAAC,OAErC,IAAI2R,EAAWzpB,EAEX0pB,EAAUjnB,EAASoP,gBAEnBqS,EAAOnkB,EAAOmkB,KAEdyF,EAAiB5pB,EAAO6pB,mBAExBC,EAAoB,mBAEpBC,EAAgB,eAEhB/mB,EAAmBhD,EAAO8pB,GAE1Bjc,EAAa7N,EAAO6N,WAEpBmc,EAAwBhqB,EAAOgqB,uBAAyBnc,EAExDoc,EAAsBjqB,EAAOiqB,oBAE7BC,EAAa,aAEbC,EAAa,CAAC,OAAQ,QAAS,eAAgB,eAE/CC,EAAgB,GAEhBpoB,EAAUqoB,MAAM5Y,UAAUzP,QAE1BsoB,EAAW,SAAXA,EAAoBC,EAAKC,GAC5B,IAAIJ,EAAcI,GAAK,CACtBJ,EAAcI,GAAO,IAAIC,OAAO,UAAUD,EAAI,WAE/C,OAAOJ,EAAcI,GAAKpd,KAAKmd,EAAIR,GAAe,UAAY,KAAOK,EAAcI,IAGhFE,EAAW,SAAXA,EAAoBH,EAAKC,GAC5B,IAAKF,EAASC,EAAKC,GAAK,CACvBD,EAAIjoB,aAAa,SAAUioB,EAAIR,GAAe,UAAY,IAAI9nB,OAAS,IAAMuoB,KAI3EG,EAAc,SAAdA,EAAuBJ,EAAKC,GAC/B,IAAII,EACJ,GAAKA,EAAMN,EAASC,EAAIC,GAAO,CAC9BD,EAAIjoB,aAAa,SAAUioB,EAAIR,GAAe,UAAY,IAAIhC,QAAQ6C,EAAK,QAIzEC,EAAsB,SAAtBA,EAA+BC,EAAKC,EAAIhoB,GAC3C,IAAIioB,EAASjoB,EAAM+mB,EAAoB,sBACvC,GAAG/mB,EAAI,CACN8nB,EAAoBC,EAAKC,GAE1BZ,EAAWnoB,QAAQ,SAAS+L,GAC3B+c,EAAIE,GAAQjd,EAAKgd,MAIfE,EAAe,SAAfA,EAAwBpF,EAAMlZ,EAAMue,EAAQC,EAAWC,GAC1D,IAAItgB,EAAQpI,EAAS2oB,YAAY,eAEjC,IAAIH,EAAO,CACVA,EAAS,GAGVA,EAAOI,SAAW5B,EAElB5e,EAAMygB,gBAAgB5e,GAAOwe,GAAYC,EAAcF,GAEvDrF,EAAK2F,cAAc1gB,GACnB,OAAOA,GAGJ2gB,EAAiB,SAAjBA,EAA2B5oB,EAAI6oB,GAClC,IAAIC,EACJ,IAAK/B,IAAoB+B,EAAY3rB,EAAO4rB,aAAe3rB,EAAgB4rB,IAAO,CACjFF,EAAS,CAACG,WAAY,KAAMvC,SAAU,CAAC1mB,UACjC,GAAG6oB,GAAQA,EAAKrrB,IAAI,CAC1BwC,EAAGxC,IAAMqrB,EAAKrrB,MAIZ0rB,EAAS,SAATA,EAAmBlG,EAAMpkB,GAC5B,OAAQuqB,iBAAiBnG,EAAM,OAAS,IAAIpkB,IAGzCwqB,EAAW,SAAXA,EAAoBpG,EAAMqG,EAAQloB,GACrCA,EAAQA,GAAS6hB,EAAK9hB,YAEtB,MAAMC,EAAQ/D,EAAgBksB,SAAWD,IAAWrG,EAAKuG,gBAAgB,CACxEpoB,EAASkoB,EAAOnoB,YAChBmoB,EAASA,EAAO1qB,WAGjB,OAAOwC,GAGJqoB,EAAO,WACV,IAAIC,EAASC,EACb,IAAIC,EAAW,GACf,IAAIC,EAAY,GAChB,IAAIC,EAAMF,EAEV,IAAIG,EAAM,SAANA,IACH,IAAIC,EAASF,EAEbA,EAAMF,EAAS1lB,OAAS2lB,EAAYD,EAEpCF,EAAU,KACVC,EAAU,MAEV,MAAMK,EAAO9lB,OAAO,CACnB8lB,EAAO1Y,OAAP0Y,GAGDN,EAAU,OAGX,IAAIO,EAAW,SAAXA,EAAoB9B,EAAI+B,GAC3B,GAAGR,IAAYQ,EAAM,CACpB/B,EAAGrP,MAAM/a,KAAMumB,eACT,CACNwF,EAAIrqB,KAAK0oB,GAET,IAAIwB,EAAQ,CACXA,EAAU,MACT7pB,EAASqqB,OAASlf,EAAamc,GAAuB2C,MAK1DE,EAASG,SAAWL,EAEpB,OAAOE,EApCG,GAuCPI,GAAQ,SAARA,EAAiBlC,EAAImC,GACxB,OAAOA,EACN,WACCb,EAAItB,IAEL,WACC,IAAIvR,EAAO7Y,KACX,IAAIwsB,EAAOjG,UACXmF,EAAI,WACHtB,EAAGrP,MAAMlC,EAAM2T,OAMfC,EAAW,SAAXA,EAAoBrC,GACvB,IAAIuB,EACJ,IAAIe,EAAW,EACf,IAAIC,EAAS,IACb,IAAIC,EAAattB,EAAgButB,WACjC,IAAIb,EAAM,SAANA,IACHL,EAAU,MACVe,EAAWlJ,EAAKsJ,MAChB1C,KAED,IAAI2C,EAAezD,GAAuBhqB,EAAgButB,WACzD,WACCvD,EAAoB0C,EAAK,CAACrJ,QAASiK,IAEnC,GAAGA,IAAettB,EAAgButB,WAAW,CAC5CD,EAAattB,EAAgButB,aAG/BP,GAAM,WACLpf,EAAW8e,IACT,MAGJ,OAAO,SAASgB,GACf,IAAIC,EAEJ,GAAID,EAAaA,IAAe,KAAM,CACrCJ,EAAa,GAGd,GAAGjB,EAAQ,CACV,OAGDA,EAAW,KAEXsB,EAAQN,GAAUnJ,EAAKsJ,MAAQJ,GAE/B,GAAGO,EAAQ,EAAE,CACZA,EAAQ,EAGT,GAAGD,GAAeC,EAAQ,GAAK3D,EAAqB,CACnDyD,QACM,CACN7f,EAAW6f,EAAcE,MAMxB3qB,GAAW,SAAXA,EAAoB4qB,GACvB,IAAIvK,EAASwK,EACb,IAAIC,EAAO,GACX,IAAIpB,EAAM,SAANA,IACHrJ,EAAU,KACVuK,KAED,IAAIG,EAAQ,SAARA,IACH,IAAIC,EAAO9J,EAAKsJ,MAAQK,EAExB,GAAIG,EAAOF,EAAM,CAChBlgB,EAAWmgB,EAAOD,EAAOE,OACnB,EACLhE,GAAuB0C,GAAKA,KAI/B,OAAO,WACNmB,EAAY3J,EAAKsJ,MAEjB,IAAKnK,EAAS,CACbA,EAAUzV,EAAWmgB,EAAOD,OAK/B,WACC,IAAIzG,EAEJ,IAAI4G,EAAoB,CACvBC,UAAW,WACXC,YAAa,aACbC,aAAc,cACdC,aAAc,cACdrf,WAAY,YAEZsf,eAAgB,gBAChBC,QAAS,WACTC,WAAY,cACZC,UAAW,aAEXvC,QAAS,GACTwC,YAAa,GACbxqB,KAAM,KACNyqB,UAAW,IACXC,KAAM,GACNC,SAAU,EACVC,WAAY,KACZvB,WAAY,KAGbvtB,EAAkBD,EAAOC,iBAAmBD,EAAOgvB,iBAAmB,GAEtE,IAAI1H,KAAQ4G,EAAkB,CAC7B,KAAK5G,KAAQrnB,GAAiB,CAC7BA,EAAgBqnB,GAAQ4G,EAAkB5G,IAI5CtnB,EAAOC,gBAAkBA,EAEzB4N,EAAW,WACV,GAAG5N,EAAgBkE,KAAK,CACvBA,QArCH,GA0CA,IAAI8qB,EAAU,WACb,IAAIC,EAAcC,EAAaC,EAAsBN,EAAUO,EAE/D,IAAIC,EAAMC,EAAMC,EAAOC,EAAQC,EAASC,EAExC,IAAIC,EAAeC,EAAehB,EAElC,IAAIiB,EAAS,SACb,IAAIC,EAAY,YAEhB,IAAIC,EAAiB,aAAchwB,IAAa,SAASoN,KAAK2F,UAAUkd,WAExE,IAAIC,EAAe,EACnB,IAAIC,EAAgB,EAEpB,IAAIC,EAAY,EAChB,IAAIC,GAAW,EAEf,IAAIC,EAAkB,SAAlBA,EAA2BlwB,GAC9BgwB,IACA,GAAGhwB,GAAKA,EAAES,OAAO,CAChBgqB,EAAoBzqB,EAAES,OAAQyvB,GAG/B,IAAIlwB,GAAKgwB,EAAY,IAAMhwB,EAAES,OAAO,CACnCuvB,EAAY,IAId,IAAIG,EAAkB,SAAlBA,EAA2B1K,EAAM2K,GACpC,IAAIC,EACJ,IAAIvE,EAASrG,EACb,IAAI6K,EAAU3E,EAAOrpB,EAASC,KAAM,eAAiB,UAAYopB,EAAOlG,EAAM,eAAiB,SAE/F2J,GAASgB,EACTb,GAAYa,EACZf,GAAUe,EACVd,GAAWc,EAEX,MAAME,IAAYxE,EAASA,EAAOyE,eAAiBzE,GAAUxpB,EAASC,MAAQupB,GAAUvC,EAAQ,CAC/F+G,GAAY3E,EAAOG,EAAQ,YAAc,GAAK,EAE9C,GAAGwE,GAAW3E,EAAOG,EAAQ,aAAe,UAAU,CACrDuE,EAAYvE,EAAOjkB,wBACnByoB,EAAUhB,EAAUe,EAAUpqB,MAC7BopB,EAASgB,EAAUzK,OACnB2J,EAAWc,EAAUnqB,IAAM,GAC3BkpB,EAAQiB,EAAUvoB,OAAS,GAK9B,OAAOwoB,GAGR,IAAIE,EAAgB,SAAhBA,IACH,IAAIC,EAAOhqB,EAAGiqB,EAAMC,EAAcC,EAAiBR,EAAYS,EAAoBC,EAAeC,EAElG,IAAIC,EAAgB1H,EAAUH,SAE9B,IAAIuF,EAAW7uB,EAAgB6uB,WAAasB,EAAY,IAAMS,EAAQO,EAActqB,QAAQ,CAE3FD,EAAI,EAEJwpB,IAEA,GAAGR,GAAiB,KAAK,CACxB,KAAK,WAAY5vB,GAAiB,CACjCA,EAAgBC,OAASypB,EAAQ5D,aAAe,KAAO4D,EAAQ1D,YAAc,IAAM,IAAM,IAG1F2J,EAAgB3vB,EAAgBC,OAChC2vB,EAAgBD,EAAgB3vB,EAAgB2uB,UAGjD,GAAGuB,EAAgBN,GAAiBO,EAAY,GAAKC,EAAU,GAAKvB,EAAW,IAAMpsB,EAASqqB,OAAO,CACpGoD,EAAgBN,EAChBQ,EAAU,OACJ,GAAGvB,EAAW,GAAKuB,EAAU,GAAKD,EAAY,EAAE,CACtDD,EAAgBP,MACV,CACNO,EAAgBD,EAGjB,KAAMrpB,EAAIgqB,EAAOhqB,IAAI,CAEpB,IAAIuqB,EAAcvqB,IAAMuqB,EAAcvqB,GAAGwqB,UAAU,CAAC,SAEpD,IAAIrB,EAAc,CAACsB,EAAcF,EAAcvqB,IAAI,SAEnD,KAAKqqB,EAAgBE,EAAcvqB,GAAGkjB,GAAe,mBAAqByG,EAAaU,EAAgB,GAAG,CACzGV,EAAaL,EAGd,GAAGgB,IAAoBX,EAAW,CACjClB,EAAO7sB,WAAc+tB,EAAa3B,EAClCU,EAAO3rB,YAAc4sB,EACrBS,EAAqBT,GAAc,EACnCW,EAAkBX,EAGnBM,EAAOM,EAAcvqB,GAAGoB,wBAExB,IAAK0nB,EAAWmB,EAAK5oB,SAAW+oB,IAC9BzB,EAAQsB,EAAKxqB,MAAQipB,IACrBG,EAAUoB,EAAK9K,QAAUiL,EAAqBpC,IAC9CY,EAASqB,EAAKzqB,OAASipB,IACvBK,GAAYD,GAAWD,GAAUD,KACjCvvB,EAAgB8uB,YAAchD,EAAOqF,EAAcvqB,GAAI,eAAiB,YACvEsoB,GAAeiB,EAAY,IAAMc,IAAkBpC,EAAW,GAAKuB,EAAU,IAAOE,EAAgBa,EAAcvqB,GAAI2pB,IAAa,CACrIc,EAAcF,EAAcvqB,IAC5BmqB,EAAkB,KAClB,GAAGZ,EAAY,EAAE,CAAC,YACZ,IAAIY,GAAmB7B,IAAgB4B,GAC7CX,EAAY,GAAKC,EAAU,GAAKvB,EAAW,IAC1CI,EAAa,IAAMjvB,EAAgBsxB,oBACnCrC,EAAa,KAAQgC,IAAmBvB,GAAYD,GAAWD,GAAUD,GAAU4B,EAAcvqB,GAAGkjB,GAAe9pB,EAAgByuB,YAAc,SAAU,CAC5JqC,EAAe7B,EAAa,IAAMkC,EAAcvqB,IAIlD,GAAGkqB,IAAiBC,EAAgB,CACnCM,EAAcP,MAKjB,IAAIS,EAAyBpE,EAASwD,GAEtC,IAAIa,EAAqB,SAArBA,EAA8BrxB,GACjCsqB,EAAStqB,EAAES,OAAQZ,EAAgBmuB,aACnCzD,EAAYvqB,EAAES,OAAQZ,EAAgBouB,cACtCxD,EAAoBzqB,EAAES,OAAQ6wB,GAC9BzG,EAAa7qB,EAAES,OAAQ,eAExB,IAAI8wB,EAA0B1E,GAAMwE,GACpC,IAAIC,EAAwB,SAAxBA,EAAiCtxB,GACpCuxB,EAAwB,CAAC9wB,OAAQT,EAAES,UAGpC,IAAI+wB,EAAkB,SAAlBA,EAA2B/L,EAAMxlB,GACpC,IACCwlB,EAAKgM,cAAczgB,SAAS2W,QAAQ1nB,GACnC,MAAMD,GACPylB,EAAKxlB,IAAMA,IAIb,IAAIyxB,EAAgB,SAAhBA,EAAyBC,GAC5B,IAAIpD,EAEJ,IAAIqD,EAAeD,EAAOhI,GAAe9pB,EAAgBwuB,YAEzD,GAAKE,EAAc1uB,EAAgB0uB,YAAYoD,EAAOhI,GAAe,eAAiBgI,EAAOhI,GAAe,UAAY,CACvHgI,EAAOzvB,aAAa,QAASqsB,GAG9B,GAAGqD,EAAa,CACfD,EAAOzvB,aAAa,SAAU0vB,KAIhC,IAAIC,EAAahF,GAAM,SAAUpH,EAAMqF,EAAQgH,EAAQzZ,EAAO0Z,GAC7D,IAAI9xB,EAAKwB,EAAQqqB,EAAQkG,EAAWtnB,EAAOunB,EAE3C,KAAKvnB,EAAQmgB,EAAapF,EAAM,mBAAoBqF,IAASoH,iBAAiB,CAE7E,GAAG7Z,EAAM,CACR,GAAGyZ,EAAO,CACTxH,EAAS7E,EAAM5lB,EAAgBsuB,oBACzB,CACN1I,EAAKvjB,aAAa,QAASmW,IAI7B5W,EAASgkB,EAAKkE,GAAe9pB,EAAgBwuB,YAC7CpuB,EAAMwlB,EAAKkE,GAAe9pB,EAAgBuuB,SAE1C,GAAG2D,EAAO,CACTjG,EAASrG,EAAKrkB,WACd4wB,EAAYlG,GAAUhC,EAAW9c,KAAK8e,EAAOqG,UAAY,IAG1DF,EAAYnH,EAAOmH,WAAe,QAASxM,IAAUhkB,GAAUxB,GAAO+xB,GAEtEtnB,EAAQ,CAACjK,OAAQglB,GAEjB,GAAGwM,EAAU,CACZxH,EAAoBhF,EAAMyK,EAAiB,MAC3CkC,aAAapD,GACbA,EAAuBvhB,EAAWyiB,EAAiB,MAEnD5F,EAAS7E,EAAM5lB,EAAgBouB,cAC/BxD,EAAoBhF,EAAM6L,EAAuB,MAGlD,GAAGU,EAAU,CACZpwB,EAAQolB,KAAK8E,EAAOuG,qBAAqB,UAAWX,GAGrD,GAAGjwB,EAAO,CACTgkB,EAAKvjB,aAAa,SAAUT,QACtB,GAAGxB,IAAQ+xB,EAAU,CAC3B,GAAGrC,EAAU3iB,KAAKyY,EAAK0M,UAAU,CAChCX,EAAgB/L,EAAMxlB,OAChB,CACNwlB,EAAKxlB,IAAMA,GAIb,GAAG8xB,IAAUtwB,GAAUuwB,GAAW,CACjC3G,EAAe5F,EAAM,CAACxlB,IAAKA,KAI7B,GAAGwlB,EAAKwL,UAAU,QACVxL,EAAKwL,UAEb1G,EAAY9E,EAAM5lB,EAAgBkuB,WAElC9B,EAAI,WACH,IAAKgG,GAAcxM,EAAK6M,UAAY7M,EAAK8M,aAAe,EAAG,CAC1D,GAAGN,EAAU,CACZ/B,EAAgBxlB,OACV,CACNslB,IAEDqB,EAAmB3mB,KAElB,QAGJ,IAAIwmB,EAAgB,SAAhBA,EAA0BzL,GAC7B,IAAIqF,EAEJ,IAAIiH,EAAQrC,EAAO1iB,KAAKyY,EAAK0M,UAG7B,IAAI9Z,EAAQ0Z,IAAUtM,EAAKkE,GAAe9pB,EAAgByuB,YAAc7I,EAAKkE,GAAe,UAC5F,IAAImI,EAASzZ,GAAS,OAEtB,IAAKyZ,IAAW/C,IAAgBgD,IAAUtM,EAAKkE,GAAe,QAAUlE,EAAKhkB,UAAYgkB,EAAK6M,WAAapI,EAASzE,EAAM5lB,EAAgBgP,aAAeqb,EAASzE,EAAM5lB,EAAgBkuB,WAAW,CAAC,OAEpMjD,EAASD,EAAapF,EAAM,kBAAkBqF,OAE9C,GAAGgH,EAAO,CACRU,GAAUC,WAAWhN,EAAM,KAAMA,EAAK9hB,aAGxC8hB,EAAKwL,UAAY,KACjBjB,IAEA6B,EAAWpM,EAAMqF,EAAQgH,EAAQzZ,EAAO0Z,IAGzC,IAAIW,EAAS,SAATA,IACH,GAAG3D,EAAY,CAAC,OAChB,GAAGhL,EAAKsJ,MAAQ4B,EAAU,IAAI,CAC7BxhB,EAAWilB,EAAQ,KACnB,OAED,IAAIC,EAAc9vB,GAAS,WAC1BhD,EAAgB6uB,SAAW,EAC3B0C,MAGDrC,EAAc,KAEdlvB,EAAgB6uB,SAAW,EAE3B0C,IAEAxuB,EAAiB,SAAU,WAC1B,GAAG/C,EAAgB6uB,UAAY,EAAE,CAChC7uB,EAAgB6uB,SAAW,EAE5BiE,KACE,OAGJ,MAAO,CACNC,EAAG,SAAAA,IACF3D,EAAUlL,EAAKsJ,MAEf/D,EAAUH,SAAW7mB,EAASqV,uBAAuB9X,EAAgBkuB,WACrEe,EAAexsB,EAASqV,uBAAuB9X,EAAgBkuB,UAAY,IAAMluB,EAAgBquB,cACjGO,EAAO5uB,EAAgB4uB,KAEvB7rB,EAAiB,SAAUwuB,EAAwB,MAEnDxuB,EAAiB,SAAUwuB,EAAwB,MAEnD,GAAGxxB,EAAOizB,iBAAiB,CAC1B,IAAIA,iBAAkBzB,GAAyB0B,QAASvJ,EAAS,CAACwJ,UAAW,KAAMC,QAAS,KAAMC,WAAY,WACxG,CACN1J,EAAQG,GAAmB,kBAAmB0H,EAAwB,MACtE7H,EAAQG,GAAmB,kBAAmB0H,EAAwB,MACtE8B,YAAY9B,EAAwB,KAGrCxuB,EAAiB,aAAcwuB,EAAwB,MAGvD,CAAC,QAAS,YAAa,QAAS,OAAQ,gBAAiB,eAAgB,sBAAsBxvB,QAAQ,SAAS2K,GAC/GjK,EAASonB,GAAmBnd,EAAM6kB,EAAwB,QAG3D,GAAI,QAAQpkB,KAAK1K,EAAS6wB,YAAa,CACtCT,QACM,CACN9vB,EAAiB,OAAQ8vB,GACzBpwB,EAASonB,GAAmB,mBAAoB0H,GAChD3jB,EAAWilB,EAAQ,KAGpB,GAAGpJ,EAAUH,SAASziB,OAAO,CAC5B8pB,IACAvE,EAAIW,eACE,CACNwE,MAGFgC,WAAYhC,EACZiC,OAAQnC,GAnUI,GAwUVsB,GAAa,WAChB,IAAIc,EAEJ,IAAIC,EAAc1G,GAAM,SAASpH,EAAMqG,EAAQphB,EAAO9G,GACrD,IAAI4vB,EAAS/sB,EAAG4Z,EAChBoF,EAAKuG,gBAAkBpoB,EACvBA,GAAS,KAET6hB,EAAKvjB,aAAa,QAAS0B,GAE3B,GAAGkmB,EAAW9c,KAAK8e,EAAOqG,UAAY,IAAI,CACzCqB,EAAU1H,EAAOuG,qBAAqB,UACtC,IAAI5rB,EAAI,EAAG4Z,EAAMmT,EAAQ9sB,OAAQD,EAAI4Z,EAAK5Z,IAAI,CAC7C+sB,EAAQ/sB,GAAGvE,aAAa,QAAS0B,IAInC,IAAI8G,EAAMogB,OAAO2I,SAAS,CACzBpI,EAAe5F,EAAM/a,EAAMogB,WAG7B,IAAI4I,EAAiB,SAAjBA,EAA2BjO,EAAMgO,EAAU7vB,GAC9C,IAAI8G,EACJ,IAAIohB,EAASrG,EAAKrkB,WAElB,GAAG0qB,EAAO,CACTloB,EAAQioB,EAASpG,EAAMqG,EAAQloB,GAC/B8G,EAAQmgB,EAAapF,EAAM,kBAAmB,CAAC7hB,MAAOA,EAAO6vB,WAAYA,IAEzE,IAAI/oB,EAAMwnB,iBAAiB,CAC1BtuB,EAAQ8G,EAAMogB,OAAOlnB,MAErB,GAAGA,GAASA,IAAU6hB,EAAKuG,gBAAgB,CAC1CuH,EAAY9N,EAAMqG,EAAQphB,EAAO9G,OAMrC,IAAI+vB,EAAsB,SAAtBA,IACH,IAAIltB,EACJ,IAAI4Z,EAAMiT,EAAe5sB,OACzB,GAAG2Z,EAAI,CACN5Z,EAAI,EAEJ,KAAMA,EAAI4Z,EAAK5Z,IAAI,CAClBitB,EAAeJ,EAAe7sB,OAKjC,IAAImtB,EAA+B/wB,GAAS8wB,GAE5C,MAAO,CACNf,EAAG,SAAAA,IACFU,EAAiBhxB,EAASqV,uBAAuB9X,EAAgBsuB,gBACjEvrB,EAAiB,SAAUgxB,IAE5BR,WAAYQ,EACZnB,WAAYiB,GA3DG,GA+Db3vB,EAAO,SAAPA,IACH,IAAIA,EAAK0C,EAAE,CACV1C,EAAK0C,EAAI,KACT+rB,GAAUI,IACV/D,EAAO+D,MAkBT,OAdAtJ,EAAY,CACXuK,IAAKh0B,EACL2yB,UAAWA,GACX3D,OAAQA,EACR9qB,KAAMA,EACN+vB,GAAIzI,EACJ0I,GAAIzJ,EACJ0J,GAAIzJ,EACJ0J,GAAI/J,EACJgK,KAAMrJ,EACNsJ,GAAItI,EACJI,IAAKA,GAlrBUlG,CAAQnmB,EAAQA,EAAO0C,UACvC1C,EAAOypB,UAAYA,EACC,WAAjB,oBAAOlD,OAAP,YAAA5D,QAAO4D,UAAsBA,OAAOD,UACtCC,OAAOD,QAAUmD,GAJlB,CAMCzpB,QCDF,IAAIypB,UAAYA,WAAa,GAEzBlZ,WADA1Q,SAAWA,UAAY,GACX0Q,WAAa,IAG7B7N,SAASM,iBAAiB,mBAAoB,WAC1CymB,UAAUtlB,OACVqwB,gBACA30B,SAAS6O,SAASvK,OAClBtE,SAAS2G,aAAarC,OAGtBtE,SAASyN,OAAOnJ,OAChBtE,SAASqE,QAAQC,OACjBtE,SAASqO,OAAO/J,OAChBoM,UAAUyS,SAAS7e,OACnBoM,UAAUqT,WAAWzf,OACrBoM,UAAUC,UAAUrM,OACpBoM,UAAUgD,QAAQpP,OAClBoM,UAAUlJ,IAAIlD,OACdoM,UAAU5B,KAAKxK,OACfoM,UAAU8U,aAAalhB,OACvBoM,UAAUlC,MAAMlK,OAChBoM,UAAUsC,cAAc1O","file":"master.min.js","sourcesContent":["'use strict';\r\n\r\n/**\r\n* @name Novicell Dynamic Image\r\n* @author Jonas Havmøller & Danni Larsen\r\n* @description Adds eventlisteners for lazysizes and more\r\n*/\r\n\r\n\r\nvar novicell = novicell || {};\r\n\r\nvar lastRefreshWidth = 0;\r\nvar refreshWidth = 50;\r\n\r\n// Lazysizes config\r\nwindow.lazySizesConfig = window.lazySizesConfig || {};\r\nwindow.lazySizesConfig.expand = 1000;\r\n\r\n/*\r\n* Lazyload\r\n*/\r\nnovicell.lazyload = novicell.lazyload || function (e) {\r\n // IE Fix\r\n e.preventDefault = function () {\r\n Object.defineProperty(this, 'defaultPrevented', {get: function () {return true;}});\r\n };\r\n var src,url,query;\r\n var target = e.target;\r\n var preventLoad = target.classList.contains('lazyload-measure') || target.classList.contains('lazyload-bg'); \r\n var setMeasuredUrl = target.classList.contains('lazyload-measure');\r\n var setSrcSet = target.hasAttribute('data-srcset') && target.hasAttribute('data-query-obj');\r\n var setSrc = target.hasAttribute('data-src') && target.hasAttribute('data-query-obj');\r\n if(preventLoad) {\r\n e.preventDefault();\r\n }\r\n\r\n if(setMeasuredUrl) {\r\n var setBg = target.classList.contains('lazyload-bg'); \r\n url = novicell.dynamicImage.getUrl(target);\r\n if(setBg) {\r\n target.parentNode.style.backgroundImage = 'url(' + url + ')'; \r\n target.style.visibility = 'hidden';\r\n }\r\n target.src = url;\r\n //target.setAttribute('data-src', url);\r\n }\r\n else if(setSrcSet) {\r\n query = target.getAttribute('data-query-obj');\r\n var srcset = target.getAttribute('data-srcset').split(',');\r\n src = target.getAttribute('data-src');\r\n var newSrcset = [];\r\n srcset.forEach(function(src){\r\n src = src.trim();\r\n src = src.split(' ');\r\n \r\n var url = src[0];\r\n var bp = src[1];\r\n var newSrc = novicell.dynamicImage.queryUrl(url, query);\r\n // set new srcset\r\n newSrcset.push(newSrc + ' ' + bp);\r\n });\r\n target.setAttribute('srcset', newSrcset.join(', '));\r\n //target.setAttribute('data-srcset', newSrcset.join(', '));\r\n \r\n target.setAttribute('src', novicell.dynamicImage.queryUrl(src, query));\r\n //target.setAttribute('data-src', novicell.dynamicImage.queryUrl(src, query));\r\n }\r\n else if(setSrc) {\r\n query = target.getAttribute('data-query-obj');\r\n src = target.getAttribute('data-src');\r\n url = novicell.dynamicImage.queryUrl(src, query);\r\n target.setAttribute('src', url);\r\n //target.setAttribute('data-src', url);\r\n }\r\n};\r\n\r\n\r\n/*\r\n* Check images\r\n*/\r\nvar checkImages = function() {\r\n if (window.innerWidth > lastRefreshWidth + refreshWidth || window.innerWidth < lastRefreshWidth - refreshWidth) {\r\n var loadedElements = document.body.querySelectorAll('.lazyloaded');\r\n loadedElements.forEach(function(el){\r\n el.classList.remove('lazyloaded');\r\n el.classList.add('lazyload');\r\n });\r\n lastRefreshWidth = window.innerWidth;\r\n }\r\n};\r\n\r\n\r\n/*\r\n* Eventlisteners\r\n*/\r\ndocument.addEventListener('lazybeforeunveil', novicell.lazyload, true);\r\nwindow.addEventListener('resize', novicell.debounce(checkImages), 100, false);","'use strict';\r\n\r\n/**\r\n* @name Novicell Dynamic Image\r\n* @author Jonas Havmøller & Danni Larsen\r\n*/\r\n\r\nvar novicell = novicell || {};\r\n\r\nnovicell.dynamicImage = novicell.dynamicImage || function () {\r\n\r\n function getUrl(el) {\r\n var baseUrl = el.getAttribute('data-src');\r\n var parentHeight = el.parentNode.innerHeight || el.parentNode.offsetHeight;\r\n var parentWidth = el.parentNode.innerWidth || el.parentNode.offsetWidth;\r\n\r\n var pixelInterval = 50;\r\n parentWidth = parentWidth !== null ? parentWidth + pixelInterval - (parentWidth % pixelInterval) : null; // round to the nearest 50\r\n parentHeight = parentHeight !== null ? parentHeight + pixelInterval - (parentHeight % pixelInterval) : null; // round to the nearest 50\r\n \r\n var parentAspectRatio = parentHeight / parentWidth;\r\n\r\n var width = parentWidth;\r\n var height = width * parentAspectRatio;\r\n\r\n baseUrl += width ? nextQuerySign(baseUrl) + \"width=\" + width : \"\";\r\n baseUrl += height !== null ? nextQuerySign(baseUrl) + \"height=\" + height : \"\";\r\n\r\n var queryObjStr = el.getAttribute('data-query-obj');\r\n baseUrl = queryUrl(baseUrl, queryObjStr);\r\n return baseUrl;\r\n }\r\n\r\n function nextQuerySign(url) {\r\n return url.indexOf(\"?\") > -1 ? \"&\" : \"?\";\r\n }\r\n\r\n function queryUrl(url, queryObjStr) {\r\n if (queryObjStr) {\r\n var queryObj = JSON.parse(queryObjStr);\r\n \r\n Object.keys(queryObj).forEach(function(key){\r\n url += queryObj[key] !== null ? nextQuerySign(url) + key + \"=\" + queryObj[key] : \"\";\r\n });\r\n }\r\n return url;\r\n }\r\n \r\n return {\r\n queryUrl: queryUrl,\r\n getUrl: getUrl\r\n };\r\n}();","'use strict';\r\n\r\n/**\r\n * @name Novicell Gallery\r\n * @desc Gallery, for custom arrow use https://flickity.metafizzy.co/options.html#arrowshape\r\n * @author Emil Ankersen (EAN)\r\n * @requires https://flickity.metafizzy.co/\r\n */\r\n\r\n\r\nvar novicell = novicell || {};\r\n\r\nnovicell.gallery = novicell.gallery || new function () {\r\n\r\n this.init = function () {\r\n const gallery = document.querySelector('.js-gallery');\r\n const productPage = document.querySelector('.js-product-page');\r\n const casePage = document.querySelector('.js-case-page');\r\n const galleryNav = document.querySelector('.js-gallery-nav');\r\n const galleryItem = document.querySelectorAll('.gallery__item');\r\n const linkHolder = document.querySelector('.js-gallery-item-link');\r\n const nameHolder = document.querySelector('.js-gallery-item-name');\r\n if (productPage) {\r\n let flktyGallery = new Flickity(gallery, {\r\n // options\r\n cellAlign: 'left',\r\n contain: true,\r\n pageDots: false,\r\n bgLazyLoad: 1,\r\n wrapAround: true,\r\n cellSelector: '.gallery__item',\r\n prevNextButtons: true,\r\n arrowShape: {\r\n x0: 20,\r\n x1: 70, y1: 50,\r\n x2: 80, y2: 40,\r\n x3: 40\r\n }\r\n });\r\n }\r\n\r\n if (casePage) {\r\n let flktyGallery = new Flickity(gallery, {\r\n // options\r\n cellAlign: 'left',\r\n contain: true,\r\n pageDots: false,\r\n bgLazyLoad: 1,\r\n wrapAround: true,\r\n cellSelector: '.gallery__item',\r\n prevNextButtons: true,\r\n arrowShape: {\r\n x0: 20,\r\n x1: 70, y1: 50,\r\n x2: 80, y2: 40,\r\n x3: 40\r\n },\r\n on: {\r\n change: function (index) {\r\n let itemName = galleryItem[index].getAttribute('data-name');\r\n let itemLink = galleryItem[index].getAttribute('data-link');\r\n linkHolder.setAttribute('href', itemLink);\r\n nameHolder.innerHTML = itemName;\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Gallery nav\r\n if (galleryNav && galleryNav != null) {\r\n let flktyGalleryNav = new Flickity(galleryNav, {\r\n bgLazyLoad: 1,\r\n asNavFor: gallery,\r\n contain: true,\r\n pageDots: false,\r\n cellAlign: 'left',\r\n groupCells: true,\r\n });\r\n }\r\n\r\n // Scroll to case list\r\n const scrollTrigger = document.querySelector('.js-scroll-trigger');\r\n const target = document.querySelector('.js-case-list');\r\n if (scrollTrigger != null && target != null) {\r\n scrollTrigger.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n window.scrollTo({\r\n 'behavior': 'smooth',\r\n 'left': 0,\r\n 'top': target.offsetTop - 50\r\n });\r\n }, true);\r\n }\r\n };\r\n}();\r\n","'use strict';\r\n\r\n/**\r\n * @name Novicell Input Mask\r\n * @desc A script that inits vanilla-text-mask.js with default Novicell settings\r\n * @author Bjørn Nyborg (BNY)\r\n * @example \r\n * @requires https://github.com/text-mask/text-mask/tree/master/vanilla\r\n */\r\n\r\n\r\nvar novicell = novicell || {};\r\n\r\nnovicell.inputMasking = novicell.inputMasking || new function () {\r\n\r\n this.init = function () {\r\n\r\n const masks = [\r\n {\r\n \"selector\": \".js-mask--phone\",\r\n \"mask\": [/\\d/, /\\d/, ' ', /\\d/, /\\d/, ' ', /\\d/, /\\d/, ' ', /\\d/, /\\d/],\r\n \"pattern\": \"\"\r\n },\r\n {\r\n \"selector\": \".js-mask--cpr\",\r\n \"mask\": [/\\d/, /\\d/, ' ',/\\d/, /\\d/, ' ', /\\d/, /\\d/,' ', '-', ' ', /\\d/, /\\d/, /\\d/, /\\d/],\r\n \"pattern\": \"\"\r\n },\r\n {\r\n \"selector\": \".js-mask--bank\",\r\n \"mask\": [/\\d/, /\\d/, /\\d/, /\\d/, ' ','-',' ', /\\d/, /\\d/, /\\d/, /\\d/, /\\d/, /\\d/, /\\d/, /\\d/, /\\d/, /\\d/],\r\n \"pattern\": \"\"\r\n },\r\n {\r\n \"selector\": \".js-mask--date1\",\r\n \"mask\": [/[0-3]/, /\\d/, '/', /[0-1]/, /\\d/, '/', /\\d/, /\\d/, /\\d/, /\\d/],\r\n \"pattern\": \"\"\r\n }\r\n ];\r\n\r\n for (let i = 0; i < masks.length; i++) {\r\n\r\n let input = document.querySelector(masks[i].selector);\r\n let mask = masks[i].mask;\r\n let pattern = masks[i].pattern;\r\n\r\n \r\n if(input && mask){\r\n\r\n //Patterns is work in progress\r\n if(pattern){\r\n input.setAttribute(\"pattern\", pattern);\r\n }\r\n\r\n masks[i].masking = vanillaTextMask.maskInput({\r\n inputElement: input,\r\n mask: mask,\r\n guide: false\r\n });\r\n }\r\n }\r\n \r\n // Calling `vanillaTextMask.maskInput` adds event listeners to the input element. \r\n // If you need to remove those event listeners, you can call: maskedInputController.destroy()\r\n };\r\n}();","'use strict';\r\n/**\r\n * @name Novicell Map\r\n * @desc A simple plugin to lazy load a map with an optional custom marker\r\n * @example html:
\r\n * @example js: novicell.map.init();\r\n * @author Danni Larsen - DLA, Mark Lønquist - MLO\r\n */\r\n\r\nvar novicell = novicell || {};\r\nnovicell.map = novicell.map || new function () {\r\n var self = this;\r\n var isLoaded = false;\r\n var options = {};\r\n var markers = [];\r\n\r\n this.init = function (opts) {\r\n options = opts;\r\n\r\n if (!options.selector) {\r\n console.error('novicell.maps: selector is not defined!');\r\n return;\r\n }\r\n\r\n if (!options.apiKey) {\r\n console.error('novicell.maps: apiKey is not defined!');\r\n return;\r\n }\r\n\r\n var element = document.querySelector(options.selector);\r\n\r\n if (!isLoaded && element && isScrolledIntoView(element)) {\r\n load();\r\n\r\n } else {\r\n document.onscroll = function () {\r\n if (!isLoaded && element && isScrolledIntoView(element)) {\r\n load();\r\n }\r\n };\r\n }\r\n };\r\n\r\n this.initialize = function () {\r\n var element = document.querySelector(options.selector);\r\n\r\n // For store maps\r\n let storeMaps = document.querySelector('.js-store-maps');\r\n let mobileZoomLevel = 1;\r\n let mobileLat = 1;\r\n let mobileLng = 1;\r\n let desktopZoomLevel = 1;\r\n let desktopLat = 1;\r\n let desktopLng = 1;\r\n \r\n if (storeMaps) {\r\n mobileZoomLevel = parseFloat(storeMaps.getAttribute('data-mobile-zoom'));\r\n mobileLat = parseFloat(storeMaps.getAttribute('data-mobile-lat'));\r\n mobileLng = parseFloat(storeMaps.getAttribute('data-mobile-lng'));\r\n desktopZoomLevel = parseFloat(storeMaps.getAttribute('data-desktop-zoom'));\r\n desktopLat = parseFloat(storeMaps.getAttribute('data-desktop-lat'));\r\n desktopLng = parseFloat(storeMaps.getAttribute('data-desktop-lng'));\r\n }\r\n\r\n // Set default options\r\n let zoomLevel = desktopZoomLevel;\r\n let lat = desktopLat;\r\n let lng = desktopLng;\r\n\r\n // Mobile options\r\n if (window.innerWidth < 768) {\r\n zoomLevel = mobileZoomLevel;\r\n lat = mobileLat;\r\n lng = mobileLng;\r\n }\r\n\r\n var defaults = {\r\n mapOptions: {\r\n zoom: zoomLevel,\r\n disableDefaultUI: false,\r\n draggable: false,\r\n scrollwheel: false,\r\n center: {\r\n lat: lat,\r\n lng: lng\r\n }\r\n }\r\n };\r\n\r\n // Set options\r\n options = merge_options(defaults, options);\r\n\r\n // Set the google maps element\r\n var map = new google.maps.Map(element, options.mapOptions);\r\n\r\n var icon = {};\r\n\r\n var markerOptions = {\r\n icon: icon,\r\n map: map\r\n };\r\n\r\n // Set infowindow\r\n if (options.hasOwnProperty('infoWindow')) {\r\n var infoWindow = new google.maps.InfoWindow({\r\n content: 'options.infoWindow'\r\n });\r\n }\r\n\r\n // Set icon\r\n if (options.hasOwnProperty('icon')) {\r\n if (options.icon.hasOwnProperty('url')) {\r\n icon.url = options.icon.url;\r\n }\r\n\r\n if (options.icon.hasOwnProperty('size')) {\r\n icon.scaledSize = new google.maps.Size(options.icon.size.width, options.icon.size.height);\r\n }\r\n }\r\n\r\n // Set Markers\r\n for (let i = 0; i < options.markers.length; i++) {\r\n let marker = options.markers[i];\r\n\r\n let mapMarker = new google.maps.Marker({\r\n position: new google.maps.LatLng(parseFloat(marker.lat), parseFloat(marker.lng)),\r\n title: marker.title,\r\n icon: icon,\r\n map: map\r\n });\r\n\r\n markers.push(mapMarker);\r\n\r\n if (storeMaps) {\r\n // Set infowindow eventhandler\r\n google.maps.event.addListener(mapMarker, 'click', function () {\r\n infoWindow.setContent(marker.infoWindow);\r\n infoWindow.open(map, mapMarker);\r\n // Offset top on open infoWindow\r\n map.panTo(mapMarker.getPosition());\r\n map.panBy(0, -200);\r\n });\r\n }\r\n }\r\n\r\n let isTvis = document.querySelector('.js-is-tvis');\r\n\r\n let clusterIcon = '/frontend/dist/images/tvis_cluster_pin.png';\r\n let clusterWidth = 40;\r\n let clusterHeight = 40;\r\n\r\n if (!isTvis) {\r\n clusterIcon = '/frontend/dist/images/svane_cluster_pin.png';\r\n clusterWidth = 40;\r\n clusterHeight = 40;\r\n }\r\n\r\n var clusterStyles = [{\r\n textColor: 'white',\r\n url: clusterIcon,\r\n height: clusterHeight,\r\n width: clusterWidth\r\n }];\r\n\r\n var mcOptions = {\r\n gridSize: 20,\r\n styles: clusterStyles,\r\n maxZoom: 10,\r\n averageCenter: true\r\n };\r\n\r\n var markerCluster = new MarkerClusterer(map, markers, mcOptions);\r\n\r\n\r\n // Fit markers on map\r\n // Check if shop map\r\n const shopMap = document.querySelector('.js-shop-map');\r\n if (!shopMap) {\r\n var bounds = new google.maps.LatLngBounds();\r\n for (let i = 0; i < markers.length; i++) {\r\n bounds.extend(markers[i].getPosition());\r\n }\r\n\r\n map.fitBounds(bounds);\r\n }\r\n\r\n var listener = google.maps.event.addListener(map, \"idle\", function () {\r\n if (map.getZoom() > 16) {\r\n map.setZoom(15);\r\n }\r\n google.maps.event.removeListener(listener);\r\n });\r\n };\r\n\r\n function load() {\r\n isLoaded = true;\r\n // Async load the GMaps API and run \"initialize\"\r\n var script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = 'https://maps.googleapis.com/maps/api/js?callback=novicell.map.initialize&key=' + options.apiKey;\r\n document.body.appendChild(script);\r\n }\r\n\r\n function isScrolledIntoView(el) {\r\n var elemTop = el.getBoundingClientRect().top;\r\n var elemBottom = el.getBoundingClientRect().bottom;\r\n\r\n return (elemBottom >= 0) && (elemTop <= window.innerHeight);\r\n }\r\n\r\n function merge_options(obj, src) {\r\n\r\n Object.keys(src).forEach(function (key) {\r\n if (obj[key] instanceof Object) {\r\n merge_options(obj[key], src[key]);\r\n } else {\r\n obj[key] = src[key];\r\n }\r\n });\r\n return obj;\r\n }\r\n\r\n}();\r\n","'use strict';\r\n\r\n/**\r\n * @name Novicell Persistent Field\r\n * @desc A script that inits persistent field\r\n * @author Bjørn Nyborg (BNY)\r\n * @example \r\n * @requires none\r\n * @credits https://codepen.io/bfred-it/pen/zNNxOz\r\n */\r\n\r\n\r\nvar novicell = novicell || {};\r\n\r\nnovicell.persistentField = novicell.persistentField || new function () {\r\n\r\n this.init = function () {\r\n\r\n for (const key in sessionStorage) {\r\n const value = sessionStorage[key];\r\n const [, name] = key.match(/^form-(.+)/) || [];\r\n if (name) {\r\n try {\r\n const opt = document.querySelector(`form [name=\"${name}\"][value=\"${value}\"],[name=\"${name}\"] [value=\"${value}\"]`);\r\n if (opt) { // select option, radio, and checkbox with a value\r\n opt.checked = opt.selected = true;\r\n continue;\r\n }\r\n } catch(e) {}\r\n const input = document.querySelector(`[name=\"${name}\"]`);\r\n if (input) { \r\n if(input.classList.contains('select-store-input')){\r\n return;\r\n }\r\n\r\n // text-based, checkbox\r\n if (input.type === 'checkbox') {\r\n input.checked = Number(value);\r\n } else {\r\n input.value = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function save ({target: i}) {\r\n if(i.classList.contains('select-store-input')){\r\n return;\r\n }\r\n\r\n sessionStorage.setItem('form-' + i.name, i.type === 'checkbox' ? Number(i.checked) : i.value);\r\n \r\n }\r\n\r\n document.body.addEventListener('input', save);\r\n document.body.addEventListener('change', save);\r\n document.body.addEventListener('submit', () => {\r\n for (var key in sessionStorage) {\r\n if (/^form-(.+)/.test(key)) {\r\n sessionStorage.removeItem(key);\r\n }\r\n }\r\n });\r\n };\r\n};","'use strict';\r\n\r\nvar novicell = novicell || {};\r\nnovicell.search = novicell.search || function () {\r\n\r\n var searchIcon = document.querySelector('.js-search-input-trigger');\r\n var searchForm = document.querySelector('.js-search-form');\r\n var searchInput = document.querySelector('.js-search-input');\r\n\r\n function init() {\r\n // Open search form\r\n if(searchIcon != null) {\r\n searchIcon.addEventListener('click', function (e) {\r\n e.stopPropagation();\r\n openSearch();\r\n }, true); \r\n }\r\n\r\n // Close search form when esc pressed\r\n if(searchInput != null) {\r\n searchInput.addEventListener('keyup', function (evt) {\r\n evt = evt || window.event;\r\n if (evt.keyCode === 27) {\r\n closeSearch();\r\n }\r\n }, true);\r\n }\r\n\r\n // Close search form when click outsite form element\r\n if(searchForm != null) {\r\n document.addEventListener('click', function (e) {\r\n var clickOnBody = e.target != searchForm && e.target.parentNode.parentNode != searchForm ? true : false;\r\n if(searchForm.classList.contains('show-search-form') && clickOnBody){\r\n closeSearch();\r\n }\r\n }, true);\r\n }\r\n }\r\n\r\n function openSearch() {\r\n searchForm.classList.toggle('show-search-form');\r\n searchInput.value = '';\r\n setTimeout(function(){\r\n searchInput.focus();\r\n }, 50); \r\n }\r\n\r\n function closeSearch() {\r\n searchForm.classList.remove('show-search-form');\r\n }\r\n return {\r\n init:init\r\n };\r\n}();\r\n","'use strict';\r\n\r\n/**\r\n * @name Novicell Slider\r\n * @desc Slider, for custom arrow use https://flickity.metafizzy.co/options.html#arrowshape\r\n * @author Emil Ankersen (EAN)\r\n * @requires https://flickity.metafizzy.co/\r\n */\r\n\r\n\r\nvar novicell = novicell || {};\r\n\r\nnovicell.slider = novicell.slider || new function () {\r\n\r\n this.init = function () {\r\n const sliders = document.querySelectorAll('.js-slider');\r\n for (let i = 0; i < sliders.length; i++) {\r\n const element = sliders[i];\r\n if (element && element != null) {\r\n let flkty = new Flickity(element, {\r\n // options\r\n cellAlign: 'left',\r\n contain: true,\r\n bgLazyLoad: 1,\r\n autoPlay: 5000\r\n });\r\n }\r\n\r\n }\r\n\r\n video();\r\n\r\n window.addEventListener('resize', function () {\r\n video();\r\n });\r\n\r\n function video() {\r\n const videoElements = document.querySelectorAll('.js-slider-video');\r\n for (let i = 0; i < videoElements.length; i++) {\r\n const videoElement = videoElements[i];\r\n let videoSrc = videoElement.getAttribute('data-src-desktop');\r\n let mobileSrc = videoElement.getAttribute('data-src-mobile');\r\n\r\n if (window.innerWidth < 767 ) {\r\n if (mobileSrc != '') {\r\n videoSrc = mobileSrc;\r\n } else {\r\n return;\r\n }\r\n }\r\n videoElement.setAttribute('src', videoSrc);\r\n }\r\n }\r\n };\r\n}();\r\n","'use strict';\r\n\r\n/**\r\n * @name Novicell Validate\r\n * @desc A script that inits validate.js with default Novicell settings\r\n * @author Bjørn Nyborg (BNY)\r\n * @example
\r\n * @requires https://github.com/cferdinandi/validate\r\n */\r\n\r\n\r\nvar novicell = novicell || {};\r\n\r\nnovicell.validate = novicell.validate || new function () {\r\n\r\n let form = document.querySelector('.form');\r\n\r\n this.init = function () {\r\n\r\n let requiredCheckboxes = document.querySelectorAll('.js-checkbox-group');\r\n for (let i = 0; i < requiredCheckboxes.length; i++) {\r\n const checkbox = requiredCheckboxes[i];\r\n checkbox.addEventListener('change', function() {\r\n let isChecked = false;\r\n for (let i = 0; i < requiredCheckboxes.length; i++) {\r\n const checkedCheckbox = requiredCheckboxes[i];\r\n if (checkedCheckbox.checked == true) {\r\n isChecked = true;\r\n }\r\n }\r\n for (let i = 0; i < requiredCheckboxes.length; i++) {\r\n const checkedCheckboxInput = requiredCheckboxes[i];\r\n if (isChecked) {\r\n checkedCheckboxInput.removeAttribute('required');\r\n if (checkedCheckboxInput.classList.contains('error')) {\r\n checkedCheckboxInput.classList.remove('error');\r\n }\r\n } else {\r\n checkedCheckboxInput.setAttribute('required', \"\");\r\n }\r\n }\r\n \r\n }, false);\r\n }\r\n\r\n if (form) {\r\n\r\n validate.init({\r\n // Classes and Selectors\r\n selector: '[data-validate]',\r\n fieldClass: 'error',\r\n errorClass: 'error-message',\r\n\r\n // Messages\r\n messageValueMissing: form.getAttribute(\"data-error-msg-required\"),\r\n messageValueMissingCheckbox: form.getAttribute(\"data-error-msg-checkbox\"),\r\n messageValueMissingSelect: form.getAttribute(\"data-error-msg-select\"),\r\n messageValueMissingRadio: form.getAttribute(\"data-error-msg-radio\"),\r\n messageValueMissingSelectMulti: 'Vælg venligst mindst én værdi',\r\n messageTypeMismatchEmail: form.getAttribute(\"data-error-msg-required-email\"),\r\n messageTypeMismatchURL: 'Indtast en gyldig URL',\r\n messageTooShort: 'Indtast venligst {minLength} karakterer eller mere. Du har indtastet {length} karakterer.',\r\n messageTooLong: 'Indtast venligst {maxLength} eller færre karakterer. Du har indtastet {length} karakterer.',\r\n messagePatternMismatch: 'Du har indtastet data i et forkert format',\r\n messageBadInput: 'Indtast venligst et tal',\r\n messageStepMismatch: 'Vælg venligst en gyldig værdi',\r\n messageRangeOverflow: 'Du må ikke angive mere end {max}.',\r\n messageRangeUnderflow: 'Du må ikke angive mindre end {min}.',\r\n messageGeneric: 'Den indtastede værdi er ugyldig',\r\n\r\n // Form Submission\r\n disableSubmit: false,\r\n onSubmit: function () {},\r\n \r\n // Callbacks\r\n beforeShowError: function (e) {\r\n e.classList.add(\"validated\");\r\n },\r\n afterShowError: function () {},\r\n beforeRemoveError: function () {},\r\n afterRemoveError: function () {},\r\n });\r\n }\r\n };\r\n}();\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\n\r\nsvaneTvis.accordion = svaneTvis.accordion || new function () {\r\n this.init = function () {\r\n\r\n let accordionToggles = document.querySelectorAll('.js-accordion-toggle');\r\n let accordion = document.querySelectorAll('.accordion');\r\n\r\n for (let i = 0; i < accordionToggles.length; i++) {\r\n accordionToggles[i].addEventListener('click', function (e) {\r\n e.preventDefault();\r\n const element = e.target;\r\n accordionAnimate(element);\r\n });\r\n }\r\n\r\n // Open accordion via hash in url\r\n var location = window.location.hash;\r\n if (location.indexOf('#open') != -1) {\r\n var el = document.querySelector(location);\r\n if (el) {\r\n el.firstElementChild.scrollIntoView({\r\n 'behavior': 'smooth'\r\n });\r\n accordionAnimate(el.firstElementChild);\r\n }\r\n }\r\n\r\n };\r\n\r\n // polyfill for closest\r\n if (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n }\r\n\r\n if (!Element.prototype.closest) {\r\n\r\n Element.prototype.closest = function (s) {\r\n var el = this;\r\n if (!document.documentElement.contains(el)) {\r\n return null;\r\n }\r\n do {\r\n if (el.matches(s)) {\r\n return el;\r\n }\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n }\r\n\r\n function accordionAnimate(element) {\r\n var contentItem = element.closest(\".js-accordion-toggle\").nextElementSibling;\r\n contentItem.classList.toggle('accordion__item--active');\r\n element.classList.toggle('accordion__item-title--active');\r\n\r\n var elementContent = contentItem.querySelector('.js-accordion-content');\r\n\r\n if (elementContent != undefined) {\r\n let elementContentHeight = elementContent.offsetHeight;\r\n let newHeight;\r\n let heightAttr = contentItem.dataset.height;\r\n\r\n if (heightAttr === undefined) {\r\n newHeight = contentItem.offsetHeight + elementContentHeight;\r\n contentItem.dataset.height = contentItem.offsetHeight;\r\n } else {\r\n if (heightAttr < contentItem.offsetHeight) {\r\n newHeight = heightAttr;\r\n } else {\r\n newHeight = contentItem.offsetHeight + elementContentHeight;\r\n }\r\n }\r\n contentItem.style.height = newHeight + 'px';\r\n }\r\n }\r\n\r\n}();\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\n\r\nsvaneTvis.form = svaneTvis.form || new function () {\r\n this.init = function () {\r\n let inputs = document.querySelectorAll('.select-store-input');\r\n let shops = document.querySelectorAll('#ShopList option');\r\n let shopList = document.querySelector('#ShopList');\r\n \r\n if(shopList != null && shops.length){\r\n var shopEmail = document.querySelector('#ShopEmail');\r\n var shopSecondrayEmail = document.querySelector('#ShopEmailCC');\r\n\r\n // Add eventlistener on radio buttons\r\n for (let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n \r\n input.addEventListener('change', function () {\r\n let inputIndex = i + 1;\r\n \r\n let shop = shops[inputIndex].getAttribute('value');\r\n shopList.value = shop;\r\n\r\n let selectedStore = document.querySelector('.selected-store');\r\n let selectedStoreName = document.querySelector('.selected-store-name');\r\n\r\n selectedStore.style.display = \"block\";\r\n selectedStoreName.innerHTML = shop;\r\n\r\n // Set ShopEmail and ShopEmailCC when radiobutons changes\r\n var preselected = shopList.options[shopList.selectedIndex];\r\n\r\n shopEmail.setAttribute(\"value\", preselected.getAttribute('data-email'));\r\n shopSecondrayEmail.setAttribute(\"value\", preselected.getAttribute('data-emailcc'));\r\n\r\n }, false);\r\n }\r\n \r\n // Set ShopEmail and ShopEmailCC when ShopList-select changes\r\n shopList.addEventListener('change', function (e) {\r\n var selected = shopList.options[shopList.selectedIndex];\r\n \r\n shopEmail.setAttribute(\"value\", selected.getAttribute('data-email'));\r\n shopSecondrayEmail.setAttribute(\"value\", selected.getAttribute('data-emailcc'));\r\n });\r\n }\r\n\r\n // var getCookie = function (name) {\r\n // var value = \"; \" + document.cookie;\r\n // var parts = value.split(\"; \" + name + \"=\");\r\n \r\n // if (parts.length == 2) {\r\n // return parts.pop().split(\";\").shift();\r\n // } \r\n // };\r\n\r\n // Populate the selected store on reload, if already selected\r\n // window.addEventListener('DOMContentLoaded', (event) => {\r\n // var currentShop = getCookie('SelectedShop');\r\n // if(currentShop){\r\n // var currentInput = document.querySelector('.select-store-input[data-shop-id=\"' + currentShop + '\"]');\r\n \r\n // if(currentInput) {\r\n // currentInput.checked = false;\r\n // currentInput.click();\r\n // }\r\n // }\r\n // });\r\n \r\n\r\n };\r\n}();\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\nvar novicell = novicell || {};\r\nvar setCookie = setCookie || function(){};\r\n\r\nsvaneTvis.languagePopup = svaneTvis.languagePopup || new function () {\r\n this.init = function () {\r\n var browserLanguage = window.navigator.language;\r\n var siteLanguage = document.documentElement.lang.toLowerCase();\r\n var languageOverlayShownCookie = readCookie('languageOverlayShown');\r\n var languageOverlayHolder = document.getElementById('languageOverlayHolder');\r\n if(languageOverlayHolder && languageOverlayShownCookie === undefined && siteLanguage !== 'no' && (browserLanguage === 'no' || browserLanguage === 'nb' || browserLanguage === 'nn')){\r\n novicell.overlay.create({\r\n 'selector':'#languageOverlayHolder',\r\n 'class': 'novi-overlay--language-overlay',\r\n 'onLoaded': function(){\r\n var backdrop = document.getElementById('js-novi-backdrop');\r\n backdrop.classList.add('novi-backdrop--language-overlay');\r\n var stayLink = backdrop.querySelector('.language-overlay__link');\r\n if(stayLink) {\r\n stayLink.addEventListener('click', function(e) {\r\n e.preventDefault();\r\n var closeBtn = document.getElementById('js-novi-overlay-close');\r\n if(closeBtn) {\r\n closeBtn.click();\r\n }\r\n });\r\n }\r\n }\r\n });\r\n setCookie('languageOverlayShown', 'true', 1);\r\n }\r\n };\r\n}();\r\n\r\nvar readCookie = function (name) {\r\n var value = \"; \" + document.cookie;\r\n var parts = value.split(\"; \" + name + \"=\");\r\n if (parts.length == 2) {\r\n return parts.pop().split(\";\").shift();\r\n } \r\n};\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\nvar novicell = novicell || {};\r\nvar markers = markers || [];\r\nvar shopList = shopList || [];\r\n\r\nsvaneTvis.map = svaneTvis.map || new function () {\r\n let isTvis = document.querySelector('.js-is-tvis');\r\n \r\n let icon = '/frontend/dist/images/tvis_google_pin.png';\r\n let IconWidth = 34;\r\n let IconHeight = 50; \r\n\r\n if(!isTvis) {\r\n icon = \"/frontend/dist/images/svane_google_pin.png\";\r\n IconWidth = 30;\r\n IconHeight = 45; \r\n }\r\n\r\n this.init = function () {\r\n novicell.map.init({\r\n apiKey: 'AIzaSyCKw7im4u7h50OPS4KM5hCC3us-gnlbbTE',\r\n selector: '#map-canvas',\r\n icon: {\r\n url: icon,\r\n size: {\r\n width: IconWidth,\r\n height: IconHeight\r\n }\r\n },\r\n \r\n infoWindow: '',\r\n mapOptions: {\r\n disableDefaultUI: false,\r\n draggable: true,\r\n scrollwheel: false,\r\n styles: [{\"featureType\":\"water\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#aeaeae\"}]},{\"featureType\":\"transit\",\"stylers\":[{\"color\":\"#808080\"},{\"visibility\":\"off\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"visibility\":\"on\"},{\"color\":\"#b3b3b3\"}]},{\"featureType\":\"road.highway\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#ffffff\"}]},{\"featureType\":\"road.local\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"visibility\":\"on\"},{\"color\":\"#ffffff\"},{\"weight\":1.8}]},{\"featureType\":\"road.local\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#d7d7d7\"}]},{\"featureType\":\"poi\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"visibility\":\"on\"},{\"color\":\"#ebebeb\"}]},{\"featureType\":\"administrative\",\"elementType\":\"geometry\",\"stylers\":[{\"color\":\"#a7a7a7\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#ffffff\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#ffffff\"}]},{\"featureType\":\"landscape\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"visibility\":\"on\"},{\"color\":\"#efefef\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"color\":\"#696969\"}]},{\"featureType\":\"administrative\",\"elementType\":\"labels.text.fill\",\"stylers\":[{\"visibility\":\"on\"},{\"color\":\"#737373\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"poi\",\"elementType\":\"labels\",\"stylers\":[{\"visibility\":\"off\"}]},{\"featureType\":\"road.arterial\",\"elementType\":\"geometry.stroke\",\"stylers\":[{\"color\":\"#d6d6d6\"}]},{\"featureType\":\"road\",\"elementType\":\"labels.icon\",\"stylers\":[{\"visibility\":\"off\"}]},{},{\"featureType\":\"poi\",\"elementType\":\"geometry.fill\",\"stylers\":[{\"color\":\"#dadada\"}]}]\r\n\r\n },\r\n markers: shopList\r\n });\r\n };\r\n}();","'use strict';\r\nvar svaneTvis = svaneTvis || {};\r\n\r\nsvaneTvis.markedplaceFilters = svaneTvis.markedplaceFilters || new function () {\r\n // polyfill for closest\r\n if (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n }\r\n\r\n if (!Element.prototype.closest) {\r\n\r\n Element.prototype.closest = function (s) {\r\n var el = this;\r\n if (!document.documentElement.contains(el)) {\r\n return null;\r\n }\r\n do {\r\n if (el.matches(s)) {\r\n return el;\r\n }\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n }\r\n\r\n const app = document.getElementById('app');\r\n const body = document.querySelector('body');\r\n\r\n if (app) {\r\n new Vue({\r\n el: app,\r\n data: {\r\n allShops: [],\r\n activeCategories: [],\r\n showModal: false,\r\n location: '*',\r\n currentModalData: [],\r\n itemtype: 'Product'\r\n },\r\n mounted() {\r\n axios.get(marketplaceApiUrl)\r\n .then((response) => {\r\n this.allShops = response.data.shop;\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n },\r\n methods: {\r\n getShopItems(shop) {\r\n if (this.activeCategories.length === 0) {\r\n if(shop.items === undefined) {\r\n return undefined;\r\n }\r\n return shop.items.filter(item => item.itemType === this.itemtype);\r\n }\r\n return shop.items.filter(item => this.activeCategories.includes(item.type) && item.itemType === this.itemtype);\r\n },\r\n openModal(item) {\r\n this.currentModalData = item;\r\n this.showModal = true;\r\n this.$nextTick(() => {\r\n // const carousel = document.querySelector(\".main-carousel\");\r\n let flkty = new Flickity(this.$refs.carousel, {\r\n contain: true,\r\n adaptiveHeight: true,\r\n pageDots: false,\r\n lazyLoad: true\r\n });\r\n });\r\n body.classList.add('no-scroll');\r\n\r\n },\r\n closeModal() {\r\n this.showModal = false;\r\n this.currentModalData = [];\r\n body.classList.remove('no-scroll');\r\n\r\n },\r\n\r\n showText(event) {\r\n this.animateHeight(event.target);\r\n },\r\n\r\n animateHeight(element) {\r\n const elementWrapper = element.closest('.box__content');\r\n const contentItem = elementWrapper.querySelector('.box__description');\r\n const elementContent = contentItem.querySelector('.box__description-wrapper');\r\n const showMoreText = element.getAttribute('data-show-more-text');\r\n const showLessText = element.getAttribute('data-show-less-text');\r\n\r\n if (elementContent != undefined) {\r\n let elementContentHeight = elementContent.offsetHeight;\r\n let newHeight;\r\n let heightAttr = contentItem.dataset.height;\r\n\r\n if (heightAttr === undefined) {\r\n newHeight = contentItem.offsetHeight + elementContentHeight - 130;\r\n contentItem.dataset.height = contentItem.offsetHeight;\r\n contentItem.dataset.textShowMore = false;\r\n element.closest('.box__content').classList.add('box__content--active');\r\n element.innerHTML = showLessText;\r\n } else {\r\n if(contentItem.dataset.textShowMore === 'true'){\r\n contentItem.dataset.textShowMore = false;\r\n element.innerHTML = showLessText;\r\n }else {\r\n contentItem.dataset.textShowMore = true;\r\n element.innerHTML = showMoreText;\r\n }\r\n if (heightAttr < contentItem.offsetHeight) {\r\n newHeight = heightAttr;\r\n element.closest('.box__content').classList.remove('box__content--active');\r\n } else {\r\n newHeight = contentItem.offsetHeight + elementContentHeight - 130;\r\n element.closest('.box__content').classList.add('box__content--active');\r\n }\r\n }\r\n contentItem.style.height = newHeight + 'px';\r\n }\r\n }\r\n },\r\n computed: {\r\n shopsWithItems() {\r\n const shops = [];\r\n for (let i = 0; i < this.allShops.length; i++) {\r\n const shop = this.allShops[i];\r\n if (shop.items.length) {\r\n shops.push(shop);\r\n }\r\n }\r\n return shops;\r\n },\r\n shopList() {\r\n let shopList = this.allShops;\r\n if (this.location !== '*') {\r\n shopList = shopList.filter(s => s.shop.toLowerCase() === this.location.toLowerCase());\r\n }\r\n return shopList;\r\n },\r\n categories() {\r\n let temp = this.allShops;\r\n const categories = [];\r\n\r\n // Take all the items from all the shops, and merge them into one list\r\n const shopItems = this.shopList.reduce((list, shop) => {\r\n return list.concat(shop.items);\r\n }, []);\r\n\r\n temp.map(shop => {\r\n shop.items.map(item => {\r\n if (!categories.some(x => x.name === item.type)) {\r\n // Check if any of the shops contains the category. If not disable the the filter option\r\n const disabled = !shopItems.some(x => x.type == item.type);\r\n if (item.type != '') {\r\n categories.push({\r\n name: item.type,\r\n disabled,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n return categories;\r\n },\r\n },\r\n });\r\n }\r\n}();\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\n\r\nsvaneTvis.markedplace = svaneTvis.markedplace || new function () {\r\n // polyfill for closest\r\n if (!Element.prototype.matches) {\r\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector;\r\n }\r\n\r\n if (!Element.prototype.closest) {\r\n\r\n Element.prototype.closest = function (s) {\r\n var el = this;\r\n if (!document.documentElement.contains(el)) {\r\n return null;\r\n }\r\n do {\r\n if (el.matches(s)) {\r\n return el;\r\n }\r\n el = el.parentElement || el.parentNode;\r\n } while (el !== null && el.nodeType === 1);\r\n return null;\r\n };\r\n }\r\n\r\n const apps = document.getElementsByClassName('js-marketplace');\r\n const body = document.querySelector('body');\r\n\r\n for(let i=0;i< apps.length;i+=1) {\r\n const app = apps[i];\r\n const shopName = app.getAttribute('data-shop-name').toLowerCase();\r\n new Vue({\r\n el: app,\r\n data: {\r\n shop: [],\r\n showModal: false,\r\n location: '*',\r\n currentModalData: [],\r\n itemtype: 'Product'\r\n },\r\n mounted() {\r\n this.itemtype = this.$el.dataset.marketplaceType==='cases'? 'Case':'Product';\r\n axios.get(marketplaceApiUrl + '?City=' + shopName)\r\n .then((response) => {\r\n this.shop = response.data.shop[0];\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n },\r\n methods: {\r\n getShopItems(shop) {\r\n if(shop.items === undefined) {\r\n return undefined;\r\n }\r\n return shop.items.filter(item => item.itemType === this.itemtype);\r\n },\r\n openModal(item) {\r\n this.currentModalData = item;\r\n this.showModal = true;\r\n this.$nextTick(() => {\r\n // const carousel = document.querySelector(\".main-carousel\");\r\n let flkty = new Flickity(this.$refs.carousel, {\r\n contain: true,\r\n adaptiveHeight: true,\r\n pageDots: false,\r\n lazyLoad: true\r\n });\r\n });\r\n body.classList.add('no-scroll');\r\n\r\n },\r\n closeModal() {\r\n this.showModal = false;\r\n this.currentModalData = [];\r\n body.classList.remove('no-scroll');\r\n\r\n },\r\n\r\n showText(event) {\r\n this.animateHeight(event.target);\r\n },\r\n\r\n animateHeight(element) {\r\n const elementWrapper = element.closest('.box__content');\r\n const contentItem = elementWrapper.querySelector('.box__description');\r\n const elementContent = contentItem.querySelector('.box__description-wrapper');\r\n const showMoreText = element.getAttribute('data-show-more-text');\r\n const showLessText = element.getAttribute('data-show-less-text');\r\n\r\n if (elementContent != undefined) {\r\n let elementContentHeight = elementContent.offsetHeight;\r\n let newHeight;\r\n let heightAttr = contentItem.dataset.height;\r\n\r\n if (heightAttr === undefined) {\r\n newHeight = contentItem.offsetHeight + elementContentHeight - 130;\r\n contentItem.dataset.height = contentItem.offsetHeight;\r\n contentItem.dataset.textShowMore = false;\r\n element.closest('.box__content').classList.add('box__content--active');\r\n element.innerHTML = showLessText;\r\n } else {\r\n if(contentItem.dataset.textShowMore === 'true'){\r\n contentItem.dataset.textShowMore = false;\r\n element.innerHTML = showLessText;\r\n }else {\r\n contentItem.dataset.textShowMore = true;\r\n element.innerHTML = showMoreText;\r\n }\r\n if (heightAttr < contentItem.offsetHeight) {\r\n newHeight = heightAttr;\r\n element.closest('.box__content').classList.remove('box__content--active');\r\n } else {\r\n newHeight = contentItem.offsetHeight + elementContentHeight - 130;\r\n element.closest('.box__content').classList.add('box__content--active');\r\n }\r\n }\r\n contentItem.style.height = newHeight + 'px';\r\n }\r\n }\r\n },\r\n computed: {\r\n shopsWithItems() {\r\n const shops = [];\r\n for (let i = 0; i < this.shop.length; i++) {\r\n const shop = this.shop[i];\r\n if (shop.items.length) {\r\n shops.push(shop);\r\n }\r\n }\r\n return shops;\r\n },\r\n shopList() {\r\n let shopList = this.shop;\r\n if (this.location !== '*') {\r\n shopList = shopList.filter(s => s.shop.toLowerCase() === this.location.toLowerCase());\r\n }\r\n return shopList;\r\n },\r\n categories() {\r\n let temp = this.shop;\r\n const categories = [];\r\n\r\n // Take all the items from all the shops, and merge them into one list\r\n const shopItems = this.shopList.reduce((list, shop) => {\r\n return list.concat(shop.items);\r\n }, []);\r\n\r\n temp.map(shop => {\r\n shop.items.map(item => {\r\n if (!categories.some(x => x.name === item.type)) {\r\n // Check if any of the shops contains the category. If not disable the the filter option\r\n const disabled = !shopItems.some(x => x.type == item.type);\r\n if (item.type != '') {\r\n categories.push({\r\n name: item.type,\r\n disabled,\r\n });\r\n }\r\n }\r\n });\r\n });\r\n return categories;\r\n },\r\n },\r\n });\r\n }\r\n}(); ","'use strict';\r\n/* jshint ignore:start */\r\n\r\n// ==ClosureCompiler==\r\n// @compilation_level ADVANCED_OPTIMIZATIONS\r\n// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3_3.js\r\n// ==/ClosureCompiler==\r\n\r\n/**\r\n * @name MarkerClusterer for Google Maps v3\r\n * @version version 1.0.1\r\n * @author Luke Mahe\r\n * @fileoverview\r\n * The library creates and manages per-zoom-level clusters for large amounts of\r\n * markers.\r\n */\r\n\r\n/**\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n\r\n/**\r\n * A Marker Clusterer that clusters markers.\r\n *\r\n * @param {google.maps.Map} map The Google map to attach to.\r\n * @param {Array.=} opt_markers Optional markers to add to\r\n * the cluster.\r\n * @param {Object=} opt_options support the following options:\r\n * 'gridSize': (number) The grid size of a cluster in pixels.\r\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\r\n * cluster.\r\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\r\n * cluster is to zoom into it.\r\n * 'imagePath': (string) The base URL where the images representing\r\n * clusters will be found. The full URL will be:\r\n * {imagePath}[1-5].{imageExtension}\r\n * Default: '../images/m'.\r\n * 'imageExtension': (string) The suffix for images URL representing\r\n * clusters will be found. See _imagePath_ for details.\r\n * Default: 'png'.\r\n * 'averageCenter': (boolean) Whether the center of each cluster should be\r\n * the average of all markers in the cluster.\r\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\r\n * cluster before the markers are hidden and a count\r\n * is shown.\r\n * 'styles': (object) An object that has style properties:\r\n * 'url': (string) The image url.\r\n * 'height': (number) The image height.\r\n * 'width': (number) The image width.\r\n * 'anchor': (Array) The anchor position of the label text.\r\n * 'textColor': (string) The text color.\r\n * 'textSize': (number) The text size.\r\n * 'backgroundPosition': (string) The position of the backgound x, y.\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n */\r\nfunction MarkerClusterer(map, opt_markers, opt_options) {\r\n // MarkerClusterer implements google.maps.OverlayView interface. We use the\r\n // extend function to extend MarkerClusterer with google.maps.OverlayView\r\n // because it might not always be available when the code is defined so we\r\n // look for it at the last possible moment. If it doesn't exist now then\r\n // there is no point going ahead :)\r\n this.extend(MarkerClusterer, google.maps.OverlayView);\r\n this.map_ = map;\r\n\r\n /**\r\n * @type {Array.}\r\n * @private\r\n */\r\n this.markers_ = [];\r\n\r\n /**\r\n * @type {Array.}\r\n */\r\n this.clusters_ = [];\r\n\r\n this.sizes = [53, 56, 66, 78, 90];\r\n\r\n /**\r\n * @private\r\n */\r\n this.styles_ = [];\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.ready_ = false;\r\n\r\n var options = opt_options || {};\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.gridSize_ = options['gridSize'] || 60;\r\n\r\n /**\r\n * @private\r\n */\r\n this.minClusterSize_ = options['minimumClusterSize'] || 2;\r\n\r\n\r\n /**\r\n * @type {?number}\r\n * @private\r\n */\r\n this.maxZoom_ = options['maxZoom'] || null;\r\n\r\n this.styles_ = options['styles'] || [];\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imagePath_ = options['imagePath'] ||\r\n this.MARKER_CLUSTER_IMAGE_PATH_;\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imageExtension_ = options['imageExtension'] ||\r\n this.MARKER_CLUSTER_IMAGE_EXTENSION_;\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.zoomOnClick_ = true;\r\n\r\n if (options['zoomOnClick'] != undefined) {\r\n this.zoomOnClick_ = options['zoomOnClick'];\r\n }\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.averageCenter_ = false;\r\n\r\n if (options['averageCenter'] != undefined) {\r\n this.averageCenter_ = options['averageCenter'];\r\n }\r\n\r\n this.setupStyles_();\r\n\r\n this.setMap(map);\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.prevZoom_ = this.map_.getZoom();\r\n\r\n // Add the map event listeners\r\n var that = this;\r\n google.maps.event.addListener(this.map_, 'zoom_changed', function () {\r\n // Determines map type and prevent illegal zoom levels\r\n var zoom = that.map_.getZoom();\r\n var minZoom = that.map_.minZoom || 0;\r\n var maxZoom = Math.min(that.map_.maxZoom || 100,\r\n that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom);\r\n zoom = Math.min(Math.max(zoom, minZoom), maxZoom);\r\n\r\n if (that.prevZoom_ != zoom) {\r\n that.prevZoom_ = zoom;\r\n that.resetViewport();\r\n }\r\n });\r\n\r\n google.maps.event.addListener(this.map_, 'idle', function () {\r\n that.redraw();\r\n });\r\n\r\n // Finally, add the markers\r\n if (opt_markers && (opt_markers.length || Object.keys(opt_markers).length)) {\r\n this.addMarkers(opt_markers, false);\r\n }\r\n}\r\n\r\n\r\n/**\r\n * The marker cluster image path.\r\n *\r\n * @type {string}\r\n * @private\r\n */\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = '../images/m';\r\n\r\n\r\n/**\r\n * The marker cluster image path.\r\n *\r\n * @type {string}\r\n * @private\r\n */\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';\r\n\r\n\r\n/**\r\n * Extends a objects prototype by anothers.\r\n *\r\n * @param {Object} obj1 The object to be extended.\r\n * @param {Object} obj2 The object to extend with.\r\n * @return {Object} The new extended object.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.extend = function (obj1, obj2) {\r\n return (function (object) {\r\n for (var property in object.prototype) {\r\n this.prototype[property] = object.prototype[property];\r\n }\r\n return this;\r\n }).apply(obj1, [obj2]);\r\n};\r\n\r\n\r\n/**\r\n * Implementaion of the interface method.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.onAdd = function () {\r\n this.setReady_(true);\r\n};\r\n\r\n/**\r\n * Implementaion of the interface method.\r\n * @ignore\r\n */\r\nMarkerClusterer.prototype.draw = function () {};\r\n\r\n/**\r\n * Sets up the styles object.\r\n *\r\n * @private\r\n */\r\nMarkerClusterer.prototype.setupStyles_ = function () {\r\n if (this.styles_.length) {\r\n return;\r\n }\r\n\r\n for (var i = 0, size; size = this.sizes[i]; i++) {\r\n this.styles_.push({\r\n url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_,\r\n height: size,\r\n width: size\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Fit the map to the bounds of the markers in the clusterer.\r\n */\r\nMarkerClusterer.prototype.fitMapToMarkers = function () {\r\n var markers = this.getMarkers();\r\n var bounds = new google.maps.LatLngBounds();\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n bounds.extend(marker.getPosition());\r\n }\r\n\r\n this.map_.fitBounds(bounds);\r\n};\r\n\r\n\r\n/**\r\n * Sets the styles.\r\n *\r\n * @param {Object} styles The style to set.\r\n */\r\nMarkerClusterer.prototype.setStyles = function (styles) {\r\n this.styles_ = styles;\r\n};\r\n\r\n\r\n/**\r\n * Gets the styles.\r\n *\r\n * @return {Object} The styles object.\r\n */\r\nMarkerClusterer.prototype.getStyles = function () {\r\n return this.styles_;\r\n};\r\n\r\n\r\n/**\r\n * Whether zoom on click is set.\r\n *\r\n * @return {boolean} True if zoomOnClick_ is set.\r\n */\r\nMarkerClusterer.prototype.isZoomOnClick = function () {\r\n return this.zoomOnClick_;\r\n};\r\n\r\n/**\r\n * Whether average center is set.\r\n *\r\n * @return {boolean} True if averageCenter_ is set.\r\n */\r\nMarkerClusterer.prototype.isAverageCenter = function () {\r\n return this.averageCenter_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the array of markers in the clusterer.\r\n *\r\n * @return {Array.} The markers.\r\n */\r\nMarkerClusterer.prototype.getMarkers = function () {\r\n return this.markers_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the number of markers in the clusterer\r\n *\r\n * @return {Number} The number of markers.\r\n */\r\nMarkerClusterer.prototype.getTotalMarkers = function () {\r\n return this.markers_.length;\r\n};\r\n\r\n\r\n/**\r\n * Sets the max zoom for the clusterer.\r\n *\r\n * @param {number} maxZoom The max zoom level.\r\n */\r\nMarkerClusterer.prototype.setMaxZoom = function (maxZoom) {\r\n this.maxZoom_ = maxZoom;\r\n};\r\n\r\n\r\n/**\r\n * Gets the max zoom for the clusterer.\r\n *\r\n * @return {number} The max zoom level.\r\n */\r\nMarkerClusterer.prototype.getMaxZoom = function () {\r\n return this.maxZoom_;\r\n};\r\n\r\n\r\n/**\r\n * The function for calculating the cluster icon image.\r\n *\r\n * @param {Array.} markers The markers in the clusterer.\r\n * @param {number} numStyles The number of styles available.\r\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\r\n * @private\r\n */\r\nMarkerClusterer.prototype.calculator_ = function (markers, numStyles) {\r\n var index = 0;\r\n var count = markers.length;\r\n var dv = count;\r\n while (dv !== 0) {\r\n dv = parseInt(dv / 10, 10);\r\n index++;\r\n }\r\n\r\n index = Math.min(index, numStyles);\r\n return {\r\n text: count,\r\n index: index\r\n };\r\n};\r\n\r\n\r\n/**\r\n * Set the calculator function.\r\n *\r\n * @param {function(Array, number)} calculator The function to set as the\r\n * calculator. The function should return a object properties:\r\n * 'text' (string) and 'index' (number).\r\n *\r\n */\r\nMarkerClusterer.prototype.setCalculator = function (calculator) {\r\n this.calculator_ = calculator;\r\n};\r\n\r\n\r\n/**\r\n * Get the calculator function.\r\n *\r\n * @return {function(Array, number)} the calculator function.\r\n */\r\nMarkerClusterer.prototype.getCalculator = function () {\r\n return this.calculator_;\r\n};\r\n\r\n\r\n/**\r\n * Add an array of markers to the clusterer.\r\n *\r\n * @param {Array.} markers The markers to add.\r\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n */\r\nMarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {\r\n if (markers.length) {\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n this.pushMarkerTo_(marker);\r\n }\r\n } else if (Object.keys(markers).length) {\r\n for (var marker in markers) {\r\n this.pushMarkerTo_(markers[marker]);\r\n }\r\n }\r\n if (!opt_nodraw) {\r\n this.redraw();\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Pushes a marker to the clusterer.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.pushMarkerTo_ = function (marker) {\r\n marker.isAdded = false;\r\n if (marker['draggable']) {\r\n // If the marker is draggable add a listener so we update the clusters on\r\n // the drag end.\r\n var that = this;\r\n google.maps.event.addListener(marker, 'dragend', function () {\r\n marker.isAdded = false;\r\n that.repaint();\r\n });\r\n }\r\n this.markers_.push(marker);\r\n};\r\n\r\n\r\n/**\r\n * Adds a marker to the clusterer and redraws if needed.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n */\r\nMarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {\r\n this.pushMarkerTo_(marker);\r\n if (!opt_nodraw) {\r\n this.redraw();\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Removes a marker and returns true if removed, false if not\r\n *\r\n * @param {google.maps.Marker} marker The marker to remove\r\n * @return {boolean} Whether the marker was removed or not\r\n * @private\r\n */\r\nMarkerClusterer.prototype.removeMarker_ = function (marker) {\r\n var index = -1;\r\n if (this.markers_.indexOf) {\r\n index = this.markers_.indexOf(marker);\r\n } else {\r\n for (var i = 0, m; m = this.markers_[i]; i++) {\r\n if (m == marker) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (index == -1) {\r\n // Marker is not in our list of markers.\r\n return false;\r\n }\r\n\r\n marker.setMap(null);\r\n\r\n this.markers_.splice(index, 1);\r\n\r\n return true;\r\n};\r\n\r\n\r\n/**\r\n * Remove a marker from the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to remove.\r\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n * @return {boolean} True if the marker was removed.\r\n */\r\nMarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {\r\n var removed = this.removeMarker_(marker);\r\n\r\n if (!opt_nodraw && removed) {\r\n this.resetViewport();\r\n this.redraw();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Removes an array of markers from the cluster.\r\n *\r\n * @param {Array.} markers The markers to remove.\r\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n */\r\nMarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {\r\n // create a local copy of markers if required\r\n // (removeMarker_ modifies the getMarkers() array in place)\r\n var markersCopy = markers === this.getMarkers() ? markers.slice() : markers;\r\n var removed = false;\r\n\r\n for (var i = 0, marker; marker = markersCopy[i]; i++) {\r\n var r = this.removeMarker_(marker);\r\n removed = removed || r;\r\n }\r\n\r\n if (!opt_nodraw && removed) {\r\n this.resetViewport();\r\n this.redraw();\r\n return true;\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Sets the clusterer's ready state.\r\n *\r\n * @param {boolean} ready The state.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.setReady_ = function (ready) {\r\n if (!this.ready_) {\r\n this.ready_ = ready;\r\n this.createClusters_();\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Returns the number of clusters in the clusterer.\r\n *\r\n * @return {number} The number of clusters.\r\n */\r\nMarkerClusterer.prototype.getTotalClusters = function () {\r\n return this.clusters_.length;\r\n};\r\n\r\n\r\n/**\r\n * Returns the google map that the clusterer is associated with.\r\n *\r\n * @return {google.maps.Map} The map.\r\n */\r\nMarkerClusterer.prototype.getMap = function () {\r\n return this.map_;\r\n};\r\n\r\n\r\n/**\r\n * Sets the google map that the clusterer is associated with.\r\n *\r\n * @param {google.maps.Map} map The map.\r\n */\r\nMarkerClusterer.prototype.setMap = function (map) {\r\n this.map_ = map;\r\n};\r\n\r\n\r\n/**\r\n * Returns the size of the grid.\r\n *\r\n * @return {number} The grid size.\r\n */\r\nMarkerClusterer.prototype.getGridSize = function () {\r\n return this.gridSize_;\r\n};\r\n\r\n\r\n/**\r\n * Sets the size of the grid.\r\n *\r\n * @param {number} size The grid size.\r\n */\r\nMarkerClusterer.prototype.setGridSize = function (size) {\r\n this.gridSize_ = size;\r\n};\r\n\r\n\r\n/**\r\n * Returns the min cluster size.\r\n *\r\n * @return {number} The grid size.\r\n */\r\nMarkerClusterer.prototype.getMinClusterSize = function () {\r\n return this.minClusterSize_;\r\n};\r\n\r\n/**\r\n * Sets the min cluster size.\r\n *\r\n * @param {number} size The grid size.\r\n */\r\nMarkerClusterer.prototype.setMinClusterSize = function (size) {\r\n this.minClusterSize_ = size;\r\n};\r\n\r\n\r\n/**\r\n * Extends a bounds object by the grid size.\r\n *\r\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\r\n * @return {google.maps.LatLngBounds} The extended bounds.\r\n */\r\nMarkerClusterer.prototype.getExtendedBounds = function (bounds) {\r\n var projection = this.getProjection();\r\n\r\n // Turn the bounds into latlng.\r\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\r\n bounds.getNorthEast().lng());\r\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\r\n bounds.getSouthWest().lng());\r\n\r\n // Convert the points to pixels and the extend out by the grid size.\r\n var trPix = projection.fromLatLngToDivPixel(tr);\r\n trPix.x += this.gridSize_;\r\n trPix.y -= this.gridSize_;\r\n\r\n var blPix = projection.fromLatLngToDivPixel(bl);\r\n blPix.x -= this.gridSize_;\r\n blPix.y += this.gridSize_;\r\n\r\n // Convert the pixel points back to LatLng\r\n var ne = projection.fromDivPixelToLatLng(trPix);\r\n var sw = projection.fromDivPixelToLatLng(blPix);\r\n\r\n // Extend the bounds to contain the new bounds.\r\n bounds.extend(ne);\r\n bounds.extend(sw);\r\n\r\n return bounds;\r\n};\r\n\r\n\r\n/**\r\n * Determins if a marker is contained in a bounds.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\r\n * @return {boolean} True if the marker is in the bounds.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {\r\n return bounds.contains(marker.getPosition());\r\n};\r\n\r\n\r\n/**\r\n * Clears all clusters and markers from the clusterer.\r\n */\r\nMarkerClusterer.prototype.clearMarkers = function () {\r\n this.resetViewport(true);\r\n\r\n // Set the markers a empty array.\r\n this.markers_ = [];\r\n};\r\n\r\n\r\n/**\r\n * Clears all existing clusters and recreates them.\r\n * @param {boolean} opt_hide To also hide the marker.\r\n */\r\nMarkerClusterer.prototype.resetViewport = function (opt_hide) {\r\n // Remove all the clusters\r\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\r\n cluster.remove();\r\n }\r\n\r\n // Reset the markers to not be added and to be invisible.\r\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n marker.isAdded = false;\r\n if (opt_hide) {\r\n marker.setMap(null);\r\n }\r\n }\r\n\r\n this.clusters_ = [];\r\n};\r\n\r\n/**\r\n *\r\n */\r\nMarkerClusterer.prototype.repaint = function () {\r\n var oldClusters = this.clusters_.slice();\r\n this.clusters_.length = 0;\r\n this.resetViewport();\r\n this.redraw();\r\n\r\n // Remove the old clusters.\r\n // Do it in a timeout so the other clusters have been drawn first.\r\n window.setTimeout(function () {\r\n for (var i = 0, cluster; cluster = oldClusters[i]; i++) {\r\n cluster.remove();\r\n }\r\n }, 0);\r\n};\r\n\r\n\r\n/**\r\n * Redraws the clusters.\r\n */\r\nMarkerClusterer.prototype.redraw = function () {\r\n this.createClusters_();\r\n};\r\n\r\n\r\n/**\r\n * Calculates the distance between two latlng locations in km.\r\n * @see http://www.movable-type.co.uk/scripts/latlong.html\r\n *\r\n * @param {google.maps.LatLng} p1 The first lat lng point.\r\n * @param {google.maps.LatLng} p2 The second lat lng point.\r\n * @return {number} The distance between the two points in km.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {\r\n if (!p1 || !p2) {\r\n return 0;\r\n }\r\n\r\n var R = 6371; // Radius of the Earth in km\r\n var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\r\n var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\r\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\r\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\r\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n var d = R * c;\r\n return d;\r\n};\r\n\r\n\r\n/**\r\n * Add a marker to a cluster, or creates a new cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @private\r\n */\r\nMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\r\n var distance = 40000; // Some large number\r\n var clusterToAddTo = null;\r\n var pos = marker.getPosition();\r\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\r\n var center = cluster.getCenter();\r\n if (center) {\r\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\r\n if (d < distance) {\r\n distance = d;\r\n clusterToAddTo = cluster;\r\n }\r\n }\r\n }\r\n\r\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\r\n clusterToAddTo.addMarker(marker);\r\n } else {\r\n var cluster = new Cluster(this);\r\n cluster.addMarker(marker);\r\n this.clusters_.push(cluster);\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Creates the clusters.\r\n *\r\n * @private\r\n */\r\nMarkerClusterer.prototype.createClusters_ = function () {\r\n if (!this.ready_) {\r\n return;\r\n }\r\n\r\n // Get our current map view bounds.\r\n // Create a new bounds object so we don't affect the map.\r\n var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),\r\n this.map_.getBounds().getNorthEast());\r\n var bounds = this.getExtendedBounds(mapBounds);\r\n\r\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\r\n this.addToClosestCluster_(marker);\r\n }\r\n }\r\n};\r\n\r\n\r\n/**\r\n * A cluster that contains markers.\r\n *\r\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\r\n * cluster is associated with.\r\n * @constructor\r\n * @ignore\r\n */\r\nfunction Cluster(markerClusterer) {\r\n this.markerClusterer_ = markerClusterer;\r\n this.map_ = markerClusterer.getMap();\r\n this.gridSize_ = markerClusterer.getGridSize();\r\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\r\n this.averageCenter_ = markerClusterer.isAverageCenter();\r\n this.center_ = null;\r\n this.markers_ = [];\r\n this.bounds_ = null;\r\n this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(),\r\n markerClusterer.getGridSize());\r\n}\r\n\r\n/**\r\n * Determins if a marker is already added to the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @return {boolean} True if the marker is already added.\r\n */\r\nCluster.prototype.isMarkerAlreadyAdded = function (marker) {\r\n if (this.markers_.indexOf) {\r\n return this.markers_.indexOf(marker) != -1;\r\n } else {\r\n for (var i = 0, m; m = this.markers_[i]; i++) {\r\n if (m == marker) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n\r\n/**\r\n * Add a marker the cluster.\r\n *\r\n * @param {google.maps.Marker} marker The marker to add.\r\n * @return {boolean} True if the marker was added.\r\n */\r\nCluster.prototype.addMarker = function (marker) {\r\n if (this.isMarkerAlreadyAdded(marker)) {\r\n return false;\r\n }\r\n\r\n if (!this.center_) {\r\n this.center_ = marker.getPosition();\r\n this.calculateBounds_();\r\n } else {\r\n if (this.averageCenter_) {\r\n var l = this.markers_.length + 1;\r\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\r\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\r\n this.center_ = new google.maps.LatLng(lat, lng);\r\n this.calculateBounds_();\r\n }\r\n }\r\n\r\n marker.isAdded = true;\r\n this.markers_.push(marker);\r\n\r\n var len = this.markers_.length;\r\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\r\n // Min cluster size not reached so show the marker.\r\n marker.setMap(this.map_);\r\n }\r\n\r\n if (len == this.minClusterSize_) {\r\n // Hide the markers that were showing.\r\n for (var i = 0; i < len; i++) {\r\n this.markers_[i].setMap(null);\r\n }\r\n }\r\n\r\n if (len >= this.minClusterSize_) {\r\n marker.setMap(null);\r\n }\r\n\r\n this.updateIcon();\r\n return true;\r\n};\r\n\r\n\r\n/**\r\n * Returns the marker clusterer that the cluster is associated with.\r\n *\r\n * @return {MarkerClusterer} The associated marker clusterer.\r\n */\r\nCluster.prototype.getMarkerClusterer = function () {\r\n return this.markerClusterer_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the bounds of the cluster.\r\n *\r\n * @return {google.maps.LatLngBounds} the cluster bounds.\r\n */\r\nCluster.prototype.getBounds = function () {\r\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n var markers = this.getMarkers();\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n bounds.extend(marker.getPosition());\r\n }\r\n return bounds;\r\n};\r\n\r\n\r\n/**\r\n * Removes the cluster\r\n */\r\nCluster.prototype.remove = function () {\r\n this.clusterIcon_.remove();\r\n this.markers_.length = 0;\r\n delete this.markers_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the number of markers in the cluster.\r\n *\r\n * @return {number} The number of markers in the cluster.\r\n */\r\nCluster.prototype.getSize = function () {\r\n return this.markers_.length;\r\n};\r\n\r\n\r\n/**\r\n * Returns a list of the markers in the cluster.\r\n *\r\n * @return {Array.} The markers in the cluster.\r\n */\r\nCluster.prototype.getMarkers = function () {\r\n return this.markers_;\r\n};\r\n\r\n\r\n/**\r\n * Returns the center of the cluster.\r\n *\r\n * @return {google.maps.LatLng} The cluster center.\r\n */\r\nCluster.prototype.getCenter = function () {\r\n return this.center_;\r\n};\r\n\r\n\r\n/**\r\n * Calculated the extended bounds of the cluster with the grid.\r\n *\r\n * @private\r\n */\r\nCluster.prototype.calculateBounds_ = function () {\r\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\r\n};\r\n\r\n\r\n/**\r\n * Determines if a marker lies in the clusters bounds.\r\n *\r\n * @param {google.maps.Marker} marker The marker to check.\r\n * @return {boolean} True if the marker lies in the bounds.\r\n */\r\nCluster.prototype.isMarkerInClusterBounds = function (marker) {\r\n return this.bounds_.contains(marker.getPosition());\r\n};\r\n\r\n\r\n/**\r\n * Returns the map that the cluster is associated with.\r\n *\r\n * @return {google.maps.Map} The map.\r\n */\r\nCluster.prototype.getMap = function () {\r\n return this.map_;\r\n};\r\n\r\n\r\n/**\r\n * Updates the cluster icon\r\n */\r\nCluster.prototype.updateIcon = function () {\r\n var zoom = this.map_.getZoom();\r\n var mz = this.markerClusterer_.getMaxZoom();\r\n\r\n if (mz && zoom > mz) {\r\n // The zoom is greater than our max zoom so show all the markers in cluster.\r\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n marker.setMap(this.map_);\r\n }\r\n return;\r\n }\r\n\r\n if (this.markers_.length < this.minClusterSize_) {\r\n // Min cluster size not yet reached.\r\n this.clusterIcon_.hide();\r\n return;\r\n }\r\n\r\n var numStyles = this.markerClusterer_.getStyles().length;\r\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\r\n this.clusterIcon_.setCenter(this.center_);\r\n this.clusterIcon_.setSums(sums);\r\n this.clusterIcon_.show();\r\n};\r\n\r\n\r\n/**\r\n * A cluster icon\r\n *\r\n * @param {Cluster} cluster The cluster to be associated with.\r\n * @param {Object} styles An object that has style properties:\r\n * 'url': (string) The image url.\r\n * 'height': (number) The image height.\r\n * 'width': (number) The image width.\r\n * 'anchor': (Array) The anchor position of the label text.\r\n * 'textColor': (string) The text color.\r\n * 'textSize': (number) The text size.\r\n * 'backgroundPosition: (string) The background postition x, y.\r\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\r\n * @constructor\r\n * @extends google.maps.OverlayView\r\n * @ignore\r\n */\r\nfunction ClusterIcon(cluster, styles, opt_padding) {\r\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\r\n\r\n this.styles_ = styles;\r\n this.padding_ = opt_padding || 0;\r\n this.cluster_ = cluster;\r\n this.center_ = null;\r\n this.map_ = cluster.getMap();\r\n this.div_ = null;\r\n this.sums_ = null;\r\n this.visible_ = false;\r\n\r\n this.setMap(this.map_);\r\n}\r\n\r\n\r\n/**\r\n * Triggers the clusterclick event and zoom's if the option is set.\r\n */\r\nClusterIcon.prototype.triggerClusterClick = function () {\r\n var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n // Trigger the clusterclick event.\r\n google.maps.event.trigger(markerClusterer.map_, 'clusterclick', this.cluster_);\r\n\r\n if (markerClusterer.isZoomOnClick()) {\r\n // Zoom into the cluster.\r\n this.map_.fitBounds(this.cluster_.getBounds());\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Adding the cluster icon to the dom.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onAdd = function () {\r\n this.div_ = document.createElement('DIV');\r\n if (this.visible_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.cssText = this.createCss(pos);\r\n this.div_.innerHTML = this.sums_.text;\r\n }\r\n\r\n var panes = this.getPanes();\r\n panes.overlayMouseTarget.appendChild(this.div_);\r\n\r\n var that = this;\r\n google.maps.event.addDomListener(this.div_, 'click', function () {\r\n that.triggerClusterClick();\r\n });\r\n};\r\n\r\n\r\n/**\r\n * Returns the position to place the div dending on the latlng.\r\n *\r\n * @param {google.maps.LatLng} latlng The position in latlng.\r\n * @return {google.maps.Point} The position in pixels.\r\n * @private\r\n */\r\nClusterIcon.prototype.getPosFromLatLng_ = function (latlng) {\r\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\r\n pos.x -= parseInt(this.width_ / 2, 10);\r\n pos.y -= parseInt(this.height_ / 2, 10);\r\n return pos;\r\n};\r\n\r\n\r\n/**\r\n * Draw the icon.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.draw = function () {\r\n if (this.visible_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.top = pos.y + 'px';\r\n this.div_.style.left = pos.x + 'px';\r\n this.div_.style.zIndex = google.maps.Marker.MAX_ZINDEX + 1;\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Hide the icon.\r\n */\r\nClusterIcon.prototype.hide = function () {\r\n if (this.div_) {\r\n this.div_.style.display = 'none';\r\n }\r\n this.visible_ = false;\r\n};\r\n\r\n\r\n/**\r\n * Position and show the icon.\r\n */\r\nClusterIcon.prototype.show = function () {\r\n if (this.div_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.cssText = this.createCss(pos);\r\n this.div_.style.display = '';\r\n }\r\n this.visible_ = true;\r\n};\r\n\r\n\r\n/**\r\n * Remove the icon from the map\r\n */\r\nClusterIcon.prototype.remove = function () {\r\n this.setMap(null);\r\n};\r\n\r\n\r\n/**\r\n * Implementation of the onRemove interface.\r\n * @ignore\r\n */\r\nClusterIcon.prototype.onRemove = function () {\r\n if (this.div_ && this.div_.parentNode) {\r\n this.hide();\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n }\r\n};\r\n\r\n\r\n/**\r\n * Set the sums of the icon.\r\n *\r\n * @param {Object} sums The sums containing:\r\n * 'text': (string) The text to display in the icon.\r\n * 'index': (number) The style index of the icon.\r\n */\r\nClusterIcon.prototype.setSums = function (sums) {\r\n this.sums_ = sums;\r\n this.text_ = sums.text;\r\n this.index_ = sums.index;\r\n if (this.div_) {\r\n this.div_.innerHTML = sums.text;\r\n }\r\n\r\n this.useStyle();\r\n};\r\n\r\n\r\n/**\r\n * Sets the icon to the the styles.\r\n */\r\nClusterIcon.prototype.useStyle = function () {\r\n var index = Math.max(0, this.sums_.index - 1);\r\n index = Math.min(this.styles_.length - 1, index);\r\n var style = this.styles_[index];\r\n this.url_ = style['url'];\r\n this.height_ = style['height'];\r\n this.width_ = style['width'];\r\n this.textColor_ = style['textColor'];\r\n this.anchor_ = style['anchor'];\r\n this.textSize_ = style['textSize'];\r\n this.backgroundPosition_ = style['backgroundPosition'];\r\n};\r\n\r\n\r\n/**\r\n * Sets the center of the icon.\r\n *\r\n * @param {google.maps.LatLng} center The latlng to set as the center.\r\n */\r\nClusterIcon.prototype.setCenter = function (center) {\r\n this.center_ = center;\r\n};\r\n\r\n\r\n/**\r\n * Create the css text based on the position of the icon.\r\n *\r\n * @param {google.maps.Point} pos The position.\r\n * @return {string} The css style text.\r\n */\r\nClusterIcon.prototype.createCss = function (pos) {\r\n var style = [];\r\n style.push('background-image:url(' + this.url_ + ');');\r\n var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';\r\n style.push('background-position:' + backgroundPosition + ';');\r\n\r\n if (typeof this.anchor_ === 'object') {\r\n if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&\r\n this.anchor_[0] < this.height_) {\r\n style.push('height:' + (this.height_ - this.anchor_[0]) +\r\n 'px; padding-top:' + this.anchor_[0] + 'px;');\r\n } else {\r\n style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +\r\n 'px;');\r\n }\r\n if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&\r\n this.anchor_[1] < this.width_) {\r\n style.push('width:' + (this.width_ - this.anchor_[1]) +\r\n 'px; padding-left:' + this.anchor_[1] + 'px;');\r\n } else {\r\n style.push('width:' + this.width_ + 'px; text-align:center;');\r\n }\r\n } else {\r\n style.push('height:' + this.height_ + 'px; line-height:' +\r\n this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');\r\n }\r\n\r\n var txtColor = this.textColor_ ? this.textColor_ : 'black';\r\n var txtSize = this.textSize_ ? this.textSize_ : 11;\r\n\r\n style.push('cursor:pointer; top:' + pos.y + 'px; left:' +\r\n pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +\r\n txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\r\n return style.join('');\r\n};\r\n\r\n\r\n// Export Symbols for Closure\r\n// If you are not going to compile with closure then you can remove the\r\n// code below.\r\nwindow['MarkerClusterer'] = MarkerClusterer;\r\nMarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker;\r\nMarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers;\r\nMarkerClusterer.prototype['clearMarkers'] =\r\n MarkerClusterer.prototype.clearMarkers;\r\nMarkerClusterer.prototype['fitMapToMarkers'] =\r\n MarkerClusterer.prototype.fitMapToMarkers;\r\nMarkerClusterer.prototype['getCalculator'] =\r\n MarkerClusterer.prototype.getCalculator;\r\nMarkerClusterer.prototype['getGridSize'] =\r\n MarkerClusterer.prototype.getGridSize;\r\nMarkerClusterer.prototype['getExtendedBounds'] =\r\n MarkerClusterer.prototype.getExtendedBounds;\r\nMarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap;\r\nMarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers;\r\nMarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom;\r\nMarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles;\r\nMarkerClusterer.prototype['getTotalClusters'] =\r\n MarkerClusterer.prototype.getTotalClusters;\r\nMarkerClusterer.prototype['getTotalMarkers'] =\r\n MarkerClusterer.prototype.getTotalMarkers;\r\nMarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw;\r\nMarkerClusterer.prototype['removeMarker'] =\r\n MarkerClusterer.prototype.removeMarker;\r\nMarkerClusterer.prototype['removeMarkers'] =\r\n MarkerClusterer.prototype.removeMarkers;\r\nMarkerClusterer.prototype['resetViewport'] =\r\n MarkerClusterer.prototype.resetViewport;\r\nMarkerClusterer.prototype['repaint'] =\r\n MarkerClusterer.prototype.repaint;\r\nMarkerClusterer.prototype['setCalculator'] =\r\n MarkerClusterer.prototype.setCalculator;\r\nMarkerClusterer.prototype['setGridSize'] =\r\n MarkerClusterer.prototype.setGridSize;\r\nMarkerClusterer.prototype['setMaxZoom'] =\r\n MarkerClusterer.prototype.setMaxZoom;\r\nMarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd;\r\nMarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw;\r\n\r\nCluster.prototype['getCenter'] = Cluster.prototype.getCenter;\r\nCluster.prototype['getSize'] = Cluster.prototype.getSize;\r\nCluster.prototype['getMarkers'] = Cluster.prototype.getMarkers;\r\n\r\nClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd;\r\nClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw;\r\nClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove;\r\n\r\nObject.keys = Object.keys || function (o) {\r\n var result = [];\r\n for (var name in o) {\r\n if (o.hasOwnProperty(name)) {\r\n result.push(name);\r\n }\r\n }\r\n return result;\r\n};\r\n/* jshint ignore:end */","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\nsvaneTvis.megamenu = svaneTvis.megamenu || new function () {\r\n\r\n this.init = function () {\r\n // Expand function\r\n const expandButtons = document.querySelectorAll('.js-expand-button');\r\n for (let i = 0; i < expandButtons.length; i++) {\r\n const expandButton = expandButtons[i];\r\n expandButton.addEventListener('click', function(){\r\n \r\n if (expandButton.parentElement.classList.contains('site-navigation-list__item--active')) {\r\n expandButton.parentElement.classList.remove('site-navigation-list__item--active');\r\n } else {\r\n for (let i = 0; i < expandButtons.length; i++) {\r\n const element = expandButtons[i];\r\n element.parentElement.classList.remove('site-navigation-list__item--active');\r\n }\r\n expandButton.parentElement.classList.add('site-navigation-list__item--active');\r\n }\r\n });\r\n }\r\n //Hover intent - Megamenu\r\n if (window.innerWidth > 1050) {\r\n var megaMenuItems = document.querySelectorAll('.site-navigation-list__item');\r\n for (var i = 0; i < megaMenuItems.length; i++) {\r\n var megaMenuItem = megaMenuItems[i];\r\n hoverintent(megaMenuItem, function () {\r\n this.classList.add('site-navigation-list__item--show-mega');\r\n }, function () {\r\n this.classList.remove('site-navigation-list__item--show-mega');\r\n }).options({\r\n timeout: 400,\r\n interval: 55\r\n });\r\n \r\n }\r\n var imageItems = document.querySelectorAll('.site-navigation-mega__sub-link');\r\n for (var j = 0; j < imageItems.length; j++) {\r\n var imageItem = imageItems[j];\r\n imageItem.addEventListener('mouseover', function() {\r\n var currentEl = this;\r\n if (currentEl.hasAttribute('data-image')) {\r\n var parentEl = currentEl.closest('.site-navigation-mega');\r\n var imageHolder = parentEl.querySelector('.js-site-navigation-mega__image-holder');\r\n var currentImage = currentEl.getAttribute('data-image');\r\n imageHolder.setAttribute('src', currentImage);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n}();\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\nsvaneTvis.navigation = svaneTvis.navigation || new function () {\r\n this.init = function () {\r\n var navButton = document.querySelector('.js-mobile-navigation-button');\r\n var closeButton = document.querySelector('.js-mobile-close-button');\r\n var body = document.querySelector('body');\r\n\r\n if (!navButton && !closeButton) {\r\n return;\r\n }\r\n\r\n // Open mobile navigation\r\n navButton.addEventListener('click', function () {\r\n body.classList.toggle('mobile-navigation-open');\r\n }, true);\r\n\r\n // Close\r\n closeButton.addEventListener('click', function () {\r\n if (body.classList.contains('mobile-navigation-open')) {\r\n body.classList.remove('mobile-navigation-open');\r\n }\r\n }, true);\r\n\r\n // SmoothScrolling for shopnavigation\r\n var shopNavigation = document.querySelector('.js-shop-page-navigation');\r\n if (shopNavigation) {\r\n var scrollTriggers = document.querySelectorAll('.js-shop-page-navigation a[href*=\"#\"]');\r\n if (scrollTriggers != null) {\r\n for (var i = 0; i < scrollTriggers.length; i++) {\r\n let scrollTrigger = scrollTriggers[i];\r\n let target = scrollTrigger.hash;\r\n target = document.querySelector(target);\r\n scrollTrigger.addEventListener('click', function (e) {\r\n e.preventDefault();\r\n window.scrollTo({\r\n 'behavior': 'smooth',\r\n 'left': 0,\r\n 'top': target.offsetTop - 40\r\n });\r\n }, true);\r\n }\r\n }\r\n }\r\n };\r\n}();\r\n","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\nvar novicell = novicell || {};\r\n\r\nsvaneTvis.overlay = svaneTvis.overlay || new function () {\r\n\r\n this.init = function () {\r\n\r\n // Overlay\r\n const overlayTriggers = document.querySelectorAll('.js-overlay-trigger');\r\n\r\n for (let u = 0; u < overlayTriggers.length; u++) {\r\n overlayTriggers[u].addEventListener('click', function (e) {\r\n e.preventDefault();\r\n let currentTrigger = e.target.parentNode;\r\n if (currentTrigger.getAttribute('data-video-id') != null) {\r\n novicell.overlay.create({\r\n 'videoId': currentTrigger.getAttribute('data-video-id'),\r\n 'type': currentTrigger.getAttribute('data-type'),\r\n 'class': 'js-overlay-trigger',\r\n 'autoplay': 1\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n // Overlay for Markedplace \r\n const overlayMarkedPlaces = document.querySelectorAll('.js-marked-place-overlay');\r\n\r\n for (let i = 0; i < overlayMarkedPlaces.length; i++) {\r\n const overlayMarkedPlace = overlayMarkedPlaces[i];\r\n\r\n const body = document.querySelector('body');\r\n\r\n // Get the button that opens the overlay \r\n const triggerMarkedPlace = overlayMarkedPlace.parentNode.querySelector(\".js-marked-place-overlay-trigger\");\r\n\r\n // Get the element that closes the overlay \r\n const closeButton = overlayMarkedPlace.getElementsByClassName(\"close\")[0];\r\n\r\n // When the user clicks on the button, open the overlay \r\n triggerMarkedPlace.addEventListener('click', function (e) {\r\n const carousel = overlayMarkedPlace.querySelector(\".main-carousel\");\r\n e.preventDefault();\r\n overlayMarkedPlace.classList.add('open-overlay');\r\n overlayMarkedPlace.style.display = 'block';\r\n body.classList.add('no-scroll');\r\n\r\n let flkty = new Flickity(carousel, {\r\n contain: true,\r\n adaptiveHeight: true,\r\n pageDots: false,\r\n lazyLoad: true\r\n });\r\n\r\n // When the user clicks on (x), close the overlay \r\n closeButton.addEventListener('click', function () {\r\n flkty.destroy();\r\n body.classList.remove('no-scroll');\r\n overlayMarkedPlace.classList.remove('open-overlay');\r\n });\r\n\r\n // When the user clicks anywhere outside of the overlay, close it \r\n overlayMarkedPlace.addEventListener('click', function (event) {\r\n if (event.target == this) {\r\n flkty.destroy();\r\n body.classList.remove('no-scroll');\r\n this.classList.remove('open-overlay');\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Overlay for forms\r\n const overlay = document.querySelector('.select-store-overlay');\r\n const body = document.querySelector('body');\r\n // Get the button that opens the overlay\r\n const trigger = document.querySelector(\".js-select-store-trigger\");\r\n\r\n if (overlay && trigger) {\r\n\r\n // Get the element that closes the overlay\r\n const span = document.getElementsByClassName(\"close\")[0];\r\n\r\n // When the user clicks on the button, open the overlay \r\n trigger.onclick = function (e) {\r\n e.preventDefault();\r\n overlay.classList.add('open-overlay');\r\n body.classList.add('no-scroll');\r\n };\r\n\r\n // When the user clicks on (x), close the overlay\r\n span.onclick = function () {\r\n body.classList.remove('no-scroll');\r\n overlay.classList.remove('open-overlay');\r\n };\r\n\r\n const checkboxes = document.querySelectorAll('.select-store-input');\r\n for (let i = 0; i < checkboxes.length; i++) {\r\n const checkbox = checkboxes[i];\r\n\r\n checkbox.onclick = function () {\r\n body.classList.remove('no-scroll');\r\n overlay.classList.remove('open-overlay');\r\n };\r\n }\r\n\r\n // When the user clicks anywhere outside of the overlay, close it\r\n window.onclick = function (event) {\r\n if (event.target == overlay) {\r\n body.classList.remove('no-scroll');\r\n overlay.classList.remove('open-overlay');\r\n }\r\n };\r\n }\r\n}();\r\n","'use strict';\r\nvar svaneTvis = svaneTvis || {};\r\nsvaneTvis.shopselector = svaneTvis.shopselector || new function () {\r\n this.init = function () {\r\n // const shops = document.querySelectorAll('.js-store-list__link');\r\n // for (let i = 0; i < shops.length; i++) {\r\n // shops[i].addEventListener('click', function (e) {\r\n // var target = e.target || e.srcElement,\r\n // text = target.textContent || target.innerText;\r\n // setCookie(\"SelectedShop\", text.trim(), 7);\r\n // });\r\n // }\r\n\r\n // Shop selector overlay\r\n const shopsOverlay = document.querySelectorAll('.js-select-store-input');\r\n for (let u = 0; u < shopsOverlay.length; u++) {\r\n shopsOverlay[u].addEventListener('click', function (e) {\r\n var id = e.target.getAttribute('data-shop-id');\r\n setCookie(\"SelectedShop\", id, 7);\r\n });\r\n }\r\n };\r\n}();\r\n\r\nfunction setCookie(cname, cvalue, exdays) {\r\n var d = new Date();\r\n d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\r\n var expires = \"expires=\" + d.toUTCString();\r\n document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\r\n}","'use strict';\r\n\r\nvar svaneTvis = svaneTvis || {};\r\n\r\nsvaneTvis.video = svaneTvis.video || new function () {\r\n\r\n this.init = function () {\r\n const videos = document.querySelectorAll('.js-video');\r\n const playVideo = function () {\r\n for (let i = 0; i < videos.length; i++) {\r\n const video = videos[i];\r\n const iframe = video.querySelector('iframe');\r\n const src = iframe.getAttribute('data-src');\r\n const trigger = video.querySelector('.js-video-trigger');\r\n\r\n if (window.innerWidth > 767) {\r\n if (isInViewport(video)) {\r\n if (iframe.dataset.playing != '1') {\r\n iframe.setAttribute('src', src);\r\n iframe.setAttribute('data-playing', '1');\r\n }\r\n }\r\n } else {\r\n trigger.addEventListener('click', function () {\r\n iframe.setAttribute('src', src);\r\n trigger.style.display = 'none';\r\n });\r\n }\r\n }\r\n };\r\n window.addEventListener('load', function (event) {\r\n if (videos) {\r\n playVideo();\r\n }\r\n });\r\n\r\n window.addEventListener('scroll', function (event) {\r\n if (videos) {\r\n playVideo();\r\n }\r\n }, false);\r\n\r\n // Is in viewport helper\r\n const isInViewport = function (elem) {\r\n const bounding = elem.getBoundingClientRect();\r\n return (\r\n bounding.top >= 0 &&\r\n bounding.left >= 0 &&\r\n bounding.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n bounding.right <= (window.innerWidth || document.documentElement.clientWidth)\r\n );\r\n };\r\n };\r\n}();\r\n","/* jshint globalstrict: false */\r\n\r\n\r\n/*!\r\n* validate v1.1.3: A lightweight form validation script that augments native HTML5 form validation elements and attributes.\r\n* (c) 2018 Chris Ferdinandi\r\n* MIT License\r\n* http://github.com/cferdinandi/validate\r\n*/\r\n\r\n(function (root, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define([], factory(root));\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(root);\r\n } else {\r\n root.validate = factory(root);\r\n }\r\n})(typeof global !== 'undefined' ? global : window || global, (function (root) {\r\n\r\n 'use strict';\r\n\r\n //\r\n // Variables\r\n //\r\n\r\n var validate = {}; // Object for public APIs\r\n var supports = 'querySelector' in document && 'addEventListener' in root; // Feature test\r\n var settings;\r\n\r\n // Default settings\r\n var defaults = {\r\n\r\n // Classes and Selectors\r\n selector: '[data-validate]',\r\n fieldClass: 'error',\r\n errorClass: 'error-message',\r\n\r\n // Messages\r\n messageValueMissing: 'Please fill out this field.',\r\n messageValueMissingSelect: 'Please select a value.',\r\n messageValueMissingSelectMulti: 'Please select at least one value.',\r\n messageTypeMismatchEmail: 'Please enter an email address.',\r\n messageTypeMismatchURL: 'Please enter a URL.',\r\n messageTooShort: 'Please lengthen this text to {minLength} characters or more. You are currently using {length} characters.',\r\n messageTooLong: 'Please shorten this text to no more than {maxLength} characters. You are currently using {length} characters.',\r\n messagePatternMismatch: 'Please match the requested format.',\r\n messageBadInput: 'Please enter a number.',\r\n messageStepMismatch: 'Please select a valid value.',\r\n messageRangeOverflow: 'Please select a value that is no more than {max}.',\r\n messageRangeUnderflow: 'Please select a value that is no less than {min}.',\r\n messageGeneric: 'The value you entered for this field is invalid.',\r\n\r\n // Form Submission\r\n disableSubmit: false,\r\n onSubmit: function () { },\r\n\r\n // Callbacks\r\n beforeShowError: function () { },\r\n afterShowError: function () { },\r\n beforeRemoveError: function () { },\r\n afterRemoveError: function () { }\r\n\r\n };\r\n\r\n\r\n //\r\n // Methods\r\n //\r\n\r\n // Element.matches() polyfill\r\n if (!Element.prototype.matches) {\r\n Element.prototype.matches =\r\n Element.prototype.matchesSelector ||\r\n Element.prototype.mozMatchesSelector ||\r\n Element.prototype.msMatchesSelector ||\r\n Element.prototype.oMatchesSelector ||\r\n Element.prototype.webkitMatchesSelector ||\r\n function (s) {\r\n var matches = (this.document || this.ownerDocument).querySelectorAll(s),\r\n i = matches.length;\r\n while (--i >= 0 && matches.item(i) !== this) { }\r\n return i > -1;\r\n };\r\n }\r\n\r\n /**\r\n * Merge two or more objects. Returns a new object.\r\n * @private\r\n * @param {Boolean} deep If true, do a deep (or recursive) merge [optional]\r\n * @param {Object} objects The objects to merge together\r\n * @returns {Object} Merged values of defaults and options\r\n */\r\n var extend = function () {\r\n\r\n // Variables\r\n var extended = {};\r\n var deep = false;\r\n var i = 0;\r\n var length = arguments.length;\r\n\r\n // Check if a deep merge\r\n if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {\r\n deep = arguments[0];\r\n i++;\r\n }\r\n\r\n // Merge the object into the extended object\r\n var merge = function (obj) {\r\n for (var prop in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, prop)) {\r\n // If deep merge and property is an object, merge properties\r\n if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {\r\n extended[prop] = extend(true, extended[prop], obj[prop]);\r\n } else {\r\n extended[prop] = obj[prop];\r\n }\r\n }\r\n }\r\n };\r\n\r\n // Loop through each object and conduct a merge\r\n for (; i < length; i++) {\r\n var obj = arguments[i];\r\n merge(obj);\r\n }\r\n\r\n return extended;\r\n\r\n };\r\n\r\n /**\r\n * Get the closest matching element up the DOM tree.\r\n * @private\r\n * @param {Element} elem Starting element\r\n * @param {String} selector Selector to match against\r\n * @return {Boolean|Element} Returns null if not match found\r\n */\r\n var getClosest = function (elem, selector) {\r\n for (; elem && elem !== document; elem = elem.parentNode) {\r\n if (elem.matches(selector)) return elem;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Validate a form field\r\n * @public\r\n * @param {Node} field The field to validate\r\n * @param {Object} options User options\r\n * @return {String} The error message\r\n */\r\n validate.hasError = function (field, options) {\r\n\r\n // Merge user options with existing settings or defaults\r\n var localSettings = extend(settings || defaults, options || {});\r\n\r\n // Don't validate submits, buttons, file and reset inputs, and disabled fields\r\n if (field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') return;\r\n\r\n // Get validity\r\n var validity = field.validity;\r\n\r\n // If valid, return null\r\n if (validity.valid) return;\r\n\r\n // If field is required and empty\r\n if (validity.valueMissing) {\r\n\r\n if (field.type === 'select-multiple') return localSettings.messageValueMissingSelectMulti;\r\n\r\n if (field.type === 'select-one') return localSettings.messageValueMissingSelect;\r\n\r\n return localSettings.messageValueMissing;\r\n }\r\n\r\n // If not the right type\r\n if (validity.typeMismatch) {\r\n\r\n // Email\r\n if (field.type === 'email') return localSettings.messageTypeMismatchEmail;\r\n\r\n // URL\r\n if (field.type === 'url') return localSettings.messageTypeMismatchURL;\r\n\r\n }\r\n\r\n // If too short\r\n if (validity.tooShort) return localSettings.messageTooShort.replace('{minLength}', field.getAttribute('minLength')).replace('{length}', field.value.length);\r\n\r\n // If too long\r\n if (validity.tooLong) return localSettings.messageTooLong.replace('{minLength}', field.getAttribute('maxLength')).replace('{length}', field.value.length);\r\n\r\n // If number input isn't a number\r\n if (validity.badInput) return localSettings.messageBadInput;\r\n\r\n // If a number value doesn't match the step interval\r\n if (validity.stepMismatch) return localSettings.messageStepMismatch;\r\n\r\n // If a number field is over the max\r\n if (validity.rangeOverflow) return localSettings.messageRangeOverflow.replace('{max}', field.getAttribute('max'));\r\n\r\n // If a number field is below the min\r\n if (validity.rangeUnderflow) return localSettings.messageRangeUnderflow.replace('{min}', field.getAttribute('min'));\r\n\r\n // If pattern doesn't match\r\n if (validity.patternMismatch) {\r\n\r\n // If pattern info is included, return custom error\r\n if (field.hasAttribute('title')) return field.getAttribute('title');\r\n\r\n // Otherwise, generic error\r\n return localSettings.messagePatternMismatch;\r\n\r\n }\r\n\r\n // If all else fails, return a generic catchall error\r\n return localSettings.messageGeneric;\r\n\r\n };\r\n\r\n /**\r\n * Show an error message on a field\r\n * @public\r\n * @param {Node} field The field to show an error message for\r\n * @param {String} error The error message to show\r\n * @param {Object} options User options\r\n */\r\n validate.showError = function (field, error, options) {\r\n\r\n // Merge user options with existing settings or defaults\r\n var localSettings = extend(settings || defaults, options || {});\r\n\r\n // Before show error callback\r\n localSettings.beforeShowError(field, error);\r\n\r\n // Add error class to field\r\n field.classList.add(localSettings.fieldClass);\r\n\r\n // If the field is a radio button and part of a group, error all and get the last item in the group\r\n if (field.type === 'radio' && field.name) {\r\n var group = document.getElementsByName(field.name);\r\n if (group.length > 0) {\r\n for (var i = 0; i < group.length; i++) {\r\n if (group[i].form !== field.form) continue; // Only check fields in current form\r\n group[i].classList.add(localSettings.fieldClass);\r\n }\r\n field = group[group.length - 1];\r\n }\r\n }\r\n\r\n // Get field id or name\r\n var id = field.id || field.name;\r\n if (!id) return;\r\n\r\n // Check if error message field already exists\r\n // If not, create one\r\n var message = field.form.querySelector('.' + localSettings.errorClass + '#error-for-' + id);\r\n if (!message) {\r\n message = document.createElement('div');\r\n message.className = localSettings.errorClass;\r\n message.id = 'error-for-' + id;\r\n\r\n // If the field is a radio button or checkbox, insert error after the label\r\n var label;\r\n if (field.type === 'radio' || field.type === 'checkbox') {\r\n label = field.form.querySelector('label[for=\"' + id + '\"]') || getClosest(field, 'label');\r\n if (label) {\r\n label.parentNode.insertBefore(message, label.nextSibling);\r\n }\r\n }\r\n\r\n // Otherwise, insert it after the field\r\n if (!label) {\r\n field.parentNode.insertBefore(message, field.nextSibling);\r\n }\r\n }\r\n\r\n // Add ARIA role to the field\r\n field.setAttribute('aria-describedby', 'error-for-' + id);\r\n\r\n // Update error message\r\n message.innerHTML = error;\r\n\r\n // Remove any existing styles hiding the error message\r\n message.style.display = '';\r\n message.style.visibility = '';\r\n\r\n // After show error callback\r\n localSettings.afterShowError(field, error);\r\n\r\n };\r\n\r\n /**\r\n * Remove an error message from a field\r\n * @public\r\n * @param {Node} field The field to remove the error from\r\n * @param {Object} options User options\r\n */\r\n validate.removeError = function (field, options) {\r\n\r\n // Merge user options with existing settings or defaults\r\n var localSettings = extend(settings || defaults, options || {});\r\n\r\n // Before remove error callback\r\n localSettings.beforeRemoveError(field);\r\n\r\n // Remove ARIA role from the field\r\n field.removeAttribute('aria-describedby');\r\n\r\n // Remove error class to field\r\n field.classList.remove(localSettings.fieldClass);\r\n\r\n // If the field is a radio button and part of a group, remove error from all and get the last item in the group\r\n if (field.type === 'radio' && field.name) {\r\n var group = document.getElementsByName(field.name);\r\n if (group.length > 0) {\r\n for (var i = 0; i < group.length; i++) {\r\n if (group[i].form !== field.form) continue; // Only check fields in current form\r\n group[i].classList.remove(localSettings.fieldClass);\r\n }\r\n field = group[group.length - 1];\r\n }\r\n }\r\n\r\n // Get field id or name\r\n var id = field.id || field.name;\r\n if (!id) return;\r\n\r\n // Check if an error message is in the DOM\r\n var message = field.form.querySelector('.' + localSettings.errorClass + '#error-for-' + id + '');\r\n if (!message) return;\r\n\r\n // If so, hide it\r\n message.innerHTML = '';\r\n message.style.display = 'none';\r\n message.style.visibility = 'hidden';\r\n\r\n // After remove error callback\r\n localSettings.afterRemoveError(field);\r\n\r\n };\r\n\r\n /**\r\n * Add the `novalidate` attribute to all forms\r\n * @private\r\n * @param {Boolean} remove If true, remove the `novalidate` attribute\r\n */\r\n var addNoValidate = function (remove) {\r\n var forms = document.querySelectorAll(settings.selector);\r\n for (var i = 0; i < forms.length; i++) {\r\n if (remove) {\r\n forms[i].removeAttribute('novalidate');\r\n continue;\r\n }\r\n forms[i].setAttribute('novalidate', true);\r\n }\r\n };\r\n\r\n /**\r\n * Check field validity when it loses focus\r\n * @private\r\n * @param {Event} event The blur event\r\n */\r\n var blurHandler = function (event) {\r\n\r\n // Only run if the field is in a form to be validated\r\n if (!event.target.form || !event.target.form.matches(settings.selector)) return;\r\n\r\n // Validate the field\r\n var error = validate.hasError(event.target);\r\n\r\n // If there's an error, show it\r\n if (error) {\r\n validate.showError(event.target, error);\r\n return;\r\n }\r\n\r\n // Otherwise, remove any errors that exist\r\n validate.removeError(event.target);\r\n\r\n };\r\n\r\n /**\r\n * Check radio and checkbox field validity when clicked\r\n * @private\r\n * @param {Event} event The click event\r\n */\r\n var clickHandler = function (event) {\r\n\r\n // Only run if the field is in a form to be validated\r\n if (!event.target.form || !event.target.form.matches(settings.selector)) return;\r\n\r\n // Only run if the field is a checkbox or radio\r\n var type = event.target.getAttribute('type');\r\n if (!(type === 'checkbox' || type === 'radio')) return;\r\n\r\n // Validate the field\r\n var error = validate.hasError(event.target);\r\n\r\n // If there's an error, show it\r\n if (error) {\r\n validate.showError(event.target, error);\r\n return;\r\n }\r\n\r\n // Otherwise, remove any errors that exist\r\n validate.removeError(event.target);\r\n\r\n };\r\n\r\n /**\r\n * Check all fields on submit\r\n * @private\r\n * @param {Event} event The submit event\r\n */\r\n var submitHandler = function (event) {\r\n\r\n // Only run on forms flagged for validation\r\n if (!event.target.matches(settings.selector)) return;\r\n\r\n // Get all of the form elements\r\n var fields = event.target.elements;\r\n\r\n // Validate each field\r\n // Store the first field with an error to a variable so we can bring it into focus later\r\n var hasErrors;\r\n for (var i = 0; i < fields.length; i++) {\r\n var error = validate.hasError(fields[i]);\r\n if (error) {\r\n validate.showError(fields[i], error);\r\n if (!hasErrors) {\r\n hasErrors = fields[i];\r\n }\r\n }\r\n }\r\n\r\n // Prevent form from submitting if there are errors or submission is disabled\r\n if (hasErrors || settings.disableSubmit) {\r\n event.preventDefault();\r\n }\r\n\r\n // If there are errrors, focus on first element with error\r\n if (hasErrors) {\r\n hasErrors.focus();\r\n return;\r\n }\r\n\r\n // Otherwise, submit the form\r\n settings.onSubmit(event.target, fields);\r\n\r\n };\r\n\r\n /**\r\n * Destroy the current initialization.\r\n * @public\r\n */\r\n validate.destroy = function () {\r\n\r\n // If plugin isn't already initialized, stop\r\n if (!settings) return;\r\n\r\n // Remove event listeners\r\n document.removeEventListener('blur', blurHandler, true);\r\n document.removeEventListener('click', clickHandler, false);\r\n document.removeEventListener('submit', submitHandler, false);\r\n\r\n // Remove all errors\r\n var fields = document.querySelectorAll(settings.errorClass);\r\n for (var i = 0; i < fields.length; i++) {\r\n validate.removeError(fields[i]);\r\n }\r\n\r\n // Remove `novalidate` from forms\r\n addNoValidate(true);\r\n\r\n // Reset variables\r\n settings = null;\r\n\r\n };\r\n\r\n /**\r\n * Initialize Validate\r\n * @public\r\n * @param {Object} options User settings\r\n */\r\n validate.init = function (options) {\r\n\r\n // feature test\r\n if (!supports) return;\r\n\r\n // Destroy any existing initializations\r\n validate.destroy();\r\n\r\n // Merge user options with defaults\r\n settings = extend(defaults, options || {});\r\n\r\n // Add the `novalidate` attribute to all forms\r\n addNoValidate();\r\n\r\n // Event listeners\r\n document.addEventListener('blur', blurHandler, true);\r\n document.addEventListener('click', clickHandler, true);\r\n document.addEventListener('submit', submitHandler, false);\r\n\r\n };\r\n\r\n\r\n //\r\n // Public APIs\r\n //\r\n\r\n return validate;\r\n\r\n}));","(function(window, factory) {\n\tvar lazySizes = factory(window, window.document);\n\twindow.lazySizes = lazySizes;\n\tif(typeof module == 'object' && module.exports){\n\t\tmodule.exports = lazySizes;\n\t}\n}(window, function l(window, document) {\n\t'use strict';\n\t/*jshint eqnull:true */\n\tif(!document.getElementsByClassName){return;}\n\n\tvar lazysizes, lazySizesConfig;\n\n\tvar docElem = document.documentElement;\n\n\tvar Date = window.Date;\n\n\tvar supportPicture = window.HTMLPictureElement;\n\n\tvar _addEventListener = 'addEventListener';\n\n\tvar _getAttribute = 'getAttribute';\n\n\tvar addEventListener = window[_addEventListener];\n\n\tvar setTimeout = window.setTimeout;\n\n\tvar requestAnimationFrame = window.requestAnimationFrame || setTimeout;\n\n\tvar requestIdleCallback = window.requestIdleCallback;\n\n\tvar regPicture = /^picture$/i;\n\n\tvar loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded'];\n\n\tvar regClassCache = {};\n\n\tvar forEach = Array.prototype.forEach;\n\n\tvar hasClass = function(ele, cls) {\n\t\tif(!regClassCache[cls]){\n\t\t\tregClassCache[cls] = new RegExp('(\\\\s|^)'+cls+'(\\\\s|$)');\n\t\t}\n\t\treturn regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls];\n\t};\n\n\tvar addClass = function(ele, cls) {\n\t\tif (!hasClass(ele, cls)){\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls);\n\t\t}\n\t};\n\n\tvar removeClass = function(ele, cls) {\n\t\tvar reg;\n\t\tif ((reg = hasClass(ele,cls))) {\n\t\t\tele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' '));\n\t\t}\n\t};\n\n\tvar addRemoveLoadEvents = function(dom, fn, add){\n\t\tvar action = add ? _addEventListener : 'removeEventListener';\n\t\tif(add){\n\t\t\taddRemoveLoadEvents(dom, fn);\n\t\t}\n\t\tloadEvents.forEach(function(evt){\n\t\t\tdom[action](evt, fn);\n\t\t});\n\t};\n\n\tvar triggerEvent = function(elem, name, detail, noBubbles, noCancelable){\n\t\tvar event = document.createEvent('CustomEvent');\n\n\t\tif(!detail){\n\t\t\tdetail = {};\n\t\t}\n\n\t\tdetail.instance = lazysizes;\n\n\t\tevent.initCustomEvent(name, !noBubbles, !noCancelable, detail);\n\n\t\telem.dispatchEvent(event);\n\t\treturn event;\n\t};\n\n\tvar updatePolyfill = function (el, full){\n\t\tvar polyfill;\n\t\tif( !supportPicture && ( polyfill = (window.picturefill || lazySizesConfig.pf) ) ){\n\t\t\tpolyfill({reevaluate: true, elements: [el]});\n\t\t} else if(full && full.src){\n\t\t\tel.src = full.src;\n\t\t}\n\t};\n\n\tvar getCSS = function (elem, style){\n\t\treturn (getComputedStyle(elem, null) || {})[style];\n\t};\n\n\tvar getWidth = function(elem, parent, width){\n\t\twidth = width || elem.offsetWidth;\n\n\t\twhile(width < lazySizesConfig.minSize && parent && !elem._lazysizesWidth){\n\t\t\twidth = parent.offsetWidth;\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\treturn width;\n\t};\n\n\tvar rAF = (function(){\n\t\tvar running, waiting;\n\t\tvar firstFns = [];\n\t\tvar secondFns = [];\n\t\tvar fns = firstFns;\n\n\t\tvar run = function(){\n\t\t\tvar runFns = fns;\n\n\t\t\tfns = firstFns.length ? secondFns : firstFns;\n\n\t\t\trunning = true;\n\t\t\twaiting = false;\n\n\t\t\twhile(runFns.length){\n\t\t\t\trunFns.shift()();\n\t\t\t}\n\n\t\t\trunning = false;\n\t\t};\n\n\t\tvar rafBatch = function(fn, queue){\n\t\t\tif(running && !queue){\n\t\t\t\tfn.apply(this, arguments);\n\t\t\t} else {\n\t\t\t\tfns.push(fn);\n\n\t\t\t\tif(!waiting){\n\t\t\t\t\twaiting = true;\n\t\t\t\t\t(document.hidden ? setTimeout : requestAnimationFrame)(run);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\trafBatch._lsFlush = run;\n\n\t\treturn rafBatch;\n\t})();\n\n\tvar rAFIt = function(fn, simple){\n\t\treturn simple ?\n\t\t\tfunction() {\n\t\t\t\trAF(fn);\n\t\t\t} :\n\t\t\tfunction(){\n\t\t\t\tvar that = this;\n\t\t\t\tvar args = arguments;\n\t\t\t\trAF(function(){\n\t\t\t\t\tfn.apply(that, args);\n\t\t\t\t});\n\t\t\t}\n\t\t;\n\t};\n\n\tvar throttle = function(fn){\n\t\tvar running;\n\t\tvar lastTime = 0;\n\t\tvar gDelay = 125;\n\t\tvar rICTimeout = lazySizesConfig.ricTimeout;\n\t\tvar run = function(){\n\t\t\trunning = false;\n\t\t\tlastTime = Date.now();\n\t\t\tfn();\n\t\t};\n\t\tvar idleCallback = requestIdleCallback && lazySizesConfig.ricTimeout ?\n\t\t\tfunction(){\n\t\t\t\trequestIdleCallback(run, {timeout: rICTimeout});\n\n\t\t\t\tif(rICTimeout !== lazySizesConfig.ricTimeout){\n\t\t\t\t\trICTimeout = lazySizesConfig.ricTimeout;\n\t\t\t\t}\n\t\t\t} :\n\t\t\trAFIt(function(){\n\t\t\t\tsetTimeout(run);\n\t\t\t}, true)\n\t\t;\n\n\t\treturn function(isPriority){\n\t\t\tvar delay;\n\n\t\t\tif((isPriority = isPriority === true)){\n\t\t\t\trICTimeout = 33;\n\t\t\t}\n\n\t\t\tif(running){\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trunning = true;\n\n\t\t\tdelay = gDelay - (Date.now() - lastTime);\n\n\t\t\tif(delay < 0){\n\t\t\t\tdelay = 0;\n\t\t\t}\n\n\t\t\tif(isPriority || (delay < 9 && requestIdleCallback)){\n\t\t\t\tidleCallback();\n\t\t\t} else {\n\t\t\t\tsetTimeout(idleCallback, delay);\n\t\t\t}\n\t\t};\n\t};\n\n\t//based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html\n\tvar debounce = function(func) {\n\t\tvar timeout, timestamp;\n\t\tvar wait = 99;\n\t\tvar run = function(){\n\t\t\ttimeout = null;\n\t\t\tfunc();\n\t\t};\n\t\tvar later = function() {\n\t\t\tvar last = Date.now() - timestamp;\n\n\t\t\tif (last < wait) {\n\t\t\t\tsetTimeout(later, wait - last);\n\t\t\t} else {\n\t\t\t\t(requestIdleCallback || run)(run);\n\t\t\t}\n\t\t};\n\n\t\treturn function() {\n\t\t\ttimestamp = Date.now();\n\n\t\t\tif (!timeout) {\n\t\t\t\ttimeout = setTimeout(later, wait);\n\t\t\t}\n\t\t};\n\t};\n\n\t(function(){\n\t\tvar prop;\n\n\t\tvar lazySizesDefaults = {\n\t\t\tlazyClass: 'lazyload',\n\t\t\tloadedClass: 'lazyloaded',\n\t\t\tloadingClass: 'lazyloading',\n\t\t\tpreloadClass: 'lazypreload',\n\t\t\terrorClass: 'lazyerror',\n\t\t\t//strictClass: 'lazystrict',\n\t\t\tautosizesClass: 'lazyautosizes',\n\t\t\tsrcAttr: 'data-src',\n\t\t\tsrcsetAttr: 'data-srcset',\n\t\t\tsizesAttr: 'data-sizes',\n\t\t\t//preloadAfterLoad: false,\n\t\t\tminSize: 40,\n\t\t\tcustomMedia: {},\n\t\t\tinit: true,\n\t\t\texpFactor: 1.5,\n\t\t\thFac: 0.8,\n\t\t\tloadMode: 2,\n\t\t\tloadHidden: true,\n\t\t\tricTimeout: 300,\n\t\t};\n\n\t\tlazySizesConfig = window.lazySizesConfig || window.lazysizesConfig || {};\n\n\t\tfor(prop in lazySizesDefaults){\n\t\t\tif(!(prop in lazySizesConfig)){\n\t\t\t\tlazySizesConfig[prop] = lazySizesDefaults[prop];\n\t\t\t}\n\t\t}\n\n\t\twindow.lazySizesConfig = lazySizesConfig;\n\n\t\tsetTimeout(function(){\n\t\t\tif(lazySizesConfig.init){\n\t\t\t\tinit();\n\t\t\t}\n\t\t});\n\t})();\n\n\tvar loader = (function(){\n\t\tvar preloadElems, isCompleted, resetPreloadingTimer, loadMode, started;\n\n\t\tvar eLvW, elvH, eLtop, eLleft, eLright, eLbottom;\n\n\t\tvar defaultExpand, preloadExpand, hFac;\n\n\t\tvar regImg = /^img$/i;\n\t\tvar regIframe = /^iframe$/i;\n\n\t\tvar supportScroll = ('onscroll' in window) && !(/glebot/.test(navigator.userAgent));\n\n\t\tvar shrinkExpand = 0;\n\t\tvar currentExpand = 0;\n\n\t\tvar isLoading = 0;\n\t\tvar lowRuns = -1;\n\n\t\tvar resetPreloading = function(e){\n\t\t\tisLoading--;\n\t\t\tif(e && e.target){\n\t\t\t\taddRemoveLoadEvents(e.target, resetPreloading);\n\t\t\t}\n\n\t\t\tif(!e || isLoading < 0 || !e.target){\n\t\t\t\tisLoading = 0;\n\t\t\t}\n\t\t};\n\n\t\tvar isNestedVisible = function(elem, elemExpand){\n\t\t\tvar outerRect;\n\t\t\tvar parent = elem;\n\t\t\tvar visible = getCSS(document.body, 'visibility') == 'hidden' || getCSS(elem, 'visibility') != 'hidden';\n\n\t\t\teLtop -= elemExpand;\n\t\t\teLbottom += elemExpand;\n\t\t\teLleft -= elemExpand;\n\t\t\teLright += elemExpand;\n\n\t\t\twhile(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){\n\t\t\t\tvisible = ((getCSS(parent, 'opacity') || 1) > 0);\n\n\t\t\t\tif(visible && getCSS(parent, 'overflow') != 'visible'){\n\t\t\t\t\touterRect = parent.getBoundingClientRect();\n\t\t\t\t\tvisible = eLright > outerRect.left &&\n\t\t\t\t\t\teLleft < outerRect.right &&\n\t\t\t\t\t\teLbottom > outerRect.top - 1 &&\n\t\t\t\t\t\teLtop < outerRect.bottom + 1\n\t\t\t\t\t;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn visible;\n\t\t};\n\n\t\tvar checkElements = function() {\n\t\t\tvar eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, beforeExpandVal;\n\n\t\t\tvar lazyloadElems = lazysizes.elements;\n\n\t\t\tif((loadMode = lazySizesConfig.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){\n\n\t\t\t\ti = 0;\n\n\t\t\t\tlowRuns++;\n\n\t\t\t\tif(preloadExpand == null){\n\t\t\t\t\tif(!('expand' in lazySizesConfig)){\n\t\t\t\t\t\tlazySizesConfig.expand = docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefaultExpand = lazySizesConfig.expand;\n\t\t\t\t\tpreloadExpand = defaultExpand * lazySizesConfig.expFactor;\n\t\t\t\t}\n\n\t\t\t\tif(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){\n\t\t\t\t\tcurrentExpand = preloadExpand;\n\t\t\t\t\tlowRuns = 0;\n\t\t\t\t} else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){\n\t\t\t\t\tcurrentExpand = defaultExpand;\n\t\t\t\t} else {\n\t\t\t\t\tcurrentExpand = shrinkExpand;\n\t\t\t\t}\n\n\t\t\t\tfor(; i < eLlen; i++){\n\n\t\t\t\t\tif(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;}\n\n\t\t\t\t\tif(!supportScroll){unveilElement(lazyloadElems[i]);continue;}\n\n\t\t\t\t\tif(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){\n\t\t\t\t\t\telemExpand = currentExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(beforeExpandVal !== elemExpand){\n\t\t\t\t\t\teLvW = innerWidth + (elemExpand * hFac);\n\t\t\t\t\t\telvH = innerHeight + elemExpand;\n\t\t\t\t\t\telemNegativeExpand = elemExpand * -1;\n\t\t\t\t\t\tbeforeExpandVal = elemExpand;\n\t\t\t\t\t}\n\n\t\t\t\t\trect = lazyloadElems[i].getBoundingClientRect();\n\n\t\t\t\t\tif ((eLbottom = rect.bottom) >= elemNegativeExpand &&\n\t\t\t\t\t\t(eLtop = rect.top) <= elvH &&\n\t\t\t\t\t\t(eLright = rect.right) >= elemNegativeExpand * hFac &&\n\t\t\t\t\t\t(eLleft = rect.left) <= eLvW &&\n\t\t\t\t\t\t(eLbottom || eLright || eLleft || eLtop) &&\n\t\t\t\t\t\t(lazySizesConfig.loadHidden || getCSS(lazyloadElems[i], 'visibility') != 'hidden') &&\n\t\t\t\t\t\t((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){\n\t\t\t\t\t\tunveilElement(lazyloadElems[i]);\n\t\t\t\t\t\tloadedSomething = true;\n\t\t\t\t\t\tif(isLoading > 9){break;}\n\t\t\t\t\t} else if(!loadedSomething && isCompleted && !autoLoadElem &&\n\t\t\t\t\t\tisLoading < 4 && lowRuns < 4 && loadMode > 2 &&\n\t\t\t\t\t\t(preloadElems[0] || lazySizesConfig.preloadAfterLoad) &&\n\t\t\t\t\t\t(preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesConfig.sizesAttr) != 'auto')))){\n\t\t\t\t\t\tautoLoadElem = preloadElems[0] || lazyloadElems[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(autoLoadElem && !loadedSomething){\n\t\t\t\t\tunveilElement(autoLoadElem);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar throttledCheckElements = throttle(checkElements);\n\n\t\tvar switchLoadingClass = function(e){\n\t\t\taddClass(e.target, lazySizesConfig.loadedClass);\n\t\t\tremoveClass(e.target, lazySizesConfig.loadingClass);\n\t\t\taddRemoveLoadEvents(e.target, rafSwitchLoadingClass);\n\t\t\ttriggerEvent(e.target, 'lazyloaded');\n\t\t};\n\t\tvar rafedSwitchLoadingClass = rAFIt(switchLoadingClass);\n\t\tvar rafSwitchLoadingClass = function(e){\n\t\t\trafedSwitchLoadingClass({target: e.target});\n\t\t};\n\n\t\tvar changeIframeSrc = function(elem, src){\n\t\t\ttry {\n\t\t\t\telem.contentWindow.location.replace(src);\n\t\t\t} catch(e){\n\t\t\t\telem.src = src;\n\t\t\t}\n\t\t};\n\n\t\tvar handleSources = function(source){\n\t\t\tvar customMedia;\n\n\t\t\tvar sourceSrcset = source[_getAttribute](lazySizesConfig.srcsetAttr);\n\n\t\t\tif( (customMedia = lazySizesConfig.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){\n\t\t\t\tsource.setAttribute('media', customMedia);\n\t\t\t}\n\n\t\t\tif(sourceSrcset){\n\t\t\t\tsource.setAttribute('srcset', sourceSrcset);\n\t\t\t}\n\t\t};\n\n\t\tvar lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){\n\t\t\tvar src, srcset, parent, isPicture, event, firesLoad;\n\n\t\t\tif(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){\n\n\t\t\t\tif(sizes){\n\t\t\t\t\tif(isAuto){\n\t\t\t\t\t\taddClass(elem, lazySizesConfig.autosizesClass);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute('sizes', sizes);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsrcset = elem[_getAttribute](lazySizesConfig.srcsetAttr);\n\t\t\t\tsrc = elem[_getAttribute](lazySizesConfig.srcAttr);\n\n\t\t\t\tif(isImg) {\n\t\t\t\t\tparent = elem.parentNode;\n\t\t\t\t\tisPicture = parent && regPicture.test(parent.nodeName || '');\n\t\t\t\t}\n\n\t\t\t\tfiresLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture));\n\n\t\t\t\tevent = {target: elem};\n\n\t\t\t\tif(firesLoad){\n\t\t\t\t\taddRemoveLoadEvents(elem, resetPreloading, true);\n\t\t\t\t\tclearTimeout(resetPreloadingTimer);\n\t\t\t\t\tresetPreloadingTimer = setTimeout(resetPreloading, 2500);\n\n\t\t\t\t\taddClass(elem, lazySizesConfig.loadingClass);\n\t\t\t\t\taddRemoveLoadEvents(elem, rafSwitchLoadingClass, true);\n\t\t\t\t}\n\n\t\t\t\tif(isPicture){\n\t\t\t\t\tforEach.call(parent.getElementsByTagName('source'), handleSources);\n\t\t\t\t}\n\n\t\t\t\tif(srcset){\n\t\t\t\t\telem.setAttribute('srcset', srcset);\n\t\t\t\t} else if(src && !isPicture){\n\t\t\t\t\tif(regIframe.test(elem.nodeName)){\n\t\t\t\t\t\tchangeIframeSrc(elem, src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.src = src;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(isImg && (srcset || isPicture)){\n\t\t\t\t\tupdatePolyfill(elem, {src: src});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(elem._lazyRace){\n\t\t\t\tdelete elem._lazyRace;\n\t\t\t}\n\t\t\tremoveClass(elem, lazySizesConfig.lazyClass);\n\n\t\t\trAF(function(){\n\t\t\t\tif( !firesLoad || (elem.complete && elem.naturalWidth > 1)){\n\t\t\t\t\tif(firesLoad){\n\t\t\t\t\t\tresetPreloading(event);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tisLoading--;\n\t\t\t\t\t}\n\t\t\t\t\tswitchLoadingClass(event);\n\t\t\t\t}\n\t\t\t}, true);\n\t\t});\n\n\t\tvar unveilElement = function (elem){\n\t\t\tvar detail;\n\n\t\t\tvar isImg = regImg.test(elem.nodeName);\n\n\t\t\t//allow using sizes=\"auto\", but don't use. it's invalid. Use data-sizes=\"auto\" or a valid value for sizes instead (i.e.: sizes=\"80vw\")\n\t\t\tvar sizes = isImg && (elem[_getAttribute](lazySizesConfig.sizesAttr) || elem[_getAttribute]('sizes'));\n\t\t\tvar isAuto = sizes == 'auto';\n\n\t\t\tif( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesConfig.errorClass) && hasClass(elem, lazySizesConfig.lazyClass)){return;}\n\n\t\t\tdetail = triggerEvent(elem, 'lazyunveilread').detail;\n\n\t\t\tif(isAuto){\n\t\t\t\t autoSizer.updateElem(elem, true, elem.offsetWidth);\n\t\t\t}\n\n\t\t\telem._lazyRace = true;\n\t\t\tisLoading++;\n\n\t\t\tlazyUnveil(elem, detail, isAuto, sizes, isImg);\n\t\t};\n\n\t\tvar onload = function(){\n\t\t\tif(isCompleted){return;}\n\t\t\tif(Date.now() - started < 999){\n\t\t\t\tsetTimeout(onload, 999);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar afterScroll = debounce(function(){\n\t\t\t\tlazySizesConfig.loadMode = 3;\n\t\t\t\tthrottledCheckElements();\n\t\t\t});\n\n\t\t\tisCompleted = true;\n\n\t\t\tlazySizesConfig.loadMode = 3;\n\n\t\t\tthrottledCheckElements();\n\n\t\t\taddEventListener('scroll', function(){\n\t\t\t\tif(lazySizesConfig.loadMode == 3){\n\t\t\t\t\tlazySizesConfig.loadMode = 2;\n\t\t\t\t}\n\t\t\t\tafterScroll();\n\t\t\t}, true);\n\t\t};\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tstarted = Date.now();\n\n\t\t\t\tlazysizes.elements = document.getElementsByClassName(lazySizesConfig.lazyClass);\n\t\t\t\tpreloadElems = document.getElementsByClassName(lazySizesConfig.lazyClass + ' ' + lazySizesConfig.preloadClass);\n\t\t\t\thFac = lazySizesConfig.hFac;\n\n\t\t\t\taddEventListener('scroll', throttledCheckElements, true);\n\n\t\t\t\taddEventListener('resize', throttledCheckElements, true);\n\n\t\t\t\tif(window.MutationObserver){\n\t\t\t\t\tnew MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} );\n\t\t\t\t} else {\n\t\t\t\t\tdocElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true);\n\t\t\t\t\tdocElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true);\n\t\t\t\t\tsetInterval(throttledCheckElements, 999);\n\t\t\t\t}\n\n\t\t\t\taddEventListener('hashchange', throttledCheckElements, true);\n\n\t\t\t\t//, 'fullscreenchange'\n\t\t\t\t['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend', 'webkitAnimationEnd'].forEach(function(name){\n\t\t\t\t\tdocument[_addEventListener](name, throttledCheckElements, true);\n\t\t\t\t});\n\n\t\t\t\tif((/d$|^c/.test(document.readyState))){\n\t\t\t\t\tonload();\n\t\t\t\t} else {\n\t\t\t\t\taddEventListener('load', onload);\n\t\t\t\t\tdocument[_addEventListener]('DOMContentLoaded', throttledCheckElements);\n\t\t\t\t\tsetTimeout(onload, 20000);\n\t\t\t\t}\n\n\t\t\t\tif(lazysizes.elements.length){\n\t\t\t\t\tcheckElements();\n\t\t\t\t\trAF._lsFlush();\n\t\t\t\t} else {\n\t\t\t\t\tthrottledCheckElements();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcheckElems: throttledCheckElements,\n\t\t\tunveil: unveilElement\n\t\t};\n\t})();\n\n\n\tvar autoSizer = (function(){\n\t\tvar autosizesElems;\n\n\t\tvar sizeElement = rAFIt(function(elem, parent, event, width){\n\t\t\tvar sources, i, len;\n\t\t\telem._lazysizesWidth = width;\n\t\t\twidth += 'px';\n\n\t\t\telem.setAttribute('sizes', width);\n\n\t\t\tif(regPicture.test(parent.nodeName || '')){\n\t\t\t\tsources = parent.getElementsByTagName('source');\n\t\t\t\tfor(i = 0, len = sources.length; i < len; i++){\n\t\t\t\t\tsources[i].setAttribute('sizes', width);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(!event.detail.dataAttr){\n\t\t\t\tupdatePolyfill(elem, event.detail);\n\t\t\t}\n\t\t});\n\t\tvar getSizeElement = function (elem, dataAttr, width){\n\t\t\tvar event;\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif(parent){\n\t\t\t\twidth = getWidth(elem, parent, width);\n\t\t\t\tevent = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr});\n\n\t\t\t\tif(!event.defaultPrevented){\n\t\t\t\t\twidth = event.detail.width;\n\n\t\t\t\t\tif(width && width !== elem._lazysizesWidth){\n\t\t\t\t\t\tsizeElement(elem, parent, event, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar updateElementsSizes = function(){\n\t\t\tvar i;\n\t\t\tvar len = autosizesElems.length;\n\t\t\tif(len){\n\t\t\t\ti = 0;\n\n\t\t\t\tfor(; i < len; i++){\n\t\t\t\t\tgetSizeElement(autosizesElems[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tvar debouncedUpdateElementsSizes = debounce(updateElementsSizes);\n\n\t\treturn {\n\t\t\t_: function(){\n\t\t\t\tautosizesElems = document.getElementsByClassName(lazySizesConfig.autosizesClass);\n\t\t\t\taddEventListener('resize', debouncedUpdateElementsSizes);\n\t\t\t},\n\t\t\tcheckElems: debouncedUpdateElementsSizes,\n\t\t\tupdateElem: getSizeElement\n\t\t};\n\t})();\n\n\tvar init = function(){\n\t\tif(!init.i){\n\t\t\tinit.i = true;\n\t\t\tautoSizer._();\n\t\t\tloader._();\n\t\t}\n\t};\n\n\tlazysizes = {\n\t\tcfg: lazySizesConfig,\n\t\tautoSizer: autoSizer,\n\t\tloader: loader,\n\t\tinit: init,\n\t\tuP: updatePolyfill,\n\t\taC: addClass,\n\t\trC: removeClass,\n\t\thC: hasClass,\n\t\tfire: triggerEvent,\n\t\tgW: getWidth,\n\t\trAF: rAF,\n\t};\n\n\treturn lazysizes;\n}\n));\n","'use strict';\r\n/*\r\n * Novicell master\r\n * Use this file to call functions in other files, on document ready, window.resize etc.\r\n */\r\nvar lazySizes = lazySizes || {};\r\nvar novicell = novicell || {};\r\nvar svaneTvis = svaneTvis || {};\r\n\r\n// Document ready\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n lazySizes.init();\r\n svg4everybody(); // Fix SVG spritemap in IE/Edge\r\n novicell.validate.init(); // Init Validation\r\n novicell.inputMasking.init(); //Init input masking\r\n // novicell.persistentField.init(); //Init persistentField\r\n // novicell.cookieInfo.init();\r\n novicell.search.init();\r\n novicell.gallery.init();\r\n novicell.slider.init();\r\n svaneTvis.megamenu.init();\r\n svaneTvis.navigation.init();\r\n svaneTvis.accordion.init();\r\n svaneTvis.overlay.init();\r\n svaneTvis.map.init();\r\n svaneTvis.form.init();\r\n svaneTvis.shopselector.init();\r\n svaneTvis.video.init();\r\n svaneTvis.languagePopup.init();\r\n});\r\n"]}