Fix include not always working, add visible to fingerprints ui (#1088)

Fix include not always working, add !visible to fingerprints
This commit is contained in:
Darrell 2023-11-05 12:26:04 -05:00 committed by GitHub
parent 63f5f9ab48
commit bd9e1d0dd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 2144 additions and 2115 deletions

View File

@ -16,6 +16,16 @@ class ClientCallbacks : public BLEClientCallbacks {
static ClientCallbacks clientCB;
BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff) : oneEuro{OneEuroFilter<float, unsigned long>(1, fcmin, beta, dcutoff)} {
firstSeenMillis = millis();
address = NimBLEAddress(advertisedDevice->getAddress());
addressType = advertisedDevice->getAddressType();
newest = recent = oldest = rssi = advertisedDevice->getRSSI();
seenCount = 1;
queryReport = nullptr;
fingerprintAddress();
}
bool BleFingerprint::shouldHide(const String &s) {
if (BleFingerprintCollection::include.length() > 0 && !prefixExists(BleFingerprintCollection::include, s)) return true;
return (BleFingerprintCollection::exclude.length() > 0 && prefixExists(BleFingerprintCollection::exclude, s));
@ -41,7 +51,7 @@ bool BleFingerprint::setId(const String &newId, short newIdType, const String &n
name = newName;
if (id != newId) {
hidden = shouldHide(newId);
bool newHidden = shouldHide(newId);
countable = !ignore && !hidden && !BleFingerprintCollection::countIds.isEmpty() && prefixExists(BleFingerprintCollection::countIds, newId);
bool newQuery = !ignore && !BleFingerprintCollection::query.isEmpty() && prefixExists(BleFingerprintCollection::query, newId);
if (newQuery != allowQuery) {
@ -58,13 +68,19 @@ bool BleFingerprint::setId(const String &newId, short newIdType, const String &n
}
}
id = newId;
hidden = newHidden;
added = false;
}
return true;
}
int BleFingerprint::get1mRssi() const {
const String BleFingerprint::getMac() const {
const auto nativeAddress = address.getNative();
return Sprintf("%02x%02x%02x%02x%02x%02x", nativeAddress[5], nativeAddress[4], nativeAddress[3], nativeAddress[2], nativeAddress[1], nativeAddress[0]);
}
const int BleFingerprint::get1mRssi() const {
if (calRssi != NO_RSSI) return calRssi + BleFingerprintCollection::rxAdjRssi;
if (bcnRssi != NO_RSSI) return bcnRssi + BleFingerprintCollection::rxAdjRssi;
if (mdRssi != NO_RSSI) return mdRssi + BleFingerprintCollection::rxAdjRssi;
@ -72,16 +88,6 @@ int BleFingerprint::get1mRssi() const {
return BleFingerprintCollection::rxRefRssi + DEFAULT_TX + BleFingerprintCollection::rxAdjRssi;
}
BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff) : oneEuro{OneEuroFilter<float, unsigned long>(1, fcmin, beta, dcutoff)} {
firstSeenMillis = millis();
address = NimBLEAddress(advertisedDevice->getAddress());
addressType = advertisedDevice->getAddressType();
newest = recent = oldest = rssi = advertisedDevice->getRSSI();
seenCount = 1;
queryReport = nullptr;
fingerprintAddress();
}
void BleFingerprint::fingerprint(NimBLEAdvertisedDevice *advertisedDevice) {
if (advertisedDevice->haveName()) {
const std::string name = advertisedDevice->getName();
@ -449,6 +455,7 @@ void BleFingerprint::setInitial(int initalRssi, float initalDistance) {
}
void BleFingerprint::fill(JsonObject *doc) {
(*doc)[F("mac")] = getMac();
(*doc)[F("id")] = id;
if (!name.isEmpty()) (*doc)[F("name")] = name;
if (!disc.isEmpty()) (*doc)[F("disc")] = disc;
@ -458,12 +465,10 @@ void BleFingerprint::fill(JsonObject *doc) {
(*doc)[F("rssi")] = rssi;
(*doc)[F("raw")] = serialized(String(raw, 2));
(*doc)[F("distance")] = serialized(String(output.value.position, 2));
(*doc)[F("speed")] = serialized(String(output.value.speed * 1e3f, 2));
(*doc)[F("mac")] = SMacf(address);
(*doc)[F("distance")] = serialized(String(hasValue ? output.value.position : raw, 2));
if (close) (*doc)[F("close")] = true;
(*doc)[F("interval")] = (millis() - firstSeenMillis) / seenCount;
(*doc)[F("int")] = (millis() - firstSeenMillis) / seenCount;
if (mv) (*doc)[F("mV")] = mv;
if (battery != 0xFF) (*doc)[F("batt")] = battery;
@ -472,22 +477,21 @@ void BleFingerprint::fill(JsonObject *doc) {
}
bool BleFingerprint::report(JsonObject *doc) {
if (ignore || idType <= ID_TYPE_RAND_MAC || hidden)
return false;
if (ignore || idType <= ID_TYPE_RAND_MAC || hidden) return false;
if (reported) return false;
if (reported || !hasValue)
return false;
auto dist = hasValue ? output.value.position : raw;
auto maxDistance = BleFingerprintCollection::maxDistance;
if (maxDistance > 0 && output.value.position > maxDistance)
if (maxDistance > 0 && dist > maxDistance)
return false;
auto now = millis();
if ((abs(output.value.position - lastReported) < BleFingerprintCollection::skipDistance) && (lastReportedMillis > 0) && (now - lastReportedMillis < BleFingerprintCollection::skipMs))
if ((abs(dist - lastReported) < BleFingerprintCollection::skipDistance) && (lastReportedMillis > 0) && (now - lastReportedMillis < BleFingerprintCollection::skipMs))
return false;
lastReportedMillis = now;
lastReported = output.value.position;
lastReported = dist;
reported = true;
fill(doc);
return true;
@ -540,7 +544,7 @@ bool BleFingerprint::query() {
bool BleFingerprint::shouldCount() {
bool prevCounting = counting;
if (ignore || !countable || !hasValue)
if (ignore || !countable)
counting = false;
else if (getMsSinceLastSeen() > BleFingerprintCollection::countMs)
counting = false;

View File

@ -60,10 +60,8 @@
#define ID_TYPE_KNOWN_MAC short(210)
#define ID_TYPE_ALIAS short(250)
class BleFingerprint
{
public:
class BleFingerprint {
public:
BleFingerprint(NimBLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff);
bool seen(BLEAdvertisedDevice *advertisedDevice);
@ -74,53 +72,52 @@ public:
bool query();
String getId() { return id; }
const String getId() const { return id; }
String getName() { return name; }
const String getName() const { return name; }
void setName(String &name) { this->name = name; }
void setName(const String &name) { this->name = name; }
bool setId(const String &newId, short int newIdType, const String &newName = "");
void setInitial(int rssi, float distance);
String getMac() const { return SMacf(address); }
const String getMac() const;
short getIdType() const { return idType; }
const short getIdType() const { return idType; }
String const getDiscriminator() { return disc; }
const String getDiscriminator() const { return disc; }
float getDistance() const { return output.value.position; }
const float getDistance() const { return output.value.position; }
int getRssi() const { return rssi; }
const int getRssi() const { return rssi; }
int getNewestRssi() const { return newest; }
const int getNewestRssi() const { return newest; }
int get1mRssi() const;
const int get1mRssi() const;
void set1mRssi(int8_t rssi) { this->calRssi = rssi; }
NimBLEAddress const getAddress() { return address; }
const NimBLEAddress getAddress() const { return address; }
unsigned long getMsSinceLastSeen() const { return lastSeenMillis ? millis() - lastSeenMillis : 4294967295; };
const unsigned long getMsSinceLastSeen() const { return lastSeenMillis ? millis() - lastSeenMillis : 4294967295; };
unsigned long getMsSinceFirstSeen() const { return millis() - firstSeenMillis; };
const unsigned long getMsSinceFirstSeen() const { return millis() - firstSeenMillis; };
bool getVisible() const { return !ignore && !hidden && hasValue; }
const bool getVisible() const { return !ignore && !hidden; }
bool getAdded() const { return added; };
const bool getAdded() const { return added; };
bool getIgnore() const { return ignore; };
const bool getIgnore() const { return ignore; };
bool getAllowQuery() const { return allowQuery; };
const bool getAllowQuery() const { return allowQuery; };
const bool hasReport() { return queryReport != nullptr; };
const QueryReport getReport() { return *queryReport; };
void setReport(const QueryReport &report) { queryReport = std::unique_ptr<QueryReport>(new QueryReport {report}); };
void setReport(const QueryReport &report) { queryReport = std::unique_ptr<QueryReport>(new QueryReport{report}); };
void clearReport() { queryReport.reset(); };
unsigned int getSeenCount()
{
unsigned int getSeenCount() {
auto sc = seenCount - lastSeenCount;
lastSeenCount = seenCount;
return sc;
@ -131,8 +128,7 @@ public:
void expire();
private:
private:
static bool shouldHide(const String &s);
bool hasValue = false, added = false, close = false, reported = false, ignore = false, allowQuery = false, isQuerying = false, hidden = false, connectable = false, countable = false, counting = false;

View File

@ -8,11 +8,6 @@
#define ESPMAC (Sprintf("%06x", CHIPID))
#define Sprintf(f, ...) ({ char* s; asprintf(&s, f, __VA_ARGS__); const String r = s; free(s); r; })
#define Stdprintf(f, ...) ({ char* s; asprintf(&s, f, __VA_ARGS__); const std::string r = s; free(s); r; })
#define SMacf(f) ( \
{ \
const auto nativeAddress = (f).getNative(); \
Sprintf("%02x%02x%02x%02x%02x%02x", nativeAddress[5], nativeAddress[4], nativeAddress[3], nativeAddress[2], nativeAddress[1], nativeAddress[0]); \
})
std::string slugify(const std::string& text);
String slugify(const String& text);

View File

@ -40,14 +40,16 @@ void serializeConfigs(JsonObject &root) {
}
}
void serializeDevices(JsonObject &root) {
void serializeDevices(JsonObject &root, bool showAll) {
JsonArray devices = root.createNestedArray("devices");
auto f = BleFingerprintCollection::GetCopy();
for (auto it = f.begin(); it != f.end(); ++it) {
if ((*it)->getVisible()) {
bool visible = (*it)->getVisible();
if (showAll || visible) {
JsonObject node = devices.createNestedObject();
(*it)->fill(&node);
if (showAll && visible) node[F("vis")] = true;
}
}
}
@ -57,17 +59,24 @@ bool servingJson = false;
void serveJson(AsyncWebServerRequest *request) {
if (servingJson) request->send(429, "Too Many Requests", "Too Many Requests");
servingJson = true;
bool showAll = false;
const String &url = request->url();
short subJson = 0;
if (url.indexOf("devices") > 0) subJson = 1;
if (url.indexOf("configs") > 0) subJson = 2;
int paramsNr = request->params();
for (int i = 0; i < paramsNr; i++) {
AsyncWebParameter *p = request->getParam(i);
if (p->name() == "showAll") showAll = true;
}
auto *response = new AsyncJsonResponse(false, JSON_BUFFER_SIZE);
JsonObject root = response->getRoot();
serializeInfo(root);
switch (subJson) {
case 1:
serializeDevices(root);
serializeDevices(root, showAll);
break;
case 2:
serializeConfigs(root);

View File

@ -18,7 +18,7 @@
#define UPDATE_STARTED -255
#define UPDATE_COMPLETE 255
#define JSON_BUFFER_SIZE 10240
#define JSON_BUFFER_SIZE (12 * 1024)
#define BLE_SCAN_INTERVAL 0x80
#define BLE_SCAN_WINDOW 0x80

View File

@ -4,7 +4,7 @@
*/
// Autogenerated do not edit!!
const uint16_t BUNDLE_CSS_L = 3724;
const uint16_t BUNDLE_CSS_L = 3737;
const uint8_t BUNDLE_CSS[] PROGMEM = {
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xed, 0x1b, 0x6b, 0x93, 0xe3, 0xb6,
0xed, 0x73, 0xf3, 0x2b, 0x94, 0xdc, 0x64, 0x66, 0x9d, 0x4a, 0x3a, 0x49, 0x7e, 0xed, 0xca, 0x93,
@ -102,143 +102,144 @@
0x23, 0xc9, 0xb3, 0x35, 0x3d, 0x74, 0x8b, 0xac, 0xce, 0xa1, 0x9f, 0x0b, 0x50, 0x68, 0x97, 0x82,
0xa1, 0x78, 0xae, 0xd1, 0x27, 0x7a, 0xfd, 0x69, 0x0f, 0x6d, 0xe1, 0xa8, 0x09, 0xa9, 0xf7, 0xe6,
0x35, 0x81, 0xbc, 0x94, 0xb9, 0x37, 0x4d, 0x0f, 0x5f, 0x2b, 0x54, 0x6e, 0xd4, 0x49, 0xfe, 0xe4,
0xee, 0xc8, 0x01, 0x52, 0x27, 0xd5, 0x8b, 0x35, 0x4f, 0xae, 0x3c, 0x2a, 0x76, 0xa3, 0xc3, 0x23,
0x28, 0x0f, 0x89, 0xd1, 0xf3, 0xb1, 0xc7, 0xf0, 0xf6, 0xc9, 0x65, 0x8b, 0xc2, 0xf1, 0x3a, 0xbe,
0x38, 0xbc, 0x93, 0x9b, 0x39, 0x34, 0x3d, 0x92, 0xb9, 0x2c, 0xcb, 0xf6, 0xdd, 0xec, 0xe0, 0x2c,
0x04, 0xc4, 0x49, 0xf1, 0x0e, 0x46, 0x56, 0xe1, 0x4c, 0x0c, 0xcd, 0xa9, 0xf8, 0x58, 0x01, 0xc2,
0x08, 0x57, 0x43, 0x42, 0x77, 0x39, 0x26, 0x65, 0x30, 0x46, 0xac, 0x89, 0xe2, 0xf4, 0x22, 0x35,
0xd3, 0xa8, 0x85, 0x06, 0xc7, 0x9e, 0xb1, 0x38, 0xec, 0x0e, 0x59, 0xd3, 0xf3, 0xae, 0x62, 0x9c,
0x3a, 0xc1, 0x80, 0x6b, 0x0f, 0x9f, 0x14, 0x08, 0x98, 0xc6, 0xf1, 0xbd, 0x4e, 0x63, 0x15, 0xc8,
0x2e, 0x8d, 0x33, 0xd7, 0xe1, 0xee, 0x5a, 0xc1, 0x17, 0x3a, 0x9c, 0x0f, 0x9f, 0x65, 0xa1, 0xc3,
0x9c, 0x14, 0xe6, 0x2a, 0xc5, 0x07, 0x05, 0xa3, 0x0d, 0x6a, 0x74, 0x76, 0x24, 0x1a, 0x60, 0x34,
0xd8, 0xc9, 0xe5, 0x0e, 0x32, 0xcc, 0x45, 0xdd, 0xc4, 0xf1, 0x03, 0x99, 0xc2, 0xce, 0x99, 0xbc,
0x04, 0x8c, 0xd2, 0xd7, 0x90, 0x04, 0x68, 0xd7, 0xa6, 0xa9, 0x82, 0xd2, 0xd4, 0x16, 0x60, 0x10,
0xe4, 0x31, 0xce, 0x35, 0xe8, 0x4b, 0x72, 0x72, 0x5f, 0xa1, 0xb7, 0xf0, 0x29, 0xd1, 0xf9, 0xd5,
0x59, 0x07, 0x12, 0xf4, 0x28, 0x20, 0x8c, 0x9d, 0x96, 0x28, 0xbb, 0x19, 0x0c, 0x59, 0x80, 0xd9,
0x47, 0x1d, 0x45, 0x73, 0x6a, 0x67, 0x7d, 0x00, 0x8c, 0xca, 0xae, 0x1f, 0x3d, 0xc6, 0x88, 0x8e,
0x0b, 0xd6, 0x71, 0xf1, 0xda, 0xa9, 0x4f, 0x70, 0x54, 0x70, 0x59, 0x71, 0x82, 0xcf, 0x0a, 0xff,
0x08, 0xc3, 0x85, 0x13, 0xa3, 0x98, 0x16, 0x46, 0x0a, 0x41, 0x8f, 0xf7, 0x89, 0x09, 0x5d, 0x74,
0xd4, 0x79, 0x01, 0xd4, 0x66, 0x39, 0xd8, 0x11, 0x8e, 0x6e, 0x35, 0xec, 0x5a, 0xa8, 0x6a, 0x3a,
0x96, 0xf2, 0xb3, 0xc3, 0x5c, 0xcd, 0xac, 0xcc, 0xc1, 0x92, 0x26, 0xc2, 0xf4, 0xd8, 0x31, 0x20,
0xe2, 0xa0, 0x93, 0x4b, 0x0b, 0x92, 0x64, 0x77, 0x14, 0x6c, 0x64, 0x4b, 0x96, 0x32, 0x75, 0x56,
0x0a, 0xc7, 0x99, 0x99, 0xa4, 0x26, 0xc3, 0x2d, 0x6e, 0x5e, 0xa9, 0xd5, 0x4d, 0x3a, 0xb6, 0xa8,
0x25, 0x16, 0x56, 0x26, 0x6b, 0xc2, 0x0a, 0xfb, 0x03, 0xcc, 0x73, 0xf3, 0x20, 0x0f, 0x22, 0xb3,
0x7f, 0x0f, 0x9b, 0x3c, 0xef, 0x90, 0xc4, 0x15, 0x86, 0x58, 0x52, 0xd3, 0x54, 0x41, 0x77, 0x66,
0x08, 0x91, 0xd1, 0x03, 0x75, 0xc5, 0xaf, 0x1e, 0x7c, 0xcb, 0xb1, 0x5e, 0x50, 0xf5, 0x30, 0xd5,
0x6b, 0x36, 0x9b, 0x0d, 0xd7, 0x58, 0xdf, 0xef, 0x7c, 0x17, 0xa9, 0x28, 0x2c, 0xc4, 0xdb, 0x15,
0x3d, 0x8e, 0x15, 0x15, 0xab, 0x97, 0x8b, 0x64, 0x7e, 0x67, 0x0a, 0x3d, 0xf6, 0x42, 0xf5, 0xd5,
0xad, 0xf7, 0x98, 0x1a, 0x9e, 0xd6, 0x6d, 0xd6, 0x5b, 0x55, 0xc0, 0x7e, 0x89, 0x6d, 0xc1, 0x3d,
0x63, 0x42, 0x0f, 0x8e, 0xce, 0xf1, 0x96, 0xee, 0x92, 0x56, 0x1b, 0xb2, 0x2a, 0x97, 0xd3, 0x21,
0x8b, 0xf5, 0xc0, 0x87, 0x51, 0x1e, 0xfa, 0x51, 0x9b, 0x1d, 0x67, 0x6a, 0x3f, 0xe9, 0xeb, 0xb7,
0xaa, 0xd7, 0x70, 0xe4, 0xe3, 0xae, 0x33, 0xa5, 0x34, 0xdd, 0x34, 0x9d, 0xc0, 0xf3, 0xee, 0xd0,
0x5d, 0x9d, 0xe1, 0x87, 0x55, 0x41, 0xc8, 0x74, 0x1e, 0x82, 0xe0, 0xc9, 0x0a, 0xe6, 0x3e, 0xfc,
0x2e, 0xdf, 0x9a, 0xe2, 0x45, 0x37, 0x2a, 0x9b, 0x6d, 0x5b, 0xdc, 0x90, 0x7c, 0xd7, 0xea, 0xc6,
0x1b, 0x19, 0x6c, 0x54, 0xb4, 0xe4, 0x05, 0x79, 0x1e, 0x0b, 0x22, 0x42, 0x14, 0xcd, 0x12, 0xdb,
0x3a, 0x7c, 0x82, 0x7f, 0x74, 0x87, 0x93, 0x24, 0xe9, 0xde, 0x20, 0x10, 0xa1, 0x4a, 0xe2, 0xb3,
0xd8, 0xc4, 0xcf, 0x45, 0x88, 0xe6, 0xe0, 0x6e, 0xb0, 0x35, 0xb3, 0xcd, 0x53, 0xce, 0x4a, 0x37,
0x35, 0x3d, 0x3a, 0x45, 0x33, 0x59, 0x47, 0x57, 0x68, 0x69, 0xe0, 0xc1, 0x89, 0xe0, 0x5e, 0x13,
0x0e, 0xbb, 0x51, 0x13, 0x6e, 0xf7, 0x34, 0x71, 0xc2, 0xb0, 0x21, 0x49, 0xce, 0x7b, 0x9d, 0xab,
0x59, 0x4f, 0x64, 0x9c, 0x7d, 0xca, 0x79, 0x61, 0x05, 0xcb, 0x85, 0xc6, 0x79, 0x3f, 0xc5, 0x75,
0x7d, 0x07, 0xd7, 0x27, 0x6b, 0xfd, 0x68, 0x05, 0xfe, 0xea, 0x02, 0x4f, 0x66, 0x83, 0x7b, 0x34,
0x5d, 0xcc, 0xad, 0x60, 0x01, 0x9a, 0x2e, 0xae, 0x72, 0x5d, 0xde, 0xce, 0xd5, 0xf7, 0xd6, 0x96,
0xef, 0x2f, 0x2c, 0x3f, 0x78, 0xbc, 0xc0, 0x15, 0x32, 0xe7, 0x7b, 0x98, 0x06, 0xf3, 0x27, 0x6b,
0xf5, 0x08, 0xff, 0x2f, 0xb0, 0xd4, 0x8a, 0xb9, 0xdd, 0xa5, 0x4a, 0x2f, 0x23, 0x66, 0x2b, 0xe1,
0x66, 0xe9, 0xcb, 0xa5, 0x25, 0x7e, 0x2f, 0xc8, 0x3f, 0xe2, 0x14, 0xf2, 0xc9, 0xbb, 0x26, 0x60,
0x49, 0x8d, 0xff, 0x64, 0xf9, 0x4f, 0x97, 0xf8, 0x8a, 0x96, 0xb3, 0x5e, 0x8e, 0xf8, 0x7a, 0x90,
0x02, 0x9d, 0xdc, 0xd2, 0xf1, 0x55, 0x59, 0xd2, 0x0d, 0xf8, 0x82, 0x2b, 0x21, 0xeb, 0x52, 0x30,
0x09, 0x5a, 0x28, 0x90, 0x2f, 0x20, 0xab, 0x1e, 0x22, 0xa9, 0x0e, 0x90, 0x80, 0x0a, 0x20, 0xdf,
0xc8, 0x54, 0x11, 0x54, 0x6c, 0x50, 0x1e, 0x23, 0xf2, 0x87, 0x44, 0x5c, 0xae, 0x41, 0xa9, 0x94,
0x39, 0x40, 0xe2, 0x36, 0x24, 0x5f, 0x4f, 0x91, 0xaf, 0x15, 0xf9, 0x72, 0x48, 0xee, 0x4f, 0xb2,
0xf7, 0x35, 0xfe, 0x2b, 0xb3, 0xc3, 0x24, 0xbd, 0x20, 0x3f, 0x6a, 0x43, 0x14, 0x5b, 0x60, 0x3f,
0x48, 0xba, 0xbd, 0x79, 0x8c, 0xc8, 0x37, 0x89, 0x0c, 0x2d, 0x58, 0x0e, 0x1a, 0x28, 0x9e, 0xc1,
0x88, 0x7c, 0x4c, 0xdd, 0x13, 0x7f, 0x70, 0x97, 0x23, 0xfa, 0xd5, 0x04, 0xff, 0x55, 0x2f, 0x60,
0x3e, 0xea, 0xb0, 0x1e, 0xd3, 0xaf, 0x15, 0xf9, 0xa3, 0x49, 0x1e, 0x98, 0xc4, 0x01, 0x23, 0x65,
0x77, 0x2e, 0xd4, 0x6a, 0xfc, 0xf6, 0x85, 0x97, 0x6b, 0x69, 0x5b, 0xa0, 0x44, 0x86, 0xa5, 0x21,
0x65, 0x72, 0xc5, 0x40, 0xcc, 0xb6, 0x3a, 0x96, 0x01, 0x04, 0x72, 0x7e, 0xd0, 0xef, 0xdb, 0x7c,
0xf7, 0x91, 0x6b, 0xac, 0xdf, 0x0d, 0x05, 0xd2, 0x84, 0x5c, 0x8f, 0xfd, 0x80, 0xde, 0x0f, 0x46,
0xf4, 0xbe, 0x1c, 0x22, 0xbf, 0xc8, 0xce, 0x34, 0xfa, 0x29, 0xf6, 0xfe, 0x80, 0xbd, 0xa1, 0xce,
0x35, 0xee, 0x87, 0x5a, 0xe7, 0x3e, 0xc1, 0x9c, 0xa7, 0xd3, 0x94, 0x24, 0x65, 0x66, 0xd0, 0x2f,
0xc2, 0xe6, 0x9e, 0x27, 0x70, 0x19, 0x86, 0xdd, 0x30, 0x1b, 0x20, 0x97, 0x0a, 0xc9, 0xef, 0xa0,
0x07, 0xc8, 0x85, 0x42, 0xd6, 0x38, 0x23, 0xf4, 0x02, 0x75, 0x80, 0x5e, 0x29, 0x74, 0x93, 0x90,
0x7c, 0x80, 0xf2, 0x29, 0xaa, 0x2d, 0x4b, 0x5c, 0x45, 0xa8, 0xc6, 0xe6, 0x75, 0x9a, 0x42, 0x9c,
0xdc, 0x14, 0x23, 0xe6, 0x06, 0xcb, 0xee, 0xbc, 0xb1, 0x58, 0xe4, 0x5f, 0xc8, 0x70, 0xc6, 0x40,
0x7d, 0x40, 0xd3, 0x02, 0xfe, 0x72, 0x65, 0xf9, 0xab, 0xb9, 0xe5, 0xaf, 0xb5, 0x28, 0xa6, 0x53,
0xd3, 0x38, 0xd6, 0x33, 0x5c, 0x5e, 0x67, 0x38, 0xb5, 0x83, 0x9c, 0x67, 0xb8, 0xba, 0xca, 0x70,
0xbd, 0xb4, 0x1e, 0x97, 0xd6, 0xd3, 0xd3, 0x2d, 0xdc, 0x1e, 0xaf, 0x72, 0x83, 0xac, 0x61, 0xe1,
0x5b, 0xcb, 0x9b, 0x06, 0xfb, 0x74, 0x7d, 0xb0, 0x6b, 0xd8, 0x02, 0xac, 0xf9, 0x35, 0xdd, 0xb4,
0xfd, 0xea, 0x2c, 0xab, 0xc9, 0x6d, 0xca, 0xe4, 0xa6, 0x5d, 0x1a, 0xa9, 0xf9, 0x98, 0xb8, 0x90,
0xe2, 0x05, 0x4a, 0x8d, 0xf6, 0xe6, 0x89, 0x9a, 0xe8, 0x74, 0x5e, 0xee, 0xff, 0x54, 0x24, 0xaf,
0x84, 0x75, 0xc3, 0x52, 0x1e, 0x24, 0x8d, 0xd6, 0x1c, 0x7e, 0x3d, 0x8b, 0xd5, 0x0c, 0x79, 0xd5,
0xc8, 0xf5, 0x67, 0x36, 0x47, 0x05, 0xf0, 0x4b, 0xeb, 0x43, 0x06, 0xf6, 0x4c, 0xe5, 0xaf, 0x67,
0xd6, 0x9f, 0x7f, 0x34, 0x9a, 0x11, 0xd3, 0x69, 0xaa, 0x8d, 0x76, 0x6d, 0xac, 0x28, 0xc6, 0x85,
0x4b, 0x5b, 0x55, 0x1a, 0x67, 0xf6, 0x90, 0xec, 0x02, 0x9e, 0xa3, 0xc0, 0x18, 0xe2, 0xea, 0x57,
0x5e, 0x60, 0x8b, 0xcb, 0x4e, 0xf6, 0xb8, 0x88, 0x96, 0xb0, 0x52, 0x1a, 0xe2, 0xf9, 0x9f, 0x5e,
0x07, 0x5a, 0x33, 0x9c, 0xf5, 0x4a, 0xf7, 0xd5, 0x42, 0x0d, 0x28, 0xeb, 0x84, 0x1a, 0x48, 0x55,
0x08, 0x35, 0x58, 0x5f, 0x1b, 0xd4, 0x80, 0xbc, 0x2a, 0xa8, 0x01, 0x64, 0xdd, 0x4f, 0x07, 0xd1,
0x8a, 0x9f, 0xd6, 0xd6, 0x6a, 0x9c, 0x74, 0x6d, 0xd0, 0xd8, 0xc6, 0x8a, 0x68, 0xdc, 0x96, 0x75,
0xa7, 0x41, 0xe2, 0x56, 0xbc, 0x4f, 0x71, 0xfd, 0x65, 0xbd, 0xd1, 0x10, 0x25, 0xf0, 0x00, 0xc1,
0xc7, 0x90, 0xf5, 0xb1, 0xcd, 0xdc, 0xcc, 0xd6, 0x4f, 0x0b, 0xb6, 0xf1, 0xd8, 0x45, 0x40, 0xc1,
0x54, 0x29, 0x7b, 0xed, 0xf2, 0x8c, 0x75, 0xce, 0x0d, 0xc9, 0xe8, 0x84, 0xec, 0xda, 0x5c, 0x14,
0x47, 0xda, 0x2d, 0x89, 0x9c, 0x2d, 0xfe, 0x44, 0x70, 0xf5, 0xe0, 0x2e, 0xa8, 0x33, 0x05, 0xb6,
0x3f, 0x54, 0x5c, 0x78, 0xec, 0x7d, 0x9a, 0x8b, 0x4e, 0xbf, 0x48, 0xb6, 0xe4, 0xce, 0xce, 0x4b,
0x93, 0x52, 0x83, 0xfa, 0xe4, 0x26, 0xb4, 0x42, 0xfa, 0x21, 0x94, 0x67, 0x15, 0x88, 0x8b, 0x21,
0x03, 0xdd, 0x9a, 0xdc, 0xce, 0x3d, 0x6b, 0xb5, 0x18, 0x6e, 0x0a, 0xc3, 0xd4, 0xb6, 0x17, 0x20,
0x0f, 0x2e, 0xf7, 0x09, 0xb8, 0xe1, 0xf8, 0x62, 0x88, 0x08, 0xee, 0x16, 0x31, 0x79, 0x4a, 0x9c,
0x12, 0x31, 0xd8, 0x40, 0x74, 0x21, 0xff, 0xc5, 0x36, 0x32, 0x62, 0xfd, 0x74, 0x23, 0xeb, 0xeb,
0x7b, 0x0a, 0x7b, 0xd0, 0xf2, 0x21, 0xfc, 0x04, 0x56, 0x0f, 0xd9, 0xe7, 0xee, 0x13, 0x7b, 0x62,
0x74, 0x80, 0x0c, 0x42, 0x61, 0xe5, 0x91, 0x9c, 0x4e, 0x3f, 0x24, 0x33, 0x82, 0xf0, 0xc6, 0x03,
0xb6, 0xbf, 0x80, 0x40, 0xfd, 0x04, 0x8a, 0x2c, 0xe7, 0x97, 0x0e, 0xd8, 0x42, 0x94, 0x8c, 0x4a,
0xb4, 0xb8, 0x2a, 0xe4, 0xc8, 0x97, 0x36, 0x34, 0x78, 0xf2, 0x37, 0x90, 0xfa, 0x6b, 0x1d, 0xe3,
0x25, 0x4b, 0xc0, 0x0a, 0xf1, 0x9c, 0x17, 0x0b, 0x89, 0x0b, 0x5d, 0xdb, 0x89, 0x4b, 0xa0, 0x61,
0x00, 0x65, 0x05, 0xf7, 0x99, 0xe5, 0xb1, 0x9f, 0xc9, 0x10, 0xcc, 0x2a, 0x0e, 0xb3, 0x69, 0x9c,
0x88, 0xe2, 0xa3, 0xdb, 0xa4, 0x0b, 0x32, 0x58, 0x09, 0x69, 0x01, 0x23, 0xfb, 0xfd, 0x25, 0x71,
0xa6, 0xbc, 0xbb, 0xb6, 0x8b, 0xe9, 0x4d, 0x62, 0xb4, 0x35, 0x68, 0xbb, 0xc6, 0xd0, 0x82, 0x53,
0xd3, 0xce, 0xa5, 0xa8, 0x49, 0x9f, 0xb8, 0x85, 0x9b, 0x9e, 0x77, 0xbd, 0x1f, 0xcc, 0xfa, 0x1f,
0x69, 0x42, 0x8c, 0xac, 0x87, 0xb2, 0xc2, 0x3b, 0x5c, 0xd5, 0xbc, 0xb7, 0x53, 0x47, 0x09, 0xce,
0x70, 0x18, 0xa3, 0xea, 0x79, 0xd6, 0xb9, 0xf4, 0x8f, 0x72, 0x41, 0xa3, 0x06, 0x71, 0xdd, 0xf9,
0x26, 0x6b, 0x10, 0x23, 0xe7, 0x1b, 0xcb, 0x58, 0xdd, 0x2e, 0x63, 0x9c, 0x54, 0x9e, 0x15, 0x20,
0x8c, 0xb9, 0xba, 0xbd, 0x32, 0x30, 0x5f, 0x03, 0xe7, 0x4b, 0x61, 0x47, 0x71, 0x36, 0xd4, 0xbe,
0xca, 0x79, 0x42, 0xed, 0x0b, 0x8c, 0xef, 0xa8, 0x50, 0x41, 0xe2, 0xb9, 0x02, 0xde, 0xfe, 0x6d,
0x8c, 0x1f, 0xef, 0xb0, 0xc5, 0x28, 0x50, 0x4e, 0x31, 0xee, 0xa3, 0xa4, 0x7f, 0x35, 0xe7, 0x9e,
0xdc, 0x39, 0xcc, 0x10, 0x69, 0xb2, 0x9d, 0x5f, 0x67, 0xeb, 0xc1, 0x94, 0xf9, 0xc0, 0xda, 0x7f,
0xba, 0x9d, 0xed, 0xaf, 0x74, 0xbe, 0xd2, 0xd8, 0xfe, 0x6a, 0x47, 0x05, 0xce, 0xd3, 0xc8, 0x03,
0xd6, 0x77, 0xef, 0xa1, 0xd7, 0x2a, 0x97, 0xa6, 0x18, 0xe9, 0xd1, 0xf7, 0x89, 0xb9, 0xcd, 0xaf,
0xf5, 0x2d, 0x95, 0xd9, 0xe9, 0xa6, 0xfd, 0xf4, 0x0e, 0x6b, 0x8d, 0x22, 0xe8, 0xe3, 0xdd, 0x11,
0x74, 0x22, 0x71, 0x32, 0xe2, 0xe7, 0x84, 0x2c, 0x65, 0xb4, 0xfb, 0x64, 0x8d, 0xad, 0x66, 0x88,
0x52, 0xb1, 0xba, 0xbf, 0x5e, 0x5c, 0x2d, 0xbc, 0xf2, 0x00, 0x11, 0xba, 0xce, 0x3e, 0x84, 0x19,
0xbd, 0xae, 0xd6, 0xee, 0x85, 0x20, 0x79, 0xa0, 0xe0, 0x89, 0x6b, 0x56, 0x0a, 0x9e, 0xb8, 0xc0,
0x64, 0x4c, 0xd8, 0x4d, 0x65, 0xba, 0xd7, 0x2e, 0x2a, 0xe7, 0xbc, 0x34, 0x25, 0x79, 0x39, 0xea,
0xae, 0xb2, 0xbf, 0x77, 0x04, 0xd0, 0x90, 0x40, 0xde, 0xbb, 0x4c, 0x10, 0x4a, 0x14, 0xef, 0x20,
0xef, 0x00, 0x11, 0xf3, 0xa1, 0x33, 0x57, 0x82, 0x1c, 0xc9, 0x3b, 0xd0, 0x72, 0xa7, 0x51, 0x14,
0x0d, 0xa6, 0x0a, 0x8c, 0xf2, 0xa2, 0x5a, 0xf4, 0xb9, 0xa7, 0x26, 0xc9, 0xba, 0x1c, 0x75, 0x31,
0xb2, 0x68, 0x37, 0xae, 0x22, 0xea, 0x62, 0x2e, 0x14, 0xef, 0x14, 0x7a, 0xaa, 0x46, 0xc6, 0xd1,
0xaa, 0x0a, 0x64, 0x0f, 0xa8, 0xa7, 0x4a, 0x42, 0x13, 0x8e, 0xb0, 0x5e, 0x3d, 0x32, 0x47, 0xc8,
0x62, 0xae, 0xfb, 0xa8, 0x00, 0x3a, 0x37, 0x35, 0x9f, 0x9f, 0xe1, 0xe4, 0x7b, 0xc1, 0x82, 0xb1,
0x4a, 0xf7, 0xdc, 0xda, 0xc1, 0xd0, 0x74, 0xf3, 0xb1, 0xe1, 0x38, 0xab, 0xcf, 0xd8, 0x45, 0xb5,
0x5b, 0xbf, 0x60, 0x38, 0xb9, 0x3a, 0x71, 0x8d, 0x76, 0xeb, 0x66, 0xd8, 0x1a, 0x78, 0x1b, 0xa9,
0xbf, 0x49, 0x49, 0xf4, 0x7c, 0xad, 0x8f, 0x0d, 0x84, 0xef, 0x8a, 0xea, 0x3a, 0x6f, 0xe3, 0x21,
0x6d, 0x53, 0x0d, 0xf1, 0x56, 0x93, 0x58, 0xfc, 0x61, 0xfb, 0x79, 0x9d, 0x3e, 0xcb, 0x10, 0xc9,
0x25, 0x7a, 0x8e, 0x93, 0x16, 0x55, 0xc3, 0x2a, 0x7d, 0xe2, 0x1b, 0xd8, 0x71, 0x21, 0xf6, 0x57,
0xe1, 0xe1, 0xd2, 0x12, 0xa1, 0x24, 0xf3, 0x57, 0x3f, 0x6f, 0xd7, 0x6d, 0xa0, 0xdd, 0xa3, 0x84,
0x6f, 0xa2, 0x28, 0xea, 0xdf, 0x45, 0xf7, 0x4b, 0x75, 0xe1, 0xf5, 0x73, 0x43, 0xbf, 0x65, 0xb1,
0x99, 0x7a, 0xf0, 0x62, 0x70, 0x9d, 0xfc, 0x12, 0x53, 0x12, 0x98, 0x74, 0xec, 0xbd, 0xb8, 0x4f,
0xbf, 0x38, 0x61, 0xf5, 0x5f, 0x07, 0x32, 0xee, 0xae, 0x7d, 0xe3, 0xd9, 0x09, 0x1d, 0xed, 0xe2,
0x0c, 0xa3, 0xe0, 0x5e, 0x4e, 0xc8, 0x60, 0x14, 0xd2, 0xaf, 0x35, 0xc9, 0xb7, 0xd6, 0xf4, 0xc9,
0x97, 0xf9, 0x4d, 0x18, 0xf6, 0x38, 0x24, 0x45, 0x5b, 0x9c, 0x9a, 0x2a, 0x44, 0xb0, 0xd6, 0x2a,
0x18, 0x6e, 0x93, 0xf0, 0x47, 0xdd, 0x26, 0x67, 0x76, 0x11, 0x4c, 0x5f, 0xf2, 0xff, 0xe3, 0xeb,
0xe8, 0xe3, 0xcc, 0x1e, 0xba, 0x4d, 0x6f, 0x38, 0xf6, 0xa5, 0x30, 0x5f, 0x1d, 0x89, 0xde, 0x2c,
0x16, 0x8b, 0xcd, 0xf0, 0xdd, 0xb5, 0xba, 0xf5, 0x99, 0xe3, 0xc3, 0x46, 0x73, 0x34, 0x26, 0x55,
0x49, 0x18, 0x59, 0x28, 0x2d, 0x50, 0xc3, 0x02, 0xc7, 0xe0, 0x11, 0x83, 0xc3, 0xac, 0xaf, 0x9b,
0x85, 0x7d, 0x8d, 0xe5, 0x82, 0xf2, 0xf5, 0xc7, 0xd9, 0xd9, 0x03, 0xdc, 0x9b, 0x18, 0xfb, 0xa7,
0xd2, 0xec, 0x2c, 0x5e, 0x73, 0x9f, 0xd3, 0x20, 0x30, 0x62, 0x88, 0x4f, 0x77, 0x93, 0xc8, 0xd4,
0x7f, 0xd2, 0x06, 0x22, 0x54, 0xb3, 0x0b, 0xe8, 0x68, 0x6c, 0x4b, 0x71, 0xf1, 0xa3, 0xef, 0x53,
0x9b, 0x8b, 0xef, 0x43, 0x0c, 0xf7, 0xd8, 0x18, 0x0f, 0xb8, 0x74, 0x6b, 0xbb, 0xdb, 0x26, 0xbf,
0xb4, 0x98, 0xc0, 0x12, 0x9b, 0xf1, 0x6c, 0x52, 0x97, 0x1a, 0xde, 0xa0, 0xc3, 0x68, 0xf5, 0x2f,
0xe3, 0xb0, 0xd9, 0xb8, 0xac, 0x63, 0x7f, 0xeb, 0x87, 0xb3, 0xcf, 0x49, 0x56, 0xd2, 0x38, 0x06,
0x07, 0x66, 0xf1, 0x00, 0x48, 0x87, 0xd1, 0x5b, 0x80, 0xdd, 0xc8, 0xc7, 0xf8, 0x9d, 0xdf, 0xc9,
0x65, 0x61, 0xd6, 0x44, 0xca, 0x1b, 0xc0, 0xcf, 0xfa, 0x88, 0xe2, 0xa3, 0x79, 0x14, 0x55, 0xc7,
0x4e, 0xbd, 0xce, 0xf4, 0xbc, 0x85, 0xa7, 0xe9, 0xbc, 0x00, 0x8d, 0x8d, 0x2b, 0x8a, 0xcd, 0xd9,
0x7b, 0x89, 0xff, 0x00, 0xf5, 0xfe, 0xd7, 0x66, 0x48, 0x39, 0x00, 0x00
0xbe, 0x90, 0x9a, 0xd0, 0x53, 0x1d, 0xfb, 0x4b, 0x52, 0x3a, 0x1e, 0x01, 0x3a, 0xb9, 0x3b, 0x72,
0x80, 0xb4, 0x4a, 0x71, 0x64, 0xcd, 0x93, 0x2b, 0x8f, 0x91, 0xdd, 0xe8, 0x60, 0x09, 0x03, 0x83,
0xa4, 0xe9, 0xf9, 0xd8, 0x63, 0x78, 0xfb, 0xe4, 0xb2, 0x05, 0xe3, 0x78, 0x1d, 0x5f, 0x38, 0xde,
0xc9, 0xcd, 0x1c, 0x9a, 0x3a, 0xc9, 0x3c, 0x97, 0x9d, 0x04, 0xdc, 0xec, 0xe0, 0x2c, 0x04, 0xc4,
0x49, 0xf1, 0x0e, 0x46, 0x5d, 0xe1, 0x4c, 0x0c, 0xdb, 0xa9, 0xb8, 0x1d, 0x00, 0xc2, 0x08, 0x57,
0x43, 0x42, 0x77, 0x39, 0x26, 0x65, 0x30, 0x46, 0xac, 0x89, 0xe2, 0xf4, 0x22, 0x6d, 0xd3, 0xa8,
0x85, 0x06, 0xc7, 0x9e, 0xb1, 0x38, 0x08, 0x0f, 0x59, 0xd3, 0xb3, 0xb0, 0x62, 0x9c, 0x3a, 0xc1,
0x80, 0x6b, 0x0f, 0x9f, 0x14, 0x08, 0x98, 0xc6, 0xf1, 0xbd, 0x4e, 0x63, 0x15, 0xc8, 0x2e, 0x8d,
0x33, 0xd7, 0xe1, 0xee, 0x5a, 0xc1, 0x17, 0x3a, 0x9c, 0x0f, 0x9f, 0x65, 0xa8, 0xc3, 0x7c, 0x15,
0xe6, 0x2a, 0xc5, 0x07, 0x05, 0xa3, 0x0d, 0x6a, 0x74, 0x76, 0x5c, 0x1a, 0x60, 0x34, 0xd8, 0xc9,
0xe5, 0xce, 0x33, 0xcc, 0x53, 0xdd, 0xc4, 0xf1, 0x03, 0x99, 0xde, 0xce, 0x99, 0xbc, 0x04, 0x8c,
0xd2, 0xd7, 0x97, 0x04, 0x68, 0xd7, 0xa6, 0xa9, 0x82, 0xd2, 0xb4, 0x17, 0x60, 0xb0, 0x01, 0x60,
0x9c, 0x6b, 0xd0, 0x97, 0xe4, 0xe4, 0xbe, 0x42, 0x6f, 0xe1, 0x6f, 0xa2, 0xf3, 0xab, 0xb3, 0x0e,
0x24, 0xe8, 0x51, 0x40, 0x18, 0x3b, 0x2d, 0x89, 0x76, 0x33, 0x18, 0xb2, 0x00, 0xb3, 0x8f, 0x3a,
0x8a, 0xe6, 0xdb, 0xce, 0xfa, 0x00, 0x18, 0x95, 0x79, 0x3f, 0x7a, 0x8c, 0x11, 0x1d, 0x17, 0xac,
0xf1, 0xe2, 0xb5, 0x53, 0x9f, 0xe0, 0x18, 0xe1, 0xb2, 0xc2, 0x05, 0x9f, 0x15, 0xfe, 0x11, 0x86,
0x0b, 0xa7, 0x49, 0x31, 0x2d, 0x8c, 0x14, 0x02, 0x22, 0xef, 0x13, 0x13, 0xba, 0x20, 0xa9, 0xf3,
0x02, 0xa8, 0xcd, 0x72, 0xb0, 0x23, 0x1c, 0xeb, 0x6a, 0xd8, 0xd1, 0x50, 0xd5, 0x74, 0xec, 0x38,
0xc0, 0x0e, 0x7a, 0x35, 0xb3, 0x32, 0x07, 0x4b, 0x9a, 0x08, 0xd3, 0x23, 0xc9, 0x80, 0x88, 0x83,
0x4e, 0x2e, 0x2d, 0x56, 0x92, 0xdd, 0x51, 0xb0, 0x91, 0x2d, 0x59, 0xe6, 0xd4, 0x59, 0x29, 0x1c,
0x67, 0x66, 0x92, 0x9a, 0x0c, 0xb7, 0xb8, 0x79, 0xa5, 0x56, 0x37, 0xe9, 0xd8, 0x82, 0x97, 0x58,
0x58, 0x99, 0xac, 0x09, 0x2b, 0xec, 0x0f, 0x30, 0xcf, 0xcd, 0x83, 0x3c, 0xa4, 0xcc, 0xfe, 0x3d,
0x6c, 0xf2, 0x9c, 0x44, 0x12, 0x57, 0x18, 0xe2, 0x4c, 0x4d, 0xd3, 0x08, 0xdd, 0x99, 0x21, 0x7c,
0x46, 0x0f, 0xd4, 0x15, 0xbf, 0x7a, 0xf0, 0x2d, 0xc7, 0x7a, 0x41, 0xd5, 0xc3, 0x54, 0xaf, 0xd9,
0x6c, 0x36, 0x5c, 0x63, 0x7d, 0xbf, 0xf3, 0x5d, 0xa4, 0xa2, 0xb0, 0x10, 0x6f, 0x57, 0xf4, 0x38,
0x56, 0x54, 0xac, 0x5e, 0x2e, 0x92, 0xf9, 0x9d, 0x29, 0xf4, 0xd8, 0x0b, 0xd5, 0x57, 0xb7, 0xde,
0x63, 0x6a, 0x78, 0x5a, 0xb7, 0x59, 0x6f, 0x55, 0x01, 0xfb, 0x25, 0xb6, 0x05, 0xf7, 0x8c, 0x09,
0x3d, 0x54, 0x3a, 0xc7, 0x5b, 0xba, 0x4b, 0x5a, 0x6d, 0xc8, 0xaa, 0x94, 0x4e, 0x87, 0x2c, 0xd6,
0x03, 0x1f, 0x46, 0x79, 0xe8, 0x47, 0x6d, 0x76, 0x9c, 0xa9, 0xbd, 0xa6, 0xaf, 0xed, 0xaa, 0x5e,
0xc3, 0x91, 0x8f, 0xbb, 0xce, 0x94, 0xd2, 0x74, 0x43, 0x75, 0x02, 0xcf, 0xbb, 0x43, 0x77, 0x75,
0xbe, 0x1f, 0x56, 0x0c, 0x21, 0x0b, 0x7a, 0x08, 0x82, 0x27, 0x2b, 0x98, 0xfb, 0xf0, 0xbb, 0x7c,
0x6b, 0x8a, 0x17, 0xdd, 0xa8, 0x6c, 0xb6, 0xa5, 0x71, 0x43, 0xf2, 0x1d, 0xad, 0x1b, 0x6f, 0x72,
0xb0, 0x51, 0xd1, 0x72, 0x18, 0xe4, 0x80, 0x2c, 0x88, 0x08, 0x51, 0x34, 0x83, 0x6c, 0xeb, 0xf0,
0x09, 0xfe, 0xd1, 0xdd, 0x4f, 0x92, 0xa4, 0x7b, 0x83, 0x40, 0x84, 0x2a, 0x89, 0xcf, 0x62, 0x13,
0x3f, 0x17, 0x21, 0x9a, 0x83, 0xbb, 0xc1, 0xb6, 0xcd, 0x36, 0x56, 0x39, 0x2b, 0xdd, 0xd4, 0xf4,
0xe8, 0x14, 0xcd, 0x64, 0x8d, 0x5d, 0xa1, 0xa5, 0x81, 0x07, 0xa7, 0x85, 0x7b, 0x4d, 0x38, 0xec,
0x46, 0x4d, 0xb8, 0xdd, 0xd3, 0xa4, 0x0a, 0xc3, 0x86, 0x24, 0x39, 0xef, 0x75, 0xae, 0x66, 0xad,
0x91, 0x71, 0xf6, 0x29, 0xe7, 0x85, 0x15, 0x2c, 0x17, 0x1a, 0xe7, 0xfd, 0x14, 0xd7, 0xf5, 0x1d,
0x5c, 0x9f, 0xac, 0xf5, 0xa3, 0x15, 0xf8, 0xab, 0x0b, 0x3c, 0x99, 0x0d, 0xee, 0xd1, 0x74, 0x31,
0xb7, 0x82, 0x05, 0x68, 0xba, 0xb8, 0xca, 0x75, 0x79, 0x3b, 0x57, 0xdf, 0x5b, 0x5b, 0xbe, 0xbf,
0xb0, 0xfc, 0xe0, 0xf1, 0x02, 0x57, 0xc8, 0xaa, 0xef, 0x61, 0x1a, 0xcc, 0x9f, 0xac, 0xd5, 0x23,
0xfc, 0xbf, 0xc0, 0x52, 0x2b, 0xf4, 0x76, 0x97, 0xaa, 0xc0, 0x8c, 0x98, 0xad, 0x84, 0x9b, 0xa5,
0x2f, 0x97, 0x96, 0xf8, 0xbd, 0x20, 0xff, 0x88, 0x53, 0xc8, 0x35, 0xef, 0x9a, 0x80, 0x25, 0x35,
0xfe, 0x93, 0xe5, 0x3f, 0x5d, 0xe2, 0x2b, 0x5a, 0xce, 0x7a, 0x39, 0xe2, 0xeb, 0x41, 0x0a, 0x74,
0x72, 0x4b, 0xc7, 0x57, 0x25, 0x4b, 0x37, 0xe0, 0x0b, 0xae, 0x84, 0xac, 0x4b, 0xc1, 0x24, 0x68,
0xa1, 0x40, 0xbe, 0x80, 0xac, 0x7a, 0x88, 0xa4, 0x3a, 0x40, 0x02, 0x2a, 0x80, 0x7c, 0x23, 0x53,
0x05, 0x52, 0xb1, 0x41, 0x79, 0x8c, 0xc8, 0x1f, 0x12, 0x71, 0xb9, 0x06, 0xa5, 0x52, 0xe6, 0x00,
0x89, 0xdb, 0x90, 0x7c, 0x3d, 0x45, 0xbe, 0x56, 0xe4, 0xcb, 0x21, 0xb9, 0x3f, 0xc9, 0xde, 0xd7,
0xf8, 0xaf, 0xcc, 0x0e, 0x93, 0xf4, 0x82, 0xfc, 0xa8, 0x0d, 0x51, 0x6c, 0x81, 0xfd, 0x20, 0xe9,
0xf6, 0xe6, 0x31, 0x22, 0xdf, 0x24, 0x32, 0xb4, 0x60, 0x39, 0x68, 0xa0, 0x78, 0x06, 0x23, 0xf2,
0x31, 0x75, 0x4f, 0xfc, 0xc1, 0x5d, 0x8e, 0xe8, 0x57, 0x13, 0xfc, 0x57, 0xbd, 0x80, 0xf9, 0xa8,
0xc3, 0x7a, 0x4c, 0xbf, 0x56, 0xe4, 0x8f, 0x26, 0x79, 0x60, 0x12, 0x07, 0x8c, 0x94, 0xdd, 0xc7,
0x50, 0xab, 0xf1, 0x9b, 0x19, 0x5e, 0xca, 0xa5, 0x6d, 0x81, 0x12, 0x19, 0x96, 0x86, 0x94, 0xc9,
0x15, 0x03, 0x31, 0xdb, 0xea, 0x58, 0x06, 0x10, 0xc8, 0xf9, 0x41, 0xbf, 0x8b, 0xf3, 0xdd, 0x47,
0xae, 0xb1, 0x7e, 0x6f, 0x14, 0x48, 0x13, 0x72, 0x3d, 0xf6, 0x03, 0x7a, 0x3f, 0x18, 0xd1, 0xfb,
0x72, 0x88, 0xfc, 0x92, 0x3b, 0xd3, 0xe8, 0xa7, 0xd8, 0xfb, 0x03, 0xf6, 0x86, 0x3a, 0xd7, 0xb8,
0x1f, 0x6a, 0x9d, 0xfb, 0x04, 0x73, 0x9e, 0x4e, 0x53, 0x92, 0x94, 0x99, 0x41, 0xbf, 0x24, 0x9b,
0x7b, 0x9e, 0xc0, 0x65, 0x18, 0x76, 0xc3, 0x6c, 0x80, 0x5c, 0x2a, 0x24, 0xbf, 0x9f, 0x1e, 0x20,
0x17, 0x0a, 0x59, 0xe3, 0x8c, 0xd0, 0xcb, 0xd5, 0x01, 0x7a, 0xa5, 0xd0, 0x4d, 0x42, 0xf2, 0x01,
0xca, 0xa7, 0xa8, 0xb6, 0x2c, 0x71, 0x15, 0xa1, 0x1a, 0x9b, 0x57, 0x6d, 0x0a, 0x71, 0x72, 0x53,
0x8c, 0x98, 0x1b, 0x2c, 0xbb, 0xf3, 0xc6, 0x62, 0x91, 0x7f, 0x21, 0xc3, 0x19, 0x03, 0xf5, 0x01,
0x4d, 0x0b, 0xf8, 0xcb, 0x95, 0xe5, 0xaf, 0xe6, 0x96, 0xbf, 0xd6, 0xa2, 0x98, 0x4e, 0x4d, 0xe3,
0x58, 0xcf, 0x70, 0x79, 0x9d, 0xe1, 0xd4, 0x0e, 0x72, 0x9e, 0xe1, 0xea, 0x2a, 0xc3, 0xf5, 0xd2,
0x7a, 0x5c, 0x5a, 0x4f, 0x4f, 0xb7, 0x70, 0x7b, 0xbc, 0xca, 0x0d, 0xb2, 0x86, 0x85, 0x6f, 0x2d,
0x6f, 0x1a, 0xec, 0xd3, 0xf5, 0xc1, 0xae, 0x61, 0x0b, 0xb0, 0xe6, 0xd7, 0x74, 0xd3, 0xf6, 0xab,
0xb3, 0xac, 0x26, 0xb7, 0x29, 0x93, 0x9b, 0x76, 0xa1, 0xa4, 0xe6, 0x63, 0xe2, 0xb2, 0x8a, 0x17,
0x2f, 0x35, 0xda, 0x9b, 0x27, 0x6a, 0xa2, 0xd3, 0x79, 0xb9, 0xff, 0x53, 0x91, 0xbc, 0x4a, 0xd6,
0x0d, 0xcb, 0x7c, 0x90, 0x34, 0x5a, 0x73, 0xf8, 0xf5, 0x2c, 0x56, 0x4f, 0xe4, 0x15, 0x25, 0xd7,
0x9f, 0xd9, 0x1c, 0x15, 0xc0, 0x2f, 0xad, 0x1d, 0x19, 0xd8, 0x33, 0x55, 0xc1, 0x9e, 0x59, 0x7f,
0xfe, 0xd1, 0x68, 0x46, 0x4c, 0xa7, 0xa9, 0x36, 0xda, 0x95, 0xb2, 0xa2, 0x18, 0x17, 0x35, 0x6d,
0x55, 0x85, 0x9c, 0xd9, 0x43, 0xb2, 0x0b, 0x78, 0x8e, 0x02, 0x63, 0x88, 0x6b, 0x61, 0x79, 0xb9,
0x2d, 0x2e, 0x42, 0xd9, 0xc3, 0x23, 0x5a, 0xc2, 0x4a, 0x69, 0x88, 0xe7, 0x7f, 0x7a, 0x1d, 0x68,
0x3d, 0x71, 0xd6, 0x2b, 0xdd, 0x57, 0x12, 0x35, 0xa0, 0xac, 0x21, 0x6a, 0x20, 0x55, 0x3d, 0xd4,
0x60, 0x7d, 0xdd, 0x50, 0x03, 0xf2, 0x8a, 0xa1, 0x06, 0x90, 0x35, 0x41, 0x1d, 0x44, 0xab, 0x81,
0x5a, 0x5b, 0xab, 0x7f, 0xd2, 0xb5, 0x41, 0x63, 0x1b, 0x2b, 0xa2, 0x71, 0x5b, 0xd6, 0x9d, 0x06,
0x89, 0x5b, 0xf1, 0x76, 0xc5, 0xf5, 0x97, 0xf5, 0x46, 0x43, 0x94, 0xc0, 0x03, 0x04, 0x1f, 0x43,
0xd6, 0xc7, 0x36, 0x73, 0x33, 0x5b, 0x3f, 0x2d, 0xd8, 0xc6, 0x43, 0x18, 0x01, 0x05, 0x53, 0xa5,
0xec, 0x25, 0xcc, 0x33, 0xd6, 0x39, 0x37, 0x24, 0xa3, 0x13, 0xb2, 0x6b, 0x73, 0x51, 0x1c, 0x69,
0xb7, 0x24, 0x72, 0xb6, 0xf8, 0x13, 0xc1, 0xd5, 0x83, 0xbb, 0xa0, 0xce, 0x14, 0xd8, 0xfe, 0x50,
0x71, 0xe1, 0xb1, 0xf7, 0x69, 0x2e, 0x3a, 0xfd, 0x22, 0xd9, 0x92, 0x3b, 0x3b, 0x2f, 0x4d, 0x4a,
0x0d, 0xea, 0x93, 0x9b, 0xd0, 0xea, 0xe9, 0x87, 0x50, 0x9e, 0x55, 0x20, 0x2e, 0x86, 0x0c, 0x74,
0x6b, 0x72, 0x3b, 0xf7, 0xac, 0xd5, 0x62, 0xb8, 0x29, 0x0c, 0x53, 0xdb, 0x5e, 0x80, 0x3c, 0xb8,
0xdc, 0x27, 0xe0, 0x86, 0xe3, 0x8b, 0x21, 0x22, 0xb8, 0x5b, 0xc4, 0xe4, 0x29, 0x71, 0x4a, 0xc4,
0x60, 0x03, 0xd1, 0x85, 0xfc, 0x17, 0xdb, 0xc8, 0x88, 0xf5, 0xd3, 0x8d, 0xac, 0xaf, 0xef, 0x29,
0xec, 0xb1, 0xcb, 0x87, 0xf0, 0x13, 0x58, 0x3d, 0x64, 0x9f, 0xbb, 0x4f, 0xec, 0xf9, 0xd1, 0x01,
0x32, 0x08, 0x85, 0x95, 0x47, 0x72, 0x3a, 0xfd, 0x90, 0xcc, 0x08, 0xc2, 0x1b, 0x0f, 0xd8, 0xfe,
0x02, 0x02, 0xf5, 0x13, 0x28, 0xb2, 0x9c, 0x5f, 0x3a, 0x60, 0x0b, 0x51, 0x32, 0x2a, 0xd1, 0xe2,
0xaa, 0x90, 0x23, 0x5f, 0xe1, 0xd0, 0xe0, 0xc9, 0xdf, 0x47, 0xea, 0x2f, 0x79, 0x8c, 0x57, 0x2e,
0xf4, 0x91, 0x8b, 0xe4, 0xc5, 0x42, 0xe2, 0x42, 0xd7, 0x76, 0xe2, 0x82, 0x68, 0x18, 0x40, 0x59,
0xc1, 0x7d, 0x66, 0x79, 0xec, 0x67, 0x32, 0x04, 0xb3, 0x8a, 0xc3, 0x6c, 0x1a, 0x27, 0xa2, 0xf8,
0xe8, 0xa6, 0xe9, 0x82, 0x0c, 0x56, 0x42, 0x5a, 0xc0, 0xc8, 0x7e, 0x7f, 0x49, 0x9c, 0x29, 0xef,
0xae, 0xed, 0x62, 0x7a, 0x93, 0x18, 0x6d, 0x0d, 0xda, 0xae, 0x31, 0xb4, 0xe0, 0xd4, 0xb4, 0x73,
0x29, 0x6a, 0xd2, 0x27, 0x6e, 0xe8, 0xa6, 0xe7, 0x5d, 0xef, 0x07, 0xb3, 0xfe, 0x47, 0x9a, 0x10,
0x23, 0xeb, 0xa1, 0xac, 0xf0, 0x0e, 0x57, 0x35, 0xef, 0xed, 0xd4, 0x51, 0x82, 0x33, 0x1c, 0xc6,
0xa8, 0x7a, 0x9e, 0x75, 0x2e, 0xfd, 0xa3, 0x5c, 0xd0, 0xa8, 0x41, 0x5c, 0x77, 0xbe, 0xc9, 0x1a,
0xc4, 0xc8, 0xf9, 0xc6, 0x32, 0x56, 0xb7, 0xcb, 0x18, 0x27, 0x95, 0x67, 0x05, 0x08, 0x63, 0xae,
0x6e, 0xaf, 0x0c, 0xcc, 0xd7, 0xc0, 0xf9, 0x52, 0xd8, 0x51, 0x9c, 0x0d, 0xb5, 0xaf, 0x72, 0x9e,
0x50, 0xfb, 0x02, 0xe3, 0x3b, 0x2a, 0x54, 0x90, 0x78, 0xae, 0x80, 0xb7, 0x7f, 0x1b, 0xe3, 0xc7,
0x3b, 0x6c, 0x31, 0x0a, 0x94, 0x53, 0x8c, 0xfb, 0x28, 0xe9, 0x5f, 0xcd, 0xb9, 0x27, 0x77, 0x0e,
0x33, 0x44, 0x9a, 0x6c, 0xe7, 0xd7, 0xd9, 0x7a, 0x30, 0x65, 0x3e, 0xb0, 0xf6, 0x9f, 0x6e, 0x67,
0xfb, 0x2b, 0x9d, 0xaf, 0x34, 0xb6, 0xbf, 0xda, 0x51, 0x81, 0xf3, 0x34, 0xf2, 0x80, 0xf5, 0xdd,
0x7b, 0xe8, 0xb5, 0xca, 0xa5, 0x29, 0x46, 0x7a, 0xf4, 0x7d, 0x62, 0x6e, 0xf3, 0x6b, 0x7d, 0x4b,
0x65, 0x76, 0xba, 0x69, 0x3f, 0xbd, 0xc3, 0x5a, 0xa3, 0x08, 0xfa, 0x78, 0x77, 0x04, 0x9d, 0x48,
0x9c, 0x8c, 0xf8, 0x39, 0x21, 0x4b, 0x19, 0xed, 0x3e, 0x59, 0x63, 0xab, 0x19, 0xa2, 0x54, 0xac,
0xee, 0xaf, 0x17, 0x57, 0x0b, 0xaf, 0x3c, 0x40, 0x84, 0xae, 0xb3, 0x0f, 0x61, 0x46, 0xaf, 0xab,
0xb5, 0x7b, 0x21, 0x48, 0x1e, 0x28, 0x78, 0xe2, 0x9a, 0x95, 0x82, 0x27, 0x2e, 0x30, 0x19, 0x13,
0x76, 0x53, 0x99, 0xee, 0xb5, 0x8b, 0xca, 0x39, 0x2f, 0x4d, 0x49, 0x5e, 0x8e, 0xba, 0xab, 0xec,
0xef, 0x1d, 0x01, 0x34, 0x24, 0x90, 0xf7, 0x2e, 0x13, 0x84, 0x12, 0xc5, 0x3b, 0xc8, 0x3b, 0x40,
0xc4, 0x7c, 0xe8, 0xcc, 0x95, 0x20, 0x47, 0xf2, 0x0e, 0xb4, 0xdc, 0x69, 0x14, 0x45, 0x83, 0xa9,
0x02, 0xa3, 0xbc, 0xa8, 0x16, 0x7d, 0xee, 0xa9, 0x49, 0xb2, 0x2e, 0x47, 0x5d, 0x8c, 0x2c, 0xda,
0x8d, 0xab, 0x88, 0xba, 0x98, 0x0b, 0xc5, 0x3b, 0x85, 0x9e, 0xaa, 0x91, 0x71, 0xb4, 0xaa, 0x02,
0xd9, 0x03, 0xea, 0xa9, 0x92, 0xd0, 0x84, 0x23, 0xac, 0x57, 0x8f, 0xcc, 0x11, 0xb2, 0x98, 0xeb,
0x3e, 0x2a, 0x80, 0xce, 0x4d, 0xcd, 0xe7, 0x67, 0x38, 0xf9, 0x5e, 0xb0, 0x60, 0xac, 0xd2, 0x3d,
0xb7, 0x76, 0x30, 0x34, 0xdd, 0x7c, 0x6c, 0x38, 0xce, 0xea, 0x33, 0x76, 0x51, 0xed, 0xd6, 0x2f,
0x18, 0x4e, 0xae, 0x4e, 0x5c, 0xa3, 0xdd, 0xba, 0x19, 0xb6, 0x06, 0xde, 0x46, 0xea, 0x6f, 0x52,
0x12, 0x3d, 0x5f, 0xeb, 0x63, 0x03, 0xe1, 0xbb, 0xa2, 0xba, 0xce, 0xdb, 0x78, 0x64, 0xdb, 0x54,
0x43, 0xbc, 0xd5, 0x24, 0x16, 0x7f, 0xf4, 0x7e, 0x5e, 0xa7, 0xcf, 0x32, 0x44, 0x72, 0x89, 0x9e,
0xe3, 0xa4, 0x45, 0xd5, 0xb0, 0x4a, 0x9f, 0xf8, 0x06, 0x76, 0x5c, 0x88, 0xfd, 0x55, 0x78, 0xb8,
0xb4, 0x44, 0x28, 0xc9, 0xfc, 0xd5, 0xcf, 0xdb, 0x75, 0x1b, 0x68, 0xf7, 0x28, 0xe1, 0x9b, 0x28,
0x8a, 0xfa, 0x37, 0xd3, 0xfd, 0x52, 0x5d, 0x78, 0xfd, 0xdc, 0xd0, 0x6f, 0x60, 0x6c, 0xa6, 0x1e,
0xbc, 0x18, 0x5c, 0x27, 0xbf, 0xe0, 0x94, 0x04, 0x26, 0x1d, 0x7b, 0x4b, 0xee, 0xd3, 0x2f, 0x55,
0x58, 0xfd, 0x57, 0x85, 0x8c, 0xbb, 0x6b, 0xdf, 0x78, 0x76, 0x42, 0x47, 0xbb, 0x38, 0xc3, 0x28,
0xb8, 0x97, 0x13, 0x32, 0x18, 0x85, 0xf4, 0x2b, 0x4f, 0xf2, 0x1d, 0x36, 0x7d, 0x0e, 0x66, 0x7e,
0x4b, 0x86, 0x3d, 0x0e, 0x49, 0xd1, 0x16, 0xa7, 0xa6, 0x0a, 0x11, 0xac, 0xb5, 0x0a, 0x86, 0xdb,
0x24, 0xfc, 0xc1, 0xb7, 0xc9, 0x99, 0x5d, 0x04, 0xd3, 0x57, 0xfe, 0xff, 0xf8, 0x3a, 0xfa, 0x38,
0xb3, 0x87, 0x6e, 0xd3, 0x1b, 0x8e, 0x7d, 0x61, 0xcc, 0x57, 0x47, 0xa2, 0x37, 0x8b, 0xc5, 0x62,
0x33, 0x7c, 0x93, 0xad, 0x6e, 0x7d, 0xe6, 0xf8, 0xb0, 0xd1, 0x1c, 0x8d, 0x49, 0x55, 0x12, 0x46,
0x16, 0x4a, 0x0b, 0xd4, 0xb0, 0xc0, 0x31, 0x78, 0xc4, 0xe0, 0x30, 0xeb, 0xeb, 0x66, 0x61, 0x5f,
0x71, 0xb9, 0xa0, 0x7c, 0xfd, 0x71, 0x76, 0xf6, 0x00, 0xf7, 0x26, 0xc6, 0xfe, 0xa9, 0x34, 0x3b,
0x8b, 0x97, 0xde, 0xe7, 0x34, 0x08, 0x8c, 0x18, 0xe2, 0xd3, 0xdd, 0x24, 0x32, 0xf5, 0x9f, 0xb4,
0x81, 0x08, 0xd5, 0xec, 0x02, 0x3a, 0x1a, 0xdb, 0x52, 0x5c, 0xfc, 0xe8, 0xfb, 0xd4, 0xe6, 0xe2,
0xfb, 0x10, 0xc3, 0x3d, 0x36, 0xc6, 0x03, 0x2e, 0xdd, 0xda, 0xee, 0xb6, 0xc9, 0x2f, 0x2d, 0x26,
0xb0, 0xc4, 0x66, 0x3c, 0x9b, 0xd4, 0xa5, 0x86, 0x37, 0xe8, 0x30, 0x5a, 0xfd, 0x8b, 0x3a, 0x6c,
0x36, 0x2e, 0xeb, 0xd8, 0xdf, 0xfa, 0xe1, 0xec, 0x73, 0x92, 0x95, 0x34, 0x8e, 0xc1, 0x81, 0x59,
0x3c, 0x00, 0xd2, 0x61, 0xf4, 0x16, 0x60, 0x37, 0xf2, 0x31, 0x7e, 0xe7, 0x77, 0x72, 0x59, 0x98,
0x35, 0x91, 0xf2, 0x06, 0xf0, 0xb3, 0x3e, 0xa2, 0xf8, 0x68, 0x1e, 0x45, 0xd5, 0xb1, 0x53, 0x2f,
0x37, 0x3d, 0x6f, 0xe1, 0x69, 0x3a, 0x2f, 0x40, 0x63, 0xe3, 0x8a, 0x62, 0x73, 0xf6, 0x5e, 0xe2,
0x3f, 0xe5, 0x89, 0x47, 0xba, 0x64, 0x39, 0x00, 0x00
};
void serveBundleCss(AsyncWebServerRequest* request) {

File diff suppressed because it is too large Load Diff

View File

@ -94,7 +94,7 @@
key: "rssi@1m",
title: "Rssi@1m",
value: (v) => v["rssi@1m"],
renderValue: (v) => v["rssi@1m"] != null ? `${v["rssi@1m"]}dBm` : "",
renderValue: (v) => v["rssi@1m"] != null ? `${v["rssi@1m"]} dBm` : "",
sortable: true,
headerClass: "text-left px-6 py-3",
},
@ -145,9 +145,9 @@
<main>
{#if $configs?.configs != null}
<SvelteTable {columns} rows={$configs.configs} rowKey="mac" bind:filterSelections bind:sortBy bind:sortOrder selectSingle={true} selectOnClick={true} selected={selectedRowIds} classNameTable="min-w-full divide-y divide-gray-200 table-auto" classNameThead="whitespace-nowrap text-left text-xs font-medium text-gray-500 uppercase" classNameTbody="bg-white divide-y divide-gray-200" {classNameRow} classNameRowSelected="bg-blue-100" classNameCell="px-3 py-1 whitespace-no-wrap text-sm leading-5 font-light text-gray-900" classNameInput="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" classNameSelect="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" />
<SvelteTable {columns} rows={$configs.configs} rowKey="id" bind:filterSelections bind:sortBy bind:sortOrder selectSingle={true} selectOnClick={true} selected={selectedRowIds} classNameTable="min-w-full divide-y divide-gray-200 table-auto" classNameThead="whitespace-nowrap text-left text-xs font-medium text-gray-500 uppercase" classNameTbody="bg-white divide-y divide-gray-200" {classNameRow} classNameRowSelected="bg-blue-100" classNameCell="px-3 py-1 whitespace-no-wrap text-sm leading-5 font-light text-gray-900" classNameInput="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" classNameSelect="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" />
{:else}
<h1>Loading configs...</h1>
<h1>Loading configured devices...</h1>
{/if}
</main>

View File

@ -2,11 +2,27 @@
import { devices } from "../stores";
import SvelteTable from "svelte-table";
var filterSelections = {};
var filterSelections = {
vis: true
};
var sortBy = "distance";
var sortOrder = 1;
var selectedRowIds = [];
const columns = [
{
key: "vis",
title: "Visible",
value: (v) => v.vis ?? false,
renderValue: (v) => v.vis ? "⬤" : "",
sortable: true,
filterOptions: (rows) => {
const options = [
{ name: "Yes", value: true },
{ name: "No", value: false },
];
return options;
},
},
{
key: "distance",
title: "Dist",
@ -18,7 +34,7 @@
{
key: "id",
title: "ID",
value: (v) => v.id,
value: (v) => v.id ?? "",
sortable: true,
filterOptions: (rows) => {
const prefixes = new Set();
@ -62,7 +78,7 @@
{
key: "mac",
title: "MAC",
value: (v) => v.mac,
value: (v) => v.mac ?? "n/a",
sortable: true,
filterOptions: (rows) => {
// use first letter of last_name to generate filter
@ -88,25 +104,28 @@
key: "rssi",
title: "Rssi",
value: (v) => v.rssi,
renderValue: (v) => v.rssi + "dBm",
renderValue: (v) => v.rssi ? `${v.rssi} dBm` : "",
sortable: true,
headerClass: "text-left px-6 py-3",
headerClass: "",
class: "whitespace-nowrap",
},
{
key: "rssi@1m",
title: "Rssi@1m",
value: (v) => v["rssi@1m"],
renderValue: (v) => v["rssi@1m"] + "dBm",
renderValue: (v) => v["rssi@1m"] ? `${v["rssi@1m"]} dBm` : "",
sortable: true,
headerClass: "text-left px-6 py-3",
headerClass: "",
class: "whitespace-nowrap",
},
{
key: "interval",
title: "Interval",
value: (v) => v.interval,
renderValue: (v) => v.interval + "ms",
key: "int",
title: "int",
value: (v) => v.int ?? 0,
renderValue: (v) => v.int ? `${v.int} ms` : "",
sortable: true,
headerClass: "text-left px-6 py-3",
headerClass: "",
class: "whitespace-nowrap",
},
];
function classNameRow(event) {
@ -116,7 +135,7 @@
<main>
{#if $devices?.devices != null}
<SvelteTable {columns} rows={$devices.devices} rowKey="mac" bind:filterSelections bind:sortBy bind:sortOrder selectSingle={true} selectOnClick={true} selected={selectedRowIds} classNameTable="min-w-full divide-y divide-gray-200 table-auto" classNameThead="whitespace-nowrap text-left text-xs font-medium text-gray-500 uppercase" classNameTbody="bg-white divide-y divide-gray-200" {classNameRow} classNameRowSelected="bg-blue-100" classNameCell="px-3 py-1 whitespace-no-wrap text-sm leading-5 font-light text-gray-900" classNameInput="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" classNameSelect="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" />
<SvelteTable {columns} rows={$devices.devices} rowKey="mac" bind:filterSelections bind:sortBy bind:sortOrder selectSingle={true} selectOnClick={true} selected={selectedRowIds} classNameTable="min-w-full divide-y divide-gray-200 table-auto" classNameThead="whitespace-nowrap text-left text-xs font-medium text-gray-500 uppercase" classNameTbody="bg-white divide-y divide-gray-200" {classNameRow} classNameRowSelected="bg-blue-100" classNameCell="px-1 py-1 whitespace-no-wrap text-sm leading-5 font-light text-gray-900" classNameInput="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" classNameSelect="px-1 py-1 border rounded-md text-sm leading-5 font-medium text-gray-900 placeholder-gray-500 focus:outline-none focus:shadow-outline-blue focus:border-blue-300 focus:z-10 sm:text-sm sm:leading-5" />
{:else}
<h1>Loading fingerprints...</h1>
{/if}

View File

@ -2,7 +2,7 @@ import { readable } from 'svelte/store';
import { writable } from 'svelte/store';
export const extras = writable([], function start(set) {
fetch(`/extras`)
fetch("/extras")
.then(d => d.json())
.then(r => {
set(r);
@ -19,7 +19,7 @@ export const configs = readable([], function start(set) {
const interval = setInterval(() => {
if (outstanding) return;
outstanding = true;
fetch(`/json/configs`)
fetch("/json/configs")
.then(d => d.json())
.then(r => {
outstanding = false;
@ -44,7 +44,7 @@ export const devices = readable([], function start(set) {
const interval = setInterval(() => {
if (outstanding) return;
outstanding = true;
fetch(`/json/devices`)
fetch("/json/devices?showAll")
.then(d => d.json())
.then(r => {
outstanding = false;