2611 lines
343 KiB
HTML
2611 lines
343 KiB
HTML
<!DOCTYPE html><html class="DE no-gec desktop no-js" lang="de-DE"><head>
|
||
<meta charset="UTF-8"/>
|
||
<script id="tagManagerDataLayer">
|
||
var utag_data = [{"country":"DE","page_template":"OffersOfProduct","currency":"EUR","products":[{"id":202740303,"category":18874,"name":"Mobilis Elektrorollstuhl M45 Air rot"}],"sponsored_brand_shop":false,"sponsored_slider":true}];
|
||
</script>
|
||
<link rel="canonical" href=""/>
|
||
<meta name="robots" content="noindex, follow"/>
|
||
<meta name="description" content="Bereits ab 6.780,00 € ✓ Große Shopvielfalt ✓ Testberichte & Meinungen ✓ | Jetzt Mobilis Elektrorollstuhl M45 Air rot günstig kaufen bei idealo.de"/>
|
||
<meta name="viewPort" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/>
|
||
<link rel="modulepreload" href="https://cdn.idealo.com/storage/cmp/idealo-ucEventHandler.min.js" type="application/javascript"/>
|
||
<link rel="preload" as="script" href="https://web.cmp.usercentrics.eu/ui/loader.js" type="application/javascript"/>
|
||
|
||
<link rel="preconnect" href="//cdn.idealo.com" crossorigin=""/>
|
||
<link rel="preconnect" href="//cdn.idealo.com"/>
|
||
<link rel="preconnect" href="//www.googletagmanager.com"/>
|
||
<link rel="preconnect" href="//web.cmp.usercentrics.eu"/>
|
||
<link rel="preconnect" href="//energylabels.idealo.com"/>
|
||
<link rel="shortcut icon" href="https://cdn.idealo.com/storage/ids-assets/ico/favicon.ico"/>
|
||
<link rel="preload" as="image" href="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross/mobilis-elektrorollstuhl-m45-air-rot.jpg"/>
|
||
<title>Mobilis Elektrorollstuhl M45 Air rot ab 6780 € | Vergleiche 1 Angebote auf idealo.de</title>
|
||
|
||
<meta name="cdnPrefix" content="//cdn.idealo.com/storage/offerpage/assets/"/>
|
||
|
||
<meta name="css" content="//cdn.idealo.com/storage/offerpage/assets/offerpage/idealo-553bbb6677c60f8470ae.css"/>
|
||
|
||
|
||
<meta property="og:image" content="https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_max/mobilis-elektrorollstuhl-m45-air-rot.jpg"/>
|
||
<meta name="format-detection" content="telephone=no"/>
|
||
<meta name="theme-color" content="#082036"/>
|
||
<meta name="ipc-init" content="ipc-init" data-main="" data-ipc-init="{"siteId":1,"pageName":"offersofproduct","productId":202740303,"hasVariants":false,"translations":{"appbanner.install":"Installieren","wishlist.page.compare_link_text":"Zum Vergleich","common.scroll-top":"Nach oben","appbanner.goto_app":"In der idealo App anzeigen","errorreport.please_mark":"bitte ankreuzen","appbanner.open_in_app":"In der App öffnen","appbanner.app":"idealo Preisvergleichs-App","wishlist.page.compare_element":"Vergleichen"},"showLiveChat":false,"embedLazyLoading":false,"addMediaBoxScripts":false}"/>
|
||
<meta name="navigation" content="for preselection of category tree" data-mainid="3932" data-subids="[3932, 14476, 18874]"/>
|
||
|
||
<link rel="stylesheet" href="//cdn.idealo.com/storage/offerpage/assets/offerpage/idealo-553bbb6677c60f8470ae.css"/><script id="idealo-cmp" type="module" src="https://cdn.idealo.com/storage/cmp/idealo-ucEventHandler.min.js"></script>
|
||
<script id="usercentrics-cmp" data-settings-id="oggppIDJJe8IF8" src="https://web.cmp.usercentrics.eu/ui/loader.js"></script>
|
||
<script>
|
||
/* <![CDATA[ */
|
||
|
||
var idealo = idealo || {};
|
||
|
||
idealo.config = {
|
||
tracking: {
|
||
console: {
|
||
enabled: true
|
||
},
|
||
error: {
|
||
debug: false,
|
||
enabled: true,
|
||
filter: {
|
||
isBlacklisted: function(message) {
|
||
return (
|
||
!!message.match(/similardeals|foxydeals/i) ||
|
||
!!message.match(/pricemoon|bestpriceninja/) ||
|
||
!!message.match(/symcBF/)
|
||
);
|
||
},
|
||
isValidFile: function(file) {
|
||
return !!file.match(/^(http[s]?):\/\/([a-z_\d\-]+\.)*idealo(\.[a-z]+)*\/[\s\S]*$/);
|
||
},
|
||
isValidBrowser: function() {
|
||
return (
|
||
typeof Object.create === 'function'
|
||
);
|
||
}
|
||
},
|
||
ratio: 10,
|
||
stackTrace: {
|
||
trimString: ' > m.event.dispatch'
|
||
}
|
||
},
|
||
event: {
|
||
debug: false,
|
||
enabled: true
|
||
}
|
||
}
|
||
};
|
||
var idealoApp = idealoApp || {
|
||
getContents: function(text) {
|
||
return "";
|
||
}
|
||
};
|
||
|
||
/* ]]> */
|
||
</script>
|
||
|
||
<script src="//cdn.idealo.com/storage/offerpage/assets/offerpage/head-b9fc9c351c1033e74b81.js"></script><meta name="request-country" content="DE"/>
|
||
<meta name="trafficSource" content="DC"/>
|
||
|
||
<meta data-ctx-product="{"product_id":"202740303","product_type":"non_varied","category_id":"18874","manufacturer_id":"Mobilis","item_type":"product"}"/>
|
||
<meta name="offerpage-view-id" content="4b27f317-587d-4fdf-975d-9257a4130f79"/>
|
||
<meta data-ctx-offerpage-view-id="4b27f317-587d-4fdf-975d-9257a4130f79"/>
|
||
<meta data-ctx-user-country-code="DE"/>
|
||
<meta data-ctx-has-manufacturer-shop-offer="false"/>
|
||
<meta data-trx-load="offerpage_view;1-1-3;sooper" data-trx-load-data="$viewport_height;$viewport_width;$language;$user_country;$has_brand_shop_offer" data-trx-exclude-context="product"/>
|
||
|
||
<meta data-trx-load="local_ip_type_tracking;1-1-0;local-offers" data-trx-load-data="{"ip_type":"IP4","request_country":"DE"}"/>
|
||
<meta data-trx-load="footer_fallback;1-0-0;sooper" data-trx-exclude-context=""/>
|
||
<script >bazadebezolkohpepadr="1998830730"</script><script type="text/javascript" src="https://www.idealo.de/akam/13/7723bc98" defer></script></head><body id="offersofproduct" class="" data-app-context=""><span class="ui-component-include"> <link rel="stylesheet" href="https://cdn.idealo.com/storage/offerpage/assets/opr/_astro/index.9baD7n8z.css"/> </span><link rel="stylesheet" href="https://cdn.idealo.com/storage/price-chart-assets/static/css/bundle-main.css"/>
|
||
|
||
|
||
|
||
<div id="shop-overlay-wrapper"></div>
|
||
<div id="cross-border-offer-confirm-overlay-wrapper"></div>
|
||
<nav class="skip-links" tabindex="0">
|
||
<ul>
|
||
<li><a href="#i-header-navigation">Zur Navigation</a></li>
|
||
<li><a href="#i-header-search">Zur Suche</a></li>
|
||
<li><a href="#oopStage-title">Zum Hauptinhalt</a></li>
|
||
<li><a href="#offerlist-head">Zu den Angeboten</a></li>
|
||
</ul>
|
||
</nav>
|
||
|
||
<div class="page-wrapper">
|
||
<div class="main-section">
|
||
<header id="header-idealo" class="i-header" data-header-build-version="20260430094811">
|
||
|
||
<div>
|
||
|
||
<style>/*<![CDATA[*/
|
||
body{margin:0}.i-header-row{padding:10px 10px 5px 10px;width:100%}.i-header-row--brand,.i-header-row--simple{position:relative;text-align:center}.i-header{background-color:#0a3761;box-sizing:border-box;color:#f5f5f5;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;line-height:normal;position:relative;width:100%;z-index:300}.i-header *{box-sizing:border-box}.i-header::after{background-color:#fff;content:"";cursor:auto;display:block;height:100vh;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .2s;z-index:-1}@media(min-width: 600px){.i-header::after{display:none}}.i-header.i-header--initialised::before{background-color:#0a3761;content:"";display:block;inset:0;position:absolute;z-index:-1}.i-header .i-header-slot--search{-ms-grid-row:2;-ms-grid-column:1;-ms-grid-column-span:2;line-height:1;max-width:1280px;padding-bottom:16px;grid-area:i-header-search}@media(min-width: 840px){.i-header .i-header-slot--search{padding-top:16px}}.i-header .i-header-slot--services{-ms-grid-row:1;-ms-grid-column:2;grid-area:i-header-services;margin-top:8px !important;margin-bottom:8px}@media(min-width: 600px){.i-header .i-header-slot--services{padding-bottom:16px;margin-bottom:0;margin-top:16px !important}}@media(min-width: 840px){.i-header .i-header-slot--services{margin-left:0 !important;margin-bottom:0}}.i-header-grid{display:grid;margin:0 16px;max-width:1280px;grid-template-areas:"i-header-brand i-header-services" "i-header-search i-header-search";grid-template-columns:auto auto}@media(min-width: 600px){.i-header-grid{margin:0 24px}}@media(min-width: 840px){.i-header-grid{grid-template-areas:"i-header-brand i-header-search i-header-services";grid-template-columns:min-content minmax(200px, 600px) min-content;grid-column-gap:24px;justify-content:space-between;align-items:center}.i-header .i-header-slot--search{-ms-grid-row:1;-ms-grid-column:3;-ms-grid-column-span:1}.i-header .i-header-slot--services{-ms-grid-row:1;-ms-grid-column:5}}@media(min-width: 960px){.i-header-grid{margin:0 32px}}@media(min-width: 1280px){.i-header-grid{margin:0 auto}}.i-header-brand{-ms-grid-row:1;-ms-grid-column:1;display:flex;align-items:center;grid-area:i-header-brand;margin-top:8px !important;margin-bottom:8px;margin-left:-8px}@media (min-width: 840px){.i-header-brand{-ms-grid-row:1;-ms-grid-column:1}}@media(min-width: 600px){.i-header-brand{padding-bottom:16px;margin-bottom:0;margin-top:16px !important;margin-left:-12px}}@media(min-width: 960px){.i-header-brand{margin-left:-16px}}@media(min-width: 1280px){.i-header-brand{margin-left:0}}@media(min-width: 1312px){.i-header-brand{margin-left:-16px}}@keyframes overlay-mask-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes flyout-content-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes flyout-reveal{0%{transform:scaleY(0)}100%{transform:scaleY(1)}}.i-header-bf-badge{display:none;color:#fff;font-size:24px;line-height:26px;margin-left:8px;position:relative;text-decoration:none}.i-header-bf-badge:hover,.i-header-bf-badge:focus{background-color:unset;color:#fff !important}@media(min-width: 600px){.i-header-bf-badge{margin-left:24px}}@media(max-width: 349px){.i-header-bf-badge{display:none}}.i-header-bf-badge span{display:none;left:4px;min-width:2ch;position:absolute;text-align:center;top:50%;transform:translateY(-50%)}@media(min-width: 600px){.i-header-bf-badge span{display:block}}.i-header-bf-badge-phase-1>:first-child,.i-header-bf-badge-phase-1-last-day>:first-child,.i-header-bf-badge-phase-2>:first-child{display:none}.i-header-bf-badge-phase-1>:last-child,.i-header-bf-badge-phase-1-last-day>:last-child,.i-header-bf-badge-phase-2>:last-child{display:block}@media(min-width: 600px){.i-header-bf-badge-phase-1>:first-child,.i-header-bf-badge-phase-1-last-day>:first-child,.i-header-bf-badge-phase-2>:first-child{display:block}.i-header-bf-badge-phase-1>:last-child,.i-header-bf-badge-phase-1-last-day>:last-child,.i-header-bf-badge-phase-2>:last-child{display:none}}#i-header-bf-badge-days-remaining{display:none}@media(min-width: 600px){#i-header-bf-badge-days-remaining{display:inline}}.i-app-banner{display:none;align-items:center;background-color:#fff;box-shadow:0 0 20px 0 rgba(0,0,0,.2);padding:11px 15px 11px 0;position:relative;width:100%;z-index:400}@media(min-width: 600px){.i-app-banner{display:none}}.i-app-banner>button{padding:15px}.i-app-banner>button i{color:#2d2d2d;display:block;height:15px;width:15px}.i-app-banner-close{background:rgba(0,0,0,0);border:none;cursor:pointer}.i-app-banner-close:hover,.i-app-banner-close:focus{opacity:.7}.i-app-banner-close svg{width:15px;height:15px}.i-app-banner-wrapper{align-items:center;display:flex;flex:1 1 0}.i-app-banner-wrapper p{margin:0}.i-app-banner-wrapper>div,.i-app-banner-wrapper>img{margin-right:10px}.i-app-banner-text-wrapper{flex:1 1 0}.i-app-banner-title{color:#2d2d2d;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:700;line-height:1.4;margin:0}.i-app-banner-subtitle{color:#2d2d2d;display:none;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:10px;line-height:1.2;margin:0}@media(min-width: 480px){.i-app-banner-subtitle{display:block;min-width:25%}}.i-app-banner-link-button{border:none;cursor:pointer;align-items:center;background-color:#0665bb;border-radius:4px;color:#fff;display:flex;flex-basis:0;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;justify-content:center;padding:0 20px;text-decoration:none;white-space:nowrap;min-width:132px;height:40px}.i-app-banner-link-button:hover,.i-app-banner-link-button:focus{background-color:#0771d0;color:#fff;text-decoration:none}.i-app-banner img{cursor:pointer;border-radius:8px;flex-shrink:0;height:40px;width:40px}.i-header-logo{color:#fff;display:inline-block;grid-area:i-header-logo;overflow:hidden;position:relative;z-index:2}.i-header-logo svg{display:block;height:24px;width:auto}@media(min-width: 600px){.i-header-logo svg{height:30px}}@media(min-width: 960px){.i-header-logo svg{height:40px}}@media(min-width: 480px){.i-header-logo{position:static}}@media(min-width: 1280px){.i-header-logo{align-self:center}}.i-header-celebration{margin-right:8px}.i-header-celebration svg{display:block;height:24px;width:auto}@media(min-width: 600px){.i-header-celebration svg{height:30px}}@media(min-width: 960px){.i-header-celebration svg{height:40px}}.i-header-deal-of-day{display:none;margin-left:8px}@media(min-width: 360px){.i-header-deal-of-day{display:inline-block}.i-header-deal-of-day .i-header-deal-of-day__large{display:none}.i-header-deal-of-day .i-header-deal-of-day__small{display:block}.i-header-deal-of-day .i-header-deal-of-day__small svg{display:block;height:39px;width:46px}}@media(min-width: 840px){.i-header-deal-of-day{margin-left:24px}.i-header-deal-of-day .i-header-deal-of-day__small{display:none}.i-header-deal-of-day .i-header-deal-of-day__large{display:block}.i-header-deal-of-day .i-header-deal-of-day__large svg{display:block;height:39px;width:96px}}.i-header-logo-simple{color:#fff;display:inline-block;height:30px;overflow:hidden;position:relative;width:100px;z-index:2}.i-header-logo-simple svg{display:block;height:auto;width:100%}@media(min-width: 480px){.i-header-logo-simple{position:static}}@media(min-width: 600px){.i-header-logo-simple{height:38px;width:125px}}.i-header-climate{display:none}@media(min-width: 840px){.i-header-climate{align-items:center;color:#fff;display:flex;font-size:14px;position:absolute;right:20px;text-decoration:none;top:16px}.i-header-climate:hover,.i-header-climate:focus{color:#fff;text-decoration:underline}}.i-header-climate-text{padding-right:10px}.i-header-climate-simple{display:none;padding-top:10px}@media(min-width: 840px){.i-header-climate-simple{align-items:center;color:#fff;display:flex;font-size:14px;position:absolute;right:20px;text-decoration:none;top:0}.i-header-climate-simple:hover,.i-header-climate-simple:focus{color:#fff;text-decoration:underline}}.i-header-climate-simple-text{padding-right:10px}.i-header-verticals{display:flex;justify-content:flex-start;line-height:1.6;margin:0;padding:0 16px;position:relative;white-space:nowrap;background:#0a3761}@media(min-width: 600px){.i-header-verticals{padding:0 24px}}@media(min-width: 960px){.i-header-verticals{justify-content:center;padding:0}}.i-header-vertical{display:inline-block;margin-right:16px;vertical-align:top}@media(min-width: 320px){.i-header-vertical:nth-of-type(4){display:none}}@media(min-width: 480px){.i-header-vertical:nth-of-type(4){display:inline-block}}@media(min-width: 960px){.i-header-vertical:nth-of-type(4){margin-right:24px}}.i-header-vertical:last-of-type{margin-right:0}.i-header-vertical-link{color:#fff;display:inline-block;font-size:14px;font-weight:300;line-height:20px;padding-top:16px;position:relative;text-decoration:none;text-transform:uppercase}.i-header-vertical-link[href]:hover,.i-header-vertical-link[href]:focus,.i-header-vertical-link[href]:active{color:#a0bdda}.i-header-vertical-link--active{cursor:default;text-decoration:underline;text-underline-offset:4px;text-decoration-color:#f60;text-decoration-thickness:3px;z-index:1}.i-header-vertical--border{position:relative}.i-header-vertical--border a{margin-right:16px}@media(min-width: 960px){.i-header-vertical--border a{margin-right:24px}}.i-header-vertical--border:after{background-color:#fff;content:"";display:inline-block;height:24px;position:absolute;right:0;bottom:0;width:1px}.i-header .i-header-slot--services{align-items:flex-start;display:flex;justify-content:flex-end;line-height:1;margin-right:-8px;margin-top:10px;column-gap:8px}@media(min-width: 600px){.i-header .i-header-slot--services{align-self:flex-end;margin-right:-12px}}@media(min-width: 840px){.i-header .i-header-slot--services{align-items:center;margin-left:30px;margin-top:0}}@media(min-width: 1280px){.i-header .i-header-slot--services{margin-right:0}}@media(min-width: 1312px){.i-header .i-header-slot--services{margin-right:-16px}}@media(min-width: 600px){.i-header .i-header-slot--services[data-state-login=logged-in] .i-header-slot--wishlist:hover{background-color:rgba(160,189,218,.3);border-radius:4px}}.i-header .i-header-slot--services[data-state-login=logged-in] .i-wishlist-element-heart-loggedOut,.i-header .i-header-slot--services[data-state-login=logged-out] .i-wishlist-element-heart-loggedIn,.i-header .i-header-slot--services[data-state-login=logged-in] .i-wishlist-element-loggedout-heart,.i-header .i-header-slot--services[data-state-login=logged-out] .i-wishlist-element-heart>span:first-child{display:none}.i-header .i-header-slot--services[data-state-login=logged-out] .i-wishlist-element-content{border-radius:4px 4px 0 0}.i-header .i-header-slot--services[data-state-login=logged-out] .i-wishlist-element-content>div:nth-child(2){box-shadow:-2px 4px 4px 0px rgba(45,45,45,.2);left:unset;right:0;top:100%;transform-origin:top;animation:flyout-reveal 150ms ease-out 0s 1 forwards}.i-header .i-header-slot--services[data-state-login=logged-out] .i-wishlist-element-content>div:nth-child(2)>*{animation:flyout-content-fade-in 150ms ease-out 75ms 1 forwards}@supports not (-webkit-touch-callout: none){.i-header .i-header-slot--services[data-state-login=logged-out] .i-wishlist-element-content>div:nth-child(2)>*{opacity:0}}.i-header .i-header-slot--wishlist{display:block;padding-left:0;padding-right:0}.i-header .i-wishlist-element-link{border-radius:4px 4px 0 0;color:#fff;display:block;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;height:100%;line-height:1;margin:0;padding:8px;position:relative;text-align:center;text-decoration:none}@media(min-width: 600px){.i-header .i-wishlist-element-link{padding:4px 12px}}@media(min-width: 1280px){.i-header .i-wishlist-element-link{padding:14px 16px}}.i-header .i-wishlist-element-link:hover{background-color:unset;cursor:pointer;color:#fff !important}.i-header .i-wishlist-element-link:active,.i-header .i-wishlist-element-link:focus{background-color:unset}.i-header .i-wishlist-element-link:has(button.hover){background-color:#fff}.i-header .i-wishlist-element-heart{display:block;height:unset;margin:0;padding:0;position:relative;width:unset}@media(min-width: 960px){.i-header .i-wishlist-element-heart{margin-bottom:0;margin-top:0}}.i-header .i-wishlist-element-heart .SVGInline{display:inline;height:unset;width:unset}.i-header .i-wishlist-element-heart.i-wishlist-element-animated{animation-duration:1s;animation-fill-mode:initial;animation-name:wishlist-element-pulse}.i-header .i-wishlist-element-heart.i-wishlist-element-animated .i-wishlist-element-size{color:#0a3761;visibility:visible}.i-header .i-wishlist-element-size{display:none}.i-header .i-wishlist-element-content{align-items:center;display:flex;height:100%;justify-content:center;margin:0 auto;padding:0}@media(min-width: 480px){.i-header .i-wishlist-element-content{flex-direction:column;justify-content:center}}@media(min-width: 1280px){.i-header .i-wishlist-element-content{flex-direction:row}}.i-header .i-wishlist-element-content:focus{background-color:rgba(0,0,0,0);color:#fff}.i-header .i-wishlist-element-content:focus svg{fill:#fff}@media(min-width: 600px){.i-header .i-wishlist-element-content-wrapper{align-items:center;display:flex;flex-direction:column}}@media(min-width: 840px){.i-header .i-wishlist-element-content-wrapper{padding:0}}@media(min-width: 1280px){.i-header .i-wishlist-element-content-wrapper{flex-direction:row}}.i-header .i-wishlist-element-text{display:none;margin:0;padding:0;white-space:nowrap}@media(min-width: 600px){.i-header .i-wishlist-element-text{display:flex;font-size:12px;line-height:18px}}@media(min-width: 1280px){.i-header .i-wishlist-element-text{display:flex;font-size:14px;line-height:20px}}.i-header header-wishlist svg{fill:#fff;display:block;height:24px !important;overflow:visible;width:24px !important}@media(min-width: 600px){.i-header header-wishlist svg{margin-bottom:2px}}@media(min-width: 1280px){.i-header header-wishlist svg{margin-bottom:0;margin-right:4px}}.i-header header-wishlist [class*=OverlayMask]{animation:150ms ease-out 0s 1 overlay-mask-fade-in;background-color:rgba(0,0,0,.6) !important}@keyframes wishlist-element-pulse{from{transform:scale3d(1, 1, 1)}50%{transform:scale3d(1.2, 1.2, 1.2)}to{box-shadow:0 0 0 0 #fff}}.i-header .i-header-slot--services[data-state-login=logged-in] .i-header-slot-icon-loggedOut,.i-header .i-header-slot--services[data-state-login=logged-out] .i-header-slot-icon-loggedIn{display:none}.i-header .i-header-slot--priceAlert{position:relative}@media(min-width: 600px){.i-header .i-header-slot--priceAlert{margin-right:8px}}.i-header .i-header-slot--priceAlert:after{background-color:#fff;content:"";display:none;height:32px;position:absolute;right:0;width:1px;bottom:2px}@media(min-width: 600px){.i-header .i-header-slot--priceAlert:after{height:48px;display:inline-block;right:-8px}}@media(min-width: 840px){.i-header .i-header-slot--priceAlert:after{height:48px}}@media(min-width: 1280px){.i-header .i-header-slot--priceAlert:after{bottom:10px;height:32px}}.i-header .i-header-slot--priceAlert a{align-items:center;border-radius:4px;display:flex;color:#fff !important;flex-direction:column;padding:8px;text-decoration:none}@media(min-width: 600px){.i-header .i-header-slot--priceAlert a{padding:4px 4px 4px 12px}}@media(min-width: 1280px){.i-header .i-header-slot--priceAlert a{flex-direction:row;padding:14px 8px 14px 16px}}@media(min-width: 600px){.i-header .i-header-slot--priceAlert a:hover{background-color:rgba(160,189,218,.3)}}.i-header .i-header-slot--priceAlert svg{display:block;height:24px !important;width:24px !important}@media(min-width: 600px){.i-header .i-header-slot--priceAlert svg{margin-bottom:2px;margin-right:8px}}@media(min-width: 1280px){.i-header .i-header-slot--priceAlert svg{margin-bottom:0;margin-right:4px}}.i-header .i-priceAlert-link-text{display:none;margin-right:8px;white-space:nowrap}@media(min-width: 600px){.i-header .i-priceAlert-link-text{display:flex;font-size:12px;line-height:18px}}@media(min-width: 1280px){.i-header .i-priceAlert-link-text{display:flex;font-size:14px;line-height:20px}}.i-header .i-header-slot--services[data-state-login=logged-in] .myidealo-button-username{border:unset}.i-header .i-header-slot--account{padding:0}@media(min-width: 600px){.i-header .i-header-slot--account{position:relative}}@media(min-width: 960px){.i-header .myidealo-button-wrapper{flex-direction:column}}@media(min-width: 1280px){.i-header .myidealo-button-wrapper{flex-direction:row}}.i-header .myidealo-button{border-radius:4px;padding:8px}@media(min-width: 600px){.i-header .myidealo-button{padding:4px 12px}}@media(min-width: 840px){.i-header .myidealo-button{padding-bottom:3px}}@media(min-width: 1280px){.i-header .myidealo-button{padding:14px 16px}}.i-header .myidealo-button-icon{height:unset;margin:0 !important;width:unset}.i-header .myidealo-button-icon svg{height:24px !important;width:24px !important}@media(min-width: 600px){.i-header .myidealo-button-icon svg{margin-bottom:2px}}@media(min-width: 1280px){.i-header .myidealo-button-icon svg{margin-bottom:0;margin-right:4px}}.i-header .myidealo-button-greeting-text-wrapper,.i-header .myidealo-button-text{display:none}@media(min-width: 600px){.i-header .myidealo-button-greeting-text-wrapper,.i-header .myidealo-button-text{display:flex;font-size:12px;line-height:18px}}@media(min-width: 1280px){.i-header .myidealo-button-greeting-text-wrapper,.i-header .myidealo-button-text{display:flex;font-size:14px;line-height:20px}}.i-header .myidealo-toggle:not(:checked)+.myidealo-button:hover{background-color:unset !important}@media(min-width: 600px){.i-header .myidealo-toggle:not(:checked)+.myidealo-button:hover{background-color:rgba(160,189,218,.3) !important}}.i-header .myidealo-toggle:checked+.myidealo-button{border-radius:4px 4px 0 0}.myidealo-menu{transform-origin:top;animation:flyout-reveal 150ms ease-out 0s 1 forwards}.myidealo-menu>*{animation:flyout-content-fade-in 150ms ease-out 75ms 1 forwards}@supports not (-webkit-touch-callout: none){.myidealo-menu>*{opacity:0}}@media(min-width: 600px){.myidealo-menu{box-shadow:-2px 4px 4px 0px rgba(45,45,45,.2);left:unset !important;right:-12px !important;top:100%}}@media(min-width: 960px){.myidealo-menu{right:-20px !important}}@media(min-width: 1280px){.myidealo-menu{right:0 !important}}.myidealo-toggle{background-color:rgba(0,0,0,0) !important}.myidealo-toggle:hover{background-color:rgba(0,0,0,0) !important}.myidealo-mask{animation:150ms ease-out 0s 1 overlay-mask-fade-in;background-color:rgba(0,0,0,.6) !important}.i-navigation{height:100%;margin-right:8px}.i-navigation::after{animation:150ms ease-out 0s 1 overlay-mask-fade-in;background-color:rgba(0,0,0,.6);content:"";cursor:auto;display:none;inset:0;position:fixed;z-index:-100}.i-navigation.i-navigation--active .i-navigation-link{background-color:#fff;color:#2d2d2d;border-radius:4px 4px 0 0}.i-navigation.i-navigation--active .i-navigation-link:hover,.i-navigation.i-navigation--active .i-navigation-link:focus,.i-navigation.i-navigation--active .i-navigation-link:active{background-color:#fff}.i-navigation .i-navigation-text{display:none}.i-navigation .i-navigation-link{align-items:center;color:#fff;cursor:pointer;display:flex;height:100%;text-align:center;text-decoration:none;transition:background-color 150ms ease-out;border-radius:4px}@media(min-width: 480px){.i-navigation .i-navigation-link{flex-direction:column;justify-content:center}}@media(min-width: 960px){.i-navigation .i-navigation-link{flex-direction:row}}@media(min-width: 600px){.i-navigation .i-navigation-link:hover,.i-navigation .i-navigation-link:active{background-color:rgba(160,189,218,.3)}}.i-navigation .i-navigation-icon{display:block}@media(min-width: 320px){.i-navigation .i-navigation-icon{padding:8px}}@media(min-width: 600px){.i-navigation .i-navigation-icon{padding:14px 12px}}@media(min-width: 960px){.i-navigation .i-navigation-icon{display:inline-block;margin-bottom:0;padding:14px 16px}}.i-navigation .i-navigation-icon svg{display:block;height:24px;width:24px}.i-navigation .i-navigation-icon--closed{display:block;fill:#fff}.i-navigation .i-navigation-icon--open{display:none}.i-navigation .i-navigation-overlay{background-color:#fff;bottom:0;display:none;height:100%;left:0;max-width:1280px;overflow:hidden;position:fixed;right:0;top:0;width:100%;z-index:100}@media(min-width: 600px){.i-navigation .i-navigation-overlay{background-color:rgba(0,0,0,0);bottom:auto;height:auto;left:auto;margin:0 auto;overflow:visible;position:absolute;top:auto}}@media(min-width: 1280px){.i-navigation .i-navigation-overlay{right:auto}}@media(min-width: 1312px){.i-navigation .i-navigation-overlay{max-width:1312px}}.i-navigation.i-navigation--overlay-open .i-navigation-overlay{display:flex}@media(min-width: 600px){.i-navigation.i-navigation--overlay-open .i-navigation-overlay{display:block}}.i-navigation.i-navigation--overlay-open::after{display:block}.i-navigation.i-navigation--overlay-open .i-navigation-icon--closed{display:none}.i-navigation.i-navigation--overlay-open .i-navigation-icon--open{display:block;fill:#000}.i-search{display:block;height:100%;padding:0;position:relative;width:100%;max-height:48px}.i-search .i-search-form{align-items:stretch;background-color:#fff;border-radius:4px;display:flex;flex-flow:row;flex-wrap:nowrap;height:100%;margin:0;overflow:hidden;position:relative;z-index:3}.i-search .i-search-label{align-self:center;color:#2d2d2d;display:block;flex:1 0 auto}.i-search .i-search-label{clip:rect(1px, 1px, 1px, 1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.i-search .i-search-input{appearance:none;background-color:rgba(0,0,0,0);border:0 none;color:#2d2d2d;display:block;flex:1 1 auto;font-size:18px;height:auto;margin:0;outline:0 none;padding-left:16px;text-overflow:ellipsis;width:50%}.i-search .i-search-input::placeholder,.i-search .i-search-input:focus::-webkit-input-placeholder{color:#767676}.i-search .i-search-input::-webkit-search-cancel-button{display:none}.i-search .i-search-input::-ms-clear{display:none}.i-search .i-search-input:focus{border:0;box-shadow:none}.i-search .i-search-overlay{background-color:#fff;border-radius:0 0 4px 4px;box-shadow:0 0 5px 2px rgba(45,45,45,.5);display:none;left:0;overflow:hidden;position:absolute;right:0;top:100%;transform:translate(0, -2px);z-index:2;transform-origin:top;animation:flyout-reveal 150ms ease-out 0s 1 forwards}.i-search .i-search-overlay>*{animation:flyout-content-fade-in 150ms ease-out 75ms 1 forwards}@supports not (-webkit-touch-callout: none){.i-search .i-search-overlay>*{opacity:0}}.i-search.i-search--overlay-open .i-search-form{border-radius:4px 4px 0 0}.i-search.i-search--overlay-open .i-search-overlay{display:block}.i-search.i-search--overlay-open::after{animation:150ms ease-out 0s 1 overlay-mask-fade-in;background-color:rgba(0,0,0,.6);bottom:0;content:"";cursor:auto;display:block;inset:0;position:fixed;z-index:-100}.i-search-progress-bar::before,.i-search-progress-bar::after{background:linear-gradient(to right, rgba(255, 102, 0, 0.333) 50%, rgb(255, 102, 0) 90%, rgb(221, 68, 0));content:"";height:1px;left:0;opacity:0;position:absolute;right:10px;top:1px;transform:scaleX(0);transform-origin:left}.i-search-progress-bar::before{filter:blur(4px);right:5px}.i-search-progress-bar.i-search-progress-bar--loading::before,.i-search-progress-bar.i-search-progress-bar--loading::after{opacity:1;transform:scaleX(1);transition:opacity .75s ease-in,transform 15s cubic-bezier(0, 0, 0, 1)}.i-search-button{appearance:none;background-color:rgba(0,0,0,0);border:0 none;border-radius:2px;color:#d2d2d2;cursor:pointer;display:block;flex:0 0 48px;height:48px;line-height:1;padding:0 16px;transition:color 150ms ease-out}.i-search-button:hover,.i-search-button:focus,.i-search-button:active{background:none;color:#767676}.i-search-button:focus{outline:1px dotted #d40}.i-search-button svg{display:block;fill:currentColor;height:100%;outline:0 none;width:100%}.i-search-button svg:focus{outline:0 none}.i-search-button--submit{font-size:23px;opacity:1;right:5px}.i-search-button--submit:hover,.i-search-button--submit:focus,.i-search-button--submit:active,.i-search-input:focus~.i-search-button--submit{color:#f60}.i-search-button--submit svg{height:24px;width:24px}.i-search-button--cancel{position:relative;display:none;padding-right:17px}.i-search-input:not(:placeholder-shown)~.i-search-button--cancel{display:block;color:#b4b4b4}.i-search-input:not(:placeholder-shown)~.i-search-button--cancel:hover{color:#2d2d2d}.i-search-button--cancel::after{background-color:#b4b4b4;content:"";display:block;position:absolute;height:32px;right:0px;top:50%;transform:translateY(-50%);width:1px}.i-search-button--cancel svg{height:16px;width:16px}.i-navigation-overlay{cursor:default;display:flex;background-color:rgba(0,0,0,0);flex-direction:column;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;max-height:100%;text-align:left;transform-origin:top;animation:flyout-reveal 150ms ease-out 0s 1 forwards}.i-navigation-overlay>*{animation:flyout-content-fade-in 150ms ease-out 75ms 1 forwards}@supports not (-webkit-touch-callout: none){.i-navigation-overlay>*{opacity:0}}.i-navigation-overlay .i-navigation-overlay-header{display:grid;display:-ms-grid;flex:1 0 auto;grid-template-columns:auto min-content;-ms-grid-columns:auto min-content;padding-bottom:5px;width:100%}@media(min-width: 600px){.i-navigation-overlay .i-navigation-overlay-header{display:none}}.i-navigation-overlay .i-navigation-overlay-wrapper{background:#fff;color:#2d2d2d;display:flex;flex:1 1 200%;flex-direction:row;flex-wrap:nowrap;justify-items:stretch;margin:0 auto;max-width:1280px;min-width:320px;overflow:hidden;padding:0;transform:translate(0, 0);transition:transform ease-in-out 300ms;width:200%}@media(min-width: 600px){.i-navigation-overlay .i-navigation-overlay-wrapper{display:grid;display:-ms-grid;flex-basis:auto;-ms-grid-columns:1fr 3fr;overflow-x:hidden;padding:35px;transform:none;transition:none;width:auto}}@media(min-width: 1312px){.i-navigation-overlay .i-navigation-overlay-wrapper{max-width:1312px}}.i-navigation-overlay.i-navigation-overlay--has-selection .i-navigation-overlay-btn-display--back{display:block}.i-navigation-overlay.i-navigation-overlay--has-selection .i-navigation-overlay-btn-display--close{display:none}.i-navigation-overlay.i-navigation-overlay--has-selection .i-navigation-overlay-wrapper{transform:translate(-50%, 0)}@media(min-width: 600px){.i-navigation-overlay.i-navigation-overlay--has-selection .i-navigation-overlay-wrapper{transform:none}}.i-navigation-overlay .i-navigation-overlay-btn{background-color:rgba(0,0,0,0);border:0 none;color:#2d2d2d;cursor:pointer;font-size:18px;font-weight:bold;line-height:1;margin:0;padding:10px}.i-navigation-overlay .i-navigation-overlay-btn:hover,.i-navigation-overlay .i-navigation-overlay-btn:focus,.i-navigation-overlay .i-navigation-overlay-btn:active{background-color:#fff;color:#f60;outline:0}.i-navigation-overlay .i-navigation-overlay-btn-display{align-items:center;color:inherit;display:grid;display:-ms-grid;grid-template-columns:min-content auto;-ms-grid-columns:min-content auto}.i-navigation-overlay .i-navigation-overlay-btn-display svg{fill:currentColor}.i-navigation-overlay .i-navigation-overlay-btn-display--back{display:none}.i-navigation-list{flex:1 0 50%;margin:0;overflow-y:auto;padding:0 15px}@media(min-width: 480px){.i-navigation-list{display:grid;display:-ms-grid;grid-auto-rows:min-content;grid-template-columns:1fr 1fr;-ms-grid-columns:1fr 1fr}}@media(min-width: 600px){.i-navigation-list{display:block;overflow:hidden}}.i-navigation-list .i-navigation-list-item{align-self:start;color:#2d2d2d;font-size:1rem;justify-self:stretch;line-height:1.2;list-style-type:none;overflow:hidden}@media(min-width: 600px){.i-navigation-list .i-navigation-list-item--active,.i-navigation-list .i-navigation-list-item--preselected{font-weight:bold}}.i-navigation-list .i-navigation-list-item--more{font-weight:bold}.i-navigation-list .i-navigation-list-link{color:inherit;display:block;font-size:16px;font-weight:inherit;overflow:hidden;padding-bottom:15px;padding-top:5px;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}@media(min-width: 600px){.i-navigation-list .i-navigation-list-link{padding-bottom:5px}}.i-navigation-list .i-navigation-list-link:hover,.i-navigation-list .i-navigation-list-link:focus,.i-navigation-list .i-navigation-list-link:active{color:#2d2d2d;font-weight:bold}.i-navigation-list--sub{display:none;grid-column:2;-ms-grid-column:2}@media(min-width: 600px){.i-navigation-list--sub{padding:0 0 0 40px}}.i-navigation-list--sub.i-navigation-list--active{display:block}@media(min-width: 480px){@supports(display: grid){.i-navigation-list--sub.i-navigation-list--active{display:grid;display:-ms-grid;grid-auto-rows:min-content;-ms-grid-columns:1fr 1fr}}}@media(min-width: 960px){@supports(display: grid){.i-navigation-list--sub.i-navigation-list--active{grid-template-columns:1fr 1fr 1fr}}}.i-navigation-list--sub.i-navigation-list--active .i-navigation-list-item{margin-bottom:0}.i-navigation-list--sub .i-navigation-list-item{display:inline-block;width:30%}@supports(display: grid){.i-navigation-list--sub .i-navigation-list-item{display:block;width:auto}}.i-navigation-list--main{grid-column:1;-ms-grid-column:1}@media(min-width: 600px){.i-navigation-list--main{border-right:1px solid #e6e6e6}}.i-suggest-trending{position:relative;padding-bottom:3px}.i-suggest-trending:not(:last-child){border-bottom:1px solid #b4b4b4}.i-suggest-trending .fade-away{background-image:linear-gradient(to right, rgba(255, 255, 255, 0), rgb(255, 255, 255));top:38px;height:30px;position:absolute;right:8px;width:35px}.i-suggest-trending-list{direction:ltr;display:flex;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;margin:0 0 0 12px;overflow-x:auto;padding:10px 0 20px 0;width:calc(100% - 28px)}@media screen and (min-height: 600px)and (orientation: landscape),screen and (min-width: 600px)and (orientation: portrait){.i-suggest-trending-list{display:flex;flex-wrap:wrap;height:89px;overflow:hidden}.fade-away{display:none}}.i-suggest-trending-list-item{align-items:center;background-color:#d7e3ef;border-radius:2px;display:flex;height:30px;justify-content:center;list-style-type:none;margin:4px}.i-suggest-trending-list-item:active{background-color:#a0bdda}.i-suggest-trending-link{color:#587ca6;text-decoration:none;padding:10px}.i-suggest-trending-link:hover{color:#385f8c}.i-suggest-trending-name{vertical-align:middle;white-space:nowrap}.i-suggest{border-top:1px solid #b4b4b4}@media screen and (min-height: 600px)and (orientation: landscape),screen and (min-width: 600px)and (orientation: portrait){.i-suggest.i-suggester-entries .i-suggest-autocomplete-btn{display:none}}.i-suggest-autocomplete-btn{color:#b4b4b4;display:inline-block;flex:0 0 44px;padding:10px}.i-suggest-icon{display:block;fill:currentColor;height:100%;width:auto}.i-suggest-icon.i-suggest-icon--recent{color:#b4b4b4;display:inline-block;margin-right:5px;min-width:24px;max-width:24px;vertical-align:middle}.i-suggest-icon.i-suggest-icon--autocomplete{transform:rotate(45deg)}.i-suggest-button-delete{background-color:rgba(0,0,0,0);border:none;color:#0771d0;cursor:pointer;display:inline-block;font-size:14px;line-height:1;margin-bottom:-5px;margin-right:-10px;margin-top:-5px;padding:5px 16px;text-align:center}.i-suggest-button-delete:hover,.i-suggest-button-delete:focus,.i-suggest-button-delete:active{background-color:rgba(0,0,0,0);color:#f60}.i-suggest-text{align-self:center;color:#b4b4b4;font-size:14px;font-weight:700;text-transform:uppercase}.i-suggest-title{display:flex;justify-content:space-between;padding:10px 10px 0 16px}.i-suggest-list{color:#2d2d2d;font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1;margin:0;padding:10px 0 10px 10px}@media screen and (min-height: 600px)and (orientation: landscape),screen and (min-width: 600px)and (orientation: portrait){.i-suggest-list{padding:10px}}.i-suggest-list+.i-suggest-title{border-top:1px solid #b4b4b4;padding-top:15px}.i-suggest-item{align-items:center;display:flex;flex-wrap:nowrap;list-style-type:none;margin:0 0 8px}@media screen and (min-height: 600px)and (orientation: landscape),screen and (min-width: 600px)and (orientation: portrait){.i-suggest-item{margin-bottom:16px}}.i-suggest-item:last-child{margin-bottom:0}.i-suggest-link{color:#2d2d2d;display:flex;flex:1 1 100%;padding:5px 5px;position:relative;text-decoration:none}.i-suggest-item--active .i-suggest-link,.i-suggest-link:hover,.i-suggest-link:focus,.i-suggest-link:active{background-color:rgba(160,189,218,.3);color:#2d2d2d}.i-suggest-details{display:block;flex:1 1 100%;line-height:20px;max-width:100%}.i-suggest-highlight,mark{background-color:rgba(0,0,0,0);color:#2d2d2d;display:inline-block;font-weight:400}.i-suggest-trending-badge{align-items:center;background-color:#d7e3ef;border-radius:2px;color:#587ca6;display:inline-flex;font-size:11px;font-weight:700;height:17px;justify-content:center;margin:0 0 0 5px;padding:2px}.i-suggest-name{display:inline;font-weight:700;vertical-align:middle}.i-suggest-meta{color:#767676;display:inline;font-weight:400;vertical-align:middle}
|
||
|
||
/*]]>*/</style>
|
||
<section id="i-app-banner" class="i-app-banner" data-testid="appBanner">
|
||
<button type="button" class="i-app-banner-close" aria-label="Close banner" id="i-app-banner-close">
|
||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M13.414,12l9.293-9.293a1,1,0,0,0-1.414-1.414L12,10.586,2.707,1.293A1,1,0,0,0,1.293,2.707L10.586,12,1.293,21.293a1,1,0,1,0,1.414,1.414L12,13.414l9.293,9.293a1,1,0,0,0,1.414-1.414Z"></path>
|
||
</svg>
|
||
</button>
|
||
|
||
<div class="i-app-banner-wrapper">
|
||
<img id="i-app-banner-icon" src="//cdn.idealo.com/storage/design-system-assets/webp/app_icon.webp" alt="idealo app icon" height="40" width="40"/>
|
||
|
||
<div class="i-app-banner-text-wrapper">
|
||
<p class="i-app-banner-title">idealo: Produkt Preisvergleich</p>
|
||
<p class="i-app-banner-subtitle" id="i-app-banner-subtitle">Die besten Angebote für Deine Lieblingsprodukte</p>
|
||
</div>
|
||
|
||
<button type="button" class="i-app-banner-link-button" id="i-app-banner-button">
|
||
<span id="i-app-banner-button-text">Installieren</span>
|
||
</button>
|
||
</div>
|
||
</section>
|
||
|
||
<div class="i-header-grid" data-header-variant="A">
|
||
|
||
<div class="i-header-brand" data-country="DE" data-navigation-url="https://cdn.idealo.com/storage/assets/navigation/navigation_de_DE.json">
|
||
<nav class="i-header-navigation">
|
||
<div class="i-navigation">
|
||
<a id="i-header-navigation" class="i-navigation-link" aria-expanded="false" aria-haspopup="true" aria-label="Kategorien" aria-pressed="false" role="button" href="https://www.idealo.de/preisvergleich/Sitemap.html" title="Kategorien">
|
||
|
||
<div class="i-navigation-icon i-navigation-icon--closed">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M22 13H2a1 1 0 010-2h20a1 1 0 010 2zm1 5a1 1 0 00-1-1H2a1 1 0 000 2h20a1 1 0 001-1zm0-12a1 1 0 00-1-1H2a1 1 0 000 2h20a1 1 0 001-1z"></path>
|
||
</svg>
|
||
</div>
|
||
|
||
<div class="i-navigation-icon i-navigation-icon--open">
|
||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M13.414,12l9.293-9.293a1,1,0,0,0-1.414-1.414L12,10.586,2.707,1.293A1,1,0,0,0,1.293,2.707L10.586,12,1.293,21.293a1,1,0,1,0,1.414,1.414L12,13.414l9.293,9.293a1,1,0,0,0,1.414-1.414Z"></path>
|
||
</svg>
|
||
</div>
|
||
|
||
</a>
|
||
</div>
|
||
</nav>
|
||
<a class="i-header-logo" href="https://www.idealo.de" data-tracking-id="i-header-logo">
|
||
<svg class="i-header-logo-image" version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 657 200" width="200" height="60" x="0" y="0">
|
||
<title>idealo - Deutschlands großer Preisvergleich</title>
|
||
<path fill="#FFFFFF" d="M0 0h34v27H0zm0 41h34v93H0zm54 34.2c0-6.3-.1-12 1-17.1 1.1-5.1 3.5-10 7.1-13.7C65.7 40.8 71 38 77.9 36s16.2-3 27.9-3h8.4c3.8 0 7.6.3 11.2.9 3.7.6 7 1.6 10.1 3.2 3.1 1.5 5.6 3.6 7.7 6.1 2 2.5 3.2 5.7 3.8 9.5l.1-52.7h33.8v132.9H149V115c-1 3.1-2.8 5.1-4.5 7.4-1.7 2.4-3.9 4.4-6.7 6.2-2.8 1.7-6.4 3-10.4 3.9-4 .9-7.8 1.3-13.3 1.3h-8.2c-11.7 0-21-1-27.9-3-6.9-2-12.2-4.8-15.9-8.5-3.6-3.6-6-7.3-7.1-12.4-1.1-5.1-1-10.8-1-17.1V75.2zm32.8 14.3c0 2.8.2 5.3.6 7.6.4 2.3 1.3 4.1 2.6 5.6s3.3 2.6 5.9 3.4c2.6.8 6.2 1.2 10.9 1.2h18.5c3.7 0 7-.3 9.9-.8 2.9-.5 5.3-1.5 7.2-2.9 1.9-1.4 3.4-3.3 4.3-5.7 1-2.4 1.5-5.5 1.5-9.4v-10c0-3.9-.5-7-1.5-9.4-1-2.4-2.4-4.3-4.3-5.7-1.9-1.4-4.3-2.4-7.2-2.9-2.9-.5-6.2-.8-9.9-.8h-18.5c-4.6 0-8.2.4-10.9 1.2-2.6.8-4.6 1.9-5.9 3.4-1.3 1.5-2.2 3.3-2.6 5.6-.4 2.3-.6 4.8-.6 7.6v12zM288.2 107c-.5 5.1-5.4 6.1-13.3 6.1h-23.4c-8 0-16.8-4-16.8-12.6v-6.7h87V77.3c0-32.6-15-44.3-52.7-44.3h-25c-25.7 0-43 11.4-43 47.1v9.2c0 40.3 23.4 44.7 46.9 44.7h33.8c29.4 0 39.9-5.9 40.2-27h-33.7zm-53.3-37.4c0-10.3 4.1-15.8 17.1-15.8h20.1c12.9 0 17.1 5.4 17.1 15.8V74H235v-4.4zM335 98.9c0-26 37-24.8 40.2-24.8H402c6.9 0 16.3 2.3 19.5 5.7l.6.6V69.8c0-10.3-3.9-16-16.8-16h-20.1c-10.8 0-16.7 1.5-16.7 6.2H338c0-20.2 16.3-27 42.4-27H420c23.6 0 35.9 12.4 35.9 35.2V133h-33.8v-12.6l-2 3.5c-5.7 8.2-10.1 10.1-27.3 10.1H369c-21 0-34-4.4-34-26.9v-8.2zm74.4 15.3c9.3 0 12.9-3.7 12.9-10.6 0-12-3-13.7-21.2-13.9h-16.2c-13.5-.1-16.8 3.3-16.9 10.5-.2 11 3.4 14 16.9 14h24.5zM476 134h34V0h-34v134zm53-62.4c0-32.1 21.1-38.6 39.7-38.6h48.5c18.6 0 39.7 6.5 39.7 38.6v23.8c0 32.1-21.1 38.6-39.7 38.6h-48.5c-18.6 0-39.7-6.5-39.7-38.6V71.6zm32.8 17.7c0 2.8.2 5.4.6 7.6.4 2.3 1.3 4.2 2.6 5.6 1.3 1.5 3.4 2.6 6 3.4 2.7.8 6.4 1.2 11.1 1.2h18.5c3.8 0 7.1-.3 10.1-.8s5.4-1.5 7.4-2.9 3.4-3.3 4.4-5.7c1-2.4 1.5-5.6 1.5-9.5v-9.6c0-3.9-.5-7-1.5-9.5-1-2.4-2.5-4.3-4.4-5.7-2-1.4-4.4-2.4-7.4-2.9s-6.3-.8-10.1-.8h-18.5c-4.7 0-8.4.4-11.1 1.2-2.7.8-4.7 1.9-6 3.4-1.3 1.5-2.2 3.4-2.6 5.6-.4 2.3-.6 4.8-.6 7.6v11.8z"></path>
|
||
<path fill="#FF6600" d="M0 200h657v-27H0v27z"></path>
|
||
</svg>
|
||
</a>
|
||
</div>
|
||
|
||
|
||
<div class="i-header-slot--search" id="i-search-wrapper" data-country="DE" data-trending-url="https://cdn.idealo.com/storage/assets/trending-searches/trending_searches_de_DE.json" data-suggest-host="https://www.idealo.de" data-submit-action-url="https://www.idealo.de/preisvergleich/MainSearchProductCategory.html">
|
||
<div class="i-search">
|
||
<form id="i-header-search" class="i-search-form" role="search" aria-expanded="false" aria-haspopup="true" action="https://www.idealo.de/preisvergleich/MainSearchProductCategory.html" method="get">
|
||
|
||
<label class="i-search-label" for="i-search-input">Ich suche ...</label>
|
||
<input type="search" class="i-search-input" id="i-search-input" name="q" value="" placeholder="Ich suche ..." autocomplete="off" autocapitalize="off" spellcheck="false"/>
|
||
|
||
<button type="reset" class="i-search-button i-search-button--cancel" title="Abbrechen" tabindex="-1">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M22.414 19.586a2 2 0 11-2.828 2.828L12 14.828l-7.586 7.586a2 2 0 01-2.828-2.828L9.172 12 1.586 4.414a2 2 0 012.828-2.828L12 9.172l7.586-7.586a2 2 0 112.828 2.828L14.828 12z"></path>
|
||
</svg>
|
||
</button>
|
||
|
||
<button type="submit" class="i-search-button i-search-button--submit" title="Suchen">
|
||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M22.658,21.28,17.9,16.522a9.558,9.558,0,1,0-1.424,1.4l4.768,4.768a1,1,0,1,0,1.414-1.414ZM3.049,10.513a7.5,7.5,0,1,1,7.5,7.5A7.509,7.509,0,0,1,3.049,10.513Z"></path>
|
||
</svg>
|
||
</button>
|
||
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="i-header-slot--services" data-state-login="logged-out">
|
||
<header-wishlist class="i-header-slot--wishlist i-wishlist-element" data-site="de">
|
||
<a href="//www.idealo.de/wishlist/de" class="i-wishlist-element-link" aria-label="Merkzettel" title="Merkzettel">
|
||
<div class="i-wishlist-element-content">
|
||
<div class="i-wishlist-element-content-wrapper">
|
||
<span class="i-wishlist-element-heart i-wishlist-element-heart-loggedIn">
|
||
<svg aria-hidden="true" height="24" width="24" viewBox="0 0 24 24" data-icon="heart" role="img">
|
||
<path d="M21.3 3.8a5.6 5.6 0 00-8.1 0L12 5l-1.2-1.2a5.6 5.6 0 00-8.1 0 6.2 6.2 0 000 8.5l1.2 1.2L12 22l8.1-8.5 1.2-1.2a6.2 6.2 0 000-8.5z"></path>
|
||
</svg>
|
||
</span>
|
||
<span class="i-wishlist-element-heart i-wishlist-element-heart-loggedOut">
|
||
<svg aria-hidden="true" height="24" width="24" viewBox="0 0 24 24" data-icon="heart" role="img">
|
||
<path d="M17.25 4a3.61 3.61 0 012.62 1.14 4.2 4.2 0 010 5.74l-1.18 1.23-1.3 1.37-5.38 5.62-.01-.01-5.38-5.6-1.31-1.38-1.18-1.23a4.2 4.2 0 010-5.74 3.58 3.58 0 015.25 0l1.18 1.23L12 7.9l1.45-1.51 1.17-1.23A3.62 3.62 0 0117.25 4m0-2a5.62 5.62 0 00-4.07 1.76L12 5l-1.18-1.23a5.58 5.58 0 00-8.14 0 6.21 6.21 0 000 8.5l1.18 1.24L12 22l8.14-8.5 1.17-1.23a6.21 6.21 0 000-8.5A5.62 5.62 0 0017.25 2z"></path>
|
||
</svg>
|
||
</span>
|
||
<span class="i-wishlist-element-text">Merkzettel</span>
|
||
</div>
|
||
</div>
|
||
</a>
|
||
</header-wishlist>
|
||
|
||
<div class="i-header-slot--priceAlert">
|
||
<a href="//www.idealo.de/pricealerts" title="Preiswecker">
|
||
<span class="i-header-slot-icon-loggedIn"><svg class="i-header-price-alert-logo" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path fill="#ffffff" d="M2 7.03a1 1 0 01-1-1 5 5 0 015-5 1 1 0 010 2 3 3 0 00-3 3 1 1 0 01-1 1zM22 7.02a1 1 0 001-1A5 5 0 0018 1.04a1 1 0 00.01 2 3 3 0 013.01 2.98 1 1 0 001 1zM20.7 21.27a1 1 0 11-1.41 1.41l-1.55-1.54a9.94 9.94 0 01-11.5 0L4.7 22.68a1 1 0 11-1.41-1.41l1.44-1.44a10 10 0 1114.53 0zM13.01 8a1 1 0 00-2 0v5h-3a1 1 0 000 2h4a1 1 0 001-1z"></path>
|
||
</svg></span>
|
||
<span class="i-header-slot-icon-loggedOut"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path fill="#ffffff" d="M2 7.03a1 1 0 01-1-1 5 5 0 015-5 1 1 0 010 2 3 3 0 00-3 3 1 1 0 01-1 1zM22 7.02a1 1 0 001-1A5 5 0 0018 1.04a1 1 0 00.01 2 3 3 0 013.01 2.98 1 1 0 001 1zM20.7 21.27a1 1 0 11-1.41 1.41l-1.55-1.54a9.94 9.94 0 01-11.5 0L4.7 22.68a1 1 0 11-1.41-1.41l1.44-1.44a10 10 0 1114.53 0zm-8.7-.3a8 8 0 10-8-8 8 8 0 008 8zM12 15a1 1 0 001-1V8a1 1 0 00-2 0v5H8a1 1 0 000 2z"></path>
|
||
</svg></span>
|
||
<span class="i-priceAlert-link-text">Preiswecker</span>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="i-header-slot--account"><div class="myidealo" data-domain="https://account.idealo.de" data-state-login="unknown" data-user-info="unknown" data-state-menu="initial" id="MyidealoElement" data-myidealo-build-version="20260422024437" data-csrf-token="boJRglnw7tJhp1hR0JaT0rtBtsJ4PjkefMsnK86LpeZcWM0SWuBm4WCSi-BMn2Bhs7un4951m6NBWl0zHqkTHvm7ltJsYat0" data-csrf-header-name="X-CSRF-TOKEN">
|
||
<style nonce="4/CvbgpJ/1vuoS3imO6+rhiq8CGaQdQyqP4XjzoVOm0=">
|
||
/*<![CDATA[*/
|
||
@keyframes fx-fade-and-scale{0%{opacity:1;transform:scale(0)}to{opacity:0;transform:scale(1)}}.myidealo{height:100%;position:relative;width:100%}.myidealo[data-state-login=logged-in] .hide-for-data-state-login-logged-in,.myidealo[data-state-login=logged-out] .hide-for-data-state-login-logged-out,.myidealo[data-state-login=unknown] .hide-for-data-state-login-unknown,.myidealo[data-state-menu=failed] .hide-for-data-state-menu-failed,.myidealo[data-state-menu=loaded] .hide-for-data-state-menu-loaded,.myidealo[data-state-menu=loading] .hide-for-data-state-menu-loading,.myidealo[data-user-info=exist] .hide-for-data-user-info-exist,.myidealo[data-user-info=unknown] .hide-for-data-user-info-unknown{display:none}.myidealo-toggle:checked+.myidealo-button .show-for-data-state-button-deactivated,.myidealo-toggle:checked~.show-for-data-state-button-deactivated,.myidealo-toggle:not(:checked)+.myidealo-button .show-for-data-state-button-activated,.myidealo-toggle:not(:checked)~.show-for-data-state-button-activated{display:none}.myidealo-toggle{-webkit-appearance:none;appearance:none;height:inherit;left:0;position:absolute!important;top:0;width:inherit}.myidealo-button{color:#fff;cursor:pointer;display:block!important;font-size:.875rem;height:100%;line-height:1;margin:0!important;overflow:hidden;position:relative;text-align:center;text-decoration:none;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;white-space:nowrap;width:100%}.myidealo-button:focus,.myidealo-button:hover{background-color:rgba(160,189,218,.3);color:#fff}.myidealo-toggle:checked+.myidealo-button{background-color:#fff;color:#2d2d2d;z-index:100}.myidealo-button-wrapper{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center}@media print,screen and (min-width:60em){.myidealo-button-wrapper{flex-direction:row}}.myidealo-button-icon{display:inline-block;height:24px;width:24px}@media print,screen and (min-width:37.5em){.myidealo-button-icon{margin-bottom:3px;margin-top:-2px}}@media print,screen and (min-width:60em){.myidealo-button-icon{margin-bottom:0;margin-right:3px}}.myidealo-button-icon svg{display:block;fill:currentcolor;overflow:visible}.myidealo-button-icon-cancel svg{padding:2px}.myidealo-button-text{display:none}@media print,screen and (min-width:37.5em){.myidealo-button-text{display:inherit;white-space:nowrap}}.myidealo-button-greeting-text-wrapper{display:flex;flex-direction:row;justify-content:space-between;line-height:normal}.myidealo-button-greeting{display:none}@media print,screen and (min-width:60em){.myidealo-button-greeting{display:inherit;white-space:nowrap}}.myidealo-button-greeting-text{max-width:13ch;overflow-x:hidden;overflow-y:visible;padding-left:3px;text-overflow:ellipsis;white-space:nowrap}@media print,screen and (min-width:60em){.myidealo-button-greeting-text{display:block}}@media print,screen and (min-width:37.5em){.myidealo-button-greeting-text{display:block}}.myidealo-menu::before{background-color:#fff;bottom:0;content:"";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity 500ms ease-in-out,z-index 500ms step-end;width:100%;z-index:-1}[data-state-menu=loading] .myidealo-menu::before{opacity:1;transition:opacity 500ms ease-in-out,z-index 500ms step-start;z-index:1}[data-state-menu=loading] .myidealo-menu::after{animation:2s infinite ease-in-out;animation-name:fx-fade-and-scale;background:#f60;border-radius:50%;content:"";display:block;height:4rem;left:50%;margin-left:-2rem;margin-top:-2rem;position:absolute;top:50%;width:4rem;z-index:2}.myidealo-menu{background-color:#fff;color:#2d2d2d;cursor:default;min-width:320px;overflow:hidden;right:0;text-align:left;transition:height 1s;z-index:100}@media print,screen and (max-width:37.49875em){.myidealo-menu{inset:0;height:100%;overflow:auto;position:fixed}}@media print,screen and (min-width:37.5em){.myidealo-menu{position:absolute;width:200%}[data-state-menu=loading] .myidealo-menu{min-height:19rem}[data-state-login=logged-out]:not([data-state-menu=failed]) .myidealo-menu{min-width:480px}}@media print,screen and (min-width:52.5em){.myidealo-menu{max-width:1280px}}.myidealo-menu .h2{font-size:1.5rem;font-weight:400;line-height:1;margin:0}.myidealo-menu a{color:#0771d0;text-decoration:none;white-space:nowrap}.myidealo-menu a:focus,.myidealo-menu a:hover{color:#f60}.myidealo-menu ul{line-height:inherit;list-style:none;margin:0 0 1rem;padding:0}.myidealo-menu ul:last-child,.myidealo-menu-body:last-child{margin-bottom:0}.myidealo-menu-body{padding:1.5rem 1rem}@media print,screen and (min-width:30em){.myidealo-menu-body{padding-left:2rem;padding-right:2rem}}@media print,screen and (min-width:60em){.myidealo-menu-body{padding-left:2.5rem;padding-right:2.5rem}}.myidealo-menu-close{padding:1rem;position:absolute;right:0;top:0}.myidealo-menu-entries a{display:block;font-size:1rem!important;padding:.5rem 0}.myidealo-menu-header{padding:1rem}@media print,screen and (max-width:37.49875em){.myidealo-menu-header{border-bottom:1px solid #d2d2d2}}@media print,screen and (min-width:30em){.myidealo-menu-header{padding-left:2rem;padding-right:2rem}}@media print,screen and (min-width:37.5em){.myidealo-menu-header{display:none}}.myidealo-mask{display:none}@media print,screen and (min-width:37.5em){.myidealo-mask{background-color:rgba(10,55,97,.6);inset:0;display:block;margin:0!important;position:fixed;z-index:-2}}html.no-js .myidealo-mask{z-index:1}
|
||
/*]]>*/
|
||
</style>
|
||
<input aria-controls="MyidealoMenu" aria-haspopup="true" class="myidealo-toggle" id="MyidealoToggle" type="checkbox"/>
|
||
<label aria-label="Mein idealo" class="myidealo-button" for="MyidealoToggle">
|
||
<span class="myidealo-button-wrapper">
|
||
<span class="myidealo-button-icon">
|
||
<span class="myidealo-button-icon-user show-for-data-state-button-deactivated hide-for-data-state-login-logged-out"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M17 6a5 5 0 11-5-5 5 5 0 015 5zm.3 6.4a.5.5 0 00-.5 0 8 8 0 01-9.6 0 .5.5 0 00-.5 0A6.8 6.8 0 003 18v3.5A1.5 1.5 0 004.5 23h15a1.5 1.5 0 001.5-1.5V18a6.8 6.8 0 00-3.7-5.6z"></path>
|
||
</svg>
|
||
</span>
|
||
<span class="myidealo-button-icon-user show-for-data-state-button-deactivated hide-for-data-state-login-logged-in hide-for-data-state-login-unknown"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M16.1 14a4.9 4.9 0 012.9 4v2.5a.5.5 0 01-.5.5h-13a.5.5 0 01-.5-.5V18a4.9 4.9 0 012.9-4 8.9 8.9 0 004.1 1 9 9 0 004.1-1m0-2a2 2 0 00-.9.2 7 7 0 01-6.3 0 2.3 2.3 0 00-1-.2 2 2 0 00-1 .3A6.8 6.8 0 003 18v3a2 2 0 002 2h14a2 2 0 002-1.9v-3a6.9 6.9 0 00-4-5.9 1.8 1.8 0 00-.9-.2zM12 3a3 3 0 11-3 3 3 3 0 013-3m0-2a5 5 0 105 5 5 5 0 00-5-5z"></path>
|
||
</svg>
|
||
</span>
|
||
<span class="myidealo-button-icon-cancel show-for-data-state-button-activated"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||
<path d="M13.4 12l9.3-9.3a1 1 0 00-1.4-1.4L12 10.6 2.7 1.3a1 1 0 00-1.4 1.4l9.3 9.3-9.3 9.3a1 1 0 101.4 1.4l9.3-9.3 9.3 9.3a1 1 0 001.4-1.4z"></path>
|
||
</svg>
|
||
</span>
|
||
</span>
|
||
|
||
<span class="hide-for-data-state-login-logged-out">
|
||
<span class="hide-for-data-user-info-exist">
|
||
<span class="myidealo-button-text">Mein idealo</span>
|
||
</span>
|
||
<span class="myidealo-button-greeting-text-wrapper hide-for-data-user-info-unknown">
|
||
<span class="myidealo-button-greeting">Hallo</span>
|
||
<span class="data-hj-suppress myidealo-button-text myidealo-button-username myidealo-button-greeting-text"></span>
|
||
</span>
|
||
</span>
|
||
|
||
<span class="myidealo-button-text hide-for-data-state-login-logged-in hide-for-data-state-login-unknown">Anmelden</span>
|
||
</span>
|
||
</label>
|
||
<div class="myidealo-menu show-for-data-state-button-activated" id="MyidealoMenu" role="menu">
|
||
<!-- <div th:replace="~{fragments/myidealo/myidealoMenuFallback :: content}"></div>-->
|
||
</div>
|
||
<label aria-label="myidealo Menü schließen" class="myidealo-mask show-for-data-state-button-activated" for="MyidealoToggle"></label>
|
||
<script nonce="4/CvbgpJ/1vuoS3imO6+rhiq8CGaQdQyqP4XjzoVOm0=">
|
||
/*<![CDATA[*/
|
||
(()=>{"use strict";var e={267(e,t,n){n.d(t,{R2:()=>a,Ri:()=>i,TV:()=>s,Yj:()=>o});function o(e){if(!i(e.name))return!1
|
||
;document.cookie=`${e.name}=;domain=${e.domain};path=${e.path};expires=Thu, 01 Jan 1970 00:00:00 GMT`;return!0}function i(e,t=!1){
|
||
const n=new RegExp(`[; ]${e}=([^\\s;]*)`),o=(" "+document.cookie).match(n);return e&&o?t?o[1]:decodeURIComponent(o[1]):null}
|
||
function a(e,t=window.location.hostname){if("string"==typeof e){const n=t.split("."),o=n.indexOf(e);if(o>=0)return n.slice(o).join(".")}return t}
|
||
function s(e,t=!1){if("object"!=typeof e)return!1;if(void 0===e.name||void 0===e.value)return!1
|
||
;const n=t?e.value:encodeURIComponent(e.value),o=Object.entries(e).reduce((e,[t,n])=>"name"===t||"value"===t?"":e+";"+t+(n?"="+n:""),"")
|
||
;document.cookie=`${e.name}=${n}${o}`;return!0}},200(e,t,n){n.d(t,{Cg:()=>a,Jt:()=>d,WQ:()=>l});var o=n(764),i=n(592);const a=()=>{let e=(0,
|
||
i.E)(window.location.hostname);return"production"!==e&&"staging"!==e||s(window.location.hostname)?window.dataLayer:window.utag_data};function s(e){
|
||
return e.match(/account(?:-stg)?\.idealo\.(?:co\.)?\w{2,3}/)}function r(e=a()){if(void 0===e)return!1
|
||
;if(!Array.isArray(e))throw new TypeError("Data layer has to be an array!");return!0}function l(e,t=a()){"object"===(0,o.Ax)(e)&&r(t)&&t.push(e)}
|
||
function d(e,t=a()){let n;if(!r(t))return null;if(null==e)throw new TypeError("Key is required");for(let i=0;i<t.length;i++)"object"===(0,
|
||
o.Ax)(t[i])&&e in t[i]&&(n=t[i][e]);return n}},764(e,t,n){n.d(t,{$N:()=>o,Ax:()=>a,ab:()=>i});function o(e,t){
|
||
return Array.isArray(e)&&Array.isArray(t)?e.concat(t):Object.assign({},e,t,Object.keys(e).filter(n=>"object"==typeof e[n]&&Object.prototype.hasOwnProperty.call(t,n)).reduce((n,i)=>{
|
||
n[i]=o(e[i],t[i]);return n},{}))}function i(e={},t={}){
|
||
return Object.keys(e).length===Object.keys(t).length&&Object.keys(e).every(n=>t.hasOwnProperty(n)&&e[n]===t[n])}function a(e){
|
||
return{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}},592(e,t,n){n.d(t,{E:()=>i,m:()=>a});const o=[{
|
||
local:/^(https?:\/\/)?(?:localhost|[\w-.]*(local|dev|usr)[\w-.]+(?:\.idealo\.(co\.)?\w{2,3}|local))(:\d{2,5})?$/},{
|
||
testing:/^(https?:\/\/)?[\w-.]+(tst|testing)[\w-.]*\.(svc|idealo\.(co\.)?\w{2,3})(:\d{2,5})?$/},{
|
||
staging:/^(https?:\/\/)?[\w-.]+(stg|staging|dev)[\w-.]*\.(svc|idealo\.(co\.)?\w{2,3}|idealo\.cloud)(:\d{2,5})?(\/.*)?$/},{
|
||
production:/^(https:\/\/)?[\w-.]*\.idealo\.(co\.)?\w{2,3}$/}];function i(e){let t;for(let n=0;n<o.length;n++){const i=o[n],a=Object.keys(i)[0];if(i[a].test(e)){
|
||
t=a;break}}if(!t)throw new Error(`Will not resolve stage for "${e}"`);return t}function a(e){
|
||
const t=e.split("/")[0===e.indexOf("http")?2:0].split(":")[0],n=t.indexOf(".")>=0?t.split(".").pop():"";return"uk"===n?"co.uk":n}},32(e,t,n){n.d(t,{iA:()=>O,
|
||
ug:()=>y,x3:()=>_});var o=n(267),i=n(200),a=n(764),s=n(592);const r="account",l=(0,o.R2)("idealo"),d=v(),c=31536e3,u="/";window[r]=window[r]||{};function h(e){
|
||
let t={};if("loggedIn"===e.loginState){t.ls=1;e.lastRefresh&&(t.lr=Math.floor(e.lastRefresh/1e3))}"loggedOut"===e.loginState&&(t.ls=0);return t}function g(e){
|
||
return{name:d,value:"unknown"===e.loginState?"":w(e),domain:l,path:u,"max-age":"unknown"===e.loginState?-1:c,samesite:"strict"}}function m(e){let t={
|
||
loginState:"unknown"};if(1===e.ls){t.loginState="loggedIn";e.lr&&(t.lastRefresh=1e3*e.lr)}0===e.ls&&(t.loginState="loggedOut");return t}function f(e){let t={
|
||
loginState:"unknown"};if("string"!=typeof e||0===e.length)return t;try{t=m(JSON.parse(decodeURIComponent(escape(window.atob(e)))))}catch(e){}return t}
|
||
function p(e){const t=new CustomEvent("userinfo",{detail:e,bubbles:!0,cancelable:!0});document.dispatchEvent(t)}function w(e){
|
||
return window.btoa(unescape(encodeURIComponent(JSON.stringify(h(e)))))}function v(e="userInfo"){return`${e}-${(0,
|
||
s.E)(window.location.hostname)}`.replace("-production","").replace("-local","-testing")}function b(){const{loginState:e}=y();return e}function y(){let e={
|
||
loginState:"unknown"},t=E();const n=S(),i=k();if("unknown"===t.loginState){"unknown"!==n.loginState?e=n:"unknown"!==i.loginState&&(e.loginState=i.loginState)
|
||
;if("unknown"!==e.loginState){(0,o.TV)(g(e),!0);t=e}}else{"loggedIn"!==t.loginState&&"loggedOut"!==t.loginState||(e.loginState=t.loginState)
|
||
;Number.isInteger(t.lastRefresh)&&(e.lastRefresh=t.lastRefresh)}if(!(0,a.ab)(e,n)){const o=e.loginState!==n.loginState;A(e);o&&p({loginState:t.loginState})}
|
||
return e}function S(){const e=window[r].userInfo;return I(e)?e:{loginState:"unknown"}}function E(){const e=f((0,o.Ri)(d,!0));return I(e)?e:{loginState:"unknown"
|
||
}}function k(){const e=(0,i.Jt)("user_email_hashed");return{loginState:"string"==typeof e&&/[0-9a-f]{64}/.test(e)?"loggedIn":"unknown"}}function _(){
|
||
return"loggedIn"===b()}function I(e){if("object"!=typeof e||0===Object.keys(e).length)return!1;const{loginState:t,lastRefresh:n}=e
|
||
;if(["loggedIn","loggedOut","unknown"].indexOf(t)<0)throw new Error("User info login state has invalid value: "+t)
|
||
;if("lastRefresh"in e&&!Number.isInteger(n))throw new Error("User info last refresh has invalid value: "+n);return!0}function O(e){if(!I(e))return;const t=y()
|
||
;if((0,a.ab)(t,e))return;"loggedOut"===e.loginState&&"loggedIn"!==t.loginState&&(e.loginState="unknown");if("loggedIn"!==e.loginState){const e={name:"userinfo",
|
||
domain:l,path:u};(0,o.Yj)(e)}t.lastRefresh-e.lastRefresh<1e3&&(e.lastRefresh=t.lastRefresh);"unknown"!==e.loginState&&(e.lastRefresh=e.lastRefresh||Date.now())
|
||
;(0,o.TV)(g(e),!0);const n=S().loginState!==e.loginState;A(e);n&&p({loginState:e.loginState})}function A(e){if(!I(e))return!1;if((0,
|
||
a.ab)(window[r].userInfo,e))return!1;window[r].userInfo=e;return!0}function R(){"object"!=typeof window[r]&&(window[r]={})
|
||
;"object"!=typeof window[r].userInfo&&(window[r].userInfo={});if(window[r].userInfo.loginState)return!1;A(E())}R()},332(e,t,n){n.d(t,{X:()=>r})
|
||
;var o=n(200),i=n(764);const a=/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/gi;function s(e,t=a){return e.replace(t,e=>e.replace(/[a-z0-9]/gi,"*"))}
|
||
function r(e,t={}){let n=(0,i.$N)(t,e)
|
||
;if(!("object"==typeof n&&["event","version","owner"].every(e=>e in n)))throw new Error(`Tracking data incomplete: ${JSON.stringify(n)}`)
|
||
;("object"!=typeof n.data||null===n.data||0===Object.keys(n.data).length)&&delete n.data;const r=JSON.stringify(n);a.test(r)&&(n=JSON.parse(s(r)));o.WQ(n)}},
|
||
256(e,t,n){n.d(t,{A:()=>d});var o=n(332);const i={headerEvents:{disable:"disable.idealo.header",disabled:"disabled.idealo.header",
|
||
enabled:"enabled.idealo.header"},selectors:{button:".myidealo-button",element:"#MyidealoElement",toggle:".myidealo-toggle",wrapper:".myidealo"}},a={
|
||
header_myidealo_button_click:{event:"header_myidealo_button_click",version:"1-0-0",owner:"de.idealo.sso"}},s={activated:"activated",deactivated:"deactivated"}
|
||
;function r(e){this.elements=e;this.handler={headerComponentEnabled:this.onHeaderComponentEnabled.bind(this),headerDisable:this.onHeaderDisable.bind(this),
|
||
keyupEvents:this.onKeyupEvents.bind(this)};this.bindElementEvents();window.addEventListener("beforeunload",this.resetButton.bind(this))}r.prototype={
|
||
bindHeaderEvents(){document.addEventListener(i.headerEvents.enabled,this.handler.headerComponentEnabled)
|
||
;document.addEventListener(i.headerEvents.disable,this.handler.headerDisable);document.addEventListener("keyup",this.handler.keyupEvents)},unbindHeaderEvents(){
|
||
document.removeEventListener(i.headerEvents.enabled,this.handler.headerComponentEnabled)
|
||
;document.removeEventListener(i.headerEvents.disable,this.handler.headerDisable);document.removeEventListener("keyup",this.handler.keyupEvents)},
|
||
bindElementEvents(){if(this.elements.toggle.checked){this.elements.toggle.dispatchEvent(new Event("change"));this.setState(s.activated)
|
||
}else this.setState(s.deactivated);this.elements.wrapper.addEventListener("click",this.preventWrapperEventPropagation)
|
||
;this.elements.toggle.addEventListener("change",this.onStateChange.bind(this))},onActivated(){const e=new Event(i.headerEvents.enabled,{bubbles:!0,cancelable:!0
|
||
});this.elements.toggle.checked=!0;this.elements.button.dispatchEvent(e);this.bindHeaderEvents()},onDeactivated(){const e=new Event(i.headerEvents.disabled,{
|
||
bubbles:!0,cancelable:!0});this.elements.toggle.checked=!1;this.elements.button.blur();this.elements.button.dispatchEvent(e);this.unbindHeaderEvents()},
|
||
onHeaderComponentEnabled(e){e.target!==this.elements.button&&this.setState(s.deactivated)},onHeaderDisable(){this.setState(s.deactivated)},onKeyupEvents(e){
|
||
if(27===e.which){this.elements.toggle.focus();this.setState(s.deactivated)}},preventWrapperEventPropagation(e){e.stopPropagation()},getState(){
|
||
return this.elements.toggle.checked?s.activated:s.deactivated},onStateChange(e){e&&(0,o.X)({},a.header_myidealo_button_click);const t=this.getState()
|
||
;t===s.activated?this.onActivated():t===s.deactivated&&this.onDeactivated()},resetButton(){this.elements.toggle.checked&&(this.elements.toggle.checked=!1)},
|
||
setState(e){this.elements.toggle.checked=e===s.activated}};function l(){const e=document.querySelector(i.selectors.element);return new r({
|
||
button:e.querySelector(i.selectors.button),toggle:e.querySelector(i.selectors.toggle),wrapper:e})}const d=l},218(e,t,n){n.d(t,{A:()=>m});var o=n(267),i=n(32)
|
||
;const a={attribute:"data-state-login",elementSelector:".myidealo",states:{loggedIn:"logged-in",loggedOut:"logged-out",unknown:"unknown"}},s={
|
||
attribute:"data-user-info",cookieName:"userinfo",elementSelector:".myidealo-button-username",states:{unknown:"unknown",exist:"exist"}};let r,l;function d(){
|
||
return r.getAttribute(a.attribute)}function c(e){d()!==e&&r.setAttribute(a.attribute,e)}function u(e){const{attribute:t,cookieName:n,states:i}=s;let a=(0,
|
||
o.Ri)(n);a=a?decodeURIComponent(a.replace(/\+/g," ")).replace(/["']/g,""):"";if(d()!==e||l.textContent!==a){l.textContent=a
|
||
;r.setAttribute(t,a?i.exist:i.unknown)}}function h(e){c(e);u(e)}function g(){r=document.body.querySelector(a.elementSelector)
|
||
;l=document.body.querySelector(s.elementSelector);const{loggedIn:e,loggedOut:t}=a.states;h((0,i.x3)()?e:t);document.addEventListener("userinfo",n=>{
|
||
h("loggedIn"===n.detail.loginState?e:t)})}const m=g},994(e,t,n){n.d(t,{A:()=>y});const o=50,i=5e3;function a(){let e
|
||
;if("performance"in window&&"function"==typeof window.performance.getEntriesByType){const t=window.performance.getEntriesByType("navigation")
|
||
;"object"==typeof t&&t.length>0&&([e]=t)}return e||null}function s(e){if(void 0===e)throw new TypeError("performanceEntry parameter is required")
|
||
;return e instanceof Object&&e.transferSize>0&&e.responseEnd>0&&e.connectStart>=0?Math.round(e.transferSize/(e.responseEnd-e.connectStart)):o}function r(e){
|
||
if(void 0===e)throw new TypeError("fileSizeInBytes is required");if("number"!=typeof e)throw new TypeError("fileSizeInBytes must be a number")
|
||
;const t=Math.round(e/s(a()));return Math.max(t,i)}
|
||
const l=/^https?:\/\/((?:[\w-]+\.)*idealo\.(?:at|co.uk|com|de|es|fr|it)|[a-z-.]+.svc|[a-z0-9]{3,})(:\d{2,5})?$/;function d(e){return l.test(e)||"*"===e}
|
||
var c=n(32);function u(e,t){return"string"==typeof t&&e!==t}function h(e,t){
|
||
return"string"==typeof e&&"object"==typeof t&&(Array.isArray(t)?t.indexOf(e)>=0:Object.keys(t).map(e=>t[e]).some(t=>t===e))}var g=n(332);const m={
|
||
attribute:"data-state-menu",baseUrl:"https://account.idealo.de",menuPath:"/fragments/myidealoMenu",selectors:{element:"#MyidealoElement",menu:".myidealo-menu",
|
||
menuItems:{account_settings:".myidealo-menu-entries--settings",help_and_contact:".myidealo-menu-entries--contact",logout:".myidealo-menu-footer--logout",
|
||
price_alert:".myidealo-menu-entries--pricealerts",wish_list:".myidealo-menu-entries--wishlist"},menuVariants:{logged_in:".myidealo-menu--loggedIn",
|
||
logged_out:".myidealo-menu--loggedOut"},wrapper:".myidealo"}},f={header_myidealo_menu_close:{event:"header_myidealo_menu_close",version:"1-0-0",
|
||
owner:"de.idealo.sso"},header_myidealo_menu_open:{event:"header_myidealo_menu_open",version:"1-0-0",owner:"de.idealo.sso"}},p={failed:"failed",
|
||
initial:"initial",loaded:"loaded",loading:"loading"};let w;function v(e){this.elements=e;this.isInitialized=!1;this.isVisible=!!this.elements.menu.offsetParent
|
||
;this.timeout=3*r(81920);this.timeoutHandler=null;this.state=this.getState()}v.prototype={handleKeyboardEvents(){
|
||
const e=Array.from(this.elements.wrapper.querySelectorAll(".myidealo-toggle, .myidealo-menu--logged-in [role=menuitem]"));function t(e,t){return(e%t+t)%t}
|
||
function n(n){let o=e.findIndex(e=>e===document.activeElement);"ArrowDown"===n.key&&e[t(o+1,e.length)].focus();"ArrowUp"===n.key&&e[t(o-1,e.length)].focus()}
|
||
this.elements.wrapper.addEventListener("keyup",n)},handleLogout(){const e=this.elements.menu.querySelector(".myidealo-menu-footer--logout");function t(t){
|
||
t.preventDefault();window.location.href=e.getAttribute("href")}e.addEventListener("click",t)},init(){if(this.isInitialized)return;this.isInitialized=!0
|
||
;const e=this.elements.wrapper.dataset.domain||m.baseUrl;d(e)||this.setState(p.failed)
|
||
;this.elements.menu.addEventListener("click",this.trackMenuItemClick.bind(this));this.loadMenu(e);this.trackVisibilityChanges()},loadMenu(e){
|
||
this.setState(p.loading);const t=new XMLHttpRequest,n=e+m.menuPath;t.onerror=this.setState.bind(this,p.failed)
|
||
;t.onload=()=>200===t.status?this.onSuccess(t.responseText):this.setState(p.failed);t.ontimeout=this.setState.bind(this,p.failed);t.open("GET",n)
|
||
;t.responseType="text";t.timeout=this.timeout;t.withCredentials=!0;t.send()},onFailed(){
|
||
const{menu:e}=this.elements,{menuVariants:t}=m.selectors,n=e.querySelector(t.logged_in);n&&e.removeChild(n);const o=e.querySelector(t.logged_out)
|
||
;o&&e.removeChild(o);(0,g.X)({data:{menu_variant:"fallback"}},f.header_myidealo_menu_open);window.location.href=this.elements.wrapper.dataset.domain||m.baseUrl
|
||
},onLoading(){this.timeoutHandler=setTimeout(()=>{this.getState()===p.loading&&this.setState(p.failed)},this.timeout)},onSuccess(e){
|
||
const{menu:t}=this.elements,n=this.elements.wrapper.querySelector("script[nonce]");n&&(e=e.replaceAll(/nonce="\S+"/g,`nonce="${n.nonce}"`))
|
||
;const o=document.createRange().createContextualFragment(e),i=this.getVariant(o);if("logged_out"===i){
|
||
t.addEventListener("account",this.setStateByAccountEvent.bind(this));t.appendChild(o);(0,c.iA)({loginState:"loggedOut"});(0,g.X)({data:{menu_variant:i}
|
||
},f.header_myidealo_menu_open)}else if("logged_in"===i){this.setState(p.loaded);t.appendChild(o);(0,c.iA)({loginState:"loggedIn"});(0,g.X)({data:{menu_variant:i
|
||
}},f.header_myidealo_menu_open);this.handleLogout();this.handleKeyboardEvents()}else this.setState(p.failed)},getState(){
|
||
const e=this.state||this.elements.wrapper.getAttribute(m.attribute)||p.initial;return h(e,p)?e:p.failed},setState(e){if(u(this.getState(),e)&&h(e,p)){
|
||
this.state=e;this.elements.wrapper.setAttribute(m.attribute,e);clearTimeout(this.timeoutHandler);e===p.failed&&this.onFailed();e===p.loading&&this.onLoading()}
|
||
},setStateByAccountEvent(e){const{action:t}=e.detail
|
||
;t.match(/^(login|register|password)/)?this.setState(p.loaded):"timeout"===t?this.setState(p.failed):"loading"===t&&this.setState(p.loading)},
|
||
getVariant(e=this.elements.menu){const t=["logged_in","logged_out"];for(let n of t)if(e.querySelector(m.selectors.menuVariants[n]))return n;return"fallback"},
|
||
trackMenuItemClick(e){for(const t in m.selectors.menuItems)if(e.target.closest(m.selectors.menuItems[t])){const e={event:"header_myidealo_menu_item_click",
|
||
data:{menu_item:t,menu_variant:this.getVariant()},owner:"de.idealo.sso",version:"1-0-0"};(0,g.X)(e)}},trackVisibilityChanges(){let e;function t(e){
|
||
const t=e[0].isIntersecting,n=this.getVariant(),o=this.getState();if(this.isVisible!==t&&(o===p.loaded||o===p.failed)){this.isVisible=t
|
||
;const e=this.isVisible?f.header_myidealo_menu_open:f.header_myidealo_menu_close;(0,g.X)({data:{menu_variant:n}},e)}}e=new IntersectionObserver(t.bind(this),{
|
||
root:this.elements.menu.parent,threshold:[0,1]});e.observe(this.elements.menu)}};function b(){const e=document.querySelector(m.selectors.element),t={
|
||
menu:e.querySelector(m.selectors.menu),wrapper:e};w=w||new v(t);return w}const y=b},783(e,t,n){var o=n(592);const i=s(window.location.hostname);function a(e,t){
|
||
let n="https://";n+="production"===e&&t?`auth.idealo.${t}`:"staging"===e&&t?"com"===t?"auth-dev.idealo.com":`auth-stg.idealo.${t}`:"auth-test.idealo.com"
|
||
;n+="/refresh/idtoken";return n}function s(e){return a((0,o.E)(e),(0,o.m)(e))}function r(e){const t=new XMLHttpRequest;function n(){
|
||
if(200===t.status&&"function"==typeof e){const{refreshed:n}=JSON.parse(t.response);e(!!n)}}t.onload=n;t.open("POST",i,!0);t.timeout=1e4;t.withCredentials=!0
|
||
;t.send()}var l=n(32);const d=3e5;let c;function u(e){return"loggedIn"===e.loginState&&Date.now()-(null==e?void 0:e.lastRefresh)>.9*d}function h(){
|
||
"visible"===document.visibilityState&&m()}function g(e){const{action:t}=e.detail;"login.success"!==t&&"register.success"!==t||(0,l.iA)({loginState:"loggedIn",
|
||
lastRefresh:Date.now()})}function m(){var e;if("visible"!==(null===(e=document)||void 0===e?void 0:e.visibilityState))return;const t=(0,l.ug)()
|
||
;if("loggedIn"===t.loginState){u(t)&&r(e=>{e&&(0,l.iA)({loginState:"loggedIn",lastRefresh:Date.now()})});c=setTimeout(m,d)}else clearTimeout(c)}
|
||
const f=window["account"]||{};if(!f.isRefreshTokenHandled){m();document.addEventListener("visibilitychange",h);document.addEventListener("account",g)
|
||
;f.isRefreshTokenHandled=!0}}},t={};function n(o){var i=t[o];if(void 0!==i)return i.exports;var a=t[o]={exports:{}};e[o](a,a.exports,n);return a.exports}
|
||
n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})};n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);n(783)
|
||
;var o=n(256),i=n(994),a=n(218);function s(){(0,i.A)().init()}function r(){(0,a.A)();(0,o.A)().elements.toggle.addEventListener("change",s,{once:!0})}r()})();
|
||
//# sourceMappingURL=https://account.idealo.de/js/fragments/myidealo/myidealoElement.js.map
|
||
/*]]>*/
|
||
</script>
|
||
<script nonce="4/CvbgpJ/1vuoS3imO6+rhiq8CGaQdQyqP4XjzoVOm0=">
|
||
/*<![CDATA[*/
|
||
/*! For license information please see googleOneTap.js.LICENSE.txt */
|
||
(()=>{"use strict";var e={};e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){
|
||
if("object"==typeof window)return window}}();const t=[{
|
||
local:/^(https?:\/\/)?(?:localhost|[\w-.]*(local|dev|usr)[\w-.]+(?:\.idealo\.(co\.)?\w{2,3}|local))(:\d{2,5})?$/},{
|
||
testing:/^(https?:\/\/)?[\w-.]+(tst|testing)[\w-.]*\.(svc|idealo\.(co\.)?\w{2,3})(:\d{2,5})?$/},{
|
||
staging:/^(https?:\/\/)?[\w-.]+(stg|staging|dev)[\w-.]*\.(svc|idealo\.(co\.)?\w{2,3}|idealo\.cloud)(:\d{2,5})?(\/.*)?$/},{
|
||
production:/^(https:\/\/)?[\w-.]*\.idealo\.(co\.)?\w{2,3}$/}];function n(e){let n;for(let r=0;r<t.length;r++){const i=t[r],s=Object.keys(i)[0];if(i[s].test(e)){
|
||
n=s;break}}if(!n)throw new Error(`Will not resolve stage for "${e}"`);return n}const r=()=>{},i=function(e){const t=[];let n=0;for(let r=0;r<e.length;r++){
|
||
let i=e.charCodeAt(r);if(i<128)t[n++]=i;else if(i<2048){t[n++]=i>>6|192;t[n++]=63&i|128
|
||
}else if(55296==(64512&i)&&r+1<e.length&&56320==(64512&e.charCodeAt(r+1))){i=65536+((1023&i)<<10)+(1023&e.charCodeAt(++r));t[n++]=i>>18|240;t[n++]=i>>12&63|128
|
||
;t[n++]=i>>6&63|128;t[n++]=63&i|128}else{t[n++]=i>>12|224;t[n++]=i>>6&63|128;t[n++]=63&i|128}}return t},s=function(e){const t=[];let n=0,r=0;for(;n<e.length;){
|
||
const i=e[n++];if(i<128)t[r++]=String.fromCharCode(i);else if(i>191&&i<224){const s=e[n++];t[r++]=String.fromCharCode((31&i)<<6|63&s)}else if(i>239&&i<365){
|
||
const s=((7&i)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536;t[r++]=String.fromCharCode(55296+(s>>10));t[r++]=String.fromCharCode(56320+(1023&s))}else{
|
||
const s=e[n++],o=e[n++];t[r++]=String.fromCharCode((15&i)<<12|(63&s)<<6|63&o)}}return t.join("")},o={byteToCharMap_:null,charToByteMap_:null,
|
||
byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){
|
||
return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,
|
||
encodeByteArray(e,t){if(!Array.isArray(e))throw Error("encodeByteArray takes an array as a parameter");this.init_()
|
||
;const n=t?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[];for(let t=0;t<e.length;t+=3){
|
||
const i=e[t],s=t+1<e.length,o=s?e[t+1]:0,a=t+2<e.length,c=a?e[t+2]:0,u=i>>2,h=(3&i)<<4|o>>4;let l=(15&o)<<2|c>>6,d=63&c;if(!a){d=64;s||(l=64)}
|
||
r.push(n[u],n[h],n[l],n[d])}return r.join("")},encodeString(e,t){return this.HAS_NATIVE_SUPPORT&&!t?btoa(e):this.encodeByteArray(i(e),t)},decodeString(e,t){
|
||
return this.HAS_NATIVE_SUPPORT&&!t?atob(e):s(this.decodeStringToByteArray(e,t))},decodeStringToByteArray(e,t){this.init_()
|
||
;const n=t?this.charToByteMapWebSafe_:this.charToByteMap_,r=[];for(let t=0;t<e.length;){const i=n[e.charAt(t++)],s=t<e.length?n[e.charAt(t)]:0;++t
|
||
;const o=t<e.length?n[e.charAt(t)]:64;++t;const c=t<e.length?n[e.charAt(t)]:64;++t;if(null==i||null==s||null==o||null==c)throw new a;const u=i<<2|s>>4;r.push(u)
|
||
;if(64!==o){const e=s<<4&240|o>>2;r.push(e);if(64!==c){const e=o<<6&192|c;r.push(e)}}}return r},init_(){if(!this.byteToCharMap_){this.byteToCharMap_={}
|
||
;this.charToByteMap_={};this.byteToCharMapWebSafe_={};this.charToByteMapWebSafe_={};for(let e=0;e<this.ENCODED_VALS.length;e++){
|
||
this.byteToCharMap_[e]=this.ENCODED_VALS.charAt(e);this.charToByteMap_[this.byteToCharMap_[e]]=e
|
||
;this.byteToCharMapWebSafe_[e]=this.ENCODED_VALS_WEBSAFE.charAt(e);this.charToByteMapWebSafe_[this.byteToCharMapWebSafe_[e]]=e
|
||
;if(e>=this.ENCODED_VALS_BASE.length){this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(e)]=e;this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(e)]=e}}}}}
|
||
;class a extends Error{constructor(){super(...arguments);this.name="DecodeBase64StringError"}}const c=function(e){const t=i(e);return o.encodeByteArray(t,!0)
|
||
},u=function(e){return c(e).replace(/\./g,"")},h=function(e){try{return o.decodeString(e,!0)}catch(e){}return null};function l(){
|
||
if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==e.g)return e.g
|
||
;throw new Error("Unable to locate global object.")}const d=()=>l().__FIREBASE_DEFAULTS__,p=()=>{if("undefined"==typeof process||void 0===process.env)return
|
||
;const e=process.env.__FIREBASE_DEFAULTS__;return e?JSON.parse(e):void 0},f=()=>{if("undefined"==typeof document)return;let e;try{
|
||
e=document.cookie.match(/__FIREBASE_DEFAULTS__=([^;]+)/)}catch(e){return}const t=e&&h(e[1]);return t&&JSON.parse(t)},m=()=>{try{return r()||d()||p()||f()
|
||
}catch(e){return}},g=e=>m()?.emulatorHosts?.[e],_=()=>m()?.config,w=e=>m()?.[`_${e}`];class I{constructor(){this.reject=()=>{};this.resolve=()=>{}
|
||
;this.promise=new Promise((e,t)=>{this.resolve=e;this.reject=t})}wrapCallback(e){return(t,n)=>{t?this.reject(t):this.resolve(n);if("function"==typeof e){
|
||
this.promise.catch(()=>{});1===e.length?e(t):e(t,n)}}}}function v(){
|
||
return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function y(){
|
||
return"undefined"!=typeof window&&!!(window.cordova||window.phonegap||window.PhoneGap)&&/ios|iphone|ipod|ipad|android|blackberry|iemobile/i.test(v())}
|
||
function E(){return"undefined"!=typeof navigator&&"Cloudflare-Workers"===navigator.userAgent}function b(){
|
||
const e="object"==typeof chrome?chrome.runtime:"object"==typeof browser?browser.runtime:void 0;return"object"==typeof e&&void 0!==e.id}function T(){
|
||
return"object"==typeof navigator&&"ReactNative"===navigator.product}function S(){const e=v();return e.indexOf("MSIE ")>=0||e.indexOf("Trident/")>=0}
|
||
function k(){try{return"object"==typeof indexedDB}catch(e){return!1}}function C(){return new Promise((e,t)=>{try{let n=!0
|
||
;const r="validate-browser-context-for-indexeddb-analytics-module",i=self.indexedDB.open(r);i.onsuccess=()=>{i.result.close()
|
||
;n||self.indexedDB.deleteDatabase(r);e(!0)};i.onupgradeneeded=()=>{n=!1};i.onerror=()=>{t(i.error?.message||"")}}catch(e){t(e)}})}const R="FirebaseError"
|
||
;class P extends Error{constructor(e,t,n){super(t);this.code=e;this.customData=n;this.name=R;Object.setPrototypeOf(this,P.prototype)
|
||
;Error.captureStackTrace&&Error.captureStackTrace(this,O.prototype.create)}}class O{constructor(e,t,n){this.service=e;this.serviceName=t;this.errors=n}
|
||
create(e,...t){const n=t[0]||{},r=`${this.service}/${e}`,i=this.errors[e],s=i?A(i,n):"Error",o=`${this.serviceName}: ${s} (${r}).`;return new P(r,o,n)}}
|
||
function A(e,t){return e.replace(N,(e,n)=>{const r=t[n];return null!=r?String(r):`<${n}?>`})}const N=/\{\$([^}]+)}/g;function D(e){
|
||
for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function L(e,t){if(e===t)return!0;const n=Object.keys(e),r=Object.keys(t)
|
||
;for(const i of n){if(!r.includes(i))return!1;const n=e[i],s=t[i];if(M(n)&&M(s)){if(!L(n,s))return!1}else if(n!==s)return!1}
|
||
for(const e of r)if(!n.includes(e))return!1;return!0}function M(e){return null!==e&&"object"==typeof e}function U(e){const t=[]
|
||
;for(const[n,r]of Object.entries(e))Array.isArray(r)?r.forEach(e=>{t.push(encodeURIComponent(n)+"="+encodeURIComponent(e))
|
||
}):t.push(encodeURIComponent(n)+"="+encodeURIComponent(r));return t.length?"&"+t.join("&"):""}function x(e){const t={}
|
||
;e.replace(/^\?/,"").split("&").forEach(e=>{if(e){const[n,r]=e.split("=");t[decodeURIComponent(n)]=decodeURIComponent(r)}});return t}function V(e){
|
||
const t=e.indexOf("?");if(!t)return"";const n=e.indexOf("#",t);return e.substring(t,n>0?n:void 0)}function F(e,t){const n=new j(e,t);return n.subscribe.bind(n)}
|
||
class j{constructor(e,t){this.observers=[];this.unsubscribes=[];this.observerCount=0;this.task=Promise.resolve();this.finalized=!1;this.onNoObservers=t
|
||
;this.task.then(()=>{e(this)}).catch(e=>{this.error(e)})}next(e){this.forEachObserver(t=>{t.next(e)})}error(e){this.forEachObserver(t=>{t.error(e)})
|
||
;this.close(e)}complete(){this.forEachObserver(e=>{e.complete()});this.close()}subscribe(e,t,n){let r
|
||
;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");r=H(e,["next","error","complete"])?e:{next:e,error:t,complete:n}
|
||
;void 0===r.next&&(r.next=$);void 0===r.error&&(r.error=$);void 0===r.complete&&(r.complete=$);const i=this.unsubscribeOne.bind(this,this.observers.length)
|
||
;this.finalized&&this.task.then(()=>{try{this.finalError?r.error(this.finalError):r.complete()}catch(e){}});this.observers.push(r);return i}unsubscribeOne(e){
|
||
if(void 0!==this.observers&&void 0!==this.observers[e]){delete this.observers[e];this.observerCount-=1
|
||
;0===this.observerCount&&void 0!==this.onNoObservers&&this.onNoObservers(this)}}forEachObserver(e){
|
||
if(!this.finalized)for(let t=0;t<this.observers.length;t++)this.sendOne(t,e)}sendOne(e,t){this.task.then(()=>{
|
||
if(void 0!==this.observers&&void 0!==this.observers[e])try{t(this.observers[e])}catch(e){"undefined"!=typeof console&&console.error}})}close(e){
|
||
if(!this.finalized){this.finalized=!0;void 0!==e&&(this.finalError=e);this.task.then(()=>{this.observers=void 0;this.onNoObservers=void 0})}}}function H(e,t){
|
||
if("object"!=typeof e||null===e)return!1;for(const n of t)if(n in e&&"function"==typeof e[n])return!0;return!1}function $(){}function W(e){
|
||
return e&&e._delegate?e._delegate:e}function B(e){try{
|
||
return(e.startsWith("http://")||e.startsWith("https://")?new URL(e).hostname:e).endsWith(".cloudworkstations.dev")}catch{return!1}}async function z(e){
|
||
return(await fetch(e,{credentials:"include"})).ok}class K{constructor(e,t,n){this.name=e;this.instanceFactory=t;this.type=n;this.multipleInstances=!1
|
||
;this.serviceProps={};this.instantiationMode="LAZY";this.onInstanceCreated=null}setInstantiationMode(e){this.instantiationMode=e;return this}
|
||
setMultipleInstances(e){this.multipleInstances=e;return this}setServiceProps(e){this.serviceProps=e;return this}setInstanceCreatedCallback(e){
|
||
this.onInstanceCreated=e;return this}}const q="[DEFAULT]";class G{constructor(e,t){this.name=e;this.container=t;this.component=null;this.instances=new Map
|
||
;this.instancesDeferred=new Map;this.instancesOptions=new Map;this.onInitCallbacks=new Map}get(e){const t=this.normalizeInstanceIdentifier(e)
|
||
;if(!this.instancesDeferred.has(t)){const e=new I;this.instancesDeferred.set(t,e);if(this.isInitialized(t)||this.shouldAutoInitialize())try{
|
||
const n=this.getOrInitializeService({instanceIdentifier:t});n&&e.resolve(n)}catch(e){}}return this.instancesDeferred.get(t).promise}getImmediate(e){
|
||
const t=this.normalizeInstanceIdentifier(e?.identifier),n=e?.optional??!1;if(!this.isInitialized(t)&&!this.shouldAutoInitialize()){if(n)return null
|
||
;throw Error(`Service ${this.name} is not available`)}try{return this.getOrInitializeService({instanceIdentifier:t})}catch(e){if(n)return null;throw e}}
|
||
getComponent(){return this.component}setComponent(e){if(e.name!==this.name)throw Error(`Mismatching Component ${e.name} for Provider ${this.name}.`)
|
||
;if(this.component)throw Error(`Component for ${this.name} has already been provided`);this.component=e;if(this.shouldAutoInitialize()){if(Y(e))try{
|
||
this.getOrInitializeService({instanceIdentifier:q})}catch(e){}for(const[e,t]of this.instancesDeferred.entries()){const n=this.normalizeInstanceIdentifier(e)
|
||
;try{const e=this.getOrInitializeService({instanceIdentifier:n});t.resolve(e)}catch(e){}}}}clearInstance(e=q){this.instancesDeferred.delete(e)
|
||
;this.instancesOptions.delete(e);this.instances.delete(e)}async delete(){const e=Array.from(this.instances.values())
|
||
;await Promise.all([...e.filter(e=>"INTERNAL"in e).map(e=>e.INTERNAL.delete()),...e.filter(e=>"_delete"in e).map(e=>e._delete())])}isComponentSet(){
|
||
return null!=this.component}isInitialized(e=q){return this.instances.has(e)}getOptions(e=q){return this.instancesOptions.get(e)||{}}initialize(e={}){
|
||
const{options:t={}}=e,n=this.normalizeInstanceIdentifier(e.instanceIdentifier)
|
||
;if(this.isInitialized(n))throw Error(`${this.name}(${n}) has already been initialized`)
|
||
;if(!this.isComponentSet())throw Error(`Component ${this.name} has not been registered yet`);const r=this.getOrInitializeService({instanceIdentifier:n,options:t
|
||
});for(const[e,t]of this.instancesDeferred.entries()){n===this.normalizeInstanceIdentifier(e)&&t.resolve(r)}return r}onInit(e,t){
|
||
const n=this.normalizeInstanceIdentifier(t),r=this.onInitCallbacks.get(n)??new Set;r.add(e);this.onInitCallbacks.set(n,r);const i=this.instances.get(n)
|
||
;i&&e(i,n);return()=>{r.delete(e)}}invokeOnInitCallbacks(e,t){const n=this.onInitCallbacks.get(t);if(n)for(const r of n)try{r(e,t)}catch{}}
|
||
getOrInitializeService({instanceIdentifier:e,options:t={}}){let n=this.instances.get(e);if(!n&&this.component){n=this.component.instanceFactory(this.container,{
|
||
instanceIdentifier:J(e),options:t});this.instances.set(e,n);this.instancesOptions.set(e,t);this.invokeOnInitCallbacks(n,e)
|
||
;if(this.component.onInstanceCreated)try{this.component.onInstanceCreated(this.container,e,n)}catch{}}return n||null}normalizeInstanceIdentifier(e=q){
|
||
return this.component?this.component.multipleInstances?e:q:e}shouldAutoInitialize(){return!!this.component&&"EXPLICIT"!==this.component.instantiationMode}}
|
||
function J(e){return e===q?void 0:e}function Y(e){return"EAGER"===e.instantiationMode}class X{constructor(e){this.name=e;this.providers=new Map}addComponent(e){
|
||
const t=this.getProvider(e.name);if(t.isComponentSet())throw new Error(`Component ${e.name} has already been registered with ${this.name}`);t.setComponent(e)}
|
||
addOrOverwriteComponent(e){this.getProvider(e.name).isComponentSet()&&this.providers.delete(e.name);this.addComponent(e)}getProvider(e){
|
||
if(this.providers.has(e))return this.providers.get(e);const t=new G(e,this);this.providers.set(e,t);return t}getProviders(){
|
||
return Array.from(this.providers.values())}}const Q=[];var Z;!function(e){e[e.DEBUG=0]="DEBUG";e[e.VERBOSE=1]="VERBOSE";e[e.INFO=2]="INFO";e[e.WARN=3]="WARN"
|
||
;e[e.ERROR=4]="ERROR";e[e.SILENT=5]="SILENT"}(Z||(Z={}));const ee={debug:Z.DEBUG,verbose:Z.VERBOSE,info:Z.INFO,warn:Z.WARN,error:Z.ERROR,silent:Z.SILENT
|
||
},te=Z.INFO,ne={[Z.DEBUG]:"log",[Z.VERBOSE]:"log",[Z.INFO]:"info",[Z.WARN]:"warn",[Z.ERROR]:"error"},re=(e,t,...n)=>{if(t<e.logLevel)return
|
||
;(new Date).toISOString();const r=ne[t];if(!r)throw new Error(`Attempted to log a message with an invalid logType (value: ${t})`)};class ie{constructor(e){
|
||
this.name=e;this._logLevel=te;this._logHandler=re;this._userLogHandler=null;Q.push(this)}get logLevel(){return this._logLevel}set logLevel(e){
|
||
if(!(e in Z))throw new TypeError(`Invalid value "${e}" assigned to \`logLevel\``);this._logLevel=e}setLogLevel(e){this._logLevel="string"==typeof e?ee[e]:e}
|
||
get logHandler(){return this._logHandler}set logHandler(e){if("function"!=typeof e)throw new TypeError("Value assigned to `logHandler` must be a function")
|
||
;this._logHandler=e}get userLogHandler(){return this._userLogHandler}set userLogHandler(e){this._userLogHandler=e}debug(...e){
|
||
this._userLogHandler&&this._userLogHandler(this,Z.DEBUG,...e);this._logHandler(this,Z.DEBUG,...e)}log(...e){
|
||
this._userLogHandler&&this._userLogHandler(this,Z.VERBOSE,...e);this._logHandler(this,Z.VERBOSE,...e)}info(...e){
|
||
this._userLogHandler&&this._userLogHandler(this,Z.INFO,...e);this._logHandler(this,Z.INFO,...e)}warn(...e){
|
||
this._userLogHandler&&this._userLogHandler(this,Z.WARN,...e);this._logHandler(this,Z.WARN,...e)}error(...e){
|
||
this._userLogHandler&&this._userLogHandler(this,Z.ERROR,...e);this._logHandler(this,Z.ERROR,...e)}}const se=(e,t)=>t.some(t=>e instanceof t);let oe,ae
|
||
;function ce(){return oe||(oe=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function ue(){
|
||
return ae||(ae=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}
|
||
const he=new WeakMap,le=new WeakMap,de=new WeakMap,pe=new WeakMap,fe=new WeakMap;function me(e){const t=new Promise((t,n)=>{const r=()=>{
|
||
e.removeEventListener("success",i);e.removeEventListener("error",s)},i=()=>{t(ye(e.result));r()},s=()=>{n(e.error);r()};e.addEventListener("success",i)
|
||
;e.addEventListener("error",s)});t.then(t=>{t instanceof IDBCursor&&he.set(t,e)}).catch(()=>{});fe.set(t,e);return t}function ge(e){if(le.has(e))return
|
||
;const t=new Promise((t,n)=>{const r=()=>{e.removeEventListener("complete",i);e.removeEventListener("error",s);e.removeEventListener("abort",s)},i=()=>{t();r()
|
||
},s=()=>{n(e.error||new DOMException("AbortError","AbortError"));r()};e.addEventListener("complete",i);e.addEventListener("error",s)
|
||
;e.addEventListener("abort",s)});le.set(e,t)}let _e={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return le.get(e)
|
||
;if("objectStoreNames"===t)return e.objectStoreNames||de.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}
|
||
return ye(e[t])},set(e,t,n){e[t]=n;return!0},has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function we(e){_e=e(_e)}function Ie(e){
|
||
return e!==IDBDatabase.prototype.transaction||"objectStoreNames"in IDBTransaction.prototype?ue().includes(e)?function(...t){e.apply(Ee(this),t)
|
||
;return ye(he.get(this))}:function(...t){return ye(e.apply(Ee(this),t))}:function(t,...n){const r=e.call(Ee(this),t,...n);de.set(r,t.sort?t.sort():[t])
|
||
;return ye(r)}}function ve(e){if("function"==typeof e)return Ie(e);e instanceof IDBTransaction&&ge(e);return se(e,ce())?new Proxy(e,_e):e}function ye(e){
|
||
if(e instanceof IDBRequest)return me(e);if(pe.has(e))return pe.get(e);const t=ve(e);if(t!==e){pe.set(e,t);fe.set(t,e)}return t}const Ee=e=>fe.get(e)
|
||
;function be(e,t,{blocked:n,upgrade:r,blocking:i,terminated:s}={}){const o=indexedDB.open(e,t),a=ye(o);r&&o.addEventListener("upgradeneeded",e=>{
|
||
r(ye(o.result),e.oldVersion,e.newVersion,ye(o.transaction),e)});n&&o.addEventListener("blocked",e=>n(e.oldVersion,e.newVersion,e));a.then(e=>{
|
||
s&&e.addEventListener("close",()=>s());i&&e.addEventListener("versionchange",e=>i(e.oldVersion,e.newVersion,e))}).catch(()=>{});return a}
|
||
const Te=["get","getKey","getAll","getAllKeys","count"],Se=["put","add","delete","clear"],ke=new Map;function Ce(e,t){
|
||
if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(ke.get(t))return ke.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,i=Se.includes(n)
|
||
;if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!i&&!Te.includes(n))return;const s=async function(e,...t){const s=this.transaction(e,i?"readwrite":"readonly")
|
||
;let o=s.store;r&&(o=o.index(t.shift()));return(await Promise.all([o[n](...t),i&&s.done]))[0]};ke.set(t,s);return s}we(e=>({...e,
|
||
get:(t,n,r)=>Ce(t,n)||e.get(t,n,r),has:(t,n)=>!!Ce(t,n)||e.has(t,n)}));class Re{constructor(e){this.container=e}getPlatformInfoString(){
|
||
return this.container.getProviders().map(e=>{if(Pe(e)){const t=e.getImmediate();return`${t.library}/${t.version}`}return null}).filter(e=>e).join(" ")}}
|
||
function Pe(e){const t=e.getComponent();return"VERSION"===t?.type}
|
||
const Oe="@firebase/app",Ae="0.14.11",Ne=new ie("@firebase/app"),De="@firebase/app-compat",Le="@firebase/analytics-compat",Me="@firebase/analytics",Ue="@firebase/app-check-compat",xe="@firebase/app-check",Ve="@firebase/auth",Fe="@firebase/auth-compat",je="@firebase/database",He="@firebase/data-connect",$e="@firebase/database-compat",We="@firebase/functions",Be="@firebase/functions-compat",ze="@firebase/installations",Ke="@firebase/installations-compat",qe="@firebase/messaging",Ge="@firebase/messaging-compat",Je="@firebase/performance",Ye="@firebase/performance-compat",Xe="@firebase/remote-config",Qe="@firebase/remote-config-compat",Ze="@firebase/storage",et="@firebase/storage-compat",tt="@firebase/firestore",nt="@firebase/ai",rt="@firebase/firestore-compat",it="firebase",st="12.12.0",ot="[DEFAULT]",at={
|
||
[Oe]:"fire-core",[De]:"fire-core-compat",[Me]:"fire-analytics",[Le]:"fire-analytics-compat",[xe]:"fire-app-check",[Ue]:"fire-app-check-compat",[Ve]:"fire-auth",
|
||
[Fe]:"fire-auth-compat",[je]:"fire-rtdb",[He]:"fire-data-connect",[$e]:"fire-rtdb-compat",[We]:"fire-fn",[Be]:"fire-fn-compat",[ze]:"fire-iid",
|
||
[Ke]:"fire-iid-compat",[qe]:"fire-fcm",[Ge]:"fire-fcm-compat",[Je]:"fire-perf",[Ye]:"fire-perf-compat",[Xe]:"fire-rc",[Qe]:"fire-rc-compat",[Ze]:"fire-gcs",
|
||
[et]:"fire-gcs-compat",[tt]:"fire-fst",[rt]:"fire-fst-compat",[nt]:"fire-vertex","fire-js":"fire-js",[it]:"fire-js-all"},ct=new Map,ut=new Map,ht=new Map
|
||
;function lt(e,t){try{e.container.addComponent(t)}catch(n){Ne.debug(`Component ${t.name} failed to register with FirebaseApp ${e.name}`,n)}}function dt(e){
|
||
const t=e.name;if(ht.has(t)){Ne.debug(`There were multiple attempts to register component ${t}.`);return!1}ht.set(t,e);for(const t of ct.values())lt(t,e)
|
||
;for(const t of ut.values())lt(t,e);return!0}function pt(e,t){const n=e.container.getProvider("heartbeat").getImmediate({optional:!0});n&&n.triggerHeartbeat()
|
||
;return e.container.getProvider(t)}function ft(e){return null!=e&&void 0!==e.settings}const mt=new O("app","Firebase",{
|
||
"no-app":"No Firebase App '{$appName}' has been created - call initializeApp() first","bad-app-name":"Illegal App name: '{$appName}'",
|
||
"duplicate-app":"Firebase App named '{$appName}' already exists with different options or config",
|
||
"app-deleted":"Firebase App named '{$appName}' already deleted","server-app-deleted":"Firebase Server App has been deleted",
|
||
"no-options":"Need to provide options, when not being deployed to hosting via source.",
|
||
"invalid-app-argument":"firebase.{$appName}() takes either no argument or a Firebase App instance.",
|
||
"invalid-log-argument":"First argument to `onLog` must be null or a function.",
|
||
"idb-open":"Error thrown when opening IndexedDB. Original error: {$originalErrorMessage}.",
|
||
"idb-get":"Error thrown when reading from IndexedDB. Original error: {$originalErrorMessage}.",
|
||
"idb-set":"Error thrown when writing to IndexedDB. Original error: {$originalErrorMessage}.",
|
||
"idb-delete":"Error thrown when deleting from IndexedDB. Original error: {$originalErrorMessage}.",
|
||
"finalization-registry-not-supported":"FirebaseServerApp deleteOnDeref field defined but the JS runtime does not support FinalizationRegistry.",
|
||
"invalid-server-app-environment":"FirebaseServerApp is not for use in browser environments."});class gt{constructor(e,t,n){this._isDeleted=!1;this._options={
|
||
...e};this._config={...t};this._name=t.name;this._automaticDataCollectionEnabled=t.automaticDataCollectionEnabled;this._container=n
|
||
;this.container.addComponent(new K("app",()=>this,"PUBLIC"))}get automaticDataCollectionEnabled(){this.checkDestroyed()
|
||
;return this._automaticDataCollectionEnabled}set automaticDataCollectionEnabled(e){this.checkDestroyed();this._automaticDataCollectionEnabled=e}get name(){
|
||
this.checkDestroyed();return this._name}get options(){this.checkDestroyed();return this._options}get config(){this.checkDestroyed();return this._config}
|
||
get container(){return this._container}get isDeleted(){return this._isDeleted}set isDeleted(e){this._isDeleted=e}checkDestroyed(){
|
||
if(this.isDeleted)throw mt.create("app-deleted",{appName:this._name})}}const _t=st;function wt(e,t={}){let n=e;if("object"!=typeof t){t={name:t}}const r={
|
||
name:ot,automaticDataCollectionEnabled:!0,...t},i=r.name;if("string"!=typeof i||!i)throw mt.create("bad-app-name",{appName:String(i)});n||(n=_())
|
||
;if(!n)throw mt.create("no-options");const s=ct.get(i);if(s){if(L(n,s.options)&&L(r,s.config))return s;throw mt.create("duplicate-app",{appName:i})}
|
||
const o=new X(i);for(const e of ht.values())o.addComponent(e);const a=new gt(n,r,o);ct.set(i,a);return a}function It(e=ot){const t=ct.get(e)
|
||
;if(!t&&e===ot&&_())return wt();if(!t)throw mt.create("no-app",{appName:e});return t}function vt(e,t,n){let r=at[e]??e;n&&(r+=`-${n}`)
|
||
;const i=r.match(/\s|\//),s=t.match(/\s|\//);if(i||s){const e=[`Unable to register library "${r}" with version "${t}":`]
|
||
;i&&e.push(`library name "${r}" contains illegal characters (whitespace or "/")`);i&&s&&e.push("and")
|
||
;s&&e.push(`version name "${t}" contains illegal characters (whitespace or "/")`);Ne.warn(e.join(" "));return}dt(new K(`${r}-version`,()=>({library:r,version:t
|
||
}),"VERSION"))}const yt="firebase-heartbeat-database",Et=1,bt="firebase-heartbeat-store";let Tt=null;function St(){Tt||(Tt=be(yt,Et,{upgrade:(e,t)=>{
|
||
if(0===t)try{e.createObjectStore(bt)}catch(e){}}}).catch(e=>{throw mt.create("idb-open",{originalErrorMessage:e.message})}));return Tt}async function kt(e){try{
|
||
const t=(await St()).transaction(bt),n=await t.objectStore(bt).get(Rt(e));await t.done;return n}catch(e){if(e instanceof P)Ne.warn(e.message);else{
|
||
const t=mt.create("idb-get",{originalErrorMessage:e?.message});Ne.warn(t.message)}}}async function Ct(e,t){try{
|
||
const n=(await St()).transaction(bt,"readwrite"),r=n.objectStore(bt);await r.put(t,Rt(e));await n.done}catch(e){if(e instanceof P)Ne.warn(e.message);else{
|
||
const t=mt.create("idb-set",{originalErrorMessage:e?.message});Ne.warn(t.message)}}}function Rt(e){return`${e.name}!${e.options.appId}`}const Pt=1024,Ot=30
|
||
;class At{constructor(e){this.container=e;this._heartbeatsCache=null;const t=this.container.getProvider("app").getImmediate();this._storage=new Lt(t)
|
||
;this._heartbeatsCachePromise=this._storage.read().then(e=>{this._heartbeatsCache=e;return e})}async triggerHeartbeat(){try{
|
||
const e=this.container.getProvider("platform-logger").getImmediate().getPlatformInfoString(),t=Nt();if(null==this._heartbeatsCache?.heartbeats){
|
||
this._heartbeatsCache=await this._heartbeatsCachePromise;if(null==this._heartbeatsCache?.heartbeats)return}
|
||
if(this._heartbeatsCache.lastSentHeartbeatDate===t||this._heartbeatsCache.heartbeats.some(e=>e.date===t))return;this._heartbeatsCache.heartbeats.push({date:t,
|
||
agent:e});if(this._heartbeatsCache.heartbeats.length>Ot){const e=Ut(this._heartbeatsCache.heartbeats);this._heartbeatsCache.heartbeats.splice(e,1)}
|
||
return this._storage.overwrite(this._heartbeatsCache)}catch(e){Ne.warn(e)}}async getHeartbeatsHeader(){try{
|
||
null===this._heartbeatsCache&&await this._heartbeatsCachePromise
|
||
;if(null==this._heartbeatsCache?.heartbeats||0===this._heartbeatsCache.heartbeats.length)return""
|
||
;const e=Nt(),{heartbeatsToSend:t,unsentEntries:n}=Dt(this._heartbeatsCache.heartbeats),r=u(JSON.stringify({version:2,heartbeats:t}))
|
||
;this._heartbeatsCache.lastSentHeartbeatDate=e;if(n.length>0){this._heartbeatsCache.heartbeats=n;await this._storage.overwrite(this._heartbeatsCache)}else{
|
||
this._heartbeatsCache.heartbeats=[];this._storage.overwrite(this._heartbeatsCache)}return r}catch(e){Ne.warn(e);return""}}}function Nt(){
|
||
return(new Date).toISOString().substring(0,10)}function Dt(e,t=Pt){const n=[];let r=e.slice();for(const i of e){const e=n.find(e=>e.agent===i.agent);if(e){
|
||
e.dates.push(i.date);if(Mt(n)>t){e.dates.pop();break}}else{n.push({agent:i.agent,dates:[i.date]});if(Mt(n)>t){n.pop();break}}r=r.slice(1)}return{
|
||
heartbeatsToSend:n,unsentEntries:r}}class Lt{constructor(e){this.app=e;this._canUseIndexedDBPromise=this.runIndexedDBEnvironmentCheck()}
|
||
async runIndexedDBEnvironmentCheck(){return!!k()&&C().then(()=>!0).catch(()=>!1)}async read(){if(await this._canUseIndexedDBPromise){const e=await kt(this.app)
|
||
;return e?.heartbeats?e:{heartbeats:[]}}return{heartbeats:[]}}async overwrite(e){if(await this._canUseIndexedDBPromise){const t=await this.read()
|
||
;return Ct(this.app,{lastSentHeartbeatDate:e.lastSentHeartbeatDate??t.lastSentHeartbeatDate,heartbeats:e.heartbeats})}}async add(e){
|
||
if(await this._canUseIndexedDBPromise){const t=await this.read();return Ct(this.app,{lastSentHeartbeatDate:e.lastSentHeartbeatDate??t.lastSentHeartbeatDate,
|
||
heartbeats:[...t.heartbeats,...e.heartbeats]})}}}function Mt(e){return u(JSON.stringify({version:2,heartbeats:e})).length}function Ut(e){
|
||
if(0===e.length)return-1;let t=0,n=e[0].date;for(let r=1;r<e.length;r++)if(e[r].date<n){n=e[r].date;t=r}return t}function xt(e){
|
||
dt(new K("platform-logger",e=>new Re(e),"PRIVATE"));dt(new K("heartbeat",e=>new At(e),"PRIVATE"));vt(Oe,Ae,e);vt(Oe,Ae,"esm2020");vt("fire-js","")}xt("")
|
||
;vt("firebase","12.12.0","app");function Vt(){return{
|
||
"dependent-sdk-initialized-before-auth":"Another Firebase SDK was initialized and is trying to use Auth before Auth is initialized. Please be sure to call `initializeAuth` or `getAuth` before starting any other Firebase SDK."
|
||
}}const Ft=Vt,jt=new O("auth","Firebase",Vt()),Ht=new ie("@firebase/auth");function $t(e,...t){Ht.logLevel<=Z.WARN&&Ht.warn(`Auth (${_t}): ${e}`,...t)}
|
||
function Wt(e,...t){Ht.logLevel<=Z.ERROR&&Ht.error(`Auth (${_t}): ${e}`,...t)}function Bt(e,...t){throw Gt(e,...t)}function zt(e,...t){return Gt(e,...t)}
|
||
function Kt(e,t,n){const r={...Ft(),[t]:n};return new O("auth","Firebase",r).create(t,{appName:e.name})}function qt(e){
|
||
return Kt(e,"operation-not-supported-in-this-environment","Operations that alter the current user are not supported in conjunction with FirebaseServerApp")}
|
||
function Gt(e,...t){if("string"!=typeof e){const n=t[0],r=[...t.slice(1)];r[0]&&(r[0].appName=e.name);return e._errorFactory.create(n,...r)}
|
||
return jt.create(e,...t)}function Jt(e,t,...n){if(!e)throw Gt(t,...n)}function Yt(e){const t="INTERNAL ASSERTION FAILED: "+e;Wt(t);throw new Error(t)}
|
||
function Xt(e,t){e||Yt(t)}function Qt(){return"undefined"!=typeof self&&self.location?.href||""}function Zt(){return"http:"===en()||"https:"===en()}
|
||
function en(){return"undefined"!=typeof self&&self.location?.protocol||null}function tn(){
|
||
return!("undefined"!=typeof navigator&&navigator&&"onLine"in navigator&&"boolean"==typeof navigator.onLine&&(Zt()||b()||"connection"in navigator))||navigator.onLine
|
||
}function nn(){if("undefined"==typeof navigator)return null;const e=navigator;return e.languages&&e.languages[0]||e.language||null}class rn{constructor(e,t){
|
||
this.shortDelay=e;this.longDelay=t;Xt(t>e,"Short delay should be less than long delay!");this.isMobile=y()||T()}get(){
|
||
return tn()?this.isMobile?this.longDelay:this.shortDelay:Math.min(5e3,this.shortDelay)}}function sn(e,t){Xt(e.emulator,"Emulator should always be set here")
|
||
;const{url:n}=e.emulator;return t?`${n}${t.startsWith("/")?t.slice(1):t}`:n}class on{static initialize(e,t,n){this.fetchImpl=e;t&&(this.headersImpl=t)
|
||
;n&&(this.responseImpl=n)}static fetch(){if(this.fetchImpl)return this.fetchImpl;if("undefined"!=typeof self&&"fetch"in self)return self.fetch
|
||
;if("undefined"!=typeof globalThis&&globalThis.fetch)return globalThis.fetch;if("undefined"!=typeof fetch)return fetch
|
||
;Yt("Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static headers(){
|
||
if(this.headersImpl)return this.headersImpl;if("undefined"!=typeof self&&"Headers"in self)return self.Headers
|
||
;if("undefined"!=typeof globalThis&&globalThis.Headers)return globalThis.Headers;if("undefined"!=typeof Headers)return Headers
|
||
;Yt("Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}static response(){
|
||
if(this.responseImpl)return this.responseImpl;if("undefined"!=typeof self&&"Response"in self)return self.Response
|
||
;if("undefined"!=typeof globalThis&&globalThis.Response)return globalThis.Response;if("undefined"!=typeof Response)return Response
|
||
;Yt("Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill")}}const an={
|
||
CREDENTIAL_MISMATCH:"custom-token-mismatch",MISSING_CUSTOM_TOKEN:"internal-error",INVALID_IDENTIFIER:"invalid-email",MISSING_CONTINUE_URI:"internal-error",
|
||
INVALID_PASSWORD:"wrong-password",MISSING_PASSWORD:"missing-password",INVALID_LOGIN_CREDENTIALS:"invalid-credential",EMAIL_EXISTS:"email-already-in-use",
|
||
PASSWORD_LOGIN_DISABLED:"operation-not-allowed",INVALID_IDP_RESPONSE:"invalid-credential",INVALID_PENDING_TOKEN:"invalid-credential",
|
||
FEDERATED_USER_ID_ALREADY_LINKED:"credential-already-in-use",MISSING_REQ_TYPE:"internal-error",EMAIL_NOT_FOUND:"user-not-found",
|
||
RESET_PASSWORD_EXCEED_LIMIT:"too-many-requests",EXPIRED_OOB_CODE:"expired-action-code",INVALID_OOB_CODE:"invalid-action-code",MISSING_OOB_CODE:"internal-error",
|
||
CREDENTIAL_TOO_OLD_LOGIN_AGAIN:"requires-recent-login",INVALID_ID_TOKEN:"invalid-user-token",TOKEN_EXPIRED:"user-token-expired",
|
||
USER_NOT_FOUND:"user-token-expired",TOO_MANY_ATTEMPTS_TRY_LATER:"too-many-requests",PASSWORD_DOES_NOT_MEET_REQUIREMENTS:"password-does-not-meet-requirements",
|
||
INVALID_CODE:"invalid-verification-code",INVALID_SESSION_INFO:"invalid-verification-id",INVALID_TEMPORARY_PROOF:"invalid-credential",
|
||
MISSING_SESSION_INFO:"missing-verification-id",SESSION_EXPIRED:"code-expired",MISSING_ANDROID_PACKAGE_NAME:"missing-android-pkg-name",
|
||
UNAUTHORIZED_DOMAIN:"unauthorized-continue-uri",INVALID_OAUTH_CLIENT_ID:"invalid-oauth-client-id",ADMIN_ONLY_OPERATION:"admin-restricted-operation",
|
||
INVALID_MFA_PENDING_CREDENTIAL:"invalid-multi-factor-session",MFA_ENROLLMENT_NOT_FOUND:"multi-factor-info-not-found",
|
||
MISSING_MFA_ENROLLMENT_ID:"missing-multi-factor-info",MISSING_MFA_PENDING_CREDENTIAL:"missing-multi-factor-session",
|
||
SECOND_FACTOR_EXISTS:"second-factor-already-in-use",SECOND_FACTOR_LIMIT_EXCEEDED:"maximum-second-factor-count-exceeded",
|
||
BLOCKING_FUNCTION_ERROR_RESPONSE:"internal-error",RECAPTCHA_NOT_ENABLED:"recaptcha-not-enabled",MISSING_RECAPTCHA_TOKEN:"missing-recaptcha-token",
|
||
INVALID_RECAPTCHA_TOKEN:"invalid-recaptcha-token",INVALID_RECAPTCHA_ACTION:"invalid-recaptcha-action",MISSING_CLIENT_TYPE:"missing-client-type",
|
||
MISSING_RECAPTCHA_VERSION:"missing-recaptcha-version",INVALID_RECAPTCHA_VERSION:"invalid-recaptcha-version",INVALID_REQ_TYPE:"invalid-req-type"
|
||
},cn=["/v1/accounts:signInWithCustomToken","/v1/accounts:signInWithEmailLink","/v1/accounts:signInWithIdp","/v1/accounts:signInWithPassword","/v1/accounts:signInWithPhoneNumber","/v1/token"],un=new rn(3e4,6e4)
|
||
;function hn(e,t){return e.tenantId&&!t.tenantId?{...t,tenantId:e.tenantId}:t}async function ln(e,t,n,r,i={}){return dn(e,i,async()=>{let i={},s={}
|
||
;r&&("GET"===t?s=r:i={body:JSON.stringify(r)});const o=U({key:e.config.apiKey,...s}).slice(1),a=await e._getAdditionalHeaders()
|
||
;a["Content-Type"]="application/json";e.languageCode&&(a["X-Firebase-Locale"]=e.languageCode);const c={method:t,headers:a,...i}
|
||
;E()||(c.referrerPolicy="no-referrer");e.emulatorConfig&&B(e.emulatorConfig.host)&&(c.credentials="include")
|
||
;return on.fetch()(await fn(e,e.config.apiHost,n,o),c)})}async function dn(e,t,n){e._canInitEmulator=!1;const r={...an,...t};try{
|
||
const t=new gn(e),i=await Promise.race([n(),t.promise]);t.clearNetworkTimeout();const s=await i.json()
|
||
;if("needConfirmation"in s)throw _n(e,"account-exists-with-different-credential",s);if(i.ok&&!("errorMessage"in s))return s;{
|
||
const t=i.ok?s.errorMessage:s.error.message,[n,o]=t.split(" : ");if("FEDERATED_USER_ID_ALREADY_LINKED"===n)throw _n(e,"credential-already-in-use",s)
|
||
;if("EMAIL_EXISTS"===n)throw _n(e,"email-already-in-use",s);if("USER_DISABLED"===n)throw _n(e,"user-disabled",s)
|
||
;const a=r[n]||n.toLowerCase().replace(/[_\s]+/g,"-");if(o)throw Kt(e,a,o);Bt(e,a)}}catch(t){if(t instanceof P)throw t;Bt(e,"network-request-failed",{
|
||
message:String(t)})}}async function pn(e,t,n,r,i={}){const s=await ln(e,t,n,r,i);"mfaPendingCredential"in s&&Bt(e,"multi-factor-auth-required",{
|
||
_serverResponse:s});return s}async function fn(e,t,n,r){const i=`${t}${n}?${r}`,s=e,o=s.config.emulator?sn(e.config,i):`${e.config.apiScheme}://${i}`
|
||
;if(cn.includes(n)){await s._persistenceManagerAvailable;if("COOKIE"===s._getPersistenceType()){return s._getPersistence()._getFinalTarget(o).toString()}}
|
||
return o}function mn(e){switch(e){case"ENFORCE":return"ENFORCE";case"AUDIT":return"AUDIT";case"OFF":return"OFF";default:return"ENFORCEMENT_STATE_UNSPECIFIED"}}
|
||
class gn{clearNetworkTimeout(){clearTimeout(this.timer)}constructor(e){this.auth=e;this.timer=null;this.promise=new Promise((e,t)=>{
|
||
this.timer=setTimeout(()=>t(zt(this.auth,"network-request-failed")),un.get())})}}function _n(e,t,n){const r={appName:e.name};n.email&&(r.email=n.email)
|
||
;n.phoneNumber&&(r.phoneNumber=n.phoneNumber);const i=zt(e,t,r);i.customData._tokenResponse=n;return i}function wn(e){return void 0!==e&&void 0!==e.enterprise}
|
||
class In{constructor(e){this.siteKey="";this.recaptchaEnforcementState=[];if(void 0===e.recaptchaKey)throw new Error("recaptchaKey undefined")
|
||
;this.siteKey=e.recaptchaKey.split("/")[3];this.recaptchaEnforcementState=e.recaptchaEnforcementState}getProviderEnforcementState(e){
|
||
if(!this.recaptchaEnforcementState||0===this.recaptchaEnforcementState.length)return null
|
||
;for(const t of this.recaptchaEnforcementState)if(t.provider&&t.provider===e)return mn(t.enforcementState);return null}isProviderEnabled(e){
|
||
return"ENFORCE"===this.getProviderEnforcementState(e)||"AUDIT"===this.getProviderEnforcementState(e)}isAnyProviderEnabled(){
|
||
return this.isProviderEnabled("EMAIL_PASSWORD_PROVIDER")||this.isProviderEnabled("PHONE_PROVIDER")}}async function vn(e,t){
|
||
return ln(e,"GET","/v2/recaptchaConfig",hn(e,t))}async function yn(e,t){return ln(e,"POST","/v1/accounts:delete",t)}async function En(e,t){
|
||
return ln(e,"POST","/v1/accounts:lookup",t)}function bn(e){if(e)try{const t=new Date(Number(e));if(!isNaN(t.getTime()))return t.toUTCString()}catch(e){}}
|
||
function Tn(e,t=!1){return W(e).getIdToken(t)}async function Sn(e,t=!1){const n=W(e),r=await n.getIdToken(t),i=Cn(r)
|
||
;Jt(i&&i.exp&&i.auth_time&&i.iat,n.auth,"internal-error");const s="object"==typeof i.firebase?i.firebase:void 0,o=s?.sign_in_provider;return{claims:i,token:r,
|
||
authTime:bn(kn(i.auth_time)),issuedAtTime:bn(kn(i.iat)),expirationTime:bn(kn(i.exp)),signInProvider:o||null,signInSecondFactor:s?.sign_in_second_factor||null}}
|
||
function kn(e){return 1e3*Number(e)}function Cn(e){const[t,n,r]=e.split(".");if(void 0===t||void 0===n||void 0===r){
|
||
Wt("JWT malformed, contained fewer than 3 sections");return null}try{const e=h(n);if(!e){Wt("Failed to decode base64 JWT payload");return null}
|
||
return JSON.parse(e)}catch(e){Wt("Caught error parsing JWT payload as JSON",e?.toString());return null}}function Rn(e){const t=Cn(e);Jt(t,"internal-error")
|
||
;Jt(void 0!==t.exp,"internal-error");Jt(void 0!==t.iat,"internal-error");return Number(t.exp)-Number(t.iat)}async function Pn(e,t,n=!1){if(n)return t;try{
|
||
return await t}catch(t){t instanceof P&&On(t)&&e.auth.currentUser===e&&await e.auth.signOut();throw t}}function On({code:e}){
|
||
return"auth/user-disabled"===e||"auth/user-token-expired"===e}class An{constructor(e){this.user=e;this.isRunning=!1;this.timerId=null;this.errorBackoff=3e4}
|
||
_start(){if(!this.isRunning){this.isRunning=!0;this.schedule()}}_stop(){if(this.isRunning){this.isRunning=!1;null!==this.timerId&&clearTimeout(this.timerId)}}
|
||
getInterval(e){if(e){const e=this.errorBackoff;this.errorBackoff=Math.min(2*this.errorBackoff,96e4);return e}{this.errorBackoff=3e4
|
||
;const e=(this.user.stsTokenManager.expirationTime??0)-Date.now()-3e5;return Math.max(0,e)}}schedule(e=!1){if(!this.isRunning)return;const t=this.getInterval(e)
|
||
;this.timerId=setTimeout(async()=>{await this.iteration()},t)}async iteration(){try{await this.user.getIdToken(!0)}catch(e){
|
||
"auth/network-request-failed"===e?.code&&this.schedule(!0);return}this.schedule()}}class Nn{constructor(e,t){this.createdAt=e;this.lastLoginAt=t
|
||
;this._initializeTime()}_initializeTime(){this.lastSignInTime=bn(this.lastLoginAt);this.creationTime=bn(this.createdAt)}_copy(e){this.createdAt=e.createdAt
|
||
;this.lastLoginAt=e.lastLoginAt;this._initializeTime()}toJSON(){return{createdAt:this.createdAt,lastLoginAt:this.lastLoginAt}}}async function Dn(e){
|
||
const t=e.auth,n=await e.getIdToken(),r=await Pn(e,En(t,{idToken:n}));Jt(r?.users.length,t,"internal-error");const i=r.users[0];e._notifyReloadListener(i)
|
||
;const s=i.providerUserInfo?.length?Un(i.providerUserInfo):[],o=Mn(e.providerData,s),a=e.isAnonymous,c=!(e.email&&i.passwordHash||o?.length),u=!!a&&c,h={
|
||
uid:i.localId,displayName:i.displayName||null,photoURL:i.photoUrl||null,email:i.email||null,emailVerified:i.emailVerified||!1,phoneNumber:i.phoneNumber||null,
|
||
tenantId:i.tenantId||null,providerData:o,metadata:new Nn(i.createdAt,i.lastLoginAt),isAnonymous:u};Object.assign(e,h)}async function Ln(e){const t=W(e)
|
||
;await Dn(t);await t.auth._persistUserIfCurrent(t);t.auth._notifyListenersIfCurrent(t)}function Mn(e,t){
|
||
return[...e.filter(e=>!t.some(t=>t.providerId===e.providerId)),...t]}function Un(e){return e.map(({providerId:e,...t})=>({providerId:e,uid:t.rawId||"",
|
||
displayName:t.displayName||null,email:t.email||null,phoneNumber:t.phoneNumber||null,photoURL:t.photoUrl||null}))}async function xn(e,t){
|
||
const n=await dn(e,{},async()=>{const n=U({grant_type:"refresh_token",refresh_token:t
|
||
}).slice(1),{tokenApiHost:r,apiKey:i}=e.config,s=await fn(e,r,"/v1/token",`key=${i}`),o=await e._getAdditionalHeaders()
|
||
;o["Content-Type"]="application/x-www-form-urlencoded";const a={method:"POST",headers:o,body:n}
|
||
;e.emulatorConfig&&B(e.emulatorConfig.host)&&(a.credentials="include");return on.fetch()(s,a)});return{accessToken:n.access_token,expiresIn:n.expires_in,
|
||
refreshToken:n.refresh_token}}async function Vn(e,t){return ln(e,"POST","/v2/accounts:revokeToken",hn(e,t))}class Fn{constructor(){this.refreshToken=null
|
||
;this.accessToken=null;this.expirationTime=null}get isExpired(){return!this.expirationTime||Date.now()>this.expirationTime-3e4}updateFromServerResponse(e){
|
||
Jt(e.idToken,"internal-error");Jt(void 0!==e.idToken,"internal-error");Jt(void 0!==e.refreshToken,"internal-error")
|
||
;const t="expiresIn"in e&&void 0!==e.expiresIn?Number(e.expiresIn):Rn(e.idToken);this.updateTokensAndExpiration(e.idToken,e.refreshToken,t)}
|
||
updateFromIdToken(e){Jt(0!==e.length,"internal-error");const t=Rn(e);this.updateTokensAndExpiration(e,null,t)}async getToken(e,t=!1){
|
||
if(!t&&this.accessToken&&!this.isExpired)return this.accessToken;Jt(this.refreshToken,e,"user-token-expired");if(this.refreshToken){
|
||
await this.refresh(e,this.refreshToken);return this.accessToken}return null}clearRefreshToken(){this.refreshToken=null}async refresh(e,t){
|
||
const{accessToken:n,refreshToken:r,expiresIn:i}=await xn(e,t);this.updateTokensAndExpiration(n,r,Number(i))}updateTokensAndExpiration(e,t,n){
|
||
this.refreshToken=t||null;this.accessToken=e||null;this.expirationTime=Date.now()+1e3*n}static fromJSON(e,t){
|
||
const{refreshToken:n,accessToken:r,expirationTime:i}=t,s=new Fn;if(n){Jt("string"==typeof n,"internal-error",{appName:e});s.refreshToken=n}if(r){
|
||
Jt("string"==typeof r,"internal-error",{appName:e});s.accessToken=r}if(i){Jt("number"==typeof i,"internal-error",{appName:e});s.expirationTime=i}return s}
|
||
toJSON(){return{refreshToken:this.refreshToken,accessToken:this.accessToken,expirationTime:this.expirationTime}}_assign(e){this.accessToken=e.accessToken
|
||
;this.refreshToken=e.refreshToken;this.expirationTime=e.expirationTime}_clone(){return Object.assign(new Fn,this.toJSON())}_performRefresh(){
|
||
return Yt("not implemented")}}function jn(e,t){Jt("string"==typeof e||void 0===e,"internal-error",{appName:t})}class Hn{
|
||
constructor({uid:e,auth:t,stsTokenManager:n,...r}){this.providerId="firebase";this.proactiveRefresh=new An(this);this.reloadUserInfo=null
|
||
;this.reloadListener=null;this.uid=e;this.auth=t;this.stsTokenManager=n;this.accessToken=n.accessToken;this.displayName=r.displayName||null
|
||
;this.email=r.email||null;this.emailVerified=r.emailVerified||!1;this.phoneNumber=r.phoneNumber||null;this.photoURL=r.photoURL||null
|
||
;this.isAnonymous=r.isAnonymous||!1;this.tenantId=r.tenantId||null;this.providerData=r.providerData?[...r.providerData]:[]
|
||
;this.metadata=new Nn(r.createdAt||void 0,r.lastLoginAt||void 0)}async getIdToken(e){const t=await Pn(this,this.stsTokenManager.getToken(this.auth,e))
|
||
;Jt(t,this.auth,"internal-error");if(this.accessToken!==t){this.accessToken=t;await this.auth._persistUserIfCurrent(this)
|
||
;this.auth._notifyListenersIfCurrent(this)}return t}getIdTokenResult(e){return Sn(this,e)}reload(){return Ln(this)}_assign(e){if(this!==e){
|
||
Jt(this.uid===e.uid,this.auth,"internal-error");this.displayName=e.displayName;this.photoURL=e.photoURL;this.email=e.email;this.emailVerified=e.emailVerified
|
||
;this.phoneNumber=e.phoneNumber;this.isAnonymous=e.isAnonymous;this.tenantId=e.tenantId;this.providerData=e.providerData.map(e=>({...e}))
|
||
;this.metadata._copy(e.metadata);this.stsTokenManager._assign(e.stsTokenManager)}}_clone(e){const t=new Hn({...this,auth:e,
|
||
stsTokenManager:this.stsTokenManager._clone()});t.metadata._copy(this.metadata);return t}_onReload(e){Jt(!this.reloadListener,this.auth,"internal-error")
|
||
;this.reloadListener=e;if(this.reloadUserInfo){this._notifyReloadListener(this.reloadUserInfo);this.reloadUserInfo=null}}_notifyReloadListener(e){
|
||
this.reloadListener?this.reloadListener(e):this.reloadUserInfo=e}_startProactiveRefresh(){this.proactiveRefresh._start()}_stopProactiveRefresh(){
|
||
this.proactiveRefresh._stop()}async _updateTokensIfNecessary(e,t=!1){let n=!1;if(e.idToken&&e.idToken!==this.stsTokenManager.accessToken){
|
||
this.stsTokenManager.updateFromServerResponse(e);n=!0}t&&await Dn(this);await this.auth._persistUserIfCurrent(this);n&&this.auth._notifyListenersIfCurrent(this)
|
||
}async delete(){if(ft(this.auth.app))return Promise.reject(qt(this.auth));const e=await this.getIdToken();await Pn(this,yn(this.auth,{idToken:e}))
|
||
;this.stsTokenManager.clearRefreshToken();return this.auth.signOut()}toJSON(){return{uid:this.uid,email:this.email||void 0,emailVerified:this.emailVerified,
|
||
displayName:this.displayName||void 0,isAnonymous:this.isAnonymous,photoURL:this.photoURL||void 0,phoneNumber:this.phoneNumber||void 0,
|
||
tenantId:this.tenantId||void 0,providerData:this.providerData.map(e=>({...e})),stsTokenManager:this.stsTokenManager.toJSON(),
|
||
_redirectEventId:this._redirectEventId,...this.metadata.toJSON(),apiKey:this.auth.config.apiKey,appName:this.auth.name}}get refreshToken(){
|
||
return this.stsTokenManager.refreshToken||""}static _fromJSON(e,t){
|
||
const n=t.displayName??void 0,r=t.email??void 0,i=t.phoneNumber??void 0,s=t.photoURL??void 0,o=t.tenantId??void 0,a=t._redirectEventId??void 0,c=t.createdAt??void 0,u=t.lastLoginAt??void 0,{uid:h,emailVerified:l,isAnonymous:d,providerData:p,stsTokenManager:f}=t
|
||
;Jt(h&&f,e,"internal-error");const m=Fn.fromJSON(this.name,f);Jt("string"==typeof h,e,"internal-error");jn(n,e.name);jn(r,e.name)
|
||
;Jt("boolean"==typeof l,e,"internal-error");Jt("boolean"==typeof d,e,"internal-error");jn(i,e.name);jn(s,e.name);jn(o,e.name);jn(a,e.name);jn(c,e.name)
|
||
;jn(u,e.name);const g=new Hn({uid:h,auth:e,email:r,emailVerified:l,displayName:n,isAnonymous:d,photoURL:s,phoneNumber:i,tenantId:o,stsTokenManager:m,
|
||
createdAt:c,lastLoginAt:u});p&&Array.isArray(p)&&(g.providerData=p.map(e=>({...e})));a&&(g._redirectEventId=a);return g}
|
||
static async _fromIdTokenResponse(e,t,n=!1){const r=new Fn;r.updateFromServerResponse(t);const i=new Hn({uid:t.localId,auth:e,stsTokenManager:r,isAnonymous:n})
|
||
;await Dn(i);return i}static async _fromGetAccountInfoResponse(e,t,n){const r=t.users[0];Jt(void 0!==r.localId,"internal-error")
|
||
;const i=void 0!==r.providerUserInfo?Un(r.providerUserInfo):[],s=!(r.email&&r.passwordHash||i?.length),o=new Fn;o.updateFromIdToken(n);const a=new Hn({
|
||
uid:r.localId,auth:e,stsTokenManager:o,isAnonymous:s}),c={uid:r.localId,displayName:r.displayName||null,photoURL:r.photoUrl||null,email:r.email||null,
|
||
emailVerified:r.emailVerified||!1,phoneNumber:r.phoneNumber||null,tenantId:r.tenantId||null,providerData:i,metadata:new Nn(r.createdAt,r.lastLoginAt),
|
||
isAnonymous:!(r.email&&r.passwordHash||i?.length)};Object.assign(a,c);return a}}const $n=new Map;function Wn(e){
|
||
Xt(e instanceof Function,"Expected a class definition");let t=$n.get(e);if(t){Xt(t instanceof e,"Instance stored in cache mismatched with class");return t}
|
||
t=new e;$n.set(e,t);return t}class Bn{constructor(){this.type="NONE";this.storage={}}async _isAvailable(){return!0}async _set(e,t){this.storage[e]=t}
|
||
async _get(e){const t=this.storage[e];return void 0===t?null:t}async _remove(e){delete this.storage[e]}_addListener(e,t){}_removeListener(e,t){}}Bn.type="NONE"
|
||
;const zn=Bn;function Kn(e,t,n){return`firebase:${e}:${t}:${n}`}class qn{constructor(e,t,n){this.persistence=e;this.auth=t;this.userKey=n
|
||
;const{config:r,name:i}=this.auth;this.fullUserKey=Kn(this.userKey,r.apiKey,i);this.fullPersistenceKey=Kn("persistence",r.apiKey,i)
|
||
;this.boundEventHandler=t._onStorageEvent.bind(t);this.persistence._addListener(this.fullUserKey,this.boundEventHandler)}setCurrentUser(e){
|
||
return this.persistence._set(this.fullUserKey,e.toJSON())}async getCurrentUser(){const e=await this.persistence._get(this.fullUserKey);if(!e)return null
|
||
;if("string"==typeof e){const t=await En(this.auth,{idToken:e}).catch(()=>{});return t?Hn._fromGetAccountInfoResponse(this.auth,t,e):null}
|
||
return Hn._fromJSON(this.auth,e)}removeCurrentUser(){return this.persistence._remove(this.fullUserKey)}savePersistenceForRedirect(){
|
||
return this.persistence._set(this.fullPersistenceKey,this.persistence.type)}async setPersistence(e){if(this.persistence===e)return
|
||
;const t=await this.getCurrentUser();await this.removeCurrentUser();this.persistence=e;return t?this.setCurrentUser(t):void 0}delete(){
|
||
this.persistence._removeListener(this.fullUserKey,this.boundEventHandler)}static async create(e,t,n="authUser"){if(!t.length)return new qn(Wn(zn),e,n)
|
||
;const r=(await Promise.all(t.map(async e=>{if(await e._isAvailable())return e}))).filter(e=>e);let i=r[0]||Wn(zn);const s=Kn(n,e.config.apiKey,e.name)
|
||
;let o=null;for(const n of t)try{const t=await n._get(s);if(t){let r;if("string"==typeof t){const n=await En(e,{idToken:t}).catch(()=>{});if(!n)break
|
||
;r=await Hn._fromGetAccountInfoResponse(e,n,t)}else r=Hn._fromJSON(e,t);n!==i&&(o=r);i=n;break}}catch{}const a=r.filter(e=>e._shouldAllowMigration)
|
||
;if(!i._shouldAllowMigration||!a.length)return new qn(i,e,n);i=a[0];o&&await i._set(s,o.toJSON());await Promise.all(t.map(async e=>{if(e!==i)try{
|
||
await e._remove(s)}catch{}}));return new qn(i,e,n)}}function Gn(e){const t=e.toLowerCase()
|
||
;if(t.includes("opera/")||t.includes("opr/")||t.includes("opios/"))return"Opera";if(Qn(t))return"IEMobile"
|
||
;if(t.includes("msie")||t.includes("trident/"))return"IE";if(t.includes("edge/"))return"Edge";if(Jn(t))return"Firefox";if(t.includes("silk/"))return"Silk"
|
||
;if(er(t))return"Blackberry";if(tr(t))return"Webos";if(Yn(t))return"Safari";if((t.includes("chrome/")||Xn(t))&&!t.includes("edge/"))return"Chrome"
|
||
;if(Zn(t))return"Android";{const t=/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/,n=e.match(t);if(2===n?.length)return n[1]}return"Other"}function Jn(e=v()){
|
||
return/firefox\//i.test(e)}function Yn(e=v()){const t=e.toLowerCase()
|
||
;return t.includes("safari/")&&!t.includes("chrome/")&&!t.includes("crios/")&&!t.includes("android")}function Xn(e=v()){return/crios\//i.test(e)}
|
||
function Qn(e=v()){return/iemobile/i.test(e)}function Zn(e=v()){return/android/i.test(e)}function er(e=v()){return/blackberry/i.test(e)}function tr(e=v()){
|
||
return/webos/i.test(e)}function nr(e=v()){return/iphone|ipad|ipod/i.test(e)||/macintosh/i.test(e)&&/mobile/i.test(e)}function rr(e=v()){
|
||
return nr(e)&&!!window.navigator?.standalone}function ir(){return S()&&10===document.documentMode}function sr(e=v()){
|
||
return nr(e)||Zn(e)||tr(e)||er(e)||/windows phone/i.test(e)||Qn(e)}function or(e,t=[]){let n;switch(e){case"Browser":n=Gn(v());break;case"Worker":
|
||
n=`${Gn(v())}-${e}`;break;default:n=e}const r=t.length?t.join(","):"FirebaseCore-web";return`${n}/JsCore/${_t}/${r}`}class ar{constructor(e){this.auth=e
|
||
;this.queue=[]}pushCallback(e,t){const n=t=>new Promise((n,r)=>{try{n(e(t))}catch(e){r(e)}});n.onAbort=t;this.queue.push(n);const r=this.queue.length-1
|
||
;return()=>{this.queue[r]=()=>Promise.resolve()}}async runMiddleware(e){if(this.auth.currentUser===e)return;const t=[];try{for(const n of this.queue){await n(e)
|
||
;n.onAbort&&t.push(n.onAbort)}}catch(e){t.reverse();for(const e of t)try{e()}catch(e){}throw this.auth._errorFactory.create("login-blocked",{
|
||
originalMessage:e?.message})}}}async function cr(e,t={}){return ln(e,"GET","/v2/passwordPolicy",hn(e,t))}const ur=6;class hr{constructor(e){
|
||
const t=e.customStrengthOptions;this.customStrengthOptions={};this.customStrengthOptions.minPasswordLength=t.minPasswordLength??ur
|
||
;t.maxPasswordLength&&(this.customStrengthOptions.maxPasswordLength=t.maxPasswordLength)
|
||
;void 0!==t.containsLowercaseCharacter&&(this.customStrengthOptions.containsLowercaseLetter=t.containsLowercaseCharacter)
|
||
;void 0!==t.containsUppercaseCharacter&&(this.customStrengthOptions.containsUppercaseLetter=t.containsUppercaseCharacter)
|
||
;void 0!==t.containsNumericCharacter&&(this.customStrengthOptions.containsNumericCharacter=t.containsNumericCharacter)
|
||
;void 0!==t.containsNonAlphanumericCharacter&&(this.customStrengthOptions.containsNonAlphanumericCharacter=t.containsNonAlphanumericCharacter)
|
||
;this.enforcementState=e.enforcementState;"ENFORCEMENT_STATE_UNSPECIFIED"===this.enforcementState&&(this.enforcementState="OFF")
|
||
;this.allowedNonAlphanumericCharacters=e.allowedNonAlphanumericCharacters?.join("")??"";this.forceUpgradeOnSignin=e.forceUpgradeOnSignin??!1
|
||
;this.schemaVersion=e.schemaVersion}validatePassword(e){const t={isValid:!0,passwordPolicy:this};this.validatePasswordLengthOptions(e,t)
|
||
;this.validatePasswordCharacterOptions(e,t);t.isValid&&(t.isValid=t.meetsMinPasswordLength??!0);t.isValid&&(t.isValid=t.meetsMaxPasswordLength??!0)
|
||
;t.isValid&&(t.isValid=t.containsLowercaseLetter??!0);t.isValid&&(t.isValid=t.containsUppercaseLetter??!0);t.isValid&&(t.isValid=t.containsNumericCharacter??!0)
|
||
;t.isValid&&(t.isValid=t.containsNonAlphanumericCharacter??!0);return t}validatePasswordLengthOptions(e,t){
|
||
const n=this.customStrengthOptions.minPasswordLength,r=this.customStrengthOptions.maxPasswordLength;n&&(t.meetsMinPasswordLength=e.length>=n)
|
||
;r&&(t.meetsMaxPasswordLength=e.length<=r)}validatePasswordCharacterOptions(e,t){this.updatePasswordCharacterOptionsStatuses(t,!1,!1,!1,!1);let n
|
||
;for(let r=0;r<e.length;r++){n=e.charAt(r)
|
||
;this.updatePasswordCharacterOptionsStatuses(t,n>="a"&&n<="z",n>="A"&&n<="Z",n>="0"&&n<="9",this.allowedNonAlphanumericCharacters.includes(n))}}
|
||
updatePasswordCharacterOptionsStatuses(e,t,n,r,i){this.customStrengthOptions.containsLowercaseLetter&&(e.containsLowercaseLetter||(e.containsLowercaseLetter=t))
|
||
;this.customStrengthOptions.containsUppercaseLetter&&(e.containsUppercaseLetter||(e.containsUppercaseLetter=n))
|
||
;this.customStrengthOptions.containsNumericCharacter&&(e.containsNumericCharacter||(e.containsNumericCharacter=r))
|
||
;this.customStrengthOptions.containsNonAlphanumericCharacter&&(e.containsNonAlphanumericCharacter||(e.containsNonAlphanumericCharacter=i))}}class lr{
|
||
constructor(e,t,n,r){this.app=e;this.heartbeatServiceProvider=t;this.appCheckServiceProvider=n;this.config=r;this.currentUser=null;this.emulatorConfig=null
|
||
;this.operations=Promise.resolve();this.authStateSubscription=new pr(this);this.idTokenSubscription=new pr(this);this.beforeStateQueue=new ar(this)
|
||
;this.redirectUser=null;this.isProactiveRefreshEnabled=!1;this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION=1;this._canInitEmulator=!0;this._isInitialized=!1
|
||
;this._deleted=!1;this._initializationPromise=null;this._popupRedirectResolver=null;this._errorFactory=jt;this._agentRecaptchaConfig=null
|
||
;this._tenantRecaptchaConfigs={};this._projectPasswordPolicy=null;this._tenantPasswordPolicies={};this._resolvePersistenceManagerAvailable=void 0
|
||
;this.lastNotifiedUid=void 0;this.languageCode=null;this.tenantId=null;this.settings={appVerificationDisabledForTesting:!1};this.frameworks=[];this.name=e.name
|
||
;this.clientVersion=r.sdkClientVersion;this._persistenceManagerAvailable=new Promise(e=>this._resolvePersistenceManagerAvailable=e)}
|
||
_initializeWithPersistence(e,t){t&&(this._popupRedirectResolver=Wn(t));this._initializationPromise=this.queue(async()=>{if(!this._deleted){
|
||
this.persistenceManager=await qn.create(this,e);this._resolvePersistenceManagerAvailable?.();if(!this._deleted){
|
||
if(this._popupRedirectResolver?._shouldInitProactively)try{await this._popupRedirectResolver._initialize(this)}catch(e){}await this.initializeCurrentUser(t)
|
||
;this.lastNotifiedUid=this.currentUser?.uid||null;this._deleted||(this._isInitialized=!0)}}});return this._initializationPromise}async _onStorageEvent(){
|
||
if(this._deleted)return;const e=await this.assertedPersistence.getCurrentUser();if(this.currentUser||e)if(this.currentUser&&e&&this.currentUser.uid===e.uid){
|
||
this._currentUser._assign(e);await this.currentUser.getIdToken()}else await this._updateCurrentUser(e,!0)}async initializeCurrentUserFromIdToken(e){try{
|
||
const t=await En(this,{idToken:e}),n=await Hn._fromGetAccountInfoResponse(this,t,e);await this.directlySetCurrentUser(n)}catch(e){
|
||
await this.directlySetCurrentUser(null)}}async initializeCurrentUser(e){if(ft(this.app)){const e=this.app.settings.authIdToken;return e?new Promise(t=>{
|
||
setTimeout(()=>this.initializeCurrentUserFromIdToken(e).then(t,t))}):this.directlySetCurrentUser(null)}const t=await this.assertedPersistence.getCurrentUser()
|
||
;let n=t,r=!1;if(e&&this.config.authDomain){await this.getOrInitRedirectPersistenceManager()
|
||
;const t=this.redirectUser?._redirectEventId,i=n?._redirectEventId,s=await this.tryRedirectSignIn(e);if((!t||t===i)&&s?.user){n=s.user;r=!0}}
|
||
if(!n)return this.directlySetCurrentUser(null);if(!n._redirectEventId){if(r)try{await this.beforeStateQueue.runMiddleware(n)}catch(e){n=t
|
||
;this._popupRedirectResolver._overrideRedirectResult(this,()=>Promise.reject(e))}
|
||
return n?this.reloadAndSetCurrentUserOrClear(n):this.directlySetCurrentUser(null)}Jt(this._popupRedirectResolver,this,"argument-error")
|
||
;await this.getOrInitRedirectPersistenceManager()
|
||
;return this.redirectUser&&this.redirectUser._redirectEventId===n._redirectEventId?this.directlySetCurrentUser(n):this.reloadAndSetCurrentUserOrClear(n)}
|
||
async tryRedirectSignIn(e){let t=null;try{t=await this._popupRedirectResolver._completeRedirectFn(this,e,!0)}catch(e){await this._setRedirectUser(null)}return t
|
||
}async reloadAndSetCurrentUserOrClear(e){try{await Dn(e)}catch(e){if("auth/network-request-failed"!==e?.code)return this.directlySetCurrentUser(null)}
|
||
return this.directlySetCurrentUser(e)}useDeviceLanguage(){this.languageCode=nn()}async _delete(){this._deleted=!0}async updateCurrentUser(e){
|
||
if(ft(this.app))return Promise.reject(qt(this));const t=e?W(e):null;t&&Jt(t.auth.config.apiKey===this.config.apiKey,this,"invalid-user-token")
|
||
;return this._updateCurrentUser(t&&t._clone(this))}async _updateCurrentUser(e,t=!1){if(!this._deleted){
|
||
e&&Jt(this.tenantId===e.tenantId,this,"tenant-id-mismatch");t||await this.beforeStateQueue.runMiddleware(e);return this.queue(async()=>{
|
||
await this.directlySetCurrentUser(e);this.notifyAuthListeners()})}}async signOut(){if(ft(this.app))return Promise.reject(qt(this))
|
||
;await this.beforeStateQueue.runMiddleware(null);(this.redirectPersistenceManager||this._popupRedirectResolver)&&await this._setRedirectUser(null)
|
||
;return this._updateCurrentUser(null,!0)}setPersistence(e){return ft(this.app)?Promise.reject(qt(this)):this.queue(async()=>{
|
||
await this.assertedPersistence.setPersistence(Wn(e))})}_getRecaptchaConfig(){
|
||
return null==this.tenantId?this._agentRecaptchaConfig:this._tenantRecaptchaConfigs[this.tenantId]}async validatePassword(e){
|
||
this._getPasswordPolicyInternal()||await this._updatePasswordPolicy();const t=this._getPasswordPolicyInternal()
|
||
;return t.schemaVersion!==this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION?Promise.reject(this._errorFactory.create("unsupported-password-policy-schema-version",{})):t.validatePassword(e)
|
||
}_getPasswordPolicyInternal(){return null===this.tenantId?this._projectPasswordPolicy:this._tenantPasswordPolicies[this.tenantId]}async _updatePasswordPolicy(){
|
||
const e=await cr(this),t=new hr(e);null===this.tenantId?this._projectPasswordPolicy=t:this._tenantPasswordPolicies[this.tenantId]=t}_getPersistenceType(){
|
||
return this.assertedPersistence.persistence.type}_getPersistence(){return this.assertedPersistence.persistence}_updateErrorMap(e){
|
||
this._errorFactory=new O("auth","Firebase",e())}onAuthStateChanged(e,t,n){return this.registerStateListener(this.authStateSubscription,e,t,n)}
|
||
beforeAuthStateChanged(e,t){return this.beforeStateQueue.pushCallback(e,t)}onIdTokenChanged(e,t,n){
|
||
return this.registerStateListener(this.idTokenSubscription,e,t,n)}authStateReady(){return new Promise((e,t)=>{if(this.currentUser)e();else{
|
||
const n=this.onAuthStateChanged(()=>{n();e()},t)}})}async revokeAccessToken(e){if(this.currentUser){const t={providerId:"apple.com",tokenType:"ACCESS_TOKEN",
|
||
token:e,idToken:await this.currentUser.getIdToken()};null!=this.tenantId&&(t.tenantId=this.tenantId);await Vn(this,t)}}toJSON(){return{
|
||
apiKey:this.config.apiKey,authDomain:this.config.authDomain,appName:this.name,currentUser:this._currentUser?.toJSON()}}async _setRedirectUser(e,t){
|
||
const n=await this.getOrInitRedirectPersistenceManager(t);return null===e?n.removeCurrentUser():n.setCurrentUser(e)}
|
||
async getOrInitRedirectPersistenceManager(e){if(!this.redirectPersistenceManager){const t=e&&Wn(e)||this._popupRedirectResolver;Jt(t,this,"argument-error")
|
||
;this.redirectPersistenceManager=await qn.create(this,[Wn(t._redirectPersistence)],"redirectUser")
|
||
;this.redirectUser=await this.redirectPersistenceManager.getCurrentUser()}return this.redirectPersistenceManager}async _redirectUserForId(e){
|
||
this._isInitialized&&await this.queue(async()=>{})
|
||
;return this._currentUser?._redirectEventId===e?this._currentUser:this.redirectUser?._redirectEventId===e?this.redirectUser:null}async _persistUserIfCurrent(e){
|
||
if(e===this.currentUser)return this.queue(async()=>this.directlySetCurrentUser(e))}_notifyListenersIfCurrent(e){e===this.currentUser&&this.notifyAuthListeners()
|
||
}_key(){return`${this.config.authDomain}:${this.config.apiKey}:${this.name}`}_startProactiveRefresh(){this.isProactiveRefreshEnabled=!0
|
||
;this.currentUser&&this._currentUser._startProactiveRefresh()}_stopProactiveRefresh(){this.isProactiveRefreshEnabled=!1
|
||
;this.currentUser&&this._currentUser._stopProactiveRefresh()}get _currentUser(){return this.currentUser}notifyAuthListeners(){if(!this._isInitialized)return
|
||
;this.idTokenSubscription.next(this.currentUser);const e=this.currentUser?.uid??null;if(this.lastNotifiedUid!==e){this.lastNotifiedUid=e
|
||
;this.authStateSubscription.next(this.currentUser)}}registerStateListener(e,t,n,r){if(this._deleted)return()=>{};const i="function"==typeof t?t:t.next.bind(t)
|
||
;let s=!1;const o=this._isInitialized?Promise.resolve():this._initializationPromise;Jt(o,this,"internal-error");o.then(()=>{s||i(this.currentUser)})
|
||
;if("function"==typeof t){const i=e.addObserver(t,n,r);return()=>{s=!0;i()}}{const n=e.addObserver(t);return()=>{s=!0;n()}}}async directlySetCurrentUser(e){
|
||
this.currentUser&&this.currentUser!==e&&this._currentUser._stopProactiveRefresh();e&&this.isProactiveRefreshEnabled&&e._startProactiveRefresh()
|
||
;this.currentUser=e;e?await this.assertedPersistence.setCurrentUser(e):await this.assertedPersistence.removeCurrentUser()}queue(e){
|
||
this.operations=this.operations.then(e,e);return this.operations}get assertedPersistence(){Jt(this.persistenceManager,this,"internal-error")
|
||
;return this.persistenceManager}_logFramework(e){if(e&&!this.frameworks.includes(e)){this.frameworks.push(e);this.frameworks.sort()
|
||
;this.clientVersion=or(this.config.clientPlatform,this._getFrameworks())}}_getFrameworks(){return this.frameworks}async _getAdditionalHeaders(){const e={
|
||
"X-Client-Version":this.clientVersion};this.app.options.appId&&(e["X-Firebase-gmpid"]=this.app.options.appId)
|
||
;const t=await(this.heartbeatServiceProvider.getImmediate({optional:!0})?.getHeartbeatsHeader());t&&(e["X-Firebase-Client"]=t)
|
||
;const n=await this._getAppCheckToken();n&&(e["X-Firebase-AppCheck"]=n);return e}async _getAppCheckToken(){
|
||
if(ft(this.app)&&this.app.settings.appCheckToken)return this.app.settings.appCheckToken;const e=await(this.appCheckServiceProvider.getImmediate({optional:!0
|
||
})?.getToken());e?.error&&$t(`Error while retrieving App Check token: ${e.error}`);return e?.token}}function dr(e){return W(e)}class pr{constructor(e){
|
||
this.auth=e;this.observer=null;this.addObserver=F(e=>this.observer=e)}get next(){Jt(this.observer,this.auth,"internal-error")
|
||
;return this.observer.next.bind(this.observer)}}let fr={async loadJS(){throw new Error("Unable to load external scripts")},recaptchaV2Script:"",
|
||
recaptchaEnterpriseScript:"",gapiScript:""};function mr(e){fr=e}function gr(e){return fr.loadJS(e)}function _r(){return fr.recaptchaEnterpriseScript}
|
||
function wr(){return fr.gapiScript}function Ir(e){return`__${e}${Math.floor(1e6*Math.random())}`}class vr{constructor(){this.enterprise=new yr}ready(e){e()}
|
||
execute(e,t){return Promise.resolve("token")}render(e,t){return""}}class yr{ready(e){e()}execute(e,t){return Promise.resolve("token")}render(e,t){return""}}
|
||
const Er="recaptcha-enterprise",br="NO_RECAPTCHA";class Tr{constructor(e){this.type=Er;this.auth=dr(e)}async verify(e="verify",t=!1){async function n(e){if(!t){
|
||
if(null==e.tenantId&&null!=e._agentRecaptchaConfig)return e._agentRecaptchaConfig.siteKey
|
||
;if(null!=e.tenantId&&void 0!==e._tenantRecaptchaConfigs[e.tenantId])return e._tenantRecaptchaConfigs[e.tenantId].siteKey}return new Promise(async(t,n)=>{vn(e,{
|
||
clientType:"CLIENT_TYPE_WEB",version:"RECAPTCHA_ENTERPRISE"}).then(r=>{if(void 0!==r.recaptchaKey){const n=new In(r)
|
||
;null==e.tenantId?e._agentRecaptchaConfig=n:e._tenantRecaptchaConfigs[e.tenantId]=n;return t(n.siteKey)}n(new Error("recaptcha Enterprise site key undefined"))
|
||
}).catch(e=>{n(e)})})}function r(t,n,r){const i=window.grecaptcha;wn(i)?i.enterprise.ready(()=>{i.enterprise.execute(t,{action:e}).then(e=>{n(e)}).catch(()=>{
|
||
n(br)})}):r(Error("No reCAPTCHA enterprise script loaded."))}if(this.auth.settings.appVerificationDisabledForTesting){return(new vr).execute("siteKey",{
|
||
action:"verify"})}return new Promise((e,i)=>{n(this.auth).then(n=>{if(!t&&wn(window.grecaptcha))r(n,e,i);else{if("undefined"==typeof window){
|
||
i(new Error("RecaptchaVerifier is only supported in browser"));return}let t=_r();0!==t.length&&(t+=n);gr(t).then(()=>{r(n,e,i)}).catch(e=>{i(e)})}}).catch(e=>{
|
||
i(e)})})}}async function Sr(e,t,n,r=!1,i=!1){const s=new Tr(e);let o;if(i)o=br;else try{o=await s.verify(n)}catch(e){o=await s.verify(n,!0)}const a={...t}
|
||
;if("mfaSmsEnrollment"===n||"mfaSmsSignIn"===n){if("phoneEnrollmentInfo"in a){const e=a.phoneEnrollmentInfo.phoneNumber,t=a.phoneEnrollmentInfo.recaptchaToken
|
||
;Object.assign(a,{phoneEnrollmentInfo:{phoneNumber:e,recaptchaToken:t,captchaResponse:o,clientType:"CLIENT_TYPE_WEB",recaptchaVersion:"RECAPTCHA_ENTERPRISE"}})
|
||
}else if("phoneSignInInfo"in a){const e=a.phoneSignInInfo.recaptchaToken;Object.assign(a,{phoneSignInInfo:{recaptchaToken:e,captchaResponse:o,
|
||
clientType:"CLIENT_TYPE_WEB",recaptchaVersion:"RECAPTCHA_ENTERPRISE"}})}return a}r?Object.assign(a,{captchaResp:o}):Object.assign(a,{captchaResponse:o})
|
||
;Object.assign(a,{clientType:"CLIENT_TYPE_WEB"});Object.assign(a,{recaptchaVersion:"RECAPTCHA_ENTERPRISE"});return a}async function kr(e,t,n,r,i){
|
||
if("EMAIL_PASSWORD_PROVIDER"===i){if(e._getRecaptchaConfig()?.isProviderEnabled("EMAIL_PASSWORD_PROVIDER")){const i=await Sr(e,t,n,"getOobCode"===n)
|
||
;return r(e,i)}return r(e,t).catch(async i=>{if("auth/missing-recaptcha-token"===i.code){const i=await Sr(e,t,n,"getOobCode"===n);return r(e,i)}
|
||
return Promise.reject(i)})}if("PHONE_PROVIDER"===i){if(e._getRecaptchaConfig()?.isProviderEnabled("PHONE_PROVIDER")){const i=await Sr(e,t,n)
|
||
;return r(e,i).catch(async i=>{
|
||
if("AUDIT"===e._getRecaptchaConfig()?.getProviderEnforcementState("PHONE_PROVIDER")&&("auth/missing-recaptcha-token"===i.code||"auth/invalid-app-credential"===i.code)){
|
||
const i=await Sr(e,t,n,!1,!0);return r(e,i)}return Promise.reject(i)})}{const i=await Sr(e,t,n,!1,!0);return r(e,i)}}
|
||
return Promise.reject(i+" provider is not supported.")}async function Cr(e){const t=dr(e),n=await vn(t,{clientType:"CLIENT_TYPE_WEB",
|
||
version:"RECAPTCHA_ENTERPRISE"}),r=new In(n);null==t.tenantId?t._agentRecaptchaConfig=r:t._tenantRecaptchaConfigs[t.tenantId]=r;if(r.isAnyProviderEnabled()){
|
||
new Tr(t).verify()}}function Rr(e,t){const n=pt(e,"auth");if(n.isInitialized()){const e=n.getImmediate();if(L(n.getOptions(),t??{}))return e
|
||
;Bt(e,"already-initialized")}return n.initialize({options:t})}function Pr(e,t){const n=t?.persistence||[],r=(Array.isArray(n)?n:[n]).map(Wn)
|
||
;t?.errorMap&&e._updateErrorMap(t.errorMap);e._initializeWithPersistence(r,t?.popupRedirectResolver)}function Or(e,t,n){const r=dr(e)
|
||
;Jt(/^https?:\/\//.test(t),r,"invalid-emulator-scheme");const i=!!n?.disableWarnings,s=Ar(t),{host:o,port:a}=Nr(t),c=null===a?"":`:${a}`,u={
|
||
url:`${s}//${o}${c}/`},h=Object.freeze({host:o,port:a,protocol:s.replace(":",""),options:Object.freeze({disableWarnings:i})});if(r._canInitEmulator){
|
||
r.config.emulator=u;r.emulatorConfig=h;r.settings.appVerificationDisabledForTesting=!0;B(o)?z(`${s}//${o}${c}`):i||Lr()}else{
|
||
Jt(r.config.emulator&&r.emulatorConfig,r,"emulator-config-failed");Jt(L(u,r.config.emulator)&&L(h,r.emulatorConfig),r,"emulator-config-failed")}}function Ar(e){
|
||
const t=e.indexOf(":");return t<0?"":e.substr(0,t+1)}function Nr(e){const t=Ar(e),n=/(\/\/)?([^?#/]+)/.exec(e.substr(t.length));if(!n)return{host:"",port:null}
|
||
;const r=n[2].split("@").pop()||"",i=/^(\[ [^\]]+\])(:|$)/.exec(r);if(i){const e=i[1];return{host:e,port:Dr(r.substr(e.length+1))}}{const[e,t]=r.split(":")
|
||
;return{host:e,port:Dr(t)}}}function Dr(e){if(!e)return null;const t=Number(e);return isNaN(t)?null:t}function Lr(){function e(){
|
||
const e=document.createElement("p"),t=e.style;e.innerText="Running in emulator mode. Do not use with production credentials.";t.position="fixed";t.width="100%"
|
||
;t.backgroundColor="#ffffff";t.border=".1em solid #000000";t.color="#b50000";t.bottom="0px";t.left="0px";t.margin="0px";t.zIndex="10000";t.textAlign="center"
|
||
;e.classList.add("firebase-emulator-warning");document.body.appendChild(e)}"undefined"!=typeof console&&console.info
|
||
;"undefined"!=typeof window&&"undefined"!=typeof document&&("loading"===document.readyState?window.addEventListener("DOMContentLoaded",e):e())}class Mr{
|
||
constructor(e,t){this.providerId=e;this.signInMethod=t}toJSON(){return Yt("not implemented")}_getIdTokenResponse(e){return Yt("not implemented")}
|
||
_linkToIdToken(e,t){return Yt("not implemented")}_getReauthenticationResolver(e){return Yt("not implemented")}}async function Ur(e,t){
|
||
return ln(e,"POST","/v1/accounts:signUp",t)}async function xr(e,t){return pn(e,"POST","/v1/accounts:signInWithPassword",hn(e,t))}async function Vr(e,t){
|
||
return pn(e,"POST","/v1/accounts:signInWithEmailLink",hn(e,t))}async function Fr(e,t){return pn(e,"POST","/v1/accounts:signInWithEmailLink",hn(e,t))}
|
||
class jr extends Mr{constructor(e,t,n,r=null){super("password",n);this._email=e;this._password=t;this._tenantId=r}static _fromEmailAndPassword(e,t){
|
||
return new jr(e,t,"password")}static _fromEmailAndCode(e,t,n=null){return new jr(e,t,"emailLink",n)}toJSON(){return{email:this._email,password:this._password,
|
||
signInMethod:this.signInMethod,tenantId:this._tenantId}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e;if(t?.email&&t?.password){
|
||
if("password"===t.signInMethod)return this._fromEmailAndPassword(t.email,t.password)
|
||
;if("emailLink"===t.signInMethod)return this._fromEmailAndCode(t.email,t.password,t.tenantId)}return null}async _getIdTokenResponse(e){
|
||
switch(this.signInMethod){case"password":return kr(e,{returnSecureToken:!0,email:this._email,password:this._password,clientType:"CLIENT_TYPE_WEB"
|
||
},"signInWithPassword",xr,"EMAIL_PASSWORD_PROVIDER");case"emailLink":return Vr(e,{email:this._email,oobCode:this._password});default:Bt(e,"internal-error")}}
|
||
async _linkToIdToken(e,t){switch(this.signInMethod){case"password":return kr(e,{idToken:t,returnSecureToken:!0,email:this._email,password:this._password,
|
||
clientType:"CLIENT_TYPE_WEB"},"signUpPassword",Ur,"EMAIL_PASSWORD_PROVIDER");case"emailLink":return Fr(e,{idToken:t,email:this._email,oobCode:this._password})
|
||
;default:Bt(e,"internal-error")}}_getReauthenticationResolver(e){return this._getIdTokenResponse(e)}}async function Hr(e,t){
|
||
return pn(e,"POST","/v1/accounts:signInWithIdp",hn(e,t))}const $r="http://localhost";class Wr extends Mr{constructor(){super(...arguments)
|
||
;this.pendingToken=null}static _fromParams(e){const t=new Wr(e.providerId,e.signInMethod);if(e.idToken||e.accessToken){e.idToken&&(t.idToken=e.idToken)
|
||
;e.accessToken&&(t.accessToken=e.accessToken);e.nonce&&!e.pendingToken&&(t.nonce=e.nonce);e.pendingToken&&(t.pendingToken=e.pendingToken)
|
||
}else if(e.oauthToken&&e.oauthTokenSecret){t.accessToken=e.oauthToken;t.secret=e.oauthTokenSecret}else Bt("argument-error");return t}toJSON(){return{
|
||
idToken:this.idToken,accessToken:this.accessToken,secret:this.secret,nonce:this.nonce,pendingToken:this.pendingToken,providerId:this.providerId,
|
||
signInMethod:this.signInMethod}}static fromJSON(e){const t="string"==typeof e?JSON.parse(e):e,{providerId:n,signInMethod:r,...i}=t;if(!n||!r)return null
|
||
;const s=new Wr(n,r);s.idToken=i.idToken||void 0;s.accessToken=i.accessToken||void 0;s.secret=i.secret;s.nonce=i.nonce;s.pendingToken=i.pendingToken||null
|
||
;return s}_getIdTokenResponse(e){return Hr(e,this.buildRequest())}_linkToIdToken(e,t){const n=this.buildRequest();n.idToken=t;return Hr(e,n)}
|
||
_getReauthenticationResolver(e){const t=this.buildRequest();t.autoCreate=!1;return Hr(e,t)}buildRequest(){const e={requestUri:$r,returnSecureToken:!0}
|
||
;if(this.pendingToken)e.pendingToken=this.pendingToken;else{const t={};this.idToken&&(t.id_token=this.idToken)
|
||
;this.accessToken&&(t.access_token=this.accessToken);this.secret&&(t.oauth_token_secret=this.secret);t.providerId=this.providerId
|
||
;this.nonce&&!this.pendingToken&&(t.nonce=this.nonce);e.postBody=U(t)}return e}}async function Br(e,t){
|
||
return ln(e,"POST","/v1/accounts:sendVerificationCode",hn(e,t))}async function zr(e,t){return pn(e,"POST","/v1/accounts:signInWithPhoneNumber",hn(e,t))}
|
||
async function Kr(e,t){const n=await pn(e,"POST","/v1/accounts:signInWithPhoneNumber",hn(e,t))
|
||
;if(n.temporaryProof)throw _n(e,"account-exists-with-different-credential",n);return n}const qr={USER_NOT_FOUND:"user-not-found"};async function Gr(e,t){
|
||
return pn(e,"POST","/v1/accounts:signInWithPhoneNumber",hn(e,{...t,operation:"REAUTH"}),qr)}class Jr extends Mr{constructor(e){super("phone","phone")
|
||
;this.params=e}static _fromVerification(e,t){return new Jr({verificationId:e,verificationCode:t})}static _fromTokenResponse(e,t){return new Jr({phoneNumber:e,
|
||
temporaryProof:t})}_getIdTokenResponse(e){return zr(e,this._makeVerificationRequest())}_linkToIdToken(e,t){return Kr(e,{idToken:t,
|
||
...this._makeVerificationRequest()})}_getReauthenticationResolver(e){return Gr(e,this._makeVerificationRequest())}_makeVerificationRequest(){
|
||
const{temporaryProof:e,phoneNumber:t,verificationId:n,verificationCode:r}=this.params;return e&&t?{temporaryProof:e,phoneNumber:t}:{sessionInfo:n,code:r}}
|
||
toJSON(){const e={providerId:this.providerId};this.params.phoneNumber&&(e.phoneNumber=this.params.phoneNumber)
|
||
;this.params.temporaryProof&&(e.temporaryProof=this.params.temporaryProof);this.params.verificationCode&&(e.verificationCode=this.params.verificationCode)
|
||
;this.params.verificationId&&(e.verificationId=this.params.verificationId);return e}static fromJSON(e){"string"==typeof e&&(e=JSON.parse(e))
|
||
;const{verificationId:t,verificationCode:n,phoneNumber:r,temporaryProof:i}=e;return n||t||r||i?new Jr({verificationId:t,verificationCode:n,phoneNumber:r,
|
||
temporaryProof:i}):null}}function Yr(e){switch(e){case"recoverEmail":return"RECOVER_EMAIL";case"resetPassword":return"PASSWORD_RESET";case"signIn":
|
||
return"EMAIL_SIGNIN";case"verifyEmail":return"VERIFY_EMAIL";case"verifyAndChangeEmail":return"VERIFY_AND_CHANGE_EMAIL";case"revertSecondFactorAddition":
|
||
return"REVERT_SECOND_FACTOR_ADDITION";default:return null}}function Xr(e){const t=x(V(e)).link,n=t?x(V(t)).deep_link_id:null,r=x(V(e)).deep_link_id
|
||
;return(r?x(V(r)).link:null)||r||n||t||e}class Qr{constructor(e){const t=x(V(e)),n=t.apiKey??null,r=t.oobCode??null,i=Yr(t.mode??null)
|
||
;Jt(n&&r&&i,"argument-error");this.apiKey=n;this.operation=i;this.code=r;this.continueUrl=t.continueUrl??null;this.languageCode=t.lang??null
|
||
;this.tenantId=t.tenantId??null}static parseLink(e){const t=Xr(e);try{return new Qr(t)}catch{return null}}}class Zr{constructor(){this.providerId=Zr.PROVIDER_ID
|
||
}static credential(e,t){return jr._fromEmailAndPassword(e,t)}static credentialWithLink(e,t){const n=Qr.parseLink(t);Jt(n,"argument-error")
|
||
;return jr._fromEmailAndCode(e,n.code,n.tenantId)}}Zr.PROVIDER_ID="password";Zr.EMAIL_PASSWORD_SIGN_IN_METHOD="password"
|
||
;Zr.EMAIL_LINK_SIGN_IN_METHOD="emailLink";class ei{constructor(e){this.providerId=e;this.defaultLanguageCode=null;this.customParameters={}}
|
||
setDefaultLanguage(e){this.defaultLanguageCode=e}setCustomParameters(e){this.customParameters=e;return this}getCustomParameters(){return this.customParameters}}
|
||
class ti extends ei{constructor(){super(...arguments);this.scopes=[]}addScope(e){this.scopes.includes(e)||this.scopes.push(e);return this}getScopes(){
|
||
return[...this.scopes]}}class ni extends ti{constructor(){super("facebook.com")}static credential(e){return Wr._fromParams({providerId:ni.PROVIDER_ID,
|
||
signInMethod:ni.FACEBOOK_SIGN_IN_METHOD,accessToken:e})}static credentialFromResult(e){return ni.credentialFromTaggedObject(e)}static credentialFromError(e){
|
||
return ni.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e||!("oauthAccessToken"in e))return null
|
||
;if(!e.oauthAccessToken)return null;try{return ni.credential(e.oauthAccessToken)}catch{return null}}}ni.FACEBOOK_SIGN_IN_METHOD="facebook.com"
|
||
;ni.PROVIDER_ID="facebook.com";class ri extends ti{constructor(){super("google.com");this.addScope("profile")}static credential(e,t){return Wr._fromParams({
|
||
providerId:ri.PROVIDER_ID,signInMethod:ri.GOOGLE_SIGN_IN_METHOD,idToken:e,accessToken:t})}static credentialFromResult(e){return ri.credentialFromTaggedObject(e)
|
||
}static credentialFromError(e){return ri.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null
|
||
;const{oauthIdToken:t,oauthAccessToken:n}=e;if(!t&&!n)return null;try{return ri.credential(t,n)}catch{return null}}}ri.GOOGLE_SIGN_IN_METHOD="google.com"
|
||
;ri.PROVIDER_ID="google.com";class ii extends ti{constructor(){super("github.com")}static credential(e){return Wr._fromParams({providerId:ii.PROVIDER_ID,
|
||
signInMethod:ii.GITHUB_SIGN_IN_METHOD,accessToken:e})}static credentialFromResult(e){return ii.credentialFromTaggedObject(e)}static credentialFromError(e){
|
||
return ii.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e||!("oauthAccessToken"in e))return null
|
||
;if(!e.oauthAccessToken)return null;try{return ii.credential(e.oauthAccessToken)}catch{return null}}}ii.GITHUB_SIGN_IN_METHOD="github.com"
|
||
;ii.PROVIDER_ID="github.com";class si extends ti{constructor(){super("twitter.com")}static credential(e,t){return Wr._fromParams({providerId:si.PROVIDER_ID,
|
||
signInMethod:si.TWITTER_SIGN_IN_METHOD,oauthToken:e,oauthTokenSecret:t})}static credentialFromResult(e){return si.credentialFromTaggedObject(e)}
|
||
static credentialFromError(e){return si.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null
|
||
;const{oauthAccessToken:t,oauthTokenSecret:n}=e;if(!t||!n)return null;try{return si.credential(t,n)}catch{return null}}}si.TWITTER_SIGN_IN_METHOD="twitter.com"
|
||
;si.PROVIDER_ID="twitter.com";class oi{constructor(e){this.user=e.user;this.providerId=e.providerId;this._tokenResponse=e._tokenResponse
|
||
;this.operationType=e.operationType}static async _fromIdTokenResponse(e,t,n,r=!1){const i=await Hn._fromIdTokenResponse(e,n,r),s=ai(n);return new oi({user:i,
|
||
providerId:s,_tokenResponse:n,operationType:t})}static async _forOperation(e,t,n){await e._updateTokensIfNecessary(n,!0);const r=ai(n);return new oi({user:e,
|
||
providerId:r,_tokenResponse:n,operationType:t})}}function ai(e){return e.providerId?e.providerId:"phoneNumber"in e?"phone":null}class ci extends P{
|
||
constructor(e,t,n,r){super(t.code,t.message);this.operationType=n;this.user=r;Object.setPrototypeOf(this,ci.prototype);this.customData={appName:e.name,
|
||
tenantId:e.tenantId??void 0,_serverResponse:t.customData._serverResponse,operationType:n}}static _fromErrorAndOperation(e,t,n,r){return new ci(e,t,n,r)}}
|
||
function ui(e,t,n,r){return("reauthenticate"===t?n._getReauthenticationResolver(e):n._getIdTokenResponse(e)).catch(n=>{
|
||
if("auth/multi-factor-auth-required"===n.code)throw ci._fromErrorAndOperation(e,n,t,r);throw n})}async function hi(e,t,n=!1){
|
||
const r=await Pn(e,t._linkToIdToken(e.auth,await e.getIdToken()),n);return oi._forOperation(e,"link",r)}async function li(e,t,n=!1){const{auth:r}=e
|
||
;if(ft(r.app))return Promise.reject(qt(r));const i="reauthenticate";try{const s=await Pn(e,ui(r,i,t,e),n);Jt(s.idToken,r,"internal-error");const o=Cn(s.idToken)
|
||
;Jt(o,r,"internal-error");const{sub:a}=o;Jt(e.uid===a,r,"user-mismatch");return oi._forOperation(e,i,s)}catch(e){
|
||
"auth/user-not-found"===e?.code&&Bt(r,"user-mismatch");throw e}}async function di(e,t,n=!1){if(ft(e.app))return Promise.reject(qt(e))
|
||
;const r="signIn",i=await ui(e,r,t),s=await oi._fromIdTokenResponse(e,r,i);n||await e._updateCurrentUser(s.user);return s}async function pi(e,t){
|
||
return di(dr(e),t)}function fi(e,t,n,r){return W(e).onIdTokenChanged(t,n,r)}function mi(e,t,n){return W(e).beforeAuthStateChanged(t,n)}function gi(e,t){
|
||
return ln(e,"POST","/v2/accounts/mfaEnrollment:start",hn(e,t))}function _i(e,t){return ln(e,"POST","/v2/accounts/mfaEnrollment:finalize",hn(e,t))}
|
||
function wi(e,t){return ln(e,"POST","/v2/accounts/mfaEnrollment:start",hn(e,t))}function Ii(e,t){
|
||
return ln(e,"POST","/v2/accounts/mfaEnrollment:finalize",hn(e,t))}new WeakMap;const vi="__sak";class yi{constructor(e,t){this.storageRetriever=e;this.type=t}
|
||
_isAvailable(){try{if(!this.storage)return Promise.resolve(!1);this.storage.setItem(vi,"1");this.storage.removeItem(vi);return Promise.resolve(!0)}catch{
|
||
return Promise.resolve(!1)}}_set(e,t){this.storage.setItem(e,JSON.stringify(t));return Promise.resolve()}_get(e){const t=this.storage.getItem(e)
|
||
;return Promise.resolve(t?JSON.parse(t):null)}_remove(e){this.storage.removeItem(e);return Promise.resolve()}get storage(){return this.storageRetriever()}}
|
||
const Ei=1e3,bi=10;class Ti extends yi{constructor(){super(()=>window.localStorage,"LOCAL");this.boundEventHandler=(e,t)=>this.onStorageEvent(e,t)
|
||
;this.listeners={};this.localCache={};this.pollTimer=null;this.fallbackToPolling=sr();this._shouldAllowMigration=!0}forAllChangedKeys(e){
|
||
for(const t of Object.keys(this.listeners)){const n=this.storage.getItem(t),r=this.localCache[t];n!==r&&e(t,r,n)}}onStorageEvent(e,t=!1){if(!e.key){
|
||
this.forAllChangedKeys((e,t,n)=>{this.notifyListeners(e,n)});return}const n=e.key;t?this.detachListener():this.stopPolling();const r=()=>{
|
||
const e=this.storage.getItem(n);(t||this.localCache[n]!==e)&&this.notifyListeners(n,e)},i=this.storage.getItem(n)
|
||
;ir()&&i!==e.newValue&&e.newValue!==e.oldValue?setTimeout(r,bi):r()}notifyListeners(e,t){this.localCache[e]=t;const n=this.listeners[e]
|
||
;if(n)for(const e of Array.from(n))e(t?JSON.parse(t):t)}startPolling(){this.stopPolling();this.pollTimer=setInterval(()=>{this.forAllChangedKeys((e,t,n)=>{
|
||
this.onStorageEvent(new StorageEvent("storage",{key:e,oldValue:t,newValue:n}),!0)})},Ei)}stopPolling(){if(this.pollTimer){clearInterval(this.pollTimer)
|
||
;this.pollTimer=null}}attachListener(){window.addEventListener("storage",this.boundEventHandler)}detachListener(){
|
||
window.removeEventListener("storage",this.boundEventHandler)}_addListener(e,t){
|
||
0===Object.keys(this.listeners).length&&(this.fallbackToPolling?this.startPolling():this.attachListener());if(!this.listeners[e]){this.listeners[e]=new Set
|
||
;this.localCache[e]=this.storage.getItem(e)}this.listeners[e].add(t)}_removeListener(e,t){if(this.listeners[e]){this.listeners[e].delete(t)
|
||
;0===this.listeners[e].size&&delete this.listeners[e]}if(0===Object.keys(this.listeners).length){this.detachListener();this.stopPolling()}}async _set(e,t){
|
||
await super._set(e,t);this.localCache[e]=JSON.stringify(t)}async _get(e){const t=await super._get(e);this.localCache[e]=JSON.stringify(t);return t}
|
||
async _remove(e){await super._remove(e);delete this.localCache[e]}}Ti.type="LOCAL";const Si=Ti,ki=1e3;function Ci(e){
|
||
const t=e.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),n=RegExp(`${t}=([^;]+)`);return document.cookie.match(n)?.[1]??null}function Ri(e){
|
||
return`${"http:"===window.location.protocol?"__dev_":"__HOST-"}FIREBASE_${e.split(":")[3]}`}class Pi{constructor(){this.type="COOKIE"
|
||
;this.listenerUnsubscribes=new Map}_getFinalTarget(e){if(void 0===typeof window)return e;const t=new URL(`${window.location.origin}/__cookies__`)
|
||
;t.searchParams.set("finalTarget",e);return t}async _isAvailable(){
|
||
return!("boolean"==typeof isSecureContext&&!isSecureContext)&&("undefined"!=typeof navigator&&"undefined"!=typeof document&&(navigator.cookieEnabled??!0))}
|
||
async _set(e,t){}async _get(e){if(!this._isAvailable())return null;const t=Ri(e);if(window.cookieStore){const e=await window.cookieStore.get(t);return e?.value}
|
||
return Ci(t)}async _remove(e){if(!this._isAvailable())return;if(!await this._get(e))return;const t=Ri(e)
|
||
;document.cookie=`${t}=;Max-Age=34560000;Partitioned;Secure;SameSite=Strict;Path=/;Priority=High`;await fetch("/__cookies__",{method:"DELETE"}).catch(()=>{})}
|
||
_addListener(e,t){if(!this._isAvailable())return;const n=Ri(e);if(window.cookieStore){const e=e=>{const r=e.changed.find(e=>e.name===n);r&&t(r.value)
|
||
;e.deleted.find(e=>e.name===n)&&t(null)},r=()=>window.cookieStore.removeEventListener("change",e);this.listenerUnsubscribes.set(t,r)
|
||
;return window.cookieStore.addEventListener("change",e)}let r=Ci(n);const i=setInterval(()=>{const e=Ci(n);if(e!==r){t(e);r=e}},ki),s=()=>clearInterval(i)
|
||
;this.listenerUnsubscribes.set(t,s)}_removeListener(e,t){const n=this.listenerUnsubscribes.get(t);if(n){n();this.listenerUnsubscribes.delete(t)}}}
|
||
Pi.type="COOKIE";class Oi extends yi{constructor(){super(()=>window.sessionStorage,"SESSION")}_addListener(e,t){}_removeListener(e,t){}}Oi.type="SESSION"
|
||
;const Ai=Oi;function Ni(e){return Promise.all(e.map(async e=>{try{return{fulfilled:!0,value:await e}}catch(e){return{fulfilled:!1,reason:e}}}))}class Di{
|
||
constructor(e){this.eventTarget=e;this.handlersMap={};this.boundEventHandler=this.handleEvent.bind(this)}static _getInstance(e){
|
||
const t=this.receivers.find(t=>t.isListeningto(e));if(t)return t;const n=new Di(e);this.receivers.push(n);return n}isListeningto(e){return this.eventTarget===e}
|
||
async handleEvent(e){const t=e,{eventId:n,eventType:r,data:i}=t.data,s=this.handlersMap[r];if(!s?.size)return;t.ports[0].postMessage({status:"ack",eventId:n,
|
||
eventType:r});const o=Array.from(s).map(async e=>e(t.origin,i)),a=await Ni(o);t.ports[0].postMessage({status:"done",eventId:n,eventType:r,response:a})}
|
||
_subscribe(e,t){0===Object.keys(this.handlersMap).length&&this.eventTarget.addEventListener("message",this.boundEventHandler)
|
||
;this.handlersMap[e]||(this.handlersMap[e]=new Set);this.handlersMap[e].add(t)}_unsubscribe(e,t){this.handlersMap[e]&&t&&this.handlersMap[e].delete(t)
|
||
;t&&0!==this.handlersMap[e].size||delete this.handlersMap[e]
|
||
;0===Object.keys(this.handlersMap).length&&this.eventTarget.removeEventListener("message",this.boundEventHandler)}}Di.receivers=[];function Li(e="",t=10){
|
||
let n="";for(let e=0;e<t;e++)n+=Math.floor(10*Math.random());return e+n}class Mi{constructor(e){this.target=e;this.handlers=new Set}removeMessageHandler(e){
|
||
if(e.messageChannel){e.messageChannel.port1.removeEventListener("message",e.onMessage);e.messageChannel.port1.close()}this.handlers.delete(e)}
|
||
async _send(e,t,n=50){const r="undefined"!=typeof MessageChannel?new MessageChannel:null;if(!r)throw new Error("connection_unavailable");let i,s
|
||
;return new Promise((o,a)=>{const c=Li("",20);r.port1.start();const u=setTimeout(()=>{a(new Error("unsupported_event"))},n);s={messageChannel:r,onMessage(e){
|
||
const t=e;if(t.data.eventId===c)switch(t.data.status){case"ack":clearTimeout(u);i=setTimeout(()=>{a(new Error("timeout"))},3e3);break;case"done":clearTimeout(i)
|
||
;o(t.data.response);break;default:clearTimeout(u);clearTimeout(i);a(new Error("invalid_response"))}}};this.handlers.add(s)
|
||
;r.port1.addEventListener("message",s.onMessage);this.target.postMessage({eventType:e,eventId:c,data:t},[r.port2])}).finally(()=>{
|
||
s&&this.removeMessageHandler(s)})}}function Ui(){return window}function xi(e){Ui().location.href=e}function Vi(){
|
||
return void 0!==Ui().WorkerGlobalScope&&"function"==typeof Ui().importScripts}async function Fi(){if(!navigator?.serviceWorker)return null;try{
|
||
return(await navigator.serviceWorker.ready).active}catch{return null}}function ji(){return navigator?.serviceWorker?.controller||null}function Hi(){
|
||
return Vi()?self:null}const $i="firebaseLocalStorageDb",Wi=1,Bi="firebaseLocalStorage",zi="fbase_key";class Ki{constructor(e){this.request=e}toPromise(){
|
||
return new Promise((e,t)=>{this.request.addEventListener("success",()=>{e(this.request.result)});this.request.addEventListener("error",()=>{
|
||
t(this.request.error)})})}}function qi(e,t){return e.transaction([Bi],t?"readwrite":"readonly").objectStore(Bi)}function Gi(){
|
||
const e=indexedDB.deleteDatabase($i);return new Ki(e).toPromise()}function Ji(){const e=indexedDB.open($i,Wi);return new Promise((t,n)=>{
|
||
e.addEventListener("error",()=>{n(e.error)});e.addEventListener("upgradeneeded",()=>{const t=e.result;try{t.createObjectStore(Bi,{keyPath:zi})}catch(e){n(e)}})
|
||
;e.addEventListener("success",async()=>{const n=e.result;if(n.objectStoreNames.contains(Bi))t(n);else{n.close();await Gi();t(await Ji())}})})}
|
||
async function Yi(e,t,n){const r=qi(e,!0).put({[zi]:t,value:n});return new Ki(r).toPromise()}async function Xi(e,t){
|
||
const n=qi(e,!1).get(t),r=await new Ki(n).toPromise();return void 0===r?null:r.value}function Qi(e,t){const n=qi(e,!0).delete(t);return new Ki(n).toPromise()}
|
||
const Zi=800,es=3;class ts{constructor(){this.type="LOCAL";this._shouldAllowMigration=!0;this.listeners={};this.localCache={};this.pollTimer=null
|
||
;this.pendingWrites=0;this.receiver=null;this.sender=null;this.serviceWorkerReceiverAvailable=!1;this.activeServiceWorker=null
|
||
;this._workerInitializationPromise=this.initializeServiceWorkerMessaging().then(()=>{},()=>{})}async _openDb(){if(this.db)return this.db;this.db=await Ji()
|
||
;return this.db}async _withRetries(e){let t=0;for(;;)try{const t=await this._openDb();return await e(t)}catch(e){if(t++>es)throw e;if(this.db){this.db.close()
|
||
;this.db=void 0}}}async initializeServiceWorkerMessaging(){return Vi()?this.initializeReceiver():this.initializeSender()}async initializeReceiver(){
|
||
this.receiver=Di._getInstance(Hi());this.receiver._subscribe("keyChanged",async(e,t)=>({keyProcessed:(await this._poll()).includes(t.key)}))
|
||
;this.receiver._subscribe("ping",async(e,t)=>["keyChanged"])}async initializeSender(){this.activeServiceWorker=await Fi();if(!this.activeServiceWorker)return
|
||
;this.sender=new Mi(this.activeServiceWorker);const e=await this.sender._send("ping",{},800)
|
||
;e&&e[0]?.fulfilled&&e[0]?.value.includes("keyChanged")&&(this.serviceWorkerReceiverAvailable=!0)}async notifyServiceWorker(e){
|
||
if(this.sender&&this.activeServiceWorker&&ji()===this.activeServiceWorker)try{await this.sender._send("keyChanged",{key:e
|
||
},this.serviceWorkerReceiverAvailable?800:50)}catch{}}async _isAvailable(){try{if(!indexedDB)return!1;const e=await Ji();await Yi(e,vi,"1");await Qi(e,vi)
|
||
;return!0}catch{}return!1}async _withPendingWrite(e){this.pendingWrites++;try{await e()}finally{this.pendingWrites--}}async _set(e,t){
|
||
return this._withPendingWrite(async()=>{await this._withRetries(n=>Yi(n,e,t));this.localCache[e]=t;return this.notifyServiceWorker(e)})}async _get(e){
|
||
const t=await this._withRetries(t=>Xi(t,e));this.localCache[e]=t;return t}async _remove(e){return this._withPendingWrite(async()=>{
|
||
await this._withRetries(t=>Qi(t,e));delete this.localCache[e];return this.notifyServiceWorker(e)})}async _poll(){const e=await this._withRetries(e=>{
|
||
const t=qi(e,!1).getAll();return new Ki(t).toPromise()});if(!e)return[];if(0!==this.pendingWrites)return[];const t=[],n=new Set
|
||
;if(0!==e.length)for(const{fbase_key:r,value:i}of e){n.add(r);if(JSON.stringify(this.localCache[r])!==JSON.stringify(i)){this.notifyListeners(r,i);t.push(r)}}
|
||
for(const e of Object.keys(this.localCache))if(this.localCache[e]&&!n.has(e)){this.notifyListeners(e,null);t.push(e)}return t}notifyListeners(e,t){
|
||
this.localCache[e]=t;const n=this.listeners[e];if(n)for(const e of Array.from(n))e(t)}startPolling(){this.stopPolling()
|
||
;this.pollTimer=setInterval(async()=>this._poll(),Zi)}stopPolling(){if(this.pollTimer){clearInterval(this.pollTimer);this.pollTimer=null}}_addListener(e,t){
|
||
0===Object.keys(this.listeners).length&&this.startPolling();if(!this.listeners[e]){this.listeners[e]=new Set;this._get(e)}this.listeners[e].add(t)}
|
||
_removeListener(e,t){if(this.listeners[e]){this.listeners[e].delete(t);0===this.listeners[e].size&&delete this.listeners[e]}
|
||
0===Object.keys(this.listeners).length&&this.stopPolling()}}ts.type="LOCAL";const ns=ts;function rs(e,t){
|
||
return ln(e,"POST","/v2/accounts/mfaSignIn:start",hn(e,t))}function is(e,t){return ln(e,"POST","/v2/accounts/mfaSignIn:finalize",hn(e,t))}function ss(e,t){
|
||
return ln(e,"POST","/v2/accounts/mfaSignIn:finalize",hn(e,t))}Ir("rcb"),new rn(3e4,6e4);const os="recaptcha";async function as(e,t,n){
|
||
if(!e._getRecaptchaConfig())try{await Cr(e)}catch(e){}try{let r;r="string"==typeof t?{phoneNumber:t}:t;if("session"in r){const t=r.session
|
||
;if("phoneNumber"in r){Jt("enroll"===t.type,e,"internal-error");const i={idToken:t.credential,phoneEnrollmentInfo:{phoneNumber:r.phoneNumber,
|
||
clientType:"CLIENT_TYPE_WEB"}},s=kr(e,i,"mfaSmsEnrollment",async(e,t)=>{if(t.phoneEnrollmentInfo.captchaResponse===br){Jt(n?.type===os,e,"argument-error")
|
||
;return gi(e,await cs(e,t,n))}return gi(e,t)},"PHONE_PROVIDER");return(await s.catch(e=>Promise.reject(e))).phoneSessionInfo.sessionInfo}{
|
||
Jt("signin"===t.type,e,"internal-error");const i=r.multiFactorHint?.uid||r.multiFactorUid;Jt(i,e,"missing-multi-factor-info");const s={
|
||
mfaPendingCredential:t.credential,mfaEnrollmentId:i,phoneSignInInfo:{clientType:"CLIENT_TYPE_WEB"}},o=kr(e,s,"mfaSmsSignIn",async(e,t)=>{
|
||
if(t.phoneSignInInfo.captchaResponse===br){Jt(n?.type===os,e,"argument-error");return rs(e,await cs(e,t,n))}return rs(e,t)},"PHONE_PROVIDER")
|
||
;return(await o.catch(e=>Promise.reject(e))).phoneResponseInfo.sessionInfo}}{const t={phoneNumber:r.phoneNumber,clientType:"CLIENT_TYPE_WEB"
|
||
},i=kr(e,t,"sendVerificationCode",async(e,t)=>{if(t.captchaResponse===br){Jt(n?.type===os,e,"argument-error");return Br(e,await cs(e,t,n))}return Br(e,t)
|
||
},"PHONE_PROVIDER");return(await i.catch(e=>Promise.reject(e))).sessionInfo}}finally{n?._reset()}}async function cs(e,t,n){Jt(n.type===os,e,"argument-error")
|
||
;const r=await n.verify();Jt("string"==typeof r,e,"argument-error");const i={...t};if("phoneEnrollmentInfo"in i){
|
||
const e=i.phoneEnrollmentInfo.phoneNumber,t=i.phoneEnrollmentInfo.captchaResponse,n=i.phoneEnrollmentInfo.clientType,s=i.phoneEnrollmentInfo.recaptchaVersion
|
||
;Object.assign(i,{phoneEnrollmentInfo:{phoneNumber:e,recaptchaToken:r,captchaResponse:t,clientType:n,recaptchaVersion:s}});return i}if("phoneSignInInfo"in i){
|
||
const e=i.phoneSignInInfo.captchaResponse,t=i.phoneSignInInfo.clientType,n=i.phoneSignInInfo.recaptchaVersion;Object.assign(i,{phoneSignInInfo:{
|
||
recaptchaToken:r,captchaResponse:e,clientType:t,recaptchaVersion:n}});return i}Object.assign(i,{recaptchaToken:r});return i}class us{constructor(e){
|
||
this.providerId=us.PROVIDER_ID;this.auth=dr(e)}verifyPhoneNumber(e,t){return as(this.auth,e,W(t))}static credential(e,t){return Jr._fromVerification(e,t)}
|
||
static credentialFromResult(e){const t=e;return us.credentialFromTaggedObject(t)}static credentialFromError(e){
|
||
return us.credentialFromTaggedObject(e.customData||{})}static credentialFromTaggedObject({_tokenResponse:e}){if(!e)return null
|
||
;const{phoneNumber:t,temporaryProof:n}=e;return t&&n?Jr._fromTokenResponse(t,n):null}}us.PROVIDER_ID="phone";us.PHONE_SIGN_IN_METHOD="phone";function hs(e,t){
|
||
if(t)return Wn(t);Jt(e._popupRedirectResolver,e,"argument-error");return e._popupRedirectResolver}class ls extends Mr{constructor(e){super("custom","custom")
|
||
;this.params=e}_getIdTokenResponse(e){return Hr(e,this._buildIdpRequest())}_linkToIdToken(e,t){return Hr(e,this._buildIdpRequest(t))}
|
||
_getReauthenticationResolver(e){return Hr(e,this._buildIdpRequest())}_buildIdpRequest(e){const t={requestUri:this.params.requestUri,
|
||
sessionId:this.params.sessionId,postBody:this.params.postBody,tenantId:this.params.tenantId,pendingToken:this.params.pendingToken,returnSecureToken:!0,
|
||
returnIdpCredential:!0};e&&(t.idToken=e);return t}}function ds(e){return di(e.auth,new ls(e),e.bypassAuthState)}function ps(e){const{auth:t,user:n}=e
|
||
;Jt(n,t,"internal-error");return li(n,new ls(e),e.bypassAuthState)}async function fs(e){const{auth:t,user:n}=e;Jt(n,t,"internal-error")
|
||
;return hi(n,new ls(e),e.bypassAuthState)}class ms{constructor(e,t,n,r,i=!1){this.auth=e;this.resolver=n;this.user=r;this.bypassAuthState=i
|
||
;this.pendingPromise=null;this.eventManager=null;this.filter=Array.isArray(t)?t:[t]}execute(){return new Promise(async(e,t)=>{this.pendingPromise={resolve:e,
|
||
reject:t};try{this.eventManager=await this.resolver._initialize(this.auth);await this.onExecution();this.eventManager.registerConsumer(this)}catch(e){
|
||
this.reject(e)}})}async onAuthEvent(e){const{urlResponse:t,sessionId:n,postBody:r,tenantId:i,error:s,type:o}=e;if(s){this.reject(s);return}const a={
|
||
auth:this.auth,requestUri:t,sessionId:n,tenantId:i||void 0,postBody:r||void 0,user:this.user,bypassAuthState:this.bypassAuthState};try{
|
||
this.resolve(await this.getIdpTask(o)(a))}catch(e){this.reject(e)}}onError(e){this.reject(e)}getIdpTask(e){switch(e){case"signInViaPopup":
|
||
case"signInViaRedirect":return ds;case"linkViaPopup":case"linkViaRedirect":return fs;case"reauthViaPopup":case"reauthViaRedirect":return ps;default:
|
||
Bt(this.auth,"internal-error")}}resolve(e){Xt(this.pendingPromise,"Pending promise was never set");this.pendingPromise.resolve(e);this.unregisterAndCleanUp()}
|
||
reject(e){Xt(this.pendingPromise,"Pending promise was never set");this.pendingPromise.reject(e);this.unregisterAndCleanUp()}unregisterAndCleanUp(){
|
||
this.eventManager&&this.eventManager.unregisterConsumer(this);this.pendingPromise=null;this.cleanUp()}}const gs=new rn(2e3,1e4);class _s extends ms{
|
||
constructor(e,t,n,r,i){super(e,t,r,i);this.provider=n;this.authWindow=null;this.pollId=null;_s.currentPopupAction&&_s.currentPopupAction.cancel()
|
||
;_s.currentPopupAction=this}async executeNotNull(){const e=await this.execute();Jt(e,this.auth,"internal-error");return e}async onExecution(){
|
||
Xt(1===this.filter.length,"Popup operations only handle one event");const e=Li()
|
||
;this.authWindow=await this.resolver._openPopup(this.auth,this.provider,this.filter[0],e);this.authWindow.associatedEvent=e
|
||
;this.resolver._originValidation(this.auth).catch(e=>{this.reject(e)});this.resolver._isIframeWebStorageSupported(this.auth,e=>{
|
||
e||this.reject(zt(this.auth,"web-storage-unsupported"))});this.pollUserCancellation()}get eventId(){return this.authWindow?.associatedEvent||null}cancel(){
|
||
this.reject(zt(this.auth,"cancelled-popup-request"))}cleanUp(){this.authWindow&&this.authWindow.close();this.pollId&&window.clearTimeout(this.pollId)
|
||
;this.authWindow=null;this.pollId=null;_s.currentPopupAction=null}pollUserCancellation(){const e=()=>{
|
||
this.authWindow?.window?.closed?this.pollId=window.setTimeout(()=>{this.pollId=null;this.reject(zt(this.auth,"popup-closed-by-user"))
|
||
},8e3):this.pollId=window.setTimeout(e,gs.get())};e()}}_s.currentPopupAction=null;const ws="pendingRedirect",Is=new Map;class vs extends ms{
|
||
constructor(e,t,n=!1){super(e,["signInViaRedirect","linkViaRedirect","reauthViaRedirect","unknown"],t,void 0,n);this.eventId=null}async execute(){
|
||
let e=Is.get(this.auth._key());if(!e){try{const t=await ys(this.resolver,this.auth)?await super.execute():null;e=()=>Promise.resolve(t)}catch(t){
|
||
e=()=>Promise.reject(t)}Is.set(this.auth._key(),e)}this.bypassAuthState||Is.set(this.auth._key(),()=>Promise.resolve(null));return e()}async onAuthEvent(e){
|
||
if("signInViaRedirect"===e.type)return super.onAuthEvent(e);if("unknown"!==e.type){if(e.eventId){const t=await this.auth._redirectUserForId(e.eventId);if(t){
|
||
this.user=t;return super.onAuthEvent(e)}this.resolve(null)}}else this.resolve(null)}async onExecution(){}cleanUp(){}}async function ys(e,t){
|
||
const n=Ts(t),r=bs(e);if(!await r._isAvailable())return!1;const i="true"===await r._get(n);await r._remove(n);return i}function Es(e,t){Is.set(e._key(),t)}
|
||
function bs(e){return Wn(e._redirectPersistence)}function Ts(e){return Kn(ws,e.config.apiKey,e.name)}async function Ss(e,t,n=!1){
|
||
if(ft(e.app))return Promise.reject(qt(e));const r=dr(e),i=hs(r,t),s=new vs(r,i,n),o=await s.execute();if(o&&!n){delete o.user._redirectEventId
|
||
;await r._persistUserIfCurrent(o.user);await r._setRedirectUser(null,t)}return o}const ks=6e5;class Cs{constructor(e){this.auth=e;this.cachedEventUids=new Set
|
||
;this.consumers=new Set;this.queuedRedirectEvent=null;this.hasHandledPotentialRedirect=!1;this.lastProcessedEventTime=Date.now()}registerConsumer(e){
|
||
this.consumers.add(e);if(this.queuedRedirectEvent&&this.isEventForConsumer(this.queuedRedirectEvent,e)){this.sendToConsumer(this.queuedRedirectEvent,e)
|
||
;this.saveEventToCache(this.queuedRedirectEvent);this.queuedRedirectEvent=null}}unregisterConsumer(e){this.consumers.delete(e)}onEvent(e){
|
||
if(this.hasEventBeenHandled(e))return!1;let t=!1;this.consumers.forEach(n=>{if(this.isEventForConsumer(e,n)){t=!0;this.sendToConsumer(e,n)
|
||
;this.saveEventToCache(e)}});if(this.hasHandledPotentialRedirect||!Os(e))return t;this.hasHandledPotentialRedirect=!0;if(!t){this.queuedRedirectEvent=e;t=!0}
|
||
return t}sendToConsumer(e,t){if(e.error&&!Ps(e)){const n=e.error.code?.split("auth/")[1]||"internal-error";t.onError(zt(this.auth,n))}else t.onAuthEvent(e)}
|
||
isEventForConsumer(e,t){const n=null===t.eventId||!!e.eventId&&e.eventId===t.eventId;return t.filter.includes(e.type)&&n}hasEventBeenHandled(e){
|
||
Date.now()-this.lastProcessedEventTime>=ks&&this.cachedEventUids.clear();return this.cachedEventUids.has(Rs(e))}saveEventToCache(e){
|
||
this.cachedEventUids.add(Rs(e));this.lastProcessedEventTime=Date.now()}}function Rs(e){return[e.type,e.eventId,e.sessionId,e.tenantId].filter(e=>e).join("-")}
|
||
function Ps({type:e,error:t}){return"unknown"===e&&"auth/no-auth-event"===t?.code}function Os(e){switch(e.type){case"signInViaRedirect":case"linkViaRedirect":
|
||
case"reauthViaRedirect":return!0;case"unknown":return Ps(e);default:return!1}}async function As(e,t={}){return ln(e,"GET","/v1/projects",t)}
|
||
const Ns=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,Ds=/^https?/;async function Ls(e){if(e.config.emulator)return;const{authorizedDomains:t}=await As(e)
|
||
;for(const e of t)try{if(Ms(e))return}catch{}Bt(e,"unauthorized-domain")}function Ms(e){const t=Qt(),{protocol:n,hostname:r}=new URL(t)
|
||
;if(e.startsWith("chrome-extension://")){const i=new URL(e)
|
||
;return""===i.hostname&&""===r?"chrome-extension:"===n&&e.replace("chrome-extension://","")===t.replace("chrome-extension://",""):"chrome-extension:"===n&&i.hostname===r
|
||
}if(!Ds.test(n))return!1;if(Ns.test(e))return r===e;const i=e.replace(/\./g,"\\.");return new RegExp("^(.+\\."+i+"|"+i+")$","i").test(r)}
|
||
const Us=new rn(3e4,6e4);function xs(){const e=Ui().___jsl;if(e?.H)for(const t of Object.keys(e.H)){e.H[t].r=e.H[t].r||[];e.H[t].L=e.H[t].L||[]
|
||
;e.H[t].r=[...e.H[t].L];if(e.CP)for(let t=0;t<e.CP.length;t++)e.CP[t]=null}}function Vs(e){return new Promise((t,n)=>{function r(){xs()
|
||
;gapi.load("gapi.iframes",{callback:()=>{t(gapi.iframes.getContext())},ontimeout:()=>{xs();n(zt(e,"network-request-failed"))},timeout:Us.get()})}
|
||
if(Ui().gapi?.iframes?.Iframe)t(gapi.iframes.getContext());else{if(!Ui().gapi?.load){const t=Ir("iframefcb");Ui()[t]=()=>{
|
||
gapi.load?r():n(zt(e,"network-request-failed"))};return gr(`${wr()}?onload=${t}`).catch(e=>n(e))}r()}}).catch(e=>{Fs=null;throw e})}let Fs=null;function js(e){
|
||
Fs=Fs||Vs(e);return Fs}const Hs=new rn(5e3,15e3),$s="__/auth/iframe",Ws="emulator/auth/iframe",Bs={style:{position:"absolute",top:"-100px",width:"1px",
|
||
height:"1px"},"aria-hidden":"true",tabindex:"-1"
|
||
},zs=new Map([ ["identitytoolkit.googleapis.com","p"],["staging-identitytoolkit.sandbox.googleapis.com","s"],["test-identitytoolkit.sandbox.googleapis.com","t"]])
|
||
;function Ks(e){const t=e.config;Jt(t.authDomain,e,"auth-domain-config-required");const n=t.emulator?sn(t,Ws):`https://${e.config.authDomain}/${$s}`,r={
|
||
apiKey:t.apiKey,appName:e.name,v:_t},i=zs.get(e.config.apiHost);i&&(r.eid=i);const s=e._getFrameworks();s.length&&(r.fw=s.join(","))
|
||
;return`${n}?${U(r).slice(1)}`}async function qs(e){const t=await js(e),n=Ui().gapi;Jt(n,e,"internal-error");return t.open({where:document.body,url:Ks(e),
|
||
messageHandlersFilter:n.iframes.CROSS_ORIGIN_IFRAMES_FILTER,attributes:Bs,dontclear:!0},t=>new Promise(async(n,r)=>{await t.restyle({setHideOnLeave:!1})
|
||
;const i=zt(e,"network-request-failed"),s=Ui().setTimeout(()=>{r(i)},Hs.get());function o(){Ui().clearTimeout(s);n(t)}t.ping(o).then(o,()=>{r(i)})}))}const Gs={
|
||
location:"yes",resizable:"yes",statusbar:"yes",toolbar:"no"},Js=500,Ys=600,Xs="_blank",Qs="http://localhost";class Zs{constructor(e){this.window=e
|
||
;this.associatedEvent=null}close(){if(this.window)try{this.window.close()}catch(e){}}}function eo(e,t,n,r=Js,i=Ys){
|
||
const s=Math.max((window.screen.availHeight-i)/2,0).toString(),o=Math.max((window.screen.availWidth-r)/2,0).toString();let a="";const c={...Gs,
|
||
width:r.toString(),height:i.toString(),top:s,left:o},u=v().toLowerCase();n&&(a=Xn(u)?Xs:n);if(Jn(u)){t=t||Qs;c.scrollbars="yes"}
|
||
const h=Object.entries(c).reduce((e,[t,n])=>`${e}${t}=${n},`,"");if(rr(u)&&"_self"!==a){to(t||"",a);return new Zs(null)}const l=window.open(t||"",a,h)
|
||
;Jt(l,e,"popup-blocked");try{l.focus()}catch(e){}return new Zs(l)}function to(e,t){const n=document.createElement("a");n.href=e;n.target=t
|
||
;const r=document.createEvent("MouseEvent");r.initMouseEvent("click",!0,!0,window,1,0,0,0,0,!1,!1,!1,!1,1,null);n.dispatchEvent(r)}
|
||
const no="__/auth/handler",ro="emulator/auth/handler",io=encodeURIComponent("fac");async function so(e,t,n,r,i,s){
|
||
Jt(e.config.authDomain,e,"auth-domain-config-required");Jt(e.config.apiKey,e,"invalid-api-key");const o={apiKey:e.config.apiKey,appName:e.name,authType:n,
|
||
redirectUrl:r,v:_t,eventId:i};if(t instanceof ei){t.setDefaultLanguage(e.languageCode);o.providerId=t.providerId||""
|
||
;D(t.getCustomParameters())||(o.customParameters=JSON.stringify(t.getCustomParameters()));for(const[e,t]of Object.entries(s||{}))o[e]=t}if(t instanceof ti){
|
||
const e=t.getScopes().filter(e=>""!==e);e.length>0&&(o.scopes=e.join(","))}e.tenantId&&(o.tid=e.tenantId);const a=o
|
||
;for(const e of Object.keys(a))void 0===a[e]&&delete a[e];const c=await e._getAppCheckToken(),u=c?`#${io}=${encodeURIComponent(c)}`:""
|
||
;return`${oo(e)}?${U(a).slice(1)}${u}`}function oo({config:e}){return e.emulator?sn(e,ro):`https://${e.authDomain}/${no}`}const ao="webStorageSupport";class co{
|
||
constructor(){this.eventManagers={};this.iframes={};this.originValidationPromises={};this._redirectPersistence=Ai;this._completeRedirectFn=Ss
|
||
;this._overrideRedirectResult=Es}async _openPopup(e,t,n,r){Xt(this.eventManagers[e._key()]?.manager,"_initialize() not called before _openPopup()")
|
||
;return eo(e,await so(e,t,n,Qt(),r),Li())}async _openRedirect(e,t,n,r){await this._originValidation(e);xi(await so(e,t,n,Qt(),r));return new Promise(()=>{})}
|
||
_initialize(e){const t=e._key();if(this.eventManagers[t]){const{manager:e,promise:n}=this.eventManagers[t];if(e)return Promise.resolve(e)
|
||
;Xt(n,"If manager is not set, promise should be");return n}const n=this.initAndGetManager(e);this.eventManagers[t]={promise:n};n.catch(()=>{
|
||
delete this.eventManagers[t]});return n}async initAndGetManager(e){const t=await qs(e),n=new Cs(e);t.register("authEvent",t=>{
|
||
Jt(t?.authEvent,e,"invalid-auth-event");return{status:n.onEvent(t.authEvent)?"ACK":"ERROR"}},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER)
|
||
;this.eventManagers[e._key()]={manager:n};this.iframes[e._key()]=t;return n}_isIframeWebStorageSupported(e,t){this.iframes[e._key()].send(ao,{type:ao},n=>{
|
||
const r=n?.[0]?.[ao];void 0!==r&&t(!!r);Bt(e,"internal-error")},gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER)}_originValidation(e){const t=e._key()
|
||
;this.originValidationPromises[t]||(this.originValidationPromises[t]=Ls(e));return this.originValidationPromises[t]}get _shouldInitProactively(){
|
||
return sr()||Yn()||nr()}}const uo=co;class ho{constructor(e){this.factorId=e}_process(e,t,n){switch(t.type){case"enroll":
|
||
return this._finalizeEnroll(e,t.credential,n);case"signin":return this._finalizeSignIn(e,t.credential);default:return Yt("unexpected MultiFactorSessionType")}}}
|
||
class lo extends ho{constructor(e){super("phone");this.credential=e}static _fromCredential(e){return new lo(e)}_finalizeEnroll(e,t,n){return _i(e,{idToken:t,
|
||
displayName:n,phoneVerificationInfo:this.credential._makeVerificationRequest()})}_finalizeSignIn(e,t){return is(e,{mfaPendingCredential:t,
|
||
phoneVerificationInfo:this.credential._makeVerificationRequest()})}}class po{constructor(){}static assertion(e){return lo._fromCredential(e)}}
|
||
po.FACTOR_ID="phone";class fo{static assertionForEnrollment(e,t){return mo._fromSecret(e,t)}static assertionForSignIn(e,t){return mo._fromEnrollmentId(e,t)}
|
||
static async generateSecret(e){const t=e;Jt(void 0!==t.user?.auth,"internal-error");const n=await wi(t.user.auth,{idToken:t.credential,totpEnrollmentInfo:{}})
|
||
;return go._fromStartTotpMfaEnrollmentResponse(n,t.user.auth)}}fo.FACTOR_ID="totp";class mo extends ho{constructor(e,t,n){super("totp");this.otp=e
|
||
;this.enrollmentId=t;this.secret=n}static _fromSecret(e,t){return new mo(t,void 0,e)}static _fromEnrollmentId(e,t){return new mo(t,e)}
|
||
async _finalizeEnroll(e,t,n){Jt(void 0!==this.secret,e,"argument-error");return Ii(e,{idToken:t,displayName:n,
|
||
totpVerificationInfo:this.secret._makeTotpVerificationInfo(this.otp)})}async _finalizeSignIn(e,t){
|
||
Jt(void 0!==this.enrollmentId&&void 0!==this.otp,e,"argument-error");const n={verificationCode:this.otp};return ss(e,{mfaPendingCredential:t,
|
||
mfaEnrollmentId:this.enrollmentId,totpVerificationInfo:n})}}class go{constructor(e,t,n,r,i,s,o){this.sessionInfo=s;this.auth=o;this.secretKey=e
|
||
;this.hashingAlgorithm=t;this.codeLength=n;this.codeIntervalSeconds=r;this.enrollmentCompletionDeadline=i}static _fromStartTotpMfaEnrollmentResponse(e,t){
|
||
return new go(e.totpSessionInfo.sharedSecretKey,e.totpSessionInfo.hashingAlgorithm,e.totpSessionInfo.verificationCodeLength,e.totpSessionInfo.periodSec,new Date(e.totpSessionInfo.finalizeEnrollmentTime).toUTCString(),e.totpSessionInfo.sessionInfo,t)
|
||
}_makeTotpVerificationInfo(e){return{sessionInfo:this.sessionInfo,verificationCode:e}}generateQrCodeUrl(e,t){let n=!1;(_o(e)||_o(t))&&(n=!0);if(n){
|
||
_o(e)&&(e=this.auth.currentUser?.email||"unknownuser");_o(t)&&(t=this.auth.name)}
|
||
return`otpauth://totp/${t}:${e}?secret=${this.secretKey}&issuer=${t}&algorithm=${this.hashingAlgorithm}&digits=${this.codeLength}`}}function _o(e){
|
||
return void 0===e||0===e?.length}var wo="@firebase/auth",Io="1.13.0";class vo{constructor(e){this.auth=e;this.internalListeners=new Map}getUid(){
|
||
this.assertAuthConfigured();return this.auth.currentUser?.uid||null}async getToken(e){this.assertAuthConfigured();await this.auth._initializationPromise
|
||
;if(!this.auth.currentUser)return null;return{accessToken:await this.auth.currentUser.getIdToken(e)}}addAuthTokenListener(e){this.assertAuthConfigured()
|
||
;if(this.internalListeners.has(e))return;const t=this.auth.onIdTokenChanged(t=>{e(t?.stsTokenManager.accessToken||null)});this.internalListeners.set(e,t)
|
||
;this.updateProactiveRefresh()}removeAuthTokenListener(e){this.assertAuthConfigured();const t=this.internalListeners.get(e);if(t){
|
||
this.internalListeners.delete(e);t();this.updateProactiveRefresh()}}assertAuthConfigured(){
|
||
Jt(this.auth._initializationPromise,"dependent-sdk-initialized-before-auth")}updateProactiveRefresh(){
|
||
this.internalListeners.size>0?this.auth._startProactiveRefresh():this.auth._stopProactiveRefresh()}}function yo(e){switch(e){case"Node":return"node"
|
||
;case"ReactNative":return"rn";case"Worker":return"webworker";case"Cordova":return"cordova";case"WebExtension":return"web-extension";default:return}}
|
||
function Eo(e){dt(new K("auth",(t,{options:n})=>{
|
||
const r=t.getProvider("app").getImmediate(),i=t.getProvider("heartbeat"),s=t.getProvider("app-check-internal"),{apiKey:o,authDomain:a}=r.options
|
||
;Jt(o&&!o.includes(":"),"invalid-api-key",{appName:r.name});const c={apiKey:o,authDomain:a,clientPlatform:e,apiHost:"identitytoolkit.googleapis.com",
|
||
tokenApiHost:"securetoken.googleapis.com",apiScheme:"https",sdkClientVersion:or(e)},u=new lr(r,i,s,c);Pr(u,n);return u
|
||
},"PUBLIC").setInstantiationMode("EXPLICIT").setInstanceCreatedCallback((e,t,n)=>{e.getProvider("auth-internal").initialize()}))
|
||
;dt(new K("auth-internal",e=>(e=>new vo(e))(dr(e.getProvider("auth").getImmediate())),"PRIVATE").setInstantiationMode("EXPLICIT"));vt(wo,Io,yo(e))
|
||
;vt(wo,Io,"esm2020")}const bo=300,To=w("authIdTokenMaxAge")||bo;let So=null;const ko=e=>async t=>{
|
||
const n=t&&await t.getIdTokenResult(),r=n&&((new Date).getTime()-Date.parse(n.issuedAtTime))/1e3;if(r&&r>To)return;const i=n?.token;if(So!==i){So=i
|
||
;await fetch(e,{method:i?"POST":"DELETE",headers:i?{Authorization:`Bearer ${i}`}:{}})}};function Co(e=It()){const t=pt(e,"auth")
|
||
;if(t.isInitialized())return t.getImmediate();const n=Rr(e,{popupRedirectResolver:uo,persistence:[ns,Si,Ai]}),r=w("authTokenSyncURL")
|
||
;if(r&&"boolean"==typeof isSecureContext&&isSecureContext){const e=new URL(r,location.origin);if(location.origin===e.origin){const t=ko(e.toString())
|
||
;mi(n,t,()=>t(n.currentUser));fi(n,e=>t(e))}}const i=g("auth");i&&Or(n,`http://${i}`);return n}function Ro(){
|
||
return document.getElementsByTagName("head")?.[0]??document}mr({loadJS:e=>new Promise((t,n)=>{const r=document.createElement("script");r.setAttribute("src",e)
|
||
;r.onload=t;r.onerror=e=>{const t=zt("internal-error");t.customData=e;n(t)};r.type="text/javascript";r.charset="UTF-8";Ro().appendChild(r)}),
|
||
gapiScript:"https://apis.google.com/js/api.js",recaptchaV2Script:"https://www.google.com/recaptcha/api.js",
|
||
recaptchaEnterpriseScript:"https://www.google.com/recaptcha/enterprise.js?render="});Eo("Browser");const Po={
|
||
clientConfig:{ apiKey: "AIzaSyADWUZLk6DoihoWOZlOfrSEKmF0la-s1oY", authDomain: "api-project-966339893929.firebaseapp.com", databaseURL: "https://api-project-966339893929.firebaseio.com", projectId: "api-project-966339893929", storageBucket: "api-project-966339893929.appspot.com", messagingSenderId: "966339893929", appId: "1:966339893929:web:2dce32b546a44f2c9be7b8", measurementId: "G-XXFFQQR5DJ" },version:"x.x.x"};let Oo;function Ao(e,t){const n=Co(e);n.languageCode=t;return n}
|
||
function No(e,t){return new Promise(function(n,r){pi(e,t).then(e=>{Tn(e.user,!0).then(t=>{n({idToken:t,email:e.user.email,userCredential:e})})}).catch(e=>{r(e)
|
||
})})}function Do(e){if(!Po.clientConfig)throw new TypeError("Firebase config missing.");Oo||(Oo=wt(Po.clientConfig,e));return Oo}const Lo="de-DE";function Mo(){
|
||
return document.documentElement.getAttribute("lang")||Lo}function Uo(){return Mo().split("-")[0]}function xo(e,t=!1){
|
||
const n=new RegExp(`[; ]${e}=([^\\s;]*)`),r=(" "+document.cookie).match(n);return e&&r?t?r[1]:decodeURIComponent(r[1]):null}
|
||
function Vo(e,t=window.location.hostname){if("string"==typeof e){const n=t.split("."),r=n.indexOf(e);if(r>=0)return n.slice(r).join(".")}return t}
|
||
function Fo(e,t=!1){if("object"!=typeof e)return!1;if(void 0===e.name||void 0===e.value)return!1
|
||
;const n=t?e.value:encodeURIComponent(e.value),r=Object.entries(e).reduce((e,[t,n])=>"name"===t||"value"===t?"":e+";"+t+(n?"="+n:""),"")
|
||
;document.cookie=`${e.name}=${n}${r}`;return!0}function jo(e,t){
|
||
return Array.isArray(e)&&Array.isArray(t)?e.concat(t):Object.assign({},e,t,Object.keys(e).filter(n=>"object"==typeof e[n]&&Object.prototype.hasOwnProperty.call(t,n)).reduce((n,r)=>{
|
||
n[r]=jo(e[r],t[r]);return n},{}))}function Ho(e={},t={}){
|
||
return Object.keys(e).length===Object.keys(t).length&&Object.keys(e).every(n=>t.hasOwnProperty(n)&&e[n]===t[n])}function $o(e){
|
||
return{}.toString.call(e).match(/\s([a-z|A-Z]+)/)[1].toLowerCase()}const Wo=()=>{let e=n(window.location.hostname)
|
||
;return"production"!==e&&"staging"!==e||Bo(window.location.hostname)?window.dataLayer:window.utag_data};function Bo(e){
|
||
return e.match(/account(?:-stg)?\.idealo\.(?:co\.)?\w{2,3}/)}function zo(e=Wo()){if(void 0===e)return!1
|
||
;if(!Array.isArray(e))throw new TypeError("Data layer has to be an array!");return!0}function Ko(e,t=Wo()){"object"===$o(e)&&zo(t)&&t.push(e)}
|
||
function qo(e,t=Wo()){let n;if(!zo(t))return null;if(null==e)throw new TypeError("Key is required")
|
||
;for(let r=0;r<t.length;r++)"object"===$o(t[r])&&e in t[r]&&(n=t[r][e]);return n}const Go="account",Jo=Vo("idealo"),Yo=sa(),Xo=31536e3,Qo="/"
|
||
;window[Go]=window[Go]||{};function Zo(e){let t={};if("loggedIn"===e.loginState){t.ls=1;e.lastRefresh&&(t.lr=Math.floor(e.lastRefresh/1e3))}
|
||
"loggedOut"===e.loginState&&(t.ls=0);return t}function ea(e){return{name:Yo,value:"unknown"===e.loginState?"":ia(e),domain:Jo,path:Qo,
|
||
"max-age":"unknown"===e.loginState?-1:Xo,samesite:"strict"}}function ta(e){let t={loginState:"unknown"};if(1===e.ls){t.loginState="loggedIn"
|
||
;e.lr&&(t.lastRefresh=1e3*e.lr)}0===e.ls&&(t.loginState="loggedOut");return t}function na(e){let t={loginState:"unknown"}
|
||
;if("string"!=typeof e||0===e.length)return t;try{t=ta(JSON.parse(decodeURIComponent(escape(window.atob(e)))))}catch(e){}return t}function ra(e){
|
||
const t=new CustomEvent("userinfo",{detail:e,bubbles:!0,cancelable:!0});document.dispatchEvent(t)}function ia(e){
|
||
return window.btoa(unescape(encodeURIComponent(JSON.stringify(Zo(e)))))}function sa(e="userInfo"){
|
||
return`${e}-${n(window.location.hostname)}`.replace("-production","").replace("-local","-testing")}function oa(){const{loginState:e}=aa();return e}
|
||
function aa(){let e={loginState:"unknown"},t=ua();const n=ca(),r=ha();if("unknown"===t.loginState){
|
||
"unknown"!==n.loginState?e=n:"unknown"!==r.loginState&&(e.loginState=r.loginState);if("unknown"!==e.loginState){Fo(ea(e),!0);t=e}}else{
|
||
"loggedIn"!==t.loginState&&"loggedOut"!==t.loginState||(e.loginState=t.loginState);Number.isInteger(t.lastRefresh)&&(e.lastRefresh=t.lastRefresh)}if(!Ho(e,n)){
|
||
const r=e.loginState!==n.loginState;pa(e);r&&ra({loginState:t.loginState})}return e}function ca(){const e=window[Go].userInfo;return da(e)?e:{
|
||
loginState:"unknown"}}function ua(){const e=na(xo(Yo,!0));return da(e)?e:{loginState:"unknown"}}function ha(){const e=qo("user_email_hashed");return{
|
||
loginState:"string"==typeof e&&/[0-9a-f]{64}/.test(e)?"loggedIn":"unknown"}}function la(){return"loggedIn"===oa()}function da(e){
|
||
if("object"!=typeof e||0===Object.keys(e).length)return!1;const{loginState:t,lastRefresh:n}=e
|
||
;if(["loggedIn","loggedOut","unknown"].indexOf(t)<0)throw new Error("User info login state has invalid value: "+t)
|
||
;if("lastRefresh"in e&&!Number.isInteger(n))throw new Error("User info last refresh has invalid value: "+n);return!0}function pa(e){if(!da(e))return!1
|
||
;if(Ho(window[Go].userInfo,e))return!1;window[Go].userInfo=e;return!0}function fa(){"object"!=typeof window[Go]&&(window[Go]={})
|
||
;"object"!=typeof window[Go].userInfo&&(window[Go].userInfo={});if(window[Go].userInfo.loginState)return!1;pa(ua())}fa()
|
||
;const ma=/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/gi;function ga(e,t=ma){return e.replace(t,e=>e.replace(/[a-z0-9]/gi,"*"))}function _a(e,t={}){let n=jo(t,e)
|
||
;if(!("object"==typeof n&&["event","version","owner"].every(e=>e in n)))throw new Error(`Tracking data incomplete: ${JSON.stringify(n)}`)
|
||
;("object"!=typeof n.data||null===n.data||0===Object.keys(n.data).length)&&delete n.data;const r=JSON.stringify(n);ma.test(r)&&(n=JSON.parse(ga(r)));Ko(n)}
|
||
const wa={close_click:{event:"google_one_tap_close_click",version:"1-0-0",owner:"de.idealo.sso"},cta_click:{event:"google_one_tap_cta_click",version:"1-0-0",
|
||
owner:"de.idealo.sso"},one_tap_shown:{event:"google_one_tap_shown",version:"1-0-0",owner:"de.idealo.sso"}},Ia={context:{provider:"idealo",source:"account"}}
|
||
;function va(e){return new Promise((t,n)=>{if(window.google&&window.google.accounts&&window.google.accounts.id){t();return}
|
||
const r=document.createElement("script");r.src="https://accounts.google.com/gsi/client";r.async=!0;r.defer=!0;e&&r.setAttribute("nonce",e);r.onload=()=>{t()}
|
||
;r.onerror=e=>{n(e)};document.head.appendChild(r)})}function ya(e,t){const n=ri.credential(e);if(n){No(Ao(t,Uo()),n).then(e=>{const{idToken:t,email:n}=e;ba(t,n)
|
||
}).catch(e=>{if("auth/account-exists-with-different-credential"===e.code)Ca();else if(!e.code)throw e})}}function Ea(e){_a({data:Ia},wa.cta_click)
|
||
;const{credential:t}=e;if(t){ya(t,Do("IdealoSocialLogin"))}}function ba(e,t){Ta(e,t);Sa()}function Ta(e,t){const n=new MessageEvent("message",{data:{
|
||
event:"sendForm",data:{firebaseIdToken:e,email:t,authProviderName:"google"}},origin:"*",source:window}),r=e=>{
|
||
if(e.data&&"readystatechange"===e.data.event&&"complete"===e.data.readyState){window.dispatchEvent(n);window.removeEventListener("message",r)}}
|
||
;null!==document.querySelector('iframe[src*="mode=iframe"]')?window.dispatchEvent(n):window.addEventListener("message",r)}function Sa(){let e
|
||
;e=document.getElementById("MyidealoToggle");if(e&&!e.checked){e.checked=!0;e.dispatchEvent(new Event("change",{bubbles:!0}))}}function ka(){
|
||
if(!window.google||!window.google.accounts||!window.google.accounts.id)return;const{id:e}=window.google.accounts;if(e){
|
||
const t=window.location.hostname,r=n(t),i={auto_select:!1,
|
||
client_id:"production"===r?"966339893929-8cl14kvvnbub66p3fp0rnr0s8k6ssqhg.apps.googleusercontent.com":"591291879914-run0d08ep8r976qk7scfgfuludshj2dj.apps.googleusercontent.com",
|
||
callback:Ea,context:"sign-in",state_cookie_domain:"production"===r?t.substr(t.indexOf("idealo")):t,use_fedcm_for_prompt:!0};try{e.initialize(i);e.prompt(e=>{
|
||
e.isSkippedMoment&&e.isSkippedMoment()&&_a({data:Ia},wa.close_click)});_a({data:Ia},wa.one_tap_shown)}catch(e){}}}function Ca(){}function Ra(){
|
||
const e=document.getElementById("MyidealoElement");if(e){const t=e.getAttribute("data-nonce");if(t)return t}
|
||
const t=document.querySelector('meta[name="csp-nonce"]');return t?t.getAttribute("content"):null}function Pa(){
|
||
const e=document.getElementById("MyidealoElement");if(!e)return null;const t=e.getAttribute("data-parent-component");return null!=t?t:null}
|
||
const Oa=()=>/iPad|iPhone|iPod/.test(navigator.userAgent)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1,Aa=()=>"homepage"===Pa(),Na=()=>{var e
|
||
;return(null===(e=navigator)||void 0===e||null===(e=e.userAgentData)||void 0===e?void 0:e.mobile)||window.matchMedia("(pointer:coarse)").matches
|
||
},Da=()=>Aa()&&Na()&&!la()&&!Oa();function La(){try{if(!Da())return;va(Ra()).then(()=>{ka()}).catch(e=>{})}catch(e){}}window.onload=function(){La()}})();
|
||
//# sourceMappingURL=https://account.idealo.de/js/fragments/login/googleOneTap.js.map
|
||
/*]]>*/
|
||
</script>
|
||
|
||
|
||
</div></div>
|
||
<script>//<![CDATA[
|
||
(()=>{"use strict";const e=()=>{const e=(e=>{const t=new RegExp(`[; ]${e}=([^\\s;]*)`),o=` ${document.cookie}`.match(t);return e&&o?o[1]:null})("userInfo"),t=e?(o=e,JSON.parse(decodeURIComponent(escape(window.atob(o))))):null;var o;return 1===t?.ls};(()=>{if(e()){const e=document.querySelector(".i-header-slot--services");e&&e.setAttribute("data-state-login","logged-in")}})()})();
|
||
//]]></script>
|
||
</div>
|
||
</div>
|
||
|
||
<script>//<![CDATA[
|
||
(()=>{var e={976(e,t){var n,i,o;i=[],void 0===(o="function"==typeof(n=function(){var e=function(){},t={},n={},i={};function o(e,t){e=e.push?e:[e];var o,r,a,l=[],s=e.length,c=s;for(o=function(e,n){n.length&&l.push(e),--c||t(l)};s--;)r=e[s],(a=n[r])?o(r,a):(i[r]=i[r]||[]).push(o)}function r(e,t){if(e){var o=i[e];if(n[e]=t,o)for(;o.length;)o[0](e,t),o.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function l(t,n,i,o){var r,a,s,c=document,u=i.async,_=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/[\?|#].*$/,""),p=t.replace(/^(css|img|module|nomodule)!/,"");if(o=o||0,/(^css!|\.css$)/.test(h))(s=c.createElement("link")).rel="stylesheet",s.href=p,(r="hideFocus"in s)&&s.relList&&(r=0,s.rel="preload",s.as="style");else if(/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h))(s=c.createElement("img")).src=p;else if((s=c.createElement("script")).src=p,s.async=void 0===u||u,a="noModule"in s,/^module!/.test(h)){if(!a)return n(t,"l");s.type="module"}else if(/^nomodule!/.test(h)&&a)return n(t,"l");s.onload=s.onerror=s.onbeforeload=function(e){var a=e.type[0];if(r)try{s.sheet.cssText.length||(a="e")}catch(e){18!=e.code&&(a="e")}if("e"==a){if((o+=1)<_)return l(t,n,i,o)}else if("preload"==s.rel&&"style"==s.as)return s.rel="stylesheet";n(t,a,e.defaultPrevented)},!1!==d(t,s)&&c.head.appendChild(s)}function s(e,t,n){var i,o,r=(e=e.push?e:[e]).length,a=r,s=[];for(i=function(e,n,i){if("e"==n&&s.push(e),"b"==n){if(!i)return;s.push(e)}--r||t(s)},o=0;o<a;o++)l(e[o],i,n)}function c(e,n,i){var o,l;if(n&&n.trim&&(o=n),l=(o?i:n)||{},o){if(o in t)throw"LoadJS";t[o]=!0}function c(t,n){s(e,(function(e){a(l,e),t&&a({success:t,error:n},e),r(o,e)}),l)}if(l.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return o(e,(function(e){a(t,e)})),c},c.done=function(e){r(e,[])},c.reset=function(){t={},n={},i={}},c.isDefined=function(e){return e in t},c})?n.apply(t,i):n)||(e.exports=o)}},t={};function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i].call(r.exports,r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{"use strict";const e="enabled.idealo.header",t="disable.idealo.header";function i(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const o="i-header",r={INITIALISED:`${o}--initialised`},a={HEADER_COMPONENT:`.${o}`};class l{static initIdealoObject(){window.idealo||(window.idealo={header:{}}),window.idealo.header||(window.idealo.header={})}constructor(){i(this,"root",void 0),i(this,"isInitialised",void 0),this.root=null,this.isInitialised=!1,this.init()}init(){l.initIdealoObject(),this.root=window.document.querySelector(a.HEADER_COMPONENT),null!==this.root&&(this.bindEvents(),this.isInitialised=!0),this.render()}bindEvents(){null!==this.root&&this.root.addEventListener("click",(()=>{let e;"function"==typeof Event?e=new Event(t):(e=document.createEvent("Event"),e.initEvent(t,!0,!0)),window.document.dispatchEvent(e)}))}render(){this.isInitialised&&null!==this.root&&this.root.classList.add(r.INITIALISED)}}var s=n(976),c=n.n(s);const u=(e,t,n)=>new Promise(((i,o)=>{c()([e],t),c().ready(t,{success:()=>{i(window[n])},error:()=>{o(void 0)}})})),_=()=>u("https://cdn.idealo.com/storage/wish-list-header/header-wish-list-plugin.js","header-wishlist-plugin","idealoHeaderWishlistPlugin").then((e=>e.default)).catch((e=>{}));const d=()=>{const e=(e=>{const t=new RegExp(`[; ]${e}=([^\\s;]*)`),n=` ${document.cookie}`.match(t);return e&&n?n[1]:null})("userInfo"),t=e?(n=e,JSON.parse(decodeURIComponent(escape(window.atob(n))))):null;var n;return 1===t?.ls},h="i-wishlist",p={INITIALISED:`${h}--initialised`,WISHLIST_BUTTON:"i-wishlist-element",SEARCH_INPUT:"i-search-input",WISHLIST_LINK:"i-wishlist-element-link"},m={HEADER_COMPONENT:`.${h}`,HEADER_BUTTON:`.${p.WISHLIST_BUTTON}`,HEADER_LINK:`.${p.WISHLIST_LINK}`,SEARCH_INPUT:`.${p.SEARCH_INPUT}`},g="ontouchstart"in window||window.DocumentTouch&&document instanceof window.DocumentTouch,f=()=>{window.idealo.header.wishlistPlugin||(window.idealo.header=window.idealo.header||{},_().then((e=>{e(".i-wishlist-element-content")})).catch((e=>{})),window.idealo.header.wishlistPlugin=!0)},v=()=>{window.document.addEventListener("idealo.wishlist.update.count",y)},y=()=>{const e=window.document.querySelector(`.${p.WISHLIST_BUTTON}-heart`);e&&(e.classList.add(`${p.WISHLIST_BUTTON}-animated`),setTimeout((()=>{e.classList.remove(`${p.WISHLIST_BUTTON}-animated`)}),1e3))},w=()=>{const e=window.document.querySelector(m.HEADER_BUTTON),t=window.document.querySelector(m.SEARCH_INPUT);if(!e||!t)return;e.classList.add(p.INITIALISED);let n=!1;document.body&&(n=document.body.contains(window.document.querySelector(m.HEADER_LINK)));window.document.querySelector(".i-header")&&n&&!d()&&(g?window.addEventListener("load",f):(e.addEventListener("mouseover",f,!1),t.addEventListener("focus",f,!1))),v()},b={event:"header_flights_click",owner:"de.idealo.tyrell",version:"1-0-0"},k={event:"header_magazin_click",owner:"de.idealo.tyrell",version:"1-0-0"},S={event:"header_idealo_logo_click",owner:"de.idealo.tyrell",version:"1-0-0"},I={event:"header_all_categories_click",owner:"de.idealo.tyrell",version:"1-0-0"},E={event:"header_wishlist_click",owner:"de.idealo.tyrell",version:"1-0-0"},C={event:"header_price_alerts_click",owner:"de.idealo.tyrell",version:"1-0-0"},N={event:"header_banner_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{banner_name:"black_friday"}},L={event:"download_app_click",owner:"de.idealo.tyrell"},T={...L,version:"1-0-0",data:{event_action:!0,store_name:"google_play",location:"smart_banner"}},P={event:"searchbar_last_seen_delete_click",owner:"de.idealo.tyrell",version:"1-0-0"},x={event:"searchbar_suggester_view",owner:"de.idealo.tyrell",version:"1-0-0"},A=e=>{window?.utag_data?.push(e)},B=e=>{requestAnimationFrame((()=>{setTimeout((()=>{window?.utag_data?.push(e)}),0)}))},O=()=>A(b),D=()=>A(k),q=()=>A(S),H=()=>B(I),R=()=>A(E),U=()=>A(C),M=()=>A(N),$=e=>A((e=>({event:"searchbar_click",owner:"de.idealo.tyrell",version:"1-1-0",data:{click_type:"enter",search_query:{search_query:e}}}))(e)),F=(e,t)=>{const n=document.querySelector(e);n&&(n.addEventListener("click",t),n.addEventListener("auxclick",t))};var W,j,V,K,z,G,Z,J,X,Q,Y,ee={},te=[],ne=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,ie=Array.isArray;function oe(e,t){for(var n in t)e[n]=t[n];return e}function re(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function ae(e,t,n){var i,o,r,a={};for(r in t)"key"==r?i=t[r]:"ref"==r?o=t[r]:a[r]=t[r];if(arguments.length>2&&(a.children=arguments.length>3?W.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(r in e.defaultProps)void 0===a[r]&&(a[r]=e.defaultProps[r]);return le(e,a,i,o,null)}function le(e,t,n,i,o){var r={type:e,props:t,key:n,ref:i,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++V:o,__i:-1,__u:0};return null==o&&null!=j.vnode&&j.vnode(r),r}function se(e){return e.children}function ce(e,t){this.props=e,this.context=t}function ue(e,t){if(null==t)return e.__?ue(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return"function"==typeof e.type?ue(e):null}function _e(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return _e(e)}}function de(e){(!e.__d&&(e.__d=!0)&&K.push(e)&&!he.__r++||z!==j.debounceRendering)&&((z=j.debounceRendering)||G)(he)}function he(){for(var e,t,n,i,o,r,a,l=1;K.length;)K.length>l&&K.sort(Z),e=K.shift(),l=K.length,e.__d&&(n=void 0,o=(i=(t=e).__v).__e,r=[],a=[],t.__P&&((n=oe({},i)).__v=i.__v+1,j.vnode&&j.vnode(n),be(t.__P,n,i,t.__n,t.__P.namespaceURI,32&i.__u?[o]:null,r,null==o?ue(i):o,!!(32&i.__u),a),n.__v=i.__v,n.__.__k[n.__i]=n,ke(r,n,a),n.__e!=o&&_e(n)));he.__r=0}function pe(e,t,n,i,o,r,a,l,s,c,u){var _,d,h,p,m,g,f=i&&i.__k||te,v=t.length;for(s=me(n,t,f,s,v),_=0;_<v;_++)null!=(h=n.__k[_])&&(d=-1===h.__i?ee:f[h.__i]||ee,h.__i=_,g=be(e,h,d,o,r,a,l,s,c,u),p=h.__e,h.ref&&d.ref!=h.ref&&(d.ref&&Ee(d.ref,null,h),u.push(h.ref,h.__c||p,h)),null==m&&null!=p&&(m=p),4&h.__u||d.__k===h.__k?s=ge(h,s,e):"function"==typeof h.type&&void 0!==g?s=g:p&&(s=p.nextSibling),h.__u&=-7);return n.__e=m,s}function me(e,t,n,i,o){var r,a,l,s,c,u=n.length,_=u,d=0;for(e.__k=new Array(o),r=0;r<o;r++)null!=(a=t[r])&&"boolean"!=typeof a&&"function"!=typeof a?(s=r+d,(a=e.__k[r]="string"==typeof a||"number"==typeof a||"bigint"==typeof a||a.constructor==String?le(null,a,null,null,null):ie(a)?le(se,{children:a},null,null,null):void 0===a.constructor&&a.__b>0?le(a.type,a.props,a.key,a.ref?a.ref:null,a.__v):a).__=e,a.__b=e.__b+1,l=null,-1!==(c=a.__i=fe(a,n,s,_))&&(_--,(l=n[c])&&(l.__u|=2)),null==l||null===l.__v?(-1==c&&(o>u?d--:o<u&&d++),"function"!=typeof a.type&&(a.__u|=4)):c!=s&&(c==s-1?d--:c==s+1?d++:(c>s?d--:d++,a.__u|=4))):e.__k[r]=null;if(_)for(r=0;r<u;r++)null!=(l=n[r])&&!(2&l.__u)&&(l.__e==i&&(i=ue(l)),Ce(l,l));return i}function ge(e,t,n){var i,o;if("function"==typeof e.type){for(i=e.__k,o=0;i&&o<i.length;o++)i[o]&&(i[o].__=e,t=ge(i[o],t,n));return t}e.__e!=t&&(t&&e.type&&!n.contains(t)&&(t=ue(e)),n.insertBefore(e.__e,t||null),t=e.__e);do{t=t&&t.nextSibling}while(null!=t&&8==t.nodeType);return t}function fe(e,t,n,i){var o,r,a=e.key,l=e.type,s=t[n];if(null===s&&null==e.key||s&&a==s.key&&l===s.type&&!(2&s.__u))return n;if(i>(null==s||2&s.__u?0:1))for(o=n-1,r=n+1;o>=0||r<t.length;){if(o>=0){if((s=t[o])&&!(2&s.__u)&&a==s.key&&l===s.type)return o;o--}if(r<t.length){if((s=t[r])&&!(2&s.__u)&&a==s.key&&l===s.type)return r;r++}}return-1}function ve(e,t,n){"-"==t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||ne.test(t)?n:n+"px"}function ye(e,t,n,i,o){var r;e:if("style"==t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof i&&(e.style.cssText=i=""),i)for(t in i)n&&t in n||ve(e.style,t,"");if(n)for(t in n)i&&n[t]===i[t]||ve(e.style,t,n[t])}else if("o"==t[0]&&"n"==t[1])r=t!=(t=t.replace(J,"$1")),t=t.toLowerCase()in e||"onFocusOut"==t||"onFocusIn"==t?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+r]=n,n?i?n.t=i.t:(n.t=X,e.addEventListener(t,r?Y:Q,r)):e.removeEventListener(t,r?Y:Q,r);else{if("http://www.w3.org/2000/svg"==o)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!=t&&"height"!=t&&"href"!=t&&"list"!=t&&"form"!=t&&"tabIndex"!=t&&"download"!=t&&"rowSpan"!=t&&"colSpan"!=t&&"role"!=t&&"popover"!=t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&"-"!=t[4]?e.removeAttribute(t):e.setAttribute(t,"popover"==t&&1==n?"":n))}}function we(e){return function(t){if(this.l){var n=this.l[t.type+e];if(null==t.u)t.u=X++;else if(t.u<n.t)return;return n(j.event?j.event(t):t)}}}function be(e,t,n,i,o,r,a,l,s,c){var u,_,d,h,p,m,g,f,v,y,w,b,k,S,I,E,C,N=t.type;if(void 0!==t.constructor)return null;128&n.__u&&(s=!!(32&n.__u),r=[l=t.__e=n.__e]),(u=j.__b)&&u(t);e:if("function"==typeof N)try{if(f=t.props,v="prototype"in N&&N.prototype.render,y=(u=N.contextType)&&i[u.__c],w=u?y?y.props.value:u.__:i,n.__c?g=(_=t.__c=n.__c).__=_.__E:(v?t.__c=_=new N(f,w):(t.__c=_=new ce(f,w),_.constructor=N,_.render=Ne),y&&y.sub(_),_.props=f,_.state||(_.state={}),_.context=w,_.__n=i,d=_.__d=!0,_.__h=[],_._sb=[]),v&&null==_.__s&&(_.__s=_.state),v&&null!=N.getDerivedStateFromProps&&(_.__s==_.state&&(_.__s=oe({},_.__s)),oe(_.__s,N.getDerivedStateFromProps(f,_.__s))),h=_.props,p=_.state,_.__v=t,d)v&&null==N.getDerivedStateFromProps&&null!=_.componentWillMount&&_.componentWillMount(),v&&null!=_.componentDidMount&&_.__h.push(_.componentDidMount);else{if(v&&null==N.getDerivedStateFromProps&&f!==h&&null!=_.componentWillReceiveProps&&_.componentWillReceiveProps(f,w),!_.__e&&(null!=_.shouldComponentUpdate&&!1===_.shouldComponentUpdate(f,_.__s,w)||t.__v==n.__v)){for(t.__v!=n.__v&&(_.props=f,_.state=_.__s,_.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.some((function(e){e&&(e.__=t)})),b=0;b<_._sb.length;b++)_.__h.push(_._sb[b]);_._sb=[],_.__h.length&&a.push(_);break e}null!=_.componentWillUpdate&&_.componentWillUpdate(f,_.__s,w),v&&null!=_.componentDidUpdate&&_.__h.push((function(){_.componentDidUpdate(h,p,m)}))}if(_.context=w,_.props=f,_.__P=e,_.__e=!1,k=j.__r,S=0,v){for(_.state=_.__s,_.__d=!1,k&&k(t),u=_.render(_.props,_.state,_.context),I=0;I<_._sb.length;I++)_.__h.push(_._sb[I]);_._sb=[]}else do{_.__d=!1,k&&k(t),u=_.render(_.props,_.state,_.context),_.state=_.__s}while(_.__d&&++S<25);_.state=_.__s,null!=_.getChildContext&&(i=oe(oe({},i),_.getChildContext())),v&&!d&&null!=_.getSnapshotBeforeUpdate&&(m=_.getSnapshotBeforeUpdate(h,p)),E=u,null!=u&&u.type===se&&null==u.key&&(E=Se(u.props.children)),l=pe(e,ie(E)?E:[E],t,n,i,o,r,a,l,s,c),_.base=t.__e,t.__u&=-161,_.__h.length&&a.push(_),g&&(_.__E=_.__=null)}catch(e){if(t.__v=null,s||null!=r)if(e.then){for(t.__u|=s?160:128;l&&8==l.nodeType&&l.nextSibling;)l=l.nextSibling;r[r.indexOf(l)]=null,t.__e=l}else for(C=r.length;C--;)re(r[C]);else t.__e=n.__e,t.__k=n.__k;j.__e(e,t,n)}else null==r&&t.__v==n.__v?(t.__k=n.__k,t.__e=n.__e):l=t.__e=Ie(n.__e,t,n,i,o,r,a,s,c);return(u=j.diffed)&&u(t),128&t.__u?void 0:l}function ke(e,t,n){for(var i=0;i<n.length;i++)Ee(n[i],n[++i],n[++i]);j.__c&&j.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){j.__e(e,t.__v)}}))}function Se(e){return"object"!=typeof e||null==e?e:ie(e)?e.map(Se):oe({},e)}function Ie(e,t,n,i,o,r,a,l,s){var c,u,_,d,h,p,m,g=n.props,f=t.props,v=t.type;if("svg"==v?o="http://www.w3.org/2000/svg":"math"==v?o="http://www.w3.org/1998/Math/MathML":o||(o="http://www.w3.org/1999/xhtml"),null!=r)for(c=0;c<r.length;c++)if((h=r[c])&&"setAttribute"in h==!!v&&(v?h.localName==v:3==h.nodeType)){e=h,r[c]=null;break}if(null==e){if(null==v)return document.createTextNode(f);e=document.createElementNS(o,v,f.is&&f),l&&(j.__m&&j.__m(t,r),l=!1),r=null}if(null===v)g===f||l&&e.data===f||(e.data=f);else{if(r=r&&W.call(e.childNodes),g=n.props||ee,!l&&null!=r)for(g={},c=0;c<e.attributes.length;c++)g[(h=e.attributes[c]).name]=h.value;for(c in g)if(h=g[c],"children"==c);else if("dangerouslySetInnerHTML"==c)_=h;else if(!(c in f)){if("value"==c&&"defaultValue"in f||"checked"==c&&"defaultChecked"in f)continue;ye(e,c,null,h,o)}for(c in f)h=f[c],"children"==c?d=h:"dangerouslySetInnerHTML"==c?u=h:"value"==c?p=h:"checked"==c?m=h:l&&"function"!=typeof h||g[c]===h||ye(e,c,h,g[c],o);if(u)l||_&&(u.__html===_.__html||u.__html===e.innerHTML)||(e.innerHTML=u.__html),t.__k=[];else if(_&&(e.innerHTML=""),pe("template"===t.type?e.content:e,ie(d)?d:[d],t,n,i,"foreignObject"==v?"http://www.w3.org/1999/xhtml":o,r,a,r?r[0]:n.__k&&ue(n,0),l,s),null!=r)for(c=r.length;c--;)re(r[c]);l||(c="value","progress"==v&&null==p?e.removeAttribute("value"):void 0!==p&&(p!==e[c]||"progress"==v&&!p||"option"==v&&p!==g[c])&&ye(e,c,p,g[c],o),c="checked",void 0!==m&&m!==e[c]&&ye(e,c,m,g[c],o))}return e}function Ee(e,t,n){try{if("function"==typeof e){var i="function"==typeof e.__u;i&&e.__u(),i&&null==t||(e.__u=e(t))}else e.current=t}catch(e){j.__e(e,n)}}function Ce(e,t,n){var i,o;if(j.unmount&&j.unmount(e),(i=e.ref)&&(i.current&&i.current!==e.__e||Ee(i,null,t)),null!=(i=e.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){j.__e(e,t)}i.base=i.__P=null}if(i=e.__k)for(o=0;o<i.length;o++)i[o]&&Ce(i[o],t,n||"function"!=typeof e.type);n||re(e.__e),e.__c=e.__=e.__e=void 0}function Ne(e,t,n){return this.constructor(e,n)}function Le(e,t,n){var i,o,r,a;t==document&&(t=document.documentElement),j.__&&j.__(e,t),o=(i="function"==typeof n)?null:n&&n.__k||t.__k,r=[],a=[],be(t,e=(!i&&n||t).__k=ae(se,null,[e]),o||ee,ee,t.namespaceURI,!i&&n?[n]:o?null:t.firstChild?W.call(t.childNodes):null,r,!i&&n?n:o?o.__e:t.firstChild,i,a),ke(r,e,a)}W=te.slice,j={__e:function(e,t,n,i){for(var o,r,a;t=t.__;)if((o=t.__c)&&!o.__)try{if((r=o.constructor)&&null!=r.getDerivedStateFromError&&(o.setState(r.getDerivedStateFromError(e)),a=o.__d),null!=o.componentDidCatch&&(o.componentDidCatch(e,i||{}),a=o.__d),a)return o.__E=o}catch(t){e=t}throw e}},V=0,ce.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=oe({},this.state),"function"==typeof e&&(e=e(oe({},n),this.props)),e&&oe(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),de(this))},ce.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),de(this))},ce.prototype.render=se,K=[],G="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,Z=function(e,t){return e.__v.__b-t.__v.__b},he.__r=0,J=/(PointerCapture)$|Capture$/i,X=0,Q=we(!1),Y=we(!0);var Te,Pe,xe,Ae,Be=0,Oe=[],De=j,qe=De.__b,He=De.__r,Re=De.diffed,Ue=De.__c,Me=De.unmount,$e=De.__;function Fe(e,t){De.__h&&De.__h(Pe,e,Be||t),Be=0;var n=Pe.__H||(Pe.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function We(e){return Be=1,function(e,t,n){var i=Fe(Te++,2);if(i.t=e,!i.__c&&(i.__=[n?n(t):Qe(void 0,t),function(e){var t=i.__N?i.__N[0]:i.__[0],n=i.t(t,e);t!==n&&(i.__N=[n,i.__[1]],i.__c.setState({}))}],i.__c=Pe,!Pe.__f)){var o=function(e,t,n){if(!i.__c.__H)return!0;var o=i.__c.__H.__.filter((function(e){return!!e.__c}));if(o.every((function(e){return!e.__N})))return!r||r.call(this,e,t,n);var a=i.__c.props!==e;return o.forEach((function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(a=!0)}})),r&&r.call(this,e,t,n)||a};Pe.__f=!0;var r=Pe.shouldComponentUpdate,a=Pe.componentWillUpdate;Pe.componentWillUpdate=function(e,t,n){if(this.__e){var i=r;r=void 0,o(e,t,n),r=i}a&&a.call(this,e,t,n)},Pe.shouldComponentUpdate=o}return i.__N||i.__}(Qe,e)}function je(e,t){var n=Fe(Te++,3);!De.__s&&Xe(n.__H,t)&&(n.__=e,n.u=t,Pe.__H.__h.push(n))}function Ve(e,t){var n=Fe(Te++,7);return Xe(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function Ke(){for(var e;e=Oe.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(Ze),e.__H.__h.forEach(Je),e.__H.__h=[]}catch(t){e.__H.__h=[],De.__e(t,e.__v)}}De.__b=function(e){Pe=null,qe&&qe(e)},De.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),$e&&$e(e,t)},De.__r=function(e){He&&He(e),Te=0;var t=(Pe=e.__c).__H;t&&(xe===Pe?(t.__h=[],Pe.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0}))):(t.__h.forEach(Ze),t.__h.forEach(Je),t.__h=[],Te=0)),xe=Pe},De.diffed=function(e){Re&&Re(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==Oe.push(t)&&Ae===De.requestAnimationFrame||((Ae=De.requestAnimationFrame)||Ge)(Ke)),t.__H.__.forEach((function(e){e.u&&(e.__H=e.u),e.u=void 0}))),xe=Pe=null},De.__c=function(e,t){t.some((function(e){try{e.__h.forEach(Ze),e.__h=e.__h.filter((function(e){return!e.__||Je(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],De.__e(n,e.__v)}})),Ue&&Ue(e,t)},De.unmount=function(e){Me&&Me(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{Ze(e)}catch(e){t=e}})),n.__H=void 0,t&&De.__e(t,n.__v))};var ze="function"==typeof requestAnimationFrame;function Ge(e){var t,n=function(){clearTimeout(i),ze&&cancelAnimationFrame(t),setTimeout(e)},i=setTimeout(n,100);ze&&(t=requestAnimationFrame(n))}function Ze(e){var t=Pe,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),Pe=t}function Je(e){var t=Pe;e.__c=e.__(),Pe=t}function Xe(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function Qe(e,t){return"function"==typeof t?t(e):t}const Ye=({isOpen:e})=>e?ae("div",{className:"i-navigation-icon i-navigation-icon--open"},ae("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},ae("path",{d:"M13.414,12l9.293-9.293a1,1,0,0,0-1.414-1.414L12,10.586,2.707,1.293A1,1,0,0,0,1.293,2.707L10.586,12,1.293,21.293a1,1,0,1,0,1.414,1.414L12,13.414l9.293,9.293a1,1,0,0,0,1.414-1.414Z"}))):ae("div",{className:"i-navigation-icon i-navigation-icon--closed"},ae("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},ae("path",{d:"M22 13H2a1 1 0 010-2h20a1 1 0 010 2zm1 5a1 1 0 00-1-1H2a1 1 0 000 2h20a1 1 0 001-1zm0-12a1 1 0 00-1-1H2a1 1 0 000 2h20a1 1 0 001-1z"}))),et=(()=>{const e=document.querySelector("[data-country]")?.getAttribute("data-country");return"AT"===e?{title:"Kategorien",hyperLinkDomain:"https://www.idealo.at",hyperLinkPath:"/preisvergleich/Sitemap.html",moreLinkText:"mehr",mobileCloseButton:"Alle Kategorien",mobileBackButton:"Kategorien",mobileSearchButton:"Suche",locale:"de-AT"}:"GB"===e?{title:"Categories",hyperLinkDomain:"https://www.idealo.co.uk",hyperLinkPath:"/sitemap.html",moreLinkText:"more",mobileCloseButton:"All categories",mobileBackButton:"Categories",mobileSearchButton:"Search",locale:"en-UK"}:"FR"===e?{title:"Catégories",hyperLinkDomain:"https://www.idealo.fr",hyperLinkPath:"/plandusite.html",moreLinkText:"plus",mobileCloseButton:"Toutes les catégories",mobileBackButton:"Catégories",mobileSearchButton:"Chercher",locale:"fr-FR"}:"ES"===e?{title:"Categorías",hyperLinkDomain:"https://www.idealo.es",hyperLinkPath:"/mapaweb.html",moreLinkText:"más",mobileCloseButton:"Todas las categorías",mobileBackButton:"Categorías",mobileSearchButton:"Buscar",locale:"es-ES"}:"IT"===e?{title:"Categorie",hyperLinkDomain:"https://www.idealo.it",hyperLinkPath:"/mappa-del-sito.html",moreLinkText:"di più",mobileCloseButton:"Tutte le categorie",mobileBackButton:"Categorie",mobileSearchButton:"Cerca",locale:"it-IT"}:{title:"Kategorien",hyperLinkDomain:"https://www.idealo.de",hyperLinkPath:"/preisvergleich/Sitemap.html",moreLinkText:"mehr",mobileCloseButton:"Alle Kategorien",mobileBackButton:"Kategorien",mobileSearchButton:"Suche",locale:"de-DE"}})(),tt=({topLevelNavItem:e})=>ae("li",{className:"i-navigation-list-item i-navigation-list-item--more"},ae("a",{className:"i-navigation-list-link",href:e.url,rel:e.rel,role:"menuitem"},et.moreLinkText)),nt=({topLevelNavItem:e,selectedSubCategoriesIds:t})=>ae("ul",{className:"i-navigation-list i-navigation-list--sub i-navigation-list--active","data-main-id":"{{navItem.id}}",role:"menu"},e.navItems.map(((e,n)=>{return ae("li",{key:n,className:"i-navigation-list-item "+(t.includes(e.id)?"i-navigation-list-item--active":""),role:"none"},ae("a",{className:"i-navigation-list-link",href:e.url,role:"menuitem",onClick:(i=e.id,()=>A((e=>({event:"header_subcategory_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{sub_category_id:e||"NULL"}}))(i)))},e.name));var i})),ae(tt,{topLevelNavItem:e})),it=({navItems:e,setSelectedTopLevelCategory:t,selectedTopLevelCategoryId:n})=>{const i=e=>n=>{var i;n.stopPropagation(),(e=>e.navItems.length>0)(e)&&(n.preventDefault(),t(e.id)),(i=e.id,()=>A((e=>({event:"header_category_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{category_id:e}}))(i)))()};return ae("ul",{className:"i-navigation-list i-navigation-list--main",role:"menu"},e.map((e=>ae("li",{className:"i-navigation-list-item "+(e.id===n?"i-navigation-list-item--active":""),role:"none","data-main-id":"{{navItem.id}}","data-tracking-id":"i-header-topcategory"},ae("a",{className:"i-navigation-list-link",href:e.url,onClick:i(e),role:"menuitem"},e.name)))))},ot=({isSubCategoryView:e,setIsSubCategoryView:t,setIsOpen:n})=>ae("div",{className:"i-navigation-overlay-header"},ae("button",{className:"i-navigation-overlay-btn i-navigation-overlay-btn--close",type:"button",onClick:i=>{i.stopPropagation(),e?t(!1):n(!1)}},ae("span",{className:"i-navigation-overlay-btn-display i-navigation-overlay-btn-display--close"},ae("svg",{version:"1.1",xmlns:"http://www.w3.org/2000/svg",x:"0",y:"0",width:"16",height:"16",viewBox:"0 0 16 16"},ae("path",{d:"M14.7,14L14,14.7c-0.2,0.2-0.5,0.2-0.7,0l-12-12C1.1,2.5,1.1,2.2,1.3,2L2,1.3c0.2-0.2,0.5-0.2,0.7,0l12,12C14.9,13.5,14.9,13.8,14.7,14z"}),ae("path",{d:"M2,14.7L1.3,14c-0.2-0.2-0.2-0.5,0-0.7l12-12c0.2-0.2,0.5-0.2,0.7,0L14.7,2c0.2,0.2,0.2,0.5,0,0.7l-12,12C2.5,14.9,2.2,14.9,2,14.7z"})),ae("span",null,et.mobileCloseButton)),ae("span",{className:"i-navigation-overlay-btn-display i-navigation-overlay-btn-display--back"},ae("svg",{version:"1.1",xmlns:"http://www.w3.org/2000/svg",x:"0",y:"0",width:"16",height:"16",viewBox:"0 0 16 16"},ae("polygon",{points:"11,13 9.889,13 5.345,8.052 9.847,3 10.942,3 6.448,8.043"})),ae("span",null,et.mobileBackButton))));const rt=({isOpen:e,setIsOpen:t})=>{const[n,i]=We([]),[o,r]=We(null),[a,l]=We([]),[s,c]=We(!1);je((()=>{(async function(){const e=document.querySelector("[data-navigation-url]")?.getAttribute("data-navigation-url");return e?(await window.fetch(e)).json():{navItems:[]}})().then((e=>{i(e.navItems);const t=document.querySelector("meta[name='navigation']"),n=t?.getAttribute("data-mainid"),o=t?.getAttribute("data-subids");n&&o?(r(n),l(JSON.parse(o))):r(e.navItems[0].id)}))}),[]);const u=n.find((e=>e.id===o));return!e||n.length<1?null:ae("div",{className:"i-navigation-overlay "+(s?"i-navigation-overlay--has-selection":""),role:"menu","aria-hidden":"false"},ae(ot,{isSubCategoryView:s,setIsSubCategoryView:c,setIsOpen:t}),ae("nav",{className:"i-navigation-overlay-wrapper"},ae(it,{navItems:n,setSelectedTopLevelCategory:e=>{r(e),c(!0)},selectedTopLevelCategoryId:o}),ae(nt,{topLevelNavItem:u,selectedSubCategoriesIds:a})))},at="i-navigation";const lt=()=>{const[n,i]=We(!1);je((()=>{!function(n,i){window.document.addEventListener("keydown",(e=>{const t="Escape"===e.key||"Esc"===e.key||27===e.keyCode||27===e.which;n&&t&&i(!1)})),window.document.addEventListener(t,(()=>{i(!1)})),window.document.addEventListener(e,(e=>{e.detail.iSender!==at&&i(!1)}))}(n,i)}),[]);return ae("div",{className:`i-navigation ${n&&"i-navigation--overlay-open i-navigation--active"}`},ae("a",{id:"i-header-navigation",className:"i-navigation-link","aria-expanded":n,"aria-haspopup":"true","aria-label":et.title,"aria-pressed":n,role:"button",href:et.hyperLinkDomain+et.hyperLinkPath,title:et.title,onClick:t=>{t.stopPropagation(),t.preventDefault(),n||function(){const t=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:{iSender:at}});window.document.dispatchEvent(t)}(),i(!n),H()}},ae(Ye,{isOpen:n}),ae("span",{className:"i-navigation-text"},et.title)),ae(rt,{isOpen:n,setIsOpen:i}))},st=(()=>{const e=document.querySelector("[data-country]")?.getAttribute("data-country");return"AT"===e?{search_placeholder:"Ich suche ...",suggestions:"Suchvorschläge",recent:"zuletzt gesucht",trending:"Beliebte Suchen",trending_badge:"BELIEBT",submit:"Suchen",cancel:"Abbrechen",delete_all:"Alle löschen",locale:"de-AT"}:"GB"===e?{search_placeholder:"Search idealo ...",suggestions:"Suggested Searches",recent:"recent searches",trending:"Popular Searches",trending_badge:"POPULAR",submit:"Search",cancel:"Cancel",delete_all:"Delete all",locale:"en-UK"}:"FR"===e?{search_placeholder:"Rechercher ...",suggestions:"Suggestions de recherche",recent:"dernières recherches",trending:"Recherches populaires",trending_badge:"POPULAIRE",submit:"Chercher",cancel:"Abandonner",delete_all:"Tout supprimer",locale:"fr-FR"}:"ES"===e?{search_placeholder:"Buscar ...",suggestions:"Sugerencias de búsqueda",recent:"búsquedas recientes",trending:"Búsquedas populares",trending_badge:"POPULAR",submit:"Buscar",cancel:"Abortar",delete_all:"Eliminar todo",locale:"es-ES"}:"IT"===e?{search_placeholder:"Cerca ...",suggestions:"Suggerimenti di ricerca",recent:"ultime ricerche",trending:"Più cercati",trending_badge:"DI TENDENZA",submit:"Cerca",cancel:"Abortire",delete_all:"Cancella tutto",locale:"it-IT"}:{search_placeholder:"Ich suche ...",suggestions:"Suchvorschläge",recent:"zuletzt gesucht",trending:"Beliebte Suchen",trending_badge:"BELIEBT",submit:"Suchen",cancel:"Abbrechen",delete_all:"Alle löschen",locale:"de-DE"}})(),ct=e=>{e.stopPropagation()},ut=({searchValue:e,isOverlayOpen:t,submitActionUrl:n,onInputClick:i,onSearchValueChange:o,onSubmit:r,onKeyDown:a,searchInputRef:l,putFocusOnInput:s})=>ae("form",{id:"i-header-search",className:"i-search-form",role:"search","aria-expanded":t,"aria-haspopup":"true",action:n,method:"get",onClick:ct,onSubmit:r},ae("label",{className:"i-search-label",htmlFor:"i-search-input"}),ae("input",{type:"search",className:"i-search-input",id:"i-search-input",name:"q",value:e,placeholder:st.search_placeholder,autoComplete:"off",autoCapitalize:"off",spellcheck:!1,onClick:i,onInput:e=>o(e.currentTarget.value),onKeyDown:a,ref:l}),ae("button",{type:"reset",className:"i-search-button i-search-button--cancel",title:st.cancel,onClick:()=>{B((e=>({event:"searchbar_delete_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{search_query:{search_query:e}}}))(e)),o(""),s()}},ae("span",null,ae("svg",{version:"1.1",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},ae("path",{d:"M22.414 19.586a2 2 0 11-2.828 2.828L12 14.828l-7.586 7.586a2 2 0 01-2.828-2.828L9.172 12 1.586 4.414a2 2 0 012.828-2.828L12 9.172l7.586-7.586a2 2 0 112.828 2.828L14.828 12z"})))),ae("button",{type:"submit",className:"i-search-button i-search-button--submit",title:st.submit,onMouseUp:()=>A((e=>({event:"searchbar_click",owner:"de.idealo.tyrell",version:"1-1-0",data:{click_type:"magnifier",search_query:{search_query:e}}}))(e))},ae("span",null,ae("svg",{version:"1.1",xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24"},ae("path",{d:"M22.658,21.28,17.9,16.522a9.558,9.558,0,1,0-1.424,1.4l4.768,4.768a1,1,0,1,0,1.414-1.414ZM3.049,10.513a7.5,7.5,0,1,1,7.5,7.5A7.509,7.509,0,0,1,3.049,10.513Z"}))))),_t=({title:e,children:t})=>ae("div",{className:"i-suggest-title"},ae("span",{className:"i-suggest-text",id:"i-suggest-list-title"},e),t),dt=({items:e,showIcon:t,type:n,onItemClickFactory:i,onAutoCompleteClick:o,activeSuggestionIndex:r})=>ae("ol",{className:"i-suggest-list",role:"menu","aria-describedby":`i-suggest-list-title--${n}`},e.map(((e,a)=>ae("li",{className:`i-suggest-item ${a===r&&"i-suggest-item--active"}`,role:"none"},ae("a",{className:"i-suggest-link",href:e.url,role:"menuitem","data-tracking-id":`i-header-suggest-link--${n}`,title:e.titleFull,onClick:i(e.titlePlain,e.url,e.location)},t&&ae("svg",{className:"i-suggest-icon i-suggest-icon--recent",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},ae("path",{d:"M13,7.96v5h2a1,1,0,0,1,0,2H12a1,1,0,0,1-1-1v-6a1,1,0,1,1,2,0Zm-1-7A10.963,10.963,0,0,0,4.05,4.373V2.96a1,1,0,1,0-2,0V6.92a1,1,0,0,0,1,1l3.954.04a1,1,0,0,0,0-2l-1.68-.023A8.957,8.957,0,1,1,3.01,12.958h0a1,1,0,1,0-2,0A11.022,11.022,0,1,0,12,.96Z"})),ae("div",{className:"i-suggest-details"},ae("span",{className:"i-suggest-name"},e.tokens?.map((e=>e.isMatch?ae("mark",null,e.substring):e.substring))),!!e.location&&ae("span",{className:"i-suggest-meta"}," - ",e.location),!!e.trending&&ae("span",{className:"i-suggest-trending-badge"},st.trending_badge))),ae("div",{className:"i-suggest-autocomplete-btn","aria-label":"autocompletion button",role:"button",onClick:t=>{t.stopPropagation(),o(e.titlePlain)}},ae("svg",{className:"i-suggest-icon i-suggest-icon--autocomplete",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},ae("path",{d:"m10.293,18.707l-6-6c-.195-.195-.293-.451-.293-.707s.098-.512.293-.707l6-6c.391-.391,1.023-.391,1.414,0s.391,1.023,0,1.414l-4.293,4.293h11.586c.553,0,1,.447,1,1s-.447,1-1,1H7.414l4.293,4.293c.391.391.391,1.023,0,1.414s-1.023.391-1.414,0Z"}))))))),ht=()=>{let e=!1;try{const t=JSON.parse(window.localStorage.getItem("ucData"));e=Object.values(t.consent.services).find((e=>"Idealo"===e.name))?.consent??!1}catch(e){}return e},pt="idealo_search_history",mt=()=>JSON.parse(localStorage.getItem(pt))||[],gt=e=>{localStorage.setItem(pt,JSON.stringify(e))},ft=e=>Date.now()-e.date<2592e6,vt=e=>{if(!ht())return[];const t=mt().filter(ft);return gt(t),t.map((t=>((e,t)=>({titlePlain:e.title,titleFull:e.location?`${e.title} - ${e.location}`:e.title,date:e.date,url:e.url||`${t}?q=${encodeURIComponent(e.title)}`,location:e.location}))(t,e)))},yt=(e,t,n)=>{if(!e||!ht())return;const i={title:e,date:Date.now(),url:t,location:n},o=mt().filter((e=>e.title!==i.title)),r=[i,...o].slice(0,10);gt(r)},wt=({suggestionItems:e,trendingItems:t,recentItems:n,onSearchValueChange:i,onDeleteRecentItems:o,activeSuggesterEntryIndex:r})=>{const a=(e,t)=>()=>{yt(e,t),A((e=>({event:"searchbar_popular_searches_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{search_query:{search_query:e}}}))(e))},l=n?.length||0;return ae("nav",{className:"i-suggest i-suggester-entries"},!e?.length&&ae("div",{className:"i-suggest-trending"},ae("div",{className:"fade-away"}),ae(_t,{title:st.trending}),ae("ol",{className:"i-suggest-trending-list",role:"menu"},t?.map((e=>ae("li",{className:"i-suggest-trending-list-item",role:"none"},ae("a",{className:"i-suggest-trending-link",href:e.url,role:"menuitem",title:e.query,onClick:a(e.query,e.url)},ae("span",{className:"i-suggest-trending-name"},e.query))))))),!!n?.length&&ae(se,null,ae(_t,{title:st.recent},ae("button",{className:"i-suggest-button-delete",onClick:()=>{o(),localStorage.removeItem(pt),A(P)}},st.delete_all)),ae(dt,{items:n,showIcon:!0,type:"RECENT",onItemClickFactory:(e,t,n)=>()=>{yt(e,t,n),A((e=>({event:"searchbar_last_seen_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{search_query:{search_query:e}}}))(e))},onAutoCompleteClick:i,activeSuggestionIndex:r})),!!e?.length&&ae(se,null,ae(_t,{title:st.suggestions}),ae(dt,{items:e,showIcon:!1,type:"SUGGESTION",onItemClickFactory:(e,t,n)=>()=>{yt(e,t,n),A((e=>({event:"searchbar_suggester_click",owner:"de.idealo.tyrell",version:"1-0-0",data:{search_query:{search_query:e}}}))(e))},onAutoCompleteClick:i,activeSuggestionIndex:r-l})))};function bt(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var i=n.call(e,t||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const kt=3e3;class St{constructor(){bt(this,"abortController",void 0),this.abortController=null}async fetchWithTimeout(e,t={}){const{timeout:n=kt}=t,i=new AbortController;this.abortController=i;const o=setTimeout((()=>{i.abort()}),n),r=await window.fetch(e,{...t,signal:this.abortController.signal});clearTimeout(o);return await r.json()}cancelRequest(){this.abortController?.abort()}isRequestCancelled(){return this.abortController?.signal?.aborted??!1}}const It=e=>e.toLowerCase().split(" ").filter((e=>e.length>0)),Et=(e,t)=>{if(!t)return!0;return It(t).reduce(((t,n)=>e.toLowerCase().includes(n)&&t),!0)},Ct=(e,t)=>{if(!t||!Et(e,t))return[{substring:e,isMatch:!1}];const n=((e,t)=>{let n=0;return t.map((t=>{const i=e.substring(n).toLowerCase().indexOf(t);if(i<0)return null;const o={start:n+i,length:t.length,end:n+i+t.length};return n=o.end,o})).filter((e=>null!==e))})(e,It(t));return((e,t)=>{const n=[];return t.forEach(((i,o)=>{const r=t[o-1]?.end||0,a={substring:e.substr(r,i.start-r),isMatch:!1},l={substring:e.substr(i.start,i.length),isMatch:!0};n.push(a),n.push(l)})),n.push({substring:e.substr(t[t.length-1]?.end),isMatch:!1}),n.filter((e=>!!e.substring))})(e,n)},Nt=({isOverlayOpen:e,isLoading:t,recentItems:n,suggestionItems:i,searchValue:o,onSearchValueChange:r,onDeleteRecentItems:a,activeSuggesterEntryIndex:l})=>{const[s,c]=We([]);return je((()=>{(async function(){const e=window.document.querySelector("#i-search-wrapper"),t=e.getAttribute("data-country"),n=e.getAttribute("data-trending-url"),i=new St;let o;try{o=await i.fetchWithTimeout(n)}catch(e){return[]}const r=function(e){return"https://www.idealo."+{DE:"de/preisvergleich/MainSearchProductCategory",AT:"at/preisvergleich/MainSearchProductCategory",FR:"fr/prechcat",ES:"es/resultados",GB:"co.uk/mscat",IT:"it/risultati"}[e]+".html?q="}(t),a=function(e,t){return e.map((e=>({...e,url:t+e.query})))}(o.queries,r);return function(e){const t=10;return e.sort(((e,t)=>t.popularity-e.popularity)).slice(0,t)}(a)})().then((e=>c(e)))}),[]),ae("div",{className:"i-search-overlay","aria-atomic":"true","aria-live":"polite","aria-hidden":!e,role:"status"},ae("div",{className:"i-search-progress-bar "+(t?"i-search-progress-bar--loading":"")}),ae(wt,{suggestionItems:i.map((e=>({...e,tokens:Ct(e.titlePlain,o)}))),trendingItems:s,recentItems:n.map((e=>({...e,tokens:Ct(e.titlePlain,o)}))),onSearchValueChange:r,onDeleteRecentItems:a,activeSuggesterEntryIndex:l}))},Lt=window.document.querySelector("[data-suggest-host]"),Tt=Lt?.getAttribute("data-suggest-host"),Pt=new St,xt=window.matchMedia("\n screen and (min-height: 600px)\n and (orientation: landscape),\n screen and (min-width: 600px)\n and (orientation: portrait)\n ").matches||!1;async function At(e){Pt.cancelRequest();const t=e.trim();if(!t?.length)return[];const n=function(e){return`${Tt}/suggest?q=${encodeURIComponent(e)}&max=${xt?10:6}`}(e),i=await Pt.fetchWithTimeout(n);return i.groups[0]?.items||[]}const Bt="i-search",Ot=()=>{const[n,i]=We(!1),[o,r]=We([]),[a,l]=We([]),[s,c]=We(""),[u,_]=We(null),[d,h]=We(0),[p,m]=We(!1),g=function(e){return Be=5,Ve((function(){return{current:e}}),[])}(null),f=window.document.querySelector("#i-search-wrapper").getAttribute("data-submit-action-url"),v=o.filter((({titlePlain:e})=>Et(e,s)));function y(){(()=>{const t=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:{iSender:Bt}});window.document.dispatchEvent(t)})(),i(!0),B(x)}je((()=>{(n=>{window.document.addEventListener(e,(e=>{e.detail.iSender!==Bt&&n(!1)})),window.document.addEventListener(t,(()=>{n(!1)})),window.document.addEventListener("click",(e=>{2===e?.button||n(!1)}))})(i);const n=vt(f);r(n);const{hasFocus:o,searchTerm:a}=(()=>{const e=window.document.querySelector('meta[name="search"]')||null;return{searchTerm:e?.getAttribute("data-searchterm")?.trim()||"",hasFocus:"true"===e?.getAttribute("data-focused")}})();c(a),a&&b(a),o&&E()}),[]);const w=async e=>{n||y(),c(e),_(null),e.trim()&&setTimeout((()=>{m(!0)})),await b(e),m(!1)},b=async e=>{try{const t=await At(e);l(t),h(0)}catch(e){e instanceof DOMException&&(e.code,e.ABORT_ERR)}},k=e=>((e,t)=>(e%t+t)%t)(e,(a?.length||0)+(v?.length||0)+1)-1,S=e=>{const t=I(e);return t?t.titlePlain:null},I=e=>{const t=k(e);return t>=0?[...v,...a][t]:null},E=()=>{g.current?.focus()};return ae("div",{className:"i-search "+(n?"i-search--overlay-open":"")},ae(ut,{searchValue:u||s,isOverlayOpen:n,submitActionUrl:f,onInputClick:y,onSearchValueChange:w,onSubmit:()=>{const e=s.trim();c(e),yt(e)},onKeyDown:e=>{if(13===e.keyCode){const t=I(d);if(t)e.preventDefault(),yt(t.titlePlain,t.url,t.location),$(t.titlePlain),window.location.href=t.url;else{const e=S(d);e&&c(e),$(s)}}if(40===e.keyCode){const e=d+1,t=S(e);_(t),h(e)}if(38===e.keyCode){e.preventDefault();const t=d-1,n=S(t);_(n),h(t)}},searchInputRef:g,putFocusOnInput:E}),ae(Nt,{isOverlayOpen:n,isLoading:p,recentItems:v,suggestionItems:a,searchValue:s,onSearchValueChange:e=>{w(e),E()},onDeleteRecentItems:()=>{r([])},activeSuggesterEntryIndex:k(d)}))};function Dt(){return"undefined"==typeof navigator?"":navigator.userAgent||""}var qt=function(e){return e.HOME_PAGE="mainproductcategory",e.OFFER_PAGE="offersofproduct",e}(qt||{});const Ht=async()=>{if(null!==document.querySelector('meta[name="sev"][content="true"]')||!(()=>{if(window.innerWidth>=600)return!1;const e=Dt();return!/(tablet|ipad|playbook|silk)|(android(?!.*mobile))/i.test(e)})()||!(()=>{const e=Dt();return/android/i.test(e)})())return;const e=function(e){const t=`${e}=`,n=document.cookie.split(";");for(let e=0;e<n.length;e++){const i=n[e].trim();if(0===i.indexOf(t))return decodeURIComponent(i.substring(t.length))}return null}("appBannerShown");if("true"===e)return;const t=document.getElementById("i-app-banner"),n=document.getElementById("i-app-banner-close"),i=document.getElementById("i-app-banner-button"),o=document.getElementById("i-app-banner-icon");if(!t||!n)return;t.style.display="flex";const r=document.querySelector("body")?.id,a=()=>{var e,n,i;e="appBannerShown",n="true",i=1209600,document.cookie=`${e}=${n}; max-age=${i}; path=/; SameSite=Lax`,t.style.display="none"},l=()=>{a(),A(T),window.location.href=(()=>{let e="https://idealo.go.link/2Ghi0";return r===qt.HOME_PAGE?e="https://idealo.go.link/26XfK":r===qt.OFFER_PAGE&&(e="https://idealo.go.link/jgm0e"),e})()};i&&i.addEventListener("click",(e=>{e.preventDefault(),l()})),o&&o.addEventListener("click",(e=>{e.preventDefault(),l()})),n.addEventListener("click",(()=>{a()}))};new l,(()=>{const e=document.querySelector(".i-header-navigation"),t=document.querySelector(".i-navigation");Le(ae(lt,null),e,t)})(),(()=>{const e=document.querySelector("#i-search-wrapper"),t=document.querySelector(".i-search");Le(ae(Ot,null),e,t)})(),w(),F('[data-tracking-id="i-header-flights"]',O),F('[data-tracking-id="i-header-magazin"]',D),F('[data-tracking-id="i-header-logo"]',q),F('[data-tracking-id="i-navigation"]',H),F(".i-header-slot--wishlist",R),F(".i-header-slot--priceAlert",U),F("#i-header-bf-badge",M),Ht()})()})();
|
||
//]]></script>
|
||
</div>
|
||
|
||
</header><div class="breadcrumb-wrapper row">
|
||
<div class="small-12 columns">
|
||
<div class="breadcrumb" data-breadcrumb="" itemscope="" itemtype="http://schema.org/BreadcrumbList">
|
||
<a class="breadcrumb-link breadcrumb-link--home" data-type="home" href="/">
|
||
<span class="svg-icon svg-baseline">
|
||
<svg width="16" height="19" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#house_filled"></use>
|
||
</svg>
|
||
</span>
|
||
</a>
|
||
<span class="breadcrumb-leaf" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
|
||
<span class="breadcrumb-leafSeparator svg-icon">
|
||
<svg width="8" height="8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right"></use>
|
||
</svg>
|
||
</span>
|
||
<a class="breadcrumb-link breadcrumb-link--leaf" itemscope="" itemtype="http://schema.org/Thing" itemprop="item" id="/preisvergleich/SubProductCategory/3932.html" href="/preisvergleich/SubProductCategory/3932.html">
|
||
<span class="breadcrumb-linkText" itemprop="name">Drogerie & Gesundheit</span>
|
||
</a>
|
||
<meta itemprop="position" content="1"/>
|
||
</span>
|
||
<span class="breadcrumb-leaf" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
|
||
<span class="breadcrumb-leafSeparator svg-icon">
|
||
<svg width="8" height="8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right"></use>
|
||
</svg>
|
||
</span>
|
||
<a class="breadcrumb-link breadcrumb-link--leaf" itemscope="" itemtype="http://schema.org/Thing" itemprop="item" id="/preisvergleich/SubProductCategory/14476.html" href="/preisvergleich/SubProductCategory/14476.html">
|
||
<span class="breadcrumb-linkText" itemprop="name">Sanitätshaus & Klinikbedarf</span>
|
||
</a>
|
||
<meta itemprop="position" content="2"/>
|
||
</span>
|
||
<span class="breadcrumb-leaf" itemprop="itemListElement" itemscope="" itemtype="http://schema.org/ListItem">
|
||
<span class="breadcrumb-leafSeparator svg-icon">
|
||
<svg width="8" height="8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right"></use>
|
||
</svg>
|
||
</span>
|
||
<a class="breadcrumb-link breadcrumb-link--leaf" itemscope="" itemtype="http://schema.org/Thing" itemprop="item" id="/preisvergleich/ProductCategory/18874.html" href="/preisvergleich/ProductCategory/18874.html">
|
||
<span class="breadcrumb-linkText" itemprop="name">Rollstühle & Gehhilfen</span>
|
||
</a>
|
||
<meta itemprop="position" content="3"/>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<main class="pageContent-wrapper">
|
||
<script data-testid="Product" type="application/ld+json">
|
||
{"@context":"http://schema.org","@type":"Product","name":"Mobilis Elektrorollstuhl M45 Air rot","offers":{"@type":"AggregateOffer","lowPrice":6780.0,"highPrice":6780.0,"priceCurrency":"EUR","offerCount":1,"availability":"https://schema.org/InStock","itemCondition":"https://schema.org/NewCondition"},"brand":{"@type":"Brand","name":"Mobilis"},"image":["https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross/mobilis-elektrorollstuhl-m45-air-rot.jpg","https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross_1/mobilis-elektrorollstuhl-m45-air-rot.jpg","https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross_2/mobilis-elektrorollstuhl-m45-air-rot.jpg"],"description":"Bereits ab 6.780,00 € ✓ Große Shopvielfalt ✓ Testberichte & Meinungen ✓ | Jetzt Mobilis Elektrorollstuhl M45 Air rot günstig kaufen bei idealo.de","url":"https://www.idealo.de/preisvergleich/OffersOfProduct/202740303_-elektrorollstuhl-m45-air-rot-mobilis.html","sku":"4026411584423","gtin":"4026411584423"}</script>
|
||
<script data-testid="ProductGroup" type="application/ld+json">
|
||
{"@context":"https://schema.org","@type":"ProductGroup","@id":"https://www.idealo.de/preisvergleich/OffersOfProduct/202740303_-elektrorollstuhl-m45-air-rot-mobilis.html","url":"https://www.idealo.de/preisvergleich/OffersOfProduct/202740303_-elektrorollstuhl-m45-air-rot-mobilis.html","name":"Mobilis Elektrorollstuhl M45 Air rot","brand":{"@type":"Brand","name":"Mobilis"},"image":["https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_max/mobilis-elektrorollstuhl-m45-air-rot.jpg"],"productGroupID":"202740303","hasVariant":[{"@type":"Product","@id":"https://www.idealo.de/preisvergleich/OffersOfProduct/202740303_-elektrorollstuhl-m45-air-rot-mobilis.html","url":"https://www.idealo.de/preisvergleich/OffersOfProduct/202740303_-elektrorollstuhl-m45-air-rot-mobilis.html","name":"Mobilis Elektrorollstuhl M45 Air rot","sku":"4026411584423","offers":{"@type":"AggregateOffer","highPrice":6780.0,"itemCondition":"https://schema.org/NewCondition","lowPrice":6780.0,"offerCount":1,"priceCurrency":"EUR"}}]}</script>
|
||
<div hidden="" data-recentproducts="{"emptyText":"Du hast noch keine Produkte angeschaut","id":"202740303","idType":"PRODUCT","productName":"Mobilis Elektrorollstuhl M45 Air rot","productUrl":"/preisvergleich/OffersOfProduct/202740303_-elektrorollstuhl-m45-air-rot-mobilis.html","productImage":"https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_mittelgross/mobilis-elektrorollstuhl-m45-air-rot.jpg","siteId":1,"price":678000}"> </div>
|
||
<div class="oopStage
|
||
">
|
||
<div class="oopStage-wrapper columns
|
||
">
|
||
|
||
<div class="oopStage-wrapper-gallery row">
|
||
<div class="small-3 columns hide-for-xlarge text-center">
|
||
</div>
|
||
|
||
<div class="oopStage-gallery small-6 xlarge-12 columns">
|
||
<div class="sales-badge-container">
|
||
</div>
|
||
|
||
<div class="simple-carousel">
|
||
<div class="simple-carousel-thumbnails">
|
||
<div class="simple-carousel-thumbnail-wrapper" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"carousel","location":"gallery_small","media_type":"image"}">
|
||
<img class="selected" loading="lazy" width="50" height="42" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_klein/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="Mobilis Elektrorollstuhl M45 Air rot"/>
|
||
</div>
|
||
<div class="simple-carousel-thumbnail-wrapper" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"carousel","location":"gallery_small","media_type":"image"}">
|
||
<img loading="lazy" width="50" height="42" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_klein_1/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt=""/>
|
||
</div>
|
||
<div class="simple-carousel-thumbnail-wrapper" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"carousel","location":"gallery_small","media_type":"image"}">
|
||
<img loading="lazy" width="50" height="42" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_klein_2/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt=""/>
|
||
</div>
|
||
</div>
|
||
<div class="simple-carousel-slides">
|
||
<div class="simple-carousel-item" id="slide-0" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"image","location":"gallery_small"}">
|
||
<img src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="Mobilis Elektrorollstuhl M45 Air rot" width="240" height="200"/>
|
||
</div>
|
||
<div class="simple-carousel-item" id="slide-1" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"image","location":"gallery_small"}">
|
||
<img loading="lazy" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross_1/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="" width="240" height="200"/>
|
||
</div>
|
||
<div class="simple-carousel-item" id="slide-2" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"image","location":"gallery_small"}">
|
||
<img loading="lazy" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross_2/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="" width="240" height="200"/>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="simple-carousel-nav next" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"nav","location":"gallery_small"}">
|
||
<div class="svg-icon">
|
||
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right"></use>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
<div class="simple-carousel-nav prev disabled" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"nav","location":"gallery_small"}">
|
||
<div class="svg-icon">
|
||
<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right"></use>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="simple-carousel-radio-button-wrapper hide-for-xxlarge">
|
||
<div class="simple-carousel-radio-button-inner-wrapper">
|
||
<label class="input-wrapper">
|
||
<input class="simple-carousel-input" type="radio" name="nav" checked=""/>
|
||
<span class="radio-fill"></span>
|
||
</label>
|
||
<label class="input-wrapper">
|
||
<input class="simple-carousel-input" type="radio" name="nav"/>
|
||
<span class="radio-fill"></span>
|
||
</label>
|
||
<label class="input-wrapper">
|
||
<input class="simple-carousel-input" type="radio" name="nav"/>
|
||
<span class="radio-fill"></span>
|
||
</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="splide-gallery" class="splide hide-for-all slider sliderContainer withLeadoutBox" role="group" aria-label="Splide Gallery">
|
||
<div class="overflow">
|
||
<div class="splide__track container">
|
||
<ul class="splide__list">
|
||
<li class="splide__slide rsSlide">
|
||
<img src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_max/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="Mobilis Elektrorollstuhl M45 Air rot" loading="lazy"/>
|
||
</li>
|
||
<li class="splide__slide rsSlide">
|
||
<img src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_max_1/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="" loading="lazy"/>
|
||
</li>
|
||
<li class="splide__slide rsSlide">
|
||
<img src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_max_2/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="" loading="lazy"/>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<!-- Override navigation elements to add trx based click events -->
|
||
<div class="splide__arrows">
|
||
<button class="splide__arrow splide__arrow--prev" type="button" aria-label="Previous slide" aria-controls="splide-gallery-track" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"nav","location":"gallery_large"}">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="40" height="40" focusable="false">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right_sharp"></use>
|
||
</svg>
|
||
</button>
|
||
<button class="splide__arrow splide__arrow--next" type="button" aria-label="Next slide" aria-controls="splide-gallery-track" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"nav","location":"gallery_large"}">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="40" height="40" focusable="false">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right_sharp"></use>
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="navigation thumbs thumbsVertical">
|
||
<div id="splide-thumbnails" class="splide">
|
||
<div class="splide__track">
|
||
<ul class="splide__list">
|
||
<li class="splide__slide">
|
||
<img data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"carousel","location":"gallery_large","media_type":"image"}" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_klein/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="Mobilis Elektrorollstuhl M45 Air rot" loading="lazy"/>
|
||
</li>
|
||
<li class="splide__slide">
|
||
<img data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"carousel","location":"gallery_large","media_type":"image"}" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_klein_1/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="" loading="lazy"/>
|
||
</li>
|
||
<li class="splide__slide">
|
||
<img data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"carousel","location":"gallery_large","media_type":"image"}" src="//cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_klein_2/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="" loading="lazy"/>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<!-- Override navigation elements to add trx based click events -->
|
||
<div class="splide__arrows">
|
||
<button class="splide__arrow splide__arrow--prev" type="button" aria-label="Previous slide" aria-controls="splide-gallery-track" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"thumbnail_nav","location":"gallery_large"}">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="40" height="40" focusable="false">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right_sharp"></use>
|
||
</svg>
|
||
</button>
|
||
<button class="splide__arrow splide__arrow--next" type="button" aria-label="Next slide" aria-controls="splide-gallery-track" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"thumbnail_nav","location":"gallery_large"}">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 40" width="40" height="40" focusable="false">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#chevron_right_sharp"></use>
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<span class="backButton-overlay-close backButton close-icon" data-trx-click="gallery_interaction;2-0-0;koopa" data-trx-click-data="{"event_type":"click","target_element":"close","location":"gallery_large"}">
|
||
<svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#closing_cross"></use>
|
||
</svg>
|
||
</span>
|
||
|
||
<div class="gallery-overlay-background" hidden=""></div>
|
||
|
||
<div class="leadoutbox" hidden="">
|
||
<div class="favouritesWrapper">
|
||
<div class="oopStage-actionFavourites">
|
||
<input type="hidden" id="wishlistHeartPin" value="Produkt auf Merkzettel speichern"/>
|
||
<input type="hidden" id="wishlistHeartUnpin" value="Produkt vom Merkzettel entfernen"/>
|
||
<button class="wishlist-heart" data-wishlist-heart="{"id": "202740303", "type": "PRODUCT"}"></button>
|
||
</div>
|
||
</div>
|
||
<div class="leadoutbox-title">
|
||
Mobilis Elektrorollstuhl M45 Air rot</div>
|
||
<div class="leadoutbox-price">
|
||
<div class="leadoutbox-priceLabel">Günstigster Preis</div>
|
||
<a target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&price=6780.00&productid=202740303&sid=3040&type=offer&pos=-2" class="leadoutbox-priceAmount" rel="noopener nofollow">6.780,00 €</a>
|
||
<span>zzgl. Versand</span>
|
||
<div class="leadoutbox-priceBase"></div>
|
||
</div>
|
||
<a target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&price=6780.00&productid=202740303&sid=3040&type=offer&pos=-2" class="button button--leadout expanded" rel="noopener nofollow">
|
||
Zum Shop</a>
|
||
<div class="leadoutbox-shop">Shop:
|
||
<a target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&price=6780.00&productid=202740303&sid=3040&type=offer&pos=-2" rel="noopener nofollow">otto.de</a>
|
||
</div>
|
||
<div class="button button--transparent expanded leadoutbox-moreOffersLink">
|
||
Weitere Angebote anzeigen</div>
|
||
</div>
|
||
</div>
|
||
<div class="small-3 columns hide-for-xlarge text-center oopStage-mobileColumnRight">
|
||
<div class="oopStage-actionFavourites">
|
||
<input type="hidden" id="wishlistHeartPin" value="Produkt auf Merkzettel speichern"/>
|
||
<input type="hidden" id="wishlistHeartUnpin" value="Produkt vom Merkzettel entfernen"/>
|
||
<button class="wishlist-heart" data-wishlist-heart="{"id": "202740303", "type": "PRODUCT"}"></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="oopStage-priceRangeCta row table">
|
||
<a data-scrolling-anchor="" href="#offerList" class="table-row hide-for-xlarge">
|
||
<p class="oopStage-priceRangeCtaRange">
|
||
6.780,00 €</p>
|
||
<span class="oopStage-priceRangeCtaButton">
|
||
1 Angebot</span>
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="oopStage-details-header columns">
|
||
<div class="favouritesWrapper show-for-xlarge">
|
||
<div class="oopStage-actionFavourites">
|
||
<input type="hidden" id="wishlistHeartPin" value="Produkt auf Merkzettel speichern"/>
|
||
<input type="hidden" id="wishlistHeartUnpin" value="Produkt vom Merkzettel entfernen"/>
|
||
<button class="wishlist-heart" data-wishlist-heart="{"id": "202740303", "type": "PRODUCT"}"></button>
|
||
</div>
|
||
</div>
|
||
|
||
<h1 id="oopStage-title" class="oopStage-title" translate="no" tabindex="0">
|
||
<span>Mobilis Elektrorollstuhl M45 Air rot</span>
|
||
</h1>
|
||
</div>
|
||
|
||
<div class="oopStage-details columns">
|
||
|
||
<div class="oopStage-metaInfo table" data-oop-stage="">
|
||
<a data-scrolling-anchor="" href="#offerList" class="oopStage-priceRange hide">
|
||
<span class="oopStage-priceRangeOffers">1 Angebot:</span>
|
||
<span class="oopStage-priceRangePrice">6.780,00 €</span>
|
||
</a>
|
||
</div>
|
||
|
||
<div class="oopStage-sidebar hide-for-xlarge ">
|
||
|
||
<div class="oopStage-action">
|
||
<a href="#datasheet" class="oopStage-action-item oopStage-action-datasheet" data-sp-tracking="click" data-sp-tracking-meta="{"event":"product_details_click", "version":"1-1-0", "owner":"de.idealo.koopa"}" data-scrolling-anchor="">
|
||
<div>
|
||
<div class="svg-icon svg-baseline svg-block ">
|
||
<svg class="oopStage-actionPricechartIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#datasheet_outline"></use>
|
||
</svg>
|
||
</div>
|
||
<span class="oopStage-actionIcon--text">
|
||
Produktdetails</span>
|
||
</div>
|
||
</a>
|
||
<div class="oopStage-action-item show-for-large-down">
|
||
<div class="oopStage-actionPricechart" onclick="document.dispatchEvent(new CustomEvent('triggerPriceChartModal', {detail: {productId: 202740303 }}))">
|
||
|
||
<div class="svg-icon svg-baseline svg-block">
|
||
<svg class="oopStage-actionIcon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#pricechart"></use>
|
||
</svg>
|
||
</div>
|
||
<span class="oopStage-actionIcon--text">Preisverlauf</span>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="oopStage-action-item oopStage-actionPricewatcher-action button--pricewatcher priceAlertButton--unset" data-overlay="{
|
||
"closeCaption" : "zurück",
|
||
"contentLoad" : "/price-alert-overlay/site/1/product/202740303",
|
||
"contentLoadBy" : "ajax",
|
||
"titleCaption" : "Preiswecker stellen",
|
||
"triggerOnClose" : "pricewatcher-close",
|
||
"triggerOnOpen" : "pricewatcher-open",
|
||
"triggerOpenEvent" : "externalOpener",
|
||
"triggerCloseEvent" : "closeOverlay",
|
||
"contentPaddingTop" : "63px",
|
||
"forceOpen" : "true",
|
||
"wrapperClass" : "pricewatcher"
|
||
}">
|
||
|
||
<div class="svg-icon svg-baseline svg-block">
|
||
<svg class="oopStage-actionIcon priceAlertButton-icon--unset" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#alarmclock_outline"></use>
|
||
</svg>
|
||
<svg class="oopStage-actionIcon priceAlertButton-icon--set" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#alarmclock_filled"></use>
|
||
</svg>
|
||
</div>
|
||
|
||
<span class="oopStage-actionIcon--text priceAlertButton-text">Preiswecker</span>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<div class="oopStage-productInfo" data-oop-stage="">
|
||
|
||
<div class="small-12 collapse-both columns">
|
||
<div class="oopStage-productInfoTopItemWrapper">
|
||
<div class="oopStage-productInfoTopItems small-12 collapse-both columns">
|
||
<b>Produktübersicht:</b>
|
||
<span class="oopStage-productInfoTopItemWrapperDatasheetLink"><a id="productDetailsAnchor" href="#datasheet" data-scrolling-anchor="" data-sp-tracking="click" data-sp-tracking-meta="{"event":"product_details_click", "version":"1-1-0", "owner":"de.idealo.koopa"}">
|
||
Produktdetails</a>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
<div class="energyLabel-overlayContent">
|
||
</div>
|
||
</div>
|
||
|
||
<div class="oopStage-crossLinksTopItemWrapper small-12 collapse-both columns">
|
||
<span>
|
||
<b>Ähnliche Produkte:</b>
|
||
<span class="oopStage-crossLinksTopItem">
|
||
<a href="https://www.idealo.de/preisvergleich/ProductCategory/18874F2001437.html" rel="">
|
||
Elektrorollstuhl</a>
|
||
</span>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="delta-filters">
|
||
</div>
|
||
<div id="filter-expand-button-show-more-1" style="display: none;">anzeigen</div>
|
||
<div id="filter-expand-button-show-more-2" style="display: none;"></div>
|
||
<div id="filter-expand-button-show-less" style="display: none;">weniger anzeigen</div>
|
||
<div id="local-offers-refresh-trigger" style="visibility: hidden" data-async-data="X9UvThqXYvnSo1j9qXDL_zaDyg9_A-MuZ6YtWKGR-yBnhrxkgI_pyTqb82X0K2L4T2wPUxp2QVljQmZegg_QNFJ6Qu0At4idkJoyGQQoc9vTKL8UssjyCi29NS7rxqtRc2JhWmxljy7X6aAN2jqeQHZSI-BY9DIuHrPoUvhxy8ywuNVY9_LsNSfIHHBJzysAPrB6pDgTVj1V4iVTO0KHggp5Q-Nw4LaCyoFVjYsT3GfwerhR-F6FLNGzVntEEYyiusjdBKNCG3eg7Z9LORWVaqiLXtsFHK0RQgnx-HaIpbZ5WjFglcH1kgAowsPTOimm5P0cKdH_kowOXeLsuieLHA" data-refresh-link="/offerpage/context/local/refresh/location/">
|
||
</div>
|
||
<div id="context-buttons" class="oopStage-productConditionContainer oopStage-productConditionContainer--visible-mobile">
|
||
</div>
|
||
</div>
|
||
<div class="oopStage-price-chart columns">
|
||
<div id="price-chart-wrapper" data-price-chart="{"siteId": 1, "productId": 202740303, "abTests": []}">
|
||
<section id="loading-price-chart-skeleton" class="price-chart-skeleton show-for-xlarge">
|
||
<div class="newPriceChart--small price-chart-passive">
|
||
<div class="newPriceChart--smallHead">
|
||
<span class="newPriceChart--smallHeadTitle">Preisentwicklung</span>
|
||
<ul class="newPriceChart--smallHeadLinks">
|
||
<li>
|
||
3M</li>
|
||
<li>
|
||
<a class="price-chart-passive">6M</a>
|
||
</li>
|
||
<li>
|
||
<a class="price-chart-passive">1J</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="skeleton skeleton-chart">
|
||
</div>
|
||
<div>
|
||
<button class="i-button i-button--ghost button--pricewatcher priceAlertButton priceAlertButton--unset price-chart-passive-button">
|
||
<svg class="priceAlertButton-icon--unset price-chart-passive-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#alarmclock_outline"></use>
|
||
</svg>
|
||
<span class="priceAlertButton-text--unset">Preiswecker stellen</span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="oop-mainWrapper row">
|
||
<aside id="sidebar" class=" small-12 xxlarge-3 columns">
|
||
|
||
<section id="localOffersSidebar" class="localOffersSidebar" style="display: none"></section>
|
||
|
||
<section id="lastSeenProducts" class="hide">
|
||
<h2>
|
||
Zuletzt angesehen</h2>
|
||
<div>
|
||
</div>
|
||
</section>
|
||
<section id="top-ten-products">
|
||
<h2>
|
||
Top 10 Produkte<span>
|
||
Elektrorollstühle</span>
|
||
</h2>
|
||
<ol class="topTenProducts">
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
1</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/206717/0/206717027/s1_produktbild_klein/moving-star-elektrorollator-all-in-one.jpg" alt="Moving Star Elektrorollator All in One"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/206717027_-elektrorollator-all-in-one-moving-star.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Moving Star Elektrorollator All in One</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 1.790,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
2</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/203120/6/203120632/s1_produktbild_klein/veleco-cosmo-elektrorollstuhl-faltbar.jpg" alt="Veleco Cosmo Elektrorollstuhl faltbar"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/203120632_-cosmo-elektrorollstuhl-faltbar-veleco.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Veleco Cosmo Elektrorollstuhl faltbar</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 775,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
3</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/206047/8/206047840/s1_produktbild_klein/antar-at52326-carbon-rollstuhl.jpg" alt="Antar AT52326 Carbon Rollstuhl"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/206047840_-at52326-carbon-rollstuhl-antar.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Antar AT52326 Carbon Rollstuhl</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 1.299,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
4</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/209891/8/209891847/s1_produktbild_klein/antar-elektrischer-rollstuhl-faltbar-lithium-akku-24v-bis-120-kg.jpg" alt="Antar Elektrischer Rollstuhl faltbar Lithium Akku 24V bis 120 kg"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/209891847_-elektrischer-rollstuhl-faltbar-lithium-akku-24v-bis-120-kg-antar.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Antar Elektrischer Rollstuhl faltbar Lithium Akku 24V bis 120 kg</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 749,89 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
5</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/208848/3/208848381/s1_produktbild_klein/antar-elektrischer-rollstuhl-aus-carbonstahl-stabil-faltbar-komfortabel-44-cm.jpg" alt="Antar Elektrischer Rollstuhl aus Carbonstahl stabil faltbar & komfortabel 44 cm"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/208848381_-elektrischer-rollstuhl-aus-carbonstahl-stabil-faltbar-komfortabel-44-cm-antar.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Antar Elektrischer Rollstuhl aus Carbonstahl stabil faltbar & komfortabel 44 cm</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 899,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
6</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/203554/4/203554430/s1_produktbild_klein/sunrise-medical-q200r-elektrorollstuhl-mit-heckantrieb.jpg" alt="Sunrise Medical Q200R Elektrorollstuhl mit Heckantrieb"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/203554430_-q200r-elektrorollstuhl-mit-heckantrieb-sunrise-medical.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Sunrise Medical Q200R Elektrorollstuhl mit Heckantrieb</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 2.190,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
7</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/images/product/208480999/de_DE/0/klein.jpg" alt="Elektrischer Rollator/Rollstuhl moderne 2-in-1-Lösung AT52334"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/208480999_-elektrischer-rollator-rollstuhl-moderne-2-in-1-loesung-at52334.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Elektrischer Rollator/Rollstuhl moderne 2-in-1-Lösung AT52334</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 1.399,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
8</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/202068/1/202068139/s1_produktbild_klein/bischoff-bischoff-eltego-elektrorollstuhl.jpg" alt="Bischoff & Bischoff Eltego Elektrorollstuhl"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/202068139_-eltego-elektrorollstuhl-bischoff-bischoff.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Bischoff & Bischoff Eltego Elektrorollstuhl</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 1.999,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
9</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/201889/4/201889446/s1_produktbild_klein/antar-elektrischer-rollstuhl-6-km-h.jpg" alt="Antar elektrischer Rollstuhl (6 km/h)"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/201889446_-elektrischer-rollstuhl-6-km-h-antar.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Antar elektrischer Rollstuhl (6 km/h)</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 749,99 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
<li class="topTenProducts-product">
|
||
<div class="topTenProducts-product-order">
|
||
10</div>
|
||
<div class="topTenProducts-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/207872/9/207872956/s1_produktbild_klein/antar-elektrischer-rollstuhl-at52333-optional-mit-begleitsteuerung.jpg" alt="Antar Elektrischer Rollstuhl AT52333 optional mit Begleitsteuerung"/>
|
||
</div>
|
||
<div class="topTenProducts-product-description">
|
||
<a href="/preisvergleich/OffersOfProduct/207872956_-elektrischer-rollstuhl-at52333-optional-mit-begleitsteuerung-antar.html" class="topTenProducts-product-description-link">
|
||
<div class="topTenProducts-product-description-link-title">
|
||
Antar Elektrischer Rollstuhl AT52333 optional mit Begleitsteuerung</div>
|
||
</a>
|
||
<div class="topTenProducts-product-description-price">
|
||
ab 1.549,00 €</div>
|
||
</div>
|
||
|
||
</li>
|
||
</ol>
|
||
</section>
|
||
<section id="recommendedProducts">
|
||
<h2>
|
||
Zurzeit beliebt auf idealo</h2>
|
||
|
||
<ul class="sideBarProduct">
|
||
<li class="sideBar-product" onclick="this.querySelector('a').click()">
|
||
<div class="sideBar-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/201266/0/201266088/s1_produktbild_klein/antar-elektrorollstuhl-at52313.jpg" alt="Antar Elektrorollstuhl AT52313"/>
|
||
</div>
|
||
<div class="sideBar-product-description">
|
||
<div class="sideBar-product-description-title">
|
||
<a href="/preisvergleich/OffersOfProduct/201266088_-elektrorollstuhl-at52313-antar.html">
|
||
Antar Elektrorollstuhl AT52313</a>
|
||
</div>
|
||
<div class="sideBar-product-description-price">
|
||
ab 1.323,43 €</div>
|
||
</div>
|
||
</li>
|
||
<li class="sideBar-product" onclick="this.querySelector('a').click()">
|
||
<div class="sideBar-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/201890/7/201890738/s1_produktbild_klein/antar-elektrorollstuhl-at52305.jpg" alt="Antar Elektrorollstuhl AT52305"/>
|
||
</div>
|
||
<div class="sideBar-product-description">
|
||
<div class="sideBar-product-description-title">
|
||
<a href="/preisvergleich/OffersOfProduct/201890738_-elektrorollstuhl-at52305-antar.html">
|
||
Antar Elektrorollstuhl AT52305</a>
|
||
</div>
|
||
<div class="sideBar-product-description-price">
|
||
ab 879,00 €</div>
|
||
</div>
|
||
</li>
|
||
<li class="sideBar-product" onclick="this.querySelector('a').click()">
|
||
<div class="sideBar-product-image">
|
||
<img src="https://cdn.idealo.com/images/product/203686563/de_DE/0/klein.jpg" alt="Bueuwe Elektrorollstuhl faltbar"/>
|
||
</div>
|
||
<div class="sideBar-product-description">
|
||
<div class="sideBar-product-description-title">
|
||
<a href="/preisvergleich/OffersOfProduct/203686563_-elektrorollstuhl-faltbar-bueuwe.html">
|
||
Bueuwe Elektrorollstuhl faltbar</a>
|
||
</div>
|
||
<div class="sideBar-product-description-price">
|
||
ab 1.219,99 €</div>
|
||
</div>
|
||
</li>
|
||
<li class="sideBar-product" onclick="this.querySelector('a').click()">
|
||
<div class="sideBar-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/209721/4/209721492/s1_produktbild_klein/meyra-ichair-mc1-light-1-610-elektrorollstuhl.jpg" alt="Meyra iCHAIR MC1 LIGHT 1.610 Elektrorollstuhl"/>
|
||
</div>
|
||
<div class="sideBar-product-description">
|
||
<div class="sideBar-product-description-title">
|
||
<a href="/preisvergleich/OffersOfProduct/209721492_-ichair-mc1-light-1-610-elektrorollstuhl-meyra.html">
|
||
Meyra iCHAIR MC1 LIGHT 1.610 Elektrorollstuhl</a>
|
||
</div>
|
||
<div class="sideBar-product-description-price">
|
||
ab 2.587,10 €</div>
|
||
</div>
|
||
</li>
|
||
<li class="sideBar-product" onclick="this.querySelector('a').click()">
|
||
<div class="sideBar-product-image">
|
||
<img src="https://cdn.idealo.com/images/product/208480994/de_DE/0/klein.jpg" alt="zhyunvd Kompakter Strom RollstuhlFaltbarer Elektrorollstuhl Aus AluminiumlegierungLeicht Rollstuhl Elektrisch Faltbar Elektrorollstuhl Airline Genehmigt für Senioren Und Behinderung 10a"/>
|
||
</div>
|
||
<div class="sideBar-product-description">
|
||
<div class="sideBar-product-description-title">
|
||
<a href="/preisvergleich/OffersOfProduct/208480994_-zhyunvd-kompakter-strom-rollstuhlfaltbarer-elektrorollstuhl-aus-aluminiumlegierungleicht-rollstuhl-elektrisch-faltbar-elektrorollstuhl-airline-genehmigt-fuer-senioren-und-behinderung-10a.html">
|
||
zhyunvd Kompakter Strom RollstuhlFaltbarer Elektrorollstuhl Aus AluminiumlegierungLeicht Rollstuhl Elektrisch Faltbar Elektrorollstuhl Airline Genehmigt für Senioren Und Behinderung 10a</a>
|
||
</div>
|
||
<div class="sideBar-product-description-price">
|
||
ab 610,00 €</div>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
|
||
</section>
|
||
<section id="i18nPrices" data-ajax-html="{"url":"aHR0cHM6Ly93d3cuaWRlYWxvLmRlL29mZmVycGFnZS9mcmFnbWVudC9pbnRlcm5hdGlvbmFscHJpY2VzL3Byb2R1Y3RzLzIwMjc0MDMwMw=="}"></section>
|
||
</aside>
|
||
|
||
<div class="datasheet-container">
|
||
<div id="datasheet" class="datasheet columns small-12 xxlarge-12" data-sp-tracking="view" data-sp-tracking-meta="{"event":"datasheet_view", "version":"1-1-0", "owner":"de.idealo.koopa"}">
|
||
|
||
<h2 class="datasheet-title small-12 columns">
|
||
Produktdetails</h2>
|
||
<div class="datasheet-wrapper">
|
||
<img class="datasheet-cover-image" src="https://cdn.idealo.com/folder/Product/202740/3/202740303/s1_produktbild_gross/mobilis-elektrorollstuhl-m45-air-rot.jpg" alt="Mobilis Elektrorollstuhl M45 Air rot" width="290" height="241"/>
|
||
<table class="datasheet-list">
|
||
<tbody>
|
||
<tr class="datasheet-listItem datasheet-listItem--properties ">
|
||
<td class="datasheet-listItemKey small-6 larger-4 columns">
|
||
Produkttyp</td>
|
||
<td class="datasheet-listItemValue small-6 larger-8 columns">
|
||
Elektrorollstuhl</td>
|
||
</tr>
|
||
</tbody>
|
||
|
||
<tbody>
|
||
<tr class="datasheet-listItem datasheet-listItem--group ">
|
||
<th>
|
||
Allgemeine Informationen</th>
|
||
</tr>
|
||
|
||
<tr class="datasheet-listItem datasheet-listItem--properties ">
|
||
<td class="datasheet-listItemKey small-6 larger-4 columns">
|
||
Farbe</td>
|
||
<td class="datasheet-listItemValue small-6 larger-8 columns">
|
||
rot</td>
|
||
</tr>
|
||
</tbody>
|
||
<tbody>
|
||
<tr class="datasheet-listItem datasheet-listItem--group ">
|
||
<th>
|
||
Besonderheiten</th>
|
||
</tr>
|
||
|
||
<tr class="datasheet-listItem datasheet-listItem--properties ">
|
||
<td class="datasheet-listItemKey small-6 larger-4 columns">
|
||
Ausstattung</td>
|
||
<td class="datasheet-listItemValue small-6 larger-8 columns">
|
||
Sitz</td>
|
||
</tr>
|
||
<tr class="datasheet-listItem datasheet-listItem--properties ">
|
||
<td class="datasheet-listItemKey small-6 larger-4 columns">
|
||
Eigenschaften</td>
|
||
<td class="datasheet-listItemValue small-6 larger-8 columns">
|
||
faltbar, höhenverstellbar</td>
|
||
</tr>
|
||
</tbody>
|
||
<tbody>
|
||
<tr class="datasheet-listItem datasheet-listItem--group ">
|
||
<th>
|
||
Weitere Eigenschaften</th>
|
||
</tr>
|
||
<tr class="datasheet-listItem datasheet-listItem--properties ">
|
||
<td class="datasheet-listItemKey small-6 larger-4 columns">
|
||
Einsatzbereich</td>
|
||
<td class="datasheet-listItemValue small-6 larger-8 columns">
|
||
Innenbereich</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
<div id="offerList" class="productOffers columns small-12 xxlarge-9">
|
||
<div id="offerlist-head">
|
||
<div class="productOffers-header row row-24" data-translations="{"price_comparison":"Preisvergleich","load_offers":"Weitere Angebote anzeigen","load_offers_state":"lädt ...","sort_total_price":"Inkl. Versandkosten","filter_available":"Sofort lieferbar","filter_free_return":"Ohne Rücksendekosten","offers":"Angebote","no_offers_technical_issue":"Die Angebote konnten nicht geladen werden. Bitte versuche es später noch mal.","no_offers_with_filters":"Wir konnten leider keine Angebote finden, die deinen Filterkriterien entsprechen.","filter_reset":"Alle Filter löschen","used_offers":"B-Ware & Gebraucht","no_offers":"Es wurden leider keine Angebote gefunden.","sort_label":"Sortieren nach:"}" data-loggedin="false" data-used-offers-requested="false" data-offerlist="">
|
||
<div class="columns small-24 medium-24 large-24 larger-12 xlarge-5 productOffers-headerContainer">
|
||
<div class="productOffers-headerContainer-wrapper">
|
||
<h2 class="productOffers-headerTitle">
|
||
Preisvergleich</h2>
|
||
</div>
|
||
</div>
|
||
<div class="columns productOffers-headerContainer productOffers-headerContainer-right">
|
||
<form class="productOffers-header-sort" action="/" method="post">
|
||
<div class="productOffers-header-sortContainer">
|
||
<div class="productOffers-header-sort-wrapper collapse-both show-for-small hide-for-xlarge">
|
||
<fieldset class="productOffers-header-fieldset">
|
||
<input id="product-offers-header-sort" class="i-input-checkbox" type="checkbox" data-rel="totalPrice" data-trx-click="offerlist_sort_click;1-1-1;sooper" data-trx-click-data="click_target=>total_price"/>
|
||
<label for="product-offers-header-sort" class="idealo-checkbox" aria-label="Inkl. Versandkosten"></label>
|
||
</fieldset>
|
||
<label class="productOffers-header-sortText productOffers-header-sortTextMobile hide-for-large" for="product-offers-header-sort">
|
||
inkl. Versand</label>
|
||
<label class="productOffers-header-sortText productOffers-header-sortTextDesktop" for="product-offers-header-sort">Inkl. Versandkosten</label>
|
||
</div>
|
||
<div class="productOffers-header-sort-wrapper collapse-both show-for-small">
|
||
<fieldset class="productOffers-header-fieldset">
|
||
<input id="product-offers-filter-available" class="i-input-checkbox" type="checkbox" data-rel="available" data-trx-click="offerlist_filter_click;1-1-3;sooper" data-trx-click-data="click_target=>available"/>
|
||
<label for="product-offers-filter-available" class="idealo-checkbox" aria-label="Sofort lieferbar"></label>
|
||
</fieldset>
|
||
<label class="productOffers-header-sortText productOffers-header-sortTextMobile" for="product-offers-filter-available">Sofort lieferbar</label>
|
||
<label class="productOffers-header-sortText productOffers-header-sortTextDesktop" for="product-offers-filter-available">Sofort lieferbar</label>
|
||
</div>
|
||
<div class="productOffers-header-sort-wrapper collapse-both show-for-large">
|
||
<fieldset class="productOffers-header-fieldset">
|
||
<input id="product-offers-filter-freereturn" class="i-input-checkbox" type="checkbox" data-rel="freereturn" data-trx-click="offerlist_filter_click;1-1-3;sooper" data-trx-click-data="click_target=>free_return"/>
|
||
<label for="product-offers-filter-freereturn" class="idealo-checkbox" aria-label="Ohne Rücksendekosten"></label>
|
||
</fieldset>
|
||
<label class="productOffers-header-sortText productOffers-header-sortTextDesktop" for="product-offers-filter-freereturn">Ohne Rücksendekosten</label>
|
||
</div>
|
||
</div>
|
||
<div class="productOffers-header-totalPrice-buttons hide-for-small show-for-xlarge">
|
||
<span>Sortieren nach:</span>
|
||
<input class="visually-hidden" id="product-offers-sort-price" type="radio" name="price-sort" value="include-delivery" autocomplete="off" checked="" data-trx-click="offerlist_sort_click;1-1-1;sooper" data-trx-click-data="click_target=>price"/>
|
||
<label class="button" for="product-offers-sort-price">
|
||
Preis</label>
|
||
<input class="visually-hidden" id="product-offers-sort-total-price" type="radio" name="price-sort" value="include-delivery" autocomplete="off" data-trx-click="offerlist_sort_click;1-1-1;sooper" data-trx-click-data="click_target=>total_price"/>
|
||
<label class="button" for="product-offers-sort-total-price">
|
||
Gesamtpreis</label>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div id="product-alert-wrapper"></div>
|
||
<div id="offer-list-with-pagination">
|
||
<ul class="productOffers-list" data-import-time="Daten vom 25.05.2026 15:04">
|
||
|
||
<li class="productOffers-listHeadline row row-24">
|
||
<div class="xlarge-4 columns">
|
||
Angebotsbezeichnung</div>
|
||
<div class="productOffers-listHeadline-priceAndPayment-price xlarge-4 columns">
|
||
Preis & Versand</div>
|
||
<div class="productOffers-listHeadline-priceAndPayment-payment xlarge-4 columns">
|
||
Zahlungsarten*
|
||
</div>
|
||
<div class="productOffers-listHeadline-delivery xlarge-4 columns">
|
||
Lieferung</div>
|
||
<div class="xlarge-6">
|
||
Shop & Shopbewertung</div>
|
||
</li>
|
||
<span data-offerlist-view-id="cf31624a-613d-47ce-85f0-c0081fc56f6c"></span>
|
||
<span data-ctx-offerlist-view-id="cf31624a-613d-47ce-85f0-c0081fc56f6c"></span>
|
||
<span data-offerlist-segment="new"></span>
|
||
<li class="productOffers-listItemOfferErrorBanner row row-24">
|
||
<div class="banner bannerOfferError">
|
||
<span class="banner-content bannerOfferError-icon">
|
||
<!--?xml version="1.0" encoding="UTF-8"?-->
|
||
<svg width="22px" height="22px" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<!-- Generator: Sketch 63.1 (92452) - https://sketch.com -->
|
||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||
<g id="04_Above_Offerlist_mobile" transform="translate(-222.000000, -308.000000)" fill="#0771D0" fill-rule="nonzero">
|
||
<g id="ico_info_circle_filled" transform="translate(222.000000, 308.000000)">
|
||
<path d="M32,0 C14.326888,0 0,14.326888 0,32 C0,49.673112 14.326888,64 32,64 C49.673112,64 64,49.673112 64,32 C63.9791607,14.3355271 49.6644729,0.0208392747 32,0 Z M34.9090909,46.5454545 C34.9090909,48.1521011 33.6066465,49.4545455 32,49.4545455 C30.3933535,49.4545455 29.0909091,48.1521011 29.0909091,46.5454545 L29.0909091,32 C29.0909091,30.3933535 30.3933535,29.0909091 32,29.0909091 C33.6066465,29.0909091 34.9090909,30.3933535 34.9090909,32 L34.9090909,46.5454545 Z M32,22.1090909 C29.9113595,22.1090909 28.2181818,20.4159132 28.2181818,18.3272727 C28.2181818,16.2386322 29.9113595,14.5454545 32,14.5454545 C34.0886405,14.5454545 35.7818182,16.2386322 35.7818182,18.3272727 C35.7818182,20.4159132 34.0886405,22.1090909 32,22.1090909 Z" id="Shape"></path>
|
||
</g>
|
||
</g>
|
||
</g>
|
||
</svg>
|
||
</span>
|
||
<strong class="banner-content" data-label="Angebots-Fehler gefunden?">
|
||
</strong>
|
||
<span class="banner-content bannerOfferError-linkContainer">
|
||
<a class="banner-link" data-label="Gib uns bitte Bescheid.">
|
||
</a>
|
||
</span>
|
||
</div>
|
||
</li>
|
||
<li class="productOffers-listItem row row-24
|
||
" data-hyperlinks="[{"rel":"totalPrice","href":"https://www.idealo.de/offerpage/offerlist/product/202740303/start/0/sort/btpb?includeFilters=0&excludeFilters=0&offerpageViewId=4b27f317-587d-4fdf-975d-9257a4130f79"},{"rel":"available","href":"https://www.idealo.de/offerpage/offerlist/product/202740303/start/0/sort/default?includeFilters=64&excludeFilters=0&offerpageViewId=4b27f317-587d-4fdf-975d-9257a4130f79"},{"rel":"freereturn","href":"https://www.idealo.de/offerpage/offerlist/product/202740303/start/0/sort/default?includeFilters=262144&excludeFilters=0&offerpageViewId=4b27f317-587d-4fdf-975d-9257a4130f79"},{"rel":"base","href":"https://www.idealo.de/offerpage/offerlist/product/202740303/start/0/sort/default?includeFilters=0&excludeFilters=0&offerpageViewId=4b27f317-587d-4fdf-975d-9257a4130f79"},{"rel":"homeDelivery","href":"https://www.idealo.de/offerpage/offerlist/product/202740303/start/0/sort/default?includeFilters=0&excludeFilters=0&offerFilters=HOME_DELIVERY&offerpageViewId=4b27f317-587d-4fdf-975d-9257a4130f79"},{"rel":"disposalOnly","href":"https://www.idealo.de/offerpage/offerlist/product/202740303/start/0/sort/default?includeFilters=0&excludeFilters=0&offerFilters=DISPOSAL_ONLY&offerpageViewId=4b27f317-587d-4fdf-975d-9257a4130f79"}]" data-total-offer-count="1" data-shop="{"type":"SHPSA"}" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>offer-row;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" data-mtrx-click="{"shop_name":"otto.de","products":[{"id":202740303,"category":18874,"name":"Mobilis Elektrorollstuhl M45 Air rot","price":6780.0}],"event":"leadout"}" data-error-data-url="L29mZmVycGFnZS9vZmZlci9lcnJvci9hcGkvcHJvZHVjdC8yMDI3NDAzMDMvb2ZmZXJrZXkvNWQ2MTk3MGJhNGNhYjhmOGQ2NDk1YjA2ZWZhZGZmZDg/b2ZmZXJJbmRleD0w">
|
||
<div class="small-24 medium-24 large-24 larger-5 xlarge-4 productOffers-listItemTitleWrapper" data-offerlist-column="title">
|
||
<a class="productOffers-listItemTitle" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" target="_blank" rel="noopener nofollow" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>title;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<span class="productOffers-listItemTitleInner " title="mobilis Elektrorollstuhl M45 Air, Auf Augenhöhe in Sekunden, Rollstuhl mit elektr. Hubfunktion und Licht, Fußbrett hochklappbar, rot">
|
||
mobilis Elektrorollstuhl M45 Air, Auf Augenhöhe in Sekunden, Rollstuhl mit elektr. Hubfunktion und Licht, Fußbrett hochklappbar, rot</span>
|
||
</a>
|
||
|
||
</div>
|
||
|
||
<div class="productOffers-listItemOffer small-8 medium-8 large-9 larger-8 xlarge-8 columns" data-offerlist-column="price">
|
||
<div class="row">
|
||
<div class="column small-24 large-12 larger-12 xlarge-12 price-column">
|
||
<div class="amazon-prime__wrapper">
|
||
<a class="productOffers-listItemOfferPrice" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>price;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" target="_blank" rel="noopener nofollow">
|
||
6.780,00 €</a>
|
||
<div class="best-total-price-box">
|
||
<div class="best-total-price">
|
||
<span>
|
||
<a href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>best-price;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" target="_blank" rel="noopener nofollow">
|
||
<span class="productOffers-listItemOfferBestTotalPrice">
|
||
Günstigster Gesamtpreis</span><br/>
|
||
</a></span>
|
||
</div>
|
||
|
||
<div class="line-offer-view productOffers-listItemOfferShippingDetails withBestTotalPrice">
|
||
<a href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>best-price;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" target="_blank" rel="noopener nofollow">
|
||
<div>
|
||
<div class="productOffers-listItemOfferShippingDetails" title="6.819,95 € inkl. Versand">
|
||
6.819,95 € inkl. Versand</div>
|
||
</div>
|
||
</a>
|
||
</div>
|
||
</div><div class="productOffers-listItemOfferInfoBadgesWrapper">
|
||
</div>
|
||
|
||
<div class="show-for-large hide-for-medium hide-for-xlarge productOffers-listItemOfferDeliveryStatusMobile">
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="column large-12 larger-12 xlarge-12 show-for-large payment-column">
|
||
<div class="productOffers-listItemOfferShippingDetailsRight" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>payment-methods;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
<img width="45" height="13" class="offerImage" src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/payment-icons/2x/paypal-c038cb02ad0744a542c4.png" title=""/></span>
|
||
</a>
|
||
</span>
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="Rechnung">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
Rechnung</span>
|
||
</a>
|
||
</span>
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
<img width="45" height="13" class="offerImage" src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/payment-icons/2x/visa-ac94b93bc9a9921b1f11.png" title=""/></span>
|
||
</a>
|
||
</span>
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
<img width="45" height="13" class="offerImage" src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/payment-icons/2x/mastercard-2e81fe3d252402ab0358.png" title=""/></span>
|
||
</a>
|
||
</span>
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
<img width="45" height="13" class="offerImage" src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/payment-icons/2x/american-express-b6d0b3d814c4b5314ddb.png" title=""/></span>
|
||
</a>
|
||
</span>
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="Lastschrift">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
Lastschrift</span>
|
||
</a>
|
||
</span>
|
||
<span class="productOffers-listItemOfferShippingDetailsRightItem" title="Vorkasse">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span>
|
||
Vorkasse</span>
|
||
</a>
|
||
</span>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<ul class="productOffers-listItemOfferDeliveryBlock show-for-large large-5 larger-3 xlarge-4 columns va-middle-xlarge-up" role="list" data-offerlist-column="delivery" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>delivery;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<li>
|
||
<svg class="long" viewBox="0 0 4 4" xmlns="http://www.w3.org/2000/svg">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#circle"></use>
|
||
</svg>
|
||
|
||
<p class="productOffers-listItemOfferDeliveryStatusDates productOffers-listItemOfferDeliveryStatus">
|
||
<span class="productOffers-listItemOfferDeliveryStatusDatesTitle">
|
||
Lieferung:
|
||
</span>
|
||
<span class="productOffers-listItemOfferDeliveryStatusDatesRange">
|
||
bis Do. 18.06.</span>
|
||
</p>
|
||
<div class="productOffers-listItemOfferDeliveryProviderWrapper">
|
||
<span class="productOffers-listItemOfferGreyBadge productOffers-listItemOfferDeliveryProvider">
|
||
Hermes</span>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<svg class="short" viewBox="0 0 4 4" xmlns="http://www.w3.org/2000/svg">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#circle"></use>
|
||
</svg>
|
||
<div class="productOffers-listItemOfferDeliveryRetourText">
|
||
<span>Rücksendung 30 Tage kostenfrei</span>
|
||
</div>
|
||
</li>
|
||
</a>
|
||
</ul>
|
||
<div class="small-8 medium-8 large-6 larger-4 xlarge-4 xlarge-text-left large-text-center small-text-center productOffers-listItemOfferShopV2Block va-middle-xlarge-up" data-offerlist-column="shop">
|
||
<div class="productOffers-listItemOfferShopV2">
|
||
<div class="productOffers-listItemOfferShopV2LogoContainer">
|
||
<div class="productOffers-listItemOfferShopV2Logo">
|
||
<a class="productOffers-listItemOfferShopV2LogoLink" data-shop-name="otto.de - Shop aus Hamburg" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>shop-logo;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" rel="noopener nofollow" target="_blank">
|
||
<img class="productOffers-listItemOfferShopV2LogoImage" src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/spacer-06c805d5f8d0f0cd4e44.png" data-shop-logo="//cdn.idealo.com/folder/Shop/3/0/3040/s1_shop_160x60.png" data-shop-logo-fallback="//cdn.idealo.com/folder/Shop/3/0/3040/s1_shop.gif" alt="otto.de - Shop aus Hamburg"/>
|
||
|
||
<noscript>
|
||
<img class="productOffers-listItemOfferShopV2LogoImage noborder"
|
||
src="//cdn.idealo.com/folder/Shop/3/0/3040/s1_shop.gif"
|
||
alt="otto.de"
|
||
/>
|
||
</noscript>
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
<div class="productOffers-listItemOfferShopV2RatingsContainer">
|
||
<a target="_blank" class="productOffers-listItemOfferShopV2StarsLink" href="https://www.idealo.de/preisvergleich/Shop/3040.html">
|
||
<div class="productOffers-listItemOfferShopV2Stars rating-single-star" data-trx-click="offer_click;2-2-0;sooper" data-trx-click-data="click_target=>shop-rating;offer_click_type=>shoppage;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<div class="starAndRatingWrapper">
|
||
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="#FF6600">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#star"></use>
|
||
</svg>
|
||
<span>
|
||
<b>2,2</b>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
|
||
</a>
|
||
<a target="_blank" class="productOffers-listItemOfferShopV2NORatings" href="https://www.idealo.de/preisvergleich/Shop/3040.html" data-trx-click="offer_click;2-2-0;sooper" data-trx-click-data="click_target=>shop-rating;offer_click_type=>shoppage;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<span class="productOffers-listItemOfferShopV2NORatings--numberOfRatings">12697</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<button class="show-for-large productOffers-listItemOfferShopV2Info" data-trx-click="offer_click;2-4-5;sooper" data-trx-click-data="click_target=>shop-info-button;offer_click_type=>shop-info-overlay;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" data-overlay="{
|
||
"closeCaption" : "back",
|
||
"contentLoad" : "https://www.idealo.de/offerpage/ui/shop-infos/product/202740303/offerkey/5d61970ba4cab8f8d6495b06efadffd8/index/0?offerListCondition=null&locale=de_DE&language=de_DE",
|
||
"contentLoadBy" : "ajax",
|
||
"eventStopPropagation" : "false",
|
||
"titleCaption" : "otto.de",
|
||
"triggerOnOpen" : "shop-info-open",
|
||
"contentPaddingTop" : "0",
|
||
"wrapperClass" : "shopOverlay",
|
||
"appendTo" : "#shop-overlay-wrapper"
|
||
}">
|
||
Shop-Details</button>
|
||
</div>
|
||
|
||
<div class="productOffers-listItemOfferCtaHolder small-8 medium-8 large-4 larger-4 xlarge-4 columns va-middle-xlarge-up" data-offerlist-column="leadoutbutton">
|
||
<ul class="productOffers-listItemOfferCta">
|
||
<li>
|
||
<a class="productOffers-listItemOfferCtaLeadout button button--leadout" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" data-shop-name="otto.de" rel="noopener nofollow" target="_blank" data-trx-click="offer_click;2-2-0;sooper" data-trx-click-data="click_target=>offer-button;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}" aria-label="Zum otto.de Shop">
|
||
Zum Shop<img class="btn-cta-shop" src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/btn_placeholder-6a908321904cc83dbe01.gif" alt="Mobilis Elektrorollstuhl M45 Air rot kaufen: günstige Rollstühle & Gehhilfen bei otto.de"/>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="productOffers-listItemOfferDetailsMobile ">
|
||
<div class="productOffers-listItemOfferDetails" data-overlay="{
|
||
"closeCaption" : "back",
|
||
"contentLoad" : "https://www.idealo.de/offerpage/ui/shop-infos/product/202740303/offerkey/5d61970ba4cab8f8d6495b06efadffd8/index/0?offerListCondition=null&locale=de_DE&language=de_DE",
|
||
"contentLoadBy" : "ajax",
|
||
"eventStopPropagation" : "false",
|
||
"titleCaption" : "otto.de",
|
||
"triggerOnOpen" : "shop-info-open",
|
||
"contentPaddingTop" : "0",
|
||
"wrapperClass" : "shopOverlay",
|
||
"appendTo" : "#shop-overlay-wrapper"
|
||
}" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>details;offer_click_type=>shop-info-overlay;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
Details</div>
|
||
|
||
<div class="vertical-separator"></div>
|
||
|
||
<div class="productOffers-listItemOfferDelivery delivery delivery--long svg-icon" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>delivery;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#truck"></use>
|
||
</svg>
|
||
</a>
|
||
</div>
|
||
|
||
<span class="hide-for-large productOffers-listItemOfferDeliveryStatusMobile" data-trx-click="offer_click;2-4-6;sooper" data-trx-click-data="click_target=>delivery;offer_click_type=>clickout;{"offer_key":"5d61970ba4cab8f8d6495b06efadffd8","shop_id":"3040","offer_position":"0","leadout_type":"offer"}">
|
||
<a rel="noopener nofollow" target="_blank" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer">
|
||
<span class="productOffers-listItemOfferDeliveryStatusMobileText">
|
||
<p class="productOffers-listItemOfferDeliveryStatusDates productOffers-listItemOfferDeliveryStatus">
|
||
<span class="productOffers-listItemOfferDeliveryStatusDatesTitle">
|
||
Lieferung:
|
||
</span>
|
||
<span class="productOffers-listItemOfferDeliveryStatusDatesRange">
|
||
bis Do. 18.06.</span>
|
||
</p>
|
||
</span>
|
||
</a>
|
||
</span>
|
||
|
||
</div>
|
||
<a class="productOffers-listItemOfferLink" href="/relocator/relocate?categoryId=18874&offerKey=5d61970ba4cab8f8d6495b06efadffd8&pos=1&price=6780.00&productid=202740303&sid=3040&type=offer" target="_blank" data-shop-name="otto.de" rel="noopener nofollow">
|
||
</a>
|
||
</li>
|
||
<li class="productOffers-listItemImportTime row">
|
||
<span class="small-12 columns">Daten vom 25.05.2026 15:04</span>
|
||
</li>
|
||
|
||
</ul>
|
||
<div>
|
||
<div class="productOffers-metric">
|
||
<h4 class="productOffers-metricHeadline">Wie zufrieden bist Du mit dem Preisvergleich?</h4>
|
||
<h4 class="productOffers-metricHeadlineComplete">Vielen Dank für Deine Teilnahme!</h4>
|
||
<div class="productOffers-metricWrapper">
|
||
<div class="productOffers-metricWrapperButtons">
|
||
<button class="productOffers-metricWrapperButtonsButton" data-score="1" data-trx-click="user_rating;1-1-1;sooper" data-trx-click-data="score=>1">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_outline_1"></use>
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_filled_1"></use>
|
||
</svg>
|
||
</button>
|
||
<button class="productOffers-metricWrapperButtonsButton" data-score="2" data-trx-click="user_rating;1-1-1;sooper" data-trx-click-data="score=>2">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_outline_2"></use>
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_filled_2"></use>
|
||
</svg>
|
||
</button>
|
||
<button class="productOffers-metricWrapperButtonsButton" data-score="3" data-trx-click="user_rating;1-1-1;sooper" data-trx-click-data="score=>3">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_outline_3"></use>
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_filled_3"></use>
|
||
</svg>
|
||
</button>
|
||
<button class="productOffers-metricWrapperButtonsButton" data-score="4" data-trx-click="user_rating;1-1-1;sooper" data-trx-click-data="score=>4">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_outline_4"></use>
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_filled_4"></use>
|
||
</svg>
|
||
</button>
|
||
<button class="productOffers-metricWrapperButtonsButton" data-score="5" data-trx-click="user_rating;1-1-1;sooper" data-trx-click-data="score=>5">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_outline_5"></use>
|
||
<use href="/cdn/storage/offerpage/assets/offerpage/images/idealo-icons.7b411624cc016b71add610e57db8b8a1.svg#user_feedback_filled_5"></use>
|
||
</svg>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="productOffers-metricComment">
|
||
<h4 class="productOffers-metricHeadline">Wie können wir den Preisvergleich für dich verbessern (optional)?</h4>
|
||
<div class="productOffers-metricCommentWrapper">
|
||
<textarea id="metric-comment" class="productOffers-metricCommentInput i-form-element-field" maxlength="300"></textarea>
|
||
<div class="productOffers-metricCommentButtonWrapper">
|
||
<button class="i-button i-button--ghost productOffers-metricCommentButtonSkip">Überspringen</button>
|
||
<button class="i-button productOffers-metricCommentButtonSend" data-trx-click="user_rating_comment;1-1-1;sooper">Absenden</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<div class="short-offerlist-product-slider column">
|
||
<span class="ui-component-include"> <div class="tw-scoped v2"> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style><script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script><script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script><astro-island uid="1zrou8" component-url="https://cdn.idealo.com/storage/offerpage/assets/opr/_astro/SponsoredItemsSlider.DNayVcF9.js" component-export="SponsoredItemsSlider" renderer-url="https://cdn.idealo.com/storage/offerpage/assets/opr/_astro/client.BIvjCCMb.js" props="{"sponsoredItemsSliderData":[0,{"shouldBeRendered":[0,true],"sessionId":[0,"1779717849518_b5bd008b-2169-4a60-cd91-01c861dbca5b"],"trackingId":[0,null],"eaUuid":[0,null],"offerpageViewId":[0,"4b27f317-587d-4fdf-975d-9257a4130f79"],"categoryId":[0,"18874"],"adpEventTrackId":[0,null],"previewParams":[0,null],"manufacturerShopId":[0,null],"mobileDevice":[0,false],"componentId":[0,"SPONSORED_ITEMS_SLIDER"]}],"dlApiUrl":[0,"https://das.idealo.com/3572062/bid?data=%7B%22id%22%3A%22cccdd391f9998%22%2C%22imp%22%3A%5B%7B%22id%22%3A%22imp-slider-0%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%220%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-1%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-2%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-3%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-4%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-5%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%225%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-6%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%226%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-7%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%227%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-8%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%228%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-9%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%229%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-10%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%2210%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-11%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%2211%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-12%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%2212%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-13%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%2213%22%7D%7D%2C%7B%22id%22%3A%22imp-slider-14%22%2C%22tagid%22%3A%22product-tile-slider2%22%2C%22secure%22%3A1%2C%22native%22%3A%7B%22request%22%3A%22%7B%7D%22%7D%2C%22ext%22%3A%7B%22no_redirect%22%3Atrue%2C%22offers_limit%22%3A3%2C%22pos%22%3A%2214%22%7D%7D%5D%2C%22at%22%3A1%2C%22site%22%3A%7B%22id%22%3A%22IDEALO_DE%22%2C%22domain%22%3A%22idealo.de%22%2C%22page%22%3A%22https%3A%2F%2Fwww.idealo.de%2Fpreisvergleich%2FOffersOfProduct%2F202740303.html%22%2C%22publisher%22%3A%7B%22domain%22%3A%22www.idealo.de%22%7D%2C%22ext%22%3A%7B%22area%22%3A%22OOP%22%7D%7D%2C%22user%22%3A%7B%22eids%22%3A%5B%7B%22source%22%3A%22idealo.de%22%2C%22inserter%22%3A%22idealo.de%22%2C%22uids%22%3A%5B%7B%22id%22%3A%221779717849518_b5bd008b-2169-4a60-cd91-01c861dbca5b%22%2C%22atype%22%3A500%2C%22ext%22%3A%7B%22id_type%22%3A%22session%22%2C%22consent_required%22%3Afalse%7D%7D%2C%7B%22id%22%3Anull%2C%22atype%22%3A1%2C%22ext%22%3A%7B%22id_type%22%3A%22tracking%22%2C%22consent_required%22%3Atrue%7D%7D%5D%7D%5D%2C%22ext%22%3A%7B%22npa%22%3Atrue%2C%22ids%22%3A%7B%22sid%22%3A%221779717849518_b5bd008b-2169-4a60-cd91-01c861dbca5b%22%2C%22lu%22%3Anull%7D%7D%7D%2C%22ext%22%3A%7B%22network%22%3A%223572062%22%2C%22keyvalues%22%3A%7B%22manufacturer_id%22%3A%22%22%2C%22main_category_id%22%3A18874%2C%22page_product_id%22%3A%22202740303%22%2C%22page_product_name%22%3A%22%22%2C%22IP%22%3A%224b27f317-587d-4fdf-975d-9257a4130f79%22%2C%22IV%22%3A%224b27f317-587d-4fdf-975d-9257a4130f79%22%7D%2C%22is_non_prebid_request%22%3Atrue%2C%22src%22%3A%22s2s%22%2C%22categoryids%22%3A%5B18874%5D%7D%2C%22regs%22%3A%7B%22gdpr%22%3A1%2C%22ext%22%3A%7B%22dsa%22%3A1%7D%7D%2C%22tmax%22%3A1000%7D"],"locale":[0,"de-DE"],"isPreviewMode":[0,false]}" ssr="" client="only" opts="{"name":"SponsoredItemsSlider","value":"react"}"></astro-island> </div> </span></div>
|
||
<div id="alternative-products" data-sp-tracking="view" data-sp-tracking-meta="{"event":"offerlist_alternative_present", "version":"1-1-0", "owner":"de.idealo.koopa"}" data-sp-tracking-additional-event-data="{"product_ids_displayed":["209721491","208672820","207875933","209891847"]}">
|
||
<h2 class="alternative-product-spacer">Das könnte dir auch gefallen</h2>
|
||
<ul>
|
||
<li><a href="/preisvergleich/OffersOfProduct/209721491_-elektrischer-rollstuhl-faltbar-lesbjfdm.html" data-sp-tracking="click" data-sp-tracking-meta="{"event":"offerlist_alternative_click", "version":"1-1-0", "owner":"de.idealo.koopa"}" data-sp-tracking-additional-event-data="{"product_id_clicked": "209721491"}">
|
||
<div class="alternative-product-image">
|
||
<img src="https://cdn.idealo.com/images/product/209721491/de_DE/0/top.jpg"/>
|
||
</div>
|
||
<div>
|
||
<span class="alternative-product-title">LESBJFDM Elektrischer Rollstuhl faltbar</span>
|
||
<span class="alternative-product-price-prefix">ab</span>
|
||
<span class="alternative-product-price">1.333,<span class="priceSup">57</span> €</span>
|
||
</div>
|
||
</a></li>
|
||
<li><a href="/preisvergleich/OffersOfProduct/208672820_-hzwjd-elektrischer-treppenlift-rollstuhl-fuer-aeltere-menschen-zusammenklappbarer-leichter-treppenrollstuhl-zuladung-165-kg.html" data-sp-tracking="click" data-sp-tracking-meta="{"event":"offerlist_alternative_click", "version":"1-1-0", "owner":"de.idealo.koopa"}" data-sp-tracking-additional-event-data="{"product_id_clicked": "208672820"}">
|
||
<div class="alternative-product-image">
|
||
<img src="https://cdn.idealo.com/images/product/208672820/de_DE/0/top.jpg"/>
|
||
</div>
|
||
<div>
|
||
<span class="alternative-product-title">HZWJD Elektrischer Treppenlift-Rollstuhl Für Ältere Menschen Zusammenklappbarer Leichter Treppenrollstuhl Zuladung 165 Kg</span>
|
||
<span class="alternative-product-price-prefix">ab</span>
|
||
<span class="alternative-product-price">1.199,<span class="priceSup">99</span> €</span>
|
||
</div>
|
||
</a></li>
|
||
<li><a href="/preisvergleich/OffersOfProduct/207875933_-locwanot-30-5-cm-ultraleichte-elektrorollstuehle-fuer-erwachsene-elektrorollstuhl-zusammenklappbar-leicht-mit-verstellbarem-handlauf-und-fussstuetze-40-cm-breiter-sitz-reiserollstuhl-fuer-erwachsene.html" data-sp-tracking="click" data-sp-tracking-meta="{"event":"offerlist_alternative_click", "version":"1-1-0", "owner":"de.idealo.koopa"}" data-sp-tracking-additional-event-data="{"product_id_clicked": "207875933"}">
|
||
<div class="alternative-product-image">
|
||
<img src="https://cdn.idealo.com/images/product/207875933/de_DE/0/top.jpg"/>
|
||
</div>
|
||
<div>
|
||
<span class="alternative-product-title">locwanot 30,5 cm Ultraleichte Elektrorollstühle für Erwachsene, Elektrorollstuhl, zusammenklappbar, leicht, mit verstellbarem Handlauf und Fußstütze, 40 cm breiter Sitz, Reiserollstuhl für Erwachsene</span>
|
||
<span class="alternative-product-price-prefix">ab</span>
|
||
<span class="alternative-product-price">430,<span class="priceSup">97</span> €</span>
|
||
</div>
|
||
</a></li>
|
||
<li><a href="/preisvergleich/OffersOfProduct/209891847_-elektrischer-rollstuhl-faltbar-lithium-akku-24v-bis-120-kg-antar.html" data-sp-tracking="click" data-sp-tracking-meta="{"event":"offerlist_alternative_click", "version":"1-1-0", "owner":"de.idealo.koopa"}" data-sp-tracking-additional-event-data="{"product_id_clicked": "209891847"}">
|
||
<div class="alternative-product-image">
|
||
<img src="https://cdn.idealo.com/folder/Product/209891/8/209891847/s1_produktbild_top/antar-elektrischer-rollstuhl-faltbar-lithium-akku-24v-bis-120-kg.jpg"/>
|
||
</div>
|
||
<div>
|
||
<span class="alternative-product-title">Antar Elektrischer Rollstuhl faltbar Lithium Akku 24V bis 120 kg</span>
|
||
<span class="alternative-product-price-prefix">ab</span>
|
||
<span class="alternative-product-price">749,<span class="priceSup">89</span> €</span>
|
||
</div>
|
||
</a></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="productFurtherTags" class="productFurtherTags row">
|
||
<div class="small-12 columns">
|
||
<div class="productFurtherTags-title"><h3>Weitere Stichworte zu dem Produkt Elektrorollstuhl M45 Air rot:</h3></div>
|
||
|
||
<a class="productFurtherTags-tag" href="https://www.idealo.de/preisvergleich/ProductCategory/18874F8222998.html" rel="">
|
||
höhenverstellbar</a>
|
||
<a class="productFurtherTags-tag" href="https://www.idealo.de/preisvergleich/ProductCategory/18874F8225441.html" rel="">
|
||
Sitz</a>
|
||
<a class="productFurtherTags-tag" href="https://www.idealo.de/preisvergleich/ProductCategory/18874F8223146.html" rel="">
|
||
Innenbereich</a>
|
||
<a class="productFurtherTags-tag" href="https://www.idealo.de/preisvergleich/Liste/123514677/elektrorollstuhl-mit-hubfunktion.html" rel="">
|
||
Elektrorollstuhl mit Hubfunktion</a>
|
||
</div>
|
||
</div>
|
||
<div id="travel-deals-wrapper"></div>
|
||
</main>
|
||
|
||
<span class="ui-component-include"> <div class="tw-scoped v2"> <footer id="wf-footer" class="bg-marine-800 text-marine-200 font-sans"><div class="bg-marine-200 text-marine-800 py-5 text-base text-center font-bold"><p>idealo Deals & News per E-Mail<a class="inline-block font-bold text-base mx-5 text-white-100 bg-blue-500 hover:bg-orange-500 min-w-[271px] py-1 px-4 transition-colors duration-250 ease-out rounded-sm" href="https://www.idealo.de/subscriptions?source=ipc_footer" data-trx-click="newsletter_click;1-0-0;sooper" data-trx-exclude-context="true">Anmelden und bis zu 50% sparen</a></p></div><div class="flex flex-col items-center justify-center sm:grid sm:grid-cols-2 sm:items-start p-5 gap-2 sm:gap-x-4 bg-marine-200 text-marine-800"><div class="order-2 sm:order-1 flex items-center justify-center sm:row-span-2 sm:justify-end"><a href="https://www.idealo.de/unternehmen/pressemitteilungen/idealo-traegt-weiterhin-tuev-siegel-als-geprueftes-vergleichsportal-2020"><img src="https://cdn.idealo.com/storage/ids-assets/png/tuev_saarland_202306.png" alt="TÜV Saarland" width="200" height="auto"/></a></div><div class="order-1 sm:order-2 sm:col-start-2 sm:row-start-1 sm:justify-end"><h3 class="text-lg font-bold text-center sm:text-left">zertifizierte Qualität</h3><div class="grid grid-cols-1 sm:grid-cols-[max-content_max-content] gap-x-4 place-items-start sm:justify-start my-2.5"><p class="flex gap-1.5 items-center text-lg font-normal justify-center sm:justify-start"><svg width="16" height="16" viewBox="0 0 24 24" role="presentation" aria-hidden="true" focusable="false"><path d="M8.727 20a2 2 0 0 1-1.414-.586l-5.454-5.455a2 2 0 0 1 2.828-2.828l4.04 4.04L19.313 4.586a2 2 0 0 1 2.828 2.828l-12 12A2 2 0 0 1 8.727 20Z" fill="currentColor" stroke="none"></path></svg><span>Transparenz</span></p><p class="flex gap-1.5 items-center text-lg font-normal justify-center sm:justify-start"><svg width="16" height="16" viewBox="0 0 24 24" role="presentation" aria-hidden="true" focusable="false"><path d="M8.727 20a2 2 0 0 1-1.414-.586l-5.454-5.455a2 2 0 0 1 2.828-2.828l4.04 4.04L19.313 4.586a2 2 0 0 1 2.828 2.828l-12 12A2 2 0 0 1 8.727 20Z" fill="currentColor" stroke="none"></path></svg><span>Datenschutz</span></p><p class="flex gap-1.5 items-center text-lg font-normal justify-center sm:justify-start"><svg width="16" height="16" viewBox="0 0 24 24" role="presentation" aria-hidden="true" focusable="false"><path d="M8.727 20a2 2 0 0 1-1.414-.586l-5.454-5.455a2 2 0 0 1 2.828-2.828l4.04 4.04L19.313 4.586a2 2 0 0 1 2.828 2.828l-12 12A2 2 0 0 1 8.727 20Z" fill="currentColor" stroke="none"></path></svg><span>Aktualität</span></p><p class="flex gap-1.5 items-center text-lg font-normal justify-center sm:justify-start"><svg width="16" height="16" viewBox="0 0 24 24" role="presentation" aria-hidden="true" focusable="false"><path d="M8.727 20a2 2 0 0 1-1.414-.586l-5.454-5.455a2 2 0 0 1 2.828-2.828l4.04 4.04L19.313 4.586a2 2 0 0 1 2.828 2.828l-12 12A2 2 0 0 1 8.727 20Z" fill="currentColor" stroke="none"></path></svg><span>Suchoptionen</span></p></div></div><section class="order-last text-label3 sm:col-start-2 text-center sm:text-left hover:underline"><a href="https://www.idealo.de/unternehmen/pressemitteilungen/idealo-traegt-weiterhin-tuev-siegel-als-geprueftes-vergleichsportal-2020" class="sm:col-start-2">Mehr Infos</a></section></div><div class="flex flex-col text-xs py-5 text-marine-200"><div class="flex flex-col items-center px-[15px]"><div class="flex flex-wrap justify-center list-none"><li class="after:content-['·'] after:mx-1.5"><a href="https://www.idealo.de/legal/datenschutz" class="hover:underline">Datenschutz</a></li><li class="after:content-['·'] after:mx-1.5"><button id="oopr-footer-privacy-btn" type="button" class="hover:underline cursor-pointer">Privatsphäre</button></li><li class="after:content-['·'] after:mx-1.5"><a href="https://www.idealo.de/legal/agb" class="hover:underline">Impressum / AGB</a></li><li><a href="https://www.idealo.de/aktion/ranking" class="hover:underline">Ranking</a></li></div><p class="mt-2 px-[15px] text-center"><a class="hover:underline" href="https://www.idealo.de/legal/hinweis" target="_blank" rel="noreferrer">* Alle Preisangaben in Euro inkl. MwSt, ggf. zzgl. Versand. Zwischenzeitliche Änderung der Preise, Rangfolge, Lieferzeit und -kosten möglich. Lieferzeiten in Tagen (Mo-Fr ohne Feiertage). Zahlungsarten Rechnungskauf und Lastschrift vorbehaltlich einer Prüfung durch den Händler.</a></p></div></div></footer> </div> </span><nav class="categoryNavigation" data-category-navigation="{
|
||
"$i18n" : {
|
||
"back" : "Kategorien",
|
||
"close" : "Alle Kategorien",
|
||
"more" : "mehr"
|
||
}
|
||
}">
|
||
|
||
<div class="categoryNavigation-header clearfix">
|
||
|
||
<span class="categoryNavigation-headerClose icon icon_cancel-thin icon-withText">
|
||
Kategorien</span>
|
||
|
||
<span class="categoryNavigation-headerBack icon icon_arrow-left-thin icon-withText">
|
||
Alle Kategorien</span>
|
||
|
||
<span class="categoryNavigation-headerSearch icon icon_search float-right"></span>
|
||
|
||
</div>
|
||
<div class="categoryNavigation-wrapper row clearfix">
|
||
|
||
<div class="categoryNavigation-main">
|
||
|
||
<ul class="categoryNavigation-list categoryNavigation-list--main">
|
||
<li class="categoryNavigation-listItem categoryNavigation-listItem--active">
|
||
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/3932.html">
|
||
Drogerie & Gesundheit</a>
|
||
|
||
<ul class="categoryNavigation-list categoryNavigation-list--sub categoryNavigation-list--subShow row">
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/9352.html">
|
||
Babynahrung</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/14476.html">
|
||
Sanitätshaus & Klinikbedarf</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/14733.html">
|
||
Baby-Ernährung</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/11613.html">
|
||
Sonnenpflege</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/3972.html">
|
||
Damendüfte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/5414.html">
|
||
Zahnpflegeprodukte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/5472.html">
|
||
Kontaktlinsen</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/8694.html">
|
||
Herrendüfte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/10812.html">
|
||
Make-up</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/10832.html">
|
||
Gesichtspflege</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/10852.html">
|
||
Körperpflegeprodukte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/10872.html">
|
||
Haarpflegeprodukte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/14673.html">
|
||
Pflege-Geschenksets</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/16252.html">
|
||
Unisex-Düfte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/18367.html">
|
||
Liebe & Verhütung</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/18454.html">
|
||
Deodorants</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/ProductCategory/18481.html">
|
||
Duschprodukte & Badeprodukte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/30302.html">
|
||
Haushaltsartikel</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/30333.html">
|
||
Babypflegeprodukte</a>
|
||
</li>
|
||
<li class="categoryNavigation-listItem">
|
||
<a class="categoryNavigation-listItemLink" href="/preisvergleich/SubProductCategory/30350.html">
|
||
Medizin & Nahrungsergänzung</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="categoryNavigation-sub">
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
<script src="//cdn.idealo.com/storage/offerpage/assets/offerpage/vendor-7a70b829bff10bbc7d51.js"></script><script src="//cdn.idealo.com/storage/offerpage/assets/offerpage/idealo-f5f16123012ced3ad834.js"></script><script src="//cdn.idealo.com/storage/offerpage/assets/offerpage/local-offers-map-b4604c412038fb74f31d.js" defer=""></script><script src="//cdn.idealo.com/storage/offerpage/assets/offerpage/oop-aside-last-seen-c01542f5e51f8d0cf3e2.js" async=""></script><script src="https://cdn.idealo.com/storage/wishlist-assets/bundle-heart-module.js" data-wishlist-heart-tracking="offerlist" async=""></script>
|
||
|
||
<span class="ui-component-include"> <script>(function(){const tid = "EA-3572062";
|
||
const isMobile = false;
|
||
const country = "DE";
|
||
|
||
window.dlApi = {
|
||
target: `${isMobile ? 'M_' : ''}IDEALO_${country}/OOP`,
|
||
tid,
|
||
dsainfo: 1,
|
||
cmd: [],
|
||
};
|
||
})();</script><script src="https://das-cdn.idealo.com/3572062/build/dlApi/minit.boot.min.js" async=""></script><script>(function(){const consentGiven = false;
|
||
|
||
if (window.dlApi) {
|
||
// Initialize with current consent status
|
||
window.dlApi.cmd.push(function (_dlApi) {
|
||
_dlApi.consent({ npa: consentGiven ? 0 : 1 });
|
||
});
|
||
}
|
||
|
||
// Listen for consent status changes
|
||
window.addEventListener('ucEvent', (event) => {
|
||
const hasConsent = event.detail?.Idealo === true;
|
||
const hasConsentChanged = consentGiven !== hasConsent // event fires on mount too
|
||
|
||
if (window.dlApi && hasConsentChanged) {
|
||
window.dlApi.cmd.push(function (_dlApi) {
|
||
_dlApi.consent({ npa: hasConsent ? 0 : 1 });
|
||
});
|
||
}
|
||
});
|
||
})();</script> </span><div class="ipc-modal-dialog" id="voucherCodeModal">
|
||
<div class="ipc-modal-content">
|
||
<div class="ipc-modal-body">
|
||
<button class="btn-modal-close" aria-label="Schließen">
|
||
<img src="//cdn.idealo.com/storage/offerpage/assets/offerpage/img/close-d7823204560a71ca58b6.svg" alt="Schließen" width="14" height="14" loading="lazy"/>
|
||
</button>
|
||
|
||
|
||
<div class="content"></div>
|
||
</div>
|
||
</div>
|
||
<div class="ipc-modal-overlay"></div>
|
||
</div>
|
||
<span class="ui-component-include"></span><div id="ZN_eLQJnmgE0lsWGIR"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
|
||
|
||
|
||
</div></div><noscript><img src="https://www.idealo.de/akam/13/pixel_7723bc98?a=dD0yNWU1OGJjOTZkMjczMDA2NzAxY2FkMzM0YzAxN2Q5Nzc1NmMwMjkzJmpzPW9mZg==" style="visibility: hidden; position: absolute; left: -999px; top: -999px;" /></noscript><script type="text/javascript" src="/uNrARH5hlFFv/gIsbvAQMR3/ln/VpYa4b1EkY/UiMuSVE/DAB/-diZRJwZb?v=d65a9947-5a68-c3f4-48d4-9affa084173c" defer></script></body></html> |