From 901d0ff455d4e69a1c802b32761075cb4afb3cba Mon Sep 17 00:00:00 2001 From: rern Date: Tue, 17 Jan 2023 20:41:34 +0700 Subject: [PATCH 01/28] Update install.sh --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 668d3c7d4..29114d989 100644 --- a/install.sh +++ b/install.sh @@ -121,7 +121,7 @@ chmod +x $dirsettings/system.sh $dirsettings/system.sh dirpermissions [[ -e $dirsystem/color ]] && $dirbash/cmd.sh color -#installfinish +installfinish #------------------------------------------------------------------------------- # 20221123 From 3624cea309dd525d7e27206e37afd36f6dc80cd8 Mon Sep 17 00:00:00 2001 From: rern Date: Tue, 17 Jan 2023 21:08:36 +0700 Subject: [PATCH 02/28] Update function.js --- srv/http/assets/js/function.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/srv/http/assets/js/function.js b/srv/http/assets/js/function.js index 35df2e630..d3c50837d 100644 --- a/srv/http/assets/js/function.js +++ b/srv/http/assets/js/function.js @@ -1212,7 +1212,7 @@ function renderPlaylist( data ) { // current playlist $( '#pl-search-close' ).click(); $( '#button-pl-back, #pl-savedlist, #pl-index' ).addClass( 'hide' ); $( '#button-pl-playlists' ).toggleClass( 'disabled', C.playlists === 0 ); - if ( ! S.pllength || data == -1 ) { + if ( data == -1 ) { V.playlisthtml = ''; $( '#playback-controls' ).addClass( 'hide' ); $( '#pl-path' ).html( 'PLAYLIST' ); @@ -1579,6 +1579,7 @@ function setPlaylistScroll() { clearIntervalAll(); switchPage( 'playlist' ); if ( V.sortable + || [ 'airplay', 'spotify' ].includes( S.player ) || ( D.audiocd && $( '#pl-list li' ).length < S.song + 1 ) // on eject cd S.song not yet refreshed ) { $( '#page-playlist' ).css( 'visibility', '' ); From a56b4983158779a67bcc5e28ee450c8271f37995 Mon Sep 17 00:00:00 2001 From: rern Date: Tue, 17 Jan 2023 21:31:22 +0700 Subject: [PATCH 03/28] Update networks-data.sh --- srv/http/bash/settings/networks-data.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/srv/http/bash/settings/networks-data.sh b/srv/http/bash/settings/networks-data.sh index 32e84563a..3df6e5401 100644 --- a/srv/http/bash/settings/networks-data.sh +++ b/srv/http/bash/settings/networks-data.sh @@ -83,6 +83,8 @@ if [[ $ipeth ]]; then ipr=$( ip r | grep ^default.*$lan ) static=$( [[ $ipr != *"dhcp src $ipeth "* ]] && echo true ) gateway=$( cut -d' ' -f3 <<< $ipr ) +# dns=$( sed -n '/^nameserver/ {s/.* //;p}' /etc/resolv.conf ) +# subnet=$( ifconfig $lan | awk '/netmask/ {print $4}' ) [[ ! $gateway ]] && gateway=$( ip r | awk '/^default/ {print $3;exit}' ) if [[ $ipeth ]]; then hostname=$( avahi-resolve -a4 $ipeth | awk '{print $NF}' ) From e4705d8edbfeb211aa731043dc09265c966bdf62 Mon Sep 17 00:00:00 2001 From: rern Date: Tue, 17 Jan 2023 22:33:40 +0700 Subject: [PATCH 04/28] u --- srv/http/assets/js/features.js | 53 +++++++++--------------------- srv/http/assets/js/settings.js | 4 ++- srv/http/bash/settings/features.sh | 1 - 3 files changed, 18 insertions(+), 40 deletions(-) diff --git a/srv/http/assets/js/features.js b/srv/http/assets/js/features.js index 4afc946a6..6c6d9cc9c 100644 --- a/srv/http/assets/js/features.js +++ b/srv/http/assets/js/features.js @@ -88,10 +88,7 @@ $( '#setting-snapclient' ).click( function() { } ); } , cancel : cancelSwitch - , ok : () => { - bash( [ 'snapclient', true, infoVal() ] ); - notify( icon, title, S.snapclient ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'snapclient', icon, title, infoVal() ) } ); } ); $( '#setting-upmpdcli' ).click( function() { @@ -104,10 +101,7 @@ $( '#setting-upmpdcli' ).click( function() { , values : [ S.upmpdcliownqueue ] , checkchanged : S.upmpdcli , cancel : cancelSwitch - , ok : () => { - bash( [ 'upmpdcli', true, infoVal() ] ); - notify( icon, title, S.upmpdcli ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'upmpdcli', icon, title, infoVal() ) } ); } ); $( '#setting-camilladsp' ).click( function() { @@ -123,11 +117,7 @@ $( '#setting-camilladsp' ).click( function() { , values : S.camillarefresh , checkchanged : S.camilladsp , cancel : cancelSwitch - , ok : () => { - bash( [ 'camilladsp', true, infoVal() ] ); - notify( icon, title, S.camilladsp ? 'Change ...' : 'Enable ...' ); - S.camilladsp = true; - } + , ok : () => enable( 'camilladsp', icon, title, infoVal() ) } ); } ); $( '#setting-hostapd' ).click( function() { @@ -143,10 +133,7 @@ $( '#setting-hostapd' ).click( function() { , checkblank : 1 , checklength : { 1: [ 8, 'min' ] } , cancel : cancelSwitch - , ok : () => { - bash( [ 'hostapd', true, ...infoVal() ] ); - notify( icon, title, S.hostapd ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'hostapd', icon, title, infoVal() ) } ); } ); $( '#setting-autoplay' ).click( function() { @@ -160,10 +147,7 @@ $( '#setting-autoplay' ).click( function() { , values : val ? S.autoplayconf : [ false, false, true ] , checkchanged : S.autoplay , cancel : cancelSwitch - , ok : () => { - bash( [ 'autoplay', true, ...infoVal() ] ); - notify( icon, title, S.autoplay ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'autoplay', icon, title, infoVal() ) } ); } ); $( '#setting-localbrowser' ).click( function() { @@ -247,10 +231,7 @@ ${ htmlbrightness } } } , cancel : cancelSwitch - , ok : () => { - bash( [ 'localbrowser', true, ...infoVal() ] ); - notify( icon, title, S.localbrowser ? 'Change ...' : 'Enable ...', ); - } + , ok : () => enable( 'localbrowser', icon, title, infoVal() ) } ); } ); $( '#setting-smb' ).click( function() { @@ -264,10 +245,7 @@ $( '#setting-smb' ).click( function() { , values : S.smbconf , checkchanged : S.smb , cancel : cancelSwitch - , ok : () => { - bash( [ 'smb', true, ...infoVal() ] ); - notify( icon, title, S.smb ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'smb', icon, title, infoVal() ) } ); } ); $( '#setting-multiraudio' ).click( function() { @@ -320,11 +298,7 @@ $( '#setting-multiraudio' ).click( function() { } ); } , cancel : cancelSwitch - , ok : () => { - I.inputs = $( '#infoContent input' ); - bash( [ 'multiraudio', true, ...infoVal() ] ); - notify( icon, title, S.multiraudio ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'multiraudio', icon, title, infoVal() ) } ); } ); $( '#login' ).click( function() { @@ -482,15 +456,18 @@ $( '#setting-stoptimer' ).click( function() { } ); } , cancel : cancelSwitch - , ok : () => { - bash( [ 'stoptimer', true, ...infoVal() ] ); - notify( icon, title, S.stoptimer ? 'Change ...' : 'Enable ...' ); - } + , ok : () => enable( 'stoptimer', icon, title, infoVal() ) } ); } ); } ); +function enable( pkg, icon, title, val ) { + var cmd = typeof val === 'object' ? [ pkg, true, ...val ] : [ pkg, true, val ]; + bash( cmd ); + notify( icon, title, S[ pkg ] ? 'Change ...' : 'Enable ...' ); + S[ pkg ] = true; +} function passwordWrong() { bannerHide(); info( { diff --git a/srv/http/assets/js/settings.js b/srv/http/assets/js/settings.js index f000e3121..80023e7ad 100644 --- a/srv/http/assets/js/settings.js +++ b/srv/http/assets/js/settings.js @@ -437,13 +437,15 @@ $( '.switch' ).click( function() { } else { notify( icon, label, 'Disable ...' ); bash( [ V.swid, false ] ); + S[ V.swid ] = false; } } else { notify( icon, label, checked ); bash( [ V.swid, checked ], error => { if ( error ) { - bannerHide(); + S[ V.swid ] = false; $( '#'+ V.swid ).prop( 'checked', false ); + bannerHide(); info( error ); } }, 'json' ); diff --git a/srv/http/bash/settings/features.sh b/srv/http/bash/settings/features.sh index 1fed8dc24..2297bcd70 100644 --- a/srv/http/bash/settings/features.sh +++ b/srv/http/bash/settings/features.sh @@ -6,7 +6,6 @@ readarray -t args <<< $1 pushData() { - pushstream refresh '{"page":"features","'$1'":'$2'}' $dirsettings/player-conf.sh pushSubmenu $1 $2 $dirsettings/features-data.sh pushrefresh From 8eb3c4b5fc5f97485544dce8213b71a47acd6d33 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 09:01:43 +0700 Subject: [PATCH 05/28] u --- srv/http/assets/js/features.js | 53 +++++++++----------- srv/http/assets/js/player.js | 43 +++++----------- srv/http/assets/js/settings.js | 35 +++++++------ srv/http/assets/js/system.js | 65 ++++++++----------------- srv/http/bash/settings/features-data.sh | 1 + 5 files changed, 77 insertions(+), 120 deletions(-) diff --git a/srv/http/assets/js/features.js b/srv/http/assets/js/features.js index 6c6d9cc9c..b2de3f66e 100644 --- a/srv/http/assets/js/features.js +++ b/srv/http/assets/js/features.js @@ -43,7 +43,7 @@ $( '#setting-spotifyd' ).click( function() { $( '#infoX' ).click(); } ); } - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { var values = infoVal(); var id = values[ 0 ]; @@ -87,8 +87,8 @@ $( '#setting-snapclient' ).click( function() { $( this ).val( $( this ).val().replace( /[^0-9]/, '' ) ); } ); } - , cancel : cancelSwitch - , ok : () => enable( 'snapclient', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-upmpdcli' ).click( function() { @@ -100,8 +100,8 @@ $( '#setting-upmpdcli' ).click( function() { , checkbox : [ 'Clear Playlist on start' ] , values : [ S.upmpdcliownqueue ] , checkchanged : S.upmpdcli - , cancel : cancelSwitch - , ok : () => enable( 'upmpdcli', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-camilladsp' ).click( function() { @@ -116,8 +116,8 @@ $( '#setting-camilladsp' ).click( function() { , boxwidth : 100 , values : S.camillarefresh , checkchanged : S.camilladsp - , cancel : cancelSwitch - , ok : () => enable( 'camilladsp', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-hostapd' ).click( function() { @@ -132,8 +132,8 @@ $( '#setting-hostapd' ).click( function() { , checkchanged : S.hostapd , checkblank : 1 , checklength : { 1: [ 8, 'min' ] } - , cancel : cancelSwitch - , ok : () => enable( 'hostapd', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-autoplay' ).click( function() { @@ -146,8 +146,8 @@ $( '#setting-autoplay' ).click( function() { , checkbox : [ 'Bluetooth connected', 'Audio CD inserted', 'Power on / Reboot' ] , values : val ? S.autoplayconf : [ false, false, true ] , checkchanged : S.autoplay - , cancel : cancelSwitch - , ok : () => enable( 'autoplay', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-localbrowser' ).click( function() { @@ -230,8 +230,8 @@ ${ htmlbrightness } } ); } } - , cancel : cancelSwitch - , ok : () => enable( 'localbrowser', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-smb' ).click( function() { @@ -244,8 +244,8 @@ $( '#setting-smb' ).click( function() { , checkbox : [ '/mnt/MPD/SD', '/mnt/MPD/USB' ] , values : S.smbconf , checkchanged : S.smb - , cancel : cancelSwitch - , ok : () => enable( 'smb', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-multiraudio' ).click( function() { @@ -297,8 +297,8 @@ $( '#setting-multiraudio' ).click( function() { $( '.ipremove' ).toggleClass( 'hide', I.inputs.length === 2 ); } ); } - , cancel : cancelSwitch - , ok : () => enable( 'multiraudio', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#login' ).click( function() { @@ -314,7 +314,7 @@ $( '#login' ).click( function() { , passwordlabel : 'Password' , focus : 0 , checkblank : 1 - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { notify( icon, title, 'Disable ...' ); $.post( 'cmd.php', { @@ -338,7 +338,7 @@ $( '#setting-login' ).click( function() { , passwordlabel : ( S.login ? [ 'Existing', 'New' ] : 'Password' ) , focus : 0 , checkblank : 1 - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { var values = infoVal(); notify( icon, title, S.login ? 'Change ...' : 'Enable...' ); @@ -389,7 +389,7 @@ $( '#setting-scrobble' ).click( function() { infoCheckSet(); } ); } - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { bash( [ 'scrobble', true, ...infoVal() ], response => { if ( 'error' in response ) { @@ -426,7 +426,7 @@ $( '#nfsserver' ).click( function() { , message : ( S.nfsserver ? 'Shared directories:' : 'Directories to share:' ) +'

'+ list +'

' + ( S.nfsserver ? 'Disable all shares?' : 'Continue?' ) - , cancel : cancelSwitch + , cancel : switchCancel , okcolor : S.nfsserver ? orange : '' , ok : () => { bash( [ 'nfsserver', ! S.nfsserver ] ); @@ -455,19 +455,13 @@ $( '#setting-stoptimer' ).click( function() { $poweroff.prop( 'disabled', valfalse ); } ); } - , cancel : cancelSwitch - , ok : () => enable( 'stoptimer', icon, title, infoVal() ) + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); } ); -function enable( pkg, icon, title, val ) { - var cmd = typeof val === 'object' ? [ pkg, true, ...val ] : [ pkg, true, val ]; - bash( cmd ); - notify( icon, title, S[ pkg ] ? 'Change ...' : 'Enable ...' ); - S[ pkg ] = true; -} function passwordWrong() { bannerHide(); info( { @@ -479,6 +473,7 @@ function passwordWrong() { } function renderPage() { $( '#dabradio' ).toggleClass( 'disabled', ! S.dabdevice ); + $( '#snapclient' ).parent().prev().toggleClass( 'single', ! S.snapclientactive ); $( '#snapserver' ).toggleClass( 'disabled', S.snapserveractive ); $( '#redirecturi' ).text( S.spotifyredirect ); $( '#hostapd' ).toggleClass( 'disabled', S.wlanconnected ); diff --git a/srv/http/assets/js/player.js b/srv/http/assets/js/player.js index dd55670a4..f2498eb0a 100644 --- a/srv/http/assets/js/player.js +++ b/srv/http/assets/js/player.js @@ -89,7 +89,7 @@ $( '#novolume' ).click( function() { icon : icon , title : title , message : warning - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { notify( icon, title, 'Enable ...' ); bash( [ 'novolume', D.aplayname, D.card, D.hwmixer ] ); @@ -125,11 +125,8 @@ $( '#setting-crossfade' ).click( function() { , values : S.crossfadeconf || 1 , checkchanged : S.crossfade , checkblank : 1 - , cancel : cancelSwitch - , ok : () => { - bash( [ 'crossfade', true, infoVal() ] ); - notify( icon, title, S.crossfade ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-replaygain' ).click( function() { @@ -141,11 +138,8 @@ $( '#setting-replaygain' ).click( function() { , radio : { Auto: 'auto', Album: 'album', Track: 'track' } , values : S.replaygainconf , checkchanged : S.replaygain - , cancel : cancelSwitch - , ok : () => { - bash( [ 'replaygain', true, infoVal() ] ); - notify( icon, title, S.replaygain ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '.filetype' ).click( function() { @@ -175,11 +169,8 @@ $( '#setting-buffer' ).click( function() { , values : S.bufferconf , checkchanged : S.buffer , checkblank : 1 - , cancel : cancelSwitch - , ok : () => { - bash( [ 'buffer', true, infoVal() ] ); - notify( icon, title, S.buffer ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-outputbuffer' ).click( function() { @@ -196,11 +187,8 @@ $( '#setting-outputbuffer' ).click( function() { , values : S.outputbufferconf , checkchanged : S.outputbuffer , checkblank : 1 - , cancel : cancelSwitch - , ok : () => { - bash( [ 'outputbuffer', true, infoVal() ] ); - notify( icon, title, S.outputbuffer ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-soxr' ).click( function() { @@ -235,7 +223,7 @@ $( '#setting-custom' ).click( function() { , content : custominfo.replace( 'N', S.asoundcard ) , values : [ valglobal, valoutput ] , checkchanged : S.custom - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { var values = infoVal(); if ( ! values[ 0 ] && ! values[ 1 ] ) { @@ -335,15 +323,8 @@ function infoSoxr( quality ) { , checkblank : 1 , checkchanged : S.soxr && quality === S.soxrquality , boxwidth : custom ? 85 : 180 - , cancel : cancelSwitch - , ok : () => { - if ( custom ) { - bash( [ 'soxr', true, 'custom', ...infoVal() ] ); - } else { - bash( [ 'soxr', true, ...infoVal() ] ); - } - notify( icon, title, S.soxr ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, custom ? [ 'custom', ...infoVal() ] : infoVal() ) } ); } function infoSoxrCustom() { diff --git a/srv/http/assets/js/settings.js b/srv/http/assets/js/settings.js index 80023e7ad..da2ab70f2 100644 --- a/srv/http/assets/js/settings.js +++ b/srv/http/assets/js/settings.js @@ -56,9 +56,6 @@ function bannerReset() { clearTimeout( I.timeoutbanner ); I.timeoutbanner = setTimeout( bannerHide, delay ); } -function cancelSwitch() { - $( '#'+ V.swid ).prop( 'checked', S[ V.swid ] ); -} function currentStatus( id ) { var $el = $( '#code'+ id ); if ( $el.hasClass( 'hide' ) ) { @@ -133,7 +130,7 @@ function refreshData() { if ( $( '#data' ).hasClass( 'hide' ) || $( '#data .infobtn' ).length ) { $( '#data' ).empty(); $( '#button-data, #data' ).addClass( 'hide' ); - setSwitch(); + switchSet(); renderPage(); } else { $( '#data' ).html( highlightJSON( S ) ) @@ -141,7 +138,23 @@ function refreshData() { } } ); } -function setSwitch() { +function showContent() { + V.ready ? delete V.ready : bannerReset(); + var $select = $( '.container select' ); + if ( $select.length ) selectSet( $select ); + $( '.container' ).removeClass( 'hide' ); + loaderHide(); +} +function switchCancel() { + $( '#'+ V.swid ).prop( 'checked', S[ V.swid ] ); +} +function switchEnable( icon, title, val ) { + var cmd = typeof val === 'object' ? [ V.swid, true, ...val ] : [ V.swid, true, val ]; + bash( cmd ); + notify( icon, title, S[ V.swid ] ? 'Change ...' : 'Enable ...' ); + S[ V.swid ] = true; +} +function switchSet() { if ( page === 'networks' || page === 'relays' ) return $( '.switch' ).each( ( i, el ) => $( el ).prop( 'checked', S[ el.id ] ) ); @@ -156,13 +169,7 @@ function setSwitch() { if ( ! $( el ).hasClass( 'hide' ) ) currentStatus( el.id.slice( 4 ) ); // codeid > id } ); } -function showContent() { - V.ready ? delete V.ready : bannerReset(); - var $select = $( '.container select' ); - if ( $select.length ) selectSet( $select ); - $( '.container' ).removeClass( 'hide' ); - loaderHide(); -} + // pushstreamChannel() in common.js pushstreamChannel( [ 'bluetooth', 'notify', 'player', 'refresh', 'reload', 'volume', 'volumebt', 'wlan' ] ); function pushstreamDisconnect() { @@ -232,7 +239,7 @@ function psRefresh( data ) { if ( data.page !== page ) return $.each( data, ( k, v ) => { S[ k ] = v } ); // need braces - page === 'networks' ? $( '.back' ).click() : setSwitch(); + page === 'networks' ? $( '.back' ).click() : switchSet(); renderPage(); } function psReload( data ) { @@ -374,7 +381,7 @@ $( '.page-icon' ).click( function() { } ); $( '#button-data' ).click( function() { $( '#button-data, #data' ).addClass( 'hide' ); - setSwitch(); + switchSet(); renderPage(); } ).on( 'mousedown touchdown', function() { timer = setTimeout( () => location.reload(), 1000 ); diff --git a/srv/http/assets/js/system.js b/srv/http/assets/js/system.js index eaeb679e4..024435b2c 100644 --- a/srv/http/assets/js/system.js +++ b/srv/http/assets/js/system.js @@ -163,7 +163,7 @@ $( '#setting-hddsleep' ).click( function() { , radio : { '2 minutes': 24, '5 minutes': 60, '10 minutes': 120 } , values : S.hddsleep || 60 , checkchanged : S.hddsleep - , cancel : cancelSwitch + , cancel : switchCancel , ok : () => { var val = infoVal() notify( icon, title, ( val === 128 ? 'Disable ...' : 'Timer: '+ ( val * 5 / 60 ) +'minutes ...' ) ) @@ -190,11 +190,8 @@ $( '#setting-bluetooth' ).click( function() { , checkbox : [ 'Discoverable by senders', 'Sampling 16bit 44.1kHz to receivers' ] , values : S.bluetoothconf , checkchanged : S.bluetooth - , cancel : cancelSwitch - , ok : () => { - notify( icon, title, S.bluetooth ? 'Change ...' : 'Enable ...' ); - bash( [ 'bluetooth', true, ...infoVal() ] ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-wlan' ).click( function() { @@ -216,11 +213,8 @@ $( '#setting-wlan' ).click( function() { , values : S.wlanconf , checkchanged : S.wlan , beforeshow : () => selectText2Html( { '00': '00 (allowed worldwide)' } ) - , cancel : cancelSwitch - , ok : () => { - notify( icon, title, S.wlan ? 'Change ...' : 'Enable ...' ); - bash( [ 'wlan', true, ...infoVal() ] ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); }, 'json' ); } ); @@ -344,11 +338,8 @@ $( '#setting-lcdchar' ).click( function() { } ); } } - , cancel : cancelSwitch - , ok : () => { - bash( [ 'lcdchar', true, ...infoVal() ] ); - notify( icon, title, S.lcdchar ? 'Change ...' : 'Enabled ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-powerbutton' ).click( function() { @@ -402,11 +393,8 @@ $( '#setting-powerbutton' ).click( function() { $( '#infoContent table' ).toggleClass( 'hide', $( this ).prop( 'checked' ) ); } ); } - , cancel : cancelSwitch - , ok : () => { - bash( [ 'powerbutton', true, ...infoVal() ] ); - notify( icon, title, S.powerbutton ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-relays' ).click( function() { @@ -436,11 +424,8 @@ $( '#setting-rotaryencoder' ).click( function() { , values : S.rotaryencoderconf || [ 27, 22 ,23 ,1 ] , checkchanged : S.rotaryencoder , beforeshow : () => $( '#infoContent svg .power' ).remove() - , cancel : cancelSwitch - , ok : () => { - bash( [ 'rotaryencoder', true, ...infoVal() ] ); - notify( icon, title, S.rotaryencoder ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-mpdoled' ).click( function() { @@ -478,13 +463,10 @@ $( '#setting-mpdoled' ).click( function() { $( '.baud' ).toggleClass( 'hide', val < 3 || val > 6 ); } ); } - , cancel : cancelSwitch + , cancel : switchCancel , buttonlabel : ! S.mpdoled ? '' : ico( 'raudio' ) +'Logo' , button : ! S.mpdoled ? '' : () => bash( [ 'mpdoledlogo' ] ) - , ok : () => { - notify( icon, title, S.mpdoled ? 'Change ...' : 'Enable ...' ); - bash( [ 'mpdoled', true, ...infoVal() ] ); - } + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-lcd' ).click( function() { @@ -517,11 +499,8 @@ $( '#setting-lcd' ).click( function() { } } ); } - , cancel : cancelSwitch - , ok : () => { - notify( icon, title, S.lcd ? 'Change ...' : 'Enable ...' ); - bash( [ 'lcd', true, infoVal() ] ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#setting-vuled' ).click( function() { @@ -541,11 +520,8 @@ $( '#setting-vuled' ).click( function() { , values : S.vuledconf || [ 14, 15, 18, 23, 24, 25, 8 ] , checkchanged : S.vuled , boxwidth : 80 - , cancel : cancelSwitch - , ok : () => { - notify( icon, title, 'Change ...' ); - bash( [ 'vuled', true, ...infoVal() ] ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#ledcalc' ).click( function() { @@ -657,11 +633,8 @@ $( '#setting-soundprofile' ).click( function() { , values : S.soundprofileconf , checkchanged : S.soundprofile , checkblank : 1 - , cancel : cancelSwitch - , ok : () => { - bash( [ 'soundprofile', true, ...infoVal() ] ); - notify( icon, title, S.soundprofile ? 'Change ...' : 'Enable ...' ); - } + , cancel : switchCancel + , ok : () => switchEnable( icon, title, infoVal() ) } ); } ); $( '#backup' ).click( function() { diff --git a/srv/http/bash/settings/features-data.sh b/srv/http/bash/settings/features-data.sh index d43f981de..d65727e47 100644 --- a/srv/http/bash/settings/features-data.sh +++ b/srv/http/bash/settings/features-data.sh @@ -50,6 +50,7 @@ data+=' [[ -e /usr/bin/shairport-sync ]] && data+=' , "shairport-sync" : '$( isactive shairport-sync ) [[ -e /usr/bin/snapserver ]] && data+=' +, "snapclientactive" : '$( isactive snapclient )' , "snapserver" : '$( exists $dirmpdconf/snapserver.conf )' , "snapserveractive" : '$( [[ -e $dirshm/clientip ]] || ( [[ -e $dirsystem/snapclientserver ]] && systemctl -q is-active snapclient ) && echo true )' , "snapclient" : '$( exists $dirsystem/snapclient )' From 505dc8a92b322c311b884eb93ed514fc6a798e5b Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 09:08:17 +0700 Subject: [PATCH 06/28] Update settings.js --- srv/http/assets/js/settings.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/srv/http/assets/js/settings.js b/srv/http/assets/js/settings.js index da2ab70f2..65523f1c7 100644 --- a/srv/http/assets/js/settings.js +++ b/srv/http/assets/js/settings.js @@ -148,6 +148,10 @@ function showContent() { function switchCancel() { $( '#'+ V.swid ).prop( 'checked', S[ V.swid ] ); } +function switchDisable() { + S[ V.swid ] = false; + $( '#setting-'+ V.swid ).addClass( 'hide' ); +} function switchEnable( icon, title, val ) { var cmd = typeof val === 'object' ? [ V.swid, true, ...val ] : [ V.swid, true, val ]; bash( cmd ); @@ -444,14 +448,13 @@ $( '.switch' ).click( function() { } else { notify( icon, label, 'Disable ...' ); bash( [ V.swid, false ] ); - S[ V.swid ] = false; + switchDisable(); } } else { notify( icon, label, checked ); bash( [ V.swid, checked ], error => { if ( error ) { - S[ V.swid ] = false; - $( '#'+ V.swid ).prop( 'checked', false ); + switchDisable(); bannerHide(); info( error ); } From 2fdf2a259d84755cb83caf16fbc9fbb3232407ac Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 19:49:15 +0700 Subject: [PATCH 07/28] u --- srv/http/assets/css/common.css | 29 ++++- srv/http/assets/css/settings.css | 1 + srv/http/assets/js/features.js | 156 +++++++++-------------- srv/http/assets/js/main.js | 2 +- srv/http/assets/js/player.js | 79 +++++------- srv/http/assets/js/settings.js | 56 ++++---- srv/http/assets/js/system.js | 163 ++++++++++-------------- srv/http/bash/settings/features-data.sh | 1 - srv/http/bash/settings/networks.sh | 2 +- srv/http/bash/settings/player-data.sh | 4 +- srv/http/bash/settings/system-data.sh | 1 - srv/http/bash/settings/system.sh | 13 +- srv/http/index.php | 2 +- srv/http/settings.php | 27 ++-- srv/http/settings/features.php | 53 +++----- srv/http/settings/networks.php | 4 +- srv/http/settings/relays.php | 2 +- srv/http/settings/system.php | 62 ++++----- 18 files changed, 288 insertions(+), 369 deletions(-) diff --git a/srv/http/assets/css/common.css b/srv/http/assets/css/common.css index 67fa3bf6c..1754512e9 100644 --- a/srv/http/assets/css/common.css +++ b/srv/http/assets/css/common.css @@ -40,7 +40,10 @@ .fa-arrow-right::before { content: '\F603' } .fa-artist::before { content: '\F556' } .fa-audiocd::before { content: '\F538' } +.fa-audio::before { content: '\F516' } +.fa-autoplay::before { content: '\F503' } .fa-backspace::before { content: '\F608' } +.fa-backup::before { content: '\F543' } .fa-bars::before { content: '\F51C' } .fa-bio::before { content: '\F51D' } .fa-bookmark::before { content: '\F550' } @@ -85,10 +88,14 @@ .fa-globe::before { content: '\F575' } .fa-gpiopins::before { content: '\F572' } .fa-guide::before { content: '\F579' } +.fa-hddsleep::before { content: '\F553' } .fa-hdmi::after { content: '\F58B' } .fa-help::before { content: '\F560' } .fa-hide::before { content: '\F575' } -.fa-i2saudio::before { content: '\F571' } +.fa-hostapd::before { content: '\F554' } +.fa-hostname::before { content: '\F590' } +.fa-httpd::before { content: '\F55D' } +.fa-i2smodule::before { content: '\F571' } .fa-info-circle::before { content: '\F561' } .fa-input::before { content: '\F529' } .fa-jigsaw::before { content: '\F50D' } @@ -102,18 +109,23 @@ .fa-library::before { content: '\F506' } .fa-libupdate::before { content: '\F506'; animation: blinkopaque 1.5s linear infinite; } .fa-link::before { content: '\F56B' } +.fa-localbrowser::before { content: '\F584' } .fa-lock::before { content: '\F574' } +.fa-login::before { content: '\F574' } .fa-lyrics::before { content: '\F54B' } +.fa-lyricsembedded::before { content: '\F54B' } .fa-microsd::before { content: '\F543' } .fa-minus::before { content: '\F518' } .fa-minus-circle::before { content: '\F563' } .fa-mpd::before { content: '\F582' } .fa-mpdoled::before { content: '\F57A' } +.fa-multiraudio::before { content: '\F53B' } .fa-music::before { content: '\F54A' } .fa-mute::before { content: '\F517' } .fa-nas::before { content: '\F551' } .fa-networks::before { content: '\F551' } .fa-next::before { content: '\F505' } +.fa-nfsserver::before { content: '\F551' } .fa-off::before { content: '\F520' } .fa-output::before { content: '\F52A' } .fa-pause::before { content: '\F504' } @@ -130,6 +142,7 @@ .fa-plus-circle::before { content: '\F564' } .fa-plus-o::before { content: '\F530' } .fa-power::before { content: '\F520' } +.fa-powerbutton::before { content: '\F520' } .fa-previous::before { content: '\F501' } .fa-radiofrance::before { content: '\F586' } .fa-radioparadise::before { content: '\F593'; position: absolute; color: var( --cgl ); } @@ -137,7 +150,6 @@ .fa-random::before { content: '\F512' } .fa-raudio::before { content: '\F590' } .fa-raudio-nobg::before { content: '\F500' } -.fa-raudiobox::before { content: '\F53B' } .fa-rserver::before { content: '\F53C' } .fa-reboot::before { content: '\F521' } .fa-redo::before { content: '\F524' } @@ -150,42 +162,52 @@ .fa-replace::before { content: '\F531' } .fa-reset::before { content: '\F527' } .fa-restore::before { content: '\F544' } +.fa-rotaryencoder::before { content: '\F516' } .fa-save::before { content: '\F542' } .fa-save-circle::before { content: '\F546' } .fa-save-plus::before { content: '\F545' } .fa-screenoff::before { content: '\F547' } .fa-scale-dn::before { content: '\F591' } .fa-scale-up::before { content: '\F592' } +.fa-scrobble::before { content: '\F585' } .fa-sd::before { content: '\F543' } .fa-search::before { content: '\F56A' } .fa-set0::before { content: '\F515' } .fa-settings::before { content: '\F509' } +.fa-shareddata::before { content: '\F551' } +.fa-shairport-sync::before { content: '\F580' } .fa-shift::before { content: '\F606' } .fa-shuffle::before { content: '\F513' } .fa-single::before { content: '\F514' } .fa-sliders::before { content: '\F50B' } +.fa-smb::before { content: '\F551' } .fa-snapcast::before { content: '\F587' } .fa-snapclient::before { content: '\F587' } +.fa-snapserver::before { content: '\F587' } .fa-song::before { content: '\F54A' } .fa-soundprofile::before { content: '\F576' } .fa-source::before { content: '\F529' } .fa-spotify::before { content: '\F588' } +.fa-spotifyd::before { content: '\F588' } .fa-star::before { content: '\F550' } .fa-status::before { content: '\F50A' } .fa-stop::before { content: '\F502' } .fa-stoptimer::before { content: '\F570' } -.fa-stopwatch::before { content: '\F570' } .fa-system::before { content: '\F590' } .fa-tag::before { content: '\F55B' } .fa-times::before { content: '\F51A' } +.fa-timezone::before { content: '\F575' } .fa-title::before { content: '\F54A' } .fa-track::before { content: '\F54C' } .fa-undo::before { content: '\F523' } .fa-update::before { content: '\F526' } +.fa-upmpdcli::before { content: '\F581' } .fa-upnp::before { content: '\F581' } .fa-usb::before { content: '\F553' } +.fa-usbautoupdate::before { content: '\F536' } .fa-usbdrive::before { content: '\F553' } .fa-volume::before { content: '\F516' } +.fa-vuled::before { content: '\F52B' } .fa-warning::before { content: '\F562' } .fa-webradio::before { content: '\F55D' } .fa-wifi::before { content: '\F597' } @@ -193,6 +215,7 @@ .fa-wifi1::after { content: '\F599'; color: var( --cga ); } .fa-wifi2::before { content: '\F59A'; position: absolute; } .fa-wifi2::after { content: '\F59B'; color: var( --cga ); } +.fa-wlan::before { content: '\F597' } html { height : 100%; diff --git a/srv/http/assets/css/settings.css b/srv/http/assets/css/settings.css index ec97ec45c..7116fb438 100644 --- a/srv/http/assets/css/settings.css +++ b/srv/http/assets/css/settings.css @@ -223,6 +223,7 @@ heading .disabled { #bar-bottom { position: fixed; + left: 0; bottom: 0; width: 100%; height: 40px; diff --git a/srv/http/assets/js/features.js b/srv/http/assets/js/features.js index b2de3f66e..a2255b8b3 100644 --- a/srv/http/assets/js/features.js +++ b/srv/http/assets/js/features.js @@ -4,15 +4,13 @@ $( '#setting-spotifyd' ).click( function() { var active = infoPlayerActive( $( this ) ); if ( active ) return - var icon = 'spotify'; - var title = 'Spotify Client'; if ( ! S.spotifyd && S.spotifytoken ) { bash( [ 'spotifyd', true ] ); - notify( icon, title, 'Enable ...' ); + notify( SW.icon, SW.title, 'Enable ...' ); } else if ( S.spotifytoken ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Reset client keys?' , oklabel : ico( 'minus-circle help' ) +'Reset' , okcolor : red @@ -21,8 +19,8 @@ $( '#setting-spotifyd' ).click( function() { } else { if ( navigator.userAgent.includes( 'Firefox' ) ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : iconwarning +'Authorization cannot run on Firefox.' } ); $( '#spotifyd' ).prop( 'checked', false ); @@ -30,21 +28,21 @@ $( '#setting-spotifyd' ).click( function() { } info( { - icon : icon - , title : title - , textlabel : [ 'ID', 'Secret' ] - , focus : 0 - , footer : 'Keys from private app: '+ ico( 'help help' ) - , boxwidth : 320 - , checklength : { 0: 32, 1: 32 } - , beforeshow : () => { + icon : SW.icon + , title : SW.title + , textlabel : [ 'ID', 'Secret' ] + , focus : 0 + , footer : 'Keys from private app: '+ ico( 'help help' ) + , boxwidth : 320 + , checklength : { 0: 32, 1: 32 } + , beforeshow : () => { $( '#infoContent .help' ).click( function() { $( '.container .help' ).eq( 0 ).click(); $( '#infoX' ).click(); } ); } - , cancel : switchCancel - , ok : () => { + , cancel : switchCancel + , ok : () => { var values = infoVal(); var id = values[ 0 ]; var secret = values[ 1 ]; @@ -70,11 +68,9 @@ $( '.screenshot' ).click( function() { } ); } ); $( '#setting-snapclient' ).click( function() { - var icon = 'snapcast'; - var title = 'SnapClient'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Sync SnapClient with SnapServer:' , textlabel : 'Latency (ms)' , focus : 0 @@ -88,28 +84,24 @@ $( '#setting-snapclient' ).click( function() { } ); } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-upmpdcli' ).click( function() { - var icon = 'upnp'; - var title = 'UPnP'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , checkbox : [ 'Clear Playlist on start' ] , values : [ S.upmpdcliownqueue ] , checkchanged : S.upmpdcli , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-camilladsp' ).click( function() { - var icon = 'camilladsp'; - var title = 'CamillaDSP'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , textlabel : 'VU refresh rate (ms)' , focus : 0 , checkblank : 1 @@ -117,15 +109,13 @@ $( '#setting-camilladsp' ).click( function() { , values : S.camillarefresh , checkchanged : S.camilladsp , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-hostapd' ).click( function() { - var icon = 'accesspoint'; - var title = 'Access Point'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , footer : '(8 characters or more)' , textlabel : [ 'IP', 'Password' ] , values : S.hostapdconf @@ -133,21 +123,19 @@ $( '#setting-hostapd' ).click( function() { , checkblank : 1 , checklength : { 1: [ 8, 'min' ] } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-autoplay' ).click( function() { - var val = S.autoplayconf[ 0 ] || S.autoplayconf[ 1 ] || S.autoplayconf[ 2 ]; - var icon = 'play'; - var title = 'AutoPlay'; + var val = S.autoplayconf[ 0 ] || S.autoplayconf[ 1 ] || S.autoplayconf[ 2 ]; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , checkbox : [ 'Bluetooth connected', 'Audio CD inserted', 'Power on / Reboot' ] , values : val ? S.autoplayconf : [ false, false, true ] , checkchanged : S.autoplay , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-localbrowser' ).click( function() { @@ -188,11 +176,9 @@ ${ htmlbrightness }  Reload${ ico( 'redo' ) } ${ ico( 'screenoff' ) }On/Off `; - var icon = 'chromium'; - var title = 'Browser Display'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : content , boxwidth : 110 , values : [ val.rotate, val.zoom, val.cursor, val.screenoff, val.onwhileplay, val.brightness ] @@ -231,21 +217,19 @@ ${ htmlbrightness } } } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-smb' ).click( function() { - var icon = 'networks'; - var title = 'Samba File Sharing'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Write permission:' , checkbox : [ '/mnt/MPD/SD', '/mnt/MPD/USB' ] , values : S.smbconf , checkchanged : S.smb , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-multiraudio' ).click( function() { @@ -265,11 +249,9 @@ $( '#setting-multiraudio' ).click( function() { } else { S.multiraudioconf = [ "rAudio", location.host ]; } - var icon = 'raudiobox'; - var title = 'Multiple rAudios'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : ''+ content +'
' , values : S.multiraudioconf , checkchanged : S.multiraudio @@ -298,25 +280,23 @@ $( '#setting-multiraudio' ).click( function() { } ); } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#login' ).click( function() { if ( $( this ).prop( 'checked' ) ) { $( '#setting-login' ).click(); } else { - var icon = 'lock'; - var title = 'Password Login'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Disable:' , passwordlabel : 'Password' , focus : 0 , checkblank : 1 , cancel : switchCancel , ok : () => { - notify( icon, title, 'Disable ...' ); + notify( SW.icon, SW.title, 'Disable ...' ); $.post( 'cmd.php', { cmd : 'login' , disable : 1 @@ -329,11 +309,9 @@ $( '#login' ).click( function() { } } ); $( '#setting-login' ).click( function() { - var icon = 'lock'; - var title = 'Password Login'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : ( S.login ? 'Change password:' : 'New setup:' ) , passwordlabel : ( S.login ? [ 'Existing', 'New' ] : 'Password' ) , focus : 0 @@ -341,7 +319,7 @@ $( '#setting-login' ).click( function() { , cancel : switchCancel , ok : () => { var values = infoVal(); - notify( icon, title, S.login ? 'Change ...' : 'Enable...' ); + notify( SW.icon, SW.title, S.login ? 'Change ...' : 'Enable...' ); $.post( 'cmd.php', { cmd : 'login' , password : values[ 0 ] @@ -363,11 +341,9 @@ $( '#setting-scrobble' ).click( function() { User ${ ico( 'minus-circle fa-lg scrobbleuser pointer' ) } Password${ ico( 'eye' ) } `; - var icon = 'lastfm'; - var title = 'Scrobbler'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : content , boxwidth : 170 , values : S.scrobbleconf @@ -394,25 +370,23 @@ $( '#setting-scrobble' ).click( function() { bash( [ 'scrobble', true, ...infoVal() ], response => { if ( 'error' in response ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : response.message } ); $( '#scrobble' ).prop( 'checked', 0 ); } }, 'json' ); - notify( icon, title, S.scrobble ? 'Change ...' : 'Enable ...' ); + notify( SW.icon, SW.title, S.scrobble ? 'Change ...' : 'Enable ...' ); } } ); } ); $( '#nfsserver' ).click( function() { var $this = $( this ); - var icon = 'networks'; - var title = 'Server rAudio'; if ( $this.hasClass( 'disabled' ) ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : $this.prev().html() } ); $this.prop( 'checked', S.nfsserver ); @@ -421,8 +395,8 @@ $( '#nfsserver' ).click( function() { bash( [ 'nfssharelist' ], list => { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : ( S.nfsserver ? 'Shared directories:' : 'Directories to share:' ) +'

'+ list +'

' + ( S.nfsserver ? 'Disable all shares?' : 'Continue?' ) @@ -430,17 +404,15 @@ $( '#nfsserver' ).click( function() { , okcolor : S.nfsserver ? orange : '' , ok : () => { bash( [ 'nfsserver', ! S.nfsserver ] ); - notify( icon, title, S.nfsserver ? 'Disable ...' : 'Enable ...' ); + notify( SW.icon, SW.title, S.nfsserver ? 'Disable ...' : 'Enable ...' ); } } ); } ); } ); $( '#setting-stoptimer' ).click( function() { - var icon = 'stopwatch'; - var title = 'Stop Timer'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , radio : { Disable: 'false', '15 minutes': 15, '30 minutes': 30, '60 minutes': 60 } , checkbox : [ 'Power off on stop' ] , values : S.stoptimerconf || [ false, false ] @@ -455,8 +427,8 @@ $( '#setting-stoptimer' ).click( function() { $poweroff.prop( 'disabled', valfalse ); } ); } - , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , cancel : switchCancel + , ok : switchEnable } ); } ); @@ -465,8 +437,8 @@ $( '#setting-stoptimer' ).click( function() { function passwordWrong() { bannerHide(); info( { - icon : 'lock' - , title : 'Password Login' + icon : SW.icon + , title : SW.title , message : 'Wrong existing password.' } ); $( '#login' ).prop( 'checked', S.login ); @@ -492,9 +464,7 @@ function renderPage() { $( '#divdsp' ).addClass( 'hide' ); } else { $( '#divdsp' ).removeClass( 'hide' ); - $( '#camilladsp' ) - .toggleClass( 'disabled', S.bluetoothsink || S.equalizer ) - .prev().html( ''+ ( S.bluetoothsink ? 'Bluetooth '+ ico( 'bluetooth' ) : 'Equalizer '+ ico( 'equalizer' ) ) +' is currently enabled.' ); + $( '#camilladsp' ).toggleClass( 'disabled', S.equalizer ); $( '#equalizer' ).toggleClass( 'disabled', S.camilladsp ); } if ( ! /code|error/.test( window.location.href ) ) { diff --git a/srv/http/assets/js/main.js b/srv/http/assets/js/main.js index 648ef3476..39d802f39 100644 --- a/srv/http/assets/js/main.js +++ b/srv/http/assets/js/main.js @@ -273,7 +273,7 @@ $( '#settings' ).on( 'click', '.submenu', function() { i++ } info( { - icon : 'raudiobox' + icon : 'multiraudio' , title : 'Switch rAudio' , radio : radio , values : location.host diff --git a/srv/http/assets/js/player.js b/srv/http/assets/js/player.js index f2498eb0a..eab35087c 100644 --- a/srv/http/assets/js/player.js +++ b/srv/http/assets/js/player.js @@ -12,8 +12,8 @@ $( '#setting-btreceiver' ).click( function() { var vol = voldb[ 0 ]; var db = voldb[ 1 ]; info( { - icon : 'volume' - , title : 'Bluetooth Volume' + icon : SW.icon + , title : SW.title , message : S.btaplayname.replace( / - A2DP$/, '' ) , rangevalue : vol , footer : db +' dB' @@ -32,11 +32,11 @@ $( '#setting-btreceiver' ).click( function() { } ); } ); $( '#audiooutput' ).change( function() { - notify( 'mpd', 'Audio Output Device', 'Change ...' ); + notify( 'volume', 'Audio Output Device', 'Change ...' ); bash( [ 'audiooutput', $( this ).val() ] ); } ); $( '#hwmixer' ).change( function() { - notify( 'mpd', 'Hardware Mixer', 'Change ...' ); + notify( 'volume', 'Hardware Mixer', 'Change ...' ); bash( [ 'hwmixer', D.aplayname, $( this ).val() ] ); } ); $( '#setting-hwmixer' ).click( function() { @@ -47,8 +47,8 @@ $( '#setting-hwmixer' ).click( function() { var nodb = typeof db === 'undefined'; var nomixer = D.mixertype === 'none'; info( { - icon : 'volume' - , title : 'Mixer Device Volume' + icon : SW.icon + , title : SW.title , message : D.hwmixer , rangevalue : vol , footer : nodb ? '' : ( nomixer ? '0dB (No Volume)' : db +' dB' ) @@ -82,23 +82,21 @@ $( '#mixertype' ).change( function() { } ); $( '#novolume' ).click( function() { var checked = $( this ).prop( 'checked' ); - var icon = 'volume'; - var title = 'No Volume'; if ( checked ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : warning , cancel : switchCancel , ok : () => { - notify( icon, title, 'Enable ...' ); + notify( SW.icon, SW.title, 'Enable ...' ); bash( [ 'novolume', D.aplayname, D.card, D.hwmixer ] ); } } ); } else { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : `\ No volume will be disabled on:   • Select a Mixer Control @@ -114,11 +112,9 @@ $( '#dop' ).click( function() { bash( [ 'dop', checked, D.aplayname ] ); } ); $( '#setting-crossfade' ).click( function() { - var icon = 'mpd'; - var title = 'Cross-Fading'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , textlabel : 'Seconds' , focus : 0 , boxwidth : 60 @@ -126,20 +122,18 @@ $( '#setting-crossfade' ).click( function() { , checkchanged : S.crossfade , checkblank : 1 , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-replaygain' ).click( function() { - var icon = 'mpd'; - var title = 'ReplayGain'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , radio : { Auto: 'auto', Album: 'album', Track: 'track' } , values : S.replaygainconf , checkchanged : S.replaygain , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '.filetype' ).click( function() { @@ -156,11 +150,9 @@ $( '.filetype' ).click( function() { $( this ).toggleClass( 'fa-chevron-down fa-chevron-up' ); } ); $( '#setting-buffer' ).click( function() { - var icon = 'mpd'; - var title = 'Custom Audio Buffer'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , textlabel : 'audio_buffer_size (kB)' , focus : 0 , footer : '(default: 4096)' @@ -170,15 +162,13 @@ $( '#setting-buffer' ).click( function() { , checkchanged : S.buffer , checkblank : 1 , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-outputbuffer' ).click( function() { - var icon = 'mpd'; - var title = 'Custom Output Buffer'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , textlabel : 'max_output_buffer_size (kB)' , focus : 0 , footer : '(default: 8192)' @@ -188,7 +178,7 @@ $( '#setting-outputbuffer' ).click( function() { , checkchanged : S.outputbuffer , checkblank : 1 , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-soxr' ).click( function() { @@ -215,11 +205,9 @@ $( '#setting-custom' ).click( function() { var val = val.split( '^^' ); var valglobal = val[ 0 ].trim(); // remove trailing var valoutput = val[ 1 ].trim(); - var icon = 'mpd'; - var title = "User's Configurations"; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : custominfo.replace( 'N', S.asoundcard ) , values : [ valglobal, valoutput ] , checkchanged : S.custom @@ -228,7 +216,7 @@ $( '#setting-custom' ).click( function() { var values = infoVal(); if ( ! values[ 0 ] && ! values[ 1 ] ) { bash( [ 'customdisable' ] ); - notify( icon, title, 'Disable ...', 3000 ); + notify( SW.icon, SW.title, 'Disable ...', 3000 ); return } @@ -236,14 +224,14 @@ $( '#setting-custom' ).click( function() { if ( ! mpdstart ) { bannerHide(); info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'MPD failed with the added lines' +'
Restored to previous configurations.' } ); } }, 'json' ); - notify( icon, title, S.custom ? 'Change ...' : 'Enable ...' ); + notify( SW.icon, SW.title, S.custom ? 'Change ...' : 'Enable ...' ); } } ); } ); @@ -269,6 +257,7 @@ var soxr = `\ `; var soxrcustom = `
+
Precision
Country
`; - var icon = 'wifi'; - var title = 'Wi-Fi'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : infowifi , boxwidth : 250 , values : S.wlanconf , checkchanged : S.wlan , beforeshow : () => selectText2Html( { '00': '00 (allowed worldwide)' } ) , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); }, 'json' ); } ); @@ -243,8 +237,8 @@ $( '#i2smodule' ).change( function() { } ); $( '#setting-i2smodule' ).click( function() { info( { - icon : 'i2saudio' - , title : 'Audio - I²S' + icon : SW.icon + , title : SW.title , checkbox : [ 'Disable I²S HAT EEPROM read' ] , values : S.i2seeprom , checkchanged : S.i2seeprom @@ -304,11 +298,9 @@ $( '#setting-lcdchar' ).click( function() { `; // cols charmap inf address chip pin_rs pin_rw pin_e pins_data backlight var i2c = S.lcdcharconf[ 2 ] !== 'gpio'; - var icon = 'lcdchar'; - var title = 'Character LCD'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : infolcdchar , boxwidth : 180 , values : S.lcdcharconf || [ 20, 'A00', 'i2c', 39, 'PCF8574', 15, 18, 16, 21, 22, 23, 24, false ] @@ -339,7 +331,7 @@ $( '#setting-lcdchar' ).click( function() { } } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-powerbutton' ).click( function() { @@ -371,11 +363,9 @@ $( '#setting-powerbutton' ).click( function() {
`; - var icon = 'power'; - var title = 'Power Button'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : gpiosvg + infopowerbutton , boxwidth : 80 , values : S.powerbuttonconf || [ 5, 5, 40, 5, false ] @@ -394,7 +384,7 @@ $( '#setting-powerbutton' ).click( function() { } ); } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-relays' ).click( function() { @@ -414,26 +404,22 @@ $( '#setting-rotaryencoder' ).click( function() { `; - var icon = 'volume'; - var title = 'Rotary Encoder'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : gpiosvg + inforotaryencoder , boxwidth : 90 , values : S.rotaryencoderconf || [ 27, 22 ,23 ,1 ] , checkchanged : S.rotaryencoder , beforeshow : () => $( '#infoContent svg .power' ).remove() , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-mpdoled' ).click( function() { - var icon = 'mpdoled'; - var title = 'Spectrum OLED'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , selectlabel : 'Type' , content : `\ @@ -466,15 +452,13 @@ $( '#setting-mpdoled' ).click( function() { , cancel : switchCancel , buttonlabel : ! S.mpdoled ? '' : ico( 'raudio' ) +'Logo' , button : ! S.mpdoled ? '' : () => bash( [ 'mpdoledlogo' ] ) - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-lcd' ).click( function() { - var icon = 'lcd'; - var title = 'TFT 3.5" LCD'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , selectlabel : 'Type' , select : { 'Generic' : 'tft35a' @@ -489,18 +473,18 @@ $( '#setting-lcd' ).click( function() { , buttonlabel : ! S.lcd ? '' : 'Calibrate' , button : ! S.lcd ? '' : () => { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Calibrate touchscreen?' +'
(Get stylus ready.)' , ok : () => { - notify( icon, 'Calibrate Touchscreen', 'Start ...' ); + notify( SW.icon, 'Calibrate Touchscreen', 'Start ...' ); bash( [ 'lcdcalibrate' ] ); } } ); } , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#setting-vuled' ).click( function() { @@ -510,18 +494,16 @@ $( '#setting-vuled' ).click( function() { for ( i = 1; i < 8; i++ ) { htmlpins += ''; } - var icon = 'led'; - var title = 'VU LED'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : gpiosvg , select : htmlpins , values : S.vuledconf || [ 14, 15, 18, 23, 24, 25, 8 ] , checkchanged : S.vuled , boxwidth : 80 , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#ledcalc' ).click( function() { @@ -576,19 +558,17 @@ $( '#timezone' ).change( function( e ) { bash( [ 'timezone', $( this ).val() ] ); } ); $( '#setting-timezone' ).click( function() { - var icon = 'globe'; - var title = 'Servers'; if ( S.soc === 'BCM2835' || S.soc === 'BCM2836' ) { // rpi 0, 1 info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , textlabel : 'NTP' , boxwidth : 300 , values : S.ntp , checkchanged : 1 , checkblank : 1 , ok : () => { - notify( icon, title, 'Sync ...' ); + notify( SW.icon, SW.title, 'Sync ...' ); bash( [ 'servers', infoVal() ], bannerHide ); } } ); @@ -606,8 +586,8 @@ $( '#setting-timezone' ).click( function() {
'+ i +'/7
Package${ selecthtml }
` info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , content : content , boxwidth : 240 , values : [ S.ntp, list.current ] @@ -615,7 +595,7 @@ $( '#setting-timezone' ).click( function() { , checkblank : [ 0 ] , ok : () => { var values = infoVal(); - if ( values[ 0 ] !== S.ntp ) notify( icon, title, 'Sync ...' ); + if ( values[ 0 ] !== S.ntp ) notify( SW.icon, SW.title, 'Sync ...' ); bash( [ 'servers', ...values ], bannerHide ); } } ); @@ -623,32 +603,28 @@ $( '#setting-timezone' ).click( function() { }, 'json' ); } ); $( '#setting-soundprofile' ).click( function() { - var icon = 'sliders'; - var title = 'Kernel Sound Profile'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , textlabel : [ 'vm.swappiness', 'lan mtu', 'lan txqueuelen' ] , boxwidth : 110 , values : S.soundprofileconf , checkchanged : S.soundprofile , checkblank : 1 , cancel : switchCancel - , ok : () => switchEnable( icon, title, infoVal() ) + , ok : switchEnable } ); } ); $( '#backup' ).click( function() { - var icon = 'sd'; - var title = 'Backup Settings'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Save all data and settings to file?' , ok : () => { - notify( icon, title, 'Process ...' ); + notify( SW.icon, SW.title, 'Process ...' ); bash( [ 'databackup' ], data => { if ( data == 1 ) { - notify( icon, title, 'Download ...' ); + notify( SW.icon, SW.title, 'Download ...' ); fetch( '/data/shm/backup.gz' ) .then( response => response.blob() ) .then( blob => { @@ -666,16 +642,16 @@ $( '#backup' ).click( function() { }, 1000 ); } ).catch( () => { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : iconwarning +'File download failed.' } ); bannerHide(); } ); } else { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Backup failed.' } ); bannerHide(); @@ -686,11 +662,9 @@ $( '#backup' ).click( function() { $( '#backup' ).prop( 'checked', 0 ); } ); $( '#restore' ).click( function() { - var icon = 'restore'; - var title = 'Data and Settings'; info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Restore from:' , radio : { 'Backup file *.gz' : 'restore' @@ -721,9 +695,9 @@ $( '#restore' ).click( function() { , ok : () => { if ( infoVal() === 'reset' ) { bash( [ 'datareset' ] ); - notify( icon, title, 'Reset to default ...' ); + notify( SW.icon, SW.title, 'Reset to default ...' ); } else { - notify( icon, title, 'Restore ...' ); + notify( SW.icon, SW.title, 'Restore ...' ); var formdata = new FormData(); formdata.append( 'cmd', 'datarestore' ); formdata.append( 'file', I.infofile ); @@ -732,14 +706,14 @@ $( '#restore' ).click( function() { .then( result => { // -1 / -2 = errors if ( result == -1 ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : iconwarning +' Upload failed.' } ); } else if ( result == -2 ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : iconwarning +' Restore failed.' } ); } @@ -752,14 +726,12 @@ $( '#restore' ).click( function() { $( '#restore' ).prop( 'checked', 0 ); } ); $( '#shareddata' ).click( function() { - var icon = 'networks'; - var title = 'Shared Data'; var $this = $( this ); if ( $this.hasClass( 'disabled' ) ) { $( '#shareddata' ).prop( 'checked', false ); info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : $this.prev().html() } ); return @@ -767,14 +739,14 @@ $( '#shareddata' ).click( function() { if ( S.shareddata ) { info( { - icon : icon - , title : title + icon : SW.icon + , title : SW.title , message : 'Disable and restore local data?' , cancel : () => $this.prop( 'checked', true ) , okcolor : orange , ok : () => { bash( [ 'shareddatadisconnect', 'disable' ] ); - notify( icon, title, 'Disable ...' ); + notify( SW.icon, SW.title, 'Disable ...' ); } } ); } else { @@ -1038,9 +1010,6 @@ function renderPage() { S.i2senabled = $( '#i2smodule' ).val() !== 'none'; $( '#divi2smodulesw' ).toggleClass( 'hide', S.i2senabled ); $( '#divi2smodule, #setting-i2smodule' ).toggleClass( 'hide', ! S.i2senabled ); - $( '#bluetooth' ) - .toggleClass( 'disabled', S.btconnected || S.camilladsp ) - .prev().html( S.btconnected ? 'Bluetooth '+ ico( 'bluetooth ' )+' is currently connected.' : 'DSP '+ ico( 'camilladsp' ) +' is currently enabled.' ); $( '#divsoundprofile' ).toggleClass( 'hide', ! S.soundprofileconf ); $( '#hostname' ).val( S.hostname ); $( '#avahiurl' ).text( S.hostname +'.local' ); diff --git a/srv/http/bash/settings/features-data.sh b/srv/http/bash/settings/features-data.sh index d65727e47..afccca14b 100644 --- a/srv/http/bash/settings/features-data.sh +++ b/srv/http/bash/settings/features-data.sh @@ -20,7 +20,6 @@ data+=' "page" : "features" , "autoplay" : '$( ls $dirsystem/autoplay* &> /dev/null && echo true )' , "autoplayconf" : [ '$( exists $dirsystem/autoplaybt )', '$( exists $dirsystem/autoplaycd )', '$( exists $dirsystem/autoplay )' ] -, "bluetoothsink" : '$( cut -d' ' -f2 $dirshm/btconnected 2> /dev/null | grep -q -m1 Sink && echo true )' , "camilladsp" : '$( exists $dirsystem/camilladsp )' , "camillarefresh" : '$( grep 'status_update_interval' /srv/http/settings/camillagui/config/gui-config.yml | cut -d' ' -f2 )' , "equalizer" : '$( exists $dirsystem/equalizer )' diff --git a/srv/http/bash/settings/networks.sh b/srv/http/bash/settings/networks.sh index 3da7feafd..f8877a8e0 100644 --- a/srv/http/bash/settings/networks.sh +++ b/srv/http/bash/settings/networks.sh @@ -76,7 +76,7 @@ $( bluealsa-aplay -L | grep -A2 $mac ) $info" echo "$data" ;; -btcontroller ) +bluetooth ) echo "\ # bluetoothctl show $( bluetoothctl show )" diff --git a/srv/http/bash/settings/player-data.sh b/srv/http/bash/settings/player-data.sh index 1c88f7865..3caa96930 100644 --- a/srv/http/bash/settings/player-data.sh +++ b/srv/http/bash/settings/player-data.sh @@ -32,8 +32,8 @@ data=' , "replaygain" : '$( exists $dirmpdconf/replaygain.conf )' , "replaygainconf" : "'$( cut -d'"' -f2 $dirmpdconf/conf/replaygain.conf )'" , "soxr" : '$( exists $dirsystem/soxr )' -, "soxrconf" : ['$( sed -E '/resampler|plugin|}/ d; s/.*quality.*(".*")/\1/; s/.*thread.*"(.*)"/,\1/' $dirmpdconf/conf/soxr.conf )'] -, "soxrcustomconf" : ['$( sed -E '/resampler|plugin|quality|}/ d; s/.*"(.*)"/\1/' $dirmpdconf/conf/soxr-custom.conf | xargs | tr ' ' , )'] +, "soxrconf" : ['$( sed -E '/\{|plugin|}/ d; s/.*quality.*(".*")/\1/; s/.*thread.*"(.*)"/,\1/' $dirmpdconf/conf/soxr.conf )'] +, "soxrcustomconf" : ["custom"'$( sed -E '/\{|plugin|quality|}/ d; s/.*"(.*)"/,\1/' $dirmpdconf/conf/soxr-custom.conf )'] , "soxrquality" : "'$( getContent $dirsystem/soxr )'" , "state" : "'$( grep -m1 ^state= $dirshm/status | cut -d= -f2 | tr -d '"' )'" , "version" : "'$( pacman -Q mpd 2> /dev/null | cut -d' ' -f2 )'"' diff --git a/srv/http/bash/settings/system-data.sh b/srv/http/bash/settings/system-data.sh index 7d8ee2a91..d899cb0c7 100644 --- a/srv/http/bash/settings/system-data.sh +++ b/srv/http/bash/settings/system-data.sh @@ -171,7 +171,6 @@ data+=' "page" : "system" , "audioaplayname" : "'$( getContent $dirsystem/audio-aplayname )'" , "audiooutput" : "'$( getContent $dirsystem/audio-output )'" -, "camilladsp" : '$( exists $dirsystem/camilladsp )' , "display" : { "logout": '$( exists $dirsystem/login )' } , "hddapm" : '$hddapm' , "hddsleep" : '${hddapm/128/false}' diff --git a/srv/http/bash/settings/system.sh b/srv/http/bash/settings/system.sh index 223b4f25f..bc880cb6c 100644 --- a/srv/http/bash/settings/system.sh +++ b/srv/http/bash/settings/system.sh @@ -694,6 +694,12 @@ pkgstatus ) camilladsp ) fileconf=$dircamilladsp/configs/camilladsp.yml ;; + dabradio ) + pkg=rtsp-simple-server + conf="\ +# rtl_test -t +$( script -c "timeout 1 rtl_test -t" | grep -v ^Script )" + ;; hostapd ) conf="\ # cat /etc/hostapd/hostapd.conf @@ -723,16 +729,11 @@ $( < /etc/dnsmasq.conf )" $( awk NF <<< $conf )" skip='configuration file does not exist' ;; - nfs-server ) + nfsserver ) pkg=nfs-utils systemctl -q is-active nfs-server && fileconf=/etc/exports skip='Protocol not supported' ;; - rtsp-simple-server ) - conf="\ -# rtl_test -t -$( script -c "timeout 1 rtl_test -t" | grep -v ^Script )" - ;; smb ) pkg=samba fileconf=/etc/samba/smb.conf diff --git a/srv/http/index.php b/srv/http/index.php index 601865d38..a4a17527e 100644 --- a/srv/http/index.php +++ b/srv/http/index.php @@ -134,7 +134,7 @@ function htmlmenu( $menulist, $mode ) { , [ 'power', '', 'power', 'Power', 'screenoff', 'screenoff' ] , [ 'displaylibrary', 'sub', 'library', 'Library', 'update', 'refresh-library' ] , [ 'displayplayback', 'sub', 'playback', 'Playback', 'displaycolor', 'color' ] - , [ 'displayplaylist', '', 'playlist', 'Playlist', 'multiraudio', 'raudiobox' ] + , [ 'displayplaylist', '', 'playlist', 'Playlist', 'multiraudio', 'multiraudio' ] ]; $htmlsettings = ''; foreach( $settinglist as $l ) { diff --git a/srv/http/settings.php b/srv/http/settings.php index 38e260738..fe266f055 100644 --- a/srv/http/settings.php +++ b/srv/http/settings.php @@ -125,11 +125,16 @@ function htmlHead( $data ) { function htmlSetting( $data ) { if ( isset( $data[ 'exist' ] ) && ! $data[ 'exist' ] ) return; + if ( isset( $data[ 'html' ] ) ) { + echo str_replace( '|', '|', $data[ 'html' ] ); + return; + } + + global $page; // col-l - $label = $data[ 'label' ]; - $icon = $data[ 'icon' ] ?? ''; + $label = ''.$data[ 'label' ].''; $sublabel = $data[ 'sublabel' ] ?? ''; - $status = $data[ 'status' ] ?? ''; + $status = $data[ 'status' ] ?? false; $id = $data[ 'id' ] ?? ''; $input = $data[ 'input' ] ?? ''; $settingicon = $data[ 'settingicon' ] ?? 'gear'; @@ -138,21 +143,15 @@ function htmlSetting( $data ) { $help = $data[ 'help' ] ?? ''; $html = '
' : '">'; - if ( $sublabel ) { - $html .= ''.$label.''.$sublabel; - $html .= ''; - } else { - $html .= $label; - } - $html .= $icon ? i( $icon ) : ''; + $html .= $status ? ' status" data-status="'.$id.'">' : '">'; + $html .= $sublabel ? ''.$label.''.$sublabel.'' : $label; + $html .= $page === 'features' || $page === 'system' ? i( $id ) : ''; // icon $html .= '
'; // col-r $html .= '
'; if ( ! $input ) { $html .= $disabled ? ''.$disabled.'' : ''; - $html .= '
'; + $html .= '
'; $html .= '
'; } else { $html .= $input; @@ -161,7 +160,7 @@ function htmlSetting( $data ) { $html .= $help ? ''.$help.'' : ''; $html .= '
'; - $html .= $status ? '
' : '';
+	$html       .= $status ? '
' : '';
 	echo str_replace( '|', '|', $html );
 }
 function htmlSection( $head, $body, $id = '' ) {
diff --git a/srv/http/settings/features.php b/srv/http/settings/features.php
index b0c6fc40a..148fa58e8 100644
--- a/srv/http/settings/features.php
+++ b/srv/http/settings/features.php
@@ -9,20 +9,18 @@
 	[
 		  'label'    => 'AirPlay'
 		, 'sublabel' => 'shairport-sync'
-		, 'icon'     => 'airplay'
 		, 'id'       => 'shairport-sync'
 		, 'setting'  => false
-		, 'status'   => 'shairport-sync'
+		, 'status'   => true
 		, 'help'     => 'Shairport-sync - AirPlay rendering device.'
 		, 'exist'    => file_exists( '/usr/bin/shairport-sync' )
 	]
 	, [
 		  'label'    => 'DAB Radio'
 		, 'sublabel' => 'rtsp-server'
-		, 'icon'     => 'dabradio'
 		, 'id'       => 'dabradio'
 		, 'setting'  => false
-		, 'status'   => 'rtsp-simple-server'
+		, 'status'   => true
 		, 'disabled' => 'No DAB devices found.'
 		, 'help'     => 'Digital Audio Broadcasting radio for USB RTL-SDR devices.'
 		, 'exist'    => file_exists( '/usr/bin/rtsp-simple-server' )
@@ -30,9 +28,8 @@
 	, [
 		  'label'    => 'SnapClient'
 		, 'sublabel' => 'snapclient'
-		, 'icon'     => 'snapcast'
 		, 'id'       => 'snapclient'
-		, 'status'   => 'snapclient'
+		, 'status'   => true
 		, 'help'     => <<< EOF
 Snapcast - Multiroom client-server audio player.
  · SSH passwords must be default.
@@ -46,9 +43,8 @@
 	, [
 		  'label'    => 'Spotify'
 		, 'sublabel' => 'spotifyd'
-		, 'icon'     => 'spotify'
 		, 'id'       => 'spotifyd'
-		, 'status'   => 'spotifyd'
+		, 'status'   => true
 		, 'help'     => <<< EOF
 Spotifyd - Spotify Connect device.
  · Require Premium account. (No Spotify password saved on rAudio.)
@@ -72,9 +68,8 @@
 	, [
 		  'label'    => 'UPnP'
 		, 'sublabel' => 'upmpdcli'
-		, 'icon'     => 'upnp'
 		, 'id'       => 'upmpdcli'
-		, 'status'   => 'upmpdcli'
+		, 'status'   => true
 		, 'help'     => 'upmpdcli - UPnP / DLNA rendering device.'
 		, 'exist'    => file_exists( '/usr/bin/upmpdcli' )
 	]
@@ -85,19 +80,17 @@
 $head = [ 'title' => 'Streamers' ]; //////////////////////////////////
 $body = [
 	[
-	  'label'    => 'For browsers'
-	, 'sublabel' => 'MPD httpd'
-	, 'icon'     => 'webradio'
-	, 'id'       => 'httpd'
-	, 'setting'  => false
-	, 'help'     => <<< EOF
+		  'label'    => 'For browsers'
+		, 'sublabel' => 'MPD httpd'
+		, 'id'       => 'httpd'
+		, 'setting'  => false
+		, 'help'     => <<< EOF
 HTTP streaming - Asynchronous streaming for browsers via http://$ip:8000 (Latency - several seconds)
 EOF
 	]
 	, [
 		  'label'    => 'SnapServer'
 		, 'sublabel' => 'MPD snapcast'
-		, 'icon'     => 'snapcast'
 		, 'id'       => 'snapserver'
 		, 'setting'  => false
 		, 'disabled' => nameIcon( 'SnapClient', 'snapcast' ).' is currently connected.'
@@ -117,10 +110,9 @@
 	[
 		  'label'    => 'DSP'
 		, 'sublabel' => 'camilladsp'
-		, 'icon'     => 'camilladsp'
 		, 'id'       => 'camilladsp'
-		, 'status'   => 'camilladsp'
-		, 'disabled' => 'js'
+		, 'status'   => true
+		, 'disabled' => nameIcon( 'Equalizer', 'alsaequal' ).' is currently enabled.'
 		, 'help'     => <<< EOF
 CamillaDSP - A flexible cross-platform IIR and FIR engine for crossovers, room correction etc.
 Settings: {$Fmenu( 'features', 'Features', 'camilladsp' )}
@@ -130,7 +122,6 @@
 	, [
 		  'label'    => 'Equalizer'
 		, 'sublabel' => 'alsaequal'
-		, 'icon'     => 'equalizer'
 		, 'id'       => 'equalizer'
 		, 'setting'  => false
 		, 'disabled' => nameIcon( 'DSP', 'camilladsp' ).' is currently enabled.'
@@ -152,9 +143,8 @@
 	[
 		  'label'    => 'Access Point'
 		, 'sublabel' => 'hostapd'
-		, 'icon'     => 'accesspoint'
 		, 'id'       => 'hostapd'
-		, 'status'   => 'hostapd'
+		, 'status'   => true
 		, 'disabled' => nameIcon( 'Wi-Fi', 'wifi' ).' is currently connected.'
 		, 'help'     => <<< EOF
 hostapd - Connect with rAudio hotspot directly when no routers available.
@@ -165,7 +155,6 @@
 	]
 	, [
 		  'label'   => 'AutoPlay'
-		, 'icon'    => 'play'
 		, 'id'      => 'autoplay'
 		, 'help'    => <<< EOF
 Start playing automatically on:
@@ -177,9 +166,8 @@
 	, [
 		  'label'    => 'Browser on RPi'
 		, 'sublabel' => 'chromium'
-		, 'icon'     => 'chromium'
 		, 'id'       => 'localbrowser'
-		, 'status'   => 'localbrowser'
+		, 'status'   => true
 		, 'help'     => <<< EOF
 Chromium - Browser on RPi connected screen.
  · TFT 3.5" LCD: Rotate needs reboot.
@@ -193,9 +181,8 @@
 	, [
 		  'label'    => 'File Sharing'
 		, 'sublabel' => 'smb'
-		, 'icon'     => 'networks'
 		, 'id'       => 'smb'
-		, 'status'   => 'smb'
+		, 'status'   => true
 		, 'disabled' => nameIcon( 'Server rAudio', 'rserver' ).' is currently active.'
 		, 'help'     => <<< EOF
 Samba - Share files on network for Windows clients.
@@ -210,7 +197,6 @@
 	, [
 		  'label'    => 'Lyrics in File'
 		, 'sublabel' => 'embedded ID3'
-		, 'icon'     => 'lyrics'
 		, 'id'       => 'lyricsembedded'
 		, 'setting'  => false
 		, 'help'     => <<< EOF
@@ -222,11 +208,10 @@
 	]
 	, [
 		  'label'   => 'Multiple rAudios'
-		, 'icon'    => 'raudiobox'
 		, 'id'      => 'multiraudio'
 		, 'help'    => <<< EOF
 Switch between multiple rAudio devices.
-Switch: {$Fmenu( 'playlist', 'Playlist', 'raudiobox' )}
+Switch: {$Fmenu( 'playlist', 'Playlist', 'multiraudio' )}
 
 (SSH password must be default.)
 EOF
@@ -234,7 +219,6 @@
 	, [
 		  'label'    => 'Password Login'
 		, 'sublabel' => 'password_hash'
-		, 'icon'     => 'lock'
 		, 'id'       => 'login'
 		, 'setting'  => 'custom'
 		, 'help'     => <<< EOF
@@ -245,7 +229,6 @@
 	, [
 		  'label'    => 'Scrobbler'
 		, 'sublabel' => 'Last.fm'
-		, 'icon'     => 'lastfm'
 		, 'id'       => 'scrobble'
 		, 'help'     => <<< EOF
  · Send artist, title and album of played tracks to Last.fm to save in user's database.
@@ -259,11 +242,10 @@
 	, [
 		  'label'       => 'Server rAudio'
 		, 'sublabel'    => 'nfs-server'
-		, 'icon'        => 'rserver'
 		, 'id'          => 'nfsserver'
 		, 'setting'     => 'custom'
 		, 'settingicon' => false
-		, 'status'      => 'nfs-server'
+		, 'status'      => true
 		, 'disabled'    => 'js'
 		, 'help'        => <<< EOF
 NFS - Network File System - Server for files and | Shared Data {$Fi( 'networks' )} |
@@ -289,7 +271,6 @@
 	]
 	, [
 		  'label'    => 'Stop Timer'
-		, 'icon'     => 'stopwatch'
 		, 'id'       => 'stoptimer'
 		, 'disabled' => 'Player is currently not playing.'
 		, 'help'     => <<< EOF
diff --git a/srv/http/settings/networks.php b/srv/http/settings/networks.php
index e438c5ba7..5631ca822 100644
--- a/srv/http/settings/networks.php
+++ b/srv/http/settings/networks.php
@@ -3,7 +3,7 @@
  'Bluetooth'
-	, 'status' => 'btcontroller'
+	, 'status' => 'bluetooth'
 	, 'button' => [ 'btscan' => 'search' ]
 ] );
 $html = <<< EOF
@@ -36,7 +36,7 @@
  'Wi-Fi'
-	, 'status'  => 'wlan'
+	, 'status'  => 'ifconfigwlan'
 	, 'button'  => [ 'wladd' => 'plus-circle', 'wlscan' => 'search' ]
 ] );
 ?>
diff --git a/srv/http/settings/relays.php b/srv/http/settings/relays.php
index 227227bdc..db79546f5 100644
--- a/srv/http/settings/relays.php
+++ b/srv/http/settings/relays.php
@@ -28,7 +28,7 @@
 	
Pin - Idle + Idle
diff --git a/srv/http/settings/system.php b/srv/http/settings/system.php index 7ffc22ab8..9d6f6f7c3 100644 --- a/srv/http/settings/system.php +++ b/srv/http/settings/system.php @@ -104,7 +104,6 @@ 'Hard Drive Sleep' - , 'icon' => 'screenoff' , 'id' => 'hddsleep' , 'disabled' => 'HDD not support sleep' , 'help' => 'Sleep timer for USB hard drives.' @@ -112,7 +111,6 @@ htmlSetting( [ 'label' => 'Hotplug Update' , 'sublabel' => 'data on USB' - , 'icon' => 'refresh-library' , 'id' => 'usbautoupdate' , 'setting' => false , 'disabled' => 'js' @@ -128,7 +126,6 @@ $body = [ [ 'label' => 'Audio' - , 'icon' => 'volume' , 'id' => 'audio' , 'setting' => false , 'disabled' => 'No other audio devices available.' @@ -137,18 +134,15 @@ , [ 'label' => 'Bluetooth' , 'sublabel' => 'bluetoothctl' - , 'icon' => 'bluetooth' , 'id' => 'bluetooth' - , 'status' => 'btcontroller' - , 'disabled' => 'js' + , 'status' => true , 'help' => i( 'gear btn' ).' ■ Sampling 16bit | Only for Bluetooth receivers with fixed sampling' ] , [ 'label' => 'Wi-Fi' , 'sublabel' => 'iw' - , 'icon' => 'wifi' , 'id' => 'wlan' - , 'status' => 'iw' + , 'status' => true , 'disabled' => 'js' , 'help' => <<< EOF {$Fi( 'gear btn' )} @@ -167,30 +161,30 @@ ]; $body = [ [ - 'label' => 'Audio - I²S' - , 'icon' => 'i2saudio' - , 'input' => <<< EOF -
- -
-
-
- $selecti2s + 'html' => <<< EOF +
+
Audio - I²S
+
+
+ +
+
+
+ $selecti2s +
-
-EOF - , 'help' => <<< EOF -{$Fi( 'gear btn' )} Option to disable I²S EEPROM read for HAT with obsolete EEPROM + {$Fi( 'gear btn' )} Option to disable I²S EEPROM read for HAT with obsolete EEPROM -I²S DAC/audio HAT(Hardware Attached on Top) for audio output. - · HAT with EEPROM could be automatically detected. - · See {$Fmenu( 'player', 'Player' )} Output | Device | if it's already set. + I²S DAC/audio HAT(Hardware Attached on Top) for audio output. + · HAT with EEPROM could be automatically detected. + · See {$Fmenu( 'player', 'Player' )} Output | Device | if it's already set. + +
EOF ] , [ 'label' => 'Character LCD' , 'sublabel' => 'HD44780' - , 'icon' => 'lcdchar' , 'id' => 'lcdchar' , 'help' => <<< EOF LCD module - display playback data @@ -201,7 +195,6 @@ , [ 'label' => 'Power Button' , 'sublabel' => 'Power LED' - , 'icon' => 'power' , 'id' => 'powerbutton' , 'help' => <<< EOF Power button and LED - power on/off rAudio @@ -215,7 +208,6 @@ ] , [ 'label' => 'Relay Module' - , 'icon' => 'relays' , 'id' => 'relays' , 'help' => <<< EOF Relay module - power on/off peripheral equipments @@ -226,7 +218,6 @@ ], [ 'label' => 'Rotary Encoder' - , 'icon' => 'volume' , 'id' => 'rotaryencoder' , 'help' => <<< EOF Rotary encoder for: @@ -236,20 +227,17 @@ ] ,[ 'label' => 'Spectrum OLED' - , 'icon' => 'mpdoled' , 'id' => 'mpdoled' , 'help' => 'OLED module - display audio level spectrum' ] , [ 'label' => 'TFT 3.5" LCD' - , 'icon' => 'lcd' , 'id' => 'lcd' , 'help' => 'TFT LCD module with resistive touchscreen - local display' , 'exist' => file_exists( '/etc/systemd/system/localbrowser.service' ) ] , [ 'label' => 'VU LED' - , 'icon' => 'led' , 'id' => 'vuled' , 'help' => <<< EOF 7 LEDs - display audio level @@ -261,8 +249,7 @@ $head = [ 'title' => 'Environment' ]; ////////////////////////////////// $body = [ [ - 'label' => 'Host Name' - , 'icon' => 'raudio' + 'label' => 'Player Name' , 'id' => 'hostname' , 'input' => '' , 'setting' => false @@ -276,9 +263,8 @@ , [ 'label' => 'Time Zone' , 'sublabel' => 'timedatectl' - , 'icon' => 'globe' , 'id' => 'timezone' - , 'status' => 'timedatectl' + , 'status' => true , 'input' => $selecttimezone , 'setting' => 'custom' , 'help' => i( 'gear btn' ).' Servers for time sync and package mirror' @@ -286,9 +272,8 @@ , [ 'label' => 'Sound Profile' , 'sublabel' => 'sysctl' - , 'icon' => 'soundprofile' , 'id' => 'soundprofile' - , 'status' => 'soundprofile' + , 'status' => true , 'help' => 'Tweak kernel parameters for sound profiles.' ] ]; @@ -297,7 +282,6 @@ $body = [ [ 'label' => 'Backup' - , 'icon' => 'sd' , 'id' => 'backup' , 'setting' => 'nobanner' , 'help' => <<< EOF @@ -310,7 +294,6 @@ ] , [ 'label' => 'Restore' - , 'icon' => 'restore' , 'id' => 'restore' , 'setting' => 'nobanner' , 'help' => <<< EOF @@ -321,7 +304,6 @@ , [ 'label' => 'Shared Data' , 'sublabel' => 'client' - , 'icon' => 'networks' , 'id' => 'shareddata' , 'setting' => 'custom' , 'disabled' => nameIcon( 'Server rAudio', 'rserver' ).' is currently active.' From f4eeb2a463a9ba687c9f96e51a16f2a2520a2c64 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 19:51:20 +0700 Subject: [PATCH 08/28] Update system.js --- srv/http/assets/js/system.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srv/http/assets/js/system.js b/srv/http/assets/js/system.js index bb91a8ada..44d40529e 100644 --- a/srv/http/assets/js/system.js +++ b/srv/http/assets/js/system.js @@ -532,7 +532,7 @@ $( '#ledcalc' ).click( function() { } ); } ); $( '#hostname' ).on( 'mousedown touchdown', function() { - var icon = 'raudio'; + var icon = 'system'; var title = 'Player Name'; info( { icon : icon From cd1575af4e199351871360c5c108a91813da3dd3 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 20:57:18 +0700 Subject: [PATCH 09/28] u --- install.sh | 56 ------------------- srv/http/data/mpdconf/conf/autoupdate.conf | 1 - srv/http/data/mpdconf/conf/buffer.conf | 1 - srv/http/data/mpdconf/conf/cdio.conf | 4 -- srv/http/data/mpdconf/conf/ffmpeg.conf | 4 -- srv/http/data/mpdconf/conf/fifo.conf | 6 -- srv/http/data/mpdconf/conf/httpd.conf | 9 --- srv/http/data/mpdconf/conf/normalization.conf | 1 - srv/http/data/mpdconf/conf/outputbuffer.conf | 1 - srv/http/data/mpdconf/conf/replaygain.conf | 1 - srv/http/data/mpdconf/conf/snapserver.conf | 6 -- srv/http/data/mpdconf/conf/soxr-custom.conf | 10 ---- srv/http/data/mpdconf/conf/soxr.conf | 5 -- srv/http/data/mpdconf/curl.conf | 3 - srv/http/data/mpdconf/mpd.conf | 21 ------- .../settings/camillagui/build/camillagui.css | 7 ++- srv/http/settings/camillagui/build/index.html | 2 +- 17 files changed, 6 insertions(+), 132 deletions(-) delete mode 100644 srv/http/data/mpdconf/conf/autoupdate.conf delete mode 100644 srv/http/data/mpdconf/conf/buffer.conf delete mode 100644 srv/http/data/mpdconf/conf/cdio.conf delete mode 100644 srv/http/data/mpdconf/conf/ffmpeg.conf delete mode 100644 srv/http/data/mpdconf/conf/fifo.conf delete mode 100644 srv/http/data/mpdconf/conf/httpd.conf delete mode 100644 srv/http/data/mpdconf/conf/normalization.conf delete mode 100644 srv/http/data/mpdconf/conf/outputbuffer.conf delete mode 100644 srv/http/data/mpdconf/conf/replaygain.conf delete mode 100644 srv/http/data/mpdconf/conf/snapserver.conf delete mode 100644 srv/http/data/mpdconf/conf/soxr-custom.conf delete mode 100644 srv/http/data/mpdconf/conf/soxr.conf delete mode 100644 srv/http/data/mpdconf/curl.conf delete mode 100644 srv/http/data/mpdconf/mpd.conf diff --git a/install.sh b/install.sh index 29114d989..7ac6f22cb 100644 --- a/install.sh +++ b/install.sh @@ -57,72 +57,16 @@ if grep -q shairport.sh /etc/shairport-sync.conf; then systemctl try-restart shairport-sync fi -# 20221123 -grep -q calc $dirbash/xinitrc && restartbrowser=1 - -mv /etc/udev/rules.d/ntfs{3,}.rules &> /dev/null -file=/etc/udev/rules.d/ntfs.rules -if [[ ! -e $file ]]; then - cat << 'EOF' > $file -ACTION=="add", \ -SUBSYSTEM=="block", \ -ENV{ID_FS_TYPE}=="ntfs", \ -ENV{ID_FS_TYPE}="ntfs3", \ -RUN+="/srv/http/bash/settings/system.sh usbconnect" - -ACTION=="remove", \ -SUBSYSTEM=="block", \ -ENV{ID_FS_TYPE}=="ntfs", \ -ENV{ID_FS_TYPE}="ntfs3", \ -RUN+="/srv/http/bash/settings/system.sh usbremove" -EOF - udevadm control --reload-rules - udevadm trigger -fi - -# 20221122 -sed -i '/shairport-sync/ d' /etc/pacman.conf -veropenssl=$( pacman -Q openssl | cut -d' ' -f2 | cut -c 1 ) -vershairport=$( pacman -Q shairport-sync | cut -d' ' -f2 | cut -c 1 ) -[[ $veropenssl == 3 && $vershairport != 4 ]] && pacman -Sy --noconfirm shairport-sync - -[[ -e $dirsystem/loginset ]] && mv -f $dirsystem/login{set,} - -[[ ! -e $dirdata/mpdconf ]] && backup=1 - -sed -i '/interfaces/ d' /etc/samba/smb.conf -systemctl try-restart smb - -file=/etc/systemd/system/bluetooth.service.d/override.conf -if grep -q bluetooth$ $file; then - sed -i 's/bluetooth$/&start/' $file - systemctl daemon-reload -fi - -if [[ -L $dirmpd && ! -e /mnt/MPD/.mpdignore ]]; then - echo "\ -SD -USB" > /mnt/MPD/.mpdignore -fi - #------------------------------------------------------------------------------- installstart "$1" rm -rf /srv/http/assets/{css,fonts,js} -[[ -e $dirmpdconf ]] && mv $dirmpdconf /tmp getinstallzip -if [[ -e /tmp/mpdconf ]]; then - rm -rf $dirmpdconf - mv /tmp/mpdconf $dirdata -fi chmod +x $dirsettings/system.sh $dirsettings/system.sh dirpermissions [[ -e $dirsystem/color ]] && $dirbash/cmd.sh color installfinish #------------------------------------------------------------------------------- - -# 20221123 -[[ $restartbrowser ]] && systemctl try-restart localbrowser diff --git a/srv/http/data/mpdconf/conf/autoupdate.conf b/srv/http/data/mpdconf/conf/autoupdate.conf deleted file mode 100644 index 0cec7e515..000000000 --- a/srv/http/data/mpdconf/conf/autoupdate.conf +++ /dev/null @@ -1 +0,0 @@ -auto_update "yes" diff --git a/srv/http/data/mpdconf/conf/buffer.conf b/srv/http/data/mpdconf/conf/buffer.conf deleted file mode 100644 index fa493f4a2..000000000 --- a/srv/http/data/mpdconf/conf/buffer.conf +++ /dev/null @@ -1 +0,0 @@ -audio_buffer_size "4096" diff --git a/srv/http/data/mpdconf/conf/cdio.conf b/srv/http/data/mpdconf/conf/cdio.conf deleted file mode 100644 index af890a73e..000000000 --- a/srv/http/data/mpdconf/conf/cdio.conf +++ /dev/null @@ -1,4 +0,0 @@ -input { - plugin "cdio_paranoia" - speed "12" -} diff --git a/srv/http/data/mpdconf/conf/ffmpeg.conf b/srv/http/data/mpdconf/conf/ffmpeg.conf deleted file mode 100644 index 07a48321c..000000000 --- a/srv/http/data/mpdconf/conf/ffmpeg.conf +++ /dev/null @@ -1,4 +0,0 @@ -decoder { - plugin "ffmpeg" - enabled "yes" -} diff --git a/srv/http/data/mpdconf/conf/fifo.conf b/srv/http/data/mpdconf/conf/fifo.conf deleted file mode 100644 index 68553bb57..000000000 --- a/srv/http/data/mpdconf/conf/fifo.conf +++ /dev/null @@ -1,6 +0,0 @@ -audio_output { - name "Named pipe" - type "fifo" - path "/tmp/mpd.fifo" - format "44100:16:1" -} diff --git a/srv/http/data/mpdconf/conf/httpd.conf b/srv/http/data/mpdconf/conf/httpd.conf deleted file mode 100644 index d46fcdddd..000000000 --- a/srv/http/data/mpdconf/conf/httpd.conf +++ /dev/null @@ -1,9 +0,0 @@ -audio_output { - type "httpd" - name "Streaming" - encoder "flac" - port "8000" - quality "5.0" - format "44100:16:2" - always_on "yes" -} diff --git a/srv/http/data/mpdconf/conf/normalization.conf b/srv/http/data/mpdconf/conf/normalization.conf deleted file mode 100644 index fe02796b1..000000000 --- a/srv/http/data/mpdconf/conf/normalization.conf +++ /dev/null @@ -1 +0,0 @@ -volume_normalization "yes" diff --git a/srv/http/data/mpdconf/conf/outputbuffer.conf b/srv/http/data/mpdconf/conf/outputbuffer.conf deleted file mode 100644 index be521b550..000000000 --- a/srv/http/data/mpdconf/conf/outputbuffer.conf +++ /dev/null @@ -1 +0,0 @@ -max_output_buffer_size "8192" diff --git a/srv/http/data/mpdconf/conf/replaygain.conf b/srv/http/data/mpdconf/conf/replaygain.conf deleted file mode 100644 index 8df9fa18e..000000000 --- a/srv/http/data/mpdconf/conf/replaygain.conf +++ /dev/null @@ -1 +0,0 @@ -replaygain "album" diff --git a/srv/http/data/mpdconf/conf/snapserver.conf b/srv/http/data/mpdconf/conf/snapserver.conf deleted file mode 100644 index e04e86d8d..000000000 --- a/srv/http/data/mpdconf/conf/snapserver.conf +++ /dev/null @@ -1,6 +0,0 @@ -audio_output { - name "SnapServer" - type "snapcast" - port "1704" - format "48000:16:2" -} diff --git a/srv/http/data/mpdconf/conf/soxr-custom.conf b/srv/http/data/mpdconf/conf/soxr-custom.conf deleted file mode 100644 index b72eb993e..000000000 --- a/srv/http/data/mpdconf/conf/soxr-custom.conf +++ /dev/null @@ -1,10 +0,0 @@ -resampler { - plugin "soxr" - quality "custom" - precision "20" - phase_response "50" - passband_end "91.3" - stopband_begin "100" - attenuation "0" - flags "0" -} diff --git a/srv/http/data/mpdconf/conf/soxr.conf b/srv/http/data/mpdconf/conf/soxr.conf deleted file mode 100644 index 28a44ddf9..000000000 --- a/srv/http/data/mpdconf/conf/soxr.conf +++ /dev/null @@ -1,5 +0,0 @@ -resampler { - plugin "soxr" - quality "very high" - threads "1" -} diff --git a/srv/http/data/mpdconf/curl.conf b/srv/http/data/mpdconf/curl.conf deleted file mode 100644 index de601566a..000000000 --- a/srv/http/data/mpdconf/curl.conf +++ /dev/null @@ -1,3 +0,0 @@ -input { - plugin "curl" -} diff --git a/srv/http/data/mpdconf/mpd.conf b/srv/http/data/mpdconf/mpd.conf deleted file mode 100644 index 95a04ea77..000000000 --- a/srv/http/data/mpdconf/mpd.conf +++ /dev/null @@ -1,21 +0,0 @@ -bind_to_address "0.0.0.0" -db_file "/srv/http/data/mpd/mpd.db" -music_directory "/mnt/MPD" -playlist_directory "/srv/http/data/playlists" -state_file "/var/lib/mpd/mpdstate" -user "mpd" -include_optional "autoupdate.conf" -include_optional "outputbuffer.conf" -include_optional "normalization.conf" -include_optional "replaygain.conf" -include_optional "custom.conf" -include_optional "cdio.conf" -include_optional "ffmpeg.conf" -include_optional "fifo.conf" -include_optional "httpd.conf" -include_optional "snapserver.conf" -include_optional "curl.conf" -include_optional "soxr.conf" -include_optional "soxr-custom.conf" -include_optional "bluetooth.conf" -include_optional "output.conf" diff --git a/srv/http/settings/camillagui/build/camillagui.css b/srv/http/settings/camillagui/build/camillagui.css index 2bbabee72..34b185639 100644 --- a/srv/http/settings/camillagui/build/camillagui.css +++ b/srv/http/settings/camillagui/build/camillagui.css @@ -374,7 +374,10 @@ input[data-tip='Mixer name, must be unique'] { left: -290px; width: 270px; height: 36px; - background: none; + background: #000; + border-top: 10px solid #000; + margin-top: -10px; + box-shadow: 0px 4px 10px #000; } #button-compactview { display: none; @@ -473,7 +476,6 @@ input[data-tip='Mixer name, must be unique'] { } /* volume + status ------------------------------------------------------------ */ #mainpanel { - position: fixed; display: block; float: left; width: 270px !important; @@ -584,6 +586,7 @@ input[data-tip='Mixer name, must be unique'] { /* Panels ----------------------------------------------------------------- */ .configtabs { display: block; + float: none; width: 410px; max-width: 100vw; margin-left: 300px !important; diff --git a/srv/http/settings/camillagui/build/index.html b/srv/http/settings/camillagui/build/index.html index 4e2cdf717..618c141b9 100644 --- a/srv/http/settings/camillagui/build/index.html +++ b/srv/http/settings/camillagui/build/index.html @@ -1 +1 @@ -CamillaDSP
\ No newline at end of file +CamillaDSP
\ No newline at end of file From 3cb5729c1ab4333b14d345981e5987add4028e28 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 14:51:04 +0700 Subject: [PATCH 10/28] Update system-datareset.sh --- srv/http/bash/settings/system-datareset.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srv/http/bash/settings/system-datareset.sh b/srv/http/bash/settings/system-datareset.sh index beab72448..5bfc1496b 100644 --- a/srv/http/bash/settings/system-datareset.sh +++ b/srv/http/bash/settings/system-datareset.sh @@ -76,7 +76,7 @@ over_voltage=2" sed -i '/^#/! d' /etc/exports systemctl -q disable bluetooth hostapd camilladsp nfs-server powerbutton rtsp-simple-server shairport-sync smb snapclient spotifyd upmpdcli &> /dev/null - mv $dirdata/{addons,mpdconf} /tmp + mv $dirdata/{addons,camilladsp,mpdconf} /tmp &> /dev/null rm -rf $dirdata $dirshareddata \ /mnt/MPD/.mpdignore $dirnas/.mpdignore \ /etc/modules-load.d/{loopback,raspberrypi}.conf /etc/modprobe.d/cirrus.conf /etc/X11/xorg.conf.d/99-raspi-rotate.conf @@ -90,7 +90,7 @@ chown -h http:http $dirshm /srv/http/mnt # addons - new/reset if [[ $reset ]]; then - mv /tmp/{addons,mpdconf} $dirdata + mv /tmp/{addons,camilladsp,mpdconf} $dirdata &> /dev/null else dirs=$( ls $dirdata ) for dir in $dirs; do From 6bef2616ba2d86eca973cf687ad997ead37ff3a2 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 14:56:31 +0700 Subject: [PATCH 11/28] Update system-datareset.sh --- srv/http/bash/settings/system-datareset.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/srv/http/bash/settings/system-datareset.sh b/srv/http/bash/settings/system-datareset.sh index 5bfc1496b..547412b9b 100644 --- a/srv/http/bash/settings/system-datareset.sh +++ b/srv/http/bash/settings/system-datareset.sh @@ -83,7 +83,7 @@ over_voltage=2" fi # data directories -mkdir -p $dirdata/{addons,audiocd,bookmarks,lyrics,mpd,playlists,system,webradio,webradio/img} /mnt/MPD/{NAS,SD,USB} +mkdir -p $dirdata/{addons,audiocd,bookmarks,camilladsp,lyrics,mpd,mpdconf,playlists,system,webradio,webradio/img} /mnt/MPD/{NAS,SD,USB} ln -sf /dev/shm $dirdata ln -sf /mnt /srv/http/ chown -h http:http $dirshm /srv/http/mnt @@ -104,6 +104,7 @@ if [[ -e /usr/bin/camilladsp ]]; then ln -sf /srv/http/assets/fonts $dircamillagui ln -sf /srv/http/assets/css/colors.css $dircamillagui ln -sf /srv/http/assets/img/icon.png $dircamillagui + ln -sf $dircamilladsp/configs/{camilladsp,active_config}.yml fi # display From 52446436c9ee50009f89fa52d5471a3c5eb6093c Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 15:04:37 +0700 Subject: [PATCH 12/28] Update install.sh --- install.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/install.sh b/install.sh index 7ac6f22cb..2d3d92fec 100644 --- a/install.sh +++ b/install.sh @@ -4,6 +4,52 @@ alias=r1 . /srv/http/bash/addons.sh +# 20130123 +if [[ ! -e $dirdata/camilladsp ]]; then + dircamilladsp=/srv/http/data/camilladsp + mkdir -p $dircamilladsp/{coeffs,configs} + echo 'devices: + adjust_period: 10 + capture: + channels: 2 + device: hw:Loopback,0 + format: S32LE + type: Alsa + capture_samplerate: 0 + chunksize: 2048 + enable_rate_adjust: false + enable_resampling: false + playback: + channels: 2 + device: hw:0,0 + format: S16LE + type: Alsa + queuelimit: 4 + rate_measure_interval: 1 + resampler_type: Synchronous + samplerate: 44100 + silence_threshold: -60 + silence_timeout: 3 + stop_on_rate_change: false + target_level: 0 +filters: + Volume: + parameters: + ramp_time: 200 + type: Volume +mixers: {} +pipeline: +- channel: 0 + names: + - Volume + type: Filter +- channel: 1 + names: + - Volume + type: Filter' > $dircamilladsp/configs/camilladsp.yml + ln -s $dircamilladsp/configs/{camilladsp,active_config}.yml +fi + # 20230117 file=/etc/systemd/system/spotifyd.service ! grep -q ^User $file && sed -i '/CPUAffinity/ a\User=root' $file From 305689f8f3540ce75d6bca6cd69b39b516819c04 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 15:12:13 +0700 Subject: [PATCH 13/28] Update index.html --- srv/http/settings/camillagui/build/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srv/http/settings/camillagui/build/index.html b/srv/http/settings/camillagui/build/index.html index 618c141b9..b503d973c 100644 --- a/srv/http/settings/camillagui/build/index.html +++ b/srv/http/settings/camillagui/build/index.html @@ -1 +1 @@ -CamillaDSP
\ No newline at end of file +CamillaDSP
\ No newline at end of file From de34205c2a69073edd16969787902ffdaafc75e1 Mon Sep 17 00:00:00 2001 From: rern Date: Wed, 18 Jan 2023 15:28:44 +0700 Subject: [PATCH 14/28] Update system-datareset.sh --- srv/http/bash/settings/system-datareset.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/srv/http/bash/settings/system-datareset.sh b/srv/http/bash/settings/system-datareset.sh index 547412b9b..d81519f3c 100644 --- a/srv/http/bash/settings/system-datareset.sh +++ b/srv/http/bash/settings/system-datareset.sh @@ -98,15 +98,6 @@ else done fi -# camillagui -if [[ -e /usr/bin/camilladsp ]]; then - dircamillagui=/srv/http/settings/camillagui/build - ln -sf /srv/http/assets/fonts $dircamillagui - ln -sf /srv/http/assets/css/colors.css $dircamillagui - ln -sf /srv/http/assets/img/icon.png $dircamillagui - ln -sf $dircamilladsp/configs/{camilladsp,active_config}.yml -fi - # display true='album albumartist artist bars buttons composer conductor count cover date fixedcover genre label latest nas playbackswitch playlists plclear plsimilar sd time usb volume webradio' From 0afdb86fa4d1c590aa37e4b861bd78850120fc7a Mon Sep 17 00:00:00 2001 From: rern Date: Thu, 19 Jan 2023 09:05:19 +0700 Subject: [PATCH 15/28] u --- .../camillagui/build => assets/css}/camillagui.css | 6 +++--- srv/http/settings/camillagui/build/index.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) rename srv/http/{settings/camillagui/build => assets/css}/camillagui.css (99%) diff --git a/srv/http/settings/camillagui/build/camillagui.css b/srv/http/assets/css/camillagui.css similarity index 99% rename from srv/http/settings/camillagui/build/camillagui.css rename to srv/http/assets/css/camillagui.css index 34b185639..3aacc41ad 100644 --- a/srv/http/settings/camillagui/build/camillagui.css +++ b/srv/http/assets/css/camillagui.css @@ -1,18 +1,18 @@ @font-face { font-family: Lato; - src: url( './fonts/Lato-Regular.woff2' ) format( 'woff2' ); + src: url( '../fonts/Lato-Regular.woff2' ) format( 'woff2' ); font-weight: normal; font-style: normal; } @font-face { font-family: Lato; - src: url( './fonts/Lato-Light.woff2' ) format( 'woff2' ); + src: url( '../fonts/Lato-Light.woff2' ) format( 'woff2' ); font-weight: 300; font-style: normal; } @font-face { font-family: Inconsolata; - src: url('./fonts/Inconsolata.woff2') format('woff2'); + src: url('../fonts/Inconsolata.woff2') format('woff2'); font-weight: normal; font-style: normal; } diff --git a/srv/http/settings/camillagui/build/index.html b/srv/http/settings/camillagui/build/index.html index b503d973c..2e7d47d66 100644 --- a/srv/http/settings/camillagui/build/index.html +++ b/srv/http/settings/camillagui/build/index.html @@ -1 +1 @@ -CamillaDSP
\ No newline at end of file +CamillaDSP
\ No newline at end of file From 8864168ef8b32c1832b80c4ac8df3b1b3044f3c8 Mon Sep 17 00:00:00 2001 From: rern Date: Fri, 20 Jan 2023 21:27:53 +0700 Subject: [PATCH 16/28] u --- .../settings/camillagui/backend/routes.py | 67 +++++++++++++++++++ srv/http/settings/camillagui/backend/views.py | 8 +-- srv/http/settings/camillagui/build/index.html | 2 +- .../camillagui/build/static/js/main.js | 4 +- .../build/static/js/main.js.LICENSE.txt | 61 ----------------- .../camillagui/build/static/js/main.js.map | 2 +- 6 files changed, 75 insertions(+), 69 deletions(-) create mode 100644 srv/http/settings/camillagui/backend/routes.py delete mode 100644 srv/http/settings/camillagui/build/static/js/main.js.LICENSE.txt diff --git a/srv/http/settings/camillagui/backend/routes.py b/srv/http/settings/camillagui/backend/routes.py new file mode 100644 index 000000000..28af50543 --- /dev/null +++ b/srv/http/settings/camillagui/backend/routes.py @@ -0,0 +1,67 @@ +from .settings import BASEPATH +from .views import ( + get_param, + get_list_param, + set_param, + eval_filter_values, + eval_filterstep_values, + get_config, + set_config, + get_active_config_file, + set_active_config_name, + config_to_yml, + yml_to_json, + validate_config, + get_gui_index, + get_stored_coeffs, + get_stored_configs, + store_configs, + store_coeffs, + delete_coeffs, + delete_configs, + download_coeffs_zip, + download_configs_zip, + get_gui_config, + get_config_file, + save_config_file, + get_defaults_for_coeffs, + get_status, + get_log_file +) + + +def setup_routes(app): + app.router.add_get("/api/status", get_status) + app.router.add_get("/api/getparam/{name}", get_param) + app.router.add_get("/api/getlistparam/{name}", get_list_param) + app.router.add_post("/api/setparam/{name}", set_param) + app.router.add_post("/api/evalfilter", eval_filter_values) + app.router.add_post("/api/evalfilterstep", eval_filterstep_values) + app.router.add_get("/api/getconfig", get_config) + app.router.add_post("/api/setconfig", set_config) + app.router.add_get("/api/getactiveconfigfile", get_active_config_file) + app.router.add_post("/api/setactiveconfigfile", set_active_config_name) + app.router.add_post("/api/configtoyml", config_to_yml) + app.router.add_post("/api/ymltojson", yml_to_json) + app.router.add_post("/api/validateconfig", validate_config) + app.router.add_get("/api/storedconfigs", get_stored_configs) + app.router.add_get("/api/storedcoeffs", get_stored_coeffs) + app.router.add_get("/api/defaultsforcoeffs", get_defaults_for_coeffs) + app.router.add_post("/api/uploadconfigs", store_configs) + app.router.add_post("/api/uploadcoeffs", store_coeffs) + app.router.add_post("/api/deleteconfigs", delete_configs) + app.router.add_post("/api/deletecoeffs", delete_coeffs) + app.router.add_post("/api/downloadconfigszip", download_configs_zip) + app.router.add_post("/api/downloadcoeffszip", download_coeffs_zip) + app.router.add_get("/api/guiconfig", get_gui_config) + app.router.add_get("/api/getconfigfile", get_config_file) + app.router.add_post("/api/saveconfigfile", save_config_file) + app.router.add_get("/api/logfile", get_log_file) + + app.router.add_get("/", get_gui_index) + + +def setup_static_routes(app): + app.router.add_static("/gui/", path=BASEPATH / "build", follow_symlinks=True) + app.router.add_static("/config/", path=app["config_dir"]) + app.router.add_static("/coeff/", path=app["coeff_dir"]) diff --git a/srv/http/settings/camillagui/backend/views.py b/srv/http/settings/camillagui/backend/views.py index 25c92331b..6fcecffeb 100644 --- a/srv/http/settings/camillagui/backend/views.py +++ b/srv/http/settings/camillagui/backend/views.py @@ -88,7 +88,7 @@ async def get_param(request): cdsp = request.app["CAMILLA"] if name == "volume": result = cdsp.get_volume() - elif name == "configmutevolume": + elif name == "mute": config = cdsp.get_config() mute = True if cdsp.get_mute() else False volume = cdsp.get_volume() @@ -133,7 +133,7 @@ async def set_param(request): if name == "volume": cdsp.set_volume(value) elif name == "mute": - cdsp.set_mute(value == 'True') + cdsp.set_mute(value == "true") elif name == "updateinterval": cdsp.set_update_interval(value) elif name == "configname": @@ -162,7 +162,7 @@ async def eval_filter_values(request): config, name=(content["name"]), samplerate=samplerate, - npoints=100, + npoints=1000, ) data["channels"] = channels data["options"] = options @@ -188,7 +188,7 @@ async def eval_filterstep_values(request): plot_config, step_index, name="Filterstep {}".format(step_index), - npoints=300, + npoints=1000, ) data["channels"] = channels data["options"] = options diff --git a/srv/http/settings/camillagui/build/index.html b/srv/http/settings/camillagui/build/index.html index 2e7d47d66..e82358e1b 100644 --- a/srv/http/settings/camillagui/build/index.html +++ b/srv/http/settings/camillagui/build/index.html @@ -1 +1 @@ -CamillaDSP
\ No newline at end of file +CamillaDSP
\ No newline at end of file diff --git a/srv/http/settings/camillagui/build/static/js/main.js b/srv/http/settings/camillagui/build/static/js/main.js index af898ef16..9d805f15b 100644 --- a/srv/http/settings/camillagui/build/static/js/main.js +++ b/srv/http/settings/camillagui/build/static/js/main.js @@ -1,3 +1,3 @@ -/*! For license information please see main.0db7c2a6.js.LICENSE.txt */ -!function(){var t={7228:function(t){t.exports=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n=t.length?{done:!0}:{done:!1,value:t[i++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,u=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return s=t.done,t},e:function(t){u=!0,a=t},f:function(){try{s||null==n.return||n.return()}finally{if(u)throw a}}}},t.exports.__esModule=!0,t.exports.default=t.exports},379:function(t,e,n){var r=n(7228);t.exports=function(t,e){if(t){if("string"===typeof t)return r(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}},t.exports.__esModule=!0,t.exports.default=t.exports},7757:function(t,e,n){t.exports=n(4596)},4798:function(t,e,n){t.exports=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e){t.exports=n(8731)},function(t,e){t.exports=n(9867)},function(t,e,n){"use strict";n.r(e);var r=n(1),i=n(0),o=function(){return(o=Object.assign||function(t){for(var e,n=1,r=arguments.length;n0&&(C.transform=T.join(" "),C.transformOrigin="center",O&&(P=r.createElement("g",{style:C},D,r.createElement("rect",{width:"24",height:"24",fill:"transparent"}))));var A,I=P,N=!0===k||"number"!=typeof k?2:k,L=!O&&(y||b);if(N<0&&(L=!L),k&&(I=r.createElement("g",{style:{animation:"spin"+(L?"-inverse":"")+" linear "+Math.abs(N)+"s infinite",transformOrigin:"center"}},P,!(y||b||0!==x)&&r.createElement("rect",{width:"24",height:"24",fill:"transparent"}))),O)return I;var z,R="icon_labelledby_"+o,F="icon_describedby_"+o;if(s)A=f?R+" "+F:R;else if(z="presentation",f)throw new Error("title attribute required when description is set");return r.createElement("svg",l({ref:e,viewBox:"0 0 24 24",style:C,role:z,"aria-labelledby":A},M),s&&r.createElement("title",{id:R},s),f&&r.createElement("desc",{id:F},f),!O&&k&&(L?r.createElement("style",null,"@keyframes spin-inverse { to { transform: rotate(-360deg) } }"):r.createElement("style",null,"@keyframes spin { to { transform: rotate(360deg) } }")),I)}));f.displayName="Icon",f.propTypes={path:i.string.isRequired,size:i.oneOfType([i.number,i.string]),color:i.string,horizontal:i.bool,vertical:i.bool,rotate:i.number,spin:i.oneOfType([i.bool,i.number]),style:i.object,inStack:i.bool,className:i.string},f.defaultProps={size:null,color:"currentColor",horizontal:!1,vertical:!1,rotate:0,spin:!1},e.default=f}])},9638:function(t){"use strict";t.exports=function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){if(e.constructor!==n.constructor)return!1;var r,i,o;if(Array.isArray(e)){if((r=e.length)!=n.length)return!1;for(i=r;0!==i--;)if(!t(e[i],n[i]))return!1;return!0}if(e.constructor===RegExp)return e.source===n.source&&e.flags===n.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===n.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===n.toString();if((r=(o=Object.keys(e)).length)!==Object.keys(n).length)return!1;for(i=r;0!==i--;)if(!Object.prototype.hasOwnProperty.call(n,o[i]))return!1;for(i=r;0!==i--;){var a=o[i];if(!t(e[a],n[a]))return!1}return!0}return e!==e&&n!==n}},7653:function(t,e,n){var r;!function(i,o,a,s){"use strict";var u,l=["","webkit","Moz","MS","ms","o"],c=o.createElement("div"),f=Math.round,h=Math.abs,d=Date.now;function p(t,e,n){return setTimeout(x(t,n),e)}function v(t,e,n){return!!Array.isArray(t)&&(g(t,n[e],n),!0)}function g(t,e,n){var r;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==s)for(r=0;r\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=i.console&&(i.console.warn||i.console.log);return o&&o.call(i.console,r,n),t.apply(this,arguments)}}u="function"!==typeof Object.assign?function(t){if(t===s||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n-1}function M(t){return t.trim().split(/\s+/g)}function j(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var r=0;rn[e]})):r.sort()),r}function P(t,e){for(var n,r,i=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=q(e):1===i&&(n.firstMultiple=!1);var o=n.firstInput,a=n.firstMultiple,u=a?a.center:o.center,l=e.center=Y(r);e.timeStamp=d(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=Q(u,l),e.distance=K(u,l),function(t,e){var n=e.center,r=t.offsetDelta||{},i=t.prevDelta||{},o=t.prevInput||{};1!==e.eventType&&4!==o.eventType||(i=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},r=t.offsetDelta={x:n.x,y:n.y});e.deltaX=i.x+(n.x-r.x),e.deltaY=i.y+(n.y-r.y)}(n,e),e.offsetDirection=X(e.deltaX,e.deltaY);var c=$(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=c.x,e.overallVelocityY=c.y,e.overallVelocity=h(c.x)>h(c.y)?c.x:c.y,e.scale=a?(f=a.pointers,p=r,K(p[0],p[1],B)/K(f[0],f[1],B)):1,e.rotation=a?function(t,e){return Q(e[1],e[0],B)+Q(t[1],t[0],B)}(a.pointers,r):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,function(t,e){var n,r,i,o,a=t.lastInterval||e,u=e.timeStamp-a.timeStamp;if(8!=e.eventType&&(u>25||a.velocity===s)){var l=e.deltaX-a.deltaX,c=e.deltaY-a.deltaY,f=$(u,l,c);r=f.x,i=f.y,n=h(f.x)>h(f.y)?f.x:f.y,o=X(l,c),t.lastInterval=e}else n=a.velocity,r=a.velocityX,i=a.velocityY,o=a.direction;e.velocity=n,e.velocityX=r,e.velocityY=i,e.direction=o}(n,e);var f,p;var v=t.element;E(e.srcEvent.target,v)&&(v=e.srcEvent.target);e.target=v}(t,n),t.emit("hammer.input",n),t.recognize(n),t.session.prevInput=n}function q(t){for(var e=[],n=0;n=h(e)?t<0?2:4:e<0?8:16}function K(t,e,n){n||(n=V);var r=e[n[0]]-t[n[0]],i=e[n[1]]-t[n[1]];return Math.sqrt(r*r+i*i)}function Q(t,e,n){n||(n=V);var r=e[n[0]]-t[n[0]],i=e[n[1]]-t[n[1]];return 180*Math.atan2(i,r)/Math.PI}W.prototype={handler:function(){},init:function(){this.evEl&&S(this.element,this.evEl,this.domHandler),this.evTarget&&S(this.target,this.evTarget,this.domHandler),this.evWin&&S(I(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(I(this.element),this.evWin,this.domHandler)}};var Z={mousedown:1,mousemove:2,mouseup:4},G="mousedown",J="mousemove mouseup";function tt(){this.evEl=G,this.evWin=J,this.pressed=!1,W.apply(this,arguments)}_(tt,W,{handler:function(t){var e=Z[t.type];1&e&&0===t.button&&(this.pressed=!0),2&e&&1!==t.which&&(e=4),this.pressed&&(4&e&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:F,srcEvent:t}))}});var et={pointerdown:1,pointermove:2,pointerup:4,pointercancel:8,pointerout:8},nt={2:R,3:"pen",4:F,5:"kinect"},rt="pointerdown",it="pointermove pointerup pointercancel";function ot(){this.evEl=rt,this.evWin=it,W.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}i.MSPointerEvent&&!i.PointerEvent&&(rt="MSPointerDown",it="MSPointerMove MSPointerUp MSPointerCancel"),_(ot,W,{handler:function(t){var e=this.store,n=!1,r=t.type.toLowerCase().replace("ms",""),i=et[r],o=nt[t.pointerType]||t.pointerType,a=o==R,s=j(e,t.pointerId,"pointerId");1&i&&(0===t.button||a)?s<0&&(e.push(t),s=e.length-1):12&i&&(n=!0),s<0||(e[s]=t,this.callback(this.manager,i,{pointers:e,changedPointers:[t],pointerType:o,srcEvent:t}),n&&e.splice(s,1))}});var at={touchstart:1,touchmove:2,touchend:4,touchcancel:8},st="touchstart",ut="touchstart touchmove touchend touchcancel";function lt(){this.evTarget=st,this.evWin=ut,this.started=!1,W.apply(this,arguments)}function ct(t,e){var n=T(t.touches),r=T(t.changedTouches);return 12&e&&(n=D(n.concat(r),"identifier",!0)),[n,r]}_(lt,W,{handler:function(t){var e=at[t.type];if(1===e&&(this.started=!0),this.started){var n=ct.call(this,t,e);12&e&&n[0].length-n[1].length===0&&(this.started=!1),this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:R,srcEvent:t})}}});var ft={touchstart:1,touchmove:2,touchend:4,touchcancel:8},ht="touchstart touchmove touchend touchcancel";function dt(){this.evTarget=ht,this.targetIds={},W.apply(this,arguments)}function pt(t,e){var n=T(t.touches),r=this.targetIds;if(3&e&&1===n.length)return r[n[0].identifier]=!0,[n,n];var i,o,a=T(t.changedTouches),s=[],u=this.target;if(o=n.filter((function(t){return E(t.target,u)})),1===e)for(i=0;i-1&&r.splice(t,1)}),2500)}}function mt(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,r=0;r-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){var e=this,n=this.state;function r(n){e.manager.emit(n,t)}n<8&&r(e.options.event+Dt(n)),r(e.options.event),t.additionalEvent&&r(t.additionalEvent),n>=8&&r(e.options.event+Dt(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=jt},canEmit:function(){for(var t=0;te.threshold&&i&e.direction},attrTest:function(t){return It.prototype.attrTest.call(this,t)&&(2&this.state||!(2&this.state)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Pt(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),_(Lt,It,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[St]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||2&this.state)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),_(zt,Tt,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[wt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,r=t.distancee.time;if(this._input=t,!r||!n||12&t.eventType&&!i)this.reset();else if(1&t.eventType)this.reset(),this._timer=p((function(){this.state=8,this.tryEmit()}),e.time,this);else if(4&t.eventType)return 8;return jt},reset:function(){clearTimeout(this._timer)},emit:function(t){8===this.state&&(t&&4&t.eventType?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=d(),this.manager.emit(this.options.event,this._input)))}}),_(Rt,It,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[St]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||2&this.state)}}),_(Ft,It,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:30,pointers:1},getTouchAction:function(){return Nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return 30&n?e=t.overallVelocity:6&n?e=t.overallVelocityX:n&H&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&h(e)>this.options.velocity&&4&t.eventType},emit:function(t){var e=Pt(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),_(Ht,Tt,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[kt]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,r=t.distance0?e:"/";if(0===t.length)return[];if(t.charAt(0)!==n)throw new Error("Invalid pointer: "+t);for(var r=[""],i=0,o=1,a=t.length;o0?e:"/",o=0,a=t.length;o0?e:"/",r="";"number"===typeof t&&(t=t.toString());for(var i=0,o=t.length;i0?e:"/";return t.replace(/~0/g,"~").replace(/~1/g,n)}},30:function(t,e,n){"use strict";var r=n(2879),i=n(6717);t.exports=function(t){for(var e=Object.keys(t),n=t[""],o=0;o1&&"0"===t[0])throw n;var r=+t;if(isNaN(r))throw n;if(Math.abs(r).toString()!==t)throw n;if(r<0)throw n;if(r>e)throw n}}},6876:function(t,e,n){"use strict";var r=n(4649);function i(t,e,r,o){o(t,e,r),null!==t&&"object"===typeof t&&function(t,e){if(n.g.Set&&t instanceof Set){var r=0;t.forEach((function(t){e(t,r+=1)}))}else if(Array.isArray(t)||n.g.Map&&t instanceof Map)t.forEach(e);else{if("object"!==typeof t||null===t)throw new TypeError(t+"is not a structure");Object.keys(t).forEach((function(n){e(t[n],n)}))}}(t,(function(e,n){i(e,n,t,o)}))}t.exports=function(t,e){var n=Object.create(null);function o(t){for(var e in n)if(n[e]===t)return e}function a(t,e,i){var a=r(i?o(i):i,e);n[a]=t}i(t,void 0,void 0,(function(t,n,i){if(null!==t&&"object"===typeof t&&(void 0===i||void 0===n?a(t,[],""):a(t,n.toString(),i)),void 0===n||void 0===i)e(t,"");else{var s=o(i);e(t,r(s,n.toString()),i,s)}}))}},7179:function(t,e,n){"use strict";var r=n(4201),i=r.OBJECT,o=r.ARRAY,a=r.STRING,s=r.BOOLEAN,u=r.NUMBER,l=r.NULL,c=n(4049);function f(t){var e=[];return t.forEach((function(t){e.push(t)})),e}function h(t){var e=Object.create(null);return t.forEach((function(t,n){e[n]=t})),e}t.exports=function t(e,r){var d=c(e);if(d!==c(r))return!1;var p,v,g=d;switch(g){case u:return 0===e&&1/e===-1/0?0===r&&1/r===-1/0:e===r;case a:case l:case s:return e===r}if(g===o){if(n.g.Set&&(e instanceof Set&&(e=f(e)),r instanceof Set&&(r=f(r))),e.length!==r.length)return!1;for(p=0,v=e.length;pc))return!1;var h=u.get(t),d=u.get(e);if(h&&d)return h==e&&d==t;var p=-1,v=!0,g=2&n?new r:void 0;for(u.set(t,e),u.set(e,t);++p-1&&t%1==0&&t-1}},7608:function(t,e,n){var r=n(3333);t.exports=function(t,e){var n=this.__data__,i=r(n,t);return i<0?(++this.size,n.push([t,e])):n[i][1]=e,this}},3537:function(t,e,n){var r=n(7519),i=n(7669),o=n(9101);t.exports=function(){this.size=0,this.__data__={hash:new r,map:new(o||i),string:new r}}},3534:function(t,e,n){var r=n(7686);t.exports=function(t){var e=r(this,t).delete(t);return this.size-=e?1:0,e}},1374:function(t,e,n){var r=n(7686);t.exports=function(t){return r(this,t).get(t)}},126:function(t,e,n){var r=n(7686);t.exports=function(t){return r(this,t).has(t)}},4916:function(t,e,n){var r=n(7686);t.exports=function(t,e){var n=r(this,t),i=n.size;return n.set(t,e),this.size+=n.size==i?0:1,this}},2684:function(t){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}},1526:function(t,e,n){var r=n(1764)(Object,"create");t.exports=r},1382:function(t,e,n){var r=n(4827)(Object.keys,Object);t.exports=r},4426:function(t){t.exports=function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}},300:function(t,e,n){t=n.nmd(t);var r=n(1452),i=e&&!e.nodeType&&e,o=i&&t&&!t.nodeType&&t,a=o&&o.exports===i&&r.process,s=function(){try{var t=o&&o.require&&o.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(e){}}();t.exports=s},2077:function(t){var e=Object.prototype.toString;t.exports=function(t){return e.call(t)}},4827:function(t){t.exports=function(t,e){return function(n){return t(e(n))}}},5839:function(t,e,n){var r=n(1452),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},3519:function(t){t.exports=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this}},8391:function(t){t.exports=function(t){return this.__data__.has(t)}},4614:function(t){t.exports=function(t){var e=-1,n=Array(t.size);return t.forEach((function(t){n[++e]=t})),n}},2657:function(t,e,n){var r=n(7669);t.exports=function(){this.__data__=new r,this.size=0}},6510:function(t){t.exports=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n}},3777:function(t){t.exports=function(t){return this.__data__.get(t)}},8934:function(t){t.exports=function(t){return this.__data__.has(t)}},1386:function(t,e,n){var r=n(7669),i=n(9101),o=n(1638);t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!i||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new o(a)}return n.set(t,e),this.size=n.size,this}},3918:function(t){var e=Function.prototype.toString;t.exports=function(t){if(null!=t){try{return e.call(t)}catch(n){}try{return t+""}catch(n){}}return""}},840:function(t,e,n){var r=n(2334);t.exports=function(t){return r(t,5)}},7357:function(t){t.exports=function(t,e){return t===e||t!==t&&e!==e}},2912:function(t,e,n){var r=n(7194),i=n(3911),o=Object.prototype,a=o.hasOwnProperty,s=o.propertyIsEnumerable,u=r(function(){return arguments}())?r:function(t){return i(t)&&a.call(t,"callee")&&!s.call(t,"callee")};t.exports=u},4214:function(t){var e=Array.isArray;t.exports=e},867:function(t,e,n){var r=n(3070),i=n(6939);t.exports=function(t){return null!=t&&i(t.length)&&!r(t)}},7253:function(t,e,n){t=n.nmd(t);var r=n(5839),i=n(8383),o=e&&!e.nodeType&&e,a=o&&t&&!t.nodeType&&t,s=a&&a.exports===o?r.Buffer:void 0,u=(s?s.isBuffer:void 0)||i;t.exports=u},9553:function(t,e,n){var r=n(5695);t.exports=function(t,e){return r(t,e)}},3070:function(t,e,n){var r=n(3621),i=n(4050);t.exports=function(t){if(!i(t))return!1;var e=r(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},6939:function(t){t.exports=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},1649:function(t,e,n){var r=n(8088),i=n(3138),o=n(300),a=o&&o.isMap,s=a?i(a):r;t.exports=s},4050:function(t){t.exports=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},3911:function(t){t.exports=function(t){return null!=t&&"object"==typeof t}},983:function(t,e,n){var r=n(1556),i=n(3138),o=n(300),a=o&&o.isSet,s=a?i(a):r;t.exports=s},4474:function(t,e,n){var r=n(2994),i=n(3138),o=n(300),a=o&&o.isTypedArray,s=a?i(a):r;t.exports=s},6538:function(t,e,n){var r=n(8420),i=n(8357),o=n(867);t.exports=function(t){return o(t)?r(t):i(t)}},889:function(t,e,n){var r=n(8420),i=n(6064),o=n(867);t.exports=function(t){return o(t)?r(t,!0):i(t)}},8730:function(t,e,n){var r;t=n.nmd(t),function(){var i,o="Expected a function",a="__lodash_hash_undefined__",s="__lodash_placeholder__",u=16,l=32,c=64,f=128,h=256,d=1/0,p=9007199254740991,v=NaN,g=4294967295,y=[["ary",f],["bind",1],["bindKey",2],["curry",8],["curryRight",u],["flip",512],["partial",l],["partialRight",c],["rearg",h]],m="[object Arguments]",b="[object Array]",_="[object Boolean]",x="[object Date]",w="[object Error]",k="[object Function]",S="[object GeneratorFunction]",C="[object Map]",E="[object Number]",O="[object Object]",M="[object Promise]",j="[object RegExp]",T="[object Set]",D="[object String]",P="[object Symbol]",A="[object WeakMap]",I="[object ArrayBuffer]",N="[object DataView]",L="[object Float32Array]",z="[object Float64Array]",R="[object Int8Array]",F="[object Int16Array]",H="[object Int32Array]",V="[object Uint8Array]",B="[object Uint8ClampedArray]",W="[object Uint16Array]",U="[object Uint32Array]",q=/\b__p \+= '';/g,Y=/\b(__p \+=) '' \+/g,$=/(__e\(.*?\)|\b__t\)) \+\n'';/g,X=/&(?:amp|lt|gt|quot|#39);/g,K=/[&<>"']/g,Q=RegExp(X.source),Z=RegExp(K.source),G=/<%-([\s\S]+?)%>/g,J=/<%([\s\S]+?)%>/g,tt=/<%=([\s\S]+?)%>/g,et=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nt=/^\w*$/,rt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,it=/[\\^$.*+?()[\]{}|]/g,ot=RegExp(it.source),at=/^\s+/,st=/\s/,ut=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,lt=/\{\n\/\* \[wrapped with (.+)\] \*/,ct=/,? & /,ft=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ht=/[()=,{}\[\]\/\s]/,dt=/\\(\\)?/g,pt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,vt=/\w*$/,gt=/^[-+]0x[0-9a-f]+$/i,yt=/^0b[01]+$/i,mt=/^\[object .+?Constructor\]$/,bt=/^0o[0-7]+$/i,_t=/^(?:0|[1-9]\d*)$/,xt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,wt=/($^)/,kt=/['\n\r\u2028\u2029\\]/g,St="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Ct="\\u2700-\\u27bf",Et="a-z\\xdf-\\xf6\\xf8-\\xff",Ot="A-Z\\xc0-\\xd6\\xd8-\\xde",Mt="\\ufe0e\\ufe0f",jt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Tt="['\u2019]",Dt="[\\ud800-\\udfff]",Pt="["+jt+"]",At="["+St+"]",It="\\d+",Nt="[\\u2700-\\u27bf]",Lt="["+Et+"]",zt="[^\\ud800-\\udfff"+jt+It+Ct+Et+Ot+"]",Rt="\\ud83c[\\udffb-\\udfff]",Ft="[^\\ud800-\\udfff]",Ht="(?:\\ud83c[\\udde6-\\uddff]){2}",Vt="[\\ud800-\\udbff][\\udc00-\\udfff]",Bt="["+Ot+"]",Wt="(?:"+Lt+"|"+zt+")",Ut="(?:"+Bt+"|"+zt+")",qt="(?:['\u2019](?:d|ll|m|re|s|t|ve))?",Yt="(?:['\u2019](?:D|LL|M|RE|S|T|VE))?",$t="(?:"+At+"|"+Rt+")"+"?",Xt="[\\ufe0e\\ufe0f]?",Kt=Xt+$t+("(?:\\u200d(?:"+[Ft,Ht,Vt].join("|")+")"+Xt+$t+")*"),Qt="(?:"+[Nt,Ht,Vt].join("|")+")"+Kt,Zt="(?:"+[Ft+At+"?",At,Ht,Vt,Dt].join("|")+")",Gt=RegExp(Tt,"g"),Jt=RegExp(At,"g"),te=RegExp(Rt+"(?="+Rt+")|"+Zt+Kt,"g"),ee=RegExp([Bt+"?"+Lt+"+"+qt+"(?="+[Pt,Bt,"$"].join("|")+")",Ut+"+"+Yt+"(?="+[Pt,Bt+Wt,"$"].join("|")+")",Bt+"?"+Wt+"+"+qt,Bt+"+"+Yt,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",It,Qt].join("|"),"g"),ne=RegExp("[\\u200d\\ud800-\\udfff"+St+Mt+"]"),re=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ie=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],oe=-1,ae={};ae[L]=ae[z]=ae[R]=ae[F]=ae[H]=ae[V]=ae[B]=ae[W]=ae[U]=!0,ae[m]=ae[b]=ae[I]=ae[_]=ae[N]=ae[x]=ae[w]=ae[k]=ae[C]=ae[E]=ae[O]=ae[j]=ae[T]=ae[D]=ae[A]=!1;var se={};se[m]=se[b]=se[I]=se[N]=se[_]=se[x]=se[L]=se[z]=se[R]=se[F]=se[H]=se[C]=se[E]=se[O]=se[j]=se[T]=se[D]=se[P]=se[V]=se[B]=se[W]=se[U]=!0,se[w]=se[k]=se[A]=!1;var ue={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},le=parseFloat,ce=parseInt,fe="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,he="object"==typeof self&&self&&self.Object===Object&&self,de=fe||he||Function("return this")(),pe=e&&!e.nodeType&&e,ve=pe&&t&&!t.nodeType&&t,ge=ve&&ve.exports===pe,ye=ge&&fe.process,me=function(){try{var t=ve&&ve.require&&ve.require("util").types;return t||ye&&ye.binding&&ye.binding("util")}catch(e){}}(),be=me&&me.isArrayBuffer,_e=me&&me.isDate,xe=me&&me.isMap,we=me&&me.isRegExp,ke=me&&me.isSet,Se=me&&me.isTypedArray;function Ce(t,e,n){switch(n.length){case 0:return t.call(e);case 1:return t.call(e,n[0]);case 2:return t.call(e,n[0],n[1]);case 3:return t.call(e,n[0],n[1],n[2])}return t.apply(e,n)}function Ee(t,e,n,r){for(var i=-1,o=null==t?0:t.length;++i-1}function Pe(t,e,n){for(var r=-1,i=null==t?0:t.length;++r-1;);return n}function en(t,e){for(var n=t.length;n--&&Ve(e,t[n],0)>-1;);return n}function nn(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}var rn=Ye({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I","\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i","\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r","\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij","\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),on=Ye({"&":"&","<":"<",">":">",'"':""","'":"'"});function an(t){return"\\"+ue[t]}function sn(t){return ne.test(t)}function un(t){var e=-1,n=Array(t.size);return t.forEach((function(t,r){n[++e]=[r,t]})),n}function ln(t,e){return function(n){return t(e(n))}}function cn(t,e){for(var n=-1,r=t.length,i=0,o=[];++n",""":'"',"'":"'"});var yn=function t(e){var n=(e=null==e?de:yn.defaults(de.Object(),e,yn.pick(de,ie))).Array,r=e.Date,st=e.Error,St=e.Function,Ct=e.Math,Et=e.Object,Ot=e.RegExp,Mt=e.String,jt=e.TypeError,Tt=n.prototype,Dt=St.prototype,Pt=Et.prototype,At=e["__core-js_shared__"],It=Dt.toString,Nt=Pt.hasOwnProperty,Lt=0,zt=function(){var t=/[^.]+$/.exec(At&&At.keys&&At.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}(),Rt=Pt.toString,Ft=It.call(Et),Ht=de._,Vt=Ot("^"+It.call(Nt).replace(it,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Bt=ge?e.Buffer:i,Wt=e.Symbol,Ut=e.Uint8Array,qt=Bt?Bt.allocUnsafe:i,Yt=ln(Et.getPrototypeOf,Et),$t=Et.create,Xt=Pt.propertyIsEnumerable,Kt=Tt.splice,Qt=Wt?Wt.isConcatSpreadable:i,Zt=Wt?Wt.iterator:i,te=Wt?Wt.toStringTag:i,ne=function(){try{var t=ho(Et,"defineProperty");return t({},"",{}),t}catch(e){}}(),ue=e.clearTimeout!==de.clearTimeout&&e.clearTimeout,fe=r&&r.now!==de.Date.now&&r.now,he=e.setTimeout!==de.setTimeout&&e.setTimeout,pe=Ct.ceil,ve=Ct.floor,ye=Et.getOwnPropertySymbols,me=Bt?Bt.isBuffer:i,Re=e.isFinite,Ye=Tt.join,mn=ln(Et.keys,Et),bn=Ct.max,_n=Ct.min,xn=r.now,wn=e.parseInt,kn=Ct.random,Sn=Tt.reverse,Cn=ho(e,"DataView"),En=ho(e,"Map"),On=ho(e,"Promise"),Mn=ho(e,"Set"),jn=ho(e,"WeakMap"),Tn=ho(Et,"create"),Dn=jn&&new jn,Pn={},An=Ho(Cn),In=Ho(En),Nn=Ho(On),Ln=Ho(Mn),zn=Ho(jn),Rn=Wt?Wt.prototype:i,Fn=Rn?Rn.valueOf:i,Hn=Rn?Rn.toString:i;function Vn(t){if(rs(t)&&!Ya(t)&&!(t instanceof qn)){if(t instanceof Un)return t;if(Nt.call(t,"__wrapped__"))return Vo(t)}return new Un(t)}var Bn=function(){function t(){}return function(e){if(!ns(e))return{};if($t)return $t(e);t.prototype=e;var n=new t;return t.prototype=i,n}}();function Wn(){}function Un(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=i}function qn(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=g,this.__views__=[]}function Yn(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e=e?t:e)),t}function lr(t,e,n,r,o,a){var s,u=1&e,l=2&e,c=4&e;if(n&&(s=o?n(t,r,o,a):n(t)),s!==i)return s;if(!ns(t))return t;var f=Ya(t);if(f){if(s=function(t){var e=t.length,n=new t.constructor(e);e&&"string"==typeof t[0]&&Nt.call(t,"index")&&(n.index=t.index,n.input=t.input);return n}(t),!u)return Ti(t,s)}else{var h=go(t),d=h==k||h==S;if(Qa(t))return Si(t,u);if(h==O||h==m||d&&!o){if(s=l||d?{}:mo(t),!u)return l?function(t,e){return Di(t,vo(t),e)}(t,function(t,e){return t&&Di(e,Is(e),t)}(s,t)):function(t,e){return Di(t,po(t),e)}(t,or(s,t))}else{if(!se[h])return o?t:{};s=function(t,e,n){var r=t.constructor;switch(e){case I:return Ci(t);case _:case x:return new r(+t);case N:return function(t,e){var n=e?Ci(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.byteLength)}(t,n);case L:case z:case R:case F:case H:case V:case B:case W:case U:return Ei(t,n);case C:return new r;case E:case D:return new r(t);case j:return function(t){var e=new t.constructor(t.source,vt.exec(t));return e.lastIndex=t.lastIndex,e}(t);case T:return new r;case P:return i=t,Fn?Et(Fn.call(i)):{}}var i}(t,h,u)}}a||(a=new Qn);var p=a.get(t);if(p)return p;a.set(t,s),us(t)?t.forEach((function(r){s.add(lr(r,e,n,r,t,a))})):is(t)&&t.forEach((function(r,i){s.set(i,lr(r,e,n,i,t,a))}));var v=f?i:(c?l?oo:io:l?Is:As)(t);return Oe(v||t,(function(r,i){v&&(r=t[i=r]),nr(s,i,lr(r,e,n,i,t,a))})),s}function cr(t,e,n){var r=n.length;if(null==t)return!r;for(t=Et(t);r--;){var o=n[r],a=e[o],s=t[o];if(s===i&&!(o in t)||!a(s))return!1}return!0}function fr(t,e,n){if("function"!=typeof t)throw new jt(o);return Ao((function(){t.apply(i,n)}),e)}function hr(t,e,n,r){var i=-1,o=De,a=!0,s=t.length,u=[],l=e.length;if(!s)return u;n&&(e=Ae(e,Ze(n))),r?(o=Pe,a=!1):e.length>=200&&(o=Je,a=!1,e=new Kn(e));t:for(;++i-1},$n.prototype.set=function(t,e){var n=this.__data__,r=rr(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},Xn.prototype.clear=function(){this.size=0,this.__data__={hash:new Yn,map:new(En||$n),string:new Yn}},Xn.prototype.delete=function(t){var e=co(this,t).delete(t);return this.size-=e?1:0,e},Xn.prototype.get=function(t){return co(this,t).get(t)},Xn.prototype.has=function(t){return co(this,t).has(t)},Xn.prototype.set=function(t,e){var n=co(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},Kn.prototype.add=Kn.prototype.push=function(t){return this.__data__.set(t,a),this},Kn.prototype.has=function(t){return this.__data__.has(t)},Qn.prototype.clear=function(){this.__data__=new $n,this.size=0},Qn.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},Qn.prototype.get=function(t){return this.__data__.get(t)},Qn.prototype.has=function(t){return this.__data__.has(t)},Qn.prototype.set=function(t,e){var n=this.__data__;if(n instanceof $n){var r=n.__data__;if(!En||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new Xn(r)}return n.set(t,e),this.size=n.size,this};var dr=Ii(xr),pr=Ii(wr,!0);function vr(t,e){var n=!0;return dr(t,(function(t,r,i){return n=!!e(t,r,i)})),n}function gr(t,e,n){for(var r=-1,o=t.length;++r0&&n(s)?e>1?mr(s,e-1,n,r,i):Ie(i,s):r||(i[i.length]=s)}return i}var br=Ni(),_r=Ni(!0);function xr(t,e){return t&&br(t,e,As)}function wr(t,e){return t&&_r(t,e,As)}function kr(t,e){return Te(e,(function(e){return Ja(t[e])}))}function Sr(t,e){for(var n=0,r=(e=_i(e,t)).length;null!=t&&ne}function Mr(t,e){return null!=t&&Nt.call(t,e)}function jr(t,e){return null!=t&&e in Et(t)}function Tr(t,e,r){for(var o=r?Pe:De,a=t[0].length,s=t.length,u=s,l=n(s),c=1/0,f=[];u--;){var h=t[u];u&&e&&(h=Ae(h,Ze(e))),c=_n(h.length,c),l[u]=!r&&(e||a>=120&&h.length>=120)?new Kn(u&&h):i}h=t[0];var d=-1,p=l[0];t:for(;++d=s?u:u*("desc"==n[r]?-1:1)}return t.index-e.index}(t,e,n)}))}function Yr(t,e,n){for(var r=-1,i=e.length,o={};++r-1;)s!==t&&Kt.call(s,u,1),Kt.call(t,u,1);return t}function Xr(t,e){for(var n=t?e.length:0,r=n-1;n--;){var i=e[n];if(n==r||i!==o){var o=i;_o(i)?Kt.call(t,i,1):hi(t,i)}}return t}function Kr(t,e){return t+ve(kn()*(e-t+1))}function Qr(t,e){var n="";if(!t||e<1||e>p)return n;do{e%2&&(n+=t),(e=ve(e/2))&&(t+=t)}while(e);return n}function Zr(t,e){return Io(Mo(t,e,ou),t+"")}function Gr(t){return Gn(Bs(t))}function Jr(t,e){var n=Bs(t);return zo(n,ur(e,0,n.length))}function ti(t,e,n,r){if(!ns(t))return t;for(var o=-1,a=(e=_i(e,t)).length,s=a-1,u=t;null!=u&&++oo?0:o+e),(r=r>o?o:r)<0&&(r+=o),o=e>r?0:r-e>>>0,e>>>=0;for(var a=n(o);++i>>1,a=t[o];null!==a&&!cs(a)&&(n?a<=e:a=200){var l=e?null:Qi(t);if(l)return fn(l);a=!1,i=Je,u=new Kn}else u=e?[]:s;t:for(;++r=r?t:ii(t,e,n)}var ki=ue||function(t){return de.clearTimeout(t)};function Si(t,e){if(e)return t.slice();var n=t.length,r=qt?qt(n):new t.constructor(n);return t.copy(r),r}function Ci(t){var e=new t.constructor(t.byteLength);return new Ut(e).set(new Ut(t)),e}function Ei(t,e){var n=e?Ci(t.buffer):t.buffer;return new t.constructor(n,t.byteOffset,t.length)}function Oi(t,e){if(t!==e){var n=t!==i,r=null===t,o=t===t,a=cs(t),s=e!==i,u=null===e,l=e===e,c=cs(e);if(!u&&!c&&!a&&t>e||a&&s&&l&&!u&&!c||r&&s&&l||!n&&l||!o)return 1;if(!r&&!a&&!c&&t1?n[o-1]:i,s=o>2?n[2]:i;for(a=t.length>3&&"function"==typeof a?(o--,a):i,s&&xo(n[0],n[1],s)&&(a=o<3?i:a,o=1),e=Et(e);++r-1?o[a?e[s]:s]:i}}function Hi(t){return ro((function(e){var n=e.length,r=n,a=Un.prototype.thru;for(t&&e.reverse();r--;){var s=e[r];if("function"!=typeof s)throw new jt(o);if(a&&!u&&"wrapper"==so(s))var u=new Un([],!0)}for(r=u?r:n;++r1&&b.reverse(),d&&cu))return!1;var c=a.get(t),f=a.get(e);if(c&&f)return c==e&&f==t;var h=-1,d=!0,p=2&n?new Kn:i;for(a.set(t,e),a.set(e,t);++h-1&&t%1==0&&t1?"& ":"")+e[r],e=e.join(n>2?", ":" "),t.replace(ut,"{\n/* [wrapped with "+e+"] */\n")}(r,function(t,e){return Oe(y,(function(n){var r="_."+n[0];e&n[1]&&!De(t,r)&&t.push(r)})),t.sort()}(function(t){var e=t.match(lt);return e?e[1].split(ct):[]}(r),n)))}function Lo(t){var e=0,n=0;return function(){var r=xn(),o=16-(r-n);if(n=r,o>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(i,arguments)}}function zo(t,e){var n=-1,r=t.length,o=r-1;for(e=e===i?r:e;++n1?t[e-1]:i;return n="function"==typeof n?(t.pop(),n):i,sa(t,n)}));function pa(t){var e=Vn(t);return e.__chain__=!0,e}function va(t,e){return e(t)}var ga=ro((function(t){var e=t.length,n=e?t[0]:0,r=this.__wrapped__,o=function(e){return sr(e,t)};return!(e>1||this.__actions__.length)&&r instanceof qn&&_o(n)?((r=r.slice(n,+n+(e?1:0))).__actions__.push({func:va,args:[o],thisArg:i}),new Un(r,this.__chain__).thru((function(t){return e&&!t.length&&t.push(i),t}))):this.thru(o)}));var ya=Pi((function(t,e,n){Nt.call(t,n)?++t[n]:ar(t,n,1)}));var ma=Fi(qo),ba=Fi(Yo);function _a(t,e){return(Ya(t)?Oe:dr)(t,lo(e,3))}function xa(t,e){return(Ya(t)?Me:pr)(t,lo(e,3))}var wa=Pi((function(t,e,n){Nt.call(t,n)?t[n].push(e):ar(t,n,[e])}));var ka=Zr((function(t,e,r){var i=-1,o="function"==typeof e,a=Xa(t)?n(t.length):[];return dr(t,(function(t){a[++i]=o?Ce(e,t,r):Dr(t,e,r)})),a})),Sa=Pi((function(t,e,n){ar(t,n,e)}));function Ca(t,e){return(Ya(t)?Ae:Hr)(t,lo(e,3))}var Ea=Pi((function(t,e,n){t[n?0:1].push(e)}),(function(){return[[],[]]}));var Oa=Zr((function(t,e){if(null==t)return[];var n=e.length;return n>1&&xo(t,e[0],e[1])?e=[]:n>2&&xo(e[0],e[1],e[2])&&(e=[e[0]]),qr(t,mr(e,1),[])})),Ma=fe||function(){return de.Date.now()};function ja(t,e,n){return e=n?i:e,e=t&&null==e?t.length:e,Gi(t,f,i,i,i,i,e)}function Ta(t,e){var n;if("function"!=typeof e)throw new jt(o);return t=gs(t),function(){return--t>0&&(n=e.apply(this,arguments)),t<=1&&(e=i),n}}var Da=Zr((function(t,e,n){var r=1;if(n.length){var i=cn(n,uo(Da));r|=l}return Gi(t,r,e,n,i)})),Pa=Zr((function(t,e,n){var r=3;if(n.length){var i=cn(n,uo(Pa));r|=l}return Gi(e,r,t,n,i)}));function Aa(t,e,n){var r,a,s,u,l,c,f=0,h=!1,d=!1,p=!0;if("function"!=typeof t)throw new jt(o);function v(e){var n=r,o=a;return r=a=i,f=e,u=t.apply(o,n)}function g(t){return f=t,l=Ao(m,e),h?v(t):u}function y(t){var n=t-c;return c===i||n>=e||n<0||d&&t-f>=s}function m(){var t=Ma();if(y(t))return b(t);l=Ao(m,function(t){var n=e-(t-c);return d?_n(n,s-(t-f)):n}(t))}function b(t){return l=i,p&&r?v(t):(r=a=i,u)}function _(){var t=Ma(),n=y(t);if(r=arguments,a=this,c=t,n){if(l===i)return g(c);if(d)return ki(l),l=Ao(m,e),v(c)}return l===i&&(l=Ao(m,e)),u}return e=ms(e)||0,ns(n)&&(h=!!n.leading,s=(d="maxWait"in n)?bn(ms(n.maxWait)||0,e):s,p="trailing"in n?!!n.trailing:p),_.cancel=function(){l!==i&&ki(l),f=0,r=c=a=l=i},_.flush=function(){return l===i?u:b(Ma())},_}var Ia=Zr((function(t,e){return fr(t,1,e)})),Na=Zr((function(t,e,n){return fr(t,ms(e)||0,n)}));function La(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new jt(o);var n=function n(){var r=arguments,i=e?e.apply(this,r):r[0],o=n.cache;if(o.has(i))return o.get(i);var a=t.apply(this,r);return n.cache=o.set(i,a)||o,a};return n.cache=new(La.Cache||Xn),n}function za(t){if("function"!=typeof t)throw new jt(o);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}La.Cache=Xn;var Ra=xi((function(t,e){var n=(e=1==e.length&&Ya(e[0])?Ae(e[0],Ze(lo())):Ae(mr(e,1),Ze(lo()))).length;return Zr((function(r){for(var i=-1,o=_n(r.length,n);++i=e})),qa=Pr(function(){return arguments}())?Pr:function(t){return rs(t)&&Nt.call(t,"callee")&&!Xt.call(t,"callee")},Ya=n.isArray,$a=be?Ze(be):function(t){return rs(t)&&Er(t)==I};function Xa(t){return null!=t&&es(t.length)&&!Ja(t)}function Ka(t){return rs(t)&&Xa(t)}var Qa=me||mu,Za=_e?Ze(_e):function(t){return rs(t)&&Er(t)==x};function Ga(t){if(!rs(t))return!1;var e=Er(t);return e==w||"[object DOMException]"==e||"string"==typeof t.message&&"string"==typeof t.name&&!as(t)}function Ja(t){if(!ns(t))return!1;var e=Er(t);return e==k||e==S||"[object AsyncFunction]"==e||"[object Proxy]"==e}function ts(t){return"number"==typeof t&&t==gs(t)}function es(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=p}function ns(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function rs(t){return null!=t&&"object"==typeof t}var is=xe?Ze(xe):function(t){return rs(t)&&go(t)==C};function os(t){return"number"==typeof t||rs(t)&&Er(t)==E}function as(t){if(!rs(t)||Er(t)!=O)return!1;var e=Yt(t);if(null===e)return!0;var n=Nt.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&It.call(n)==Ft}var ss=we?Ze(we):function(t){return rs(t)&&Er(t)==j};var us=ke?Ze(ke):function(t){return rs(t)&&go(t)==T};function ls(t){return"string"==typeof t||!Ya(t)&&rs(t)&&Er(t)==D}function cs(t){return"symbol"==typeof t||rs(t)&&Er(t)==P}var fs=Se?Ze(Se):function(t){return rs(t)&&es(t.length)&&!!ae[Er(t)]};var hs=$i(Fr),ds=$i((function(t,e){return t<=e}));function ps(t){if(!t)return[];if(Xa(t))return ls(t)?pn(t):Ti(t);if(Zt&&t[Zt])return function(t){for(var e,n=[];!(e=t.next()).done;)n.push(e.value);return n}(t[Zt]());var e=go(t);return(e==C?un:e==T?fn:Bs)(t)}function vs(t){return t?(t=ms(t))===d||t===-1/0?17976931348623157e292*(t<0?-1:1):t===t?t:0:0===t?t:0}function gs(t){var e=vs(t),n=e%1;return e===e?n?e-n:e:0}function ys(t){return t?ur(gs(t),0,g):0}function ms(t){if("number"==typeof t)return t;if(cs(t))return v;if(ns(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=ns(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=Qe(t);var n=yt.test(t);return n||bt.test(t)?ce(t.slice(2),n?2:8):gt.test(t)?v:+t}function bs(t){return Di(t,Is(t))}function _s(t){return null==t?"":ci(t)}var xs=Ai((function(t,e){if(Co(e)||Xa(e))Di(e,As(e),t);else for(var n in e)Nt.call(e,n)&&nr(t,n,e[n])})),ws=Ai((function(t,e){Di(e,Is(e),t)})),ks=Ai((function(t,e,n,r){Di(e,Is(e),t,r)})),Ss=Ai((function(t,e,n,r){Di(e,As(e),t,r)})),Cs=ro(sr);var Es=Zr((function(t,e){t=Et(t);var n=-1,r=e.length,o=r>2?e[2]:i;for(o&&xo(e[0],e[1],o)&&(r=1);++n1),e})),Di(t,oo(t),n),r&&(n=lr(n,7,eo));for(var i=e.length;i--;)hi(n,e[i]);return n}));var Rs=ro((function(t,e){return null==t?{}:function(t,e){return Yr(t,e,(function(e,n){return js(t,n)}))}(t,e)}));function Fs(t,e){if(null==t)return{};var n=Ae(oo(t),(function(t){return[t]}));return e=lo(e),Yr(t,n,(function(t,n){return e(t,n[0])}))}var Hs=Zi(As),Vs=Zi(Is);function Bs(t){return null==t?[]:Ge(t,As(t))}var Ws=zi((function(t,e,n){return e=e.toLowerCase(),t+(n?Us(e):e)}));function Us(t){return Gs(_s(t).toLowerCase())}function qs(t){return(t=_s(t))&&t.replace(xt,rn).replace(Jt,"")}var Ys=zi((function(t,e,n){return t+(n?"-":"")+e.toLowerCase()})),$s=zi((function(t,e,n){return t+(n?" ":"")+e.toLowerCase()})),Xs=Li("toLowerCase");var Ks=zi((function(t,e,n){return t+(n?"_":"")+e.toLowerCase()}));var Qs=zi((function(t,e,n){return t+(n?" ":"")+Gs(e)}));var Zs=zi((function(t,e,n){return t+(n?" ":"")+e.toUpperCase()})),Gs=Li("toUpperCase");function Js(t,e,n){return t=_s(t),(e=n?i:e)===i?function(t){return re.test(t)}(t)?function(t){return t.match(ee)||[]}(t):function(t){return t.match(ft)||[]}(t):t.match(e)||[]}var tu=Zr((function(t,e){try{return Ce(t,i,e)}catch(n){return Ga(n)?n:new st(n)}})),eu=ro((function(t,e){return Oe(e,(function(e){e=Fo(e),ar(t,e,Da(t[e],t))})),t}));function nu(t){return function(){return t}}var ru=Hi(),iu=Hi(!0);function ou(t){return t}function au(t){return Lr("function"==typeof t?t:lr(t,1))}var su=Zr((function(t,e){return function(n){return Dr(n,t,e)}})),uu=Zr((function(t,e){return function(n){return Dr(t,n,e)}}));function lu(t,e,n){var r=As(e),i=kr(e,r);null!=n||ns(e)&&(i.length||!r.length)||(n=e,e=t,t=this,i=kr(e,As(e)));var o=!(ns(n)&&"chain"in n)||!!n.chain,a=Ja(t);return Oe(i,(function(n){var r=e[n];t[n]=r,a&&(t.prototype[n]=function(){var e=this.__chain__;if(o||e){var n=t(this.__wrapped__),i=n.__actions__=Ti(this.__actions__);return i.push({func:r,args:arguments,thisArg:t}),n.__chain__=e,n}return r.apply(t,Ie([this.value()],arguments))})})),t}function cu(){}var fu=Ui(Ae),hu=Ui(je),du=Ui(ze);function pu(t){return wo(t)?qe(Fo(t)):function(t){return function(e){return Sr(e,t)}}(t)}var vu=Yi(),gu=Yi(!0);function yu(){return[]}function mu(){return!1}var bu=Wi((function(t,e){return t+e}),0),_u=Ki("ceil"),xu=Wi((function(t,e){return t/e}),1),wu=Ki("floor");var ku=Wi((function(t,e){return t*e}),1),Su=Ki("round"),Cu=Wi((function(t,e){return t-e}),0);return Vn.after=function(t,e){if("function"!=typeof e)throw new jt(o);return t=gs(t),function(){if(--t<1)return e.apply(this,arguments)}},Vn.ary=ja,Vn.assign=xs,Vn.assignIn=ws,Vn.assignInWith=ks,Vn.assignWith=Ss,Vn.at=Cs,Vn.before=Ta,Vn.bind=Da,Vn.bindAll=eu,Vn.bindKey=Pa,Vn.castArray=function(){if(!arguments.length)return[];var t=arguments[0];return Ya(t)?t:[t]},Vn.chain=pa,Vn.chunk=function(t,e,r){e=(r?xo(t,e,r):e===i)?1:bn(gs(e),0);var o=null==t?0:t.length;if(!o||e<1)return[];for(var a=0,s=0,u=n(pe(o/e));ao?0:o+n),(r=r===i||r>o?o:gs(r))<0&&(r+=o),r=n>r?0:ys(r);n>>0)?(t=_s(t))&&("string"==typeof e||null!=e&&!ss(e))&&!(e=ci(e))&&sn(t)?wi(pn(t),0,n):t.split(e,n):[]},Vn.spread=function(t,e){if("function"!=typeof t)throw new jt(o);return e=null==e?0:bn(gs(e),0),Zr((function(n){var r=n[e],i=wi(n,0,e);return r&&Ie(i,r),Ce(t,this,i)}))},Vn.tail=function(t){var e=null==t?0:t.length;return e?ii(t,1,e):[]},Vn.take=function(t,e,n){return t&&t.length?ii(t,0,(e=n||e===i?1:gs(e))<0?0:e):[]},Vn.takeRight=function(t,e,n){var r=null==t?0:t.length;return r?ii(t,(e=r-(e=n||e===i?1:gs(e)))<0?0:e,r):[]},Vn.takeRightWhile=function(t,e){return t&&t.length?pi(t,lo(e,3),!1,!0):[]},Vn.takeWhile=function(t,e){return t&&t.length?pi(t,lo(e,3)):[]},Vn.tap=function(t,e){return e(t),t},Vn.throttle=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new jt(o);return ns(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),Aa(t,e,{leading:r,maxWait:e,trailing:i})},Vn.thru=va,Vn.toArray=ps,Vn.toPairs=Hs,Vn.toPairsIn=Vs,Vn.toPath=function(t){return Ya(t)?Ae(t,Fo):cs(t)?[t]:Ti(Ro(_s(t)))},Vn.toPlainObject=bs,Vn.transform=function(t,e,n){var r=Ya(t),i=r||Qa(t)||fs(t);if(e=lo(e,4),null==n){var o=t&&t.constructor;n=i?r?new o:[]:ns(t)&&Ja(o)?Bn(Yt(t)):{}}return(i?Oe:xr)(t,(function(t,r,i){return e(n,t,r,i)})),n},Vn.unary=function(t){return ja(t,1)},Vn.union=ra,Vn.unionBy=ia,Vn.unionWith=oa,Vn.uniq=function(t){return t&&t.length?fi(t):[]},Vn.uniqBy=function(t,e){return t&&t.length?fi(t,lo(e,2)):[]},Vn.uniqWith=function(t,e){return e="function"==typeof e?e:i,t&&t.length?fi(t,i,e):[]},Vn.unset=function(t,e){return null==t||hi(t,e)},Vn.unzip=aa,Vn.unzipWith=sa,Vn.update=function(t,e,n){return null==t?t:di(t,e,bi(n))},Vn.updateWith=function(t,e,n,r){return r="function"==typeof r?r:i,null==t?t:di(t,e,bi(n),r)},Vn.values=Bs,Vn.valuesIn=function(t){return null==t?[]:Ge(t,Is(t))},Vn.without=ua,Vn.words=Js,Vn.wrap=function(t,e){return Fa(bi(e),t)},Vn.xor=la,Vn.xorBy=ca,Vn.xorWith=fa,Vn.zip=ha,Vn.zipObject=function(t,e){return yi(t||[],e||[],nr)},Vn.zipObjectDeep=function(t,e){return yi(t||[],e||[],ti)},Vn.zipWith=da,Vn.entries=Hs,Vn.entriesIn=Vs,Vn.extend=ws,Vn.extendWith=ks,lu(Vn,Vn),Vn.add=bu,Vn.attempt=tu,Vn.camelCase=Ws,Vn.capitalize=Us,Vn.ceil=_u,Vn.clamp=function(t,e,n){return n===i&&(n=e,e=i),n!==i&&(n=(n=ms(n))===n?n:0),e!==i&&(e=(e=ms(e))===e?e:0),ur(ms(t),e,n)},Vn.clone=function(t){return lr(t,4)},Vn.cloneDeep=function(t){return lr(t,5)},Vn.cloneDeepWith=function(t,e){return lr(t,5,e="function"==typeof e?e:i)},Vn.cloneWith=function(t,e){return lr(t,4,e="function"==typeof e?e:i)},Vn.conformsTo=function(t,e){return null==e||cr(t,e,As(e))},Vn.deburr=qs,Vn.defaultTo=function(t,e){return null==t||t!==t?e:t},Vn.divide=xu,Vn.endsWith=function(t,e,n){t=_s(t),e=ci(e);var r=t.length,o=n=n===i?r:ur(gs(n),0,r);return(n-=e.length)>=0&&t.slice(n,o)==e},Vn.eq=Ba,Vn.escape=function(t){return(t=_s(t))&&Z.test(t)?t.replace(K,on):t},Vn.escapeRegExp=function(t){return(t=_s(t))&&ot.test(t)?t.replace(it,"\\$&"):t},Vn.every=function(t,e,n){var r=Ya(t)?je:vr;return n&&xo(t,e,n)&&(e=i),r(t,lo(e,3))},Vn.find=ma,Vn.findIndex=qo,Vn.findKey=function(t,e){return Fe(t,lo(e,3),xr)},Vn.findLast=ba,Vn.findLastIndex=Yo,Vn.findLastKey=function(t,e){return Fe(t,lo(e,3),wr)},Vn.floor=wu,Vn.forEach=_a,Vn.forEachRight=xa,Vn.forIn=function(t,e){return null==t?t:br(t,lo(e,3),Is)},Vn.forInRight=function(t,e){return null==t?t:_r(t,lo(e,3),Is)},Vn.forOwn=function(t,e){return t&&xr(t,lo(e,3))},Vn.forOwnRight=function(t,e){return t&&wr(t,lo(e,3))},Vn.get=Ms,Vn.gt=Wa,Vn.gte=Ua,Vn.has=function(t,e){return null!=t&&yo(t,e,Mr)},Vn.hasIn=js,Vn.head=Xo,Vn.identity=ou,Vn.includes=function(t,e,n,r){t=Xa(t)?t:Bs(t),n=n&&!r?gs(n):0;var i=t.length;return n<0&&(n=bn(i+n,0)),ls(t)?n<=i&&t.indexOf(e,n)>-1:!!i&&Ve(t,e,n)>-1},Vn.indexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var i=null==n?0:gs(n);return i<0&&(i=bn(r+i,0)),Ve(t,e,i)},Vn.inRange=function(t,e,n){return e=vs(e),n===i?(n=e,e=0):n=vs(n),function(t,e,n){return t>=_n(e,n)&&t=-9007199254740991&&t<=p},Vn.isSet=us,Vn.isString=ls,Vn.isSymbol=cs,Vn.isTypedArray=fs,Vn.isUndefined=function(t){return t===i},Vn.isWeakMap=function(t){return rs(t)&&go(t)==A},Vn.isWeakSet=function(t){return rs(t)&&"[object WeakSet]"==Er(t)},Vn.join=function(t,e){return null==t?"":Ye.call(t,e)},Vn.kebabCase=Ys,Vn.last=Go,Vn.lastIndexOf=function(t,e,n){var r=null==t?0:t.length;if(!r)return-1;var o=r;return n!==i&&(o=(o=gs(n))<0?bn(r+o,0):_n(o,r-1)),e===e?function(t,e,n){for(var r=n+1;r--;)if(t[r]===e)return r;return r}(t,e,o):He(t,We,o,!0)},Vn.lowerCase=$s,Vn.lowerFirst=Xs,Vn.lt=hs,Vn.lte=ds,Vn.max=function(t){return t&&t.length?gr(t,ou,Or):i},Vn.maxBy=function(t,e){return t&&t.length?gr(t,lo(e,2),Or):i},Vn.mean=function(t){return Ue(t,ou)},Vn.meanBy=function(t,e){return Ue(t,lo(e,2))},Vn.min=function(t){return t&&t.length?gr(t,ou,Fr):i},Vn.minBy=function(t,e){return t&&t.length?gr(t,lo(e,2),Fr):i},Vn.stubArray=yu,Vn.stubFalse=mu,Vn.stubObject=function(){return{}},Vn.stubString=function(){return""},Vn.stubTrue=function(){return!0},Vn.multiply=ku,Vn.nth=function(t,e){return t&&t.length?Ur(t,gs(e)):i},Vn.noConflict=function(){return de._===this&&(de._=Ht),this},Vn.noop=cu,Vn.now=Ma,Vn.pad=function(t,e,n){t=_s(t);var r=(e=gs(e))?dn(t):0;if(!e||r>=e)return t;var i=(e-r)/2;return qi(ve(i),n)+t+qi(pe(i),n)},Vn.padEnd=function(t,e,n){t=_s(t);var r=(e=gs(e))?dn(t):0;return e&&re){var r=t;t=e,e=r}if(n||t%1||e%1){var o=kn();return _n(t+o*(e-t+le("1e-"+((o+"").length-1))),e)}return Kr(t,e)},Vn.reduce=function(t,e,n){var r=Ya(t)?Ne:$e,i=arguments.length<3;return r(t,lo(e,4),n,i,dr)},Vn.reduceRight=function(t,e,n){var r=Ya(t)?Le:$e,i=arguments.length<3;return r(t,lo(e,4),n,i,pr)},Vn.repeat=function(t,e,n){return e=(n?xo(t,e,n):e===i)?1:gs(e),Qr(_s(t),e)},Vn.replace=function(){var t=arguments,e=_s(t[0]);return t.length<3?e:e.replace(t[1],t[2])},Vn.result=function(t,e,n){var r=-1,o=(e=_i(e,t)).length;for(o||(o=1,t=i);++rp)return[];var n=g,r=_n(t,g);e=lo(e),t-=g;for(var i=Ke(r,e);++n=a)return t;var u=n-dn(r);if(u<1)return r;var l=s?wi(s,0,u).join(""):t.slice(0,u);if(o===i)return l+r;if(s&&(u+=l.length-u),ss(o)){if(t.slice(u).search(o)){var c,f=l;for(o.global||(o=Ot(o.source,_s(vt.exec(o))+"g")),o.lastIndex=0;c=o.exec(f);)var h=c.index;l=l.slice(0,h===i?u:h)}}else if(t.indexOf(ci(o),u)!=u){var d=l.lastIndexOf(o);d>-1&&(l=l.slice(0,d))}return l+r},Vn.unescape=function(t){return(t=_s(t))&&Q.test(t)?t.replace(X,gn):t},Vn.uniqueId=function(t){var e=++Lt;return _s(t)+e},Vn.upperCase=Zs,Vn.upperFirst=Gs,Vn.each=_a,Vn.eachRight=xa,Vn.first=Xo,lu(Vn,function(){var t={};return xr(Vn,(function(e,n){Nt.call(Vn.prototype,n)||(t[n]=e)})),t}(),{chain:!1}),Vn.VERSION="4.17.21",Oe(["bind","bindKey","curry","curryRight","partial","partialRight"],(function(t){Vn[t].placeholder=Vn})),Oe(["drop","take"],(function(t,e){qn.prototype[t]=function(n){n=n===i?1:bn(gs(n),0);var r=this.__filtered__&&!e?new qn(this):this.clone();return r.__filtered__?r.__takeCount__=_n(n,r.__takeCount__):r.__views__.push({size:_n(n,g),type:t+(r.__dir__<0?"Right":"")}),r},qn.prototype[t+"Right"]=function(e){return this.reverse()[t](e).reverse()}})),Oe(["filter","map","takeWhile"],(function(t,e){var n=e+1,r=1==n||3==n;qn.prototype[t]=function(t){var e=this.clone();return e.__iteratees__.push({iteratee:lo(t,3),type:n}),e.__filtered__=e.__filtered__||r,e}})),Oe(["head","last"],(function(t,e){var n="take"+(e?"Right":"");qn.prototype[t]=function(){return this[n](1).value()[0]}})),Oe(["initial","tail"],(function(t,e){var n="drop"+(e?"":"Right");qn.prototype[t]=function(){return this.__filtered__?new qn(this):this[n](1)}})),qn.prototype.compact=function(){return this.filter(ou)},qn.prototype.find=function(t){return this.filter(t).head()},qn.prototype.findLast=function(t){return this.reverse().find(t)},qn.prototype.invokeMap=Zr((function(t,e){return"function"==typeof t?new qn(this):this.map((function(n){return Dr(n,t,e)}))})),qn.prototype.reject=function(t){return this.filter(za(lo(t)))},qn.prototype.slice=function(t,e){t=gs(t);var n=this;return n.__filtered__&&(t>0||e<0)?new qn(n):(t<0?n=n.takeRight(-t):t&&(n=n.drop(t)),e!==i&&(n=(e=gs(e))<0?n.dropRight(-e):n.take(e-t)),n)},qn.prototype.takeRightWhile=function(t){return this.reverse().takeWhile(t).reverse()},qn.prototype.toArray=function(){return this.take(g)},xr(qn.prototype,(function(t,e){var n=/^(?:filter|find|map|reject)|While$/.test(e),r=/^(?:head|last)$/.test(e),o=Vn[r?"take"+("last"==e?"Right":""):e],a=r||/^find/.test(e);o&&(Vn.prototype[e]=function(){var e=this.__wrapped__,s=r?[1]:arguments,u=e instanceof qn,l=s[0],c=u||Ya(e),f=function(t){var e=o.apply(Vn,Ie([t],s));return r&&h?e[0]:e};c&&n&&"function"==typeof l&&1!=l.length&&(u=c=!1);var h=this.__chain__,d=!!this.__actions__.length,p=a&&!h,v=u&&!d;if(!a&&c){e=v?e:new qn(this);var g=t.apply(e,s);return g.__actions__.push({func:va,args:[f],thisArg:i}),new Un(g,h)}return p&&v?t.apply(this,s):(g=this.thru(f),p?r?g.value()[0]:g.value():g)})})),Oe(["pop","push","shift","sort","splice","unshift"],(function(t){var e=Tt[t],n=/^(?:push|sort|unshift)$/.test(t)?"tap":"thru",r=/^(?:pop|shift)$/.test(t);Vn.prototype[t]=function(){var t=arguments;if(r&&!this.__chain__){var i=this.value();return e.apply(Ya(i)?i:[],t)}return this[n]((function(n){return e.apply(Ya(n)?n:[],t)}))}})),xr(qn.prototype,(function(t,e){var n=Vn[e];if(n){var r=n.name+"";Nt.call(Pn,r)||(Pn[r]=[]),Pn[r].push({name:e,func:n})}})),Pn[Vi(i,2).name]=[{name:"wrapper",func:i}],qn.prototype.clone=function(){var t=new qn(this.__wrapped__);return t.__actions__=Ti(this.__actions__),t.__dir__=this.__dir__,t.__filtered__=this.__filtered__,t.__iteratees__=Ti(this.__iteratees__),t.__takeCount__=this.__takeCount__,t.__views__=Ti(this.__views__),t},qn.prototype.reverse=function(){if(this.__filtered__){var t=new qn(this);t.__dir__=-1,t.__filtered__=!0}else(t=this.clone()).__dir__*=-1;return t},qn.prototype.value=function(){var t=this.__wrapped__.value(),e=this.__dir__,n=Ya(t),r=e<0,i=n?t.length:0,o=function(t,e,n){var r=-1,i=n.length;for(;++r=this.__values__.length;return{done:t,value:t?i:this.__values__[this.__index__++]}},Vn.prototype.plant=function(t){for(var e,n=this;n instanceof Wn;){var r=Vo(n);r.__index__=0,r.__values__=i,e?o.__wrapped__=r:e=r;var o=r;n=n.__wrapped__}return o.__wrapped__=t,e},Vn.prototype.reverse=function(){var t=this.__wrapped__;if(t instanceof qn){var e=t;return this.__actions__.length&&(e=new qn(this)),(e=e.reverse()).__actions__.push({func:va,args:[na],thisArg:i}),new Un(e,this.__chain__)}return this.thru(na)},Vn.prototype.toJSON=Vn.prototype.valueOf=Vn.prototype.value=function(){return vi(this.__wrapped__,this.__actions__)},Vn.prototype.first=Vn.prototype.head,Zt&&(Vn.prototype[Zt]=function(){return this}),Vn}();de._=yn,(r=function(){return yn}.call(e,n,e,t))===i||(t.exports=r)}.call(this)},8849:function(t){t.exports=function(){return[]}},8383:function(t){t.exports=function(){return!1}},3422:function(t,e,n){"use strict";var r=n(9452);function i(){}function o(){}o.resetWarningCache=i,t.exports=function(){function t(t,e,n,i,o,a){if(a!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function e(){return t}t.isRequired=t;var n={array:t,bool:t,func:t,number:t,object:t,string:t,symbol:t,any:t,arrayOf:e,element:t,elementType:t,instanceOf:e,node:t,objectOf:e,oneOf:e,oneOfType:e,shape:e,exact:e,checkPropTypes:o,resetWarningCache:i};return n.PropTypes=n,n}},8731:function(t,e,n){t.exports=n(3422)()},9452:function(t){"use strict";t.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},9772:function(t,e,n){"use strict";var r=n(9867),i=n(2882);function o(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,n=1;n