mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2026-01-01 14:19:20 +03:00
Compare commits
18 Commits
Muse.16.16
...
Muse.16.16
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9455f70ff | ||
|
|
b5b76480e4 | ||
|
|
e6744deab8 | ||
|
|
94baf86989 | ||
|
|
0c856a37c1 | ||
|
|
d5f28375ce | ||
|
|
7ea5a93647 | ||
|
|
ca38a14420 | ||
|
|
9ebe717e74 | ||
|
|
12347bdb29 | ||
|
|
a42c9ff860 | ||
|
|
e67413697c | ||
|
|
c4b797e54f | ||
|
|
9971fb0ff3 | ||
|
|
8280bc4903 | ||
|
|
adc6a86725 | ||
|
|
61f58f9a52 | ||
|
|
e3650413f5 |
15
CHANGELOG
15
CHANGELOG
@@ -1,3 +1,18 @@
|
||||
2023-10-25
|
||||
- fix vorbis code close
|
||||
|
||||
2023-10-23
|
||||
- fix Spotify track insertion
|
||||
- [WEB] Allow running without LMS with option "Audio/Disable Squeezelite"
|
||||
|
||||
2023-10.07
|
||||
- catchup with official cspot
|
||||
|
||||
2023-10-06
|
||||
- fix cspot PREV on first track, NEXT on last track and normal ending
|
||||
- use DMA_AUTO for SPI
|
||||
- cspot share same time log
|
||||
|
||||
2023-10-06
|
||||
- Fix bootswatch bug that caused difficult to read UI ( issue #319)
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[](https://github.com/sle118/squeezelite-esp32/actions/workflows/Platform_build.yml)
|
||||
# Squeezelite-esp32
|
||||
|
||||
## Forewords
|
||||
**More and more people seems to use this without a LMS server, just for BT, AirPlay or Spotify. It's fine but understand that squeezeliteESP32 is primarily a Logitech Media Server player and has been designed around that concept. All the others are add-ons stitched to it, so other modes have their shortcomings. So please make sure you read [this](#Additional-configuration-notes-from-the-Web-UI) before opening an issue**
|
||||
## What is this?
|
||||
Squeezelite-esp32 is an audio software suite made to run on espressif's esp32 and esp32-s3 wifi (b/g/n) and bluetooth chipsets. It offers the following capabilities
|
||||
|
||||
@@ -186,7 +187,7 @@ bck=<gpio>,ws=<gpio>,do=<gpio>[,mck=0|1|2][,mute=<gpio>[:0|1][,model=TAS57xx|TAS
|
||||
```
|
||||
if "model" is not set or is not recognized, then default "I2S" is used. The option "mck" is used for some codecs that require a master clock (although they should not). By default GPIO0 is used as MCLK and only recent builds (post mid-2023) can use 1 or 2. Also be aware that this cannot coexit with RMII Ethernet (see ethernet section below). I2C parameters are optional and only needed if your DAC requires an I2C control (See 'dac_controlset' below). Note that "i2c" parameters are decimal, hex notation is not allowed.
|
||||
|
||||
So far, TAS57xx, TAS5713, AC101, WM8978 and ES8388 are recognized models where the proper init sequence/volume/power controls are sent. For other codecs that might require an I2C commands, please use the parameter "dac_controlset" that allows definition of simple commands to be sent over i2c for init, power, speakder and headset on and off using a JSON syntax:
|
||||
So far, TAS57xx, TAS5713, AC101, WM8978 and ES8388 are recognized models where the proper init sequence/volume/power controls are sent. For other codecs that might require an I2C commands, please use the parameter "dac_controlset" that allows definition of simple commands to be sent over i2c for init, power, speaker and headset on and off using a JSON syntax:
|
||||
```json
|
||||
{ <command>: [ {"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}, ... {{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"} ],
|
||||
<command>: [ {"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"}, ... {{"reg":<register>,"val":<value>,"mode":<nothing>|"or"|"and"} ],
|
||||
@@ -196,6 +197,8 @@ Where `<command>` is one of init, poweron, poweroff, speakeron, speakeroff, head
|
||||
|
||||
This is standard JSON notation, so if you are not familiar with it, Google is your best friend. Be aware that the '...' means you can have as many entries as you want, it's not part of the syntax. Every section is optional, but it does not make sense to set i2c in the 'dac_config' parameter and not setting anything here. The parameter 'mode' allows to *or* the register with the value or to *and* it. Don't set 'mode' if you simply want to write. The 'val parameter can be an array [v1, v2,...] to write a serie of bytes in a single i2c burst (in that case 'mode' is ignored). **Note that all values must be decimal**. You can use a validator like [this](https://jsonlint.com) to verify your syntax
|
||||
|
||||
The 'power' command is used when powering on/off the DAC after the idle period (see -C option of squeezelite) and the 'speaker/headset' commands are sent when switching between speakers and headsets (see headset jack detection).
|
||||
|
||||
NB: For named configurations ((SqueezeAMP, Muse ... all except I2S), all this is ignored. For know codecs, the built-in sequences can be overwritten using dac_controlset
|
||||
|
||||
**Please note that you can not use the same GPIO or port as the I2C.**
|
||||
@@ -274,7 +277,7 @@ GPIO can be set to GND provide or Vcc at boot. This is convenient to power devic
|
||||
|
||||
The `<amp>` parameter can use used to assign a GPIO that will be set to active level (default 1) when playback starts. It will be reset when squeezelite becomes idle. The idle timeout is set on the squeezelite command line through `-C <timeout>`
|
||||
|
||||
The `<power>` parameter can use used to assign a GPIO that will be set to active level (default 1) when player is powered on and reset when powered off
|
||||
The `<power>` parameter can use used to assign a GPIO that will be set to active level (default 1) when player is powered on and reset when powered off (in LMS, does not apply to AirPlay, Spotify or BT).
|
||||
|
||||
If you have an audio jack that supports insertion (use :0 or :1 to set the level when inserted), you can specify which GPIO it's connected to. Using the parameter jack_mutes_amp allows to mute the amp when headset (e.g.) is inserted.
|
||||
|
||||
|
||||
@@ -477,7 +477,7 @@ static int do_spiconfig_cmd(int argc, char **argv){
|
||||
|
||||
if(!nerrors){
|
||||
fprintf(f,"Configuring SPI data=%d clock=%d host=%u dc: %d\n", spi_config.mosi_io_num, spi_config.sclk_io_num, host, dc);
|
||||
err=spi_bus_initialize( host, &spi_config, 1 );
|
||||
err=spi_bus_initialize( host, &spi_config, SPI_DMA_CH_AUTO );
|
||||
if(err!=ESP_OK){
|
||||
if(err==ESP_ERR_INVALID_STATE){
|
||||
// if user is changing the host number, we need to try freeing both hosts
|
||||
@@ -485,7 +485,7 @@ static int do_spiconfig_cmd(int argc, char **argv){
|
||||
fprintf(f,"SPI bus init failed. Please clear SPI configuration, restart the device and try again. %s\n", esp_err_to_name(err));
|
||||
nerrors++;
|
||||
}
|
||||
else if((err=spi_bus_initialize( host, &spi_config, 1 ))!=ESP_OK){
|
||||
else if((err=spi_bus_initialize( host, &spi_config, SPI_DMA_CH_AUTO ))!=ESP_OK){
|
||||
fprintf(f,"Failed to initialize SPI Bus. %s\n", esp_err_to_name(err));
|
||||
nerrors++;
|
||||
}
|
||||
|
||||
@@ -380,7 +380,7 @@ void services_init(void) {
|
||||
ESP_LOGI(TAG,"Configuring SPI mosi:%d miso:%d clk:%d host:%u dc:%d", spi_config->mosi_io_num, spi_config->miso_io_num, spi_config->sclk_io_num, spi_system_host, spi_system_dc_gpio);
|
||||
|
||||
if (spi_config->mosi_io_num != -1 && spi_config->sclk_io_num != -1) {
|
||||
spi_bus_initialize( spi_system_host, spi_config, 1 );
|
||||
spi_bus_initialize( spi_system_host, spi_config, SPI_DMA_CH_AUTO );
|
||||
if (spi_system_dc_gpio != -1) {
|
||||
gpio_reset_pin(spi_system_dc_gpio);
|
||||
gpio_set_direction( spi_system_dc_gpio, GPIO_MODE_OUTPUT );
|
||||
|
||||
@@ -53,6 +53,7 @@ private:
|
||||
std::atomic<states> state;
|
||||
std::string credentials;
|
||||
bool zeroConf;
|
||||
std::atomic<bool> flushed = false, notify = true;
|
||||
|
||||
int startOffset, volume = 0, bitrate = 160;
|
||||
httpd_handle_t serverHandle;
|
||||
@@ -60,6 +61,7 @@ private:
|
||||
cspot_cmd_cb_t cmdHandler;
|
||||
cspot_data_cb_t dataHandler;
|
||||
std::string lastTrackId;
|
||||
cspot::TrackInfo trackInfo;
|
||||
|
||||
std::shared_ptr<cspot::LoginBlob> blob;
|
||||
std::unique_ptr<cspot::SpircHandler> spirc;
|
||||
@@ -206,11 +208,13 @@ void cspotPlayer::eventHandler(std::unique_ptr<cspot::SpircHandler::Event> event
|
||||
trackStatus = TRACK_INIT;
|
||||
// memorize position for when track's beginning will be detected
|
||||
startOffset = std::get<int>(event->data);
|
||||
notify = !flushed;
|
||||
flushed = false;
|
||||
// Spotify servers do not send volume at connection
|
||||
spirc->setRemoteVolume(volume);
|
||||
|
||||
cmdHandler(CSPOT_START, 44100);
|
||||
CSPOT_LOG(info, "(re)start playing");
|
||||
CSPOT_LOG(info, "(re)start playing at %d", startOffset);
|
||||
break;
|
||||
}
|
||||
case cspot::SpircHandler::EventType::PLAY_PAUSE: {
|
||||
@@ -219,17 +223,14 @@ void cspotPlayer::eventHandler(std::unique_ptr<cspot::SpircHandler::Event> event
|
||||
break;
|
||||
}
|
||||
case cspot::SpircHandler::EventType::TRACK_INFO: {
|
||||
auto trackInfo = std::get<cspot::TrackInfo>(event->data);
|
||||
cmdHandler(CSPOT_TRACK_INFO, trackInfo.duration, startOffset, trackInfo.artist.c_str(),
|
||||
trackInfo.album.c_str(), trackInfo.name.c_str(), trackInfo.imageUrl.c_str());
|
||||
spirc->updatePositionMs(startOffset);
|
||||
startOffset = 0;
|
||||
trackInfo = std::get<cspot::TrackInfo>(event->data);
|
||||
break;
|
||||
}
|
||||
case cspot::SpircHandler::EventType::FLUSH:
|
||||
flushed = true;
|
||||
__attribute__ ((fallthrough));
|
||||
case cspot::SpircHandler::EventType::NEXT:
|
||||
case cspot::SpircHandler::EventType::PREV:
|
||||
case cspot::SpircHandler::EventType::FLUSH: {
|
||||
// FLUSH is sent when there is no next, just clean everything
|
||||
case cspot::SpircHandler::EventType::PREV: {
|
||||
cmdHandler(CSPOT_FLUSH);
|
||||
break;
|
||||
}
|
||||
@@ -412,8 +413,13 @@ void cspotPlayer::runTask() {
|
||||
uint32_t started;
|
||||
cmdHandler(CSPOT_QUERY_STARTED, &started);
|
||||
if (started) {
|
||||
CSPOT_LOG(info, "next track's audio has reached DAC");
|
||||
spirc->notifyAudioReachedPlayback();
|
||||
CSPOT_LOG(info, "next track's audio has reached DAC (offset %d)", startOffset);
|
||||
if (notify) spirc->notifyAudioReachedPlayback();
|
||||
else notify = true;
|
||||
cmdHandler(CSPOT_TRACK_INFO, trackInfo.duration, startOffset, trackInfo.artist.c_str(),
|
||||
trackInfo.album.c_str(), trackInfo.name.c_str(), trackInfo.imageUrl.c_str());
|
||||
spirc->updatePositionMs(startOffset);
|
||||
startOffset = 0;
|
||||
trackStatus = TRACK_STREAM;
|
||||
}
|
||||
} else if (trackStatus == TRACK_END) {
|
||||
@@ -424,7 +430,7 @@ void cspotPlayer::runTask() {
|
||||
CSPOT_LOG(info, "last track finished");
|
||||
trackStatus = TRACK_INIT;
|
||||
cmdHandler(CSPOT_STOP);
|
||||
spirc->setPause(true);
|
||||
spirc->notifyAudioEnded();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -461,6 +467,7 @@ void cspotPlayer::runTask() {
|
||||
*/
|
||||
struct cspot_s* cspot_create(const char *name, httpd_handle_t server, int port, cspot_cmd_cb_t cmd_cb, cspot_data_cb_t data_cb) {
|
||||
bell::setDefaultLogger();
|
||||
bell::enableTimestampLogging(true);
|
||||
player = new cspotPlayer(name, server, port, cmd_cb, data_cb);
|
||||
player->startTask();
|
||||
return (cspot_s*) player;
|
||||
|
||||
@@ -10,6 +10,7 @@ void bell::enableSubmoduleLogging() {
|
||||
bell::bellGlobalLogger->enableSubmodule = true;
|
||||
}
|
||||
|
||||
void bell::enableTimestampLogging() {
|
||||
void bell::enableTimestampLogging(bool local) {
|
||||
bell::bellGlobalLogger->enableTimestamp = true;
|
||||
bell::bellGlobalLogger->shortTime = local;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ class AbstractLogger {
|
||||
public:
|
||||
bool enableSubmodule = false;
|
||||
bool enableTimestamp = false;
|
||||
bool shortTime = false;
|
||||
|
||||
virtual void debug(std::string filename, int line, std::string submodule,
|
||||
const char* format, ...) = 0;
|
||||
@@ -94,10 +95,17 @@ class BellLogger : public bell::AbstractLogger {
|
||||
now.time_since_epoch()) %
|
||||
1000;
|
||||
|
||||
auto gmt_time = gmtime(&now_time);
|
||||
printf(colorReset);
|
||||
std::cout << std::put_time(gmt_time, "[%Y-%m-%d %H:%M:%S") << '.'
|
||||
<< std::setfill('0') << std::setw(3) << nowMs.count() << "] ";
|
||||
struct tm* gmt_time;
|
||||
if (shortTime) {
|
||||
gmt_time = localtime(&now_time);
|
||||
std::cout << std::put_time(gmt_time, "[%H:%M:%S") << '.'
|
||||
<< std::setfill('0') << std::setw(3) << nowMs.count() << "] ";
|
||||
} else {
|
||||
gmt_time = gmtime(&now_time);
|
||||
std::cout << std::put_time(gmt_time, "[%Y-%m-%d %H:%M:%S") << '.'
|
||||
<< std::setfill('0') << std::setw(3) << nowMs.count() << "] ";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +137,7 @@ class BellLogger : public bell::AbstractLogger {
|
||||
|
||||
void setDefaultLogger();
|
||||
void enableSubmoduleLogging();
|
||||
void enableTimestampLogging();
|
||||
void enableTimestampLogging(bool local = false);
|
||||
} // namespace bell
|
||||
|
||||
#define BELL_LOG(type, ...) \
|
||||
|
||||
@@ -48,11 +48,12 @@ class SpircHandler {
|
||||
|
||||
void setPause(bool pause);
|
||||
|
||||
void previousSong();
|
||||
bool previousSong();
|
||||
|
||||
void nextSong();
|
||||
bool nextSong();
|
||||
|
||||
void notifyAudioReachedPlayback();
|
||||
void notifyAudioEnded();
|
||||
void updatePositionMs(uint32_t position);
|
||||
void setRemoteVolume(int volume);
|
||||
void loadTrackFromURI(const std::string& uri);
|
||||
@@ -74,7 +75,7 @@ class SpircHandler {
|
||||
void sendEvent(EventType type);
|
||||
void sendEvent(EventType type, EventData data);
|
||||
|
||||
void skipSong(TrackQueue::SkipDirection dir);
|
||||
bool skipSong(TrackQueue::SkipDirection dir);
|
||||
void handleFrame(std::vector<uint8_t>& data);
|
||||
void notify();
|
||||
};
|
||||
|
||||
@@ -32,7 +32,8 @@ struct TrackReference;
|
||||
class TrackPlayer : bell::Task {
|
||||
public:
|
||||
// Callback types
|
||||
typedef std::function<void(std::shared_ptr<QueuedTrack>)> TrackLoadedCallback;
|
||||
typedef std::function<void(std::shared_ptr<QueuedTrack>, bool)>
|
||||
TrackLoadedCallback;
|
||||
typedef std::function<size_t(uint8_t*, size_t, std::string_view)>
|
||||
DataCallback;
|
||||
typedef std::function<void()> EOFCallback;
|
||||
@@ -49,7 +50,7 @@ class TrackPlayer : bell::Task {
|
||||
|
||||
// CDNTrackStream::TrackInfo getCurrentTrackInfo();
|
||||
void seekMs(size_t ms);
|
||||
void resetState();
|
||||
void resetState(bool paused = false);
|
||||
|
||||
// Vorbis codec callbacks
|
||||
size_t _vorbisRead(void* ptr, size_t size, size_t nmemb);
|
||||
@@ -89,6 +90,7 @@ class TrackPlayer : bell::Task {
|
||||
std::atomic<bool> pendingReset = false;
|
||||
std::atomic<bool> inFuture = false;
|
||||
std::atomic<size_t> pendingSeekPositionMs = 0;
|
||||
std::atomic<bool> startPaused = false;
|
||||
|
||||
std::mutex runningMutex;
|
||||
|
||||
|
||||
@@ -31,15 +31,17 @@ SpircHandler::SpircHandler(std::shared_ptr<cspot::Context> ctx) {
|
||||
}
|
||||
};
|
||||
|
||||
auto trackLoadedCallback = [this](std::shared_ptr<QueuedTrack> track) {
|
||||
playbackState->setPlaybackState(PlaybackState::State::Playing);
|
||||
auto trackLoadedCallback = [this](std::shared_ptr<QueuedTrack> track,
|
||||
bool paused = false) {
|
||||
playbackState->setPlaybackState(paused ? PlaybackState::State::Paused
|
||||
: PlaybackState::State::Playing);
|
||||
playbackState->updatePositionMs(track->requestedPosition);
|
||||
|
||||
this->notify();
|
||||
|
||||
// Send playback start event, unpause
|
||||
// Send playback start event, pause/unpause per request
|
||||
sendEvent(EventType::PLAYBACK_START, (int)track->requestedPosition);
|
||||
sendEvent(EventType::PLAY_PAUSE, false);
|
||||
sendEvent(EventType::PLAY_PAUSE, paused);
|
||||
};
|
||||
|
||||
this->ctx = ctx;
|
||||
@@ -77,6 +79,12 @@ void SpircHandler::subscribeToMercury() {
|
||||
|
||||
void SpircHandler::loadTrackFromURI(const std::string& uri) {}
|
||||
|
||||
void SpircHandler::notifyAudioEnded() {
|
||||
playbackState->updatePositionMs(0);
|
||||
notify();
|
||||
trackPlayer->resetState(true);
|
||||
}
|
||||
|
||||
void SpircHandler::notifyAudioReachedPlayback() {
|
||||
int offset = 0;
|
||||
|
||||
@@ -142,7 +150,6 @@ void SpircHandler::handleFrame(std::vector<uint8_t>& data) {
|
||||
notify();
|
||||
|
||||
sendEvent(EventType::SEEK, (int)playbackState->remoteFrame.position);
|
||||
//sendEvent(EventType::FLUSH);
|
||||
break;
|
||||
}
|
||||
case MessageType_kMessageTypeVolume:
|
||||
@@ -157,12 +164,14 @@ void SpircHandler::handleFrame(std::vector<uint8_t>& data) {
|
||||
setPause(false);
|
||||
break;
|
||||
case MessageType_kMessageTypeNext:
|
||||
nextSong();
|
||||
sendEvent(EventType::NEXT);
|
||||
if (nextSong()) {
|
||||
sendEvent(EventType::NEXT);
|
||||
}
|
||||
break;
|
||||
case MessageType_kMessageTypePrev:
|
||||
previousSong();
|
||||
sendEvent(EventType::PREV);
|
||||
if (previousSong()) {
|
||||
sendEvent(EventType::PREV);
|
||||
}
|
||||
break;
|
||||
case MessageType_kMessageTypeLoad: {
|
||||
this->trackPlayer->start();
|
||||
@@ -195,12 +204,17 @@ void SpircHandler::handleFrame(std::vector<uint8_t>& data) {
|
||||
CSPOT_LOG(debug, "Got replace frame");
|
||||
playbackState->syncWithRemote();
|
||||
|
||||
trackQueue->updateTracks(playbackState->remoteFrame.state.position_ms,
|
||||
false);
|
||||
// 1st track is the current one, but update the position
|
||||
trackQueue->updateTracks(
|
||||
playbackState->remoteFrame.state.position_ms +
|
||||
ctx->timeProvider->getSyncedTimestamp() -
|
||||
playbackState->innerFrame.state.position_measured_at,
|
||||
false);
|
||||
|
||||
this->notify();
|
||||
|
||||
trackPlayer->resetState();
|
||||
sendEvent(EventType::FLUSH);
|
||||
trackPlayer->resetState();
|
||||
break;
|
||||
}
|
||||
case MessageType_kMessageTypeShuffle: {
|
||||
@@ -227,34 +241,22 @@ void SpircHandler::notify() {
|
||||
this->sendCmd(MessageType_kMessageTypeNotify);
|
||||
}
|
||||
|
||||
void SpircHandler::skipSong(TrackQueue::SkipDirection dir) {
|
||||
if (trackQueue->skipTrack(dir)) {
|
||||
playbackState->setPlaybackState(PlaybackState::State::Playing);
|
||||
notify();
|
||||
bool SpircHandler::skipSong(TrackQueue::SkipDirection dir) {
|
||||
bool skipped = trackQueue->skipTrack(dir);
|
||||
|
||||
// Reset track state
|
||||
trackPlayer->resetState();
|
||||
// Reset track state
|
||||
trackPlayer->resetState(!skipped);
|
||||
|
||||
sendEvent(EventType::PLAY_PAUSE, false);
|
||||
} else {
|
||||
playbackState->setPlaybackState(PlaybackState::State::Paused);
|
||||
playbackState->updatePositionMs(0);
|
||||
notify();
|
||||
|
||||
sendEvent(EventType::PLAY_PAUSE, true);
|
||||
}
|
||||
|
||||
notify();
|
||||
|
||||
sendEvent(EventType::FLUSH);
|
||||
// send NEXT or PREV event only when successful
|
||||
return skipped;
|
||||
}
|
||||
|
||||
void SpircHandler::nextSong() {
|
||||
skipSong(TrackQueue::SkipDirection::NEXT);
|
||||
bool SpircHandler::nextSong() {
|
||||
return skipSong(TrackQueue::SkipDirection::NEXT);
|
||||
}
|
||||
|
||||
void SpircHandler::previousSong() {
|
||||
skipSong(TrackQueue::SkipDirection::PREV);
|
||||
bool SpircHandler::previousSong() {
|
||||
return skipSong(TrackQueue::SkipDirection::PREV);
|
||||
}
|
||||
|
||||
std::shared_ptr<TrackPlayer> SpircHandler::getTrackPlayer() {
|
||||
|
||||
@@ -87,10 +87,11 @@ void TrackPlayer::stop() {
|
||||
std::scoped_lock lock(runningMutex);
|
||||
}
|
||||
|
||||
void TrackPlayer::resetState() {
|
||||
void TrackPlayer::resetState(bool paused) {
|
||||
// Mark for reset
|
||||
this->pendingReset = true;
|
||||
this->currentSongPlaying = false;
|
||||
this->startPaused = paused;
|
||||
|
||||
std::scoped_lock lock(dataOutMutex);
|
||||
|
||||
@@ -119,7 +120,7 @@ void TrackPlayer::runTask() {
|
||||
while (isRunning) {
|
||||
// Ensure we even have any tracks to play
|
||||
if (!this->trackQueue->hasTracks() ||
|
||||
(endOfQueueReached && trackQueue->isFinished())) {
|
||||
(!pendingReset && endOfQueueReached && trackQueue->isFinished())) {
|
||||
this->trackQueue->playableSemaphore->twait(300);
|
||||
continue;
|
||||
}
|
||||
@@ -184,7 +185,8 @@ void TrackPlayer::runTask() {
|
||||
}
|
||||
|
||||
if (trackOffset == 0 && pendingSeekPositionMs == 0) {
|
||||
this->trackLoaded(track);
|
||||
this->trackLoaded(track, startPaused);
|
||||
startPaused = false;
|
||||
}
|
||||
|
||||
int32_t r =
|
||||
|
||||
@@ -504,11 +504,18 @@ void TrackQueue::processTrack(std::shared_ptr<QueuedTrack> track) {
|
||||
|
||||
bool TrackQueue::queueNextTrack(int offset, uint32_t positionMs) {
|
||||
const int requestedRefIndex = offset + currentTracksIndex;
|
||||
|
||||
if (requestedRefIndex < 0 || requestedRefIndex >= currentTracks.size()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (offset < 0) {
|
||||
// in case we re-queue current track, make sure position is updated (0)
|
||||
if (offset == 0 && preloadedTracks.size() &&
|
||||
preloadedTracks[0]->ref == currentTracks[currentTracksIndex]) {
|
||||
preloadedTracks.pop_front();
|
||||
}
|
||||
|
||||
if (offset <= 0) {
|
||||
preloadedTracks.push_front(std::make_shared<QueuedTrack>(
|
||||
currentTracks[requestedRefIndex], ctx, positionMs));
|
||||
} else {
|
||||
@@ -520,13 +527,30 @@ bool TrackQueue::queueNextTrack(int offset, uint32_t positionMs) {
|
||||
}
|
||||
|
||||
bool TrackQueue::skipTrack(SkipDirection dir, bool expectNotify) {
|
||||
bool canSkipNext = currentTracks.size() > currentTracksIndex + 1;
|
||||
bool canSkipPrev = currentTracksIndex > 0;
|
||||
bool skipped = true;
|
||||
std::scoped_lock lock(tracksMutex);
|
||||
|
||||
if ((dir == SkipDirection::NEXT && canSkipNext) ||
|
||||
(dir == SkipDirection::PREV && canSkipPrev)) {
|
||||
std::scoped_lock lock(tracksMutex);
|
||||
if (dir == SkipDirection::NEXT) {
|
||||
if (dir == SkipDirection::PREV) {
|
||||
uint64_t position =
|
||||
!playbackState->innerFrame.state.has_position_ms
|
||||
? 0
|
||||
: playbackState->innerFrame.state.position_ms +
|
||||
ctx->timeProvider->getSyncedTimestamp() -
|
||||
playbackState->innerFrame.state.position_measured_at;
|
||||
|
||||
if (currentTracksIndex > 0 && position < 3000) {
|
||||
queueNextTrack(-1);
|
||||
|
||||
if (preloadedTracks.size() > MAX_TRACKS_PRELOAD) {
|
||||
preloadedTracks.pop_back();
|
||||
}
|
||||
|
||||
currentTracksIndex--;
|
||||
} else {
|
||||
queueNextTrack(0);
|
||||
}
|
||||
} else {
|
||||
if (currentTracks.size() > currentTracksIndex + 1) {
|
||||
preloadedTracks.pop_front();
|
||||
|
||||
if (!queueNextTrack(preloadedTracks.size() + 1)) {
|
||||
@@ -535,15 +559,11 @@ bool TrackQueue::skipTrack(SkipDirection dir, bool expectNotify) {
|
||||
|
||||
currentTracksIndex++;
|
||||
} else {
|
||||
queueNextTrack(-1);
|
||||
|
||||
if (preloadedTracks.size() > MAX_TRACKS_PRELOAD) {
|
||||
preloadedTracks.pop_back();
|
||||
}
|
||||
|
||||
currentTracksIndex--;
|
||||
skipped = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (skipped) {
|
||||
// Update frame data
|
||||
playbackState->innerFrame.state.playing_track_index = currentTracksIndex;
|
||||
|
||||
@@ -551,11 +571,9 @@ bool TrackQueue::skipTrack(SkipDirection dir, bool expectNotify) {
|
||||
// Reset position to zero
|
||||
notifyPending = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return skipped;
|
||||
}
|
||||
|
||||
bool TrackQueue::hasTracks() {
|
||||
|
||||
36
components/squeezelite/external/dac_external.c
vendored
36
components/squeezelite/external/dac_external.c
vendored
@@ -14,6 +14,7 @@
|
||||
#include <driver/i2s.h>
|
||||
#include "driver/i2c.h"
|
||||
#include "esp_log.h"
|
||||
#include "gpio_exp.h"
|
||||
#include "cJSON.h"
|
||||
#include "platform_config.h"
|
||||
#include "adac.h"
|
||||
@@ -123,9 +124,28 @@ bool i2c_json_execute(char *set) {
|
||||
if (!json_set) return true;
|
||||
|
||||
cJSON_ArrayForEach(item, json_set) {
|
||||
cJSON *reg = cJSON_GetObjectItemCaseSensitive(item, "reg");
|
||||
cJSON *action;
|
||||
|
||||
// is this a delay
|
||||
if ((action = cJSON_GetObjectItemCaseSensitive(item, "delay")) != NULL) {
|
||||
vTaskDelay(pdMS_TO_TICKS(action->valueint));
|
||||
ESP_LOGI(TAG, "DAC waiting %d ms", action->valueint);
|
||||
continue;
|
||||
}
|
||||
|
||||
// is this a gpio toggle
|
||||
if ((action = cJSON_GetObjectItemCaseSensitive(item, "gpio")) != NULL) {
|
||||
cJSON *level = cJSON_GetObjectItemCaseSensitive(item, "level");
|
||||
ESP_LOGI(TAG, "set GPIO %d at %d", action->valueint, level->valueint);
|
||||
gpio_set_direction_x(action->valueint, GPIO_MODE_OUTPUT);
|
||||
gpio_set_level_x(action->valueint, level->valueint);
|
||||
continue;
|
||||
}
|
||||
|
||||
action= cJSON_GetObjectItemCaseSensitive(item, "reg");
|
||||
cJSON *val = cJSON_GetObjectItemCaseSensitive(item, "val");
|
||||
|
||||
// this is gpio register setting or crap
|
||||
if (cJSON_IsArray(val)) {
|
||||
cJSON *value;
|
||||
uint8_t *data = malloc(cJSON_GetArraySize(val));
|
||||
@@ -137,23 +157,23 @@ bool i2c_json_execute(char *set) {
|
||||
data[count++] = value->valueint;
|
||||
}
|
||||
|
||||
adac_write(i2c_addr, reg->valueint, data, count);
|
||||
adac_write(i2c_addr, action->valueint, data, count);
|
||||
free(data);
|
||||
} else {
|
||||
cJSON *mode = cJSON_GetObjectItemCaseSensitive(item, "mode");
|
||||
|
||||
if (!reg || !val) continue;
|
||||
if (!action || !val) continue;
|
||||
|
||||
if (!mode) {
|
||||
adac_write_byte(i2c_addr, reg->valueint, val->valueint);
|
||||
adac_write_byte(i2c_addr, action->valueint, val->valueint);
|
||||
} else if (!strcasecmp(mode->valuestring, "or")) {
|
||||
uint8_t data = adac_read_byte(i2c_addr,reg->valueint);
|
||||
uint8_t data = adac_read_byte(i2c_addr, action->valueint);
|
||||
data |= (uint8_t) val->valueint;
|
||||
adac_write_byte(i2c_addr, reg->valueint, data);
|
||||
adac_write_byte(i2c_addr, action->valueint, data);
|
||||
} else if (!strcasecmp(mode->valuestring, "and")) {
|
||||
uint8_t data = adac_read_byte(i2c_addr, reg->valueint);
|
||||
uint8_t data = adac_read_byte(i2c_addr, action->valueint);
|
||||
data &= (uint8_t) val->valueint;
|
||||
adac_write_byte(i2c_addr, reg->valueint, data);
|
||||
adac_write_byte(i2c_addr, action->valueint, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -744,7 +744,7 @@ static void IRAM_ATTR spdif_convert(ISAMPLE_T *src, size_t frames, u32_t *dst) {
|
||||
|
||||
// we assume frame == 0 as well...
|
||||
if (!src) {
|
||||
count = 192;
|
||||
count = 0;
|
||||
vu = VUCP24[0];
|
||||
}
|
||||
|
||||
@@ -757,7 +757,7 @@ static void IRAM_ATTR spdif_convert(ISAMPLE_T *src, size_t frames, u32_t *dst) {
|
||||
|
||||
if (!count--) {
|
||||
*dst++ = (vu << 24) | (PREAMBLE_B << 16) | 0xCCCC;
|
||||
count = 192;
|
||||
count = 191;
|
||||
} else {
|
||||
*dst++ = (vu << 24) | (PREAMBLE_M << 16) | 0xCCCC;
|
||||
}
|
||||
@@ -771,7 +771,7 @@ static void IRAM_ATTR spdif_convert(ISAMPLE_T *src, size_t frames, u32_t *dst) {
|
||||
|
||||
if (!count--) {
|
||||
*dst++ = (vu << 24) | (PREAMBLE_B << 16) | aux;
|
||||
count = 192;
|
||||
count = 191;
|
||||
} else {
|
||||
*dst++ = (vu << 24) | (PREAMBLE_M << 16) | aux;
|
||||
}
|
||||
|
||||
@@ -396,7 +396,6 @@ static decode_state vorbis_decode(void) {
|
||||
}
|
||||
|
||||
static void vorbis_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
|
||||
LOG_INFO("OPENING CODEC");
|
||||
if (v->opened) {
|
||||
OV(&go, block_clear, &v->block);
|
||||
OV(&go, info_clear, &v->info);
|
||||
@@ -413,8 +412,6 @@ static void vorbis_open(u8_t size, u8_t rate, u8_t chan, u8_t endianness) {
|
||||
}
|
||||
|
||||
static void vorbis_close() {
|
||||
return;
|
||||
LOG_INFO("CLOSING CODEC");
|
||||
if (v->opened) {
|
||||
OV(&go, block_clear, &v->block);
|
||||
OV(&go, info_clear, &v->info);
|
||||
|
||||
6
components/wifi-manager/webapp/dist/css/index.1ab179394339385e0a02.css
vendored
Normal file
6
components/wifi-manager/webapp/dist/css/index.1ab179394339385e0a02.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/css/index.1ab179394339385e0a02.css.gz
vendored
Normal file
BIN
components/wifi-manager/webapp/dist/css/index.1ab179394339385e0a02.css.gz
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/index.html.gz
vendored
BIN
components/wifi-manager/webapp/dist/index.html.gz
vendored
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/js/index.775de9.bundle.js.gz
vendored
Normal file
BIN
components/wifi-manager/webapp/dist/js/index.775de9.bundle.js.gz
vendored
Normal file
Binary file not shown.
1
components/wifi-manager/webapp/dist/js/index.775de9.bundle.js.map
vendored
Normal file
1
components/wifi-manager/webapp/dist/js/index.775de9.bundle.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
2
components/wifi-manager/webapp/dist/src/bootswatch/Gruntfile.d.ts
vendored
Normal file
2
components/wifi-manager/webapp/dist/src/bootswatch/Gruntfile.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
declare function _exports(grunt: any): void;
|
||||
export = _exports;
|
||||
2
components/wifi-manager/webapp/dist/src/bootswatch/docs/2/Gruntfile.d.ts
vendored
Normal file
2
components/wifi-manager/webapp/dist/src/bootswatch/docs/2/Gruntfile.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
declare function _exports(grunt: any): void;
|
||||
export = _exports;
|
||||
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/2/swatchmaker/test/bootswatch.d.ts
vendored
Normal file
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/2/swatchmaker/test/bootswatch.d.ts
vendored
Normal file
2
components/wifi-manager/webapp/dist/src/bootswatch/docs/3/Gruntfile.d.ts
vendored
Normal file
2
components/wifi-manager/webapp/dist/src/bootswatch/docs/3/Gruntfile.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
declare function _exports(grunt: any): void;
|
||||
export = _exports;
|
||||
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/3/assets/js/custom.d.ts
vendored
Normal file
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/3/assets/js/custom.d.ts
vendored
Normal file
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/4/_assets/js/custom.d.ts
vendored
Normal file
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/4/_assets/js/custom.d.ts
vendored
Normal file
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/_assets/js/custom.d.ts
vendored
Normal file
0
components/wifi-manager/webapp/dist/src/bootswatch/docs/_assets/js/custom.d.ts
vendored
Normal file
1129
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/bootstrap/dist/js/bootstrap.bundle.d.ts
vendored
Normal file
1129
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/bootstrap/dist/js/bootstrap.bundle.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1044
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/bootstrap/dist/js/bootstrap.d.ts
vendored
Normal file
1044
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/bootstrap/dist/js/bootstrap.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
688
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/bootstrap/dist/js/bootstrap.esm.d.ts
vendored
Normal file
688
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/bootstrap/dist/js/bootstrap.esm.d.ts
vendored
Normal file
@@ -0,0 +1,688 @@
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Alert extends BaseComponent {
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
close(): void;
|
||||
_destroyElement(): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Button extends BaseComponent {
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
toggle(): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Carousel extends BaseComponent {
|
||||
static get Default(): {
|
||||
interval: number;
|
||||
keyboard: boolean;
|
||||
pause: string;
|
||||
ride: boolean;
|
||||
touch: boolean;
|
||||
wrap: boolean;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
interval: string;
|
||||
keyboard: string;
|
||||
pause: string;
|
||||
ride: string;
|
||||
touch: string;
|
||||
wrap: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
_interval: NodeJS.Timeout;
|
||||
_activeElement: any;
|
||||
_isSliding: boolean;
|
||||
touchTimeout: NodeJS.Timeout;
|
||||
_swipeHelper: Swipe;
|
||||
_indicatorsElement: any;
|
||||
next(): void;
|
||||
nextWhenVisible(): void;
|
||||
prev(): void;
|
||||
pause(): void;
|
||||
cycle(): void;
|
||||
_maybeEnableCycle(): void;
|
||||
to(index: any): void;
|
||||
_addEventListeners(): void;
|
||||
_addTouchEventListeners(): void;
|
||||
_keydown(event: any): void;
|
||||
_getItemIndex(element: any): number;
|
||||
_setActiveIndicatorElement(index: any): void;
|
||||
_updateInterval(): void;
|
||||
_slide(order: any, element?: any): void;
|
||||
_isAnimated(): any;
|
||||
_getActive(): any;
|
||||
_getItems(): any[];
|
||||
_clearInterval(): void;
|
||||
_directionToOrder(direction: any): "next" | "prev";
|
||||
_orderToDirection(order: any): "right" | "left";
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Collapse extends BaseComponent {
|
||||
static get Default(): {
|
||||
parent: any;
|
||||
toggle: boolean;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
parent: string;
|
||||
toggle: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
_isTransitioning: boolean;
|
||||
_triggerArray: any[];
|
||||
toggle(): void;
|
||||
show(): void;
|
||||
hide(): void;
|
||||
_isShown(element?: any): any;
|
||||
_getDimension(): "width" | "height";
|
||||
_initializeChildren(): void;
|
||||
_getFirstLevelChildren(selector: any): any[];
|
||||
_addAriaAndCollapsedClass(triggerArray: any, isOpen: any): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Dropdown extends BaseComponent {
|
||||
static get Default(): {
|
||||
autoClose: boolean;
|
||||
boundary: string;
|
||||
display: string;
|
||||
offset: number[];
|
||||
popperConfig: any;
|
||||
reference: string;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
autoClose: string;
|
||||
boundary: string;
|
||||
display: string;
|
||||
offset: string;
|
||||
popperConfig: string;
|
||||
reference: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
static clearMenus(event: any): void;
|
||||
static dataApiKeydownHandler(event: any): void;
|
||||
_popper: Popper.Instance;
|
||||
_parent: any;
|
||||
_menu: any;
|
||||
_inNavbar: boolean;
|
||||
toggle(): void;
|
||||
show(): void;
|
||||
hide(): void;
|
||||
update(): void;
|
||||
_completeHide(relatedTarget: any): void;
|
||||
_createPopper(): void;
|
||||
_isShown(): any;
|
||||
_getPlacement(): "top" | "bottom" | "top-end" | "top-start" | "bottom-end" | "bottom-start" | "left-start" | "right-start";
|
||||
_detectNavbar(): boolean;
|
||||
_getOffset(): any;
|
||||
_getPopperConfig(): any;
|
||||
_selectMenuItem({ key, target }: {
|
||||
key: any;
|
||||
target: any;
|
||||
}): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Modal extends BaseComponent {
|
||||
static get Default(): {
|
||||
backdrop: boolean;
|
||||
focus: boolean;
|
||||
keyboard: boolean;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
backdrop: string;
|
||||
focus: string;
|
||||
keyboard: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any, relatedTarget: any): any;
|
||||
_dialog: any;
|
||||
_backdrop: Backdrop;
|
||||
_focustrap: FocusTrap;
|
||||
_isShown: boolean;
|
||||
_isTransitioning: boolean;
|
||||
_scrollBar: ScrollBarHelper;
|
||||
toggle(relatedTarget: any): void;
|
||||
show(relatedTarget: any): void;
|
||||
hide(): void;
|
||||
handleUpdate(): void;
|
||||
_initializeBackDrop(): Backdrop;
|
||||
_initializeFocusTrap(): FocusTrap;
|
||||
_showElement(relatedTarget: any): void;
|
||||
_addEventListeners(): void;
|
||||
_hideModal(): void;
|
||||
_isAnimated(): any;
|
||||
_triggerBackdropTransition(): void;
|
||||
/**
|
||||
* The following methods are used to handle overflowing modals
|
||||
*/
|
||||
_adjustDialog(): void;
|
||||
_resetAdjustments(): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Offcanvas extends BaseComponent {
|
||||
static get Default(): {
|
||||
backdrop: boolean;
|
||||
keyboard: boolean;
|
||||
scroll: boolean;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
backdrop: string;
|
||||
keyboard: string;
|
||||
scroll: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
_isShown: boolean;
|
||||
_backdrop: Backdrop;
|
||||
_focustrap: FocusTrap;
|
||||
toggle(relatedTarget: any): void;
|
||||
show(relatedTarget: any): void;
|
||||
hide(): void;
|
||||
_initializeBackDrop(): Backdrop;
|
||||
_initializeFocusTrap(): FocusTrap;
|
||||
_addEventListeners(): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Popover extends Tooltip {
|
||||
static get Default(): {
|
||||
content: string;
|
||||
offset: number[];
|
||||
placement: string;
|
||||
template: string;
|
||||
trigger: string;
|
||||
allowList: {
|
||||
'*': (string | RegExp)[];
|
||||
a: string[];
|
||||
area: any[];
|
||||
b: any[];
|
||||
br: any[];
|
||||
col: any[];
|
||||
code: any[];
|
||||
div: any[];
|
||||
em: any[];
|
||||
hr: any[];
|
||||
h1: any[];
|
||||
h2: any[];
|
||||
h3: any[];
|
||||
h4: any[];
|
||||
h5: any[];
|
||||
h6: any[];
|
||||
i: any[];
|
||||
img: string[];
|
||||
li: any[];
|
||||
ol: any[];
|
||||
p: any[];
|
||||
pre: any[];
|
||||
s: any[];
|
||||
small: any[];
|
||||
span: any[];
|
||||
sub: any[];
|
||||
sup: any[];
|
||||
strong: any[];
|
||||
u: any[];
|
||||
ul: any[];
|
||||
};
|
||||
animation: boolean;
|
||||
boundary: string;
|
||||
container: boolean;
|
||||
customClass: string;
|
||||
delay: number;
|
||||
fallbackPlacements: string[];
|
||||
html: boolean;
|
||||
popperConfig: any;
|
||||
sanitize: boolean;
|
||||
sanitizeFn: any;
|
||||
selector: boolean;
|
||||
title: string;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
content: string;
|
||||
allowList: string;
|
||||
animation: string;
|
||||
boundary: string;
|
||||
container: string;
|
||||
customClass: string;
|
||||
delay: string;
|
||||
fallbackPlacements: string;
|
||||
html: string;
|
||||
offset: string;
|
||||
placement: string;
|
||||
popperConfig: string;
|
||||
sanitize: string;
|
||||
sanitizeFn: string;
|
||||
selector: string;
|
||||
template: string;
|
||||
title: string;
|
||||
trigger: string;
|
||||
};
|
||||
_isWithContent(): any;
|
||||
_getContentForTemplate(): {
|
||||
".popover-header": any;
|
||||
".popover-body": any;
|
||||
};
|
||||
_getContent(): any;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class ScrollSpy extends BaseComponent {
|
||||
static get Default(): {
|
||||
offset: any;
|
||||
rootMargin: string;
|
||||
smoothScroll: boolean;
|
||||
target: any;
|
||||
threshold: number[];
|
||||
};
|
||||
static get DefaultType(): {
|
||||
offset: string;
|
||||
rootMargin: string;
|
||||
smoothScroll: string;
|
||||
target: string;
|
||||
threshold: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
_targetLinks: Map<any, any>;
|
||||
_observableSections: Map<any, any>;
|
||||
_rootElement: any;
|
||||
_activeTarget: any;
|
||||
_observer: IntersectionObserver;
|
||||
_previousScrollData: {
|
||||
visibleEntryTop: number;
|
||||
parentScrollTop: number;
|
||||
};
|
||||
refresh(): void;
|
||||
_maybeEnableSmoothScroll(): void;
|
||||
_getNewObserver(): IntersectionObserver;
|
||||
_observerCallback(entries: any): void;
|
||||
_initializeTargetsAndObservables(): void;
|
||||
_process(target: any): void;
|
||||
_activateParents(target: any): void;
|
||||
_clearActiveClass(parent: any): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Tab extends BaseComponent {
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
constructor(element: any);
|
||||
_parent: any;
|
||||
show(): void;
|
||||
_activate(element: any, relatedElem: any): void;
|
||||
_deactivate(element: any, relatedElem: any): void;
|
||||
_keydown(event: any): void;
|
||||
_getChildren(): any[];
|
||||
_getActiveElem(): any;
|
||||
_setInitialAttributes(parent: any, children: any): void;
|
||||
_setInitialAttributesOnChild(child: any): void;
|
||||
_setInitialAttributesOnTargetPanel(child: any): void;
|
||||
_toggleDropDown(element: any, open: any): void;
|
||||
_setAttributeIfNotExists(element: any, attribute: any, value: any): void;
|
||||
_elemIsActive(elem: any): any;
|
||||
_getInnerElement(elem: any): any;
|
||||
_getOuterElement(elem: any): any;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Toast extends BaseComponent {
|
||||
static get Default(): {
|
||||
animation: boolean;
|
||||
autohide: boolean;
|
||||
delay: number;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
animation: string;
|
||||
autohide: string;
|
||||
delay: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
_timeout: NodeJS.Timeout;
|
||||
_hasMouseInteraction: boolean;
|
||||
_hasKeyboardInteraction: boolean;
|
||||
show(): void;
|
||||
hide(): void;
|
||||
isShown(): any;
|
||||
_maybeScheduleHide(): void;
|
||||
_onInteraction(event: any, isInteracting: any): void;
|
||||
_setListeners(): void;
|
||||
_clearTimeout(): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
export class Tooltip extends BaseComponent {
|
||||
static get Default(): {
|
||||
allowList: {
|
||||
'*': (string | RegExp)[];
|
||||
a: string[];
|
||||
area: any[];
|
||||
b: any[];
|
||||
br: any[];
|
||||
col: any[];
|
||||
code: any[];
|
||||
div: any[];
|
||||
em: any[];
|
||||
hr: any[];
|
||||
h1: any[];
|
||||
h2: any[];
|
||||
h3: any[];
|
||||
h4: any[];
|
||||
h5: any[];
|
||||
h6: any[];
|
||||
i: any[];
|
||||
img: string[];
|
||||
li: any[];
|
||||
ol: any[];
|
||||
p: any[];
|
||||
pre: any[];
|
||||
s: any[];
|
||||
small: any[];
|
||||
span: any[];
|
||||
sub: any[];
|
||||
sup: any[];
|
||||
strong: any[];
|
||||
u: any[];
|
||||
ul: any[];
|
||||
};
|
||||
animation: boolean;
|
||||
boundary: string;
|
||||
container: boolean;
|
||||
customClass: string;
|
||||
delay: number;
|
||||
fallbackPlacements: string[];
|
||||
html: boolean;
|
||||
offset: number[];
|
||||
placement: string;
|
||||
popperConfig: any;
|
||||
sanitize: boolean;
|
||||
sanitizeFn: any;
|
||||
selector: boolean;
|
||||
template: string;
|
||||
title: string;
|
||||
trigger: string;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
allowList: string;
|
||||
animation: string;
|
||||
boundary: string;
|
||||
container: string;
|
||||
customClass: string;
|
||||
delay: string;
|
||||
fallbackPlacements: string;
|
||||
html: string;
|
||||
offset: string;
|
||||
placement: string;
|
||||
popperConfig: string;
|
||||
sanitize: string;
|
||||
sanitizeFn: string;
|
||||
selector: string;
|
||||
template: string;
|
||||
title: string;
|
||||
trigger: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static jQueryInterface(config: any): any;
|
||||
_isEnabled: boolean;
|
||||
_timeout: number;
|
||||
_isHovered: boolean;
|
||||
_activeTrigger: {};
|
||||
_popper: Popper.Instance;
|
||||
_templateFactory: TemplateFactory;
|
||||
_newContent: any;
|
||||
tip: Element;
|
||||
enable(): void;
|
||||
disable(): void;
|
||||
toggleEnabled(): void;
|
||||
toggle(): void;
|
||||
show(): void;
|
||||
hide(): void;
|
||||
update(): void;
|
||||
_isWithContent(): boolean;
|
||||
_getTipElement(): Element;
|
||||
_createTipElement(content: any): Element;
|
||||
setContent(content: any): void;
|
||||
_getTemplateFactory(content: any): TemplateFactory;
|
||||
_getContentForTemplate(): {
|
||||
".tooltip-inner": any;
|
||||
};
|
||||
_getTitle(): any;
|
||||
_initializeOnDelegatedTarget(event: any): any;
|
||||
_isAnimated(): any;
|
||||
_isShown(): boolean;
|
||||
_createPopper(tip: any): Popper.Instance;
|
||||
_getOffset(): any;
|
||||
_resolvePossibleFunction(arg: any): any;
|
||||
_getPopperConfig(attachment: any): any;
|
||||
_setListeners(): void;
|
||||
_hideModalHandler: () => void;
|
||||
_fixTitle(): void;
|
||||
_enter(): void;
|
||||
_leave(): void;
|
||||
_setTimeout(handler: any, timeout: any): void;
|
||||
_isWithActiveTrigger(): boolean;
|
||||
_getDelegateConfig(): {
|
||||
selector: boolean;
|
||||
trigger: string;
|
||||
};
|
||||
_disposePopper(): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class BaseComponent extends Config {
|
||||
static getInstance(element: any): any;
|
||||
static getOrCreateInstance(element: any, config?: {}): any;
|
||||
static get VERSION(): string;
|
||||
static get DATA_KEY(): string;
|
||||
static get EVENT_KEY(): string;
|
||||
static eventName(name: any): string;
|
||||
constructor(element: any, config: any);
|
||||
_element: any;
|
||||
_config: any;
|
||||
dispose(): void;
|
||||
_queueCallback(callback: any, element: any, isAnimated?: boolean): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class Swipe extends Config {
|
||||
static get Default(): {
|
||||
endCallback: any;
|
||||
leftCallback: any;
|
||||
rightCallback: any;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
endCallback: string;
|
||||
leftCallback: string;
|
||||
rightCallback: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
static isSupported(): boolean;
|
||||
constructor(element: any, config: any);
|
||||
_element: any;
|
||||
_config: any;
|
||||
_deltaX: number;
|
||||
_supportPointerEvents: boolean;
|
||||
dispose(): void;
|
||||
_start(event: any): void;
|
||||
_end(event: any): void;
|
||||
_move(event: any): void;
|
||||
_handleSwipe(): void;
|
||||
_initEvents(): void;
|
||||
_eventIsPointerPenTouch(event: any): boolean;
|
||||
}
|
||||
import * as Popper from "@popperjs/core";
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class Backdrop extends Config {
|
||||
static get Default(): {
|
||||
className: string;
|
||||
clickCallback: any;
|
||||
isAnimated: boolean;
|
||||
isVisible: boolean;
|
||||
rootElement: string;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
className: string;
|
||||
clickCallback: string;
|
||||
isAnimated: string;
|
||||
isVisible: string;
|
||||
rootElement: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
constructor(config: any);
|
||||
_config: any;
|
||||
_isAppended: boolean;
|
||||
_element: HTMLDivElement;
|
||||
show(callback: any): void;
|
||||
hide(callback: any): void;
|
||||
dispose(): void;
|
||||
_getElement(): HTMLDivElement;
|
||||
_append(): void;
|
||||
_emulateAnimation(callback: any): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class FocusTrap extends Config {
|
||||
static get Default(): {
|
||||
autofocus: boolean;
|
||||
trapElement: any;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
autofocus: string;
|
||||
trapElement: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
constructor(config: any);
|
||||
_config: any;
|
||||
_isActive: boolean;
|
||||
_lastTabNavDirection: string;
|
||||
activate(): void;
|
||||
deactivate(): void;
|
||||
_handleFocusin(event: any): void;
|
||||
_handleKeydown(event: any): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class ScrollBarHelper {
|
||||
_element: HTMLElement;
|
||||
getWidth(): number;
|
||||
hide(): void;
|
||||
reset(): void;
|
||||
isOverflowing(): boolean;
|
||||
_disableOverFlow(): void;
|
||||
_setElementAttributes(selector: any, styleProperty: any, callback: any): void;
|
||||
_saveInitialAttribute(element: any, styleProperty: any): void;
|
||||
_resetElementAttributes(selector: any, styleProperty: any): void;
|
||||
_applyManipulationCallback(selector: any, callBack: any): void;
|
||||
}
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class TemplateFactory extends Config {
|
||||
static get Default(): {
|
||||
allowList: {
|
||||
'*': (string | RegExp)[];
|
||||
a: string[];
|
||||
area: any[];
|
||||
b: any[];
|
||||
br: any[];
|
||||
col: any[];
|
||||
code: any[];
|
||||
div: any[];
|
||||
em: any[];
|
||||
hr: any[];
|
||||
h1: any[];
|
||||
h2: any[];
|
||||
h3: any[];
|
||||
h4: any[];
|
||||
h5: any[];
|
||||
h6: any[];
|
||||
i: any[];
|
||||
img: string[];
|
||||
li: any[];
|
||||
ol: any[];
|
||||
p: any[];
|
||||
pre: any[];
|
||||
s: any[];
|
||||
small: any[];
|
||||
span: any[];
|
||||
sub: any[];
|
||||
sup: any[];
|
||||
strong: any[];
|
||||
u: any[];
|
||||
ul: any[];
|
||||
};
|
||||
content: {};
|
||||
extraClass: string;
|
||||
html: boolean;
|
||||
sanitize: boolean;
|
||||
sanitizeFn: any;
|
||||
template: string;
|
||||
};
|
||||
static get DefaultType(): {
|
||||
allowList: string;
|
||||
content: string;
|
||||
extraClass: string;
|
||||
html: string;
|
||||
sanitize: string;
|
||||
sanitizeFn: string;
|
||||
template: string;
|
||||
};
|
||||
static get NAME(): string;
|
||||
constructor(config: any);
|
||||
_config: any;
|
||||
getContent(): any[];
|
||||
hasContent(): boolean;
|
||||
changeContent(content: any): TemplateFactory;
|
||||
toHtml(): Element;
|
||||
_typeCheckConfig(config: any): void;
|
||||
_checkContent(arg: any): void;
|
||||
_setContent(template: any, content: any, selector: any): void;
|
||||
_maybeSanitize(arg: any): any;
|
||||
_resolvePossibleFunction(arg: any): any;
|
||||
_putElementInTemplate(element: any, templateElement: any): void;
|
||||
}
|
||||
/**
|
||||
* --------------------------------------------------------------------------
|
||||
* Bootstrap util/config.js
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
/**
|
||||
* Class definition
|
||||
*/
|
||||
declare class Config {
|
||||
static get Default(): {};
|
||||
static get DefaultType(): {};
|
||||
static get NAME(): void;
|
||||
_getConfig(config: any): any;
|
||||
_configAfterMerge(config: any): any;
|
||||
_mergeConfigObj(config: any, element: any): any;
|
||||
_typeCheckConfig(config: any, configTypes?: any): void;
|
||||
}
|
||||
export {};
|
||||
93
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/prismjs/prism.d.ts
vendored
Normal file
93
components/wifi-manager/webapp/dist/src/bootswatch/docs/_vendor/prismjs/prism.d.ts
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
/// <reference lib="webworker" />
|
||||
export namespace languages {
|
||||
export namespace markup {
|
||||
namespace tag { }
|
||||
}
|
||||
import html = markup;
|
||||
export { html };
|
||||
import mathml = markup;
|
||||
export { mathml };
|
||||
import svg = markup;
|
||||
export { svg };
|
||||
export const xml: {
|
||||
[x: string]: RegExp | GrammarToken | (RegExp | GrammarToken)[];
|
||||
};
|
||||
import ssml = xml;
|
||||
export { ssml };
|
||||
import atom = xml;
|
||||
export { atom };
|
||||
import rss = xml;
|
||||
export { rss };
|
||||
export const clike: {
|
||||
comment: {
|
||||
pattern: RegExp;
|
||||
lookbehind: boolean;
|
||||
greedy: boolean;
|
||||
}[];
|
||||
string: {
|
||||
pattern: RegExp;
|
||||
greedy: boolean;
|
||||
};
|
||||
'class-name': {
|
||||
pattern: RegExp;
|
||||
lookbehind: boolean;
|
||||
inside: {
|
||||
punctuation: RegExp;
|
||||
};
|
||||
};
|
||||
keyword: RegExp;
|
||||
boolean: RegExp;
|
||||
function: RegExp;
|
||||
number: RegExp;
|
||||
operator: RegExp;
|
||||
punctuation: RegExp;
|
||||
};
|
||||
export const javascript: {
|
||||
[x: string]: RegExp | GrammarToken | (RegExp | GrammarToken)[];
|
||||
};
|
||||
import js = javascript;
|
||||
export { js };
|
||||
}
|
||||
/**
|
||||
* The expansion of a simple `RegExp` literal to support additional properties.
|
||||
*/
|
||||
export type GrammarToken = {
|
||||
/**
|
||||
* The regular expression of the token.
|
||||
*/
|
||||
pattern: RegExp;
|
||||
/**
|
||||
* If `true`, then the first capturing group of `pattern` will (effectively)
|
||||
* behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.
|
||||
*/
|
||||
lookbehind?: boolean;
|
||||
/**
|
||||
* Whether the token is greedy.
|
||||
*/
|
||||
greedy?: boolean;
|
||||
/**
|
||||
* An optional alias or list of aliases.
|
||||
*/
|
||||
alias?: string | string[];
|
||||
/**
|
||||
* The nested grammar of this token.
|
||||
*
|
||||
* The `inside` grammar will be used to tokenize the text value of each token of this kind.
|
||||
*
|
||||
* This can be used to make nested and even recursive language definitions.
|
||||
*
|
||||
* Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into
|
||||
* each another.
|
||||
*/
|
||||
inside?: Grammar;
|
||||
};
|
||||
export type Grammar = {
|
||||
[x: string]: RegExp | GrammarToken | Array<RegExp | GrammarToken>;
|
||||
};
|
||||
/**
|
||||
* A function which will invoked after an element was successfully highlighted.
|
||||
*/
|
||||
export type HighlightCallback = (element: Element) => void;
|
||||
export type HookCallback = (env: {
|
||||
[x: string]: any;
|
||||
}) => void;
|
||||
@@ -63,6 +63,10 @@ declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
@@ -193,6 +197,8 @@ declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare let sd: {};
|
||||
declare let rf: boolean;
|
||||
declare function refreshStatus(): void;
|
||||
|
||||
@@ -331,8 +331,7 @@
|
||||
|
||||
<div class="form-check">
|
||||
<label class="form-check-label">
|
||||
<input class="form-check-input" type="checkbox" id="disable-squeezelite"
|
||||
value="" checked="">
|
||||
<input class="form-check-input" type="checkbox" id="disable-squeezelite" value="" >
|
||||
Disable Squeezelite
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@@ -923,10 +923,10 @@ window.saveAutoexec1 = function (apply) {
|
||||
};
|
||||
data.config = {
|
||||
autoexec1: { value: commandLine, type: 33 },
|
||||
autoexec: {
|
||||
value: $('#disable-squeezelite').prop('checked') ? '0' : '1',
|
||||
type: 33,
|
||||
},
|
||||
// autoexec: {
|
||||
// value: $('#disable-squeezelite').prop('checked') ? '0' : '1',
|
||||
// type: 33,
|
||||
// },
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
@@ -1216,6 +1216,28 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
$('#disable-squeezelite').on('click', function () {
|
||||
// this.checked = this.checked ? 1 : 0;
|
||||
// $('#disable-squeezelite').prop('checked')
|
||||
if (this.checked) {
|
||||
// Store the current value before overwriting it
|
||||
const currentValue = $('#cmd_opt_s').val();
|
||||
$('#cmd_opt_s').data('originalValue', currentValue);
|
||||
|
||||
// Overwrite the value with '-disable'
|
||||
$('#cmd_opt_s').val('-disable');
|
||||
} else {
|
||||
// Retrieve the original value
|
||||
const originalValue = $('#cmd_opt_s').data('originalValue');
|
||||
|
||||
// Restore the original value if it exists, otherwise set it to an empty string
|
||||
$('#cmd_opt_s').val(originalValue ? originalValue : '');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
$('input#show-nvs').on('click', function () {
|
||||
this.checked = this.checked ? 1 : 0;
|
||||
Cookies.set("show-nvs", this.checked ? 'Y' : 'N');
|
||||
@@ -2199,13 +2221,7 @@ function getConfig() {
|
||||
.sort()
|
||||
.forEach(function (key) {
|
||||
let val = data[key].value;
|
||||
if (key === 'autoexec') {
|
||||
if (data.autoexec.value === '0') {
|
||||
$('#disable-squeezelite')[0].checked = true;
|
||||
} else {
|
||||
$('#disable-squeezelite')[0].checked = false;
|
||||
}
|
||||
} else if (key === 'autoexec1') {
|
||||
if (key === 'autoexec1') {
|
||||
/* call new function to parse the squeezelite options */
|
||||
processSqueezeliteCommandLine(val);
|
||||
} else if (key === 'host_name') {
|
||||
@@ -2294,6 +2310,7 @@ function processSqueezeliteCommandLine(val) {
|
||||
commandBTSinkName= parsed.otherOptions.btname;
|
||||
}
|
||||
handleTemplateTypeRadio('bt');
|
||||
|
||||
}
|
||||
Object.keys(parsed.options).forEach(function (key) {
|
||||
const option = parsed.options[key];
|
||||
@@ -2312,6 +2329,17 @@ function processSqueezeliteCommandLine(val) {
|
||||
$('#resample_i').prop('checked', true);
|
||||
}
|
||||
}
|
||||
if (parsed.options.hasOwnProperty('s')) {
|
||||
// parse -u v[:i] and check the appropriate radio button with id #resample_v
|
||||
if(parsed.options.s === '-disable'){
|
||||
$('#disable-squeezelite')[0].checked = true;
|
||||
}
|
||||
else {
|
||||
$('#disable-squeezelite')[0].checked = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.99c86edb045064f0ff9e.css.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.1ab179394339385e0a02.css.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/favicon-32x32.png BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/index.html.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.35c7f4.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.35c7f4.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.775de9.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.775de9.bundle.js.gz BINARY)
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
// Automatically generated. Do not edit manually!.
|
||||
#include <inttypes.h>
|
||||
extern const uint8_t _index_99c86edb045064f0ff9e_css_gz_start[] asm("_binary_index_99c86edb045064f0ff9e_css_gz_start");
|
||||
extern const uint8_t _index_99c86edb045064f0ff9e_css_gz_end[] asm("_binary_index_99c86edb045064f0ff9e_css_gz_end");
|
||||
extern const uint8_t _index_1ab179394339385e0a02_css_gz_start[] asm("_binary_index_1ab179394339385e0a02_css_gz_start");
|
||||
extern const uint8_t _index_1ab179394339385e0a02_css_gz_end[] asm("_binary_index_1ab179394339385e0a02_css_gz_end");
|
||||
extern const uint8_t _favicon_32x32_png_start[] asm("_binary_favicon_32x32_png_start");
|
||||
extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
|
||||
extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
|
||||
extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
|
||||
extern const uint8_t _index_35c7f4_bundle_js_gz_start[] asm("_binary_index_35c7f4_bundle_js_gz_start");
|
||||
extern const uint8_t _index_35c7f4_bundle_js_gz_end[] asm("_binary_index_35c7f4_bundle_js_gz_end");
|
||||
extern const uint8_t _node_vendors_35c7f4_bundle_js_gz_start[] asm("_binary_node_vendors_35c7f4_bundle_js_gz_start");
|
||||
extern const uint8_t _node_vendors_35c7f4_bundle_js_gz_end[] asm("_binary_node_vendors_35c7f4_bundle_js_gz_end");
|
||||
extern const uint8_t _index_775de9_bundle_js_gz_start[] asm("_binary_index_775de9_bundle_js_gz_start");
|
||||
extern const uint8_t _index_775de9_bundle_js_gz_end[] asm("_binary_index_775de9_bundle_js_gz_end");
|
||||
extern const uint8_t _node_vendors_775de9_bundle_js_gz_start[] asm("_binary_node_vendors_775de9_bundle_js_gz_start");
|
||||
extern const uint8_t _node_vendors_775de9_bundle_js_gz_end[] asm("_binary_node_vendors_775de9_bundle_js_gz_end");
|
||||
const char * resource_lookups[] = {
|
||||
"/css/index.99c86edb045064f0ff9e.css.gz",
|
||||
"/css/index.1ab179394339385e0a02.css.gz",
|
||||
"/favicon-32x32.png",
|
||||
"/index.html.gz",
|
||||
"/js/index.35c7f4.bundle.js.gz",
|
||||
"/js/node_vendors.35c7f4.bundle.js.gz",
|
||||
"/js/index.775de9.bundle.js.gz",
|
||||
"/js/node_vendors.775de9.bundle.js.gz",
|
||||
""
|
||||
};
|
||||
const uint8_t * resource_map_start[] = {
|
||||
_index_99c86edb045064f0ff9e_css_gz_start,
|
||||
_index_1ab179394339385e0a02_css_gz_start,
|
||||
_favicon_32x32_png_start,
|
||||
_index_html_gz_start,
|
||||
_index_35c7f4_bundle_js_gz_start,
|
||||
_node_vendors_35c7f4_bundle_js_gz_start
|
||||
_index_775de9_bundle_js_gz_start,
|
||||
_node_vendors_775de9_bundle_js_gz_start
|
||||
};
|
||||
const uint8_t * resource_map_end[] = {
|
||||
_index_99c86edb045064f0ff9e_css_gz_end,
|
||||
_index_1ab179394339385e0a02_css_gz_end,
|
||||
_favicon_32x32_png_end,
|
||||
_index_html_gz_end,
|
||||
_index_35c7f4_bundle_js_gz_end,
|
||||
_node_vendors_35c7f4_bundle_js_gz_end
|
||||
_index_775de9_bundle_js_gz_end,
|
||||
_node_vendors_775de9_bundle_js_gz_end
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/***********************************
|
||||
webpack_headers
|
||||
dist/css/index.99c86edb045064f0ff9e.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.35c7f4.bundle.js.gz,dist/js/node_vendors.35c7f4.bundle.js.gz
|
||||
dist/css/index.1ab179394339385e0a02.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.775de9.bundle.js.gz,dist/js/node_vendors.775de9.bundle.js.gz
|
||||
***********************************/
|
||||
#pragma once
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -913,7 +913,7 @@ CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
|
||||
CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y
|
||||
# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set
|
||||
CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y
|
||||
CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1
|
||||
CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=2
|
||||
CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
|
||||
# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set
|
||||
# CONFIG_FREERTOS_ASSERT_DISABLE is not set
|
||||
|
||||
BIN
server_certs/DigiCertGlobalRootCA.crt.57
Normal file
BIN
server_certs/DigiCertGlobalRootCA.crt.57
Normal file
Binary file not shown.
BIN
server_certs/DigiCertGlobalRootCA.crt.58
Normal file
BIN
server_certs/DigiCertGlobalRootCA.crt.58
Normal file
Binary file not shown.
BIN
server_certs/DigiCertGlobalRootCA.crt.59
Normal file
BIN
server_certs/DigiCertGlobalRootCA.crt.59
Normal file
Binary file not shown.
@@ -144,18 +144,18 @@ LxoOkcXsNb/12jOV3iQSDfXDI41AgtFc694KCOjlg+UKizpemE53T5/cq37OqChP
|
||||
qnlPyb6PYIhua/kgbH84ltba1xEDQ9i4UYfOMiJNZEzEdSfQ498=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIIXzCCB0egAwIBAgIQBKU3dDawNcfrgz6Dj4jGVjANBgkqhkiG9w0BAQsFADA8
|
||||
MIIIOzCCByOgAwIBAgIQDMnYcxFdn1+HZt0ULgDEwTANBgkqhkiG9w0BAQsFADA8
|
||||
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
|
||||
UlNBIDIwNDggTTAxMB4XDTIzMDcxMDAwMDAwMFoXDTI0MDYyMTIzNTk1OVowGzEZ
|
||||
UlNBIDIwNDggTTAxMB4XDTIzMTAxMDAwMDAwMFoXDTI0MDcxMDIzNTk1OVowGzEZ
|
||||
MBcGA1UEAxMQczMuYW1hem9uYXdzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
||||
ADCCAQoCggEBAMhVo8GFFI8V3qJuBvo9Mcp9O2FkASu1No2kmnXcZn6rqV5Z9Rdz
|
||||
DSTMBkgBz1UNxyOJ4HujSSjgqrDJ0Fv2uZ+xUfwh8wsZagpoMp6D53nOqzZxwmzi
|
||||
rs7iGbBHZ0TvROel/zUEayjwm1CpEhM6fPGArITcAUcBZ0kaDLrStyijuqaQQasP
|
||||
cnjcsTili+vWk4VhPNXKg9lkwQaWmcj/iUENx2l4Fqe6e93CmlqhYPMyf4lH2oiz
|
||||
MX7WZdR1w2bMIP/+J1AAuoll2y0CF60/7w+NidmpGQyujOUV2YPFYhJc0mLRyY0c
|
||||
btSo589TxMmhGbKwMywKQbXLueAC/CK0fUUCAwEAAaOCBXwwggV4MB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBSP/UslcNwoVtOJhOQj
|
||||
scAlxpUVVjCCAqwGA1UdEQSCAqMwggKfghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
ADCCAQoCggEBANbrGvFbxrAM6TKussVOuHpCNsZX1V+jR6TAfzrO8VQWqiz+DCq+
|
||||
LlGFT2is2kRxY+hv2NswgK+Ie4SUdypQDrJ+mKFadmM2UOqIcFepA4EIUESAXZHg
|
||||
lHJAv5460i6gp9Lh6imN3jGjC1Ax0rgrfBZA+uzIy8dorBEptIj/YpE4wD4WPHnk
|
||||
Y+wCDfMZdm6b6hqsrOkbqBWHH2zSH8TWfnYRguGe3NkLpM4pBNa2lTb1GBeZtm/W
|
||||
TB3dEAaxcGCu+WQbicI6BxkbzklgxKTHZ2Lc3mL8P5Ca1yWQG3asdUxw0SIkCZVd
|
||||
aCzQxqtLlXSxpe4xK2KjOfq2ZM+MZhq/tR0CAwEAAaOCBVgwggVUMB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBQi0miDsNb3pJw4EouH
|
||||
AR3hoCAaqzCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
LmFtYXpvbmF3cy5jb22CJiouczMuZHVhbHN0YWNrLnVzLWVhc3QtMS5hbWF6b25h
|
||||
d3MuY29tgiRzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CHCou
|
||||
czMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CGnMzLnVzLWVhc3QtMS5hbWF6b25h
|
||||
@@ -164,29 +164,28 @@ LWNvbnRyb2wudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CLiouczMtY29udHJvbC5k
|
||||
dWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CLHMzLWNvbnRyb2wuZHVh
|
||||
bHN0YWNrLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tgigqLnMzLWFjY2Vzc3BvaW50
|
||||
LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tgjIqLnMzLWFjY2Vzc3BvaW50LmR1YWxz
|
||||
dGFjay51cy1lYXN0LTEuYW1hem9uYXdzLmNvbYIhKi5zMy51cy1lYXN0LTEudnBj
|
||||
ZS5hbWF6b25hd3MuY29tgicqLnMzLWRlcHJlY2F0ZWQudXMtZWFzdC0xLmFtYXpv
|
||||
bmF3cy5jb22CJXMzLWRlcHJlY2F0ZWQudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22C
|
||||
G3MzLWV4dGVybmFsLTEuYW1hem9uYXdzLmNvbYIdKi5zMy1leHRlcm5hbC0xLmFt
|
||||
YXpvbmF3cy5jb22CG3MzLWV4dGVybmFsLTIuYW1hem9uYXdzLmNvbYIdKi5zMy1l
|
||||
eHRlcm5hbC0yLmFtYXpvbmF3cy5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
|
||||
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8v
|
||||
Y3JsLnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jcmwwEwYDVR0gBAwwCjAI
|
||||
BgZngQwBAgEwdQYIKwYBBQUHAQEEaTBnMC0GCCsGAQUFBzABhiFodHRwOi8vb2Nz
|
||||
cC5yMm0wMS5hbWF6b250cnVzdC5jb20wNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQu
|
||||
cjJtMDEuYW1hem9udHJ1c3QuY29tL3IybTAxLmNlcjAMBgNVHRMBAf8EAjAAMIIB
|
||||
fgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdwDuzdBk1dsazsVct520zROiModGfLzs
|
||||
3sNRSFlGcR+1mwAAAYlCAMrQAAAEAwBIMEYCIQCJhWcUFTgBlQtPboTv0HorPNkz
|
||||
l+/o8Fr1hFYfs+8bIQIhAOaCRLr5774k0iflsslqBMmubN3NC+mImezWIaMHPP26
|
||||
AHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGJQgDK8gAABAMA
|
||||
RjBEAiBalCI6KSCFXMTY15CgLEHtqeE/vyihg8FWthX4JgPcFwIgWkI//yF+tqBi
|
||||
Gs3sHuuGvG4v7rytkUM4Dli6sWAYXsYAdgA7U3d1Pi25gE6LMFsG/kA7Z9hPw/TH
|
||||
vQANLXJv4frUFwAAAYlCAMsyAAAEAwBHMEUCIQDfn+j2sutaXvO5yZ86z6OFgq1u
|
||||
WhNwM2MnEHfGhO+yCAIgLYi8SX6hZRGRZFxIrV1ekcRSk+9yN8oHNfOQOuGQQOEw
|
||||
DQYJKoZIhvcNAQELBQADggEBAIprc7vYrAerkphosDZ2frlk9gYBnlgTYT0wJXLC
|
||||
4ZTnlhXuMbL5gYmM8T1suPv5p2JphVFEsSS8PlmdQX45mPAlk8lHjHSZJRgL/r1Y
|
||||
7wWYjKB3oHl5N/5UZTtDTtfxtjd/3Vts6citxzhVwGxH+fQspligvb1Sgy8/ojjV
|
||||
lSz+QwpK2PrxRwvWPt0XImPj+5xPi8MOhRCh32Edtqy5fQkZiG/mYEvMMpq73kv0
|
||||
uWbcjMFN2XbSOSYkjjseVoTBly65MAxFyAFAdg9HMJeJ5hbegpl4PARhgdL8sG3h
|
||||
jEenWaFiCjwQ4iCPFeGk+vumNkL1c5OaLFZwhoZQ+KLkAQc=
|
||||
dGFjay51cy1lYXN0LTEuYW1hem9uYXdzLmNvbYInKi5zMy1kZXByZWNhdGVkLnVz
|
||||
LWVhc3QtMS5hbWF6b25hd3MuY29tgiVzMy1kZXByZWNhdGVkLnVzLWVhc3QtMS5h
|
||||
bWF6b25hd3MuY29tghtzMy1leHRlcm5hbC0xLmFtYXpvbmF3cy5jb22CHSouczMt
|
||||
ZXh0ZXJuYWwtMS5hbWF6b25hd3MuY29tghtzMy1leHRlcm5hbC0yLmFtYXpvbmF3
|
||||
cy5jb22CHSouczMtZXh0ZXJuYWwtMi5hbWF6b25hd3MuY29tMBMGA1UdIAQMMAow
|
||||
CAYGZ4EMAQIBMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
|
||||
KwYBBQUHAwIwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5yMm0wMS5hbWF6
|
||||
b250cnVzdC5jb20vcjJtMDEuY3JsMHUGCCsGAQUFBwEBBGkwZzAtBggrBgEFBQcw
|
||||
AYYhaHR0cDovL29jc3AucjJtMDEuYW1hem9udHJ1c3QuY29tMDYGCCsGAQUFBzAC
|
||||
hipodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXIwDAYD
|
||||
VR0TAQH/BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHYA7s3QZNXbGs7F
|
||||
XLedtM0TojKHRny87N7DUUhZRnEftZsAAAGLG2S5PwAABAMARzBFAiEAxOJvK1tq
|
||||
gzf5d6NPN4PZui5PhQePCg1bH/fVMd7T5ekCIHeOglhFW5BC0TNeHY+cfUOvDONT
|
||||
DV4fAVcaWsBXErw9AHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMA
|
||||
AAGLG2S5LwAABAMARjBEAiBYu16xOFIzUE9aMrB1vrFkTsMC3veucw9k0Hv4qO2v
|
||||
XAIgTTMRV9sq+ytuTU53XdoKLF33qeUZHGqop7O7xoFEENMAdgDatr9rP7W2Ip+b
|
||||
wrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYsbZLlmAAAEAwBHMEUCIQCD6n2r6DVx
|
||||
UMUgtfPRi3ieJdlObPzsrc0aGVhl6gCP5QIgbzkLqEOfJ7bozTgYzUO8ZDvAd0te
|
||||
cdpZv182ZEQ974wwDQYJKoZIhvcNAQELBQADggEBAHEAZnHOPS7CoRXWTqWbQu5V
|
||||
8x2uFNl5jjsbSH68xnviW24ShllvFyHH1iD2R3ov/3Ri8T8TJ0bA14u+3D/iPZk1
|
||||
BgX2/YdL/0/CptgISLhBtugBk2+MsRry6i7hhbf4/pIyL1uWHUeDuYrW882Xw1ul
|
||||
uD1wyC1z2CqXZWy0WL0zMV6Yfp/eFnCJ9tj0NoullHGhgk9RTU3qULwuAQmzMqS7
|
||||
XlhmgdzVPDq3s8qCawHDU6yDdT5FAO3SJ23Dj2efM7enBzq0jryfEZn9vTCRJfKI
|
||||
yCZT56FgMdEqvmQutAV5UCiL1acK8YU2zUQSxuWn+AyDivV4JSOYw8ho1yZrZZI=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
BIN
server_certs/r2m01.cer.29
Normal file
BIN
server_certs/r2m01.cer.29
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.30
Normal file
BIN
server_certs/r2m01.cer.30
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.31
Normal file
BIN
server_certs/r2m01.cer.31
Normal file
Binary file not shown.
@@ -1,16 +1,16 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIIXzCCB0egAwIBAgIQBKU3dDawNcfrgz6Dj4jGVjANBgkqhkiG9w0BAQsFADA8
|
||||
MIIIOzCCByOgAwIBAgIQDMnYcxFdn1+HZt0ULgDEwTANBgkqhkiG9w0BAQsFADA8
|
||||
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
|
||||
UlNBIDIwNDggTTAxMB4XDTIzMDcxMDAwMDAwMFoXDTI0MDYyMTIzNTk1OVowGzEZ
|
||||
UlNBIDIwNDggTTAxMB4XDTIzMTAxMDAwMDAwMFoXDTI0MDcxMDIzNTk1OVowGzEZ
|
||||
MBcGA1UEAxMQczMuYW1hem9uYXdzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
||||
ADCCAQoCggEBAMhVo8GFFI8V3qJuBvo9Mcp9O2FkASu1No2kmnXcZn6rqV5Z9Rdz
|
||||
DSTMBkgBz1UNxyOJ4HujSSjgqrDJ0Fv2uZ+xUfwh8wsZagpoMp6D53nOqzZxwmzi
|
||||
rs7iGbBHZ0TvROel/zUEayjwm1CpEhM6fPGArITcAUcBZ0kaDLrStyijuqaQQasP
|
||||
cnjcsTili+vWk4VhPNXKg9lkwQaWmcj/iUENx2l4Fqe6e93CmlqhYPMyf4lH2oiz
|
||||
MX7WZdR1w2bMIP/+J1AAuoll2y0CF60/7w+NidmpGQyujOUV2YPFYhJc0mLRyY0c
|
||||
btSo589TxMmhGbKwMywKQbXLueAC/CK0fUUCAwEAAaOCBXwwggV4MB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBSP/UslcNwoVtOJhOQj
|
||||
scAlxpUVVjCCAqwGA1UdEQSCAqMwggKfghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
ADCCAQoCggEBANbrGvFbxrAM6TKussVOuHpCNsZX1V+jR6TAfzrO8VQWqiz+DCq+
|
||||
LlGFT2is2kRxY+hv2NswgK+Ie4SUdypQDrJ+mKFadmM2UOqIcFepA4EIUESAXZHg
|
||||
lHJAv5460i6gp9Lh6imN3jGjC1Ax0rgrfBZA+uzIy8dorBEptIj/YpE4wD4WPHnk
|
||||
Y+wCDfMZdm6b6hqsrOkbqBWHH2zSH8TWfnYRguGe3NkLpM4pBNa2lTb1GBeZtm/W
|
||||
TB3dEAaxcGCu+WQbicI6BxkbzklgxKTHZ2Lc3mL8P5Ca1yWQG3asdUxw0SIkCZVd
|
||||
aCzQxqtLlXSxpe4xK2KjOfq2ZM+MZhq/tR0CAwEAAaOCBVgwggVUMB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBQi0miDsNb3pJw4EouH
|
||||
AR3hoCAaqzCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
LmFtYXpvbmF3cy5jb22CJiouczMuZHVhbHN0YWNrLnVzLWVhc3QtMS5hbWF6b25h
|
||||
d3MuY29tgiRzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CHCou
|
||||
czMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CGnMzLnVzLWVhc3QtMS5hbWF6b25h
|
||||
@@ -19,29 +19,28 @@ LWNvbnRyb2wudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CLiouczMtY29udHJvbC5k
|
||||
dWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CLHMzLWNvbnRyb2wuZHVh
|
||||
bHN0YWNrLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tgigqLnMzLWFjY2Vzc3BvaW50
|
||||
LnVzLWVhc3QtMS5hbWF6b25hd3MuY29tgjIqLnMzLWFjY2Vzc3BvaW50LmR1YWxz
|
||||
dGFjay51cy1lYXN0LTEuYW1hem9uYXdzLmNvbYIhKi5zMy51cy1lYXN0LTEudnBj
|
||||
ZS5hbWF6b25hd3MuY29tgicqLnMzLWRlcHJlY2F0ZWQudXMtZWFzdC0xLmFtYXpv
|
||||
bmF3cy5jb22CJXMzLWRlcHJlY2F0ZWQudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22C
|
||||
G3MzLWV4dGVybmFsLTEuYW1hem9uYXdzLmNvbYIdKi5zMy1leHRlcm5hbC0xLmFt
|
||||
YXpvbmF3cy5jb22CG3MzLWV4dGVybmFsLTIuYW1hem9uYXdzLmNvbYIdKi5zMy1l
|
||||
eHRlcm5hbC0yLmFtYXpvbmF3cy5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
|
||||
MBQGCCsGAQUFBwMBBggrBgEFBQcDAjA7BgNVHR8ENDAyMDCgLqAshipodHRwOi8v
|
||||
Y3JsLnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jcmwwEwYDVR0gBAwwCjAI
|
||||
BgZngQwBAgEwdQYIKwYBBQUHAQEEaTBnMC0GCCsGAQUFBzABhiFodHRwOi8vb2Nz
|
||||
cC5yMm0wMS5hbWF6b250cnVzdC5jb20wNgYIKwYBBQUHMAKGKmh0dHA6Ly9jcnQu
|
||||
cjJtMDEuYW1hem9udHJ1c3QuY29tL3IybTAxLmNlcjAMBgNVHRMBAf8EAjAAMIIB
|
||||
fgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdwDuzdBk1dsazsVct520zROiModGfLzs
|
||||
3sNRSFlGcR+1mwAAAYlCAMrQAAAEAwBIMEYCIQCJhWcUFTgBlQtPboTv0HorPNkz
|
||||
l+/o8Fr1hFYfs+8bIQIhAOaCRLr5774k0iflsslqBMmubN3NC+mImezWIaMHPP26
|
||||
AHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGJQgDK8gAABAMA
|
||||
RjBEAiBalCI6KSCFXMTY15CgLEHtqeE/vyihg8FWthX4JgPcFwIgWkI//yF+tqBi
|
||||
Gs3sHuuGvG4v7rytkUM4Dli6sWAYXsYAdgA7U3d1Pi25gE6LMFsG/kA7Z9hPw/TH
|
||||
vQANLXJv4frUFwAAAYlCAMsyAAAEAwBHMEUCIQDfn+j2sutaXvO5yZ86z6OFgq1u
|
||||
WhNwM2MnEHfGhO+yCAIgLYi8SX6hZRGRZFxIrV1ekcRSk+9yN8oHNfOQOuGQQOEw
|
||||
DQYJKoZIhvcNAQELBQADggEBAIprc7vYrAerkphosDZ2frlk9gYBnlgTYT0wJXLC
|
||||
4ZTnlhXuMbL5gYmM8T1suPv5p2JphVFEsSS8PlmdQX45mPAlk8lHjHSZJRgL/r1Y
|
||||
7wWYjKB3oHl5N/5UZTtDTtfxtjd/3Vts6citxzhVwGxH+fQspligvb1Sgy8/ojjV
|
||||
lSz+QwpK2PrxRwvWPt0XImPj+5xPi8MOhRCh32Edtqy5fQkZiG/mYEvMMpq73kv0
|
||||
uWbcjMFN2XbSOSYkjjseVoTBly65MAxFyAFAdg9HMJeJ5hbegpl4PARhgdL8sG3h
|
||||
jEenWaFiCjwQ4iCPFeGk+vumNkL1c5OaLFZwhoZQ+KLkAQc=
|
||||
dGFjay51cy1lYXN0LTEuYW1hem9uYXdzLmNvbYInKi5zMy1kZXByZWNhdGVkLnVz
|
||||
LWVhc3QtMS5hbWF6b25hd3MuY29tgiVzMy1kZXByZWNhdGVkLnVzLWVhc3QtMS5h
|
||||
bWF6b25hd3MuY29tghtzMy1leHRlcm5hbC0xLmFtYXpvbmF3cy5jb22CHSouczMt
|
||||
ZXh0ZXJuYWwtMS5hbWF6b25hd3MuY29tghtzMy1leHRlcm5hbC0yLmFtYXpvbmF3
|
||||
cy5jb22CHSouczMtZXh0ZXJuYWwtMi5hbWF6b25hd3MuY29tMBMGA1UdIAQMMAow
|
||||
CAYGZ4EMAQIBMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYI
|
||||
KwYBBQUHAwIwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5yMm0wMS5hbWF6
|
||||
b250cnVzdC5jb20vcjJtMDEuY3JsMHUGCCsGAQUFBwEBBGkwZzAtBggrBgEFBQcw
|
||||
AYYhaHR0cDovL29jc3AucjJtMDEuYW1hem9udHJ1c3QuY29tMDYGCCsGAQUFBzAC
|
||||
hipodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXIwDAYD
|
||||
VR0TAQH/BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHYA7s3QZNXbGs7F
|
||||
XLedtM0TojKHRny87N7DUUhZRnEftZsAAAGLG2S5PwAABAMARzBFAiEAxOJvK1tq
|
||||
gzf5d6NPN4PZui5PhQePCg1bH/fVMd7T5ekCIHeOglhFW5BC0TNeHY+cfUOvDONT
|
||||
DV4fAVcaWsBXErw9AHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMA
|
||||
AAGLG2S5LwAABAMARjBEAiBYu16xOFIzUE9aMrB1vrFkTsMC3veucw9k0Hv4qO2v
|
||||
XAIgTTMRV9sq+ytuTU53XdoKLF33qeUZHGqop7O7xoFEENMAdgDatr9rP7W2Ip+b
|
||||
wrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYsbZLlmAAAEAwBHMEUCIQCD6n2r6DVx
|
||||
UMUgtfPRi3ieJdlObPzsrc0aGVhl6gCP5QIgbzkLqEOfJ7bozTgYzUO8ZDvAd0te
|
||||
cdpZv182ZEQ974wwDQYJKoZIhvcNAQELBQADggEBAHEAZnHOPS7CoRXWTqWbQu5V
|
||||
8x2uFNl5jjsbSH68xnviW24ShllvFyHH1iD2R3ov/3Ri8T8TJ0bA14u+3D/iPZk1
|
||||
BgX2/YdL/0/CptgISLhBtugBk2+MsRry6i7hhbf4/pIyL1uWHUeDuYrW882Xw1ul
|
||||
uD1wyC1z2CqXZWy0WL0zMV6Yfp/eFnCJ9tj0NoullHGhgk9RTU3qULwuAQmzMqS7
|
||||
XlhmgdzVPDq3s8qCawHDU6yDdT5FAO3SJ23Dj2efM7enBzq0jryfEZn9vTCRJfKI
|
||||
yCZT56FgMdEqvmQutAV5UCiL1acK8YU2zUQSxuWn+AyDivV4JSOYw8ho1yZrZZI=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Reference in New Issue
Block a user