diff --git a/public/main.js b/public/main.js
index 0e1ccf476..38e658ca1 100644
--- a/public/main.js
+++ b/public/main.js
@@ -502,7 +502,7 @@ Error: {error}`,values:{name:S.title,error:_.message}}),n("notification.delete.e
Svelte.`,o=Z(),l=P("p"),l.innerHTML='For documentation about how to install and set it up, see https://theyosh.github.io/TerrariumPI.',u=Z(),d=P("p"),d.innerHTML=`For bugs and feature requests please open a Github issue. /
`,c=Z(),h=P("p"),h.innerHTML='And there is a Matrix channel where you can try to ask questions and see if somebody can help you there: https://matrix.to/#/#terrariumpi:theyosh.nl.',f=Z(),m=P("p"),m.innerHTML=`Finally it would be nice when you use this software, to post some pictures of your setup at this Github issue:
'Pictures of running TerrariumPI system #210'`,g=Z(),v=P("p"),v.innerHTML=`API Documentation: ReDoc /
- Swagger`,b=Z(),k=P("p"),k.innerHTML='
\xA9 Copyright 2015 - 2023
TheYOSH',ps(e.src,t="/img/terrariumpi.jpg")||x(e,"src",t),x(e,"class","img-thumbnail float-right"),x(e,"alt","TerariumPI Logo version "+i[1].version)},m(w,y){U(w,e,y),U(w,n,y),U(w,a,y),U(w,r,y),U(w,s,y),U(w,o,y),U(w,l,y),U(w,u,y),U(w,d,y),U(w,c,y),U(w,h,y),U(w,f,y),U(w,m,y),U(w,g,y),U(w,v,y),U(w,b,y),U(w,k,y)},p:$t,d(w){w&&(j(e),j(n),j(a),j(r),j(s),j(o),j(l),j(u),j(d),j(c),j(h),j(f),j(m),j(g),j(v),j(b),j(k))}}}function bre(i){let e,t,n=i[1].version+"",a;return{c(){e=P("i"),t=Te("TerrariumPI v "),a=Te(n),x(e,"class","fas fa-info mr-2")},m(r,s){U(r,e,s),U(r,t,s),U(r,a,s)},p:$t,d(r){r&&(j(e),j(t),j(a))}}}function _re(i){let e,t,n,a,r,s,o;return e=new Rr({props:{$$slots:{default:[gre]},$$scope:{ctx:i}}}),s=new Xa({props:{loading:!1,noPadding:!1,$$slots:{header:[bre],default:[vre]},$$scope:{ctx:i}}}),{c(){ke(e.$$.fragment),t=Z(),n=P("div"),a=P("div"),r=P("div"),ke(s.$$.fragment),x(r,"class","col"),x(a,"class","row"),x(n,"class","container-fluid")},m(l,u){ye(e,l,u),U(l,t,u),U(l,n,u),A(n,a),A(a,r),ye(s,r,null),o=!0},p(l,[u]){const d={};u&5&&(d.$$scope={dirty:u,ctx:l}),e.$set(d);const c={};u&4&&(c.$$scope={dirty:u,ctx:l}),s.$set(c)},i(l){o||(V(e.$$.fragment,l),V(s.$$.fragment,l),o=!0)},o(l){X(e.$$.fragment,l),X(s.$$.fragment,l),o=!1},d(l){l&&(j(t),j(n)),we(e,l),we(s)}}}function yre(i,e,t){let n;dt(i,Fi,r=>t(0,n=r));let a=Er();return Wi(()=>{Fr(n("about.title",{default:"About"}))}),da(()=>{ur.set(!1)}),[n,a]}class wre extends zt{constructor(e){super(),Nt(this,e,yre,_re,Ft,{})}}function kre(i){let e,t=i[0]("not-found.title",{default:"Page not found"})+"",n;return{c(){e=Te("404 "),n=Te(t)},m(a,r){U(a,e,r),U(a,n,r)},p(a,r){r&1&&t!==(t=a[0]("not-found.title",{default:"Page not found"})+"")&&Me(n,t)},d(a){a&&(j(e),j(n))}}}function Ere(i){let e,t,n,a,r,s,o,l,u,d,c,h,f,m,g,v,b,k,w,y,T,S,_,D;return e=new Rr({props:{$$slots:{default:[kre]},$$scope:{ctx:i}}}),{c(){ke(e.$$.fragment),t=Z(),n=P("div"),a=P("div"),r=P("div"),s=P("div"),o=P("h2"),o.textContent="404",l=Z(),u=P("div"),d=P("h3"),d.innerHTML=' Oops! Page not found.',c=Z(),h=P("img"),m=Z(),g=P("p"),v=Te("We could not find the page you were looking for at location"),b=P("br"),k=Z(),w=P("strong"),w.textContent=`${document.location.hash.substring(1)}`,y=P("br"),T=Te(`
+ Swagger`,b=Z(),k=P("p"),k.innerHTML='
\xA9 Copyright 2015 - 2024
TheYOSH',ps(e.src,t="/img/terrariumpi.jpg")||x(e,"src",t),x(e,"class","img-thumbnail float-right"),x(e,"alt","TerariumPI Logo version "+i[1].version)},m(w,y){U(w,e,y),U(w,n,y),U(w,a,y),U(w,r,y),U(w,s,y),U(w,o,y),U(w,l,y),U(w,u,y),U(w,d,y),U(w,c,y),U(w,h,y),U(w,f,y),U(w,m,y),U(w,g,y),U(w,v,y),U(w,b,y),U(w,k,y)},p:$t,d(w){w&&(j(e),j(n),j(a),j(r),j(s),j(o),j(l),j(u),j(d),j(c),j(h),j(f),j(m),j(g),j(v),j(b),j(k))}}}function bre(i){let e,t,n=i[1].version+"",a;return{c(){e=P("i"),t=Te("TerrariumPI v "),a=Te(n),x(e,"class","fas fa-info mr-2")},m(r,s){U(r,e,s),U(r,t,s),U(r,a,s)},p:$t,d(r){r&&(j(e),j(t),j(a))}}}function _re(i){let e,t,n,a,r,s,o;return e=new Rr({props:{$$slots:{default:[gre]},$$scope:{ctx:i}}}),s=new Xa({props:{loading:!1,noPadding:!1,$$slots:{header:[bre],default:[vre]},$$scope:{ctx:i}}}),{c(){ke(e.$$.fragment),t=Z(),n=P("div"),a=P("div"),r=P("div"),ke(s.$$.fragment),x(r,"class","col"),x(a,"class","row"),x(n,"class","container-fluid")},m(l,u){ye(e,l,u),U(l,t,u),U(l,n,u),A(n,a),A(a,r),ye(s,r,null),o=!0},p(l,[u]){const d={};u&5&&(d.$$scope={dirty:u,ctx:l}),e.$set(d);const c={};u&4&&(c.$$scope={dirty:u,ctx:l}),s.$set(c)},i(l){o||(V(e.$$.fragment,l),V(s.$$.fragment,l),o=!0)},o(l){X(e.$$.fragment,l),X(s.$$.fragment,l),o=!1},d(l){l&&(j(t),j(n)),we(e,l),we(s)}}}function yre(i,e,t){let n;dt(i,Fi,r=>t(0,n=r));let a=Er();return Wi(()=>{Fr(n("about.title",{default:"About"}))}),da(()=>{ur.set(!1)}),[n,a]}class wre extends zt{constructor(e){super(),Nt(this,e,yre,_re,Ft,{})}}function kre(i){let e,t=i[0]("not-found.title",{default:"Page not found"})+"",n;return{c(){e=Te("404 "),n=Te(t)},m(a,r){U(a,e,r),U(a,n,r)},p(a,r){r&1&&t!==(t=a[0]("not-found.title",{default:"Page not found"})+"")&&Me(n,t)},d(a){a&&(j(e),j(n))}}}function Ere(i){let e,t,n,a,r,s,o,l,u,d,c,h,f,m,g,v,b,k,w,y,T,S,_,D;return e=new Rr({props:{$$slots:{default:[kre]},$$scope:{ctx:i}}}),{c(){ke(e.$$.fragment),t=Z(),n=P("div"),a=P("div"),r=P("div"),s=P("div"),o=P("h2"),o.textContent="404",l=Z(),u=P("div"),d=P("h3"),d.innerHTML=' Oops! Page not found.',c=Z(),h=P("img"),m=Z(),g=P("p"),v=Te("We could not find the page you were looking for at location"),b=P("br"),k=Z(),w=P("strong"),w.textContent=`${document.location.hash.substring(1)}`,y=P("br"),T=Te(`
Meanwhile, you may `),S=P("a"),S.textContent="return to dashboard",_=Te("."),x(o,"class","headline text-warning"),ps(h.src,f="/img/koek_koek.webp")||x(h,"src",f),x(h,"alt","Gecko is lost..."),x(S,"href","/"),x(u,"class","error-content"),x(s,"class","error-page"),x(r,"class","col-12 text-center pt-5"),x(a,"class","row"),x(n,"class","container-fluid")},m(I,M){ye(e,I,M),U(I,t,M),U(I,n,M),A(n,a),A(a,r),A(r,s),A(s,o),A(s,l),A(s,u),A(u,d),A(u,c),A(u,h),A(u,m),A(u,g),A(g,v),A(g,b),A(g,k),A(g,w),A(g,y),A(g,T),A(g,S),A(g,_),D=!0},p(I,[M]){const R={};M&3&&(R.$$scope={dirty:M,ctx:I}),e.$set(R)},i(I){D||(V(e.$$.fragment,I),D=!0)},o(I){X(e.$$.fragment,I),D=!1},d(I){I&&(j(t),j(n)),we(e,I)}}}function Sre(i,e,t){let n;return dt(i,Fi,a=>t(0,n=a)),Wi(()=>{Fr("404 "+n("not-found.title",{default:"Page not found"})),console.log("Location href",document.location)}),da(()=>{ur.set(!1)}),[n]}class Tre extends zt{constructor(e){super(),Nt(this,e,Sre,Ere,Ft,{})}}function xre(i){let e;return{c(){e=Te("Error")},m(t,n){U(t,e,n)},p:$t,i:$t,o:$t,d(t){t&&j(e)}}}let Are=class extends zt{constructor(e){super(),Nt(this,e,null,xre,Ft,{})}};var Lre=(i,e,t)=>new Promise((n,a)=>{var r=l=>{try{o(t.next(l))}catch(u){a(u)}},s=l=>{try{o(t.throw(l))}catch(u){a(u)}},o=l=>l.done?n(l.value):Promise.resolve(l.value).then(r,s);o((t=t.apply(i,e)).next())});const BI=Er(),tf=[{name:"Error",title:"error.title",url:"/error",breadcrumb:["Error"],hide:!0},{name:"Home",title:"home.menu.title",url:"/",breadcrumb:["Route 1"],icon:"fas fa-home",hide:!1,nesting:!0,subroutes:[{name:"Dashboard",title:"dashboard.menu.title",url:"/dashboard/",breadcrumb:["Home"],icon:"fas fa-th-list",hide:!1},{name:"Weather",title:"weather.menu.title",url:"/weather/",breadcrumb:["Home"],icon:"fas fa-cloud-sun",hide:!1},{name:"Calendar",title:"calendar.menu.title",url:"/calendar/",breadcrumb:["Home"],icon:"fas fa-calendar-alt",hide:!1},{name:"allSensors",title:"sensors.all.menu.title",url:"/sensors/all/",breadcrumb:["Home"],icon:"fas fa-tint",hide:BI.show_gauge_overview!==!0}]},{name:"Sensors",title:"sensors.menu.title",url:"/sensors/",breadcrumb:[],icon:"fas fa-tint",hide:!1,nesting:!0,subroutes:[...BI.available_sensor_types.map(i=>({name:`sensors_${i}`,title:`sensors.${i}.menu.title`,url:`/sensors/${i}/`,breadcrumb:["Home","Sensors"],icon:"fas "+Nr(i),hide:!1})),{name:"new_sensor",title:"sensors.menu.new.title",url:"new_sensor",breadcrumb:["Home","Sensors"],icon:"fas fa-plus disabled",hide:!1},{name:"scan_sensors",title:"sensors.menu.scan.title",url:"scan_sensors",breadcrumb:["Home","Sensors"],icon:"fas fa-sync-alt disabled",hide:!1}]},{name:"Relays",title:"relays.menu.title",url:"/relays/",breadcrumb:[],icon:"fas fa-bolt",hide:!1,nesting:!0,subroutes:[{name:"relay_status",title:"relays.menu.status.title",url:"/relays/",breadcrumb:["Home","Sensors"],icon:"fas fa-power-off",hide:!1},{name:"new_relay",title:"relays.menu.new.title",url:"new_relay",breadcrumb:["Home","Sensors"],icon:"fas fa-plus disabled",hide:!1},{name:"scan_relays",title:"relays.menu.scan.title",url:"scan_relays",breadcrumb:["Home","Sensors"],icon:"fas fa-sync-alt disabled",hide:!1}]},{name:"Buttons",title:"buttons.menu.title",url:"/buttons/",breadcrumb:[],icon:"fas fa-thumbtack",hide:!1,nesting:!0,subroutes:[{name:"button_status",title:"buttons.menu.status.title",url:"/buttons/",breadcrumb:["Home","Buttons"],icon:"fas fa-list",hide:!1},{name:"new_button",title:"buttons.menu.new.title",url:"new_button",breadcrumb:["Home","Buttons"],icon:"fas fa-plus disabled",hide:!1}]},{name:"Webcams",title:"webcams.menu.title",url:"/webcams/",breadcrumb:[],icon:"fas fa-video",hide:!1,nesting:!0,subroutes:[{name:"webcam_status",title:"webcams.menu.status.title",url:"/webcams/",breadcrumb:["Home","Webcams"],icon:"fas fa-tv",hide:!1},{name:"new_webcam",title:"webcams.menu.new.title",url:"new_webcam",breadcrumb:["Home","Webcams"],icon:"fas fa-plus disabled",hide:!1}]},{name:"Audio",title:"audio.menu.title",url:"/audio/",breadcrumb:[],icon:"fas fa-music",hide:!1,nesting:!0,subroutes:[{name:"audio_files",title:"audio.menu.files.title",url:"/audio/files/",breadcrumb:["Home","Audio"],icon:"fas fa-file-audio",hide:!1},{name:"playlists",title:"audio.menu.playlists.title",url:"/audio/playlists/",breadcrumb:["Home","Audio"],icon:"fas fa-play",hide:!1},{name:"new_playlist",title:"audio.menu.new_playlist.title",url:"new_playlist",breadcrumb:["Home","Audio"],icon:"fas fa-plus disabled",hide:!1}]},{name:"Enclosures",title:"enclosures.menu.title",url:"/enclosures/",breadcrumb:[],icon:"fas fa-globe",hide:!1,nesting:!0,subroutes:[{name:"enclosures_list",title:"enclosures.menu.list.title",url:"/enclosures/",breadcrumb:["Home","Enclosures"],icon:"fas fa-building",hide:!1},{name:"new_enclosure",title:"enclosures.menu.new_enclosure.title",url:"new_enclosure",breadcrumb:["Home","Enclosures"],icon:"fas fa-plus disabled",hide:!1},{name:"new_area",title:"enclosures.menu.new_area.title",url:"new_area",breadcrumb:["Home","Enclosures"],icon:"fas fa-plus disabled",hide:!1}]},{name:"System",title:"system.menu.title",url:"/system/",breadcrumb:[],icon:"fas fa-cog",hide:!1,nesting:!0,subroutes:[{name:"system_status",title:"system.menu.status.title",url:"/system/status/",breadcrumb:["Home","System"],icon:"fas fa-exclamation-triangle",hide:!1},{name:"system_notifications",title:"system.menu.notifications.title",url:"/system/notifications/",breadcrumb:["Home","System"],icon:"fas fa-bell disabled",hide:!1},{name:"system_settings",title:"system.menu.settings.title",url:"/system/settings/",breadcrumb:["Home","System"],icon:"fas fa-cogs disabled",hide:!1},{name:"system_log",title:"system.menu.log.title",url:"/system/log/",breadcrumb:["Home","System"],icon:"fas fa-file-alt disabled",hide:!1},{name:"system_restart",title:"system.menu.restart.title",url:"system_restart",breadcrumb:["Home","System"],icon:"fas fa-sync-alt disabled",hide:!1},{name:"system_reboot",title:"system.menu.reboot.title",url:"system_reboot",breadcrumb:["Home","System"],icon:"fas fa-sync-alt disabled",hide:!1},{name:"system_shutdown",title:"system.menu.shutdown.title",url:"system_shutdown",breadcrumb:["Home","System"],icon:"fas fa-power-off disabled",hide:!1}]}],Hr=tf.reduce((i,e)=>(i[e.name]=e.url,e.subroutes&&(i=e.subroutes.reduce((t,n)=>(t[n.name]=n.url,t),i)),i),{}),Cre=i=>Lre(void 0,null,function*(){const e=tf.find(t=>t.url===i.route);!e||va(ur)||cb.set(typeof e.title=="function"?yield e.title():e.title)});var Dre={[Hr.Home]:HW,[Hr.Dashboard]:CK,[Hr.Weather]:UZ,[Hr.Calendar]:HX,"/sensors/all/":oL,"/sensors/:type/":oL,[Hr.Relays]:sQ,[Hr.Buttons]:yQ,[Hr.Webcams]:zne,[Hr.audio_files]:qne,[Hr.playlists]:Qne,[Hr.Enclosures]:bae,[Hr.system_status]:xae,[Hr.system_settings]:Xae,[Hr.system_log]:nre,[Hr.system_notifications]:pre,"/about/":wre,[Hr.Error]:Are,"*":Tre};const Ire=i=>({}),HI=i=>({});function jI(i){let e,t;return{c(){e=P("i"),x(e,"class",t="nav-icon "+i[1])},m(n,a){U(n,e,a)},p(n,a){a&2&&t!==(t="nav-icon "+n[1])&&x(e,"class",t)},d(n){n&&j(e)}}}function Mre(i){let e,t,n,a,r,s,o,l,u,d=i[1]&&jI(i);const c=i[3].default,h=Ki(c,i,i[2],null),f=i[3].children,m=Ki(f,i,i[2],HI);return{c(){e=P("li"),t=P("a"),d&&d.c(),n=Z(),a=P("p"),h&&h.c(),r=Z(),s=P("i"),o=Z(),l=P("ul"),m&&m.c(),x(s,"class","right fas fa-angle-left icon"),x(t,"href",i[0]),x(t,"class","nav-link"),x(l,"class","nav nav-treeview margin"),x(e,"class","nav-item")},m(g,v){U(g,e,v),A(e,t),d&&d.m(t,null),A(t,n),A(t,a),h&&h.m(a,null),A(a,r),A(a,s),A(e,o),A(e,l),m&&m.m(l,null),u=!0},p(g,[v]){g[1]?d?d.p(g,v):(d=jI(g),d.c(),d.m(t,n)):d&&(d.d(1),d=null),h&&h.p&&(!u||v&4)&&Xi(h,c,g,g[2],u?Zi(c,g[2],v,null):Qi(g[2]),null),(!u||v&1)&&x(t,"href",g[0]),m&&m.p&&(!u||v&4)&&Xi(m,f,g,g[2],u?Zi(f,g[2],v,Ire):Qi(g[2]),HI)},i(g){u||(V(h,g),V(m,g),u=!0)},o(g){X(h,g),X(m,g),u=!1},d(g){g&&j(e),d&&d.d(),h&&h.d(g),m&&m.d(g)}}}function Pre(i,e,t){let{$$slots:n={},$$scope:a}=e,{href:r="#"}=e,{icon:s}=e;return i.$$set=o=>{"href"in o&&t(0,r=o.href),"icon"in o&&t(1,s=o.icon),"$$scope"in o&&t(2,a=o.$$scope)},[r,s,a,n]}class UI extends zt{constructor(e){super(),Nt(this,e,Pre,Mre,Ft,{href:0,icon:1})}}const Ore=()=>{const i=window.location.hash+(window.location.hash.slice(-1)!=="/"?"/":""),e=jQuery("ul.nav-sidebar"),t=e.find('a[href="'+i+'"]');e.find("ul.nav.nav-treeview").hide(),e.find("*").removeClass("active menu-is-opening menu-open"),t.toggleClass("active",!0).parents("ul").show().parents("li").toggleClass("menu-is-opening menu-open",!0).find("a:first").toggleClass("active",!0)},WI=i=>{const e=document.querySelectorAll("div.sidebar nav.mt-2 ul.nav-sidebar .disabled"+(i?"":"-tmp"));for(let t of e)t.classList.remove("disabled"+(i?"":"-tmp")),t.classList.add("disabled"+(i?"-tmp":""))};function Rre(i){let e,t;return e=new np({props:{$$slots:{default:[Nre]},$$scope:{ctx:i}}}),{c(){ke(e.$$.fragment)},m(n,a){ye(e,n,a),t=!0},p(n,a){const r={};a&66&&(r.$$scope={dirty:a,ctx:n}),e.$set(r)},i(n){t||(V(e.$$.fragment,n),t=!0)},o(n){X(e.$$.fragment,n),t=!1},d(n){we(e,n)}}}function Fre(i){let e,t=i[1]("userpanel.logout.text1",{values:{name:i[2]}})+"",n,a,r,s,o=i[1]("userpanel.logout.text2")+"",l,u,d,c;return{c(){e=P("a"),n=Te(t),a=Z(),r=P("br"),s=Z(),l=Te(o),x(e,"href","/logout/"),x(e,"title",u=i[1]("general.logout.title"))},m(h,f){U(h,e,f),A(e,n),A(e,a),A(e,r),A(e,s),A(e,l),d||(c=Gt(e,"click",Ko(i[5])),d=!0)},p(h,f){f&6&&t!==(t=h[1]("userpanel.logout.text1",{values:{name:h[2]}})+"")&&Me(n,t),f&2&&o!==(o=h[1]("userpanel.logout.text2")+"")&&Me(l,o),f&2&&u!==(u=h[1]("general.logout.title"))&&x(e,"title",u)},i:$t,o:$t,d(h){h&&j(e),d=!1,c()}}}function Nre(i){let e=i[1]("userpanel.login.text1")+"",t,n,a,r,s=i[1]("userpanel.login.text2")+"",o;return{c(){t=Te(e),n=Z(),a=P("br"),r=Z(),o=Te(s)},m(l,u){U(l,t,u),U(l,n,u),U(l,a,u),U(l,r,u),U(l,o,u)},p(l,u){u&2&&e!==(e=l[1]("userpanel.login.text1")+"")&&Me(t,e),u&2&&s!==(s=l[1]("userpanel.login.text2")+"")&&Me(o,s)},d(l){l&&(j(t),j(n),j(a),j(r),j(o))}}}function zre(i){let e,t,n,a,r,s,o,l,u,d,c,h,f,m,g,v,b,k;const w=[Fre,Rre],y=[];function T(S,_){return S[0]?0:1}return v=T(i),b=y[v]=w[v](i),{c(){e=P("a"),t=P("img"),a=Z(),r=P("span"),r.textContent=`${i[3].name}`,s=Z(),o=P("div"),l=P("div"),u=P("img"),c=Z(),h=P("img"),m=Z(),g=P("div"),b.c(),ps(t.src,n="img/AdminLTELogo.png")||x(t,"src",n),x(t,"alt","AdminLTE Logo"),x(t,"class","brand-image img-circle elevation-3"),Ei(t,"opacity",".8"),x(r,"class","brand-text font-weight-light"),x(e,"href","/"),x(e,"class","brand-link"),ps(u.src,d="img/christmas_hat.png")||x(u,"src",d),x(u,"class","christmashat d-none svelte-dvs8z9"),x(u,"title","!! Merry Christmas !!"),x(u,"alt","!! Merry Christmas !!"),ps(h.src,f=Fa+"/"+i[3].profile)||x(h,"src",f),x(h,"class","img-circle elevation-2 img-thumbnail svelte-dvs8z9"),x(h,"alt","Profile"),x(l,"class","image pt-2 pl-1 svelte-dvs8z9"),x(g,"class","info"),x(o,"class","user-panel mt-3 pb-3 mb-3 d-flex svelte-dvs8z9")},m(S,_){U(S,e,_),A(e,t),A(e,a),A(e,r),U(S,s,_),U(S,o,_),A(o,l),A(l,u),A(l,c),A(l,h),A(o,m),A(o,g),y[v].m(g,null),k=!0},p(S,[_]){let D=v;v=T(S),v===D?y[v].p(S,_):(Pt(),X(y[D],1,1,()=>{y[D]=null}),Ot(),b=y[v],b?b.p(S,_):(b=y[v]=w[v](S),b.c()),V(b,1),b.m(g,null))},i(S){k||(V(b),k=!0)},o(S){X(b),k=!1},d(S){S&&(j(e),j(s),j(o)),y[v].d()}}}function $re(i,e,t){let n,a,r;dt(i,Jr,u=>t(0,n=u)),dt(i,Fi,u=>t(1,a=u)),dt(i,_m,u=>t(2,r=u));let s=Er();const{confirmModal:o}=Hn("confirm");return[n,a,r,s,o,()=>o(a("modal.confirm.system.logout"),()=>A4())]}class Bre extends zt{constructor(e){super(),Nt(this,e,$re,zre,Ft,{})}}function Hre(i){let e;return{c(){e=P("p"),x(e,"class","text-center")},m(t,n){U(t,e,n),e.innerHTML=i[1]},p(t,n){n&2&&(e.innerHTML=t[1])},d(t){t&&j(e)}}}function jre(i){let e,t,n,a;return{c(){e=P("i"),n=Z(),a=Te(i[0]),x(e,"class",t="fas "+i[2])},m(r,s){U(r,e,s),U(r,n,s),U(r,a,s)},p(r,s){s&4&&t!==(t="fas "+r[2])&&x(e,"class",t),s&1&&Me(a,r[0])},d(r){r&&(j(e),j(n),j(a))}}}function Ure(i){let e=i[6]("modal.general.close",{default:"Close"})+"",t;return{c(){t=Te(e)},m(n,a){U(n,t,a)},p(n,a){a&64&&e!==(e=n[6]("modal.general.close",{default:"Close"})+"")&&Me(t,e)},d(n){n&&j(t)}}}function Wre(i){let e,t,n,a,r,s,o=i[6]("modal.confirm.submit.title",{default:"Confirm"})+"",l,u,d,c;return t=new Af({props:{$$slots:{default:[Ure]},$$scope:{ctx:i}}}),{c(){e=P("div"),ke(t.$$.fragment),n=Z(),a=P("button"),r=P("span"),s=Z(),l=Te(o),x(r,"class","spinner-border spinner-border-sm"),x(r,"role","status"),x(r,"aria-hidden","true"),_e(r,"d-none",!i[3]),x(a,"type","button"),x(a,"class","btn btn-danger"),a.disabled=i[3],x(e,"class","d-flex justify-content-between w-100")},m(h,f){U(h,e,f),ye(t,e,null),A(e,n),A(e,a),A(a,r),A(a,s),A(a,l),u=!0,d||(c=Gt(a,"click",i[7]),d=!0)},p(h,f){const m={};f&8256&&(m.$$scope={dirty:f,ctx:h}),t.$set(m),(!u||f&8)&&_e(r,"d-none",!h[3]),(!u||f&64)&&o!==(o=h[6]("modal.confirm.submit.title",{default:"Confirm"})+"")&&Me(l,o),(!u||f&8)&&(a.disabled=h[3])},i(h){u||(V(t.$$.fragment,h),u=!0)},o(h){X(t.$$.fragment,h),u=!1},d(h){h&&j(e),we(t),d=!1,c()}}}function Vre(i){let e,t,n,a;function r(l){i[10](l)}function s(l){i[11](l)}let o={$$slots:{actions:[Wre],header:[jre],default:[Hre]},$$scope:{ctx:i}};return i[4]!==void 0&&(o.show=i[4]),i[5]!==void 0&&(o.hide=i[5]),e=new Rc({props:o}),Kt.push(()=>bn(e,"show",r)),Kt.push(()=>bn(e,"hide",s)),{c(){ke(e.$$.fragment)},m(l,u){ye(e,l,u),a=!0},p(l,[u]){const d={};u&8271&&(d.$$scope={dirty:u,ctx:l}),!t&&u&16&&(t=!0,d.show=l[4],vn(()=>t=!1)),!n&&u&32&&(n=!0,d.hide=l[5],vn(()=>n=!1)),e.$set(d)},i(l){a||(V(e.$$.fragment,l),a=!0)},o(l){X(e.$$.fragment,l),a=!1},d(l){we(e,l)}}}function Gre(i,e,t){let n;dt(i,Fi,v=>t(6,n=v));let{confirmTitle:a=n("modal.confirm.title",{default:"Are you sure?"})}=e,{confirmMessage:r=""}=e,{icon:s="fa-exclamation"}=e,o=!1,l,u;const d=Ka(),c=()=>{t(3,o=!0),d("confirm")},h=()=>jt(this,null,function*(){t(3,o=!1),l()}),f=()=>{u(),t(3,o=!1)};function m(v){l=v,t(4,l)}function g(v){u=v,t(5,u)}return i.$$set=v=>{"confirmTitle"in v&&t(0,a=v.confirmTitle),"confirmMessage"in v&&t(1,r=v.confirmMessage),"icon"in v&&t(2,s=v.icon)},[a,r,s,o,l,u,n,c,h,f,m,g]}class qre extends zt{constructor(e){super(),Nt(this,e,Gre,Vre,Ft,{confirmTitle:0,confirmMessage:1,icon:2,show:8,hide:9})}get show(){return this.$$.ctx[8]}get hide(){return this.$$.ctx[9]}}function Yre(i){let e,t,n=i[5]("modal.login.error",{default:"Invalid login"})+"",a,r,s,o,l,u,d,c,h,f;return s=new Mt({props:{type:"text",name:"username",class:"col-8",required:!0,horizontal:!0,label:i[5]("modal.login.form.username.label",{default:"Username"}),help:i[5]("modal.login.form.username.help",{default:"Enter the username"}),invalid:i[5]("modal.login.form.username.invalid",{default:"Username cannot be empty"})}}),l=new Mt({props:{type:"password",name:"password",class:"col-8",required:!0,horizontal:!0,label:i[5]("modal.login.form.password.label",{default:"Password"}),help:i[5]("modal.login.form.password.help",{default:"Enter the password"}),invalid:i[5]("modal.login.form.password.invalid",{default:"Password cannot be empty"})}}),{c(){e=P("form"),t=P("h3"),a=Te(n),r=Z(),ke(s.$$.fragment),o=Z(),ke(l.$$.fragment),u=Z(),d=P("button"),d.innerHTML="",x(t,"class","text-danger text-center mb-3"),_e(t,"d-none",!i[3]),x(d,"type","submit"),Ei(d,"display","none"),x(e,"id","loginForm"),x(e,"class","form-horizontal needs-validation"),_e(e,"was-validated",i[2])},m(m,g){U(m,e,g),A(e,t),A(t,a),A(e,r),ye(s,e,null),A(e,o),ye(l,e,null),A(e,u),A(e,d),i[12](e),c=!0,h||(f=gs(i[7].call(null,e)),h=!0)},p(m,g){(!c||g&32)&&n!==(n=m[5]("modal.login.error",{default:"Invalid login"})+"")&&Me(a,n),(!c||g&8)&&_e(t,"d-none",!m[3]);const v={};g&32&&(v.label=m[5]("modal.login.form.username.label",{default:"Username"})),g&32&&(v.help=m[5]("modal.login.form.username.help",{default:"Enter the username"})),g&32&&(v.invalid=m[5]("modal.login.form.username.invalid",{default:"Username cannot be empty"})),s.$set(v);const b={};g&32&&(b.label=m[5]("modal.login.form.password.label",{default:"Password"})),g&32&&(b.help=m[5]("modal.login.form.password.help",{default:"Enter the password"})),g&32&&(b.invalid=m[5]("modal.login.form.password.invalid",{default:"Password cannot be empty"})),l.$set(b),(!c||g&4)&&_e(e,"was-validated",m[2])},i(m){c||(V(s.$$.fragment,m),V(l.$$.fragment,m),c=!0)},o(m){X(s.$$.fragment,m),X(l.$$.fragment,m),c=!1},d(m){m&&j(e),we(s),we(l),i[12](null),h=!1,f()}}}function Kre(i){let e,t,n=i[5]("modal.login.title",{default:"Login"})+"",a,r,s,o;return s=new Ns({}),{c(){e=P("i"),t=Z(),a=Te(n),r=Z(),ke(s.$$.fragment),x(e,"class","fas fa-key mr-2")},m(l,u){U(l,e,u),U(l,t,u),U(l,a,u),U(l,r,u),ye(s,l,u),o=!0},p(l,u){(!o||u&32)&&n!==(n=l[5]("modal.login.title",{default:"Login"})+"")&&Me(a,n)},i(l){o||(V(s.$$.fragment,l),o=!0)},o(l){X(s.$$.fragment,l),o=!1},d(l){l&&(j(e),j(t),j(a),j(r)),we(s,l)}}}function Zre(i){let e=i[5]("modal.general.close",{default:"Close"})+"",t;return{c(){t=Te(e)},m(n,a){U(n,t,a)},p(n,a){a&32&&e!==(e=n[5]("modal.general.close",{default:"Close"})+"")&&Me(t,e)},d(n){n&&j(t)}}}function Xre(i){let e,t,n,a,r,s,o=i[5]("modal.login.form.submit",{default:"Login"})+"",l,u,d,c;return t=new Af({props:{$$slots:{default:[Zre]},$$scope:{ctx:i}}}),{c(){e=P("div"),ke(t.$$.fragment),n=Z(),a=P("button"),r=P("span"),s=Z(),l=Te(o),x(r,"class","spinner-border spinner-border-sm"),x(r,"role","status"),x(r,"aria-hidden","true"),_e(r,"d-none",!i[6]),x(a,"type","button"),x(a,"class","btn btn-primary"),a.disabled=i[6],x(e,"class","d-flex justify-content-between w-100")},m(h,f){U(h,e,f),ye(t,e,null),A(e,n),A(e,a),A(a,r),A(a,s),A(a,l),u=!0,d||(c=Gt(a,"click",i[9]),d=!0)},p(h,f){const m={};f&262176&&(m.$$scope={dirty:f,ctx:h}),t.$set(m),(!u||f&64)&&_e(r,"d-none",!h[6]),(!u||f&32)&&o!==(o=h[5]("modal.login.form.submit",{default:"Login"})+"")&&Me(l,o),(!u||f&64)&&(a.disabled=h[6])},i(h){u||(V(t.$$.fragment,h),u=!0)},o(h){X(t.$$.fragment,h),u=!1},d(h){h&&j(e),we(t),d=!1,c()}}}function Qre(i){let e,t,n,a;function r(l){i[13](l)}function s(l){i[14](l)}let o={center:!0,$$slots:{actions:[Xre],header:[Kre],default:[Yre]},$$scope:{ctx:i}};return i[0]!==void 0&&(o.show=i[0]),i[1]!==void 0&&(o.hide=i[1]),e=new Rc({props:o}),Kt.push(()=>bn(e,"show",r)),Kt.push(()=>bn(e,"hide",s)),{c(){ke(e.$$.fragment)},m(l,u){ye(e,l,u),a=!0},p(l,[u]){const d={};u&262268&&(d.$$scope={dirty:u,ctx:l}),!t&&u&1&&(t=!0,d.show=l[0],vn(()=>t=!1)),!n&&u&2&&(n=!0,d.hide=l[1],vn(()=>n=!1)),e.$set(d)},i(l){a||(V(e.$$.fragment,l),a=!0)},o(l){X(e.$$.fragment,l),a=!1},d(l){we(e,l)}}}function Jre(i,e,t){let n,a;dt(i,Fi,T=>t(5,n=T));let r,s,o=!1,l=!1,u;const d=(T,S)=>jt(this,null,function*(){t(2,o=!0),t(3,l=!1),S.form.checkValidity()&&((yield x4(T.username,T.password))?(gn(n("notification.login.message.ok",{default:"You are successfully logged in."}),n("notification.login.title",{default:"Login"})),b()):(Ti(n("notification.login.message.error",{derfault:"Sorry, but login is invalid"}),n("notification.login.title",{default:"Login"})),t(3,l=!0)),t(2,o=!1))}),{form:c,isSubmitting:h,createSubmitHandler:f,reset:m}=Fs({onSubmit:d});dt(i,h,T=>t(6,a=T));const g=f({onSubmit:d}),v=()=>{m(),t(2,o=!1),r(),setTimeout(()=>{document.querySelector('form input[name="username"]').focus()},650)},b=()=>{s()};Wi(()=>{u.setAttribute("novalidate","novalidate")});function k(T){Kt[T?"unshift":"push"](()=>{u=T,t(4,u)})}function w(T){r=T,t(0,r)}function y(T){s=T,t(1,s)}return[r,s,o,l,u,n,a,c,h,g,v,b,k,w,y]}class ese extends zt{constructor(e){super(),Nt(this,e,Jre,Qre,Ft,{show:10,hide:11})}get show(){return this.$$.ctx[10]}get hide(){return this.$$.ctx[11]}}function tse(i){var ie;let e,t,n,a,r,s,o,l,u,d,c,h,f,m,g,v,b,k,w,y,T,S,_,D,I,M,R,F,N,B,G,K,ne,ee,Y,Q,ue,oe;return o=new Ai({props:{name:"hardware",value:i[7].hardware,readonly:i[7].id&&i[7].id!=="",required:!0,options:i[4],label:i[8]("buttons.settings.hardware.label",{default:"Hardware"}),placeholder:i[8]("buttons.settings.hardware.placeholder",{default:"Select hardware"}),help:i[8]("buttons.settings.hardware.help",{default:"Select the hardware type for this button."}),invalid:i[8]("buttons.settings.hardware.invalid",{default:"Please select a hardware type."})}}),o.$on("change",i[17]),d=new Mt({props:{type:"text",name:"address",required:!0,label:i[8]("buttons.settings.address.label",{default:"Address"}),placeholder:i[8]("buttons.settings.address.placeholder",{default:"Enter an address"}),help:i[8]("buttons.settings.address.help",{default:"Enter the phisycal GPIO pin number."}),invalid:i[8]("buttons.settings.address.invalid",{default:"The entered address is not valid. Enter a valid number between {min} and {max}.",values:{min:1,max:40}})}}),f=new Mt({props:{type:"text",name:"name",required:!0,label:i[8]("buttons.settings.name.label",{default:"Name"}),placeholder:i[8]("buttons.settings.name.placeholder",{default:"Enter a name"}),help:i[8]("buttons.settings.name.help",{default:"Enter an easy to remember name."}),invalid:i[8]("buttons.settings.name.invalid",{default:"The entered name is not valid. It cannot be empty."})}}),v=new rs({props:{name:"notification",value:i[7].notification,label:i[8]("buttons.settings.notification.label",{default:"Notification"}),help:i[8]("buttons.settings.notification.help",{default:"Toggle to enable notification messages."})}}),w=new Mt({props:{type:"text",name:"value",readonly:!0,label:i[8]("buttons.settings.current.label",{default:"Current"}),placeholder:i[8]("buttons.settings.current.placeholder",{default:"Current value"}),help:i[8]("buttons.settings.current.help",{default:"The current state of the button."})}}),R=new rs({props:{name:"calibration.inverse",value:(ie=i[7].calibration)==null?void 0:ie.inverse,label:i[8]("buttons.settings.calibration.inverse.label",{default:"Inverse value"}),help:i[8]("buttons.settings.calibration.inverse.help",{default:"Toggle to inverse the remote value."})}}),B=new Mt({props:{type:"number",name:"calibration.ldr_capacitor",min:"1",max:"100",required:i[5]==="ldr",disabled:i[5]!=="ldr",label:i[8]("buttons.settings.calibration.ldr_capacitor.label",{default:"Capacitor value in \xB5F"}),placeholder:i[8]("buttons.settings.calibration.ldr_capacitor.placeholder",{default:"Enter the capacitor value in \xB5F"}),help:i[8]("buttons.settings.calibration.ldr_capacitor.help",{default:"Enter the capacitor value in \xB5F as this will influence the light calculation."}),invalid:i[8]("buttons.settings.calibration.ldr_capacitor.invalid",{default:"The entered capacitor value is not valid. Enter a valid number between {min} and {max}.",values:{min:1,max:100}})}}),ne=new Mt({props:{type:"number",name:"calibration.timeout",min:"1",max:"100",disabled:i[5]!=="remote",label:i[8]("buttons.settings.calibration.timeout.label",{default:"Time out in seconds"}),placeholder:i[8]("buttons.settings.calibration.timeout.placeholder",{default:"Enter the time out in seconds"}),help:i[8]("buttons.settings.calibration.timeout.help",{default:"Enter the timeout in seconds between remote checks."}),invalid:i[8]("buttons.settings.calibration.timeout.invalid",{default:"The entered timeout value is not valid. Enter a valid number between {min} and {max}.",values:{min:1,max:100}})}}),{c(){e=P("form"),t=P("input"),a=Z(),r=P("div"),s=P("div"),ke(o.$$.fragment),l=Z(),u=P("div"),ke(d.$$.fragment),c=Z(),h=P("div"),ke(f.$$.fragment),m=Z(),g=P("div"),ke(v.$$.fragment),b=Z(),k=P("div"),ke(w.$$.fragment),y=Z(),T=P("div"),S=P("a"),S.innerHTML='