From a02e88fb407c1035ee1981af4c4951df86f77d9e Mon Sep 17 00:00:00 2001 From: bodwok Date: Fri, 1 Nov 2024 01:45:16 +0300 Subject: [PATCH 01/97] Reduce foreign key layout margins --- src/ForeignKeyEditorDelegate.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ForeignKeyEditorDelegate.cpp b/src/ForeignKeyEditorDelegate.cpp index 3da7ad5e3..07afdedc2 100644 --- a/src/ForeignKeyEditorDelegate.cpp +++ b/src/ForeignKeyEditorDelegate.cpp @@ -29,6 +29,7 @@ class ForeignKeyEditor : public QWidget layout->addWidget(clauseEdit); layout->addWidget(m_btnReset); layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); setLayout(layout); connect(m_btnReset, &QPushButton::clicked, this, [&] From c37e1e7aec3aef7e72de7d410be7cfc6da1747be Mon Sep 17 00:00:00 2001 From: James Habben Date: Mon, 11 Nov 2024 14:43:18 -0800 Subject: [PATCH 02/97] Update extension-formats.c - resolved some warnings - added plist to json function - added deserialize plist to json function for some plists - added some safety checks to avoid crashes --- src/extensions/extension-formats.c | 932 ++++++++++++++++++++++++++--- 1 file changed, 860 insertions(+), 72 deletions(-) diff --git a/src/extensions/extension-formats.c b/src/extensions/extension-formats.c index 53306b12f..f9421c4fd 100644 --- a/src/extensions/extension-formats.c +++ b/src/extensions/extension-formats.c @@ -69,7 +69,7 @@ typedef struct CONFIG { unsigned char *outputBuffer; } CONFIG; -int createObject(int type, int length, int extra, OBJECT **ptr2); +int createObject(int type, int length, size_t extra, OBJECT **ptr2); int readObject(CONFIG *cfg, long offset, OBJECT **ptr2); static int indent = 2; @@ -157,16 +157,40 @@ int readTrailer(CONFIG *cfg) return ERROR_NONE; } -int createObject(int type, int length, int extra, OBJECT **ptr2) -{ - *ptr2 = NULL; - OBJECT *ptr = (OBJECT *)malloc(sizeof(OBJECT) + (size_t)extra); - if (ptr == NULL) - return ERROR_INSUFFICIENT_MEMORY; - ptr->type = type; - ptr->length = length; - *ptr2 = ptr; - return ERROR_NONE; +int createObject(int type, int length, size_t extra, OBJECT **ptr2) { + OBJECT *ptr; + size_t totalSize; + + // Calculate proper extra size based on type + size_t actualExtra; + switch (type) { + case 0x06: // UTF16 string + actualExtra = 2 * (length + 1); // 2 bytes per char + null terminator + break; + case 0x05: // Regular string + actualExtra = length + 1; // bytes + null terminator + break; + case 0x0A: // Array + actualExtra = length * sizeof(OBJECT*); + break; + case 0x0D: // Dictionary + actualExtra = (length - 1) * sizeof(KEY); + break; + default: + actualExtra = extra; + break; + } + + totalSize = sizeof(OBJECT) + actualExtra; + + ptr = malloc(totalSize); + if (ptr == NULL) + return ERROR_INSUFFICIENT_MEMORY; + + ptr->type = type; + ptr->length = length; + *ptr2 = ptr; + return ERROR_NONE; } long readInteger(unsigned char *ptr, int desc) @@ -336,14 +360,22 @@ int readObject(CONFIG *cfg, long offset, OBJECT **ptr2) obj->data.text[length] = '\0'; break; case 0x06: // UTF16 string - err = createObject(type, length, 2 * length, &obj); - if (err != ERROR_NONE) - return err; - for (i=0; i < length; i++) { - short int d = *(ptr++); - obj->data.utf16[i] = (short int)((d << 8) | *(ptr++)); + { + size_t bytesNeeded = 2 * ((size_t)length + 1); + err = createObject(type, length, bytesNeeded, &obj); + if (err != ERROR_NONE) + return err; + + memset(obj->data.utf16, 0, bytesNeeded); + + for (i = 0; i < length; i++) { + unsigned char byte1 = *(ptr++); + unsigned char byte2 = *(ptr++); + obj->data.utf16[i] = (byte1 << 8) | byte2; + } + + obj->data.utf16[length] = 0; } - obj->data.utf16[length] = '\0'; break; case 0x08: // UID err = createObject(type, length, 0, &obj); @@ -517,6 +549,8 @@ int displayObject(CONFIG *cfg, OBJECT *obj, int raw) int releaseObject(OBJECT *obj) { + if (!obj) return ERROR_NONE; // Guard against NULL + int i; switch (obj->type) { case 0x00: // Singleton @@ -529,16 +563,29 @@ int releaseObject(OBJECT *obj) case 0x08: // UID break; case 0x0A: // Array - for (i=0; i < obj->length; i++) - releaseObject(obj->data.objects[i]); + for (i=0; i < obj->length; i++) { + if (obj->data.objects[i]) { + releaseObject(obj->data.objects[i]); + obj->data.objects[i] = NULL; + } + } break; case 0x0D: // Dictionary for (i=0; i < obj->length; i++) { - releaseObject(obj->data.keys[i].key); - releaseObject(obj->data.keys[i].value); + if (obj->data.keys[i].key) { + releaseObject(obj->data.keys[i].key); + obj->data.keys[i].key = NULL; + } + if (obj->data.keys[i].value) { + releaseObject(obj->data.keys[i].value); + obj->data.keys[i].value = NULL; + } } break; + default: + break; } + free(obj); return ERROR_NONE; } @@ -771,19 +818,19 @@ static void plistFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ int resultLength; int errorCode = 0; char *result = NULL; - assert( argc==1 ); - switch( sqlite3_value_type(argv[0]) ){ + assert(argc==1); + switch(sqlite3_value_type(argv[0])){ case SQLITE_TEXT: case SQLITE_BLOB: { - const char *data = sqlite3_value_text(argv[0]); + const unsigned char *data = sqlite3_value_text(argv[0]); const int dataLength = sqlite3_value_bytes(argv[0]); - errorCode = parsePlist(&result, data, dataLength); + errorCode = parsePlist(&result, (const char *)data, dataLength); if (errorCode == ERROR_NONE) { resultLength = strlen(result); sqlite3_result_text(context, result, resultLength, &freeResult); } else { if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) - sqlite3_result_text(context, data, dataLength, NULL); + sqlite3_result_text(context, (const char *)data, dataLength, NULL); else sqlite3_result_blob(context, data, dataLength, NULL); } @@ -796,43 +843,43 @@ static void plistFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ } } -static void encodeBase64Func(sqlite3_context *context, int argc, sqlite3_value **argv){ - int resultLength; - int errorCode = 0; - int dataLength; - const unsigned char *data; - char *result = NULL; - assert( argc==1 ); - switch( sqlite3_value_type(argv[0]) ){ - case SQLITE_BLOB: - data = sqlite3_value_blob(argv[0]); - dataLength = sqlite3_value_bytes(argv[0]); - errorCode = encodeBase64(&result, data, dataLength); - if (errorCode == ERROR_NONE) { - resultLength = strlen(result); - sqlite3_result_text(context, result, resultLength, &freeResult); - } else { - sqlite3_result_blob(context, data, dataLength, NULL); - } - break; - case SQLITE_TEXT: { - data = sqlite3_value_text(argv[0]); - dataLength = sqlite3_value_bytes(argv[0]); - sqlite3_result_text(context, data, dataLength, NULL); - errorCode = encodeBase64(&result, data, dataLength); - if (errorCode == ERROR_NONE) { - resultLength = strlen(result); - sqlite3_result_text(context, result, resultLength, &freeResult); - } else { - sqlite3_result_text(context, data, dataLength, NULL); - } - break; - } - default: { - sqlite3_result_null(context); - break; +static void encodeBase64Func(sqlite3_context *context, int argc, sqlite3_value **argv) { + int resultLength; + int errorCode = 0; + int dataLength; + const unsigned char *rawData; + char *result = NULL; + assert(argc==1); + switch(sqlite3_value_type(argv[0])) { + case SQLITE_BLOB: + rawData = sqlite3_value_blob(argv[0]); + dataLength = sqlite3_value_bytes(argv[0]); + errorCode = encodeBase64(&result, rawData, dataLength); + if (errorCode == ERROR_NONE) { + resultLength = strlen(result); + sqlite3_result_text(context, result, resultLength, &freeResult); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); + } + break; + case SQLITE_TEXT: { + rawData = sqlite3_value_text(argv[0]); + dataLength = sqlite3_value_bytes(argv[0]); + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + errorCode = encodeBase64(&result, rawData, dataLength); + if (errorCode == ERROR_NONE) { + resultLength = strlen(result); + sqlite3_result_text(context, result, resultLength, &freeResult); + } else { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } + break; + } + default: { + sqlite3_result_null(context); + break; + } } - } } @@ -917,17 +964,17 @@ static void decodeBase64Func(sqlite3_context *context, int argc, sqlite3_value * switch( sqlite3_value_type(argv[0]) ){ case SQLITE_BLOB: case SQLITE_TEXT: { - const char *data = sqlite3_value_text(argv[0]); + const char *data = (const char *)sqlite3_value_text(argv[0]); int dataLength = sqlite3_value_bytes(argv[0]); errorCode = decodeBase64(&result, &resultLength, data, dataLength); if (errorCode == ERROR_NONE) { if (isUTF8(result, resultLength)) - sqlite3_result_text(context, result, resultLength, &freeResult); + sqlite3_result_text(context, (const char *)result, resultLength, &freeResult); else - sqlite3_result_blob(context, result, resultLength, &freeResult); + sqlite3_result_blob(context, result, resultLength, &freeResult); } else { if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) - sqlite3_result_text(context, data, dataLength, NULL); + sqlite3_result_text(context, (const char *)data, dataLength, NULL); else sqlite3_result_blob(context, data, dataLength, NULL); } @@ -940,16 +987,757 @@ static void decodeBase64Func(sqlite3_context *context, int argc, sqlite3_value * } } +int isJsonString(const char *text) { + if (!text) return 0; + int len = strlen(text); + if (len < 2) return 0; + + // Check if it starts with [ or { or " + return (text[0] == '[' || text[0] == '{' || (text[0] == '"' && text[1] != '{')); +} + +int outputJsonEscapedText(CONFIG *cfg, const char *text) { + int err = ERROR_NONE; + + // Check if text is a JSON string that starts with { + if (text && (text[0] == '{' || (text[0] == '"' && text[1] != '{'))) { + // Try to unescape the JSON string + char *unescaped = malloc(strlen(text) + 1); + if (!unescaped) return ERROR_INSUFFICIENT_MEMORY; + + const char *src = text; + char *dst = unescaped; + + while (*src) { + if (*src == '\\' && *(src + 1) == '"') { + *dst++ = '"'; + src += 2; + } else { + *dst++ = *src++; + } + } + *dst = '\0'; + + // Output the unescaped JSON directly + err = outputText(cfg, unescaped); + free(unescaped); + return err; + } + + // Original escaping logic for regular strings + while (*text && err == ERROR_NONE) { + switch (*text) { + case '"': + err = outputText(cfg, "\\\""); + break; + case '\\': + err = outputText(cfg, "\\\\"); + break; + case '\b': + err = outputText(cfg, "\\b"); + break; + case '\f': + err = outputText(cfg, "\\f"); + break; + case '\n': + err = outputText(cfg, "\\n"); + break; + case '\r': + err = outputText(cfg, "\\r"); + break; + case '\t': + err = outputText(cfg, "\\t"); + break; + default: + if ((unsigned char)*text < 32) { + char escaped[8]; + sprintf(escaped, "\\u%04x", (unsigned char)*text); + err = outputText(cfg, escaped); + } else { + char c[2] = {*text, 0}; + err = outputText(cfg, c); + } + } + text++; + } + return err; +} + +char* utf16_to_utf8(const short int* utf16, int length) { + char* utf8 = malloc(length * 3 + 1); // Max 3 bytes per char + null terminator + if (!utf8) return NULL; + + int j = 0; + for (int i = 0; i < length; i++) { + unsigned short uc = utf16[i]; + + if (uc < 0x80) { + utf8[j++] = (char)uc; + } else if (uc < 0x800) { + utf8[j++] = (char)(0xC0 | (uc >> 6)); + utf8[j++] = (char)(0x80 | (uc & 0x3F)); + } else { + utf8[j++] = (char)(0xE0 | (uc >> 12)); + utf8[j++] = (char)(0x80 | ((uc >> 6) & 0x3F)); + utf8[j++] = (char)(0x80 | (uc & 0x3F)); + } + } + + utf8[j] = '\0'; + return utf8; +} + +// Add new display function for JSON format +int displayObjectAsJson(CONFIG *cfg, OBJECT *obj, int raw) { + char text[32]; + switch (obj->type) { + case 0x00: // Singleton + if (strcmp(obj->data.text, "") == 0) + outputText(cfg, "true"); + else if (strcmp(obj->data.text, "") == 0) + outputText(cfg, "false"); + else if (strcmp(obj->data.text, "") == 0) + outputText(cfg, "null"); + else + outputText(cfg, "null"); + break; + case 0x01: // Integer + sprintf(text, "%ld", obj->data.integer); + outputText(cfg, text); + break; + case 0x02: // Float + sprintf(text, "%f", obj->data.real); + outputText(cfg, text); + break; + case 0x03: // Date + outputText(cfg, "\""); + outputText(cfg, ctime(&(obj->data.date))); + if (cfg->outputBuffer[cfg->outputBufferIn-1] == '\n') + cfg->outputBufferIn--; // Remove trailing newline + outputText(cfg, "\""); + break; + case 0x04: // Binary data + outputText(cfg, "\"\""); + break; + case 0x05: // String + if (isJsonString(obj->data.text)) { + // If it's already JSON, output it directly + outputText(cfg, obj->data.text); + } else { + // Otherwise treat as regular string + outputText(cfg, "\""); + outputJsonEscapedText(cfg, obj->data.text); + outputText(cfg, "\""); + } + break; + case 0x06: // UTF16 string + { + char* utf8 = utf16_to_utf8(obj->data.utf16, obj->length); + if (utf8) { + if (isJsonString(utf8)) { + // If it's already JSON, output directly + outputText(cfg, utf8); + } else { + // Otherwise wrap in quotes and escape + outputText(cfg, "\""); + outputJsonEscapedText(cfg, utf8); + outputText(cfg, "\""); + } + free(utf8); + } else { + outputText(cfg, "\"\""); + } + } + break; + case 0x08: // UID + sprintf(text, "%lu", obj->data.uid); + outputText(cfg, text); + break; + case 0x0A: // Array + outputText(cfg, "["); + for (int i=0; i < obj->length; i++) { + displayObjectAsJson(cfg, obj->data.objects[i], 0); + if (i < obj->length - 1) + outputText(cfg, ","); + } + outputText(cfg, "]"); + break; + case 0x0D: // Dictionary + outputText(cfg, "{"); + for (int i=0; i < obj->length; i++) { + // Check if key is already JSON + if (!isJsonString(obj->data.keys[i].key->data.text)) { + outputText(cfg, "\""); + displayObject(cfg, obj->data.keys[i].key, 1); + outputText(cfg, "\""); + } else { + displayObject(cfg, obj->data.keys[i].key, 1); + } + outputText(cfg, ":"); + displayObjectAsJson(cfg, obj->data.keys[i].value, 0); + if (i < obj->length - 1) + outputText(cfg, ","); + } + outputText(cfg, "}"); + break; + default: + sprintf(text, "\"\"", obj->type); + outputText(cfg, text); + break; + } + return ERROR_NONE; +} + +// Add new function to parse plist to JSON +int parsePlistToJson(char **result, const char *data, int dataLength) { + CONFIG cfg; + char *ptr; + OBJECT *obj; + int err = ERROR_NONE; + long length; + + // Determine the file size and save + cfg.buffer = (unsigned char *)data; + cfg.bufferLength = dataLength; + + // Preset the output buffer + cfg.outputBufferLength = 0; + cfg.outputBufferIn = 0; + cfg.outputBuffer = NULL; + + // Read the header + err = readHeader(&cfg); + if (err != ERROR_NONE) + return err; + + // Read the trailer + err = readTrailer(&cfg); + if (err != ERROR_NONE) + return err; + + // Locate and read the root object + long offset = cfg.offsetTable[cfg.rootObjectReference]; + err = readObject(&cfg, offset, &obj); + + // If no error display the root object and hence the whole object tree + if (err != ERROR_NONE) + return err; + + displayObjectAsJson(&cfg, obj, 0); + + // Create return data + length = strlen((const char *)(cfg.outputBuffer)); + ptr = malloc(length + 1); + *result = ptr; + if (ptr != NULL) { + for (int i=0; i < length; i++) + *(ptr++) = cfg.outputBuffer[i]; + *ptr = '\0'; + } + else + err = ERROR_INSUFFICIENT_MEMORY; + + // Release assigned memory + releaseObject(obj); + free(cfg.offsetTable); + free(cfg.outputBuffer); + return err; +} + +// Add the new function to SQLite +static void plistToJsonFunc(sqlite3_context *context, int argc, sqlite3_value **argv) { + int errorCode = 0; + char *result = NULL; + assert(argc==1); + switch(sqlite3_value_type(argv[0])) { + case SQLITE_TEXT: + case SQLITE_BLOB: { + // Use separate variables for raw and cast data + const unsigned char *rawData = sqlite3_value_text(argv[0]); + const int dataLength = sqlite3_value_bytes(argv[0]); + + errorCode = parsePlistToJson(&result, (const char *)rawData, dataLength); + if (errorCode == ERROR_NONE) { + int resultLength = strlen(result); + sqlite3_result_text(context, result, resultLength, &freeResult); + } else { + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + else + sqlite3_result_blob(context, rawData, dataLength, NULL); + } + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + +// Add these helper functions for NSKeyedArchiver deserialization +int isNSKeyedArchiver(OBJECT *obj) { + if (obj->type != 0x0D) return 0; + + for (int i = 0; i < obj->length; i++) { + OBJECT *key = obj->data.keys[i].key; + if (key->type == 0x05 && strcmp(key->data.text, "$archiver") == 0) { + OBJECT *value = obj->data.keys[i].value; + if (value->type == 0x05 && strcmp(value->data.text, "NSKeyedArchiver") == 0) { + return 1; + } + } + } + return 0; +} + +OBJECT* findObjectByUID(CONFIG *cfg, int uid) { + if (uid >= cfg->objectCount) + return NULL; + long offset = cfg->offsetTable[uid]; + OBJECT *obj; + if (readObject(cfg, offset, &obj) != ERROR_NONE) + return NULL; + return obj; +} + +// Add this helper function to get actual object from reference +OBJECT* resolveReference(CONFIG *cfg, OBJECT *objects, OBJECT *ref) { + if (!ref || !objects) return NULL; + + if (ref->type == 0x01) { // Direct integer reference + int index = ref->data.integer; + if (index >= 0 && index < objects->length) { + return objects->data.objects[index]; + } + } + return ref; // Return original if not a reference +} + +// Add this helper function to get the actual value from an index +OBJECT* getObjectAtIndex(OBJECT *objects, int index) { + if (!objects || objects->type != 0x0A || index < 0 || index >= objects->length) { + return NULL; + } + return objects->data.objects[index]; +} + +// Helper function to get object from $objects array by index +OBJECT* getObjectByIndex(OBJECT *objects, int index) { + if (!objects || objects->type != 0x0A || index < 0 || index >= objects->length) { + return NULL; + } + return objects->data.objects[index]; +} + +// Helper function to get value from dictionary by key +OBJECT* getDictValue(OBJECT *dict, const char *key) { + if (!dict || dict->type != 0x0D || !key) return NULL; + + for (int i = 0; i < dict->length; i++) { + OBJECT *k = dict->data.keys[i].key; + if (k && k->type == 0x05 && strcmp(k->data.text, key) == 0) { + return dict->data.keys[i].value; + } + } + return NULL; +} + +// Helper function to get integer value from object +int getIntegerValue(OBJECT *obj) { + if (!obj) return -1; + + switch (obj->type) { + case 0x01: // Integer + return obj->data.integer; + case 0x08: // UID + return (int)obj->data.uid; + default: + return -1; + } +} + +OBJECT* resolveObject(OBJECT *objects, int index) { + if (!objects || index < 0 || index >= objects->length) { + return NULL; + } + + OBJECT *obj = getObjectByIndex(objects, index); + if (!obj) return NULL; + + // If it's a dictionary with NS.keys and NS.objects, resolve it + if (obj->type == 0x0D) { + OBJECT *nsKeys = getDictValue(obj, "NS.keys"); + OBJECT *nsObjects = getDictValue(obj, "NS.objects"); + + if (nsKeys && nsObjects && + nsKeys->type == 0x0A && nsObjects->type == 0x0A && + nsKeys->length == nsObjects->length && + nsKeys->length > 0) { + + OBJECT *result; + int err = createObject(0x0D, nsKeys->length, (nsKeys->length - 1) * sizeof(KEY), &result); + if (err != ERROR_NONE || !result) { + return NULL; + } + + for (int i = 0; i < nsKeys->length; i++) { + int keyIndex = getIntegerValue(nsKeys->data.objects[i]); + int valueIndex = getIntegerValue(nsObjects->data.objects[i]); + + if (keyIndex >= 0 && keyIndex < objects->length && + valueIndex >= 0 && valueIndex < objects->length) { + + OBJECT *key = getObjectByIndex(objects, keyIndex); + if (key) { + size_t extraSize = 0; + switch (key->type) { + case 0x06: // UTF16 string + extraSize = key->length * 2; // 2 bytes per character + break; + case 0x05: // Regular string + extraSize = key->length + 1; // Include null terminator + break; + case 0x0A: // Array + extraSize = key->length * sizeof(OBJECT*); + break; + case 0x0D: // Dictionary + extraSize = key->length * sizeof(KEY); + break; + default: + extraSize = key->length; + break; + } + + err = createObject(key->type, key->length, extraSize, &result->data.keys[i].key); + if (err == ERROR_NONE && result->data.keys[i].key) { + if (key->type == 0x06) { + memcpy(result->data.keys[i].key->data.utf16, key->data.utf16, key->length * 2); + } else { + memcpy(&result->data.keys[i].key->data, &key->data, extraSize); + } + } + + result->data.keys[i].value = resolveObject(objects, valueIndex); + } + } + } + return result; + } + } + + OBJECT *copy; + size_t extraSize = 0; + + switch (obj->type) { + case 0x06: // UTF16 string + extraSize = obj->length * 2; // 2 bytes per character + break; + case 0x05: // Regular string + extraSize = obj->length + 1; // Include null terminator + break; + case 0x0A: // Array + extraSize = obj->length * sizeof(OBJECT*); + break; + case 0x0D: // Dictionary + extraSize = obj->length * sizeof(KEY); + break; + default: + extraSize = obj->length; + break; + } + + int err = createObject(obj->type, obj->length, extraSize, ©); + if (err == ERROR_NONE && copy) { + if (obj->type == 0x06) { + memcpy(copy->data.utf16, obj->data.utf16, obj->length * 2); + } else { + memcpy(©->data, &obj->data, extraSize); + } + } + return copy; +} + +OBJECT* convertNSKeyedArchiver(OBJECT *archiver) { + if (!archiver || archiver->type != 0x0D) { + return NULL; + } + + // Get $objects array + OBJECT *objects = getDictValue(archiver, "$objects"); + if (!objects || objects->type != 0x0A || objects->length == 0) { + return NULL; + } + + // Get root object reference from $top + OBJECT *top = getDictValue(archiver, "$top"); + if (!top || top->type != 0x0D) { + return NULL; + } + + OBJECT *rootRef = getDictValue(top, "root"); + if (!rootRef) { + return NULL; + } + + int rootIndex = getIntegerValue(rootRef); + if (rootIndex < 0 || rootIndex >= objects->length) { + return NULL; + } + + // Get actual root object + OBJECT *root = getObjectByIndex(objects, rootIndex); + if (!root) { + return NULL; + } + + // If root is a dictionary with NS.keys and NS.objects, create new dict + if (root->type == 0x0D) { + OBJECT *nsKeys = getDictValue(root, "NS.keys"); + OBJECT *nsObjects = getDictValue(root, "NS.objects"); + + if (nsKeys && nsObjects && + nsKeys->type == 0x0A && nsObjects->type == 0x0A && + nsKeys->length == nsObjects->length && + nsKeys->length > 0) { + + OBJECT *result; + int err = createObject(0x0D, nsKeys->length, (nsKeys->length - 1) * sizeof(KEY), &result); + if (err != ERROR_NONE || !result) { + return NULL; + } + + for (int i = 0; i < nsKeys->length; i++) { + int keyIndex = getIntegerValue(nsKeys->data.objects[i]); + int valueIndex = getIntegerValue(nsObjects->data.objects[i]); + + if (keyIndex >= 0 && keyIndex < objects->length && + valueIndex >= 0 && valueIndex < objects->length) { + + OBJECT *key = getObjectByIndex(objects, keyIndex); + if (key) { + size_t extraSize = 0; + switch (key->type) { + case 0x06: // UTF16 string + extraSize = key->length * 2; // 2 bytes per character + break; + case 0x05: // Regular string + extraSize = key->length + 1; // Include null terminator + break; + case 0x0A: // Array + extraSize = key->length * sizeof(OBJECT*); + break; + case 0x0D: // Dictionary + extraSize = key->length * sizeof(KEY); + break; + default: + extraSize = key->length; + break; + } + + err = createObject(key->type, key->length, extraSize, &result->data.keys[i].key); + if (err == ERROR_NONE && result->data.keys[i].key) { + if (key->type == 0x06) { + memcpy(result->data.keys[i].key->data.utf16, key->data.utf16, key->length * 2); + } else { + memcpy(&result->data.keys[i].key->data, &key->data, extraSize); + } + } + + result->data.keys[i].value = resolveObject(objects, valueIndex); + } + } + } + return result; + } + } + + return resolveObject(objects, rootIndex); +} + +// Add new function for deserialized JSON conversion +int parsePlistDeserializedToJson(char **result, const char *data, int dataLength) { + CONFIG cfg; + char *ptr; + OBJECT *obj; + int err = ERROR_NONE; + long length; + + // Determine the file size and save + cfg.buffer = (unsigned char *)data; + cfg.bufferLength = dataLength; + + // Preset the output buffer + cfg.outputBufferLength = 0; + cfg.outputBufferIn = 0; + cfg.outputBuffer = NULL; + + // Read the header + err = readHeader(&cfg); + if (err != ERROR_NONE) + return err; + + // Read the trailer + err = readTrailer(&cfg); + if (err != ERROR_NONE) + return err; + + // Locate and read the root object + long offset = cfg.offsetTable[cfg.rootObjectReference]; + err = readObject(&cfg, offset, &obj); + + // If no error display the root object and hence the whole object tree + if (err != ERROR_NONE) + return err; + + // Check if this is an NSKeyedArchiver plist + if (isNSKeyedArchiver(obj)) { + OBJECT *deserializedObj = convertNSKeyedArchiver(obj); + if (deserializedObj) { + // Free original object and use deserialized version + releaseObject(obj); + obj = deserializedObj; + } + } + + displayObjectAsJson(&cfg, obj, 0); + + // Create return data + length = strlen((const char *)(cfg.outputBuffer)); + ptr = malloc(length + 1); + *result = ptr; + if (ptr != NULL) { + for (int i=0; i < length; i++) + *(ptr++) = cfg.outputBuffer[i]; + *ptr = '\0'; + } + else + err = ERROR_INSUFFICIENT_MEMORY; + + // Release assigned memory + releaseObject(obj); + free(cfg.offsetTable); + free(cfg.outputBuffer); + return err; +} + +// Add the new function to SQLite +static void plistDeserializedToJsonFunc(sqlite3_context *context, int argc, sqlite3_value **argv) { + int errorCode = 0; + char *result = NULL; + OBJECT *obj = NULL; + OBJECT *converted = NULL; + CONFIG cfg = {0}; + + assert(argc==1); + + if (sqlite3_value_type(argv[0]) == SQLITE_NULL) { + sqlite3_result_null(context); + return; + } + + switch(sqlite3_value_type(argv[0])) { + case SQLITE_TEXT: + case SQLITE_BLOB: { + // Explicitly cast to avoid pointer sign warnings + const unsigned char *rawData = sqlite3_value_text(argv[0]); + const char *data = (const char *)rawData; + const int dataLength = sqlite3_value_bytes(argv[0]); + + if (!data || dataLength < 8 || memcmp(data, "bplist00", 8) != 0) { + sqlite3_result_null(context); + return; + } + + cfg.buffer = (unsigned char *)data; + cfg.bufferLength = dataLength; + + errorCode = readHeader(&cfg); + if (errorCode == ERROR_NONE) { + errorCode = readTrailer(&cfg); + } + + if (errorCode == ERROR_NONE) { + long offset = cfg.offsetTable[cfg.rootObjectReference]; + errorCode = readObject(&cfg, offset, &obj); + + if (errorCode == ERROR_NONE && obj) { + if (isNSKeyedArchiver(obj)) { + converted = convertNSKeyedArchiver(obj); + if (converted) { + releaseObject(obj); + obj = converted; + converted = NULL; + } + } + + if (obj) { + result = malloc(1024); + if (result) { + cfg.outputBuffer = (unsigned char *)result; + cfg.outputBufferLength = 1024; + cfg.outputBufferIn = 0; + + displayObjectAsJson(&cfg, obj, 0); + + result = (char *)cfg.outputBuffer; + } else { + errorCode = ERROR_INSUFFICIENT_MEMORY; + } + } + } + } + + if (converted) releaseObject(converted); + if (obj) releaseObject(obj); + if (cfg.offsetTable) free(cfg.offsetTable); + + if (errorCode == ERROR_NONE && result) { + sqlite3_result_text(context, result, -1, free); + } else { + if (result) free(result); + if (errorCode == ERROR_NONE) { + // Only pass through original data if no error occurred + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_null(context); + } + } + break; + } + default: { + sqlite3_result_null(context); + break; + } + } +} + +static void load_formats_builtin(sqlite3_context *context, int argc, sqlite3_value **argv) { + // Return format: "Display Name|internal_name|format_sql" + const char *result = "Plist as JSON|plistjson|plistToJson(%1)\n" + "Plist as JSON (Deserialized)|plistdesjson|plistDeserializedToJson(%1)\n" + "Plist as XML|plistxml|plist(%1)\n" + "Base64 Decode|base64|unBase64(%1)\n" + "Base64 Encode|base64|toBase64(%1)"; + sqlite3_result_text(context, result, -1, SQLITE_TRANSIENT); +} + /** RegisterExtensionFormats * * Register the parsing functions with sqlite */ -int RegisterExtensionFormats(sqlite3 *db) -{ - sqlite3_create_function(db, "plist", 1, 0, db, plistFunc, 0, 0); - sqlite3_create_function(db, "unBase64", 1, 0, db, decodeBase64Func, 0, 0); - sqlite3_create_function(db, "toBase64", 1, 0, db, encodeBase64Func, 0, 0); +int RegisterExtensionFormats(sqlite3 *db) { + sqlite3_create_function(db, "plist", 1, 0, db, plistFunc, 0, 0); + sqlite3_create_function(db, "plistToJson", 1, 0, db, plistToJsonFunc, 0, 0); + sqlite3_create_function(db, "plistDeserializedToJson", 1, 0, db, plistDeserializedToJsonFunc, 0, 0); + sqlite3_create_function(db, "unBase64", 1, 0, db, decodeBase64Func, 0, 0); + sqlite3_create_function(db, "toBase64", 1, 0, db, encodeBase64Func, 0, 0); + + // Register the display format + sqlite3_create_function(db, "load_formats_builtin", 0, SQLITE_UTF8, NULL, load_formats_builtin, NULL, NULL); + + return ERROR_NONE; } #ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE From 73045fbff82dd64ac74cff20412554329a498152 Mon Sep 17 00:00:00 2001 From: James Habben Date: Wed, 13 Nov 2024 09:01:35 -0800 Subject: [PATCH 03/97] Update extension-formats.c - update `load_formats_builtin` to work better with app - update `plist`, `plistToJson` and `plistDeserializedToJson` to return original cell value if it doesnt validate as a plist - previously they returned a made up blob or null --- src/extensions/extension-formats.c | 219 ++++++++++++----------------- 1 file changed, 92 insertions(+), 127 deletions(-) diff --git a/src/extensions/extension-formats.c b/src/extensions/extension-formats.c index f9421c4fd..3a7bddbfe 100644 --- a/src/extensions/extension-formats.c +++ b/src/extensions/extension-formats.c @@ -814,33 +814,42 @@ void freeResult(void *ptr) return; } -static void plistFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ - int resultLength; - int errorCode = 0; - char *result = NULL; - assert(argc==1); - switch(sqlite3_value_type(argv[0])){ - case SQLITE_TEXT: - case SQLITE_BLOB: { - const unsigned char *data = sqlite3_value_text(argv[0]); - const int dataLength = sqlite3_value_bytes(argv[0]); - errorCode = parsePlist(&result, (const char *)data, dataLength); - if (errorCode == ERROR_NONE) { - resultLength = strlen(result); - sqlite3_result_text(context, result, resultLength, &freeResult); - } else { - if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) - sqlite3_result_text(context, (const char *)data, dataLength, NULL); - else - sqlite3_result_blob(context, data, dataLength, NULL); - } - break; +static void plistFunc(sqlite3_context *context, int argc, sqlite3_value **argv) { + int errorCode = 0; + char *result = NULL; + assert(argc==1); + + if (sqlite3_value_type(argv[0]) == SQLITE_NULL) { + sqlite3_result_null(context); + return; } - default: { - sqlite3_result_null(context); - break; + + const unsigned char *rawData = sqlite3_value_blob(argv[0]); + const int dataLength = sqlite3_value_bytes(argv[0]); + + // Check for valid plist header + if (!rawData || dataLength < 8 || memcmp(rawData, "bplist00", 8) != 0) { + // Not a plist, return original value + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); + } + return; + } + + errorCode = parsePlist(&result, (const char *)rawData, dataLength); + if (errorCode == ERROR_NONE) { + int resultLength = strlen(result); + sqlite3_result_text(context, result, resultLength, &freeResult); + } else { + // On error, return original value + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); + } } - } } static void encodeBase64Func(sqlite3_context *context, int argc, sqlite3_value **argv) { @@ -1249,28 +1258,36 @@ static void plistToJsonFunc(sqlite3_context *context, int argc, sqlite3_value ** int errorCode = 0; char *result = NULL; assert(argc==1); - switch(sqlite3_value_type(argv[0])) { - case SQLITE_TEXT: - case SQLITE_BLOB: { - // Use separate variables for raw and cast data - const unsigned char *rawData = sqlite3_value_text(argv[0]); - const int dataLength = sqlite3_value_bytes(argv[0]); - - errorCode = parsePlistToJson(&result, (const char *)rawData, dataLength); - if (errorCode == ERROR_NONE) { - int resultLength = strlen(result); - sqlite3_result_text(context, result, resultLength, &freeResult); - } else { - if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) - sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); - else - sqlite3_result_blob(context, rawData, dataLength, NULL); - } - break; + + if (sqlite3_value_type(argv[0]) == SQLITE_NULL) { + sqlite3_result_null(context); + return; + } + + const unsigned char *rawData = sqlite3_value_blob(argv[0]); + const int dataLength = sqlite3_value_bytes(argv[0]); + + // Check for valid plist header + if (!rawData || dataLength < 8 || memcmp(rawData, "bplist00", 8) != 0) { + // Not a plist, return original value + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); } - default: { - sqlite3_result_null(context); - break; + return; + } + + errorCode = parsePlistToJson(&result, (const char *)rawData, dataLength); + if (errorCode == ERROR_NONE) { + int resultLength = strlen(result); + sqlite3_result_text(context, result, resultLength, &freeResult); + } else { + // On error, return original value + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); } } } @@ -1625,100 +1642,48 @@ int parsePlistDeserializedToJson(char **result, const char *data, int dataLength static void plistDeserializedToJsonFunc(sqlite3_context *context, int argc, sqlite3_value **argv) { int errorCode = 0; char *result = NULL; - OBJECT *obj = NULL; - OBJECT *converted = NULL; - CONFIG cfg = {0}; - assert(argc==1); if (sqlite3_value_type(argv[0]) == SQLITE_NULL) { sqlite3_result_null(context); return; } + + const unsigned char *rawData = sqlite3_value_blob(argv[0]); + const int dataLength = sqlite3_value_bytes(argv[0]); - switch(sqlite3_value_type(argv[0])) { - case SQLITE_TEXT: - case SQLITE_BLOB: { - // Explicitly cast to avoid pointer sign warnings - const unsigned char *rawData = sqlite3_value_text(argv[0]); - const char *data = (const char *)rawData; - const int dataLength = sqlite3_value_bytes(argv[0]); - - if (!data || dataLength < 8 || memcmp(data, "bplist00", 8) != 0) { - sqlite3_result_null(context); - return; - } - - cfg.buffer = (unsigned char *)data; - cfg.bufferLength = dataLength; - - errorCode = readHeader(&cfg); - if (errorCode == ERROR_NONE) { - errorCode = readTrailer(&cfg); - } - - if (errorCode == ERROR_NONE) { - long offset = cfg.offsetTable[cfg.rootObjectReference]; - errorCode = readObject(&cfg, offset, &obj); - - if (errorCode == ERROR_NONE && obj) { - if (isNSKeyedArchiver(obj)) { - converted = convertNSKeyedArchiver(obj); - if (converted) { - releaseObject(obj); - obj = converted; - converted = NULL; - } - } - - if (obj) { - result = malloc(1024); - if (result) { - cfg.outputBuffer = (unsigned char *)result; - cfg.outputBufferLength = 1024; - cfg.outputBufferIn = 0; - - displayObjectAsJson(&cfg, obj, 0); - - result = (char *)cfg.outputBuffer; - } else { - errorCode = ERROR_INSUFFICIENT_MEMORY; - } - } - } - } - - if (converted) releaseObject(converted); - if (obj) releaseObject(obj); - if (cfg.offsetTable) free(cfg.offsetTable); - - if (errorCode == ERROR_NONE && result) { - sqlite3_result_text(context, result, -1, free); - } else { - if (result) free(result); - if (errorCode == ERROR_NONE) { - // Only pass through original data if no error occurred - sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); - } else { - sqlite3_result_null(context); - } - } - break; + // Check for valid plist header + if (!rawData || dataLength < 8 || memcmp(rawData, "bplist00", 8) != 0) { + // Not a plist, return original value + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); } - default: { - sqlite3_result_null(context); - break; + return; + } + + errorCode = parsePlistDeserializedToJson(&result, (const char *)rawData, dataLength); + if (errorCode == ERROR_NONE) { + int resultLength = strlen(result); + sqlite3_result_text(context, result, resultLength, &freeResult); + } else { + // On error, return original value + if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { + sqlite3_result_text(context, (const char *)rawData, dataLength, NULL); + } else { + sqlite3_result_blob(context, rawData, dataLength, NULL); } } } static void load_formats_builtin(sqlite3_context *context, int argc, sqlite3_value **argv) { - // Return format: "Display Name|internal_name|format_sql" - const char *result = "Plist as JSON|plistjson|plistToJson(%1)\n" - "Plist as JSON (Deserialized)|plistdesjson|plistDeserializedToJson(%1)\n" - "Plist as XML|plistxml|plist(%1)\n" - "Base64 Decode|base64|unBase64(%1)\n" - "Base64 Encode|base64|toBase64(%1)"; + // Return format: "Display Name|internal_name|function_name" + const char *result = "Plist as JSON|plistjson|plistToJson\n" + "Plist as JSON (Deserialized)|plistdesjson|plistDeserializedToJson\n" + "Plist as XML|plistxml|plist\n" + "Base64 Decode|base64|unBase64\n" + "Base64 Encode|base64|toBase64"; sqlite3_result_text(context, result, -1, SQLITE_TRANSIENT); } From 1048982fd40214015f2715031594856306458e6c Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Mon, 2 Dec 2024 09:56:33 +0900 Subject: [PATCH 04/97] Skip build if there are no new commits since last nightly build TODO: Trigger a build if there are updates to external libraries likes Qt, SQLCipher, or SQLite, even if there are no new commits. Related: #3810 --- .github/workflows/cppcmake-nightly.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/cppcmake-nightly.yml b/.github/workflows/cppcmake-nightly.yml index f824c7406..2ca5f5232 100644 --- a/.github/workflows/cppcmake-nightly.yml +++ b/.github/workflows/cppcmake-nightly.yml @@ -6,13 +6,33 @@ on: workflow_dispatch: jobs: + check-skip: + runs-on: ubuntu-latest + outputs: + skip: ${{ steps.set-skip.outputs.skip }} + steps: + - uses: actions/checkout@v4 + + - id: set-skip + run: | + git fetch origin tag nightly + LAST_COMMIT_HASH=$(git rev-list -n 1 nightly) + if [ "$(git rev-parse HEAD)" = "$LAST_COMMIT_HASH" ]; then + echo "::notice::No new commits since last nightly build, skipping this build." + echo "skip=true" >> $GITHUB_OUTPUT + fi + build-macos: + needs: check-skip + if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-macos.yml secrets: inherit with: NIGHTLY: true build-windows: + needs: check-skip + if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-windows.yml secrets: inherit with: From 3aaa7521344d4019de0eccc461eba2186fd99adb Mon Sep 17 00:00:00 2001 From: hideo aoyama <100831251+boukendesho@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:06:34 +0900 Subject: [PATCH 05/97] Correct snap nightlies's channel name to 'edge' --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03be86bb4..0b327abb6 100644 --- a/README.md +++ b/README.md @@ -267,7 +267,7 @@ or this command: #### Snap Nightlies - snap install sqlitebrowser --devmode + snap install sqlitebrowser --edge #### Snap Stable From ff830e7f5f0fed2f8c93baa74a4fe6745c2a1e65 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Fri, 13 Dec 2024 00:15:36 +0100 Subject: [PATCH 06/97] Drag & Drop or Copy & Paste insert statements from the DB Schema dock See issue #3817 --- src/DbStructureModel.cpp | 37 +++++++++++++++++++++++++++------- src/DbStructureModel.h | 5 +++++ src/MainWindow.cpp | 43 +++++++++++++++++++++++++++++++++++----- src/MainWindow.ui | 28 ++++++++++++++++++++++++++ src/Settings.cpp | 3 +++ 5 files changed, 104 insertions(+), 12 deletions(-) diff --git a/src/DbStructureModel.cpp b/src/DbStructureModel.cpp index bcded108e..cb2e1c2f7 100644 --- a/src/DbStructureModel.cpp +++ b/src/DbStructureModel.cpp @@ -8,6 +8,7 @@ #include #include #include +#include DbStructureModel::DbStructureModel(DBBrowserDB& db, QObject* parent) : QAbstractItemModel(parent), @@ -15,7 +16,8 @@ DbStructureModel::DbStructureModel(DBBrowserDB& db, QObject* parent) browsablesRootItem(nullptr), m_dropQualifiedNames(false), m_dropEnquotedNames(false), - m_dropSelectQuery(true) + m_dropSelectQuery(true), + m_dropInsert(false) { // Create root item and use its columns to store the header strings QStringList header; @@ -210,7 +212,7 @@ QStringList DbStructureModel::mimeTypes() const QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const { // We store the SQL data and the names data separately - QByteArray sqlData, namesData; + QByteArray sqlData, namesData, parametersData; // For dropping SELECT queries, these variables take account of // whether all objects are of the same type and belong to the same table. @@ -235,6 +237,8 @@ QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const // For names, export a (qualified) (escaped) identifier of the item for statement composition in SQL editor. if(objectType == "field") { namesData.append(getNameForDropping(item->text(ColumnSchema), item->parent()->text(ColumnName), item->text(ColumnName)).toUtf8()); + parametersData.append(QString("?" + item->text(ColumnName) + ", ").toUtf8()); + QString table = getNameForDropping(item->text(ColumnSchema), item->parent()->text(ColumnName), ""); if (tableSet.isEmpty() || tableSet == table) { tableSet = table; @@ -299,14 +303,27 @@ QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const else if (namesData.endsWith(".")) namesData.chop(1); + if (parametersData.endsWith(", ")) + parametersData.chop(2); + else if (parametersData.endsWith(".")) + parametersData.chop(1); + if (tableSet.endsWith(".")) tableSet.chop(1); - if (m_dropSelectQuery && !tableSet.isEmpty() && tableSet != "*" && !objectTypeSet.isEmpty()) { - if (objectTypeSet == "field") { - namesData = ("SELECT " + QString::fromUtf8(namesData) + " FROM " + tableSet + ";").toUtf8(); - } else if (objectTypeSet == "table") { - namesData = ("SELECT * FROM " + tableSet + ";").toUtf8(); + if (!tableSet.isEmpty() && tableSet != "*" && !objectTypeSet.isEmpty()) { + if (m_dropSelectQuery) { + if (objectTypeSet == "field") { + namesData = ("SELECT " + QString::fromUtf8(namesData) + " FROM " + tableSet + ";\n").toUtf8(); + } else if (objectTypeSet == "table") { + namesData = ("SELECT * FROM " + tableSet + ";").toUtf8(); + } + } else if (m_dropInsert) { + if (objectTypeSet == "field") { + namesData = ("INSERT INTO " + tableSet + " (" + QString::fromUtf8(namesData) + ") VALUES (" + parametersData + ");\n").toUtf8(); + } else if (objectTypeSet == "table") { + namesData = ("INSERT INTO " + tableSet + " DEFAULT VALUES;\n").toUtf8(); + } } } mime->setData("text/plain", namesData); @@ -315,6 +332,12 @@ QMimeData* DbStructureModel::mimeData(const QModelIndexList& indices) const return mime; } +void DbStructureModel::copy(const QModelIndexList& indices) const +{ + QMimeData *mimeData = DbStructureModel::mimeData(indices); + qApp->clipboard()->setMimeData(mimeData); +} + bool DbStructureModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int, int, const QModelIndex&) { if(action == Qt::IgnoreAction) diff --git a/src/DbStructureModel.h b/src/DbStructureModel.h index f12dc3f3b..15f6b9b01 100644 --- a/src/DbStructureModel.h +++ b/src/DbStructureModel.h @@ -27,6 +27,9 @@ class DbStructureModel : public QAbstractItemModel QMimeData* mimeData(const QModelIndexList& indices) const override; bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) override; + // Copy selected items to clipboard + void copy(const QModelIndexList& indices) const; + enum Columns { ColumnName, @@ -41,6 +44,7 @@ public slots: void setDropQualifiedNames(bool value) { m_dropQualifiedNames = value; } void setDropEnquotedNames(bool value) { m_dropEnquotedNames = value; } void setDropSelectQuery(bool value) { m_dropSelectQuery = value; } + void setDropInsert(bool value) { m_dropInsert = value; } private: DBBrowserDB& m_db; @@ -49,6 +53,7 @@ public slots: bool m_dropQualifiedNames; bool m_dropEnquotedNames; bool m_dropSelectQuery; + bool m_dropInsert; void buildTree(QTreeWidgetItem* parent, const std::string& schema); QTreeWidgetItem* addNode(const std::string& schema, const std::string& name, const std::string& object_type, const std::string& sql, QTreeWidgetItem* parent_item, const std::string& data_type = {}, const std::string& icon_suffix = {}); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 1d183d833..fed06b62d 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -247,9 +247,30 @@ void MainWindow::init() popupSchemaDockMenu->addAction(ui->actionPopupSchemaDockDetachDatabase); popupSchemaDockMenu->addSeparator(); popupSchemaDockMenu->addAction(ui->actionDropSelectQueryCheck); + popupSchemaDockMenu->addAction(ui->actionDropInsertCheck); + popupSchemaDockMenu->addAction(ui->actionDropNamesCheck); + + QActionGroup* dropGroup = new QActionGroup(popupSchemaDockMenu); + dropGroup->addAction(ui->actionDropSelectQueryCheck); + dropGroup->addAction(ui->actionDropInsertCheck); + dropGroup->addAction(ui->actionDropNamesCheck); + + popupSchemaDockMenu->addSeparator(); popupSchemaDockMenu->addAction(ui->actionDropQualifiedCheck); popupSchemaDockMenu->addAction(ui->actionEnquoteNamesCheck); + popupSchemaDockMenu->addSeparator(); + QAction* copyAction = new QAction(QIcon(":/icons/copy"), tr("Copy"), popupSchemaDockMenu); + copyAction->setShortcut(QKeySequence::Copy); + popupSchemaDockMenu->addAction(copyAction); + connect(copyAction, &QAction::triggered, this, [=]() { + dbStructureModel->copy(ui->treeSchemaDock->selectionModel()->selectedIndexes()); + }); + auto copyShortcut = new QShortcut(QKeySequence::Copy, ui->treeSchemaDock); + connect(copyShortcut, &QShortcut::activated, this, [=]() { + dbStructureModel->copy(ui->treeSchemaDock->selectionModel()->selectedIndexes()); + }); + popupOpenDbMenu = new QMenu(this); popupOpenDbMenu->addAction(ui->fileOpenAction); popupOpenDbMenu->addAction(ui->fileOpenReadOnlyAction); @@ -419,14 +440,16 @@ void MainWindow::init() connect(ui->dockEdit, &QDockWidget::visibilityChanged, this, &MainWindow::toggleEditDock); connect(remoteDock, SIGNAL(openFile(QString)), this, SLOT(fileOpen(QString))); connect(ui->actionDropSelectQueryCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropSelectQuery); + connect(ui->actionDropInsertCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropInsert); + connect(ui->actionDropNamesCheck, &QAction::toggled, dbStructureModel, + [this]() { + dbStructureModel->setDropSelectQuery(false); + dbStructureModel->setDropInsert(false); + }); connect(ui->actionDropQualifiedCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropQualifiedNames); connect(ui->actionEnquoteNamesCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropEnquotedNames); connect(&db, &DBBrowserDB::databaseInUseChanged, this, &MainWindow::updateDatabaseBusyStatus); - ui->actionDropSelectQueryCheck->setChecked(Settings::getValue("SchemaDock", "dropSelectQuery").toBool()); - ui->actionDropQualifiedCheck->setChecked(Settings::getValue("SchemaDock", "dropQualifiedNames").toBool()); - ui->actionEnquoteNamesCheck->setChecked(Settings::getValue("SchemaDock", "dropEnquotedNames").toBool()); - connect(ui->actionSqlStop, &QAction::triggered, this, [this]() { if(execute_sql_worker && execute_sql_worker->isRunning()) execute_sql_worker->stop(); @@ -770,6 +793,7 @@ void MainWindow::closeEvent( QCloseEvent* event ) Settings::setValue("SQLLogDock", "Log", ui->comboLogSubmittedBy->currentText()); Settings::setValue("SchemaDock", "dropSelectQuery", ui->actionDropSelectQueryCheck->isChecked()); + Settings::setValue("SchemaDock", "dropInsert", ui->actionDropInsertCheck->isChecked()); Settings::setValue("SchemaDock", "dropQualifiedNames", ui->actionDropQualifiedCheck->isChecked()); Settings::setValue("SchemaDock", "dropEnquotedNames", ui->actionEnquoteNamesCheck->isChecked()); @@ -2423,7 +2447,16 @@ void MainWindow::reloadSettings() sqlb::setIdentifierQuoting(static_cast(Settings::getValue("editor", "identifier_quotes").toInt())); - ui->tabSqlAreas->setTabsClosable(Settings::getValue("editor", "close_button_on_tabs").toBool()); + ui->tabSqlAreas->setTabsClosable( + Settings::getValue("editor", "close_button_on_tabs").toBool()); + + ui->actionDropSelectQueryCheck->setChecked(Settings::getValue("SchemaDock", "dropSelectQuery").toBool()); + ui->actionDropInsertCheck->setChecked(Settings::getValue("SchemaDock", "dropInsert").toBool()); + ui->actionDropNamesCheck->setChecked(!ui->actionDropSelectQueryCheck->isChecked() && + !ui->actionDropInsertCheck->isChecked()); + + ui->actionDropQualifiedCheck->setChecked(Settings::getValue("SchemaDock", "dropQualifiedNames").toBool()); + ui->actionEnquoteNamesCheck->setChecked(Settings::getValue("SchemaDock", "dropEnquotedNames").toBool()); } void MainWindow::checkNewVersion(const bool automatic) diff --git a/src/MainWindow.ui b/src/MainWindow.ui index b8304b83b..e06c49d18 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -2415,6 +2415,34 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed When dragging fields from the same table or a single table, drop a SELECT query into the editor + + + true + + + Drag && Drop Names + + + When dragging fields or tables, drop just the names into the editor + + + When dragging fields or tables, drop just the names into the editor + + + + + true + + + Drag && Drop INSERT Statement + + + When dragging fields from the same table or a single table, drop an INSERT statement into the editor + + + When dragging fields from the same table or a single table, drop an INSERT statement into the editor + + true diff --git a/src/Settings.cpp b/src/Settings.cpp index bb1e31c4d..fc0b50049 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -433,6 +433,9 @@ QVariant Settings::getDefaultValue(const std::string& group, const std::string& if(name == "dropSelectQuery") return true; + if(name == "dropInsert") + return false; + if(name == "dropQualifiedNames") return false; From 6751104a7f8b1745537d92ded10d66f4d02e7d4e Mon Sep 17 00:00:00 2001 From: mgrojo Date: Fri, 13 Dec 2024 20:43:21 +0100 Subject: [PATCH 07/97] Fix initialization of settings for drag & drop/copy operations See issue #3817 --- src/DbStructureModel.cpp | 8 +++++--- src/DbStructureModel.h | 4 +++- src/MainWindow.cpp | 4 +++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/DbStructureModel.cpp b/src/DbStructureModel.cpp index cb2e1c2f7..485fffb08 100644 --- a/src/DbStructureModel.cpp +++ b/src/DbStructureModel.cpp @@ -10,14 +10,16 @@ #include #include -DbStructureModel::DbStructureModel(DBBrowserDB& db, QObject* parent) +DbStructureModel::DbStructureModel(DBBrowserDB& db, QObject* parent, + bool dropSelectQuery, + bool dropInsert) : QAbstractItemModel(parent), m_db(db), browsablesRootItem(nullptr), m_dropQualifiedNames(false), m_dropEnquotedNames(false), - m_dropSelectQuery(true), - m_dropInsert(false) + m_dropSelectQuery(dropSelectQuery), + m_dropInsert(dropInsert) { // Create root item and use its columns to store the header strings QStringList header; diff --git a/src/DbStructureModel.h b/src/DbStructureModel.h index 15f6b9b01..7c2c3ae12 100644 --- a/src/DbStructureModel.h +++ b/src/DbStructureModel.h @@ -12,7 +12,9 @@ class DbStructureModel : public QAbstractItemModel Q_OBJECT public: - explicit DbStructureModel(DBBrowserDB& db, QObject* parent = nullptr); + explicit DbStructureModel(DBBrowserDB& db, QObject* parent = nullptr, + bool dropSelectQuery = true, + bool dropInsert = false); ~DbStructureModel() override; QVariant data(const QModelIndex& index, int role) const override; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index fed06b62d..56e20ff78 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -125,7 +125,9 @@ void MainWindow::init() connect(&db, &DBBrowserDB::requestCollation, this, &MainWindow::requestCollation); // Set up DB structure tab - dbStructureModel = new DbStructureModel(db, this); + dbStructureModel = new DbStructureModel(db, this, + Settings::getValue("SchemaDock", "dropSelectQuery").toBool(), + Settings::getValue("SchemaDock", "dropInsert").toBool()); connect(&db, &DBBrowserDB::structureUpdated, this, [this]() { std::vector old_tables; for(const auto& d : allTableBrowserDocks()) From b3aba3719c8591843540e4d32498cd4f901c878c Mon Sep 17 00:00:00 2001 From: mgrojo Date: Fri, 13 Dec 2024 20:45:12 +0100 Subject: [PATCH 08/97] Restructure the contextual menu in the DB Schema dock Put all the drag+drop/copy options in a submenu. See issue #3817 --- src/MainWindow.cpp | 26 ++++++++++++++------------ src/MainWindow.ui | 40 +++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 56e20ff78..4b1d4aa5c 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -248,24 +248,26 @@ void MainWindow::init() popupSchemaDockMenu->addAction(ui->actionPopupSchemaDockBrowseTable); popupSchemaDockMenu->addAction(ui->actionPopupSchemaDockDetachDatabase); popupSchemaDockMenu->addSeparator(); - popupSchemaDockMenu->addAction(ui->actionDropSelectQueryCheck); - popupSchemaDockMenu->addAction(ui->actionDropInsertCheck); - popupSchemaDockMenu->addAction(ui->actionDropNamesCheck); - QActionGroup* dropGroup = new QActionGroup(popupSchemaDockMenu); + auto dropSchemaDockMenu = new QMenu(popupSchemaDockMenu); + popupSchemaDockMenu->addMenu(dropSchemaDockMenu); + dropSchemaDockMenu->setTitle(tr("Clipboard/Drop Options")); + dropSchemaDockMenu->setStatusTip(tr("Options for Drag && Drop and Copy to Clipboard operations.")); + dropSchemaDockMenu->addAction(ui->actionDropSelectQueryCheck); + dropSchemaDockMenu->addAction(ui->actionDropInsertCheck); + dropSchemaDockMenu->addAction(ui->actionDropNamesCheck); + + QActionGroup* dropGroup = new QActionGroup(dropSchemaDockMenu); dropGroup->addAction(ui->actionDropSelectQueryCheck); dropGroup->addAction(ui->actionDropInsertCheck); dropGroup->addAction(ui->actionDropNamesCheck); - popupSchemaDockMenu->addSeparator(); - popupSchemaDockMenu->addAction(ui->actionDropQualifiedCheck); - popupSchemaDockMenu->addAction(ui->actionEnquoteNamesCheck); + dropSchemaDockMenu->addSeparator(); + dropSchemaDockMenu->addAction(ui->actionDropQualifiedCheck); + dropSchemaDockMenu->addAction(ui->actionEnquoteNamesCheck); - popupSchemaDockMenu->addSeparator(); - QAction* copyAction = new QAction(QIcon(":/icons/copy"), tr("Copy"), popupSchemaDockMenu); - copyAction->setShortcut(QKeySequence::Copy); - popupSchemaDockMenu->addAction(copyAction); - connect(copyAction, &QAction::triggered, this, [=]() { + popupSchemaDockMenu->addAction(ui->actionCopyInSchema); + connect(ui->actionCopyInSchema, &QAction::triggered, this, [=]() { dbStructureModel->copy(ui->treeSchemaDock->selectionModel()->selectedIndexes()); }); auto copyShortcut = new QShortcut(QKeySequence::Copy, ui->treeSchemaDock); diff --git a/src/MainWindow.ui b/src/MainWindow.ui index e06c49d18..67547bf12 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -2406,7 +2406,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed true - Drag && Drop SELECT Query + SELECT Statement When dragging fields from the same table or a single table, drop a SELECT query into the editor @@ -2415,32 +2415,32 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed When dragging fields from the same table or a single table, drop a SELECT query into the editor - + true - Drag && Drop Names + INSERT Statement - When dragging fields or tables, drop just the names into the editor + When dragging fields from the same table or a single table, drop an INSERT statement into the editor - When dragging fields or tables, drop just the names into the editor + When dragging fields from the same table or a single table, drop an INSERT statement into the editor - + true - Drag && Drop INSERT Statement + Just Names - When dragging fields from the same table or a single table, drop an INSERT statement into the editor + When dragging fields or tables, drop just the names into the editor - When dragging fields from the same table or a single table, drop an INSERT statement into the editor + When dragging fields or tables, drop just the names into the editor @@ -2448,7 +2448,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed true - Drag && Drop Qualified Names + Qualified Names Use qualified names (e.g. "Table"."Field") when dragging the objects and dropping them into the editor @@ -2462,7 +2462,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed true - Drag && Drop Enquoted Names + Enquoted Names Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor @@ -2471,6 +2471,24 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor + + + Copy + + + + :/icons/copy:/icons/copy + + + Ctrl+C + + + Copies to the clipboard the selection according to the chosen Drag & Drop/Clipboard options. + + + Copies to the clipboard the selection according to the chosen Drag & Drop/Clipboard options. + + &Integrity Check From 1edd9fb549c1cf8eeb4720be6e8ae629ed783a6e Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 14 Dec 2024 14:35:20 +0100 Subject: [PATCH 09/97] Sync settings which are saved in the destructors Otherwise they're never saved, because `Settings::sync` was only called in `MainWindow::closeEvent` --- src/Application.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Application.cpp b/src/Application.cpp index 0769a0d13..911415358 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -330,6 +330,7 @@ Application::~Application() { if(m_mainWindow) delete m_mainWindow; + Settings::sync(); } bool Application::event(QEvent* event) From 7518ce2da8fab93ecb11b27a05d2707c47cfd409 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 14 Dec 2024 14:41:10 +0100 Subject: [PATCH 10/97] Fix problem with the loading of the word wrapping setting All settings are reloaded in `reloadSettings` and not only the ones set in Preferences. This is important for the Scintilla word wrapping, otherwise the value is changed in the base class (for Execute SQL). Now it is correctly overwritten after calling `sciEdit->reloadSettings();`. See issue #3753 and #3061. --- src/EditDialog.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/EditDialog.cpp b/src/EditDialog.cpp index 5457cb3b1..5b380523a 100644 --- a/src/EditDialog.cpp +++ b/src/EditDialog.cpp @@ -95,13 +95,6 @@ EditDialog::EditDialog(QWidget* parent) }); connect(ui->actionOpenInExternal, &QAction::triggered, this, &EditDialog::openDataWithExternal); - mustIndentAndCompact = Settings::getValue("databrowser", "indent_compact").toBool(); - ui->actionIndent->setChecked(mustIndentAndCompact); - - ui->buttonAutoSwitchMode->setChecked(Settings::getValue("databrowser", "auto_switch_mode").toBool()); - ui->actionWordWrap->setChecked(Settings::getValue("databrowser", "editor_word_wrap").toBool()); - setWordWrapping(ui->actionWordWrap->isChecked()); - reloadSettings(); } @@ -1136,6 +1129,11 @@ void EditDialog::updateCellInfoAndMode(const QByteArray& bArrdata) void EditDialog::reloadSettings() { + mustIndentAndCompact = Settings::getValue("databrowser", "indent_compact").toBool(); + ui->actionIndent->setChecked(mustIndentAndCompact); + + ui->buttonAutoSwitchMode->setChecked(Settings::getValue("databrowser", "auto_switch_mode").toBool()); + // Set the (SQL) editor font for hex editor, since it needs a // Monospace font and the databrowser font would be usually of // variable width. @@ -1152,6 +1150,9 @@ void EditDialog::reloadSettings() (Settings::getValue("General", "toolbarStyleEditCell").toInt())); sciEdit->reloadSettings(); + + ui->actionWordWrap->setChecked(Settings::getValue("databrowser", "editor_word_wrap").toBool()); + setWordWrapping(ui->actionWordWrap->isChecked()); } void EditDialog::setStackCurrentIndex(int editMode) From 7b51cb5c207bc69c7444e0833324a11a7c55c6e4 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Wed, 18 Dec 2024 19:48:18 +0900 Subject: [PATCH 11/97] [skip ci] Skip downloading the nightly build if it is skipped --- .../other/get_nightlies_from_github_actions.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh index 8e6f554b9..f30411350 100644 --- a/installer/other/get_nightlies_from_github_actions.sh +++ b/installer/other/get_nightlies_from_github_actions.sh @@ -36,6 +36,20 @@ if ! gh release download --dir /tmp/incoming/ -R "sqlitebrowser/sqlitebrowser" n fi echo "Successfully downloaded the nightly build" + +# Check if the downloaded files are as expected +# This case is occuring when the nightly build is skipped +# for macOS Binaries +if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 2 ]; then + echo "Last nightly build is skipped" + exit 1 +fi +# for Windows Binaries +if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y-%m-%d)") -ne 4 ]; then + echo "Last nightly build is skipped" + exit 1 +fi + mv -v $DOWNLOAD_DIR*win32* /nightlies/win32/ mv -v $DOWNLOAD_DIR*win64* /nightlies/win64/ mv -v $DOWNLOAD_DIR*dmg /nightlies/macos-universal/ From 22ecfe371f37910d8271ef9452d94ec9f89e37f4 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Thu, 19 Dec 2024 18:05:38 +0900 Subject: [PATCH 12/97] Include AppImage in nightly builds --- .github/workflows/build-appimage.yml | 10 +++++++- .github/workflows/cppcmake-nightly.yml | 23 ++++--------------- .../get_nightlies_from_github_actions.sh | 8 +++++-- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build-appimage.yml b/.github/workflows/build-appimage.yml index ae845af47..42ae8d2c1 100644 --- a/.github/workflows/build-appimage.yml +++ b/.github/workflows/build-appimage.yml @@ -6,6 +6,10 @@ name: Build - AppImage on: workflow_call: + inputs: + NIGHTLY: + default: false + type: boolean jobs: build: @@ -60,7 +64,11 @@ jobs: wget -c -nv "https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20240109-1/linuxdeploy-x86_64.AppImage" wget -c -nv "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/1-alpha-20240109-1/linuxdeploy-plugin-qt-x86_64.AppImage" chmod a+x linuxdeploy-x86_64.AppImage linuxdeploy-plugin-qt-x86_64.AppImage - export VERSION=$(printf "dev-`git -C . rev-parse --short HEAD`") + if [ "${{ inputs.NIGHTLY }}" = "true" ]; then + export VERSION=$(date +%Y%m%d) + else + export VERSION=$(printf "dev-`git -C . rev-parse --short HEAD`") + fi LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ./linuxdeploy-x86_64.AppImage --appdir=appdir --desktop-file=appdir/usr/share/applications/sqlitebrowser.desktop --plugin qt --output appimage - name: Rename a file diff --git a/.github/workflows/cppcmake-nightly.yml b/.github/workflows/cppcmake-nightly.yml index 2ca5f5232..1f85b03da 100644 --- a/.github/workflows/cppcmake-nightly.yml +++ b/.github/workflows/cppcmake-nightly.yml @@ -6,24 +6,12 @@ on: workflow_dispatch: jobs: - check-skip: - runs-on: ubuntu-latest - outputs: - skip: ${{ steps.set-skip.outputs.skip }} - steps: - - uses: actions/checkout@v4 - - - id: set-skip - run: | - git fetch origin tag nightly - LAST_COMMIT_HASH=$(git rev-list -n 1 nightly) - if [ "$(git rev-parse HEAD)" = "$LAST_COMMIT_HASH" ]; then - echo "::notice::No new commits since last nightly build, skipping this build." - echo "skip=true" >> $GITHUB_OUTPUT - fi - + build-appimage: + if: needs.check-skip.outputs.skip != 'true' + uses: ./.github/workflows/build-appimage.yml + with: + NIGHTLY: true build-macos: - needs: check-skip if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-macos.yml secrets: inherit @@ -31,7 +19,6 @@ jobs: NIGHTLY: true build-windows: - needs: check-skip if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-windows.yml secrets: inherit diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh index f30411350..f8f57dc3b 100644 --- a/installer/other/get_nightlies_from_github_actions.sh +++ b/installer/other/get_nightlies_from_github_actions.sh @@ -39,8 +39,8 @@ echo "Successfully downloaded the nightly build" # Check if the downloaded files are as expected # This case is occuring when the nightly build is skipped -# for macOS Binaries -if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 2 ]; then +# for AppImage, macOS Binaries +if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 4 ]; then echo "Last nightly build is skipped" exit 1 fi @@ -50,15 +50,19 @@ if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y-%m-%d)") -ne 4 ]; then exit 1 fi +mv -v $DOWNLOAD_DIR*AppImage /nightlies/appimage/ mv -v $DOWNLOAD_DIR*win32* /nightlies/win32/ mv -v $DOWNLOAD_DIR*win64* /nightlies/win64/ mv -v $DOWNLOAD_DIR*dmg /nightlies/macos-universal/ +rm -v /nightlies/latest/*.AppImage rm -v /nightlies/latest/*.dmg rm -v /nightlies/latest/*.msi rm -v /nightlies/latest/*.zip DATE=$(date +%Y%m%d) +ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$DATE.AppImage /nightlies/latest/DB.Browser.for.SQLCipher.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$DATE.AppImage /nightlies/latest/DB.Browser.for.SQLite.AppImage ln -sv /nightlies/macos-universal/DB.Browser.for.SQLCipher-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLCipher-universal.dmg ln -sv /nightlies/macos-universal/DB.Browser.for.SQLite-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLite-universal.dmg DATE=$(date +%Y-%m-%d) From aec140384824ad5b00692ae208f2321eee0eb598 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Fri, 20 Dec 2024 17:32:12 +0100 Subject: [PATCH 13/97] Set column widths according to their contents only when user hasn't done it See issue #3790 and #3823. --- src/TableBrowser.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/TableBrowser.cpp b/src/TableBrowser.cpp index 5156be5d6..6dc3e8f2e 100644 --- a/src/TableBrowser.cpp +++ b/src/TableBrowser.cpp @@ -1724,11 +1724,13 @@ void TableBrowser::fetchedData() return; m_columnsResized = true; - // Set column widths according to their contents but make sure they don't exceed a certain size - ui->dataTable->resizeColumnsToContents(); - for(int i = 0; i < m_model->columnCount(); i++) - { - if(ui->dataTable->columnWidth(i) > 300) - ui->dataTable->setColumnWidth(i, 300); + if (m_settings[currentlyBrowsedTableName()].columnWidths.empty()) { + // Set column widths according to their contents but make sure they don't exceed a certain size + ui->dataTable->resizeColumnsToContents(); + for(int i = 0; i < m_model->columnCount(); i++) + { + if(ui->dataTable->columnWidth(i) > 300) + ui->dataTable->setColumnWidth(i, 300); + } } } From 5d291a653859df11e3c17949648235bb6e78ce87 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Wed, 25 Dec 2024 09:36:40 +0900 Subject: [PATCH 14/97] [skip ci] Skip downloading the nightly build if it is skipped MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a change that was already committed (1), but it was accidentally removed in another commit (2), so I’m committing it again. 1: 1048982fd40214015f2715031594856306458e6c 2: 22ecfe371f37910d8271ef9452d94ec9f89e37f4 --- .github/workflows/cppcmake-nightly.yml | 21 ++++++++++++++++++- .../get_nightlies_from_github_actions.sh | 4 ++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cppcmake-nightly.yml b/.github/workflows/cppcmake-nightly.yml index 1f85b03da..c062671b1 100644 --- a/.github/workflows/cppcmake-nightly.yml +++ b/.github/workflows/cppcmake-nightly.yml @@ -6,12 +6,30 @@ on: workflow_dispatch: jobs: + check-skip: + runs-on: ubuntu-latest + outputs: + skip: ${{ steps.set-skip.outputs.skip }} + steps: + - uses: actions/checkout@v4 + - id: set-skip + run: | + git fetch origin tag nightly + LAST_COMMIT_HASH=$(git rev-list -n 1 nightly) + if [ "$(git rev-parse HEAD)" = "$LAST_COMMIT_HASH" ]; then + echo "::notice::No new commits since last nightly build, skipping this build." + echo "skip=true" >> $GITHUB_OUTPUT + fi + build-appimage: + needs: check-skip if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-appimage.yml with: NIGHTLY: true + build-macos: + needs: check-skip if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-macos.yml secrets: inherit @@ -19,6 +37,7 @@ jobs: NIGHTLY: true build-windows: + needs: check-skip if: needs.check-skip.outputs.skip != 'true' uses: ./.github/workflows/build-windows.yml secrets: inherit @@ -26,7 +45,7 @@ jobs: NIGHTLY: true release: - needs: [build-macos, build-windows] + needs: [build-appimage, build-macos, build-windows] uses: ./.github/workflows/release.yml secrets: inherit with: diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh index f8f57dc3b..3f4a28b3b 100644 --- a/installer/other/get_nightlies_from_github_actions.sh +++ b/installer/other/get_nightlies_from_github_actions.sh @@ -61,8 +61,8 @@ rm -v /nightlies/latest/*.msi rm -v /nightlies/latest/*.zip DATE=$(date +%Y%m%d) -ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$DATE.AppImage /nightlies/latest/DB.Browser.for.SQLCipher.AppImage -ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$DATE.AppImage /nightlies/latest/DB.Browser.for.SQLite.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite.AppImage ln -sv /nightlies/macos-universal/DB.Browser.for.SQLCipher-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLCipher-universal.dmg ln -sv /nightlies/macos-universal/DB.Browser.for.SQLite-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLite-universal.dmg DATE=$(date +%Y-%m-%d) From 3866328111a33d0ca2a72bb61d3335ac649c6c4d Mon Sep 17 00:00:00 2001 From: mgrojo Date: Fri, 27 Dec 2024 13:19:50 +0100 Subject: [PATCH 15/97] Added call tips for some of the missing core functions from latest SQLite See https://www.sqlite.org/lang_corefunc.html and issue #3825. --- src/SqlUiLexer.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/SqlUiLexer.cpp b/src/SqlUiLexer.cpp index 314a73bca..face12259 100644 --- a/src/SqlUiLexer.cpp +++ b/src/SqlUiLexer.cpp @@ -80,6 +80,9 @@ void SqlUiLexer::setupAutoCompletion() {"changes", tr("() The changes() function returns the number of database rows that were changed or inserted or deleted by the most recently completed INSERT, DELETE, or UPDATE statement.")}, {"char", tr("(X1,X2,...) The char(X1,X2,...,XN) function returns a string composed of characters having the unicode code point values of integers X1 through XN, respectively. ")}, {"coalesce", tr("(X,Y,...) The coalesce() function returns a copy of its first non-NULL argument, or NULL if all arguments are NULL")}, + {"concat", tr("(X,...) The concat(...) function returns a string which is the concatenation of the string representation of all of its non-NULL arguments. If all arguments are NULL, then concat() returns an empty string.")}, + {"concat_ws", tr("(SEP,X,...) The concat_ws(SEP,...) function returns a string that is the concatenation of all non-null arguments beyond the first argument, using the text value of the first argument as a separator.")}, + {"format", tr("(FORMAT,...) The format(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library.")}, {"glob", tr("(X,Y) The glob(X,Y) function is equivalent to the expression \"Y GLOB X\".")}, {"ifnull", tr("(X,Y) The ifnull() function returns a copy of its first non-NULL argument, or NULL if both arguments are NULL.")}, {"instr", tr("(X,Y) The instr(X,Y) function finds the first occurrence of string Y within string X and returns the number of prior characters plus 1, or 0 if Y is nowhere found within X.")}, @@ -89,6 +92,8 @@ void SqlUiLexer::setupAutoCompletion() {"length", tr("(X) For a string value X, the length(X) function returns the number of characters (not bytes) in X prior to the first NUL character.")}, {"like", tr("(X,Y) The like() function is used to implement the \"Y LIKE X\" expression.")}, {"like", tr("(X,Y,Z) The like() function is used to implement the \"Y LIKE X ESCAPE Z\" expression.")}, + {"likelihood", tr("(X,Y) The purpose of the likelihood(X,Y) function is to provide a hint to the query planner that the argument X is a boolean that is true with a probability of approximately Y.")}, + {"likely", tr("(X) The purpose of the likely(X) function is to provide a hint to the query planner that the argument X is a boolean value that is usually true.")}, {"load_extension", tr("(X) The load_extension(X) function loads SQLite extensions out of the shared library file named X.\nUse of this function must be authorized from Preferences.")}, {"load_extension", tr("(X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y.\nUse of this function must be authorized from Preferences.")}, {"lower", tr("(X) The lower(X) function returns a copy of string X with all ASCII characters converted to lower case.")}, @@ -97,6 +102,7 @@ void SqlUiLexer::setupAutoCompletion() {"max", tr("(X,Y,...) The multi-argument max() function returns the argument with the maximum value, or return NULL if any argument is NULL.")}, {"min", tr("(X,Y,...) The multi-argument min() function returns the argument with the minimum value.")}, {"nullif", tr("(X,Y) The nullif(X,Y) function returns its first argument if the arguments are different and NULL if the arguments are the same.")}, + {"octet_length", tr("(X) The octet_length(X) function returns the number of bytes in the encoding of X.")}, {"printf", tr("(FORMAT,...) The printf(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language function and the printf() function from the standard C library.")}, {"quote", tr("(X) The quote(X) function returns the text of an SQL literal which is the value of its argument suitable for inclusion into an SQL statement.")}, {"random", tr("() The random() function returns a pseudo-random integer between -9223372036854775808 and +9223372036854775807.")}, @@ -113,7 +119,10 @@ void SqlUiLexer::setupAutoCompletion() {"trim", tr("(X) trim(X) removes spaces from both ends of X.")}, {"trim", tr("(X,Y) The trim(X,Y) function returns a string formed by removing any and all characters that appear in Y from both ends of X.")}, {"typeof", tr("(X) The typeof(X) function returns a string that indicates the datatype of the expression X.")}, + {"unhex", tr("(X) The unhex(X) function returns a BLOB value which is the decoding of the hexadecimal string X. X must be a pure hexadecimal string.")}, + {"unhex", tr("(X,Y) The unhex(X,Y) function returns a BLOB value which is the decoding of the hexadecimal string X. If X contains any characters that are not hexadecimal digits and which are not in Y, then unhex(X,Y) returns NULL.")}, {"unicode", tr("(X) The unicode(X) function returns the numeric unicode code point corresponding to the first character of the string X.")}, + {"unlikely", tr("(X) The purpose of the unlikely(X) function is to provide a hint to the query planner that the argument X is a boolean value that is usually not true.")}, {"upper", tr("(X) The upper(X) function returns a copy of input string X in which all lower-case ASCII characters are converted to their upper-case equivalent.")}, {"zeroblob", tr("(N) The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00.")}, // Date and time functions @@ -127,6 +136,7 @@ void SqlUiLexer::setupAutoCompletion() {"count", tr("(X) The count(X) function returns a count of the number of times that X is not NULL in a group.")}, {"group_concat", tr("(X) The group_concat() function returns a string which is the concatenation of all non-NULL values of X.")}, {"group_concat", tr("(X,Y) The group_concat() function returns a string which is the concatenation of all non-NULL values of X. If parameter Y is present then it is used as the separator between instances of X.")}, + {"string_agg", tr("(X,Y) string_agg(X,Y) function is an alias for group_concat(X,Y). String_agg() is compatible with PostgreSQL and SQL-Server and group_concat() is compatible with MySQL.")}, {"max", tr("(X) The max() aggregate function returns the maximum value of all values in the group.")}, {"min", tr("(X) The min() aggregate function returns the minimum non-NULL value of all values in the group.")}, {"sum", tr("(X) The sum() and total() aggregate functions return sum of all non-NULL values in the group.")}, From 8f68c57177a9b120fe7d1f7b2b4f9b317d85f7e5 Mon Sep 17 00:00:00 2001 From: Andreas Sturmlechner Date: Mon, 30 Dec 2024 21:59:36 +0100 Subject: [PATCH 16/97] Add missing QActionGroup include Signed-off-by: Andreas Sturmlechner --- src/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 4b1d4aa5c..89546255a 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #ifdef Q_OS_MACX //Needed only on macOS #include From ee5fe3730adf5278de743da4d9e956c492d1c0ef Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Thu, 2 Jan 2025 22:15:16 +0900 Subject: [PATCH 17/97] Refactor CI workflows --- .github/patch/CMakeLists.txt.patch | 33 ---- .github/patch/README.md | 1 - .github/patch/product.wxs.patch | 58 ------- .github/patch/translations.wxs.patch | 22 --- .github/patch/variables.wxi.patch | 43 ----- .github/workflows/build-ubuntu.yml | 60 ------- .github/workflows/coverity.yml | 34 ---- .../{build-macos.yml => cppcmake-macos.yml} | 43 +++-- .github/workflows/cppcmake-nightly.yml | 52 ------- ...build-appimage.yml => cppcmake-ubuntu.yml} | 67 +++++--- ...build-windows.yml => cppcmake-windows.yml} | 147 ++++++++---------- .github/workflows/cppcmake.yml | 90 +++++++++-- .github/workflows/release.yml | 49 ------ installer/macos/notarize.sh | 2 +- .../get_nightlies_from_github_actions.sh | 26 ++-- installer/windows/build.cmd | 4 +- installer/windows/product.wxs | 20 ++- installer/windows/translations.wxs | 4 +- installer/windows/variables.wxi | 26 ++-- 19 files changed, 248 insertions(+), 533 deletions(-) delete mode 100644 .github/patch/CMakeLists.txt.patch delete mode 100644 .github/patch/README.md delete mode 100644 .github/patch/product.wxs.patch delete mode 100644 .github/patch/translations.wxs.patch delete mode 100644 .github/patch/variables.wxi.patch delete mode 100644 .github/workflows/build-ubuntu.yml delete mode 100644 .github/workflows/coverity.yml rename .github/workflows/{build-macos.yml => cppcmake-macos.yml} (70%) delete mode 100644 .github/workflows/cppcmake-nightly.yml rename .github/workflows/{build-appimage.yml => cppcmake-ubuntu.yml} (67%) rename .github/workflows/{build-windows.yml => cppcmake-windows.yml} (54%) delete mode 100644 .github/workflows/release.yml diff --git a/.github/patch/CMakeLists.txt.patch b/.github/patch/CMakeLists.txt.patch deleted file mode 100644 index 801b2caf0..000000000 --- a/.github/patch/CMakeLists.txt.patch +++ /dev/null @@ -1,33 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1010923e..0b17700f 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -80,24 +80,24 @@ if(MSVC) - if(CMAKE_CL_64) - # Paths for 64-bit windows builds - set(OPENSSL_PATH "C:/dev/OpenSSL-Win64" CACHE PATH "OpenSSL Path") -- set(QT5_PATH "C:/dev/Qt/5.12.12/msvc2017_64" CACHE PATH "Qt5 Path") -+ set(QT5_PATH "C:/Qt/5.15.2/msvc2019_64" CACHE PATH "Qt5 Path") - - # Choose between SQLCipher or SQLite, depending whether - # -Dsqlcipher=on is passed on the command line - if(sqlcipher) -- set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win64" CACHE PATH "SQLCipher Path") -+ set(SQLITE3_PATH "C:/dev/SQLCipher-Win64" CACHE PATH "SQLCipher Path") - else() - set(SQLITE3_PATH "C:/dev/SQLite-Win64" CACHE PATH "SQLite Path") - endif() - else() - # Paths for 32-bit windows builds - set(OPENSSL_PATH "C:/dev/OpenSSL-Win32" CACHE PATH "OpenSSL Path") -- set(QT5_PATH "C:/dev/Qt/5.12.12/msvc2017" CACHE PATH "Qt5 Path") -+ set(QT5_PATH "C:/Qt/5.15.2/msvc2019" CACHE PATH "Qt5 Path") - - # Choose between SQLCipher or SQLite, depending whether - # -Dsqlcipher=on is passed on the command line - if(sqlcipher) -- set(SQLITE3_PATH "C:/git_repos/SQLCipher-Win32" CACHE PATH "SQLCipher Path") -+ set(SQLITE3_PATH "C:/dev/SQLCipher-Win32" CACHE PATH "SQLCipher Path") - else() - set(SQLITE3_PATH "C:/dev/SQLite-Win32" CACHE PATH "SQLite Path") - endif() diff --git a/.github/patch/README.md b/.github/patch/README.md deleted file mode 100644 index bbd2117ac..000000000 --- a/.github/patch/README.md +++ /dev/null @@ -1 +0,0 @@ -A collection of patch files used when a need change to a file in the source tree is required for GitHub Actions to work. \ No newline at end of file diff --git a/.github/patch/product.wxs.patch b/.github/patch/product.wxs.patch deleted file mode 100644 index abb0e62ad..000000000 --- a/.github/patch/product.wxs.patch +++ /dev/null @@ -1,58 +0,0 @@ -diff --git a/installer/windows/product.wxs b/installer/windows/product.wxs -index c040591a..46d57881 100644 ---- a/installer/windows/product.wxs -+++ b/installer/windows/product.wxs -@@ -63,7 +63,11 @@ - - - -- -+ -+ -+ -+ -+ - - - -@@ -84,6 +88,9 @@ - - - -+ -+ -+ - - - -@@ -149,8 +156,11 @@ - - - -- -+ -+ -+ - - - -@@ -169,6 +179,7 @@ - - - -+ - - - -@@ -186,6 +197,9 @@ - - - -+ -+ -+ - - - diff --git a/.github/patch/translations.wxs.patch b/.github/patch/translations.wxs.patch deleted file mode 100644 index 136092941..000000000 --- a/.github/patch/translations.wxs.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/installer/windows/translations.wxs b/installer/windows/translations.wxs -index f842e05b..0743a202 100644 ---- a/installer/windows/translations.wxs -+++ b/installer/windows/translations.wxs -@@ -97,7 +97,7 @@ - - - -- -+ - - - -@@ -197,7 +197,7 @@ - - - -- -+ - - - diff --git a/.github/patch/variables.wxi.patch b/.github/patch/variables.wxi.patch deleted file mode 100644 index 7077f15f4..000000000 --- a/.github/patch/variables.wxi.patch +++ /dev/null @@ -1,43 +0,0 @@ -diff --git a/installer/windows/variables.wxi b/installer/windows/variables.wxi -index fbedf0c3..34a65831 100644 ---- a/installer/windows/variables.wxi -+++ b/installer/windows/variables.wxi -@@ -40,8 +40,8 @@ - Visual Studio 2017. The build "ARCH" will be set automatically. - --> - -- -- -+ -+ - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -+ -+ -+ -+ -+ -+ -+ - - diff --git a/.github/workflows/build-ubuntu.yml b/.github/workflows/build-ubuntu.yml deleted file mode 100644 index 5cdaec181..000000000 --- a/.github/workflows/build-ubuntu.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Build - Ubuntu - -on: - release: - types: [created] - workflow_call: - -jobs: - build: - name: ${{ matrix.os }} - SQLCipher ${{ matrix.sqlcipher }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-20.04] - sqlcipher: ["0", "1"] - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install and cache dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 - with: - packages: libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 libsqlcipher-dev libsqlite3-dev qttools5-dev - - - name: Configure CMake - run: | - cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=${PWD}/install \ - -DCPACK_PACKAGE_DIRECTORY=${PWD}/package \ - -DENABLE_TESTING=ON \ - -Dsqlcipher=${{ matrix.sqlcipher }} - - - name: Run make - run: cmake --build build --config Release -j --target install - - - name: Run tests - run: ctest -V -C Release --test-dir build - - - if: github.event_name == 'release' - name: Package - run: | - cmake --build build --config Release -j --target package - cmake -E remove_directory package/_CPack_Packages - - - if: github.event_name == 'release' - name: Upload package - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - TAG: ${{ github.event.release.tag_name }} - UPLOAD_URL: ${{ github.event.release.upload_url }} - run: | - set the env var TAG: - $GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/$TAG | jq -r .upload_url) - UPLOAD_URL=${UPLOAD_URL%\{*} # remove "{name,label}" suffix - for pkg in package/*.*; do - NAME=$(basename $pkg) - MIME=$(file --mime-type $pkg|cut -d ' ' -f2) - curl -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: $MIME" --data-binary @$pkg $UPLOAD_URL?name=$NAME - done diff --git a/.github/workflows/coverity.yml b/.github/workflows/coverity.yml deleted file mode 100644 index 00fdb93ee..000000000 --- a/.github/workflows/coverity.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Coverity - -on: - push: - branches: [coverity_scan] - -defaults: - run: - shell: bash - -jobs: - build: - name: Coverity Scan - runs-on: ubuntu-20.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Install dependencies - run: | - sudo apt-get update - sudo apt-get install qttools5-dev libqt5scintilla2-dev libqcustomplot-dev libsqlite3-dev libqt5svg5 libsqlcipher-dev qt5-default - - - name: Configure cmake - run: | - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_TESTING=ON -Dsqlcipher=1 . - - - name: Build and scan - uses: vapier/coverity-scan-action@v1 - with: - project: sqlitebrowser%2Fsqlitebrowser - token: ${{ secrets.COVERITY_TOKEN }} - email: "github@mkleusberg.de" - command: make diff --git a/.github/workflows/build-macos.yml b/.github/workflows/cppcmake-macos.yml similarity index 70% rename from .github/workflows/build-macos.yml rename to .github/workflows/cppcmake-macos.yml index 7fc0d552f..1817fafce 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/cppcmake-macos.yml @@ -1,4 +1,4 @@ -name: Build - macOS +name: Build (macOS) on: workflow_call: @@ -6,16 +6,17 @@ on: NIGHTLY: default: false type: boolean + workflow_dispatch: jobs: build: - name: ${{ matrix.os }} - SQLCipher ${{ matrix.sqlcipher }} + name: ${{ matrix.os }} (${{ matrix.bundle }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + bundle: [SQLCipher, SQLite] os: [macos-14] - sqlcipher: ["0", "1"] env: MACOSX_DEPLOYMENT_TARGET: 10.13 steps: @@ -28,35 +29,38 @@ jobs: run: | sudo rm -rfv /Library/Frameworks/Mono.framework sudo pkgutil --forget com.xamarin.mono-MDK.pkg - sudo rm /etc/paths.d/mono-commands + sudo rm -v /etc/paths.d/mono-commands - name: Install dependencies run: | - brew update brew tap sqlitebrowser/tap - brew unlink openssl@3 - brew install sqlb-openssl@3 brew install sqlb-qt@5 sqlb-sqlcipher sqlb-sqlite ninja npm install -g appdmg - name: Configure build run: | if [ "${{ inputs.NIGHTLY }}" = "true" ]; then - if [ "${{ matrix.sqlcipher }}" = "1" ]; then + if [ "${{ matrix.bundle }}" = "SQLCipher" ]; then sed -i "" 's/"DB Browser for SQLite"/"DB Browser for SQLCipher Nightly"/' config/platform_apple.cmake else sed -i "" 's/"DB Browser for SQLite"/"DB Browser for SQLite Nightly"/' config/platform_apple.cmake fi else - if [ "${{ matrix.sqlcipher }}" = "1" ]; then + if [ "${{ matrix.bundle }}" = "SQLCipher" ]; then sed -i "" 's/"DB Browser for SQLite"/"DB Browser for SQLCipher-dev-'$(git rev-parse --short --verify HEAD)'"/' config/platform_apple.cmake else sed -i "" 's/"DB Browser for SQLite"/"DB Browser for SQLite-dev-'$(git rev-parse --short --verify HEAD)'"/' config/platform_apple.cmake fi fi - mkdir build && cd build - cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=14 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DcustomTap=1 -DENABLE_TESTING=ON -Dsqlcipher=${{ matrix.sqlcipher }} .. + mkdir -v build && cd build + cmake -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_STANDARD=14 \ + -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" \ + -DcustomTap=1 \ + -DENABLE_TESTING=ON \ + -Dsqlcipher=${{ matrix.bundle == 'SQLCipher' }} .. - name: Build working-directory: ./build @@ -81,8 +85,8 @@ jobs: KEYCHAIN_PW: ${{ secrets.MACOS_CODESIGN_KEYCHAIN_PW }} P12: ${{ secrets.MACOS_CODESIGN_P12 }} P12_PW: ${{ secrets.MACOS_CODESIGN_P12_PW }} - NIGHTLY: ${{ inputs.NIGHTLY }} - SQLCIPHER: ${{ matrix.sqlcipher }} + NIGHTLY: ${{ inputs.NIGHTLY || false }} + SQLCIPHER: ${{ matrix.bundle == 'SQLCipher'}} TEAM_ID: ${{ secrets.MACOS_CODESIGN_TEAM_ID }} - if: steps.notarization.conclusion != 'skipped' @@ -90,9 +94,18 @@ jobs: run: security delete-keychain $RUNNER_TEMP/app-signing.keychain-db continue-on-error: true - - if: github.event_name != 'pull_request' + - if: github.event_name != 'pull_request' && github.workflow != 'Build (macOS)' name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: build-artifacts-${{ matrix.os }}-${{ matrix.sqlcipher }} + name: build-artifacts-${{ matrix.os }}-${{ matrix.bundle }} path: DB.Browser.for.*.dmg + retention-days: 1 + + - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (macOS)' + name: Release + uses: softprops/action-gh-release@v2 + with: + files: DB.Browser.for.*.dmg + prerelease: true + tag_name: ${{ github.sha }}-macos \ No newline at end of file diff --git a/.github/workflows/cppcmake-nightly.yml b/.github/workflows/cppcmake-nightly.yml deleted file mode 100644 index c062671b1..000000000 --- a/.github/workflows/cppcmake-nightly.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Build and Deploy Nightly Builds - -on: - schedule: - - cron: '0 0 * * *' # Every day at midnight UTC - workflow_dispatch: - -jobs: - check-skip: - runs-on: ubuntu-latest - outputs: - skip: ${{ steps.set-skip.outputs.skip }} - steps: - - uses: actions/checkout@v4 - - id: set-skip - run: | - git fetch origin tag nightly - LAST_COMMIT_HASH=$(git rev-list -n 1 nightly) - if [ "$(git rev-parse HEAD)" = "$LAST_COMMIT_HASH" ]; then - echo "::notice::No new commits since last nightly build, skipping this build." - echo "skip=true" >> $GITHUB_OUTPUT - fi - - build-appimage: - needs: check-skip - if: needs.check-skip.outputs.skip != 'true' - uses: ./.github/workflows/build-appimage.yml - with: - NIGHTLY: true - - build-macos: - needs: check-skip - if: needs.check-skip.outputs.skip != 'true' - uses: ./.github/workflows/build-macos.yml - secrets: inherit - with: - NIGHTLY: true - - build-windows: - needs: check-skip - if: needs.check-skip.outputs.skip != 'true' - uses: ./.github/workflows/build-windows.yml - secrets: inherit - with: - NIGHTLY: true - - release: - needs: [build-appimage, build-macos, build-windows] - uses: ./.github/workflows/release.yml - secrets: inherit - with: - NIGHTLY: true diff --git a/.github/workflows/build-appimage.yml b/.github/workflows/cppcmake-ubuntu.yml similarity index 67% rename from .github/workflows/build-appimage.yml rename to .github/workflows/cppcmake-ubuntu.yml index 42ae8d2c1..4cfd12dcc 100644 --- a/.github/workflows/build-appimage.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -2,7 +2,7 @@ # If built on the latest OS, it may not run on previous OS versions. # Related: https://docs.appimage.org/reference/best-practices.html#binaries-compiled-on-old-enough-base-system -name: Build - AppImage +name: Build (Ubuntu) on: workflow_call: @@ -10,54 +10,66 @@ on: NIGHTLY: default: false type: boolean + workflow_dispatch: jobs: build: - name: ${{ matrix.os }} - SQLCipher ${{ matrix.sqlcipher }} + name: ${{ matrix.os }} (${{ matrix.bundle }}) runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + bundle: [SQLCipher, SQLite] os: [ubuntu-20.04] - sqlcipher: ["0", "1"] steps: - name: Checkout uses: actions/checkout@v4 - - name: Install dependencies + - name: Install and cache dependencies + uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + with: + packages: libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev + + - if: matrix.bundle == 'SQLCipher' + name: Build SQLCipher run: | - sudo apt update - sudo apt install libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 qttools5-dev + git clone https://github.com/sqlcipher/sqlcipher && cd sqlcipher && git checkout $(git describe --tags --abbrev=0) + ./configure --enable-tempstore=yes --with-crypto-lib=openssl --enable-load-extension --disable-tcl CFLAGS="-DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_SNAPSHOT=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_HAS_CODEC -DSQLITE_SOUNDEX" + make -j2 && sudo make install -j2 - - if: matrix.sqlcipher == 0 + - if: matrix.bundle == 'SQLite' name: Build SQLite run: | TARBALL=$(curl -s https://sqlite.org/download.html | awk '// {print}' | grep 'sqlite-autoconf' | cut -d ',' -f 3) SHA3=$(curl -s https://sqlite.org/download.html | awk '// {print}' | grep 'sqlite-autoconf' | cut -d ',' -f 5) curl -LsS -o sqlite.tar.gz https://sqlite.org/${TARBALL} VERIFY=$(openssl dgst -sha3-256 sqlite.tar.gz | cut -d ' ' -f 2) - if [ "$SHA3" != "$VERIFY" ]; then exit 1 ; fi + if [ "$SHA3" != "$VERIFY" ]; then + echo "::error::SQLite tarball checksum mismatch." + exit 1 + fi tar -xzf sqlite.tar.gz && cd sqlite-autoconf-* CPPFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_MATH_FUNCTIONS=1 -DSQLITE_MAX_ATTACHED=125 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_SNAPSHOT=1" ./configure --enable-shared=no make -j2 && sudo make install -j2 - - if: matrix.sqlcipher == 1 - name: Build SQLCipher - run: | - sudo apt install libssl-dev tcl - git clone https://github.com/sqlcipher/sqlcipher && cd sqlcipher && git checkout v4.6.1 - ./configure --enable-tempstore=yes --with-crypto-lib=openssl --enable-load-extension --disable-tcl CFLAGS="-DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_SNAPSHOT=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_HAS_CODEC -DSQLITE_SOUNDEX" - make -j2 && sudo make install -j2 - - name: Configure build run: | - mkdir appbuild && mkdir appdir && cd appbuild - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=../appdir/usr -Wno-dev -DFORCE_INTERNAL_QSCINTILLA=ON -Dsqlcipher=${{ matrix.sqlcipher }} .. + mkdir -v appbuild appdir && cd appbuild + cmake -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX:PATH=../appdir/usr \ + -DENABLE_TESTING=ON \ + -DFORCE_INTERNAL_QSCINTILLA=ON \ + -Dsqlcipher=${{ matrix.bundle == 'SQLCipher' }} .. - name: Build working-directory: ./appbuild - run: make install -j2 + run: ninja install + + - name: Tests + working-directory: ./appbuild + run: ninja test - name: Build AppImage run: | @@ -74,15 +86,24 @@ jobs: - name: Rename a file run: | for i in DB_Browser_for_SQLite*; do mv "$i" "${i//_/.}"; done - if [ "${{ matrix.sqlcipher }}" = "1" ]; then + if [ "${{ matrix.bundle }}" = "SQLCipher" ]; then export FILE=$(ls DB.Browser.for.SQLite*.AppImage) export FILE=${FILE/SQLite/SQLCipher} - mv DB.Browser.for.SQLite*.AppImage $FILE + mv -v DB.Browser.for.SQLite*.AppImage $FILE fi - - name: Upload artifacts + - if: github.event_name != 'pull_request' && github.workflow != 'Build (Ubuntu)' + name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: build-artifacts-${{ matrix.os }}-${{ matrix.sqlcipher }} + name: build-artifacts-${{ matrix.os }}-${{ matrix.bundle }} path: DB.Browser.for.*.AppImage retention-days: 1 + + - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Ubuntu)' + name: Release + uses: softprops/action-gh-release@v2 + with: + files: DB.Browser.for.*.AppImage + prerelease: true + tag_name: ${{ github.sha }}-ubuntu \ No newline at end of file diff --git a/.github/workflows/build-windows.yml b/.github/workflows/cppcmake-windows.yml similarity index 54% rename from .github/workflows/build-windows.yml rename to .github/workflows/cppcmake-windows.yml index ed676446b..5a7f351ac 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -1,4 +1,4 @@ -name: Build - Windows +name: Build (Windows) on: workflow_call: @@ -6,16 +6,17 @@ on: NIGHTLY: default: false type: boolean + workflow_dispatch: jobs: build: - name: Build + name: ${{ matrix.os }}-${{ matrix.arch }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + arch: [x86, x64] os: [windows-2019] - arch: ["Win32", "Win64"] env: GH_TOKEN: ${{ github.token }} OPENSSL_VERSION: 1.1.1.2100 @@ -24,53 +25,39 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Install OpenSSL + - name: Install dependencies run: | - if ("${{ matrix.arch }}" -eq "Win32") { - choco install openssl --x86 --version=${{ env.OPENSSL_VERSION}} + choco install --no-progress ninja + if ("${{ matrix.arch }}" -eq "x86") { + choco install --no-progress openssl --x86 --version=${{ env.OPENSSL_VERSION}} } else { - choco install openssl --version=${{ env.OPENSSL_VERSION}} + choco install --no-progress openssl --version=${{ env.OPENSSL_VERSION}} } - - name: Install Ninja (Windows) - run: choco install -y --no-progress ninja - - # When building SQLCipher, if we specify a path to OpenSSL and - # there are spaces in the path, an error will occur, so to - # avoid this, create the symlink. - - name: Create OpenSSL symlink - run: | - mkdir C:\dev - if ("${{ matrix.arch }}" -eq "Win32") { - New-Item -Path "C:\dev\OpenSSL-${{ matrix.arch }}" -ItemType SymbolicLink -Value "C:\Program Files (x86)\OpenSSL-Win32\" + # When building SQLCipher, if we specify a path to OpenSSL and + # there are spaces in the path, an error will occur, so to + # avoid this, create the symlink. + New-Item -Path C:\dev -ItemType Directory + if ("${{ matrix.arch }}" -eq "x86") { + New-Item -Path "C:\dev\OpenSSL" -ItemType SymbolicLink -Value "C:\Program Files (x86)\OpenSSL-Win32\" } else { - New-Item -Path "C:\dev\OpenSSL-${{ matrix.arch }}" -ItemType SymbolicLink -Value "C:\Program Files\OpenSSL" + New-Item -Path "C:\dev\OpenSSL" -ItemType SymbolicLink -Value "C:\Program Files\OpenSSL" } - name: Install Qt uses: jurplel/install-qt-action@v4 with: - arch: ${{ matrix.arch == 'Win32' && 'win32_msvc2019' || matrix.arch == 'Win64' && 'win64_msvc2019_64'}} + arch: ${{ matrix.arch == 'x86' && 'win32_msvc2019' || matrix.arch == 'x64' && 'win64_msvc2019_64'}} cache: true cache-key-prefix: "cache" version: ${{ env.QT_VERSION }} - - name: Download 'nalgeon/sqlean' - run: | - if ("${{ matrix.arch }}" -eq "Win32") { - gh release download --pattern "sqlean-win-x86.zip" --repo "nalgeon/sqlean" - Expand-Archive -Path sqlean-win-x86.zip -DestinationPath .\sqlean - } else { - gh release download --pattern "sqlean-win-x64.zip" --repo "nalgeon/sqlean" - Expand-Archive -Path sqlean-win-x64.zip -DestinationPath .\sqlean - } - - name: Setup MSVC uses: ilammy/msvc-dev-cmd@v1 with: - arch: ${{ matrix.arch == 'Win32' && 'amd64_x86' || matrix.arch == 'Win64' && 'amd64'}} + arch: ${{ matrix.arch == 'x86' && 'amd64_x86' || matrix.arch == 'x64' && 'amd64'}} - - name: Install SQLite + - name: Build SQLite run: | $htmlContent = Invoke-WebRequest -Uri "https://sqlite.org/download.html" | Select-Object -ExpandProperty Content $regex = [regex]::new('PRODUCT,(\d+\.\d+\.\d+),(\d+/sqlite-amalgamation-\d+\.zip),\d+,(.+)') @@ -79,51 +66,41 @@ jobs: $downloadLink = "https://sqlite.org/$relativeUrl" Invoke-WebRequest -Uri $downloadLink -OutFile 'sqlite.zip' Expand-Archive -Path sqlite.zip -DestinationPath C:\dev\ - Move-Item -Path C:\dev\sqlite-amalgamation-* C:\dev\SQLite-${{ matrix.arch }} - cd C:\dev\SQLite-${{ matrix.arch }} + Move-Item -Path C:\dev\sqlite-amalgamation-* C:\dev\SQLite\ + cd C:\dev\SQLite cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_MAX_ATTACHED=125 -DSQLITE_API="__declspec(dllexport)" -link -dll -out:sqlite3.dll - - name: Install SQLite Extensions + - name: Download SQLean extension + run: | + if ("${{ matrix.arch }}" -eq "x86") { + gh release download --pattern "sqlean-win-x86.zip" --repo "nalgeon/sqlean" + Expand-Archive -Path sqlean-win-x86.zip -DestinationPath .\sqlean + } else { + gh release download --pattern "sqlean-win-x64.zip" --repo "nalgeon/sqlean" + Expand-Archive -Path sqlean-win-x64.zip -DestinationPath .\sqlean + } + + - name: Build 'formats' Extensions run: | - cp .\src\extensions\extension-formats.c C:\dev\SQLite-${{ matrix.arch}}\ - cp .\src\extensions\extension-formats.def C:\dev\SQLite-${{ matrix.arch}}\ - cp .\src\extensions\extension-functions.c C:\dev\SQLite-${{ matrix.arch}}\ - cp .\src\extensions\extension-functions.def C:\dev\SQLite-${{ matrix.arch}}\ - cd C:\dev\SQLite-${{ matrix.arch}}\ + cp .\src\extensions\extension-formats.c C:\dev\SQLite\ + cp .\src\extensions\extension-formats.def C:\dev\SQLite\ + cd C:\dev\SQLite cl /MD extension-formats.c -link -dll -def:extension-formats.def -out:formats.dll - cl /MD extension-functions.c -link -dll -def:extension-functions.def -out:math.dll - # FIXME: Disable building the 'fileio' extension for now (#3488) - # If this issue is resolved, be sure to delete the related patch for WiX - # curl -L -o fileio.c "https://sqlite.org/src/raw?filename=ext/misc/fileio.c&ci=trunk" - # curl -L -o test_windirent.c "https://sqlite.org/src/raw?filename=src/test_windirent.c&ci=trunk" - # curl -L -o test_windirent.h "https://sqlite.org/src/raw?filename=src/test_windirent.h&ci=trunk" - # cl /MD fileio.c test_windirent.c -link sqlite3.lib -dll -out:fileio.dll - - - name: Install SQLCipher + + - name: Build SQLCipher run: | cd C:\dev - git clone https://github.com/sqlcipher/sqlcipher - mv sqlcipher SQLCipher-${{ matrix.arch }} - cd SQLCipher-${{ matrix.arch }} + git clone https://github.com/sqlcipher/sqlcipher SQLCipher/ + cd SQLCipher git switch $(git describe --tags --abbrev=0) - nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL-${{ matrix.arch }}\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL-${{ matrix.arch }}\include" + nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include" mkdir sqlcipher copy sqlite3.h sqlcipher - - name: Patch WiX Toolset Variables - run: | - git apply .github\patch\product.wxs.patch - git apply .github\patch\translations.wxs.patch - git apply .github\patch\variables.wxi.patch - - name: Configure build (SQLite) run: | mkdir release-sqlite && cd release-sqlite - if ("${{ matrix.arch }}" -eq "Win32") { - cmake -G"Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:/dev/SQLite-Win32;C:/dev/OpenSSL-Win32" ..\ - } else { - cmake -G"Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:/dev/SQLite-Win64;C:/dev/OpenSSL-Win64" ..\ - } + cmake -G "Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:\dev\SQLite" ..\ - name: Build (SQLite) run: | @@ -133,11 +110,7 @@ jobs: - name: Configure build (SQLCipher) run: | mkdir release-sqlcipher && cd release-sqlcipher - if ("${{ matrix.arch }}" -eq "Win32") { - cmake -G"Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:/dev/SQLCipher-Win32;C:/dev/OpenSSL-Win32" ..\ - } else { - cmake -G"Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:/dev/SQLCipher-Win64;C:/dev/OpenSSL-Win64" ..\ - } + cmake -G "Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:\dev\OpenSSL;C:\dev\SQLCipher" ..\ - name: Build (SQLCipher) run: | @@ -148,19 +121,18 @@ jobs: name: Create MSI env: ExePath: ${{ github.workspace }} - OpenSSLPath: C:\dev\OpenSSL-${{ matrix.arch }} - SQLCipherPath: C:\dev\SQLCipher-${{ matrix.arch }} + OpenSSLPath: C:\dev\OpenSSL + SQLCipherPath: C:\dev\SQLCipher SqleanPath: ${{ github.workspace }}\sqlean - SQLitePath: C:\dev\SQLite-${{ matrix.arch }} + SQLitePath: C:\dev\SQLite run: | cd installer/windows ./build.cmd "${{ matrix.arch }}".ToLower() - $ARCH="${{ matrix.arch }}".ToLower() - $DATE=$(Get-Date -Format "yyyy-MM-dd") + $DATE=$(Get-Date -Format "yyyyMMdd") if ("${{ inputs.NIGHTLY }}" -eq "true") { - mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-$DATE-$ARCH.msi" + mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-$DATE-${{ matrix.arch }}.msi" } else { - mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-$ARCH.msi" + mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-${{ matrix.arch }}.msi" } - if: github.event_name != 'pull_request' @@ -168,7 +140,7 @@ jobs: id: unsigned-artifacts uses: actions/upload-artifact@v4 with: - name: build-artifacts-${{ matrix.os}}-${{ matrix.arch }}-unsigned + name: build-artifacts-${{ matrix.os }}-${{ matrix.arch }}-unsigned path: installer\windows\DB.Browser.for.SQLite-*.msi # Change the signing-policy-slug when you release an RC, RTM or stable release. @@ -187,22 +159,21 @@ jobs: - if: github.event_name != 'pull_request' name: Create ZIP run: | - $ARCH="${{ matrix.arch }}".ToLower() - $DATE=$(Get-Date -Format "yyyy-MM-dd") + $DATE=$(Get-Date -Format "yyyyMMdd") if ("${{ inputs.NIGHTLY }}" -eq "true") { - $FILENAME_FORMAT="DB.Browser.for.SQLite-$DATE-$ARCH.zip" + $FILENAME_FORMAT="DB.Browser.for.SQLite-$DATE-${{ matrix.arch }}.zip" } else { - $FILENAME_FORMAT="DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-$ARCH.zip" + $FILENAME_FORMAT="DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-${{ matrix.arch }}.zip" } Start-Process msiexec.exe -ArgumentList "/a $(dir installer\windows\DB.Browser.for.SQLite-*.msi) /q TARGETDIR=$PWD\target\" -Wait - if ("${{ matrix.arch }}" -eq "Win32") { + if ("${{ matrix.arch }}" -eq "x86") { move target\System\* "target\DB Browser for SQLite\" } else { move target\System64\* "target\DB Browser for SQLite\" } Compress-Archive -Path "target\DB Browser for SQLite\*" -DestinationPath $FILENAME_FORMAT - - if: github.event_name != 'pull_request' + - if: github.event_name != 'pull_request' && github.workflow != 'Build (Windows)' name: Prepare artifacts run: | mkdir build-artifacts @@ -210,9 +181,17 @@ jobs: move DB.Browser.for.SQLite-*.zip build-artifacts\ Compress-Archive -Path build-artifacts\* -DestinationPath build-artifacts-${{ matrix.arch }}.zip - - if: github.event_name != 'pull_request' + - if: github.event_name != 'pull_request' && github.workflow != 'Build (Windows)' name: Upload artifacts uses: actions/upload-artifact@v4 with: name: build-artifacts-${{ matrix.os }}-${{ matrix.arch }} path: build-artifacts-${{ matrix.arch }}.zip + + - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Windows)' + name: Release + uses: softprops/action-gh-release@v2 + with: + files: installer/windows/DB.Browser.for.SQLite-*.msi, DB.Browser.for.SQLite-*.zip + prerelease: true + tag_name: ${{ github.sha }}-windows \ No newline at end of file diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index 9c66c0e72..9e06ce3e4 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -4,30 +4,94 @@ on: push: branches: [master] pull_request: + schedule: + - cron: '0 0 * * *' # Every day at midnight UTC workflow_dispatch: - -permissions: - contents: write + inputs: + NIGHTLY: + description: 'Run as a nightly build' + default: false + required: true + type: boolean jobs: - build-appimage: - if: github.event_name != 'pull_request' - uses: ./.github/workflows/build-appimage.yml + check-skippable: + name: Check Skippable + runs-on: ubuntu-24.04 + outputs: + skip: ${{ steps.set-skippable.outputs.skippable || 'false' }} + steps: + - uses: actions/checkout@v4 + + - name: Check and set skippable + id: set-skippable + continue-on-error: true + run: | + if [ "${{ github.event_name }}" = "schedule" ]; then + git fetch origin tag nightly + LAST_COMMIT_HASH=$(git rev-list -n 1 nightly) + if [ "$(git rev-parse HEAD)" = "$LAST_COMMIT_HASH" ]; then + echo "::notice::No new commits since last nightly build, skipping this build." + echo "skippable=true" >> $GITHUB_OUTPUT + fi + else + echo "skippable=false" >> $GITHUB_OUTPUT + fi build-macos: - uses: ./.github/workflows/build-macos.yml + needs: check-skippable + if: needs.check-skippable.outputs.skip != 'true' + uses: ./.github/workflows/cppcmake-macos.yml secrets: inherit + with: + NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} build-ubuntu: - uses: ./.github/workflows/build-ubuntu.yml - secrets: inherit + needs: check-skippable + if: needs.check-skippable.outputs.skip != 'true' + uses: ./.github/workflows/cppcmake-ubuntu.yml + with: + NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} build-windows: - uses: ./.github/workflows/build-windows.yml + needs: check-skippable + if: needs.check-skippable.outputs.skip != 'true' + uses: ./.github/workflows/cppcmake-windows.yml secrets: inherit + with: + NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} release: if: github.event_name != 'pull_request' - needs: [build-appimage, build-macos, build-windows] - uses: ./.github/workflows/release.yml - secrets: inherit + needs: [build-macos, build-ubuntu, build-windows] + name: Release + runs-on: ubuntu-24.04 + env: + GH_TOKEN: ${{ github.token }} + tag_name: ${{ (github.event_name == 'schedule' || inputs.NIGHTLY == true) && 'nightly' || 'continuous' }} + steps: + - name: Delete existing tag and release + run: gh release delete ${{ env.tag_name }} --cleanup-tag --yes --repo $GITHUB_REPOSITORY + continue-on-error: true + + - run: mkdir -v target + + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: target + + - name: Remove unsigned Windows build + run: rm -rfv target/*unsigned* + + - run: find target -type f -exec mv -v {} target \; + + - name: Unarchive Windows's build artifacts + run: for f in target/*.zip; do unzip -d target/ "$f" && rm -v "$f"; done + + - name: Release + uses: softprops/action-gh-release@v2 + with: + files: target/* + prerelease: true + tag_name: ${{ env.tag_name }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 80e773889..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Release - -on: - workflow_call: - inputs: - NIGHTLY: - default: false - type: boolean - -env: - tag_name: ${{ inputs.NIGHTLY == true && 'nightly' || 'continuous' }} - -jobs: - release: - runs-on: ubuntu-latest - steps: - - name: Delete existing tag and release - uses: dev-drprasad/delete-tag-and-release@v1.1 - with: - delete_release: true - github_token: ${{ secrets.GITHUB_TOKEN }} - tag_name: ${{ env.tag_name }} - - - run: mkdir target - - - name: Download artifacts - uses: actions/download-artifact@v4 - with: - path: target - - - name: Remove unsigned Windows build - run: rm -rfv target/*unsigned* - - - run: find target -type f -exec mv -v {} target \; - - - name: Unarchive Windows's build artifacts - run: for f in target/*.zip; do unzip -d target/ "$f"; done - - - name: Remove archived Windows's build artifacts - run: rm -v target/build-artifacts-*.zip - - - name: Release - uses: softprops/action-gh-release@v2 - with: - files: target/* - prerelease: true - tag_name: ${{ env.tag_name }} - - # For reference: Uploading nightly builds to the nightly server is processed on the nightly server side. diff --git a/installer/macos/notarize.sh b/installer/macos/notarize.sh index 7cb209558..04d8d0f56 100644 --- a/installer/macos/notarize.sh +++ b/installer/macos/notarize.sh @@ -84,7 +84,7 @@ mv build/*.app installer/macos # Create the DMG export DATE=$(date +%Y%m%d) -if [ "$SQLCIPHER" = "1" ]; then +if [ "$SQLCIPHER" = "true" ]; then if [ "$NIGHTLY" = "false" ]; then # Continuous with SQLCipher sed -i "" 's/"DB Browser for SQLCipher Nightly.app"/"DB Browser for SQLCipher-dev-'$(git rev-parse --short --verify HEAD)'.app"/' installer/macos/sqlcipher-nightly.json diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh index 3f4a28b3b..f9b54243d 100644 --- a/installer/other/get_nightlies_from_github_actions.sh +++ b/installer/other/get_nightlies_from_github_actions.sh @@ -13,8 +13,7 @@ DOWNLOAD_DIR="/tmp/incoming/" rm -rfv $DOWNLOAD_DIR mkdir -v $DOWNLOAD_DIR -if [ $(ls -l /nightlies/macos-universal | grep -c "$(date +%Y%m%d)") ] && - [ $(ls -l /nightlies/win32 /nightlies/win64 | grep -c "$(date +%Y-%m-%d)") -ne 0 ]; then +if [ $(ls -l /nightlies/appimage /nightlies/win32 /nightlies/win64 /nightlies/macos-universal | grep -c "$(date +%Y%m%d)") ]; then echo "Nightly build already exists" exit 1 fi @@ -24,7 +23,7 @@ if ! gh auth login --with-token <<< "$GH_TOKEN"; then fi echo "Successfully authenticated with GitHub" -IS_BUILD_SUCCESS=$(gh run list --created $(date '+%Y-%m-%d') --limit 1 --status "success" --workflow "cppcmake-nightly.yml" --repo "sqlitebrowser/sqlitebrowser" | wc -l) +IS_BUILD_SUCCESS=$(gh run list --created $(date '+%Y-%m-%d') --limit 1 --event "schedule" --status "success" --workflow "CI" --repo "sqlitebrowser/sqlitebrowser" | wc -l) if [ $IS_BUILD_SUCCESS -eq 0 ]; then echo "No successful build found" exit 1 @@ -39,20 +38,14 @@ echo "Successfully downloaded the nightly build" # Check if the downloaded files are as expected # This case is occuring when the nightly build is skipped -# for AppImage, macOS Binaries -if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 4 ]; then - echo "Last nightly build is skipped" - exit 1 -fi -# for Windows Binaries -if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y-%m-%d)") -ne 4 ]; then +if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 8 ]; then echo "Last nightly build is skipped" exit 1 fi mv -v $DOWNLOAD_DIR*AppImage /nightlies/appimage/ -mv -v $DOWNLOAD_DIR*win32* /nightlies/win32/ -mv -v $DOWNLOAD_DIR*win64* /nightlies/win64/ +mv -v $DOWNLOAD_DIR*x86* /nightlies/win32/ +mv -v $DOWNLOAD_DIR*x64* /nightlies/win64/ mv -v $DOWNLOAD_DIR*dmg /nightlies/macos-universal/ rm -v /nightlies/latest/*.AppImage @@ -65,10 +58,9 @@ ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$(echo $DATE)-x86.64.AppImag ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite.AppImage ln -sv /nightlies/macos-universal/DB.Browser.for.SQLCipher-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLCipher-universal.dmg ln -sv /nightlies/macos-universal/DB.Browser.for.SQLite-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLite-universal.dmg -DATE=$(date +%Y-%m-%d) -ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-win32.msi /nightlies/latest/DB.Browser.for.SQLite-win32.msi -ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-win32.zip /nightlies/latest/DB.Browser.for.SQLite-win32.zip -ln -sv /nightlies/win64/DB.Browser.for.SQLite-$DATE-win64.msi /nightlies/latest/DB.Browser.for.SQLite-win64.msi -ln -sv /nightlies/win64/DB.Browser.for.SQLite-$DATE-win64.zip /nightlies/latest/DB.Browser.for.SQLite-win64.zip +ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-x86.msi /nightlies/latest/DB.Browser.for.SQLite-x86.msi +ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-x86.zip /nightlies/latest/DB.Browser.for.SQLite-x86.zip +ln -sv /nightlies/win64/DB.Browser.for.SQLite-$DATE-x64.msi /nightlies/latest/DB.Browser.for.SQLite-x64.msi +ln -sv /nightlies/win64/DB.Browser.for.SQLite-$DATE-x64.zip /nightlies/latest/DB.Browser.for.SQLite-x64.zip echo "[STOP]" diff --git a/installer/windows/build.cmd b/installer/windows/build.cmd index af86b2b67..345b73843 100644 --- a/installer/windows/build.cmd +++ b/installer/windows/build.cmd @@ -7,9 +7,9 @@ set MSI=DB.Browser.for.SQLite-%1 if "%1"=="" ( echo ERROR: You must select a build type, either "win64" or "win32" goto :eof -) else if "%1"=="win32" ( +) else if "%1"=="x86" ( set ARCH=x86 -) else if "%1"=="win64" ( +) else if "%1"=="x64" ( set ARCH=x64 ) else ( echo ERROR: Unknown build type="%1" diff --git a/installer/windows/product.wxs b/installer/windows/product.wxs index df52263f3..385895a81 100644 --- a/installer/windows/product.wxs +++ b/installer/windows/product.wxs @@ -61,9 +61,11 @@ - - + + + + @@ -84,6 +86,9 @@ + + + @@ -143,14 +148,11 @@ - - - - - + + @@ -169,6 +171,7 @@ + @@ -186,6 +189,9 @@ + + + diff --git a/installer/windows/translations.wxs b/installer/windows/translations.wxs index f842e05b4..0743a202c 100644 --- a/installer/windows/translations.wxs +++ b/installer/windows/translations.wxs @@ -97,7 +97,7 @@ - + @@ -197,7 +197,7 @@ - + diff --git a/installer/windows/variables.wxi b/installer/windows/variables.wxi index fbedf0c31..b824b88e9 100644 --- a/installer/windows/variables.wxi +++ b/installer/windows/variables.wxi @@ -40,8 +40,8 @@ Visual Studio 2017. The build "ARCH" will be set automatically. --> - - + + - - - - - - - - - - - - - - - + + + + + + + From 71157d6e1fd24fc4ad94fa1d0269ac8f66d39e73 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Fri, 10 Jan 2025 06:10:11 +0900 Subject: [PATCH 18/97] Add GitHub Actions Step Summary --- .github/workflows/cppcmake-macos.yml | 18 +++++++++++++++++- .github/workflows/cppcmake-ubuntu.yml | 18 +++++++++++++++++- .github/workflows/cppcmake-windows.yml | 15 ++++++++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cppcmake-macos.yml b/.github/workflows/cppcmake-macos.yml index 1817fafce..1fe84f62b 100644 --- a/.github/workflows/cppcmake-macos.yml +++ b/.github/workflows/cppcmake-macos.yml @@ -108,4 +108,20 @@ jobs: with: files: DB.Browser.for.*.dmg prerelease: true - tag_name: ${{ github.sha }}-macos \ No newline at end of file + tag_name: ${{ github.sha }}-macos + + - name: Summary + run: | + QT_VERSION=$($(brew --prefix sqlb-qt@5)/bin/qmake --version | awk '/Using Qt version/ {print $4}') + if [ "${{ matrix.bundle }}" = "SQLCipher" ]; then + OPENSSL_VERSION=$($(brew --prefix sqlb-openssl@3)/bin/openssl version | awk '{print $2}') + SQLCIPHER_VERSION=$($(brew --prefix sqlb-sqlcipher)/bin/sqlcipher ":memory:" "PRAGMA cipher_version;" | awk '{print $1}') + SQLITE_VERSION="Not applicable" + else + OPENSSL_VERSION="Not applicable" + SQLCIPHER_VERSION="Not applicable" + SQLITE_VERSION=$($(brew --prefix sqlb-sqlite)/bin/sqlite3 --version | awk '{print $1}') + fi + + echo "## Libaries used" >> $GITHUB_STEP_SUMMARY + echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 4cfd12dcc..ea8720c20 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -106,4 +106,20 @@ jobs: with: files: DB.Browser.for.*.AppImage prerelease: true - tag_name: ${{ github.sha }}-ubuntu \ No newline at end of file + tag_name: ${{ github.sha }}-ubuntu + + - name: Summary + run: | + QT_VERSION=$(qmake --version | awk '/Using Qt version/ {print $4}') + if [ "${{ matrix.bundle }}" = "SQLCipher" ]; then + OPENSSL_VERSION=$(openssl version | awk '{print $2}') + SQLCIPHER_VERSION=$(/usr/local/bin/sqlcipher ":memory:" "PRAGMA cipher_version;" | awk '{print $1}') + SQLITE_VERSION="Not applicable" + else + OPENSSL_VERSION="Not applicable" + SQLCIPHER_VERSION="Not applicable" + SQLITE_VERSION=$(/usr/local/bin/sqlite3 --version | awk '{print $1}') + fi + + echo "## Libaries used" >> $GITHUB_STEP_SUMMARY + echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 5a7f351ac..835f13eef 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -194,4 +194,17 @@ jobs: with: files: installer/windows/DB.Browser.for.SQLite-*.msi, DB.Browser.for.SQLite-*.zip prerelease: true - tag_name: ${{ github.sha }}-windows \ No newline at end of file + tag_name: ${{ github.sha }}-windows + + - name: Summary + run: | + $OPENSSL_VERSION=(C:\dev\OpenSSL\bin\openssl version) -replace "OpenSSL ([\d\.]+[a-z]+) .*", '$1' + $QT_VERSION = & "$env:QT_ROOT_DIR\bin\qmake.exe" --version | Select-String "Using Qt version" | ForEach-Object { $_.ToString().Split()[3] } + $SQLCIPHER_VERSION=(Get-Item "C:\dev\SQLCipher\sqlcipher.dll").VersionInfo.FileVersion + Select-String -Path "C:\dev\SQLite\sqlite3.h" -Pattern '#define SQLITE_VERSION\s+"([\d\.]+)"' | ForEach-Object { + ($_ -match '"([\d\.]+)"') | Out-Null + $SQLITE_VERSION=$matches[1] + } + + echo "## Libaries used" >> $env:GITHUB_STEP_SUMMARY + echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $env:GITHUB_STEP_SUMMARY \ No newline at end of file From ea0870a81c65d55a095cea99a488f130ad915467 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 12 Jan 2025 05:19:22 +0900 Subject: [PATCH 19/97] Enable Dynamic Workflow Run Name --- .github/workflows/cppcmake.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index 9e06ce3e4..30f9c7cd0 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -14,6 +14,8 @@ on: required: true type: boolean +run-name: "${{ (github.event_name == 'schedule' || inputs.NIGHTLY == true) && 'Build and Deploy Nightly Builds' || 'CI' }}" + jobs: check-skippable: name: Check Skippable From 64a87e54dc6b71a61ada1cf1116fd16fed96b137 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 12 Jan 2025 09:44:29 +0900 Subject: [PATCH 20/97] Include commit title to CI workflow run-name --- .github/workflows/cppcmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index 30f9c7cd0..cf3dd0ecb 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -14,7 +14,7 @@ on: required: true type: boolean -run-name: "${{ (github.event_name == 'schedule' || inputs.NIGHTLY == true) && 'Build and Deploy Nightly Builds' || 'CI' }}" +run-name: "${{ (github.event_name == 'schedule' || inputs.NIGHTLY == true) && 'Build and Deploy Nightly Builds' || github.event.head_commit.message}}" jobs: check-skippable: From 1d8e9fb874239be9f0ac7b2beeb3cd6fef7ddf07 Mon Sep 17 00:00:00 2001 From: Vyachslav <118258240+Vyachslav@users.noreply.github.com> Date: Sun, 12 Jan 2025 09:16:30 +0500 Subject: [PATCH 21/97] The Russian translation file has been improved for the transition to version 3.13.xx (#3834) --- src/translations/sqlb_ru.ts | 1656 ++++++++++++++++++----------------- 1 file changed, 848 insertions(+), 808 deletions(-) diff --git a/src/translations/sqlb_ru.ts b/src/translations/sqlb_ru.ts index 3f82f192a..bc4fb6ba8 100644 --- a/src/translations/sqlb_ru.ts +++ b/src/translations/sqlb_ru.ts @@ -16,7 +16,7 @@ <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="https://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">https://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="https://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="https://doc.qt.io/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://doc.qt.io/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:8pt;">We use the nalgeon/sqlean library for SQLite extensions support.<br/>This library is licensed under the MIT license, see the following for more information:<br/></span><a href="https://github.com/nalgeon/sqlean"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">https://github.com/nalgeon/sqlean</span></a></p><p><span style=" font-size:small;">It also uses the Pastel SVG icon set by Michael Buckley under a Creative Commons Attribution Share Alike 4.0 license.<br/>See </span><a href="https://codefisher.org/pastel-svg/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://codefisher.org/pastel-svg/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - + <html><head/><body><p>DB Browser for SQLite это свободно распространяемая утилита для визуализации разработки, создания и редактирования баз данных SQLite с открытым исходным кодом.</p><p>Он распространяется под двойной лицензией Mozilla Public License версии 2, а также под лицензией GNU General Public License версии 3 или более поздней. Вы можете изменять или распространять его в соответствии с условиями этих лицензий.</p><p>Посетите <a href="https://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">https://www.gnu.org/licenses/gpl.html</span></a> и <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> для получения подробностей.</p><p>Больше информации об этой программе можно получить, посетив нашу страницу: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Эта программа использует GPL/LGPL Qt Toolkit от </span><a href="https://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://qt-project.org/</span></a><span style=" font-size:small;"><br/>Смотри </span><a href="https://doc.qt.io/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://doc.qt.io/qt-5/licensing.html</span></a><span style=" font-size:small;"> с требованиями лицензии и информацией.</span></p><p><span style=" font-size:8pt;">Мы используем библиотеку nalgeon/sqlean для поддержки расширений SQLite.<br/>Эта библиотека лицензирована по лицензии MIT, для получения дополнительной информации смотри:<br/></span><a href="https://github.com/nalgeon/sqlean"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">https://github.com/nalgeon/sqlean</span></a></p><p><span style=" font-size:small;">Программа также использует набор иконок Pastel SVG, созданный Michael Buckley по лицензии Creative Commons Attribution Share Alike 4.0.<br/>Смотри: </span><a href="https://codefisher.org/pastel-svg/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://codefisher.org/pastel-svg/</span></a><span style=" font-size:small;"> для подробностей.</span></p></body></html> @@ -24,7 +24,7 @@ Add New Record - Добавить Новую Запись + Добавить новую запись @@ -59,7 +59,7 @@ When you edit the values in the upper frame, the SQL query for inserting this new record is shown here. You can edit manually the query before saving. - Когда вы редактируете значения в верхнем фрейме, здесь отображается запрос SQL для вставки этой новой записи. Вы можете вручную отредактировать запрос перед сохранением. + Когда вы редактируете значения в верхнем окне, здесь отображается запрос SQL для вставки этой новой записи. Вы можете вручную отредактировать запрос перед сохранением. @@ -70,7 +70,7 @@ Auto-increment - Авто-увеличение + Автоинкремент @@ -121,202 +121,202 @@ Possible command line arguments: - + Возможные аргументы коммандной строки: The user settings file location is replaced with the argument value instead of the environment variable value. - + Расположение файла настроек пользователя заменяется значением аргумента вместо значения переменной среды. Ignored environment variable (DB4S_SETTINGS_FILE) value: - + Игнорируемое значение переменной среды (DB4S_SETTINGS_FILE): The file %1 does not exist - + Файл %1 не существует Usage - + Использование options - + опции database - + база данных project - + проект csv-file - + csv-файл Show command line options - + Показать опции коммандной строки Exit application after running scripts - + Выход из приложения после выполнения скрипта file - + файл Execute this SQL file after opening the DB - + Выполнить этот SQL файл после открытия БД Import this CSV file into the passed DB or into a new DB - + Импорт этого CSV-файла в существующую БД или в новую БД table - + таблица Browse this table, or use it as target of a data import - + Просмотр таблицы или ипользование ее как получателя импортируемых данных Open database in read-only mode - + Открыть базу данных только для чтения settings_file - + файл_настроек Run application based on this settings file - + Запуск на основе этого файла настоек group - + группа settings - + установки value - + значение Run application with this setting temporarily set to value - + Запуск приложения, с временным значением этого параметра Run application saving this value for this setting - + Запустить приложение, сохранив это значение для этого параметра Display the current version - + Показать текущую версию Open this SQLite database - + Открыть эту SQLite базу данных Open this project file (*.sqbpro) - + Открыть этот файл проекта (*.sqbpro) Import this CSV file into an in-memory database - + Импорт этот CSV файл в базу данных в памяти The %1 option requires an argument - + Для опции %1 требуется аргумент The -S/--settings option requires an argument. The option is ignored. - + Параметр -S/--settings требует аргумента. Параметр игнорируется. The -o/--option and -O/--save-option options require an argument in the form group/setting=value - + Параметры -o/--option и -O/--save-option требуют аргумент в форме группа/настройка=значение Invalid option/non-existent file: %1 - + Неверная настройка/несуществующий файл: %1 SQLite Version - Версия SQLite + Версия SQLite SQLCipher Version %1 (based on SQLite %2) - + SQLCipher версия %1 (на основе SQLite %2) DB Browser for SQLite Version %1. - + DB Browser for SQLite Версия %1. Last commit hash when built: %1 - + Последний хэш коммита при сборке: %1 Built for %1, running on %2 - + Создано для %1, работает на %2 Qt Version %1 - + Qt Версия %1 @@ -339,22 +339,22 @@ Encr&yption settings - + Настройки &шифрования SQLCipher &3 defaults - + SQLCipher &3 SQLCipher &4 defaults - + SQLCipher &4 Custo&m - + &Другой @@ -364,22 +364,22 @@ &KDF iterations - + &KDF итераций HMAC algorithm - + HMAC алгоритм KDF algorithm - + KDF алгоритм Plaintext Header Size - + Размер открытого заголовка @@ -400,14 +400,14 @@ The encryption process might take some time and you should have a backup copy of Пожалуйста укажите ключ шифрования. Если вы измените какую-либо опциональную настройку, то ее нужно будет вводить при каждом открытии этого файла базы данных. Оставьте пароль пустым если шифрование не требуется. -Процесс может занять некоторое время и настоятельно рекомендуем создать резервную копию перед продолжением! Не сохраненные изменения автоматически будут сохранены. +Процесс может занять некоторое время и настоятельно рекомендуем создать резервную копию перед продолжением! Не сохраненные изменения будут применены перед изменением шифрования. Please enter the key used to encrypt the database. If any of the other settings were altered for this database file you need to provide this information as well. Пожалуйста введите ключ для шифрования базы данных. -Если любые другие настройки были изменены для данной базы данный то нужно так же предоставить данную информацию. +Если любые другие настройки были изменены для данной базы данных то нужно так же предоставить данную информацию. @@ -465,7 +465,7 @@ If any of the other settings were altered for this database file you need to pro .NET DateTime.Ticks to date - + .NET DateTime.Ticks дата @@ -475,17 +475,17 @@ If any of the other settings were altered for this database file you need to pro Unix epoch to local time - Unix-время + Unix-локальное время WebKit / Chromium epoch to date - + WebKit / Chromium epoch дата WebKit / Chromium epoch to local time - + WebKit / Chromium epoch локальное время @@ -500,29 +500,31 @@ If any of the other settings were altered for this database file you need to pro Binary GUID to text - + Двоичный GUID в текст SpatiaLite Geometry to SVG - + SpatiaLite Geometry в SVG Custom display format must contain a function call applied to %1 - + Пользовательский формат должен содержать вызов функции, примененный к %1 Error in custom display format. Message from database engine: %1 - + Ошибка в пользовательском формате. Сообщение от ядра базы данных: + +%1 Custom display format must return only one column but it returned %1. - + Пользовательский формат должен возвращать только один столбец, но он вернул %1. @@ -560,118 +562,118 @@ If any of the other settings were altered for this database file you need to pro Conditional Format Manager - + Менеджер форматирования This dialog allows creating and editing conditional formats. Each cell style will be selected by the first accomplished condition for that cell data. Conditional formats can be moved up and down, where those at higher rows take precedence over those at lower. Syntax for conditions is the same as for filters and an empty condition applies to all values. - + Этот диалог позволяет задавать формат содержимого. Стиль каждой ячейки будет выбран в соответствии с содержимым. Условия форматирования можно перемещать вверх и вниз, те, что находятся выше, имеют приоритет над теми, что находятся ниже. Синтаксис для содержимого такой же, как и для фильтров, а пустое условие применяется ко всем значениям. Add new conditional format - + Добавить новый формат &Add - &Добавить + &Добавить Remove selected conditional format - + Удалить формат &Remove - &Удалить + &Удалить Move selected conditional format up - + Переместить вверх Move &up - + Вверх Move selected conditional format down - + Переместить вниз Move &down - + Вниз Foreground - Передний план + Передний план Text color - Цвет текста + Цвет текста Background - Фон + Фон Background color - Цвет фона + Цвет фона Font - Шрифт + Шрифт Size - Размер + Размер Bold - Жирный + Жирный Italic - Курсив + Курсив Underline - Подчёркивание + Подчёркнутый Alignment - + Выравнивание Condition - + Содержимое Click to select color - + Выбор цвета Are you sure you want to clear all the conditional formats of this field? - + Вы уверены, что хотите очистить форматирование этого поля? @@ -679,7 +681,7 @@ If any of the other settings were altered for this database file you need to pro Please specify the database name under which you want to access the attached database - + Укажите имя базы данных, под которым вы хотите получить доступ к прикрепленной базе данных @@ -705,7 +707,7 @@ If any of the other settings were altered for this database file you need to pro Executing SQL... - Выполнить код SQL... + Выполнить SQL... @@ -720,18 +722,18 @@ If any of the other settings were altered for this database file you need to pro Database didn't close correctly, probably still busy - + База данных не закрылась корректно, возможно, она все еще занята Cannot open destination file: '%1' - + Невозможно открыть целевой файл: '%1' Cannot backup to file: '%1'. Message: %2 - + Невозможно сохранить резервную копию в файл: '%1'. Сообщение: %2 @@ -755,23 +757,23 @@ If any of the other settings were altered for this database file you need to pro Error in statement #%1: %2. Aborting execution%3. Ошибка в выражении #%1: %2. -Прерываем выполнение%3. +Выполнение прервано %3. and rolling back - и отменяем + и выполняется откат didn't receive any output from %1 - + не получил никаких выходных данных от %1 could not execute command: %1 - + не удалось выполнить команду: %1 @@ -781,7 +783,7 @@ Aborting execution%3. Cannot set data on this object - Невозможно назначить данные для этого объекта + Невозможно установить данные по этому объекту @@ -792,58 +794,61 @@ Aborting execution%3. No table with name '%1' exists in schema '%2'. - + В схеме '%2' нет таблицы с именем '%1'. Cannot find column %1. - + Не найден столбец %1. Creating savepoint failed. DB says: %1 - + Не удалось создать точку сохранения. Сообщение БД: %1 Renaming the column failed. DB says: %1 - + Переименование колонки не удалось. Сообщение БД: +%1 Releasing savepoint failed. DB says: %1 - + Реализовать точку сохранения не удалось. Сообщение БД: %1 Creating new table failed. DB says: %1 - + Создание новой таблицы не удалось. Сообщение БД: %1 Copying data to new table failed. DB says: %1 - + Копирование данных в новую таблицу не удалось. Сообщение БД: %1 Deleting old table failed. DB says: %1 - + Удаление старой таблицы не удалось. Сообщение БД: %1 Error renaming table '%1' to '%2'. Message from database engine: %3 - + Ошибка переименования таблицы '%1' в '%2'. +Сообщение БД: +%3 could not get list of db objects: %1 - + не удалось получить список объектов базы данных: %1 @@ -867,7 +872,7 @@ Message from database engine: Error loading built-in extension: %1 - + Ошибка загрузки встроенного расширения: %1 @@ -999,27 +1004,27 @@ Message from database engine: RTL Text - + RTL текст Binary - Двоичные данные + Бинарный JSON - + JSON XML - + XML Evaluation - + Оценочный @@ -1030,7 +1035,7 @@ Message from database engine: This checkable button enables or disables the automatic switching of the editor mode. When a new cell is selected or new data is imported and the automatic switching is enabled, the mode adjusts to the detected data type. You can then change the editor mode manually. If you want to keep this manually switched mode while moving through the cells, switch the button off. - Эта кнопка позволяет включать или отключать автоматическое переключение режима редактора. Когда выбрана новая ячейка или импортированы новые данные, а автоматическое переключение включено, режим настраивается на обнаруженный тип данных. Вы можете вручную изменить режим редактора. Если вы хотите сохранить этот режим ручного переключения при перемещении по ячейкам, выключите кнопку. + Позволяет включать или отключать автоматическое переключение режима редактора. Когда выбрана новая ячейка или импортированы новые данные, а автоматическое переключение включено, режим настраивается на обнаруженный тип данных. Вы можете вручную изменить режим редактора. Если вы хотите сохранить этот режим ручного переключения при перемещении по ячейкам, выключите кнопку. @@ -1040,74 +1045,74 @@ Message from database engine: This Qt editor is used for right-to-left scripts, which are not supported by the default Text editor. The presence of right-to-left characters is detected and this editor mode is automatically selected. - + Этот редактор Qt используется для скриптов справа налево, которые не поддерживаются текстовым редактором по умолчанию. Присутствие символов справа налево обнаруживается, и этот режим редактора выбирается автоматически. Identification of the cell currently in the editor - + Идентификация ячейки, находящейся в данный момент в редакторе Type and size of data currently in table - + Тип и размер данных, находящихся в таблице в данный момент Open preview dialog for printing the data currently stored in the cell - + Открыть диалоговое окно предварительного просмотра для печати данных, которые в данный момент хранятся в ячейке Auto-format: pretty print on loading, compact on saving. - Автоматическое форматирование: стилистическое форматирование при загрузке, компактность - при сохранении. + Автоматическое форматирование: стилистическое форматирование при загрузке, компактность при сохранении. When enabled, the auto-format feature formats the data on loading, breaking the text in lines and indenting it for maximum readability. On data saving, the auto-format feature compacts the data removing end of lines, and unnecessary whitespace. - Когда включено, функция автоматического форматирования форматирует данные по загрузке, разбивая текст в строках и отступы для максимальной читаемости. При сохранении данных функция автоматического форматирования объединяет данные, удаляющие конец строк, и ненужные пробелы. + Когда включено, автоматически форматирует данные по мере загрузки, разбивая текст в строках и отступы для максимальной читаемости. При сохранении данных функция автоматического форматирования объединяет данные, удаляющие конец строк, и ненужные пробелы. Word Wrap - + Перенос слов Wrap lines on word boundaries - + Перенос строк по границам слов Open in default application or browser - + Открыть в приложении по умолчанию или браузере Open in application - + Открыть в приложении The value is interpreted as a file or URL and opened in the default application or web browser. - + Значение интерпретируется как файл или URL-адрес и открывается в приложении по умолчанию или веб-браузере. Save file reference... - + Сохранить ссылку на файл... Save reference to file - + Сохранить ссылку в файл Open in external application - + Открыть во внешнем приложении @@ -1117,13 +1122,13 @@ Message from database engine: &Export... - + &Экспорт... &Import... - + &Импорт... @@ -1185,7 +1190,7 @@ Message from database engine: Ctrl+Shift+C - + Ctrl+Shift+C @@ -1202,7 +1207,7 @@ Message from database engine: Try switching to Image or Binary mode. - Попробуйте переключиться в Бинарный режим или режим Изображения. + Попробуйте переключиться в Двоичный режим или режим Изображения. @@ -1220,50 +1225,50 @@ Message from database engine: Type: NULL; Size: 0 bytes - + Тип: NULL; Размер: 0 байт Type: Text / Numeric; Size: %n character(s) - - - - + + Тип: Text / Numeric; Размер: %n символ + Тип: Text / Numeric; Размер: %n символа + Тип: Text / Numeric; Размер: %n символов Type: %1 Image; Size: %2x%3 pixel(s) - + Тип: %1 изображение; Размер: %2x%3 pixel(s) Type: Valid JSON; Size: %n character(s) - - - - + + Тип: Действительный JSON; Размер: %n символ + Тип: Действительный JSON; Размер: %n символа + Тип: Действительный JSON; Размер: %n символов Type: Binary; Size: %n byte(s) - - - - + + Тип: Binary; Размер: %n байт + Тип: Binary; Размер: %n байта + Тип: Binary; Размер: %n байт Couldn't save file: %1. - Не удалось сохранить файл:%1. + Не удалось сохранить файл:%1. The data has been saved to a temporary file and has been opened with the default application. You can now edit the file and, when you are ready, apply the saved new data to the cell or cancel any changes. - + Данные были сохранены во временном файле и открыты с помощью приложения по умолчанию. Теперь вы можете редактировать файл и, когда будете готовы, применить сохраненные новые данные к ячейке или отменить любые изменения. @@ -1288,28 +1293,33 @@ Message from database engine: Errors are indicated with a red squiggle underline. In the Evaluation mode, entered SQLite expressions are evaluated and the result applied to the cell. - + Режимы текстового редактора позволяют редактировать обычный текст, а также данные JSON или XML с подсветкой синтаксиса, автоматическим форматированием и проверкой перед сохранением. + +Ошибки обозначаются красным волнистым подчеркиванием. + +В режиме оценки введенные выражения SQLite оцениваются, а результат применяется к ячейке. Unsaved data in the cell editor - + Несохраненные данные в редакторе ячеек The cell editor contains data not yet applied to the database. Do you want to apply the edited data to row=%1, column=%2? - + Редактор ячеек содержит данные, которые еще не применены к базе данных. +Хотите применить отредактированные данные к строке=%1, столбцу=%2? Editing row=%1, column=%2 - + Редактирование строки=%1, столбца=%2 No cell active. - + Ни одна ячейка не активна. @@ -1347,7 +1357,7 @@ Do you want to apply the edited data to row=%1, column=%2? Edit Index Schema - Редактирование Индекса + Редактирование индекса @@ -1357,7 +1367,7 @@ Do you want to apply the edited data to row=%1, column=%2? For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed - Для ограничения индекса только частью таблицы вы можете указать здесь выражение WHERE, которое выбирает часть таблицы, которая должна быть проиндексирована + Для ограничения индексом только части таблицы вы можете указать здесь выражение WHERE, которое выбирает часть таблицы, которая должна быть проиндексирована @@ -1372,7 +1382,8 @@ Do you want to apply the edited data to row=%1, column=%2? Table column - Колонка таблицы + Колонка +таблицы @@ -1387,7 +1398,8 @@ Do you want to apply the edited data to row=%1, column=%2? Index column - Колонка индекса + Колонка +индекса @@ -1424,32 +1436,32 @@ Do you want to apply the edited data to row=%1, column=%2? Without Rowid - Без rowid + Без Rowid Database sche&ma - + Схе&ма БД Make this a 'WITHOUT ROWID' table. Setting this flag requires specifying a PRIMARY KEY (which can be of any type, and can be composite), and forbids the AUTOINCREMENT flag. - + Делает эту таблицу «БЕЗ ROWID». Установка этого флага требует указания ПЕРВИЧНОГО КЛЮЧА (который может быть любого типа и может быть составным) и запрещает флаг АВТОИНКРЕМЕНТ. On Conflict - + При конфликте Strict - + Строго When the strict option is enabled SQLite enforces the data types of each column when updating or inserting data. - + Если включена строгая опция, SQLite применяет типы данных каждого столбца при обновлении или вставке данных. @@ -1461,34 +1473,34 @@ Do you want to apply the edited data to row=%1, column=%2? Add - + Добавить Remove - + Удалить Move to top - + Вверх Move up - + Выше Move down - + Ниже Move to bottom - + Вниз @@ -1507,12 +1519,12 @@ Do you want to apply the edited data to row=%1, column=%2? NN - НП + Не null Not null - Не пустое (null) + Не пустое (not null) @@ -1522,7 +1534,7 @@ Do you want to apply the edited data to row=%1, column=%2? <html><head/><body><p><img src=":/icons/field_key"/> Primary key</p></body></html> - + <html><head/><body><p><img src=":/icons/field_key"/> Первичный ключ</p></body></html> @@ -1537,7 +1549,7 @@ Do you want to apply the edited data to row=%1, column=%2? U - У + Уникальное @@ -1560,17 +1572,17 @@ Do you want to apply the edited data to row=%1, column=%2? Check - Проверить + Проверка Check constraint - Проверить ограничение + Ограничение проверкой Collation - + Collation @@ -1580,50 +1592,50 @@ Do you want to apply the edited data to row=%1, column=%2? <html><head/><body><p><img src=":/icons/field_fk"/> Foreign Key</p></body></html> - + <html><head/><body><p><img src=":/icons/field_fk"/> Внешний ключ</p></body></html> Index Constraints - + Индекс Add constraint - + Добавить ограничение Remove constraint - + Удалить ограничение Columns - Столбцы + Столбцы SQL - + SQL Foreign Keys - + Внешний ключ References - + Ссылки Check Constraints - + Ограничения проверкой @@ -1634,23 +1646,24 @@ Do you want to apply the edited data to row=%1, column=%2? Primary Key - + Первичный ключ Add a primary key constraint - + Добавить ограничение первичного ключа Add a unique constraint - + Добавить ограничение уникальности Error creating table. Message from database engine: %1 - Ошибка создания таблицы. Сообщение от движка базы данных: %1 + Ошибка создания таблицы. Сообщение от движка базы данных: +%1 @@ -1661,12 +1674,12 @@ Do you want to apply the edited data to row=%1, column=%2? There can only be one primary key for each table. Please modify the existing primary key instead. - + Для каждой таблицы может быть только один первичный ключ. Вместо этого измените существующий первичный ключ. This column is referenced in a foreign key in table %1 and thus its name cannot be changed. - На данную колонку ссылается внешний ключ в таблице %1, поэтому ее имя не может быть изменено. + На эту колонку ссылается внешний ключ в таблице %1, поэтому ее имя не может быть изменено. @@ -1682,12 +1695,13 @@ Do you want to apply the edited data to row=%1, column=%2? Column '%1' has duplicate data. - + Столбец '%1' содержит повторяющиеся данные. + This makes it impossible to enable the 'Unique' flag. Please remove the duplicate data, which will allow the 'Unique' flag to then be enabled. - + Это делает невозможным включение флага «Уникальный». Пожалуйста, удалите дублирующиеся данные, что позволит включить флаг «Уникальный». @@ -1709,7 +1723,8 @@ All data currently stored in this field will be lost. Please add a field which meets the following criteria before setting the on conflict action: - Primary key flag set - + Пожалуйста, добавьте поле, которое соответствует следующим критериям, прежде чем устанавливать действие при конфликте: +- Установлен флаг первичного ключа @@ -1784,7 +1799,7 @@ All data currently stored in this field will be lost. Windows: CR+LF (\r\n) - + Windows: CR+LF (\r\n) @@ -1822,7 +1837,7 @@ All data currently stored in this field will be lost. Error while writing the file '%1': %2 - + Ошибка при записи файла '%1': %2 @@ -1847,7 +1862,7 @@ All data currently stored in this field will be lost. Export finished with errors. - + Экспорт завершен с ошибками. @@ -1880,7 +1895,7 @@ All data currently stored in this field will be lost. Keep column names in INSERT INTO - Имя столбцов в выражении INSERT INTO + Сохранить названия столбцов в выражении INSERT INTO @@ -1900,12 +1915,12 @@ All data currently stored in this field will be lost. Keep original CREATE statements - + Сохранить оригинальные инструкции CREATE Keep old schema (CREATE TABLE IF NOT EXISTS) - Проверять существование таблицы (CREATE TABLE IF NOT EXISTS) + Сохранять схему (CREATE TABLE IF NOT EXISTS) @@ -1944,23 +1959,23 @@ All data currently stored in this field will be lost. Ctrl+H - + Ctrl+H Ctrl+F - + Ctrl+F Ctrl+P - + Ctrl+P Find... - + Поиск... @@ -1978,7 +1993,7 @@ All data currently stored in this field will be lost. Use as Exact Filter - Использовать как Точный Фильтр + Использовать как точный фильтр @@ -1988,7 +2003,7 @@ All data currently stored in this field will be lost. Not containing - + Не содержит @@ -2023,22 +2038,22 @@ All data currently stored in this field will be lost. Regular expression - + Регулярное выражение Edit Conditional Formats... - + Редактировать формат... Set to NULL - Сбросить в NULL + Установить в NULL Cut - + Вырезать @@ -2068,22 +2083,22 @@ All data currently stored in this field will be lost. Use in Filter Expression - Использовать в Выражении Фильтра + Использовать в выражении фильтра Alt+Del - + Alt+Del Ctrl+Shift+C - + Ctrl+Shift+C Ctrl+Alt+C - + Ctrl+Alt+C @@ -2095,12 +2110,12 @@ Do you want to insert it anyway? <p>Not all data has been loaded. <b>Do you want to load all data before selecting all the rows?</b><p><p>Answering <b>No</b> means that no more data will be loaded and the selection will not be performed.<br/>Answering <b>Yes</b> might take some time while the data is loaded but the selection will be complete.</p>Warning: Loading all the data might require a great amount of memory for big tables. - + <p>Не все данные загружены. <b>Хотите ли вы загрузить все данные перед выбором всех строк?</b><p><p>Ответ<b>Нет</b> означает, что больше данные загружены не будут и выбор не будет выполнен.<br/>Ответ <b>Да</b> Загрузка данных может занять некоторое время, но выборка будет завершена.</p>Предупреждение: загрузка всех данных может потребовать большого объема памяти для больших таблиц. Cannot set selection to NULL. Column %1 has a NOT NULL constraint. - + Невозможно установить выборку в NULL. Столбец %1 имеет ограничение NOT NULL. @@ -2144,7 +2159,7 @@ Do you want to insert it anyway? *.extension - + *.extension @@ -2168,57 +2183,68 @@ The following operators are also supported: <> Unequal: exact inverse match x~y Range: values between x and y /regexp/ Values matching the regular expression - + Эти поля ввода позволяют выполнять быстрые фильтры в текущей выбранной таблице. +По умолчанию строки, содержащие введенный текст, отфильтровываются. +Поддерживаются следующие операторы: +% Подстановочный знак +> Больше +< Меньше +>= Равно или больше +<= Равно или меньше += Равно: точное совпадение +<> Неравно: точное обратное совпадение +x~y Диапазон: значения между x и y +/regexp/ Значения, соответствующие регулярному выражению Clear All Conditional Formats - + Очистить все форматирование Use for Conditional Format - + Использовать формат Edit Conditional Formats... - + Редактировать форматы... Set Filter Expression - Установить Выражение Фильтра + Установить выражение фильтра What's This? - Что Это? + Что это? Is NULL - NULL + Is NULL Is not NULL - не NULL + Не NULL Is empty - пусто + Пусто Is not empty - не пусто + Не пусто Not containing... - + Не содержит... @@ -2258,7 +2284,7 @@ x~y Range: values between x and y Regular expression... - + Регулярное выражение... @@ -2266,7 +2292,7 @@ x~y Range: values between x and y Find and Replace - Поиск и Замена + Поиск и замена @@ -2311,12 +2337,12 @@ x~y Range: values between x and y <html><head/><body><p>When checked, the pattern to find is searched only in the current selection.</p></body></html> - + <html><head/><body><p>Если этот флажок установлен, поиск по искомому шаблону выполняется только в текущем выделенном фрагменте.</p></body></html> &Selection only - + Только в в&ыделенном @@ -2341,7 +2367,7 @@ x~y Range: values between x and y F3 - + F3 @@ -2409,7 +2435,7 @@ x~y Range: values between x and y Foreign key clauses (ON UPDATE, ON DELETE etc.) - Условия (ON UPDATE, ON DELETE и т.д.) + Действия внешнего ключа (ON UPDATE, ON DELETE и т.д.) @@ -2417,32 +2443,32 @@ x~y Range: values between x and y Image Viewer - + Просмотр графики Reset the scaling to match the original size of the image. - + Сброс масштаба до исходного размера изображения. Set the scaling to match the size of the viewport. - + Подогнать масштаб к размеру окна. Print... - Печать... + Печать... Open preview dialog for printing displayed image - Открыть диалоговое окно предварительного просмотра для печати отображаемого изображения + Открыть диалоговое окно предварительного просмотра для печати отображаемого изображения Ctrl+P - + Ctrl+P @@ -2450,7 +2476,7 @@ x~y Range: values between x and y Import CSV file - Импортировать файл в формате CSV + Импортировать CSV файл @@ -2502,13 +2528,13 @@ x~y Range: values between x and y Other (printable) - + Другой (для печати) Other (code) - + Другой (код) @@ -2588,48 +2614,48 @@ x~y Range: values between x and y Use local number conventions - + Использовать местные правила нумерации Use decimal and thousands separators according to the system locale. - + Используйте десятичные разделители и разделители тысяч в соответствии с языковыми настройками системы. When importing into an existing table with a primary key, unique constraints or a unique index there is a chance for a conflict. This option allows you to select a strategy for that case: By default the import is aborted and rolled back but you can also choose to ignore and not import conflicting rows or to replace the existing row in the table. - + При импорте в существующую таблицу с первичным ключом, уникальными ограничениями или уникальным индексом существует вероятность конфликта. Эта опция позволяет выбрать стратегию для этого случая: по умолчанию импорт прерывается и откатывается, но вы также можете выбрать игнорирование и не импортировать конфликтующие строки или замену существующей строки в таблице. Abort import - + Прервать импорт Ignore row - + Игнорировать строку Replace existing row - + Заменить существующую строку Conflict strategy - + Действия при конфликте Deselect All - Отменить Выбор + Снять выделение Match Similar - Найти Совпадения + Найти совпадения @@ -2664,12 +2690,12 @@ x~y Range: values between x and y Could not prepare INSERT statement: %1 - + Не удалось подготовить оператор INSERT: %1 Unexpected end of file. Please make sure that you have configured the correct quote characters and the file is not malformed. - + Неожиданный конец файла. Убедитесь, что вы настроили правильные символы кавычек и файл не имеет неправильного формата. @@ -2687,12 +2713,12 @@ x~y Range: values between x and y DB Browser for SQLite - Обозреватель для SQLite + DB Browser for SQLite toolBar1 - панельИнструментов1 + ПанельИнструментов1 @@ -2702,161 +2728,161 @@ x~y Range: values between x and y Temp Store - + Temp Store (Временное хранилище) Secure Delete - + Secure Delete (Безопасное удаление) Case Sensitive Like - + Case Sensitive Like (Регистрозависимый Like) Journal Mode - + Journal Mode (Режим журнала) Journal Size Limit - + Journal Size Limit (Лимит размера журнала) Recursive Triggers - + Recursive Triggers (Рекурсивные триггеры) Page Size - + Page Size (Размер страницы) Foreign Keys - + Foreign Keys (Внешние ключи) Auto Vacuum - + Auto Vacuum (Автовакуум) Max Page Count - + Max Page Count (Макс число страниц) Checkpoint Full FSYNC - + Checkpoint Full FSYNC Off - + Откл Normal - + Обычный Full - + Полный Default - По умолчанию + По умолчанию File - Файл + Файл Memory - + Память Delete - + Удаление Truncate - + Усекать Persist - + Persist WAL - + WAL Exclusive - + Эксклюзив Automatic Index - + Automatic Index (Автоиндексирование) Ignore Check Constraints - + Ignore Check Constraints (Игнорировать Check Constraints) Full FSYNC - + Full FSYNC WAL Auto Checkpoint - + WAL Auto Checkpoint User Version - + User Version (Версия пользователя) Synchronous - + Synchronous (Синхронизация) None - Нет + Нет Incremental - + Инкремент Locking Mode - + Locking Mode (Режим блокировки) @@ -2866,7 +2892,7 @@ x~y Range: values between x and y Error Log - + Журнал ошибок @@ -2885,7 +2911,7 @@ You can drag multiple object names from the Name column and drop them into the S You can drag SQL statements from the Schema column and drop them into the SQL editor or into other applications. Это структура открытой БД. -Вы можете перетащить несколько имен объектов из столбца "Имя" и отбросить их в редактор SQL, и вы можете настроить свойства сброшенных имен с помощью контекстного меню. Это поможет вам при составлении SQL-инструкций. +Вы можете перетащить несколько имен объектов из столбца "Имя" в редактор SQL, и вы можете настроить свойства перемещенных имен с помощью контекстного меню. Это поможет вам при составлении SQL-инструкций. Вы можете перетаскивать операторы SQL из столбца "Схема" и переносить их в редактор SQL или в другие приложения. @@ -2893,12 +2919,12 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Project Toolbar - Панель Инструментов Проекта + Панель инструментов проекта Extra DB toolbar - Дополнительная Панель Инструментов БД + Дополнительная панель инструментов БД @@ -2910,34 +2936,34 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed &New Database - + &Новая БД Ctrl+F4 - + Ctrl+F4 &Undo - + &Отменить Undo last change to the database - + Отменить последнее изменение в БД This action undoes the last change performed to the database in the Database Browser or in Execute SQL. Redoing is not possible. - + Это действие отменяет последнее изменение, выполненное в базе данных в Database Browser или в Execute SQL. Повтор невозможен. Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields from a table, as well as modify field names and types. - + Открывает мастер изменения таблицы, где можно переименовать существующую таблицу. Также можно добавлять или удалять поля из таблицы, а также изменять имена и типы полей. @@ -2947,7 +2973,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed New &tab - + Новая вкладка редактора SQL @@ -2967,7 +2993,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+Shift+T - + Ctrl+Shift+T @@ -2977,7 +3003,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Execute line - + Выполнить строку @@ -2992,7 +3018,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed F1 - + F1 @@ -3017,7 +3043,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed &Save Project - + Сохранить проект @@ -3027,7 +3053,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Open &Project - + Открыть проект @@ -3058,7 +3084,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed SQLCipher &FAQ - + SQLCipher &FAQ @@ -3073,7 +3099,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+Shift+O - + Ctrl+Shift+O @@ -3099,7 +3125,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Find - + Найти @@ -3109,7 +3135,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+F - + Ctrl+F @@ -3120,7 +3146,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Find or replace - + Найти или заменить @@ -3130,7 +3156,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+H - + Ctrl+H @@ -3140,7 +3166,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Export to &JSON - + Экспорт в JSON @@ -3155,127 +3181,127 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Shows or hides the Project toolbar. - Показывает или скрывает панель инструментов Проекта. + Показывает или скрывает панель инструментов проекта. Extra DB Toolbar - Дополнительная Панель Инструментов БД + Дополнительная панель инструментов БД Ctrl+Shift+W - + Ctrl+Shift+W Table from CSV data in Clipboard... - + Таблица из CSV данных в буфере обмена... This treats the current clipboard contents as a CSV file and opens the same import wizard that is used for importing CSV data from a file. - + При этом текущее содержимое буфера обмена обрабатывается как CSV-файл и открывается тот же мастер импорта, который используется для импорта CSV-данных из файла. Show &Row Counts - + Показать счетчик строк This shows the number of rows for each table and view in the database. - + Здесь отображается количество строк для каждой таблицы и представления в базе данных. Save Database &As... - + Сохранить БД как... Save the current database as a different file - + Сохранить текущую БД как другой файл Refresh - Обновить + Обновить Reload the database structure - + Перезагрузить структуру базы данных Open SQL file(s) - + Открыть SQL файл(ы) &Database Structure This has to be equal to the tab title in all the main tabs - + Структура БД &Browse Data This has to be equal to the tab title in all the main tabs - + Просмотр данных Edit P&ragmas This has to be equal to the tab title in all the main tabs - + Прагмы E&xecute SQL This has to be equal to the tab title in all the main tabs - + Редактор SQL &Recent Files - + Недавние &файлы This button opens files containing SQL statements and loads them in new editor tabs - + Эта кнопка открывает файлы, содержащие SQL инструкции и загружает их в новую вкладку редактора This button lets you open a DB Browser for SQLite project file - + Эта кнопка позволяет открыть браузер БД для файла проекта SQLite &Open Database - + &Открыть БД New In-&Memory Database - Новая БД в &Памяти + Новая БД в па&мяти Drag && Drop SELECT Query - + Перетаскивание запроса SELECT When dragging fields from the same table or a single table, drop a SELECT query into the editor - + При перетаскивании полей из той же таблицы или из одной таблицы, перетащите запрос SELECT в редактор @@ -3378,104 +3404,104 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Un/comment block of SQL code - + Рас/комментировать блок SQL кода Un/comment block - + Рас/комментировать блок Comment or uncomment current line or selected block of code - + Рас/комментировать текущую строку выбранного блока кода Comment or uncomment the selected lines or the current line, when there is no selection. All the block is toggled according to the first line. - + Комментировать или раскомментировать выделенные строки или текущую строку, если нет выделения. Весь блок переключается в соответствии с первой строкой. Ctrl+/ - + Ctrl+/ Stop SQL execution - + Остановить выполнение SQL Stop execution - + Остановить выполнение Stop the currently running SQL script - + Остановить выполняемый SQL скрипт Browse Table - + Просмотр таблицы Close Pro&ject - + Закрыть проект Close project and database files and return to the initial state - + Закрыть проект и БД файлы и вернуться в исходное состояние Ctrl+Shift+F4 - + Ctrl+Shift+F4 Detach Database - + Отсоединить БД Detach database file attached to the current database connection - + Отсоединить файл базы данных, прикрепленный к текущему подключению &Save Project As... - + Сохранить проект как... Save the project in a file selected in a dialog - + Сохраните проект в файле, выбранном в диалоговом окне Save A&ll - + Сохранить все Save DB file, project file and opened SQL files - + Сохранить файл базы данных, файл проекта и открытые файлы SQL Ctrl+Shift+S - + Ctrl+Shift+S @@ -3536,7 +3562,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Shift+F5 - + Shift+F5 @@ -3603,7 +3629,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+N - + Ctrl+N @@ -3630,7 +3656,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+O - + Ctrl+O @@ -3646,7 +3672,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+W - + Ctrl+W @@ -3673,7 +3699,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+S - + Ctrl+S @@ -3699,7 +3725,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Ctrl+Q - + Ctrl+Q @@ -3724,7 +3750,7 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Export a database to a .sql dump text file. - Экспортировать базу данных в текстовый файл .sql. + Экспортировать базу данных в текстовый дамп файл .sql. @@ -3780,17 +3806,17 @@ You can drag SQL statements from the Schema column and drop them into the SQL ed Shift+F1 - + Shift+F1 &Recently opened - &Недавно открываемые + &Недавние файлы Ctrl+T - + Ctrl+T @@ -3859,7 +3885,7 @@ You can drag SQL statements from an object row and drop them into other applicat &Modify Table... - &Изменить таблицу... + &Модифицировать таблицу... @@ -3874,7 +3900,7 @@ You can drag SQL statements from an object row and drop them into other applicat &Execute SQL - В&ыполнить код SQL + В&ыполнить SQL @@ -3886,7 +3912,7 @@ You can drag SQL statements from an object row and drop them into other applicat Ctrl+E - + Ctrl+E @@ -3902,12 +3928,12 @@ You can drag SQL statements from an object row and drop them into other applicat Save the current session to a file - Сохранить текущее состояние в файл + Сохранить текущее состояние в файл This button lets you save all the settings associated to the open DB to a DB Browser for SQLite project file - + Эта кнопка позволяет сохранить все настройки, связанные с открытой базой данных, в файле проекта браузера баз данных для SQLite @@ -3928,43 +3954,43 @@ You can drag SQL statements from an object row and drop them into other applicat Ctrl+Return - + Ctrl+Return Ctrl+L - + Ctrl+L Ctrl+P - + Ctrl+P Ctrl+D - + Ctrl+D Ctrl+I - + Ctrl+I Reset Window Layout - + Сбросить структуру окна The database is currently busy. - + База данных сейчас занята. Click here to interrupt the currently running query. - + Нажмите здесь, чтобы прервать текущий выполняемый запрос. @@ -4014,7 +4040,7 @@ Reason: %1 A new DB Browser for SQLite version is available (%1.%2.%3).<br/><br/>Please download at <a href='%4'>%4</a>. - Вышла новая версия Обозревателя для SQLite (%1.%2.%3).<br/><br/>Она доступна для скачивания по адресу <a href='%4'>%4</a>. + Вышла новая версия DB Browser for SQLite (%1.%2.%3).<br/><br/>Она доступна для скачивания по адресу <a href='%4'>%4</a>. @@ -4055,87 +4081,87 @@ If you answer no we will attempt to import the data in the SQL file to the curre Ctrl+Tab - + Ctrl+Tab Ctrl+Shift+Tab - + Ctrl+Shift+Tab Clear List - + Очистить список Window Layout - + Расположение окон Ctrl+0 - + Ctrl+0 Simplify Window Layout - + Упорядочить окна Alt+Shift+0 - + Alt+Shift+0 Dock Windows at Bottom - + Закрепить окна снизу Dock Windows at Left Side - + Закрепить окна слева Dock Windows at Top - + Закрепить окна сверху Alt+Shift+W - + Alt+Shift+W Choose a database file to save under - + Выберите файл БД для сохранения Error while saving the database to the new file. - + Ошибка при сохранении БД в новый файл. You are still executing SQL statements. Closing the database now will stop their execution, possibly leaving the database in an inconsistent state. Are you sure you want to close the database? - + Вы все еще выполняете SQL-выражения. Закрытие базы данных сейчас остановит их выполнение, возможно, оставив базу данных в несогласованном состоянии. Вы уверены, что хотите закрыть базу данных? Do you want to save the changes made to the project file '%1'? - + Хотите сохранить изменения, внесенные в файл проекта «%1»? Edit View %1 - + Редактировать представление %1 Edit Trigger %1 - + Редактировать триггер %1 @@ -4180,52 +4206,52 @@ If you answer no we will attempt to import the data in the SQL file to the curre Opened '%1' in read-only mode from recent file list - + Открыт '%1' в режиме только для чтения из списка последних файлов Opened '%1' from recent file list - + Открыт '%1' из списка последних файлов &%1 %2%3 - &%1 %2%3 + &%1 %2%3 (read only) - + (только для чтения) Open Database or Project - + Attach Database... - + Присоединить БД... Import CSV file(s)... - + Импорт CSV файла(ов)... Do you want to save the changes made to SQL tabs in a new project file? - + Хотите ли вы сохранить изменения, внесенные во вкладки SQL, в новом файле проекта? Do you want to save the changes made to the SQL file %1? - + Хотите сохранить изменения, внесенные в файл SQL %1? Could not find resource file: %1 - + Could not find resource file: %1 @@ -4235,28 +4261,29 @@ If you answer no we will attempt to import the data in the SQL file to the curre DB file '%1' could not be opened - + Файл базы данных '%1' не может быть открыт Table '%1' not found; settings ignored - + Таблица '%1' не найдена; настройки игнорируются Could not open project file for writing. Reason: %1 - + Не удалось открыть файл проекта для записи. +Причина: %1 -- Reference to file "%1" (not supported by this version) -- - + -- Ссылка на файл "%1" (не поддерживается этой версией) -- Busy (%1) - + Занят (%1) @@ -4271,12 +4298,12 @@ Reason: %1 Execution finished with errors. - + Выполнено с ошибками. Execution finished without errors. - + Выполнено без ошибок. @@ -4298,7 +4325,7 @@ Are you sure? Automatically load the last opened DB file at startup - + Автоматически загружать последнюю БД при запуске @@ -4346,7 +4373,7 @@ All data associated with the table will be lost. Message from database engine: %1 - Сообщение от СУБД: + Сообщение от DB-engine: %1 @@ -4359,7 +4386,7 @@ Are you sure you want to save the database? You are already executing SQL statements. Do you want to stop them in order to execute the current statements instead? Note that this might leave the database in an inconsistent state. - + Вы уже выполняете SQL-выражения. Хотите остановить их, чтобы вместо этого выполнить текущие выражения? Обратите внимание, что это может привести базу данных в несогласованное состояние. @@ -4379,24 +4406,24 @@ Are you sure you want to save the database? -- EXECUTING ALL IN '%1' -- - -- ВЫПОЛНЕНИЕ ВСЕ В '%1' + -- ВЫПОЛНЕНИЕ ВСЕГО В '%1' -- At line %1: - + На строке %1: Result: %1 - + Результат: %1 Result: %2 - + Результат: %2 @@ -4409,7 +4436,7 @@ Are you sure? Select the action to apply to the dropped file(s). <br/>Note: only 'Import' will process more than one file. Note for translation: Although there is no %n in the original, you can use the numerus-form to adjust 'files(s)' and remove the note when n = 1. Including %n in the translation will also work. - + @@ -4418,52 +4445,52 @@ Are you sure? The statements in the tab '%1' are still executing. Closing the tab will stop the execution. This might leave the database in an inconsistent state. Are you sure you want to close the tab? - + Операторы на вкладке '%1' все еще выполняются. Закрытие вкладки остановит выполнение. Это может привести к тому, что база данных окажется в несогласованном состоянии. Вы уверены, что хотите закрыть вкладку? This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is no longer fully supported. If you want to load it completely, please use DB Browser for SQLite version 3.12 to convert it to the new file format. - + Этот файл проекта использует старый формат файла, поскольку он был создан с помощью DB Browser for SQLite версии 3.10 или ниже. Загрузка этого формата файла больше не поддерживается полностью. Если вы хотите загрузить его полностью, используйте DB Browser for SQLite версии 3.12, чтобы преобразовать его в новый формат файла. Yes. Don't ask again - + Да. Не спрашивать снова This action will open a new SQL tab with the following statements for you to edit and run: - + Это действие откроет новую вкладку SQL со следующими операторами, которые вы можете редактировать и выполнять: Rename Tab - + Переименовать вкладку Duplicate Tab - + Дублировать вкладку Close Tab - + Закрыть вкладку Opening '%1'... - + Открывается '%1'... There was an error opening '%1'... - + Произошла ошибка при открытии '%1'... Value is not a valid URL or filename: %1 - + Значение не является допустимым URL-адресом или именем файла: %1 @@ -4483,17 +4510,17 @@ Are you sure? Modify Index - Модифицировать Индекс + Модифицировать индекс Modify Table - Модифицировать Таблицу + Модифицировать таблицу Do you want to save the changes made to SQL tabs in the project file '%1'? - + Хотите сохранить изменения, внесенные во вкладки SQL в файле проекта «%1»? @@ -4534,26 +4561,26 @@ Are you sure? Project saved to file '%1' - + Проект сохранен в файл '%1' Collation needed! Proceed? - Нужно выполнить сопоставление! Продолжить? + Нужно Collation! Продолжить? A table in this database requires a special collation function '%1' that this application can't provide without further knowledge. If you choose to proceed, be aware bad things can happen to your database. Create a backup! - Таблица в базе данных требует выполнения специальной функции сопоставления '%1'. + Таблица в базе данных требует наличия функции сопоставления (Collation)'%1'.чего это приложение не может предоставить без дополнительных знаний Если вы продолжите, то возможна порча вашей базы данных. Создайте резервную копию! creating collation - + создание Collation @@ -4601,7 +4628,7 @@ Create a backup! Alt+Del - + Alt+Del @@ -4629,17 +4656,17 @@ Create a backup! Y1 - + Y1 Y2 - + Y2 Axis Type - Ось + Тип оси @@ -4805,7 +4832,7 @@ Select the axes or axes labels to drag and zoom only in that orientation. Help - + Помощь @@ -4815,12 +4842,12 @@ Select the axes or axes labels to drag and zoom only in that orientation. Stacked bars - + Сложенные панели Fixed number format - + Фиксированный формат чисел @@ -4878,12 +4905,12 @@ Warning: not all data has been fetched from the table yet due to the partial fet There are curves in this plot and the selected line style can only be applied to graphs sorted by X. Either sort the table or query by X to remove curves or select one of the styles supported by curves: None or Line. - На этом графике есть кривые, и выбранный стиль линии может применяться только к графикам, отсортированным по X. Либо сортируйте таблицу или запрос по X, чтобы удалить кривые, либо выберите один из стилей, поддерживаемых кривыми: None или Line. + На этом графике есть кривые, и выбранный стиль линии может применяться только к графикам, отсортированным по X. Либо сортируйте таблицу или запрос по X, чтобы удалить кривые, либо выберите один из стилей, поддерживаемых кривыми: Нет или Обычная. Loading all remaining data for this table took %1ms. - + Загрузка всех оставшихся данных для этой таблицы заняла %1мс. @@ -4901,12 +4928,12 @@ Warning: not all data has been fetched from the table yet due to the partial fet Database &encoding - &Кодировка базы данных + &Кодировка текста БД Open databases with foreign keys enabled. - Открывать базы данных с включенными внешними ключами. + Открывать базы данных с поддержкой внешних ключей. @@ -4974,7 +5001,7 @@ Warning: not all data has been fetched from the table yet due to the partial fet SQ&L to execute after opening database - + SQL для выполнения после открытия базы данных @@ -5049,17 +5076,17 @@ Warning: not all data has been fetched from the table yet due to the partial fet Threshold for completion and calculation on selection - + Порог для завершения и расчета по выделенному Show images in cell - + Показывать изображения в ячейке Enable this option to show a preview of BLOBs containing image data in the cells. This can affect the performance of the data browser, however. - + Включите эту опцию, чтобы отобразить предварительный просмотр BLOB-объектов, содержащих данные изображений в ячейках. Однако это может повлиять на производительность браузера данных. @@ -5206,7 +5233,7 @@ Warning: not all data has been fetched from the table yet due to the partial fet The text appears beside the icon - Текст над иконкой + Текст рядом с иконкой @@ -5239,73 +5266,74 @@ Warning: not all data has been fetched from the table yet due to the partial fet Main Window - + Главное окно Database Structure - Структура БД + Структура БД Browse Data - Данные + Просмотр данных Execute SQL - SQL + Редактор SQL Edit Database Cell - Редактирование ячейки БД + Правка ячейки БД When this value is changed, all the other color preferences are also set to matching colors. - + При изменении этого значения все остальные цветовые настройки также устанавливаются на соответствующие цвета. Follow the desktop style - + Стиль рабочего стола Dark style - + Темный Application style - + Стиль приложения This sets the font size for all UI elements which do not have their own font size option. - + Размер шрифта для всех элементов пользовательского интерфейса, которые не имеют собственной опции размера шрифта. Font size - + Размет шрифта Max Recent Files - + Кол. недавних файлов Prompt to save SQL tabs in new project file - + Предлагать сохранение вкладок SQL +в новом файле проекта If this is turned on, then changes to the SQL editor generate a save a project confirmation dialog when closing the SQL editor tab. - + Если эта опция включена, то изменения в редакторе SQL при закрытии вкладки редактора SQL будут приводить к появлению диалогового окна подтверждения сохранения проекта. @@ -5315,7 +5343,7 @@ in new project file Database structure font size - + Рзмер шрифта во вкладке структуры БД @@ -5328,7 +5356,10 @@ in new project file Maximum number of rows in a table for enabling the value completion based on current values in the column. Maximum number of indexes in a selection for calculating sum and average. Can be set to 0 for disabling the functionalities. - + Это максимальное количество элементов, разрешенное для включения некоторых вычислительно затратных функций: +Максимальное количество строк в таблице для включения автодополнения значений на основе текущих значений в столбце. +Максимальное количество индексов в выборке для расчета суммы и среднего. +Можно установить на 0 для отключения функций. @@ -5345,7 +5376,7 @@ Can be set to 0 for disabling completion. Light style - + Светлый @@ -5355,7 +5386,7 @@ Can be set to 0 for disabling completion. Formatted - + Отформатированный @@ -5367,7 +5398,7 @@ Can be set to 0 for disabling completion. Click to set this color - + Клик для выбора цвета @@ -5383,7 +5414,7 @@ Can be set to 0 for disabling completion. Preview only (N/A) - Предв. просмотр + Только просмотр @@ -5393,32 +5424,32 @@ Can be set to 0 for disabling completion. Selection background - + Фон выделения Selection foreground - + Выделение на переднем плане Highlight - + Выделение SQL &results font size - &Размер шрифта + &Размер шрифта в окне результата SQL Use tabs for indentation - + Табуляции для отступов When set, the Tab key will insert tab and space characters for indentation. Otherwise, just spaces will be used. - + При установке, клавишей Tab будут вставляться символы табуляции и пробела для отступа. В противном случае будут использоваться только пробелы. @@ -5488,12 +5519,12 @@ Can be set to 0 for disabling completion. Close button on tabs - + Кнопка закрытия на вкладках If enabled, SQL editor tabs will have a close button. In any case, you can use the contextual menu or the keyboard shortcut to close them. - + Если включено, вкладки редактора SQL будут иметь кнопку закрытия. В любом случае, вы можете использовать контекстное меню или сочетание клавиш, чтобы закрыть их. @@ -5518,7 +5549,7 @@ Can be set to 0 for disabling completion. Select built-in extensions to load for every database: - + Выбрать встроенные расширения для загрузки для каждой базы данных: @@ -5533,12 +5564,12 @@ Can be set to 0 for disabling completion. <html><head/><body><p>SQLite provides an SQL function for loading extensions from a shared library file. Activate this if you want to use the <span style=" font-style:italic;">load_extension()</span> function from SQL code.</p><p>For security reasons, extension loading is turned off by default and must be enabled through this setting. You can always load extensions through the GUI, even though this option is disabled.</p></body></html> - + <html><head/><body><p>SQLite предоставляет функцию SQL для загрузки расширений из файла общей библиотеки. Активируйте ее, если хотите использовать функцию <span style=" font-style:italic;">load_extension()</span> из кода SQL.</p><p>В целях безопасности загрузка расширений по умолчанию отключена и должна быть включена с помощью этого параметра. Вы всегда можете загружать расширения через графический интерфейс, даже если эта опция отключена.</p></body></html> Allow loading extensions from SQL code - + Разрешить загрузку расширений из кода SQL @@ -5553,61 +5584,61 @@ Can be set to 0 for disabling completion. Proxy - + Прокси Configure - + Настроить Export Settings - + Экспорт настроек Import Settings - + Импорт настроек Subject CN - + Субъект Common Name - + Общепринятое имя Subject O - + Организация Organization - + Организация Valid from - + Действует с Valid to - + Действует по Serial number - + Серийный № @@ -5622,17 +5653,17 @@ Can be set to 0 for disabling completion. Subject Common Name - + Общепринятое имя Субъекта Issuer CN - + Издатель Issuer Common Name - + общепринятое имя издателя @@ -5659,7 +5690,7 @@ Can be set to 0 for disabling completion. Extensions(*.so *.dylib *.dll);;All files(*) - + Расширения(*.so *.dylib *.dll);;All files(*) @@ -5686,35 +5717,37 @@ All your preferences will be lost and default values will be used. Save Settings File - + Сохранить файл настроек Initialization File (*.ini) - + Файл инициализации(*.ini) The settings file has been saved in location : - + Файл настроек сохранен в: + Open Settings File - + Открыть файл настроек The settings file was loaded properly. - + Файл настроек загружен корректно. The selected settings file is not a normal settings file. Please check again. - + Выбранный файл настроек не является обычным файлом настроек. +Проверьте еще раз. @@ -5722,57 +5755,57 @@ Please check again. Proxy Configuration - + Конфигурация прокси-сервера Pro&xy Type - + Тип прокси Host Na&me - + Имя хоста Port - + Порт Authentication Re&quired - + Требуется аутентификация &User Name - + Пользователь Password - + Пароль None - Нет + Нет System settings - + Системные настройки HTTP - + SOCKS5 - + @@ -5816,102 +5849,103 @@ Please check again. Left - + Влево Right - + Вправо Center - + По центру Justify - + По ширине SQLite Database Files (*.db *.sqlite *.sqlite3 *.db3) - + SQLite Database файлы (*.db *.sqlite *.sqlite3 *.db3) DB Browser for SQLite Project Files (*.sqbpro) - + DB Browser for SQLite Project файлы (*.sqbpro) SQL Files (*.sql) - + SQL файлы (*.sql) All Files (*) - + Все файлы (*) Text Files (*.txt) - + Текстовые файлы (*.txt) Comma-Separated Values Files (*.csv) - + Файлы с разделителями запятой (*.csv) Tab-Separated Values Files (*.tsv) - + Файлы с разделением табуляцией (*.tsv) Delimiter-Separated Values Files (*.dsv) - + Файлы с разделителями значений + Delimiter-Separated Values Files (*.dsv) Concordance DAT files (*.dat) - + DAT файлы (*.dat) JSON Files (*.json *.js) - + JSON файлы (*.json *.js) XML Files (*.xml) - + XML файлы (*.xml) Binary Files (*.bin *.dat) - + Двоичные файлы (*.bin *.dat) SVG Files (*.svg) - + SVG файлы (*.svg) Hex Dump Files (*.dat *.bin) - + Файлы шестнадцатиричных дампов Extensions (*.so *.dylib *.dll) - + Расширения (*.so *.dylib *.dll) Initialization File (*.ini) - + Файл инициализации (*.ini) @@ -5994,37 +6028,37 @@ Please check again. Commit ID - + Коммит ID Message - + Комментарий Date - Дата + Дата Author - + Автор Size - Размер + Размер Authored and committed by %1 - + Автор и коммит %1 Authored by %1, committed by %2 - + Автор %1, коммит %2 @@ -6054,7 +6088,7 @@ Please check again. Identity - ID + Удостоверение @@ -6064,172 +6098,172 @@ Please check again. Upload - + Загрузить DBHub.io - + <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB Browser for SQLite. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to &quot;Generate client certificate&quot; (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB Browser for SQLite Preferences. Click the button to add a new certificate to DB Browser for SQLite and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> - + <html><head/><body><p>На этой панели БД с dbhub.io может быть добавлена в DB Browser for SQLite. Сначала вам нужно удостоверение:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Авторизоваться на dbhub.io (используйте ваши учетные данные GitHub или что-то еще, если угодно)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Нажмите кнопку &quot;Generate client certificate&quot; (это ваше удостоверение). Вы получите файл сертификата (сохраните его на локальный диск).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Перейдите на вкладку Удаленный сервер настроек DB Browser for SQLite. Добавьтесертификат в DB Browser for SQLite и выберите скачанный файл.</li></ol><p>Теперь на панели «Удалённый сервер» отображается ваше удостоверение, и вы можете добавлять удалённые базы данных.</p></body></html> Local - + Локальный Current Database - + Текущая БД Clone - + Клонировать Branch - Ветка + Ветка Commits - + Коммиты Commits for - + Коммиты для Delete Database - + Удалить БД Delete the local clone of this database - + Удалить локальный клон этой БД Open in Web Browser - + Открыть в Web браузере Open the web page for the current database in your browser - + Открыть веб-страницу текущей базы данных в вашем браузере Clone from Link - + Клонировать из ссылки Use this to download a remote database for local editing using a URL as provided on the web page of the database. - + Используйте это для загрузки удаленной базы данных для локального редактирования с использованием URL-адреса, указанного на веб-странице базы данных. Refresh - Обновить + Обновить Reload all data and update the views - + Перезагрузите все данные и обновите представления Clone Database - + Клонировать БД Open Database - + Открыть БД Open the local copy of this database - + Открыть локально копию этой БД Check out Commit - + Проверить коммит Download and open this specific commit - + Загрузить и открыть этот коммит Check out Latest Commit - + Проверить последний коммит Check out the latest commit of the current branch - + Проверить последний коммит текущей ветки Save Revision to File - + Сохранить версию в файл Saves the selected revision of the database to another file - + Сохранить выбранную версию БД в другой файл Upload Database - + Загрузить БД Upload this database as a new commit - + Загрузить эту БД как новый коммит <html><head/><body><p>You are currently using a built-in, read-only identity. For uploading your database, you need to configure and use your DBHub.io account.</p><p>No DBHub.io account yet? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Create one now</span></a> and import your certificate <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">here</span></a> to share your databases.</p><p>For online help visit <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> - + <html><head/><body><p>Вы используете встроенное удостоверение.Для загрузки БД, нужно настроить аккаунт на DBHub.io.</p><p>Нет аккаунта на DBHub.io? <a href="https://dbhub.io/"><span style=" text-decoration: underline; color:#007af4;">Создайте сейчас</span></a> и импортируйте ваш сертификат <a href="#preferences"><span style=" text-decoration: underline; color:#007af4;">сюда</span></a> для доступа к вашим базам данных.</p><p>Инструкции можно посмотреть здесь <a href="https://dbhub.io/about"><span style=" text-decoration: underline; color:#007af4;">here</span></a>.</p></body></html> &User - + Пользователь &Database - &База данных + &База данных Back - + Назад Select an identity to connect - + Выбрать удостоверение для подключения Public - Публичный + Публичный @@ -6237,43 +6271,47 @@ Please check again. Please enter the URL to clone from. You can generate this URL by clicking the 'Clone Database in DB4S' button on the web page of the database. - + Загрузка базы данных с удаленного сервера для локального редактирования. +Введите URL для клонирования. Вы можете сгенерировать этот URL, +нажав кнопку «Клонировать базу данных в DB4S» на веб-странице +базы данных. Invalid URL: The host name does not match the host name of the current identity. - + Неверный URL: имя хоста не совпадает с именем хоста текущего удостоверения. Invalid URL: No branch name specified. - + Неверный URL: не указано имя ветки. Invalid URL: No commit ID specified. - + Неверный URL: не указан идентификатор фиксации. You have modified the local clone of the database. Fetching this commit overrides these local changes. Are you sure you want to proceed? - + Вы изменили локальный клон базы данных. Извлечение этого коммита переопределит эти локальные изменения. +Вы уверены, что хотите продолжить? The database has unsaved changes. Are you sure you want to push it before saving? - + В базе данных есть несохраненные изменения. Вы уверены, что хотите отправить их перед сохранением? The database you are trying to delete is currently opened. Please close it before deleting. - + База данных, которую вы пытаетесь удалить, в данный момент открыта. Пожалуйста, закройте ее перед удалением. This deletes the local version of this database with all the changes you have not committed yet. Are you sure you want to delete this database? - + Действие удалит локальную версию этой базы данных со всеми изменениями, которые вы еще не зафиксировали. Вы уверены, что хотите удалить эту базу данных? @@ -6281,32 +6319,32 @@ Are you sure you want to proceed? Name - Имя + Имя Branch - Ветка + Ветка Last modified - Изменен + Изменен Size - Размер + Размер Commit - Коммит + Коммит File - Файл + Файл @@ -6334,22 +6372,22 @@ Are you sure you want to proceed? Size: - + Размер: Last Modified: - + Изменен: Licence: - + Лицензия: Default Branch: - + Ветка по умолчанию: @@ -6357,48 +6395,48 @@ Are you sure you want to proceed? Choose a location to save the file - + Выбрать месторасположение для сохранения файла Error opening remote file at %1. %2 - Ошибка открытия файла %1. + Ошибка открытия файла %1. %2 Error: Invalid client certificate specified. - Ошибка: Указан неверный сертификат клиента. + Ошибка: Указан неверный сертификат клиента. Please enter the passphrase for this client certificate in order to authenticate. - Пожалуйста введите ключевую фразу для этого сертификата клиента. + Пожалуйста введите ключевую фразу для этого сертификата клиента. Cancel - Отменить + Отменить Uploading remote database to %1 - Загружается удаленная БД в + Загружается удаленная БД в %1 Downloading remote database from %1 - Скачивается удаленная БД из + Скачивается удаленная БД из %1 Error: Cannot open the file for sending. - Ошибка: не удается открыть файл для отправки. + Ошибка: не удается открыть файл для отправки. @@ -6441,7 +6479,7 @@ Are you sure you want to proceed? Username - + Пользователь @@ -6464,22 +6502,22 @@ Are you sure you want to proceed? Execution aborted by user - Выполнение прервано пользователем + Выполнение прервано пользователем , %1 rows affected - , %1 строк изменено + , %1 строк затронуто query executed successfully. Took %1ms%2 - запрос успешно выполнен. Заняло %1мс%2 + запрос успешно выполнен. Заняло %1мс%2 executing query - + выполнение запроса @@ -6487,12 +6525,12 @@ Are you sure you want to proceed? A&vailable - + Доступные Sele&cted - + Выбранные @@ -6515,7 +6553,7 @@ Are you sure you want to proceed? Shift+F3 - + Shift+F3 @@ -6545,7 +6583,7 @@ Are you sure you want to proceed? Case Sensitive - Учитывать Регистр + Учитывать регистр @@ -6560,7 +6598,7 @@ Are you sure you want to proceed? F3 - + F3 @@ -6586,7 +6624,7 @@ Are you sure you want to proceed? <html><head/><body><p>Results of the last executed statements.</p><p>You may want to collapse this panel and use the <span style=" font-style:italic;">SQL Log</span> dock with <span style=" font-style:italic;">User</span> selection instead.</p></body></html> - + <html><head/><body><p>Результаты выполнения последних инструкций.</p><p>Вы можете свернуть эту панель и использовать <span style=" font-style:italic;">SQL Log</span> на <span style=" font-style:italic;">Ваш</span> выбор.</p></body></html> @@ -6601,48 +6639,48 @@ Are you sure you want to proceed? Ctrl+PgUp - + Ctrl+PgUp Ctrl+PgDown - + Ctrl+PgDown Couldn't read file "%1": %2. - + Не удалось прочитать файл "%1": %2. Couldn't save file: %1. - Не удалось сохранить файл:%1. + Не удалось сохранить файл:%1. Your changes will be lost when reloading it! - + При повторной загрузке ваши изменения будут потеряны! The file "%1" was modified by another program. Do you want to reload it?%2 - + Файл "%1" был изменен другой программой. Хотите перезагрузить его?%2 Answer "Yes to All" to reload the file on any external update without further prompting. - + Ответ «Да для всех», чтобы перезагрузить файл при любом внешнем обновлении без дополнительных запросов. Answer "No to All" to ignore any external update without further prompting. - + Ответ «Нет для всех», чтобы игнорировать любые внешние обновления без дальнейших запросов. Modifying and saving the file will restore prompting. - + При изменении и сохранении файла появится запрос на восстановление. @@ -6650,7 +6688,7 @@ Are you sure you want to proceed? Ctrl+/ - + Ctrl+/ @@ -6698,7 +6736,7 @@ Are you sure you want to proceed? (X,Y,Z) The iif(X,Y,Z) function returns the value Y if X is true, and Z otherwise. - + (X,Y,Z) iif(условие, значение_1, значение_2) возвращает значение_1 если условие верно, и значение_2 в противном случае. @@ -6724,13 +6762,15 @@ Are you sure you want to proceed? (X) The load_extension(X) function loads SQLite extensions out of the shared library file named X. Use of this function must be authorized from Preferences. - + (X) Функция load_extension(X) загружает расширения SQLite из файла общей библиотеки с именем X. +Использование этой функции должно быть разрешено в настройках. (X,Y) The load_extension(X) function loads SQLite extensions out of the shared library file named X using the entry point Y. Use of this function must be authorized from Preferences. - + (X,Y) Функция load_extension(X) загружает расширения SQLite из файла общей библиотеки с именем X, используя точку входа Y. +Использование этой функции должно быть разрешено в настройках. @@ -6981,140 +7021,140 @@ Use of this function must be authorized from Preferences. (X) Return the arccosine of X. The result is in radians. - + (X) Возвращает арккосинус X. Результат выражается в радианах. (X) Return the hyperbolic arccosine of X. - + (X) Возвращает гиперболический арккосинус X. (X) Return the arcsine of X. The result is in radians. - + (X) Возвращает арксинус числа X. Результат выражается в радианах. (X) Return the hyperbolic arcsine of X. - + (X) Возвращает гиперболический арксинус X. (X) Return the arctangent of X. The result is in radians. - + (X) Возвращает арктангенс числа X. Результат выражается в радианах. (X,Y) Return the arctangent of Y/X. The result is in radians. The result is placed into correct quadrant depending on the signs of X and Y. - + (X,Y) Возвращает арктангенс Y/X. Результат в радианах. Результат помещается в правильный квадрант в зависимости от знаков X и Y. (X) Return the hyperbolic arctangent of X. - + (X) Возвращает гиперболический арктангенс X. (X) Return the first representable integer value greater than or equal to X. For positive values of X, this routine rounds away from zero. For negative values of X, this routine rounds toward zero. - + (X) Возвращает первое представимое целое значение, большее или равное X. Для положительных значений X эта процедура округляет от нуля. Для отрицательных значений X эта процедура округляет в сторону нуля. (X) Return the cosine of X. X is in radians. - + (X) Возвращает косинус числа X. X измеряется в радианах. (X) Return the hyperbolic cosine of X. - + (X) Возвращает гиперболический косинус X. (X) Convert value X from radians into degrees. - + (X) Преобразует значение X из радиан в градусы. (X) Compute e (Euler's number, approximately 2.71828182845905) raised to the power X. - + (X) Вычисляет e (число Эйлера, приблизительно 2,71828182845905), возведенное в степень X. (X) Return the first representable integer value less than or equal to X. For positive numbers, this function rounds toward zero. For negative numbers, this function rounds away from zero. - + (X) Возвращает первое представимое целое число, меньшее или равное X. Для положительных чисел эта функция округляет в сторону нуля. Для отрицательных чисел эта функция округляет от нуля. (X) Return the natural logarithm of X. - + (X) Возвращает натуральный логарифм X. (B,X) Return the base-B logarithm of X. - + (B,X) Возвращает логарифм X по основанию B. (X) Return the base-10 logarithm for X. - + (X) Возвращает логарифм по основанию 10 для X. (X) Return the logarithm base-2 for the number X. - + (X) Возвращает логарифм по основанию 2 для числа X. (X,Y) Return the remainder after dividing X by Y. - + (X,Y) Возвращает остаток после деления X на Y. () Return an approximation for π. - + () Возвращает приближенное значение для π. (X,Y) Compute X raised to the power Y. - + (X,Y) Вычислить X, возведенное в степень Y. (X) Convert X from degrees into radians. - + (X) Преобразовать X из градусов в радианы. (X) Return the sine of X. X is in radians. - + (X) Возвращает синус числа X. X измеряется в радианах. (X) Return the hyperbolic sine of X. - + (X) Возвращает гиперболический синус X. (X) Return the square root of X. NULL is returned if X is negative. - + (X) Возвращает квадратный корень из X. Возвращается NULL, если X отрицательно. (X) Return the tangent of X. X is in radians. - + (X) Возвращает тангенс числа X. X измеряется в радианах. (X) Return the hyperbolic tangent of X. - + (X) Возвращает гиперболический тангенс X. (X) Return the representable integer in between X and 0 (inclusive) that is furthest away from zero. Or, in other words, return the integer part of X, rounding toward zero. - + (X) Возвращает представимое целое число между X и 0 (включительно), которое находится дальше всего от нуля. Или, другими словами, возвращает целую часть X, округляя ее в сторону нуля. @@ -7165,22 +7205,22 @@ Hold %3Shift and click to jump there Browse Data - Данные + Просмотр данных &Table: - &Таблица: + &Таблица: Select a table to browse data - Выберите таблицу для просмотра данных + Выберите таблицу для просмотра данных Use this list to select a table to be displayed in the database view - Используйте этот список, чтобы выбрать таблицу, которая должна быть отображена в представлении базы данных + Используйте этот список, чтобы выбрать таблицу, которая должна быть отображена в представлении базы данных @@ -7191,7 +7231,7 @@ Hold %3Shift and click to jump there - Ctrl+" for duplicating the current record. - Ctrl+' for copying the value from the cell above. - Standard selection and copy/paste operations. - Это представление таблицы БД. Вы можете выполнить следующие действия: + Это представление таблицы БД. Вы можете выполнить следующие действия: - Начните писать для редактирования, введя значение. - Дважды щелкните любую запись, чтобы отредактировать ее содержимое в окне редактора ячеек. - Alt + Del для обнуления содержимого ячейки в NULL. @@ -7202,615 +7242,615 @@ Hold %3Shift and click to jump there Text pattern to find considering the checks in this frame - Шаблон для поиска, учитывая все проверки + Шаблон для поиска, учитывая все проверки Find in table - + Поиск в таблице Find previous match [Shift+F3] - Найти предыдущее совпадение [Shift+F3] + Найти предыдущее совпадение [Shift+F3] Find previous match with wrapping - Найти предыдущее совпадение, закольцевав поиск + Найти предыдущее совпадение, закольцевав поиск Shift+F3 - + Shift+F3 Find next match [Enter, F3] - Найти следующее совпадение [Enter, F3] + Найти следующее совпадение [Enter, F3] Find next match with wrapping - Найти следующее совпадение, закольцевав поиск + Найти следующее совпадение, закольцевав поиск F3 - + F3 The found pattern must match in letter case - У найденного шаблона должен совпадать регистр + У шаблона должен совпадать регистр Case Sensitive - Учитывать Регистр + Учитывать регистр The found pattern must be a whole word - Найденный шаблон должен быть целым словом + Шаблон должен быть целым словом Whole Cell - + Ячейка целиком Interpret search pattern as a regular expression - Интерпретировать шаблон поиска как регулярное выражение + Интерпретировать шаблон поиска как регулярное выражение <html><head/><body><p>When checked, the pattern to find is interpreted as a UNIX regular expression. See <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Regular Expression in Wikibooks</a>.</p></body></html> - <html><head/><body><p>При проверке шаблон для поиска интерпретируется как регулярное выражение UNIX. <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Узнать больше о Регулярных выражениях на Wikibooks.org</a>.</p></body></html> + <html><head/><body><p>При проверке шаблон для поиска интерпретируется как регулярное выражение UNIX. <a href="https://en.wikibooks.org/wiki/Regular_Expressions">Узнать больше о Регулярных выражениях на Wikibooks.org</a>.</p></body></html> Regular Expression - Регулярное выражение + Регулярное выражение Close Find Bar - Закрыть Поисковую Панель + Закрыть панель поиска Text to replace with - + Замена текста Replace with - + Заменить на Replace next match - + Заменить следуещее совпадение Replace - + Заменить Replace all matches - + Заменить все совпадения Replace all - + Заменить все Export to &JSON - + Экспорт в JSON Export the filtered data to JSON - + Экспортировать отфильтрованные данные в JSON This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a JSON file. - + Эта кнопка экспортирует данные просматриваемой таблицы в том виде, в котором они отображаются в данный момент (после фильтров, форматов отображения и столбца порядка), в виде файла JSON. Copy column name - + Копировать имя столбца Copy the database table column name to your clipboard - + Копировать имя столбца таблицы БД в буфер обмена New Data Browser - + Новая вкладка Add a new docked Data Browser - + Открыть новую вкладку обозревателя данных This button adds a new docked Data Browser, which you can detach and arrange in different layouts. - + Эта кнопка добавляет новую вкладку просмотрщика данных. <html><head/><body><p>Scroll to the beginning</p></body></html> - <html><head/><body><p>Прокрутить к началу</p></body></html> + <html><head/><body><p>Прокрутить к началу</p></body></html> <html><head/><body><p>Clicking this button navigates to the beginning in the table view above.</p></body></html> - <html><head/><body><p>Нажатие этой кнопки переводит к началу в таблице выше.</p></body></html> + <html><head/><body><p>Нажатие этой кнопки переводит к началу в таблице выше.</p></body></html> |< - + Scroll one page upwards - Страница вверх + Страница вверх <html><head/><body><p>Clicking this button navigates one page of records upwards in the table view above.</p></body></html> - <html><head/><body><p>Нажатие этой кнопки перемещает одну страницу записей вверх в виде таблицы выше.</p></body></html> + <html><head/><body><p>Нажатие этой кнопки перемещает по записям на одну страницу вверх.</p></body></html> < - < + < 0 - 0 of 0 - 0 - 0 из 0 + 0 - 0 из 0 Scroll one page downwards - Страница вниз + На страницу вниз <html><head/><body><p>Clicking this button navigates one page of records downwards in the table view above.</p></body></html> - <html><head/><body><p>Нажатие этой кнопки перемещает одну страницу записей вниз в виде таблицы выше.</p></body></html> + <html><head/><body><p>Нажатие этой кнопки перемещает на одну страницу записей вниз.</p></body></html> > - > + > Scroll to the end - Прокрутить к концу + Прокрутить к концу <html><head/><body><p>Clicking this button navigates up to the end in the table view above.</p></body></html> - + <html><head/><body><p>Нажатие этой кнопки позволяет перейти к концу таблицы.</p></body></html> >| - + <html><head/><body><p>Click here to jump to the specified record</p></body></html> - <html><head/><body><p>Нажмите здесь, чтобы перейти к указанной записи</p></body></html> + <html><head/><body><p>Нажмите здесь, чтобы перейти к указанной записи</p></body></html> <html><head/><body><p>This button is used to navigate to the record number specified in the Go to area.</p></body></html> - <html><head/><body><p>Эта кнопка используется, чтобы переместиться к записи, номер которой указан в области Перейти к</p></body></html> + <html><head/><body><p>Эта кнопка используется, чтобы переместиться к записи, номер которой указан в области Перейти к</p></body></html> Go to: - Перейти к: + Перейти к: Enter record number to browse - Введите номер записи для просмотра + Введите номер записи для просмотра Type a record number in this area and click the Go to: button to display the record in the database view - Напечатайте номер записи в этой области и нажмите кнопку Перейти к:, чтобы отобразить запись в представлении базы данных + Напечатайте номер записи в этой области и нажмите кнопку Перейти к:, чтобы отобразить запись в представлении базы данных 1 - 1 + 1 Show rowid column - Отображать колонку rowid + Отображать колонку rowid Toggle the visibility of the rowid column - + Переключить видимость столбца rowid Unlock view editing - Разблокировать возможность редактирования + Разблокировать возможность редактирования This unlocks the current view for editing. However, you will need appropriate triggers for editing. - Разблокировать текущий вид для редактирования. Однако для редактирования вам понадобятся соответствующие триггеры. + Разблокировать текущий вид для редактирования. Однако для редактирования вам понадобятся соответствующие триггеры. Edit display format - Формат отображения + Изменить формат отображения Edit the display format of the data in this column - Редактирование формата отображения для данных из этой колонки + Редактирование формата отображения для данных из этой колонки New Record - Добавить запись + Добавить запись Insert a new record in the current table - Добавить новую запись в текущую таблицу + Вставить новую запись в текущую таблицу <html><head/><body><p>This button creates a new record in the database. Hold the mouse button to open a pop-up menu of different options:</p><ul><li><span style=" font-weight:600;">New Record</span>: insert a new record with default values in the database.</li><li><span style=" font-weight:600;">Insert Values...</span>: open a dialog for entering values before they are inserted in the database. This allows to enter values accomplishing the different constraints. This dialog is also open if the <span style=" font-weight:600;">New Record</span> option fails due to these constraints.</li></ul></body></html> - <html><head/><body><p>Эта кнопка создает новую запись в базе данных. Удерживайте кнопку мыши, чтобы открыть всплывающее меню различных параметров:</p><ul><li><span style=" font-weight:600;">Новая Запись</span>: вставляет новую запись со значениями по умолчанию.</li><li><span style=" font-weight:600;">Вставить Значения...</span>: открывает диалог для ввода значений перед тем, как они будут вставлены в БД. Это позволяет вводить значения, назначая различные ограничения. Этот диалог также открывается, если <span style=" font-weight:600;">Новая Запись</span> опция не срабатывает из-за этих ограничений.</li></ul></body></html> + <html><head/><body><p>Эта кнопка создает новую запись в базе данных. Удерживайте кнопку мыши, чтобы открыть всплывающее меню различных параметров:</p><ul><li><span style=" font-weight:600;">Новая Запись</span>: вставляет новую запись со значениями по умолчанию.</li><li><span style=" font-weight:600;">Вставить Значения...</span>: открывает диалог для ввода значений перед тем, как они будут вставлены в БД. Это позволяет вводить значения, назначая различные ограничения. Этот диалог также открывается, если <span style=" font-weight:600;">Новая Запись</span> опция не срабатывает из-за этих ограничений.</li></ul></body></html> Delete Record - Удалить запись + Удалить запись Delete the current record - Удалить текущую запись + Удалить текущую запись This button deletes the record or records currently selected in the table - Эта кнопка удаляет запись или записи, выбранные в настоящее время в таблице + Эта кнопка удаляет запись или записи, выбранные в настоящее время в таблице Insert new record using default values in browsed table - Вставляет новую запись, используя значения по умолчанию в просматриваемой таблице + Вставляет новую запись, используя значения по умолчанию в просматриваемой таблице Insert Values... - Вставить Значения... + Вставить значения... Open a dialog for inserting values in a new record - Открывает диалоговое окно для вставки значений в новую запись + Открывает диалоговое окно для вставки значений в новую запись Export to &CSV - Экспортировать в &CSV + Экспортировать в &CSV Export the filtered data to CSV - Экспортировать отфильтрованные данные в CSV + Экспортировать отфильтрованные данные в CSV This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a CSV file. - Эта кнопка экспортирует данные просматриваемой таблицы так как отображается (после обработки фильтрами, форматами отображения и т.д.) в виде файла CSV. + Эта кнопка экспортирует данные просматриваемой таблицы так как отображается (после обработки фильтрами, форматами отображения и т.д.) в виде файла CSV. Save as &view - Сохранить как &представление + Сохранить как &представление Save the current filter, sort column and display formats as a view - Сохранить текущие фильтры, столбцы сортировки и форматы отображения в виде представления + Сохранить текущие фильтры, столбцы сортировки и форматы отображения в виде представления This button saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements. - Эта кнопка сохраняет текущие настройки просматриваемой таблицы (фильтры, форматы отображения и столбец сортировки) в виде представления SQL, которое вы можете впоследствии просмотреть или использовать в операторах SQL. + Эта кнопка сохраняет текущие настройки просматриваемой таблицы (фильтры, форматы отображения и столбец сортировки) в виде представления SQL, которое вы можете впоследствии просмотреть или использовать в операторах SQL. Save Table As... - + Сохранить таблицу как... Save the table as currently displayed - Сохранить таблицу так как сейчас отображается + Сохранить таблицу так как сейчас отображается <html><head/><body><p>This pop-up menu provides the following options applying to the currently browsed and filtered table:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Export to CSV: this option exports the data of the browsed table as currently displayed (after filters, display formats and order column) to a CSV file.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Save as view: this option saves the current setting of the browsed table (filters, display formats and order column) as an SQL view that you can later browse or use in SQL statements.</li></ul></body></html> - <html><head/><body><p>Это всплывающее меню предоставляет следующие параметры, применяемые к текущей просматриваемой и отфильтрованной таблице:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Экспортировать в виде CSV: данные просматриваемой таблицы сохраняется так как отображается (после применения фильтров, форматов отображения и порядка колонок) в CSV файл.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Сохранить как вид: эта опция сохраняет настройки текущей отображаемой таблицы (фильтры, форматы отображения и порядок колонок) как SQL вид, который вы позже можете просматривать или использовать в SQL выражениях.</li></ul></body></html> + <html><head/><body><p>Это всплывающее меню предоставляет следующие параметры, применяемые к текущей просматриваемой и отфильтрованной таблице:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Экспортировать в виде CSV: данные просматриваемой таблицы сохраняется так как отображается (после применения фильтров, форматов отображения и порядка колонок) в CSV файл.</li><li style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Сохранить как вид: эта опция сохраняет настройки текущей отображаемой таблицы (фильтры, форматы отображения и порядок колонок) как SQL вид, который вы позже можете просматривать или использовать в SQL выражениях.</li></ul></body></html> Hide column(s) - Скрыть колонки + Скрыть колонку(и) Hide selected column(s) - Скрыть выбранные колонки + Скрыть выбранные колонки Show all columns - Показать все колонки + Показать все колонки Show all columns that were hidden - Показать все колонки, которые были скрыты + Показать все колонки, которые были скрыты Set encoding - Кодировка + Кодировка Change the encoding of the text in the table cells - Изменение кодировки текста в данной таблице + Изменение кодировки текста в данной таблице Set encoding for all tables - Установить кодировку для всех таблиц + Установить кодировку для всех таблиц Change the default encoding assumed for all tables in the database - Изменить кодировку по умолчанию для всех таблиц в базе данных + Изменить кодировку по умолчанию для всех таблиц в базе данных Clear Filters - + Очистить фильтры Clear all filters - Очистить все фильтры + Очистить все фильтры This button clears all the filters set in the header input fields for the currently browsed table. - Эта кнопка очищает все фильтры, установленные в полях ввода заголовка для текущей просматриваемой таблицы. + Эта кнопка очищает все фильтры, установленные в полях ввода заголовка для текущей просматриваемой таблицы. Clear Sorting - + Убрать сортировку Reset the order of rows to the default - + Сбросить порядок строк This button clears the sorting columns specified for the currently browsed table and returns to the default order. - + Эта кнопка сбрасывает сортировку столбцов в отображаемой таблице. Print - Печать + Печать Print currently browsed table data - Печатать отображаемую таблицу + Печатать отображаемую таблицу Print currently browsed table data. Print selection if more than one cell is selected. - Распечатывайте текущие данные таблицы. Выбор печати, если выбрано несколько ячеек. + Печать данных текущей таблицы. Печать выделения, если выбрано несколько ячеек. Ctrl+P - + Ctrl+P Refresh - Обновить + Обновить Refresh the data in the selected table - Обновить данные в выбранной таблице + Обновить данные в выбранной таблице This button refreshes the data in the currently selected table. - Эта кнопка обновляет данные выбранной в данный момент таблицы. + Эта кнопка обновляет данные выбранной в данный момент таблицы. F5 - + F5 Find in cells - + Найти в ячейках Open the find tool bar which allows you to search for values in the table view below. - + Открыть панель инструментов поиска, которая позволяет искать значения в представленной ниже таблице. Bold - Жирный + Жирный Ctrl+B - + Ctrl+B Italic - Курсив + Курсив Underline - Подчёркивание + Подчёркнутый Ctrl+U - + Ctrl+U Align Right - + Выровнять вправо Align Left - + Выровнять влево Center Horizontally - + Центрировать по горизонтали Justify - + По ширине Edit Conditional Formats... - + Изменить форматирование... Edit conditional formats for the current column - + Изменить форматирование для текущего столбца Clear Format - + Очистить форматирование Clear All Formats - + Очистить все форматирование Clear all cell formatting from selected cells and all conditional formats from selected columns - + Очистить фоматирование в выделенном Font Color - + Цвет шрифта Background Color - + Цвет фона Toggle Format Toolbar - + Панель форматирования Show/hide format toolbar - + Показать/скрыть панель форматирования This button shows or hides the formatting toolbar of the Data Browser - + Эта кнопка показывает/скрывает панель форматирования Select column - + Выделить столбец @@ -7820,143 +7860,143 @@ Hold %3Shift and click to jump there Replace text in cells - + Замена текста в ячейках Freeze columns - + Заморозить столбец Make all columns from the first column up to this column not move when scrolling horizontally - + Сделать так, чтобы все столбцы, от первого столбца до этого столбца, не перемещались при горизонтальной прокрутке Filter in any column - + Фильтр в столбцах Ctrl+R - + Ctrl+R %n row(s) - - - - + + %n строка + %n строки + %n строк , %n column(s) - - - - + + , %n столбец + , %n столбца + , %n столбцов . Sum: %1; Average: %2; Min: %3; Max: %4 - + . Сумма: %1; Среднее: %2; Мин: %3; Макс: %4 Conditional formats for "%1" - + Форматирование для "%1" determining row count... - определяем количество строк... + определяем количество строк... %L1 - %L2 of >= %L3 - + %L1 - %L2 of %L3 - + (clipped at %L1 rows) - + (выбрано до %L1 строк) Please enter a pseudo-primary key in order to enable editing on this view. This should be the name of a unique column in the view. - Пожалуйста, введите псевдо-первичный ключ, чтобы разрешить редактирование в этом представлении. Это должно быть имя уникального столбца в представлении. + Пожалуйста, введите псевдо-первичный ключ, чтобы разрешить редактирование в этом представлении. Это должно быть имя уникального столбца в представлении. Delete Records - Удалить Записи + Удалить записи Duplicate records - Дублированные записи + Дублированные записи Duplicate record - Дубликат записи + Дубликат записи Ctrl+" - + Ctrl+" Adjust rows to contents - + Подогнать по содержимому Error deleting record: %1 - Ошибка удаления записи: %1 + Ошибка удаления записи: %1 Please select a record first - Сначала выберите запись + Сначала выберите запись Please choose a new encoding for all tables. - Пожалуйста выберите новую кодировку для всех таблиц. + Пожалуйста выберите новую кодировку для всех таблиц. Please choose a new encoding for this table. - Пожалуйста выберите новую кодировку для данной таблицы. + Пожалуйста выберите новую кодировку для данной таблицы. %1 Leave the field empty for using the database encoding. - %1 + %1 Оставьте это поле пустым если хотите чтобы использовалась кодировка по умолчанию. This encoding is either not valid or not supported. - Неверная кодировка либо она не поддерживается. + Неверная кодировка либо она не поддерживается. %1 replacement(s) made. - + %1 замен(а) произведено(а). @@ -7964,22 +8004,22 @@ Leave the field empty for using the database encoding. New Data Browser - + Новая вкладка обозревателя Rename Data Browser - + Переименовать обозреватель данных Close Data Browser - + Закрыть обозреватель данных Set a new name for the data browser. Use the '&&' character to allow using the following character as a keyboard shortcut. - + Задайте новое имя для вкладки SQL. Используйте символ '&&', чтобы разрешить использование следующего символа в качестве сочетания клавиш. From 19f6238303bc6a590c876f3ad78eb004a318f1d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 22:40:42 +0000 Subject: [PATCH 22/97] build(deps): bump awalsh128/cache-apt-pkgs-action from 1.4.2 to 1.4.3 Bumps [awalsh128/cache-apt-pkgs-action](https://github.com/awalsh128/cache-apt-pkgs-action) from 1.4.2 to 1.4.3. - [Release notes](https://github.com/awalsh128/cache-apt-pkgs-action/releases) - [Commits](https://github.com/awalsh128/cache-apt-pkgs-action/compare/v1.4.2...v1.4.3) --- updated-dependencies: - dependency-name: awalsh128/cache-apt-pkgs-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/cppcmake-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index ea8720c20..57bc78024 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Install and cache dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.4.2 + uses: awalsh128/cache-apt-pkgs-action@v1.4.3 with: packages: libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev From 6de9190da27a02eadc8e9e9426d2fa4c678e9728 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Wed, 15 Jan 2025 14:37:01 +0200 Subject: [PATCH 23/97] parseClipboard: make QRegularExpression behave as QRegExp, issue #3763 In QRegExp partial matching was implicit, for QRegularExpression a partial match must be explicitly requested. --- src/ExtendedTableWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ExtendedTableWidget.cpp b/src/ExtendedTableWidget.cpp index 7bf611f9e..12dd30461 100644 --- a/src/ExtendedTableWidget.cpp +++ b/src/ExtendedTableWidget.cpp @@ -75,7 +75,7 @@ std::vector parseClipboard(QString clipboard) }; while (offset >= 0) { - const QRegularExpressionMatch match = re.match(clipboard, offset); + const QRegularExpressionMatch match = re.match(clipboard, offset, QRegularExpression::PartialPreferFirstMatch); const int pos = match.capturedStart(0); if (pos < 0) { // insert everything that left From 4c432a07b592446fd19bb5d52c60d5b870a768d1 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Fri, 17 Jan 2025 14:26:33 +0900 Subject: [PATCH 24/97] Build AppImage for ARM64 --- .github/workflows/cppcmake-ubuntu.yml | 18 +++++++++++++----- .../other/get_nightlies_from_github_actions.sh | 13 ++++++++----- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 57bc78024..54927cd96 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: bundle: [SQLCipher, SQLite] - os: [ubuntu-20.04] + os: [ubuntu-20.04, ubuntu-22.04-arm] steps: - name: Checkout uses: actions/checkout@v4 @@ -30,6 +30,14 @@ jobs: with: packages: libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev + # This is required by the operating system version, not the architecture. + # Related: https://github.com/AppImage/AppImageKit/wiki/FUSE + - if: matrix.os == 'ubuntu-22.04-arm' + name: Install and cache 'libfuse2' + uses: awalsh128/cache-apt-pkgs-action@v1.4.3 + with: + packages: libfuse2 + - if: matrix.bundle == 'SQLCipher' name: Build SQLCipher run: | @@ -73,15 +81,15 @@ jobs: - name: Build AppImage run: | - wget -c -nv "https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20240109-1/linuxdeploy-x86_64.AppImage" - wget -c -nv "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/1-alpha-20240109-1/linuxdeploy-plugin-qt-x86_64.AppImage" - chmod a+x linuxdeploy-x86_64.AppImage linuxdeploy-plugin-qt-x86_64.AppImage + wget -c -nv "https://github.com/linuxdeploy/linuxdeploy/releases/download/1-alpha-20240109-1/linuxdeploy-$(uname -m).AppImage" + wget -c -nv "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/1-alpha-20240109-1/linuxdeploy-plugin-qt-$(uname -m).AppImage" + chmod a+x "linuxdeploy-$(uname -m).AppImage" "linuxdeploy-plugin-qt-$(uname -m).AppImage" if [ "${{ inputs.NIGHTLY }}" = "true" ]; then export VERSION=$(date +%Y%m%d) else export VERSION=$(printf "dev-`git -C . rev-parse --short HEAD`") fi - LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" ./linuxdeploy-x86_64.AppImage --appdir=appdir --desktop-file=appdir/usr/share/applications/sqlitebrowser.desktop --plugin qt --output appimage + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" "./linuxdeploy-$(uname -m).AppImage" --appdir=appdir --desktop-file=appdir/usr/share/applications/sqlitebrowser.desktop --plugin qt --output appimage - name: Rename a file run: | diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh index f9b54243d..785ce27c2 100644 --- a/installer/other/get_nightlies_from_github_actions.sh +++ b/installer/other/get_nightlies_from_github_actions.sh @@ -13,7 +13,7 @@ DOWNLOAD_DIR="/tmp/incoming/" rm -rfv $DOWNLOAD_DIR mkdir -v $DOWNLOAD_DIR -if [ $(ls -l /nightlies/appimage /nightlies/win32 /nightlies/win64 /nightlies/macos-universal | grep -c "$(date +%Y%m%d)") ]; then +if [ $(ls -l /nightlies/appimage /nightlies/appimage-arm64 /nightlies/win32 /nightlies/win64 /nightlies/macos-universal | grep -c "$(date +%Y%m%d)") ]; then echo "Nightly build already exists" exit 1 fi @@ -38,12 +38,13 @@ echo "Successfully downloaded the nightly build" # Check if the downloaded files are as expected # This case is occuring when the nightly build is skipped -if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 8 ]; then +if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 10 ]; then echo "Last nightly build is skipped" exit 1 fi -mv -v $DOWNLOAD_DIR*AppImage /nightlies/appimage/ +mv -v $DOWNLOAD_DIR*x86.64*AppImage /nightlies/appimage/ +mv -v $DOWNLOAD_DIR*aarch64*AppImage /nightlies/appimage-arm64/ mv -v $DOWNLOAD_DIR*x86* /nightlies/win32/ mv -v $DOWNLOAD_DIR*x64* /nightlies/win64/ mv -v $DOWNLOAD_DIR*dmg /nightlies/macos-universal/ @@ -54,8 +55,10 @@ rm -v /nightlies/latest/*.msi rm -v /nightlies/latest/*.zip DATE=$(date +%Y%m%d) -ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher.AppImage -ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-x86.64.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite-x86.64.AppImage +ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLCipher-$(echo $DATE)-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-aarch64.AppImage +ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLite-$(echo $DATE)-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLite-aarch64.AppImage ln -sv /nightlies/macos-universal/DB.Browser.for.SQLCipher-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLCipher-universal.dmg ln -sv /nightlies/macos-universal/DB.Browser.for.SQLite-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLite-universal.dmg ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-x86.msi /nightlies/latest/DB.Browser.for.SQLite-x86.msi From 3b48273154314927a36db2cc46452ec99c43a656 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 15 Feb 2025 07:41:20 +0900 Subject: [PATCH 25/97] Bump Ubuntu runner image from 20.04 to 22.04 Related: https://github.blog/changelog/2025-01-15-github-actions-ubuntu-20-runner-image-brownout-dates-and-other-breaking-changes/#ubuntu-20-image-is-closing-down --- .github/workflows/cppcmake-ubuntu.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 54927cd96..234a19f56 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: bundle: [SQLCipher, SQLite] - os: [ubuntu-20.04, ubuntu-22.04-arm] + os: [ubuntu-22.04, ubuntu-22.04-arm] steps: - name: Checkout uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: - name: Install and cache dependencies uses: awalsh128/cache-apt-pkgs-action@v1.4.3 with: - packages: libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev + packages: libfuse2 libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev # This is required by the operating system version, not the architecture. # Related: https://github.com/AppImage/AppImageKit/wiki/FUSE From 3c07690ba2654bacf277b1e3284fe15bc72b7c50 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 15 Feb 2025 07:42:25 +0900 Subject: [PATCH 26/97] Fix the build failure in SQLite 3.49.0 --- .github/workflows/cppcmake-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 234a19f56..57e902e58 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -58,7 +58,7 @@ jobs: fi tar -xzf sqlite.tar.gz && cd sqlite-autoconf-* - CPPFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_MATH_FUNCTIONS=1 -DSQLITE_MAX_ATTACHED=125 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_SNAPSHOT=1" ./configure --enable-shared=no + CPPFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_MAX_VARIABLE_NUMBER=250000 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_MATH_FUNCTIONS=1 -DSQLITE_MAX_ATTACHED=125 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_SNAPSHOT=1" ./configure --disable-shared make -j2 && sudo make install -j2 - name: Configure build From 7d8505981285ba74135288fc05bca28e45b5cd5d Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 15 Feb 2025 17:54:03 +0900 Subject: [PATCH 27/97] Fix a bug in the logic that checks if the script has already run today Fix: #3868 --- .../other/get_nightlies_from_github_actions.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh index 785ce27c2..627540dad 100644 --- a/installer/other/get_nightlies_from_github_actions.sh +++ b/installer/other/get_nightlies_from_github_actions.sh @@ -8,12 +8,15 @@ source /root/.gh_token_secure set -ex echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S %Z"): [START]" +DATE=$(date +%Y%m%d) echo "Clear the incoming directory" DOWNLOAD_DIR="/tmp/incoming/" rm -rfv $DOWNLOAD_DIR mkdir -v $DOWNLOAD_DIR -if [ $(ls -l /nightlies/appimage /nightlies/appimage-arm64 /nightlies/win32 /nightlies/win64 /nightlies/macos-universal | grep -c "$(date +%Y%m%d)") ]; then +if [ $(ls -l /nightlies/appimage /nightlies/appimage-arm64 | grep -c "$DATE") ] && + [ $(ls -l /nightlies/macos-universal | grep -c "$DATE") ] && + [ $(ls -l /nightlies/win32 /nightlies/win64 | grep -c "$DATE") -ne 0 ]; then echo "Nightly build already exists" exit 1 fi @@ -38,7 +41,7 @@ echo "Successfully downloaded the nightly build" # Check if the downloaded files are as expected # This case is occuring when the nightly build is skipped -if [ $(ls -l $DOWNLOAD_DIR | grep -c "$(date +%Y%m%d)") -ne 10 ]; then +if [ $(ls -l $DOWNLOAD_DIR | grep -c "$DATE") -ne 10 ]; then echo "Last nightly build is skipped" exit 1 fi @@ -54,11 +57,10 @@ rm -v /nightlies/latest/*.dmg rm -v /nightlies/latest/*.msi rm -v /nightlies/latest/*.zip -DATE=$(date +%Y%m%d) -ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-x86.64.AppImage -ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$(echo $DATE)-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite-x86.64.AppImage -ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLCipher-$(echo $DATE)-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-aarch64.AppImage -ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLite-$(echo $DATE)-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLite-aarch64.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$DATE-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-x86.64.AppImage +ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$DATE-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite-x86.64.AppImage +ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLCipher-$DATE-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-aarch64.AppImage +ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLite-$DATE-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLite-aarch64.AppImage ln -sv /nightlies/macos-universal/DB.Browser.for.SQLCipher-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLCipher-universal.dmg ln -sv /nightlies/macos-universal/DB.Browser.for.SQLite-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLite-universal.dmg ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-x86.msi /nightlies/latest/DB.Browser.for.SQLite-x86.msi From 492a94a2dc3e4c74aba0e16df8fc0241eb90b1a8 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 16 Feb 2025 16:30:15 +0900 Subject: [PATCH 28/97] Change the app icon on macOS to a squircle shape Close: #3867 --- installer/macos/macapp-nightly.icns | Bin 264910 -> 102898 bytes installer/macos/macapp.icns | Bin 219768 -> 84514 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/installer/macos/macapp-nightly.icns b/installer/macos/macapp-nightly.icns index 23f2d1b3678e02a4d450222d31d81c5cda03e1be..60aa2030e29e65d57aaaa14e22db2416eeecc018 100644 GIT binary patch literal 102898 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 M)Mtg11x@e&+4Qa^H2?qr literal 264910 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%0AA1G~rC}3# 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 z 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

QT$5O3#dLuWVKgikl#;pSc6dC>I~v` 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 *N6^~HoJUOmDzlp4PyHTAZO3<3`FNc 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%0Dgm=h3tea*nGL;!&D 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 AtN;K2 diff --git a/installer/macos/macapp.icns b/installer/macos/macapp.icns index 33cfe25c5517354e6ebbb1e1fcc54ccdb3818cf8..3300679d3a8f05d9cbda6629f952d2d38f7e04a9 100644 GIT binary patch literal 84514 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

IHc&tjeR~^UhyUogt!`p_S|Fa3cee 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 literal 219768 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

VLTtlkF#mO)M=-(sgp8c2K?G`Fe*fnJ< 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ʊSI;xyX;|@)KsvlOSn#Wd(dE2n7aj9jENvKWW>b^@x zPh$KeLE+45Sy#ngJ-3l$w5^x44g84^Ks_wqYbC?A|D45-Y3~)uuC>U4o7a~SrQQsg zkxO2Y?6g}V9{ls`OY3@d4o!wMF*6<^&h%ko&K*; zQ6f4%fBKmQ3|`Ud@E)hXOkuJu%pPM_Viqm0*1KJNueeI-0*>(H9&J@~Z_`p;wQIBAoD^E|0S1{D?_T&vR6g3Vlhr@` zuQa-Hg3Xb___?s{o6hFmRxPox8+IfI&@Xn_hvkf#ZFX8{Cv4C4gNSrlZXD~$cNIL4 z5E1Gz5&moO^ChiyR`h3L?`X!JcV}YPV#4<3V~WgaW0var$t~vcMl(cvk4L`o8L@EO z@@4T{Zl*i7c+1TBke4sS;{g#5saTtLn?Tp>Gd&O@c4nG*dv}FVTg!7%ZmL*jpfa9m zWJW}v>?0SO=tmviv9+;JF8zj;i9N~aIX9CYQC8fqt1F5XBpx>xbenrlQhTAbx*iqf zWrhJz=b|OIdTj%`AU_bNoL1y;R&-|4;>{0f{Mf?yvl8q!!(FPaBoz zuPx+IQq9y(`9!>#ukv5RP!LUq)T}=$8Ov^52&1I9ToZq}#B%^a0v%NlTU4OWP@bID zQnZRza2Y3JknHIStSUJ8GfUQmPJ_2g4e`rBw#e0=I)*PMO0(>%rj(eAoMm-ikRJax zSlON!5spuY?sbU=KHiet*u;#jzy@Ibt+ zpO(9fx8bb?i&_M6 zah6zS(cj1|lChQOUKd90e)w71L;s^dyponE_ha^_evkUF;ZgoTPSt$%i0U*nK;XvX zENo+>&=BV)q1!K8YUM4deOAcsr_y&pwR+EcMlCm-THY5{zjK}rBO+6PExJFBIdtT+ zlo-0TH#(BDJDkI9IV{YccH`a}BLLnrcDGW8trM&=DJ3`EX~k%UUMa*EGMr|tUln=W zWa2&R|Mpo$lzLoAfxm{u`&re|$At0vf4i-9Xb|b3#iM{8!AsBsa;bPR(*@k9$6?_8 zK&PS*)6oVV{A7`g+>MfeW)0x%l|?8q2@9wTJj)DJ&lJg3olO5}NIdi&fkeDa(esR}{M5%1^!TC~jeKOwBO`|U!1HYXQA>#||=EQX7V z8~N4WvrkTB*tSrnx#?rY@>t;k@5N|*7Hb!)#8lt#|E}Dyp_>&Bec^VGGHyJjuKxr; zpZ_+oE_^vYU$;)}IpaLdJ>lI467+l-*RhB~ZzR@R%HZoW<V+LwtYW5{PC-JN&-jup2GJI;!=6wiH805{G@aJuv* zEsTL6zxeYnVDpPofvo&M__>OkmsgxqcE~4FODQ^>OpFZiV_)~1>Mx^TIz9!k*ngZW zRVg7gto^!bVgt@N+VrUOlH2b-UR|Jgs`ahl@qV#(AkBbl?Qj^))qs2YA9T#Lo2w@a89A z3JY`C18t#BL{uUe!4pZ;8p%t2@9+K24=A+P@Eww0)@=4zG3XlVZ`nj&AsN)~ddH;1 z`LKfcVpq%1zb3F!uw161)f5Z3tRRDj8xohubbU1>MnPzrK!F~gQ+yLC@9H;3HTfM@ zITosO21b{bJh=w*zh*2aT&Yuq=0E>c+y{0hKSoP;c&}-$tt^)Yb$Tuu7VwHu0E}7S zi{v<6HS%O!vK(0MyQX}JNLEuwZN#|hnTIWxzR&ndRoSD{`LRP}U+zLj;J~c1@IpJL z>F>W%DPXVWDOS~vcm9AhR?o8LlPS`0i)B-h=U}N4dtFqneHM7JMEr+cpkTy{_fh%j zB6P_Wqt8)l=i$$d_q=ac$+uq^dQAOJ0wbXy^g9IgtVE7*K4|4~UwNdt%Ho%gg_ZnH zP%Sv9xn)_}K~wH?lCWMs>hNYzich?Mg-SIVkXqHk)ZazqY_~jMQIlRiefU6mlt`^7 zQR|hy(ob4&GIk3^mR6Ngc+N(6o<+uywlB>2kG<5ou68AM7t!A-;XexYt*w{)`ADMQk?KTE;mvJt|tL7$Jt9-$!aa!9gOYo5R}xyuHzaA z0_8W%{27_%eLv$+nyck(G3sXmODnPHon2Welp%Q&{`pvUQUO2R)7~v*UiUs1HqA_Q zt0vK-vgh})uN9n{{RuZwGL!v=hNsORX+DLxDDr0@rUNT#-4)QBqp)z5W{_i`OA;XN3MYhuMZ>Nlbzi z!eDt(GxXbbPqaxq@6((E!8e7J=R`aZF=-x zxCdXlXE=rMz1duhgMal=BirRm`JwXj0L+PcJJ>bw{yFwuQxK>Ua7?|BLSdyu#Pg6U;CyeX7GW@E_BEcV4 zU8?C_wrv{ta_Vo&AGR*-kgxjdrkv$oG}Se@VTXrzgw9`)2fAJo3wZ_DubROq-hw9~ z@-+7ei{L>ky(wzHL7ba2xEdEB@M(>>bEa*E33vPs?fVlV$e<~3$9s;t&P$`9sHbv_ zS7bj|Vz@zdrMWit`lWTTp+_;5X>6^4Nz6c7CoWuKV=%j`ek?CeGIsvRdYRM@OD!=o z>>fDOI((MJc52}q+U4_B9OG9VAD7A_XhZH?k?lzm_JkA1VwzLCYfF&089qlINMs%4 zRsPj|MoepyFz(K_TjRe~_Dt`(Qg4Nf&u-r#qcvzvU$oVfrIli>O;@9PeeagkvCWqt zCUb58yi4)&VD$Pat$|u82NZoq7+;s~ixHrD>>~tgd34Sy^k#ydHuOLpPNzMaq7!!Y zv|Cp{qNr7SC$zBHV5+P3UkkoBor$?QPZT@6=wA9zy*wFa7;9Qh&?s9hHDS_ag`aVu zI^~HDuX2I+%a0k<#1Yk9pG>o$4SdQ%M^Z6a++ffMMue2I+<6VRFn;Q;f)I3tasCaf z=-sQ_d7XgAUN?7xMZ$B$kI#!UCW5hkXPeZMX5II-&Yq}^{$u}nF6Qd))NW_fM!6?r ztE_O(^q$m=lG7xIV^-W@oA7>mZWZ>V17MIIFR1Uml2p9`dRs}wf)VU>A}K*Z=u1W? z5WuOT(;9HSaOTQ_iK+R`aqfmqs7+@7uzX@ZruGNppcj6|V)49CA?hIwO&3xiT&nfh zg?aQxk-yk7mh>*_si~oTBd^g5@CD+kq3{GK?WfuRzmPT8Rvt$%a0HzG4FmssQzeOa_aD58dlNtOG~O&+m@joX!)%c+_3cue z8Se>|rI-W@@!HcE!RUCWZmVxh^glKDH6G|u8hvjW!FR(@!N6C+cwZ0@dy|$|ciMcp z^R=<*v_+)QVC-vii?8E#>xI@IpZxfLJP|Me20`y*{;%%K zUyS6ExBwT%y3}u`)9BV;VL@8h>J-BJzv4Y=zxa%(H7U#9eA%`bvlQ&>RW2~VxCb|* zpFh@yw@b84guW1amwhHh6ERJGCHiD4oKR#vhZ@|{&F=r;3Lwfu)AmqNAOWfm{vms3F%x;GG+SM6QZ>7;Wy$ZLzs>Fh|{>iG4Pv* zZy5xmj%()wxn~-;+h%EZHbdGRE{{MO$evT$PV#?tf$N066Eh4@v?tSo@t&jv-qohF z%uC9UK+Qczc)*)W9$$TnHG$qxpqF5}0uj>uz*vb6>ok1R_cYAjf2`Qx7`2jOcr&sR z+}W(p4B}prHypU08iwH9%$J8X3FFPMVAkwmxBb{5KFCc^5B^nw*+LglPx+Y0NV22W zXczx}Ub#7!be(8iXk*B2=>TZ6^c~dm*2|(`Mvok)O$0CS9lbh&*tJT<7SM)rKYc?l z-x`;T(;r=YH!{4-QROAs2!W-~5>4V0!3Q?}Y_2o`EbaamM0&5JzvC0~d>WeIwaj1d_nEK;}4BDPfO z!0Sb{yg09r^v1KAG(*FGC=+|t2hCITJqE8&=K^g$RAf;4^!3ru$7Z{GqlHmZGDwxT zr!ZWeGwE{4Ffu=IJ++qB@c{&Ip`A_pU=uD(0hiNrEo^;%4XG^-*TRBUGX{Mv&baW$ zi!N7uNM@#u8Br1;o8=4Q*V1%rl3qtc3XWHuf-MkZP_z6AEF!sf>HZ*ZcS2 zm(9>@o$KD8U&K%P`}1{X>+!e8l5W* zznIu|PyG{n`;@s(fRi3^b7b)*M~-eO)_$-ys^cv#+qC+J%;->|iM#X5Ofi0BS8t3F zXCF65-rUNNY0-L=#byOu)W2oAvCQ(eume5mG25N$nPaMPMjr3KS?W>qNgpRd0)ALe z5PLTc<&sD89pgN-%6FK7kotS)6n8-q_V4Q_<&v~pa|Fq1J9aj7$TeC+c1$HCE&AKJ_-U#0AlY83Ynjmfyaj zgT-=E<0uUq6C=-Chb}{1ch8R;IQBYvBO3#58pjL>KgiK~FURM15K8)GM?Tlm-rDs| z{zHQksmI$+tAV(&@wUtMT72t&1DdQwFTp$1D5{ABKEZRs&ehB3@JxFJp${*|vv1F{ zB{kBfh+IK%66*Dz(lv@pH2P(k+v+-V?@7x;JdeJEiC@Nom4d?aJR*w`jGe($#w{j4 z-t8Z&D^NdfzZ+(on?-$5&xxo6u)VJKySm;;JzACucwLPUFohW@`PuIs&j&DB8MSyH zk7*q`MhUn^fbT>#Q|)B86K@PAzR(5*N;{?QbA6Jo2>|fUEmEO6S_u zv)0LsbaxgG8;1HbMNjL`uod#lKZdE{m*Fp87Pnp7pw=kc&JH_-y~&gTOt1WQ!?+#r z*eLL}seEJeYOtx5c&j+XKOp@Sn9e9xw2RTJu^H3;u*9&w!s~0vm=R4xMgg^g(_u`4 zspDqZk+d$z0%OI#j@)cR-0Nl$JJzei*0ab~FC)bZ@svOO5VCH2T*}iJ9IjvKAxK{Z zC!(t^ypPtu(}Rk#eqW%mnI51a)Fn*9#%Iw!3Jvo=0ZqZth788&CD?vgr`(36w4{;v z9O3REY5V&X()PEZTTI#%%rB5#^TA@nCtgbJtIa8I{>~8@AVx1*5nHZvUdNLK87~jN zP_$D^XE*G7ZVGR@>Bt*pA&hPzvQn?UBmJ>(t!l%5{vv(S+JZ;7R|vTb~GrH z54y1#DI?k!^q08E?&pQ%6Sd#k8gn$Uab){-W>cKFYLPxUJHpUE)&;#6+pD05{%T&6 zbHp<#S_8sOiSQ$I)@8O_x9e97o3II!Z{2VXOsMe|nWKas=tR}^-3YYXVB9i|{dH}5 z(bzG0wldgyOVvMk_GA!Gtbxqa?yQ*`VzogNnko_a_VVVr7@t4EYN}{RIpM8}gb0`t zrO@~Han-4OQ+;ES!yc3o#T(oWOhLD(xahaAzx`!zGax7MyNHtHu{&*h46^4OC%ZlE zSa``DvBf3rJ6wWUyD?}8O)WeS_i{Yf^Nu{7C^QZV=AUowR5XKU3!R0` z7GeE|nLt;N$)hV$v zi!@-gNp69^#kIq;G?0sXR7r+NVT_}o%Fb?B6g0x?g3_jBp7&j#QyR2YVM2`nL%Dfx z@{suH3?DP5s|&}0yYbeAcDa_{Dqr^R`V3DlwK7hK1uEY0SmwZx;H1*%T%oy*0@h-2 zTGw~NxrgQ3IK$02C%B>7XqQYi8(lo3qmiY3~_Jj)h+SvXc8lF zJQ?iPFZCAaFL$44jGxASj{9`@fGWPx`*3yWElZY=hp_m-KT-E{Qpg)gU-%9fvgM%% zYmH373&10S8!}$MZDsfz(4_)AD_<0vrM+HPa3mzWlEhP-eeu5Jn~}v~-(R9LmJFwM z?dDy4-{wCAT6VDeG>~Mxo#xa3!`OKTQu+S>|31gT5prxo4hl)gUUBSX7BVuEl}(DQ zV|&}BY@sr;_sS-enGqS;*`novH#?zEt2`hk4f-8>WugdU=H9skil=5H|*HlNL)1Vh!lyMG_-8p}?t?#n%Qo1g*vZy+=Vi@Siv1DV&3 zecm`~5h&jG`f=)}Mo`+OG?LM*Lw=Eo|>8py#;XUTO@x>meNpLuQq<}pWz>=6Aw3tGc59s#Jiu$8` zX?v;MU7+>l0wNV9s3q!Dpw+U*m;N#~9KKS2QX{##m%qTa>0JM2YFuJE3}h3Rkg(I8 z&2JAJnQ%rla{-~^xs~}zgtBdpA!qmY>x%`OID%BHK>GqH?ED&~LYz4UN*up1^-SC< z%j&!P5$vKrmn?Wa6Ri$a_G)Wd!E1pB9`3g@I5OhMi*vqG+U{fzW z6|p7u+%#{XK%*0-VCmQUM>6}TWsoIr@{y<;+0H2-;0aymAgJ=zFlxYE>P#I_rhSkK zo;5xi@$uOojpq6U2HAr6kRpP@mCW7CTt<3uRPT~Bt^@Owxutcd53kVnV|!eHN5V4O z_JJ1D`QQU`PXrV~Hu-ei{+(@6{nKL`micsBO7?IQ;@z}B^WdW8+Ks~12e;v@kGi)@a*lA{HTa9rWbk7dasxlx!Wzrt zYy~D;{0-vz{j`?Srq>?N1@iBSQ@*_M%(Ibi^=w$P!;xS-5n){ad}j&d5}5K1>%$ut zB-UoZ%;`NxTn4fBE1Az`z?QLJ)LG6_-b_SXBXbmOgT)JnmI+F%lmFDAlldvS`?&Ad zO1s@yxefQe#;qOgvsPo>^pBU%m!&ZRXR@<3&~y&O1cJHRmW2=L-qn(-hdvU=x+E$H zS4Uv)AE@nbI2l zQVT+VvqG~kq}2p9HLl=o|LtZxV%q4}^N}ybJlntEd}sE_)0)EmX^E$+CTGu!epQiH zg7XSkLPHp=H|&_OxvF8OK>Z@!g`Hb8k6Md@>S4@zUniO$B}%|imM2AIODEZ;B9;HJ zTKxv~c3$Sb{no`m`}+%}U~q85j0Z=-)Gr-_o8=%i`M$jM?o{#!ThL+{gqZQwhmsS| zn(5!XZebOi1E-_2gRfs+7Zh<*RW|#97XVjUO=egq(=cZC9bTMp6$Wjn%GdXM=g8LF-(a{6;|~;H>||H!8txC4doKmRMmL0 z{uLN-e6BfKhm?zqI?a))njJZn6v-mK}clI`g0ne=$wvFL?7ja3&{miY_% z1GbJRcQDu;4EQ*uO!TPeXfP3C+De9UvoQ#a(qgw^0tk(`U*HI;*e^m{dGMn9nDm#e z@t>rxw!n^v-1hXmsSAi^s*#(SO}dST!(Ra)W!L~TsvPvq2#%`!oY87-roa{to=v1T z9E3Z?N7>A&Z_(B{J|9dzUX--QuJWIcDW2jq&a}*X;kt>b9bMaNkGWjoyW7|+0Zx*Njy`{qm2k0;TkUT*6Ii-vgdWX)7l4ItUG@{M zr51$k1?%|f2KM+#jB`pWB?b&ahVC;#ju+CsrJii`GcrYVxi71jh|`>cs?TjMo=sjn(k=Cg)h#@(3JPv*hpu^%n&*T*~JogI5Z2SnUx0E0gn~xd9BN~nSxR$j*8hma_m>oQsICX)^ zV5D5j`4o4mYVq;^3bNL-rhh?zV4~|F*y)35u#68w`v_f=HtCPpW=zaYoIg?P+I`k{ z7%U}_fm*uLv`!kB*8WkGpjup9JH@STwlgi0h_I7?mt1fYI6x@Pq@1m(z-1^;ZucWd z!VrL`#Pe~jG@#OceAlF<_RLr7shlM#*(#6uYiZx%|8O6QrZkBC5SiOexaN74$`3Yp zu+d8t^|QHog=05`oC%4ZpY5LjK*`Zmz^1QBVZ-lRXZW;+e82;$%!PW{<=^r62W2`n z3eewT&-Z6SI)rscTKV_FFz_FTwIlT#bJF|GWN$v}I83@czY2M6&<37$v@9#@3zFv? zwi^4BPwnIUaL-dgIpI*!JTQl{4-`gQe^{mY^VZ7`kx%CGYpq!RB+a3ECOEC0QwA`H z$+0+du34%xPDMA!ZI2NP^=|qFK zCyn;LwEw2ZbYD>BildS5$<8y&Yvqb8fPd^XO6Gs|EWkehP)V)T$|qUGvGA+6)!)ud z@ECfS4IFm?w)2FyWCtJNQ*37G*01RJx~x}>Y`mH9fBJCGF?;l%%z@?TAgah9>596A z8;)Cz`)YyXAS;XuD*aTj+nD`;TDv66a;Vt>S6J|Av>9Ld`6~qq{C>t8aSl|9;R30vOxG0r#nmLOiIAHb^(U1e(%M{10;)}g%_vKyQ+jeORo8u zWUDCSBqA$&MC5;TJtMsriLp|F%zmE2EYH-q=V!n+Z;dDyI2Uz+&!N)~;{T@}Qk%cz zA=XDgDU5geus<&CMO`w5G7k8CL$g^MJS?0wK^T z%h8(-+C)c?EPYDsA3x3hMr&=oPu&3giW7)!gZA#D=`6(bRbCI}PYz;<{|)yp`E=|y z&KTx0pdu^2E+I4h#o^~jiVqBj#r5Gxs~r>nuy-Gl+N@4Qo;Rd?|2xYD7#vqOa^ZoX zjMN_PVjM=3bnuoHP+Aeqz79h*v_fz1Kp)Sdr4E<4lvB@7@!&(nSRwhu>gS>)E)923 z$nM{Z;=hROf-NHU8U?wEWq$(OuF>!ATxDnM>?tfU3-g)m_D;rsKX5+yHMm#eH*G+# zGr_|k{BKDZ@({p~srtj(cugYl|86)yM;;8FkpiyhC+`dVWwDJ_>v!;+^t7B@QmU!& z{tM%DevC*bZf`AmC5e94O(D#vK-D#+k6EvAMqbm5W7@Y`E-L?fiUSp3IqaWf0E|5h z+?-l{>M~}uikN-}ZW=N(gTVnwrEHYgE!P3SoLpp4>+Ki z%{M1icHajQm|%R#Y@=7q&KqFCdNbujI#D@kkz)8iugmvWs6*8YD3;P_bO;H3>MWx&c3IX}-qk>c7F9+z$wM@=GGjnPo<@ zDB;-6MTyT@X9?S#Y|#b zJv&y@VZ<3qrM(JNZ2sT0O(E^ZD+@|Cv&p!fpV^DEK_N^}N0C`WLv~XQ-sK*y99CBZ z?Q{S9UCK@1_WYiv=gHtz2SKEo(7c=J#w)0pUNcQ>$cEbk@&p-zxyT^5E+?t~rdEyI zRQ5}}joR=T*{yBO!K|S#Q}nRuDd;<4j2!VMaN5-))?9rm5&L(=&SS9pM<6{l;l8W! z08QbY(2Imp&6%O8KO#bF_@=Fht_%NL4z-Hd3SaihQTE`X@k70{>>glmG;}3pdFqJ( znpBC{sfCC`kRYw}Um{i$Qd14JoOU^z0K&JmKei<+}mCGTqIM}Gl=5zpA6po73 zQ0!X&chHL;A=5u8?g~!s6WVnjf4#D80YW1myD(nx8KL!rRVadx55&T^&iXw6l`WdC zAOyD_&6z}*FXMcLw#fHlSL_4|zt1Z4#4Q}#PBBS5-LCYxS9a8UZYj$LcLgh2q1CdU z@o02OoB??>cFeKl$pYCWVTfZ|owPJNww=T7MeTkh`F9Np!)q2u7I4(N`e(JYa7@ux z_`GI@W?aH|fbIU2`M)S@hva+ESEF?X&eV)0FNz%p8DNrsxmWpW2%(YZ zdPTj%ak$Ld@pWvq%kgmu*&=*?p9^E*n$NmWU|7RH&L8ll^557S9tr&p==aXlr36$6fB9b?#3iD#B#S3>!(g(m|ofH*S^0{!n4^HIZuUzL?ecKEqD zTjZP^{n%lyBJ?d%fo#mx#TH(D1s=Px_TPHNV8F$==gaJX@X>h_4Y*g~!PukLu6Erx z#wk9@8P0+&3FM&BwhrkN8Au(-g}#Dr;xZIWTMXB&9~w!UWBR{U(uPEDk{@@bPXxO- zHXQt%_+)v_kq?3WfzB5jT}%(Sc*%aE+WE=KhwP}4t>j&*W{sK&WOu_E5nxtu)P>ulhA!YSVF|NPLj-r8c5mdTT9i#`-&{ih)(`w*RVm##+*;`t;(_| z$&P~}%X_op?<|p!!5&>m+jXwiFcRZ0(B+nxa-WL~FnM|z01^$6z^jANxsCh?Gc*95 zL7fJqBzc8*nC&5v<(zj>mkJCjzL;E4^?VC@gF(bga7FC%M-ZWtepZqspWxKZ-Y$6s z&s|a(P~1X>9!_!U3N1&3PW(G)MLQj$Kugg3h~LDs>KxHa}t;S7Y@UNz!G3O zRpqAN8|Sm8#N{l$f+Wqj;#R>cF>5#`I&nE1@je8YLCd0G-2R5Z!{&u-I9Av%lOVLo zEQCqemR$Yc!wa4qCRQ@g_rZ!!Z8u^YB#mqruKNqKFafKWKl#I<(Zim~HMWBw?{yc=!+eVutaP?6e;79GHc1XWVCWbfJ z%l7oCrfK29Y9o4_%Qu}nm_)_^!+8Iv9KpSw=JN52pG|!s6*5K+J61l@o1obdd`5># zP;(!FG{SfC#H?)FzmE|2^?y@t=eAF}x(@Jy;z8_?D=twj;;c%sHpT(jnDW9r%mQ^H zFJHOLPVSfDYp7kpq;B=M@EJ?q?;iQHs@JFZb7rF`&39LzCk}!81eIVCjF;&v38BsQK%KLJR2@|M|!GkYgyj+b%XwRpy%9QecSO zOcR9ZjAeXuRe~TYmMA~OCOxwXT*rYxV1H+IBziw0#*N{NjD+TJD6;rUlMi0pd9^h6 zd+NENsVRaV-GqpWoI;)zBBb4ZdoYK5z7dwF0*Chbq%2RzDok`3FvfwE!lZ9`{E_MU zIl1EgcEwd#FF=-K@p@tU@9wzH()5U|xo^NOK3HGc_T*3XS4RqUR~2Z9iVV($R!7dq zpt%VpyIo>CTbWU2X0a&Pm(i_!UBERl!C>SoFApXi{2ljhn0tNKH7ScXxIt(xPIx%sHe!@|_0oekeFxzz#i9qFke=<*V8v+RF- zvmU_dpSCcGGX;{|Ti#&_F7nSW1fqD90|jG6yCj(sdmdY|RPw_ZCx9~&K`ap1m*-v3T#taQJ8xKOyu zhz__>b@#Ktx+jEIEnAu8p)R@L0$aVs4p{=!S`2K$hKzW9cBVyE9Syf8tdrN=Qx{DG zLF7*q6f10bggh;L`kU4)Saq7rYjml~&N2fDiIDAfM$Q-c%t`P0A^C`{gvq+{ODj!w z`HDv{R>angkP1Sl6Mq@!IC5D(7LXa4aD4-yq|vW5ZJx*dq4K-qqb6Je+E{8sWwqb( zEcaEt69TI)z-BeVPDbZ1E{t@voI?J{x&-?YxktR|^iIm3L>tuA$n(po2KW+4+Mad$ zfbZ=mJuJ@j>UN&b<4H?j`n`j=Gf?7B%dNLBW0K?aWFf+06&8B&LWCg}hGbS&KDF1( zi@d+fy3;i-cr1NLv+%b`f~^GcnX>S3o7@&iKOs@r`PWTV5Fz;HX3g@0dS-LE2czG4 zb$kc6qOlMwl)-MP$fn(Vd|Ti# z;#S(9jGtETD%EbnRb-&0+RMnN)7eMxht_&rF)KpkAxYxBMvY2o|K;6w2_+&pDyBW=DKdB-x41TEd~Gn zPULTN#-6ju8h;gUK)L=?K$=$2l^*Dbz?xDX0~USqPcsfOnps%@YBStr8$CbUuCO*$ zhopD>918tr-}l}t!p{rddzq_!iED20{qMM|4$ELc(YR5oz>&`a7X$-xnR;L}_dk!V_9XHYSoR_01qUKy1`pTW!6JwwgtgPR3lW`UeApS3 zXhtA`SxHE`-cmMFtW&ugG&W|bKV;NioE{4 z>6t+7ru=a}aqdvH!14!=uvY`PRPddXJEO1i65M;&5Q@@ML9tmjlG91Sk&1yI18;5g z4<9Jx@C#>TDl7?PJ>=dFkI7}Wgcs9FXs>&{A%vOUkLF7m#t>XdCvP9PunDg;oAt(f zMRw5N04tf-Ux^&g_ZsrEgk(+cp|t^J$_(IcJ$p8tU3pcW4nGJbR!LRubXrae^6^|s zhOUhAyM}nk!Yzjh+7x8aoOlex-vD25sGtuf=7^;wS_h#p>M6$iMI44C#pwk+)Q>yu z3eK3U|1umY8z>RCcTeERgL+r?j%?cZhM)$`<@TK%Bdh=~6&WkgAbkc3JM=c(MYlU6fxC zEnVF`7Z@y588#2uM#@BGf41nBfY*hy4wa-k+Hx;Z@(R+Z=A(`yZqXci|A<^%5r!qW zki93xgl3TDl!>J0UkEhkPB7r#8HX9e3-VBA*-Lfu5JO?ARhqh9_nWkR z_oBCqU>frbe4N%$CHC}nMeEEkiVv0(JSa*{#@~_l2&ll(*Rn__cor}To@4=urX zio>yy@_hGsuZ>#Hu6GusuRNCS+OVW2R{Zxpf1lyXUZO_}i&wDvL&2w-`Aq@ZPAqL6^( zJ)qW=E8ouA375IOnrC6NjJJ1Z9+IY+jR}qo-WL87fW6K7OTkVkJUXZ$=-d1esKcs> zB4cm*$Uc-ZqQsKyk@|)A+j#1y=YK!~PawYJuU%nxcqS7~?yFC3x_`#apD2`z$0k z3u7Si-~_tq5us%T_F2A#t0eDikH7H77xR$x)gbKF2-8FjM_O()+;0#i@%1Vwtz8=A zA8DS)n8O28|B2Y>}*Z$1+IAH*|!1?S&s% z!ZjmQ3i>^s`z2(&D~O51R?1yK!;y=X%6`H^cT}*@K>C&Vr=!|RSWnS)`jjh6c_Z_$ zSjE!9=JDZ}cTWoT_lE>r801VAbPo2q2;QsKPyZ0tn+b{$d$YBIz--QE_0)zXu zc;X2>Oc*2*S2Ld$18znh9PT0t6FYC({H1moB-qekU<2g|o{^jIpAef)h!8M_`aK=* zN`tk~Qr#_of|(?7(zCr_48`-(Fv3DbelfNfw=wEIKHg_Ca^jq*$0?#7!Cex=%vvvb zUYLa`1;pO=o0t%IdRxZJi@&;KMg0YQLRgTx>q*+=h!3j&V_^D-XJGoG(QIn?)W^{& z4O^pCNj6h>%+|(@KV6*!f;U*&M5jm4?NBhYZh-#9eSN9^?}#xiOg%|bNfy?2rRpYJ z4uehn_=7a?)~`UrvG@ihIqS0VVm;i8)TM0^Czp)Y@ZRaz$z^L%7GNTfC6KNW>x2c$ zGmsw4vC)&`y}(1l19%F@GRvPvVzdyzapyWq-=8=s*JZcC!_+CHsw~jQQHTq)A1tJj z@>y+w7cEbHrmC@ijLnLDk{gc3pbeqnW*B$*daB`#< z4GYN)_Nfa6ZGL#v(cL7&ke>@DdF8)G8rPMBo%zk%e-Y{)* zvkU*C`=-2mTU$|Ka!kzYv3oFgNG(L1OE_0571#0`c69 z;gBtMXy=XA{|glKS&sKvUhc1+bYl>81n;ymc@yyds>R~LixK~W;ovWGgBS08Thr@& zpxu9s5)0R41bTQ}3Azlu*~b0PYSwxfBxzXX_a_b@bAK?E{RczD0SV_jy#XljI($=; zHr1KwPdE_G9siK1ngGMUhMY*QZ}W$LWQ9g(hU$xDzQOA@zqPw}Ml&3lB(&WVBsG z3Eu=oAfJzbUYL3Dbc}|QxHY4^Acx6W!n_gi1AbpG?2H`5{m^UPivlnd*Ey^HKB6VT z{RAh?RgdeDV1YpSwy`@n*fVY+_)bpd$yGyV1&6zO28yw(Zx4^S05UgeyVc{oA|fY) z&N*uw(0L%v0zF|T+1GW$5dv-Gs_(KZZg6|&$11s9D>4kC9oD#%sd93s$la*x>cpjg znP(OX=!hWSF`X&E%`tO2dsiqv{Op#3EYHPQX*Vky5s%l6oKx?sZI<)qBL~|~-^Tu;5rdn+AMAcYw$_n$w&ji=Sb?)0FA(x)5^>b7Ic6iKzbY}G z1n_lE4O$Q$<*3L;)&g?h1FGojzISW6EM6}p$2~Ksw>d4{c4mIq`1^XAVTDNj{c4=! zIRNgWQSHsXM;*S$9TFeUAJ)ozx~Y}ndY0RD@nUA7UgxLNx4S}-x{0r}?%&t1{ylrY zCoPWJq{HX+HIc|N0_YJgXR0TQsKn_M8wcGQC9XnGHbBAmU~YOM)c0;A;=xMRiH_H$ z!d08CJMrT;^5Qp@oh{ZmyX2k&rr-5e9Q=>Y4_|RwOloAGk9!ZM;<{5?l#8ah|l8aZWNkEv>~t07p#Xq6FP$ z2WmN9lUKFk9um<6XK5|U)PPeatnt3>1M{|JCNNJPP+G*QQ?@rdr(bFkp9O@A$>+MMa% zT8ye*CHA9PeeD!0@qufAD)TyVn)bKy>bK9se!q9i9&rY-UeF#y)!&^v6qtyd6EITT z{BX0nqXFPdv*qc%Tk<~$poP<^S{hV-w+dls@bnT-v+gS%!1o#~4VxV-E?q5W8Z6XN z9}C`2dQ$c((`Eg<;h2We??G!?yEl5fWQ5462!Ul_yxru8$R2DZ%c)YMB(5K29-$BE zI4u)E_U^ePS7XI0IOhJDHDbl`ZB&RmSfwiuVRIt{Kc2!#kZ94THfqB?rDq zXU~@Iv(&WxHVy|SSq9+WkLxQK1CiAGH-OCjINR!wI3p>o@I+@Q;+II*tIy>Ma`wEl zH9XMi;~vpji5gVR)3Cq&r)}hS$GUdH-v!Rff)Z|wz9>44Ws+OgnnIvaZ%ri0HV9%krXQJo`bvzgmWIejbKwv)9bw&L)vn{nNR{(Oz5AklN6 zhx~&aoM`_rL~1)@N35&x!TllxI{)nKUH>NW@P0ZG9cV&GW4HyX8W)lt==y8%FeTEO z(N^iNM>)!GxDU@<#r}04)aUcsW>Y(KnkuK3Gq zu?#Slil*u)OcrSL__KJ-_Y)t!8J14Ew6NVsSJ{AU@|hvQ`Z8lhIUOR7f%bs`k6Q4V z!vp^tH$>_Qa^4o}!&JLCYuULkY7~W!QDo~ThqX{yffEBbZA2pjdwkf+$3VE&Fdp(k z$`sR@0KovW*WE`zcY(sDA2te-92TVxY20qIl0N$W^+weM|F!R?a}P6Uj%=I&?Q^hN zSVA}3`1kvRu(5=!#HW)Mjp1Xfe|?VC5vWZK$u0SeP2F2|NRpp>IMId{^|uO7%m_8X z@YxJd7f;6rXo`9nO!DPO{Hk-!ml6XKS0w|scC{N8nP%QuWD>W&uZwNG9m_mzANieE z;4D3_VYG0KOT+9#@`V|}H>-kb&kH1N+@Bj|axc8dlQiJaGWsit`U6fgOclP8mDCk! z`+RZCjPo-dfDLxYj8hz@GG7>~AwVNPnGkcms8GOC1;GZ+rENH>7j6DKs!XPPbn8*f z*inNuqWJhc-KR@9Wds{Ma_|7~BObGTS43MRky~=Wm({FSjw{YIrGEwfMxw4ir1;xpZ|vsXaMoMn z4dck?j2yV{cI{nG%G=`d?p&KNK&}H@h;+gD$oXnzVN2gRt$%#-Ma^QuyasIzKiwge z+Vo@Nvg&?S44`D}R&w(caj>;XR)QCfNyW)DCPV+=h&y-n?s}Z# z6;nhaRf^`yfB!|O0idy&(pjk7TA1*W&T`iei@r#fGwH&YQdUVo!XZP*w9T6&d^tuR zk8G7)E&Q=iBO=p~>pF$Mv)A1KK&uf`@EE?B`QpJ)RO#^-HV`z+C*GD{m}~fJS^pE} z*LqRHPSUfe^oR5ZX=}0=TQkPvig4bB>Rp7#Jthn1ROPQY5-%_5)U7uI+D^`EHA2iI2x#_OiOD`MFHEBVf;)gH*{ROQ#CwpQS_h8#ko_Qx?azkaV zf4&Fna8o4+E41l+FW8oSFk4)%KFg;tqtp83ci$yr?X)kNDTXb7%X)Hhra;>N7axdI zxKEVF*RNT;Ydl?Tyvz%mx3;Cj^S%12%pHM7t`lFaUWHSSeogSmJRnaR&A5OX6H+VA z_FkE-B`JFA)DqTWV|Ca4Zo&W!K#sZj`K^L)y$Pu*2leb+H#zw76)0VI{7X`tPr3#A z7;)sjs=a4ST7S!gXgkkAvBl#lJ#^J_id&j^9fc+Ok&8K+)Lk2~gO_?~2fr zX8t1{hDle>`CznMktAC^(0wUud(d$B){WFzj!fRL>lfZ}w}j79vFq-Pol9Xz@L}x> zTIymJ+qt^+kAY6+Q}TA7=v>5B`*xQ3_aEL+MEozZ6B9-_3gh))^rX>Oi?j*YAY7NG zoruuRx!*e>+furF4(=2Bzjn_fYem|9Y5lPJo za}jtbQj((=I>VdW$X%B+tv^7sz`^aHm6WA!sDHVoYxc|7&1>Fc_y4lT#$-)#44-CS zAkWq*gqLoPnn&xXo4i7K;KPumvkT0}(}W{l=S*Ktquyd5YC)YA*@+)XgQ&0M_4H=m zKS6f~g}V(zmOuE?%%o+-n}V21tjj=Mv^sht{5mnmukz|r_w#WSaY(~$>vVpFbMQCb)sUOE z_bE02l5LGsUE#f{nGohT4+>N0SByyDD8#R@EChsgr4u$Vwb2+9R37iT() z_siNF`7?l^x3m15=Gi^t*_C#UuH=UTD#@weaGQiCwI3i)MdF_+bEIzjJJ&uw6`f=W zVSK6ZCLMqDBYp8Zz*iK)SOMIp%7Y`m{SK z+YR2tfd!sBODt+ulyLEl*)#8_sgrDn}vLa z;*|9{GFb|h>kfrJ`1}PB;;I%tIDOy#qv%9mhX4{At~qPUuAv0JH$U%sM5|msvq^;z zO=M(e(^V!~Pun8u)!0~@)aLX37)8qR>ycgJa36z)(nDn0mGrze4Xy{yxpIXq=JD0a zTh0c5C7x<1(>c-PL(y815q_7uo-xd77KZ%7y$y5qIc8cd1{{!?{i8-kxZAHY_V^3E z*G}>oNxwFQAyviQtqn5Dkm8v)*a!w!aw&?$zYN@ua`bDRCxGdYIutse-bswZa9IkT`-*tvQ47)W!Kz7`6KY5mxvNSw#CKzpN|l zGzlMKIKb&qLiAeX?5y~}@zzfHlQs<%IS-vdZ8h4euYV87+(r z&}7}s~g|TvhSYZ)RSMivjv25^U-CyM3P%=l;#vohxd%Walk~Ci*blNHSRm_N{MSX z{nK-owfl(qX$^BEYjl3UxL=umoA6vMWgG~F>@otd-&~}(5|i6d`0PiLQQ$7(PLg+> zc<6o{d95%IPl*T7q%SKa;|k+Pl^k6 zSJf8_)9AWU%WnUA`wm-G4tLNeo6U}qJLczyDNSlv`zW9_Mp_-t{94Gfw7oS6%;*^U zPU)Ew^`6>`UxmczE*fAPh%jEUXrUMiZWTPq_tpfc?g?!vlR!SFNOpv-FprWC(Vc-; z^aHA4x>Bz*S8X=9mz5c^qfcU2?l$BubG%*<1$P-5fQ8d;7?B1B6zvR0xe=a5tp4|t zOQbv28kZ3@>W$zM-2L+V`;1?VtAcToIS={~nm_tU$nfGo$q|Fx?!U9|9LX$l75~nI zZz2nTHF_aUXEZle!Gb#I!|~9KJITQxcox*=&dJdL3z{+tbP{@>`Z8`sypR(Dt*w~3 z@6z6$^DmU1FF&+GK+Wylw?dNUfFg&%*=tUdv_+MHu%;x2dKZHs7zh!g@!D@zZbNS{ zn}tQU<{i#Gx9k}dbWA%Cd)1brtK1MY6igMAz40U`&Sp#ZmJON4&BRxxlZyy8sR+-*l;D%>pxwPag9${Z1l9iq3%g9XTq1 z?Ba*1Qm{7h6J7Eb@4i=k2R(P+Y}olw{|J?>vC6@t``!5#Zgb@GLeP2c8*0eU5B;Do~hnHiSQPg@+#x;be7kryps5R<;&$W+y@MT=aX*qw=zz|XlyTBjz)|-WQv%Cy!KPzMLNv-VWVjCHgY{RUW zCkm>57-(u$$<(8uS|kio)zi5cU=W-d!=NB zN%!XQf97bM&3m;V2nMM<8uCxwqVkKr!<-@A$FR4;+KwQZ>3iwQ<2n~9VtJ#;;UmZh zNE%A2*2Dq32RE^n7lcm}NxXk*h#4Q0&pq72yW%qu!Z)+jRNq%Q)vDdc(uL`6E7V_=c-jC`ecA*jE@{(;`kKL_V z?(5wq52j7Dz~jCI7pAW?d&rMD*sAFCYZ=R#vcTn&nPBb4r~1^mO5{(2J1NFTUhgqW zi`qwnwhfm}ccrNYufrfj0}>;;pj}j){3f|0>(%yreFik;CecKD{RXUs4$yj75ixM0 zW#KX1EBn;J;V;G&Pk08A+-z{`Gt>q*8S8cl(knW0K?5(OYAeyBkkogmt!-`0wy4Lz z(t|Ab6X;E_W+&sYRYh`O`^@^efQzHsvB}r2!gj6}N|`QpRqjBdfXxtuX|rmj+C9x7 zVH{LdlMMDl|JyqGZA=TkWoyYM3!{c~H z6J)V)uK{t|2fccslae{9r9Z8rLIOwv8XH@uRYq;9cpKbNV~4yy9&>mp^!u$9uOC{; z&yjrNRstTqS8WVhs-FXozF!Zb3Px(5x{v})m{8NACiBoP&SOrGA!aV((HDi+crYwd zZ(ZmpAaLc*nN|8kH>W(piG_&d4m*KtXCb+D6!a@@ccZOEYB64_=YiPSRlWw6WBOGW z2B|%UFIkP{jsYw{qqOUt zK!^Kp*cD#FD-f}kxlQ_prOcOiB!ci)ePfAgB1o)vBD<12<`LHRyMw`^K?KGdfi4@9 z%!@3i*hfCsJ`irjU}C$0BEIf5!OdQr>XofwkGYl}NErnYk|y}YRM;d%#k3N16A=47 z)A@}`zl)Y`YvIj7ZFDSTzWAA*kIzcvENMpfyNkJF+z|oT(oR;6;SFKUkwJCBox%kj z2jdFZoA8?EQWtJ5mv48NfYr>T`;>mK%Q%;9F#>zBj3G9jj3Or2Ml(6}$$;`4Lm0Z~ zV=&&=X;&FvhVgG~aYcqN0+p}Ey}*j5xY$KNvP`o@J$axEw%s;kMN*pRh|t_)+aI*} zoKi3A8o4>5e_gE0AunGBoWgoYm@4>Io;y5zTy7T3(4~u*cx3sqj1B>x@_9=!izVsA zaPwJS>#{jgKvQo_bZi^*r(b6Ry%AQHSe*pR3wNd*e;Inx!z0L%E;YY9;Fo>9Ql)4u zEF`>uG75$t?RS8O9Bjnh* zde*4~>0WcEDq^&z?-R0k1Sy7{=6y-~sb(bzK+WpkJ#eVW+& zC10~B^CG~rrnAi&Pjljqu^tddA zqkdMeB|7MRYFMk&06Ws3eTK8j)iGTg%RV5+JS;Fu_PW#=`9`=kI-al}$@ejuu-QiM z9-%zM{y7ohCDn331+Q zL0trv$2q|40V7S|rI@RJHnOP;exwY-5%I`=0t|uW!EQ0S7M`+aTF$Jysa zDLTItWbx15gdahqS0F^5tPN)2P`9w?VS=TzP1srfjDZ4gk~It3Lk9_d zEKMb2f}!^zn8~M5WQku&qi@n(^EY)T?OzL24TKY7 zwN7xV_AQZ`wT%U{+tRe$c-0>fkx+>6(qZ$!8^y~12q{Z%a#+F6pW|Bmep=w_ip!BP46YRR)pGZEEFHGtE92v<(ziAv5qvSM^rrD_GMLK=VW7SgJMzd%@tp=}eZU zwy+Y~8`n=+=-PFA_N`9D?U3t^d89y;36WL|g48&o}#u*sV0>XTteRplmv*8d%RcQ1 zlxDd1>;n=?-$J!sV1Xg~lnKmw?2_Hw?diH}vVtr@lOB$k>Qf_6U~NS$=UI$`H*od4 z5Ikz?!q-7Pxdh(z9wH%yk3e}z!1+rCsoLsi=bpBIZZhdeBk%==Dt|6H_VUL?LC|Hp zxT~Yb#2z#91UW@vcgJ5{mPM1o))ybi9^%}m zu;iiSq4-ji7Z7LtL7a1pvdlBl!B3agBeyPx`CcQ!HYph)JRdniEu~>BsoMK>S0n?g zYe-w3ua8xjhu5kd5jf>ZEur9{7ii37V~%)gB-!}VkbJ^?4xfLH?N10_DyQ6$V)!Uj zSYfot8s9hs%2&kW0M}@tjP^zenumBlmLpkM5MEPG_trBu+`WQ9^rN~Ar-Zmco%pzdn`(YMpEm_z4>8^oT^Z zQ)Ou`O(a9v^ZQ7fU0O-v%}WA~CrgXha*XqcFoD$YSMm7NzLSZ30*~XUieFu&_F{O1 z%~Bz5Hlh3TGMxz{fW;KG{-Daw(A~(_m5b;R`>Y#T1N4tnFo(PTINE3Gq_zeDi+s{%Sf2ecV+v;-(nJ zlP_;qegOxqO=pDtFltBrQ0Q56UTqj$5OQOXJ4(z?pS7B(=>J9IONphZBY#?FYK@0_ zs-}8O-HbD>;pJa=$JCEE_5QfDjumZ9h!#e{?2OhihGYw7=5o?ssoH4#p_{lBY$^^% z%Ky0D{$@1m*Vy*U;AB?n!fVbVdB8KjUT0fa3B`cy@ERNG!V&S2AfF+z2Z4a~mS|LPm^WH8mF}&{jKt9XTmH^GP zqb<~3d4#PGiDv-YM16%qS6=+S5>aC+1y1I@P zZg{m|Pf@tzbsHJH0AKlewMPLtBz1UKkpzur%5@JtVt|)n^~{(YQ_Zq}Wl8I-Za44o z$Had0W{H7Rc~eoCvB-~@*@|+N^cp|5i@a)x1 zzklFyTgvUSCbvn(g8Spic>J&=DqF%(EA;FFCD1TE?$UgA>;?;XBS<-< zAwfs-QE(_^;W8Dypdbo1#^VxG`~K!#PFcsTR`=i?l1$k*PA#|1WpBln@bzP=V)aXI6MxzF}HF&BCHw}%d zbvPK`d%{uj6aU4f^+%dBo=3vMMEC8Zkg#MT51C9BY>9c7+2^9c$1kS$Q?K`=|4!6FxQ>e1^hx?*O_a*k1;lo^%*iW@-uRU8; zHD&eFnE2_^b7_HU)^z;RmG@Uonel>Q%7GB=JxvRyMwjf=ek3;xj`Zx=aP|msvKV`w zrqeKafRj(n)hF%Is=UW8;Oz?ZGjrpG5|AH|f2&c;&(!>mqWHk6aFK2rSk0BPHGTYi zL{99{De$MNGzBN0aNJ?&Oz0F~1|`5654H=Ud`3&e^?f+3L~ouGT~NuQG@ zwETaJ{dH7S-T#0MpBY9N1Q7)3M!G{`#iNw=>1zS3cJX6+f_!7GAcSiVF z;cVLzL;%yfvMcP93?$6Ag_Q-z2&q$L&>fN@xr|nS2LE=P8puqMy}-q@#9Zk_%N+vm zvA~tedin*PbV$tfNK8Hm`_u{~}QT zcqDC)IaBl#^!FDBXZ+6$yKZx|zi z&;9pp;P<{1#l(eH8?H^ZM%19gts@+MK9)ofFIaFz&Q4nU?0H|FV};gXZ+)z}M+<-V z0NfMcE=;cI;2Fo0iD!64{ldS}4A!UnBLMP(B>M=%qX?tmY-)_1r^wDOwk|K4THNY3x5!^`4p#}xB|0n3mOM0(EoWZ2E4BP&mzebbhuUDAN8J7}~2e02bB z-jOYhYqF!!g6`60+ETizT=>WYNhKan0{hSnNK5*CxHs;Y($nMM;SEQ$>{X=)OswAG z4crVheO4&yx!$drpeGABMNxsFj-oH#vW>|+l?FZ|_$3*dRgQXPm=;vn7m0&<#c{C3 zabY)9@7qj>o+GC?326f34LOYYhw=V2wMFhHUOUl`)OU8un&G})iyj6y`Gk02tM|Fb zw>}}{PYQQ;WTyjkm>$7pjQM01>yGd#vB=v_f}W=`^hZPscyYtUli?fiN@B8t$0Z=sA^o& zZ^_i(ODPpDxkbxn`ulmYWB)`gZ=Vl~zCpPy z{$PU@H9v1+au)^v7=p-V0+0_+5-czz(=Q)K<8p>+P=3WH$t*ngjJR>+g-0)|qZ*k- zKpB7B7`0hxN9i7qpB(~UNd8cUFB`o4_VS=}+>zK4uaWr8s?tpl9Zku)497*$xrMx( z?p@5gL>Sny!(Oy+dmPwlkEmP7shS{pPn{#<%OjWR-wbmFb=hrcdFtwc6lc4pH$mR^ zMA}LQp$AO*Hk*#$?0u=G#hvzXC=W!RRU$eO(JDL zAMirejKhsNjMq)UF=bXB{4eP5!QWmZGp2d{P<5BDEOEO2?lxZ5=rvfZxlG^Y9oz?= zoU#F6S530dehQobHUEb<{(k~7PXKW83Q2LkyV%(Rd#Wl?{bwHrfF3D0fx4jtD*-AC zCDx{mK|WOV|BYt0wG=&b7qglr?AH+knM{Gc|ARnLXk}+R(XGF$g1$`}0D?*PRDx^w zEemb}S;t^T4&Q%1xZBl(XvB{n?;N&aM)r(uE`v!lBjE4sb7-Ue4@Nbj!SiSgHvrWO z?^S*3Kw2^j2mBrP*8l(CVFwXTd?>DPRY`b%UDO4LuNwL7r|E&)UI_zOoAl9MBRyf_ z7-%!l^lz!V?7*%eTnIXQ+9~BXGx4vDy!oysY@ASIo5sBGId>VLd056GSUm(btvVH3 zMX{CgrYC_);B-Kp^P>3PmwVj#-~!M{63^ojw7YJe=>ILjhdLl37;N;A7eQI2^%Y0G zyG!PYqgnh5oqk_A?`ypIM3&Ea%$l*}YKwx2*Wh0i1-i<+9^GzhYU$Sq8bTVcX7}eP zk&X3o5+WrHQL1#&M_=tqJBdcsYHVsg{yiFJwpTZJsH?djJPf|4awOcRps3k38!|DS zq~d}iIWf0Vh~V;58c)v6EiJ$#FFua5n#UckzYOU)E#nRB)NW)PKO_OKBquGw4g^xD zf`VndIv|S)54_6w5asIBpf>+dj%|UVMrLzG`DIGyCkypvc}Esjj+~cXtL>4)UAKIZ zOAf2i!?|W(9h>jaVGzqSY&hy+-QO*20kIDhVd67(@XvL$LTvj}rot?XtyQwz1>>kD zy;7>-rsHb#@?qCvMGKq0n$8%I`|bh^I}b2>P8|{M|HsT9yi{{xaoNk!cPkxe2>W0} z4)Sj`u`Zg!%B&XZqK=OGnp+XW`DR@grv5q&@|HuQ|EmKj)EMeA5cZh0`Hxu(cndgg z=zo(D)bD!aYnn)%=i1T6cACFg_gb{{T4r;p+U(G^J%2Q1EG-X2*RL)0mg@K-OG_Xx z)Q)TLzJ(y>3cTvmiXOt+<|+*TO>~K!Dki$RzXUj1u8%T;{V}d1IYcJp^kq0R+8jV) z^oqccKyISiV>NtR{mTrC*~ss*%J8Ga4(2zzRd-SR+O)9JXE%R`%QhNXK+A&g8A|wh z+=ApKPWVUqfT!admp zp)H-T`fV{cW#H89fa>1aWU0usrZ2okyS!j7n+xPZ6*LG-eKgM!?{ zxilmcx&8k9+7rdTgI^gSK*jecHsksw)y+=OomR=80@h}KGPuaG6%mwi?WF1NRdQfy zm*!*UiNZX;e`TYv>{$xy$%q>xMG!lp?%}mvU~L|CCtw(LV{w_^>2qLXrzf8EpV`Ls z+2xi;%E`;_Uy<9iY&g+3mJR1#$t}gH**<2Ln4IAXy-9H#ktr@|onQZt^vr~pGw$vC z-EkphwF}+u*VTJ}buCSZ#2MIm zf0G&JTV}Afwt($J9MB;{{Z91X0BdR8lC|$?`Tv7?3S!?<-Ji>FY+_;{v~$c*m&~`W zf0<&yD(WWB%dAhDXwYT$^_I_e(pAlaJXpLrFa58sEB+q+|G4LSatq<0CE>>KYR?qp zJ^Mq-pto$;xBv3&sh!5Cu zaiQWqpgqiglWhK6cAsn!lQO^cw0impDL3#z^7aSo4MTU3IzRZ^)}z{>c3T;`K$TkN?ciNcQYGO70;;A=XBD- z{-#R&s;WfF(sZ8`;c(u13yBkdaC*+^cNm^i&cQ=qQ&~+%__-pZZQ1&I({%(?Es}!mNrlmfM0}uV4#hu{w zU|G;a-yPk89tz(3i_1DZRc#ZWIhqsv-z_dq_p6=%3^d=hF1s#Jpn4m2sX>^SkmI5> z`-=Lzuab8`;MKoA-ZaXfSpt^zJ8DBw8sYe0G5W`N;~se2I_o*>I(`!my>#-X2T)1; z=5e6=(a+bf5SywpoYeFzOF*ed$e;zQ!J=R zRDaoI$)PmmzD>^yrD2}lqprnsB|v@U?#8~6_5d6~PafZz(&BdR2(%oNOy!3cP+t7Z3uI}QlKwTD2Y*G}1g2gMmyuGe%m2Iwv7f@?iIl4kAMz2SeYjAfWMP*Iu0Yo5Z

2W)KCvd{VU>o`&xw4R!yT@VSDEkAsh~RV>ePP@3`Q97 zz#Zr@JoWpDz&lI>iiB{^jD*^fa|1XsD}?gW8}h9ugL)1;LCjI{-O|WGd3xB%D-(MI zak0Kn7{1a0$4}Dm7M-tdeh-Q_=qdW!pxmoa7B9xm+4NfYF1#kdQxb7wjbcl~=qQ3W3%8XsspyWg)eWc{ z=uFi$SJuV_b$R{=>|o;LDPRb_8C z6_8@rU|DV26?M37uheVB+Cqt5KZ1W%G^UWwXXvG0!}gW6$B^(fVQJ+`!dHd%dgXSe z941Ax|G-o12LUK5j_v&H{=w95DJ;Yqbwof5$=em08mz)k6(H7XH{0M(DO}&utXH;; z(op6sM~nLrP}OSW?3Y-44AR}v>d@ zAFPQ=JeT8;IneB^z172ebok4Ni!r#$UMwyrQnUA4BVL(RK-wtDk9)#3-`t)cvZU5yR2AY^%#D>TdR^kBhKCzKbN_RbfU6-m^k0?lEBwilvz0IE!&4@yiqlBo zw@oR#8!GyA2lc{l>SKzW?Qe64i4V*I|Zh8C$0NocB{+$xd15 zcb%}>d=_E$)p?^Mc+y8IzefW`8D&X9nBvGXvCn+fp-V10rxHIrOvi) zi=Qvy#rxFf20==@;#5=R#4u{a)mmPaza88k@6Gr@JV1!BRQRM?s^>Q9^T;cAKl`?> zxjNEynJJ&mUdJOfpG`@}W6JJ78Wx1QL_K~f7^v$V6j4}@6_W&s*RfKN#oHybLUD)E zc-d{E&XxIq#p9MLXI#Vq6*Te+8*^a+9kCW%!yJld#Ug&1pT-oP@>G=l`>&_2Dm<}E zAFUsW7a079T7viS{9jzJ8hCH3{W>q`q6AF{Zr21NlQ&80tH&D^)A?sXzE;)J=3Sv5 zhLNv#5*jY(+7{`om_n!hQ|%i&^?{23@5OL@$8XZ~1Tw=!Ow*v=$m0dAx|zyzzBl6_ zsk&I9@P^zlSR=LT4qTL=fW^=hA68ZDAGAL#(~!2LJjLdFmM!*KDn)^{hZv=Z3%u;f zBSqB0(6-s9=#TKtj_Ma1;yC4XW~it=6nrE zoeHjNdi22znttBk==iL_@FZ_>^CZ_Lc8N*u&}q0bKKNYTGVJJob`mUTM2=1WGTALi z55`9oRmBN0vv*za$2$+!c`Tr2yaR9#rg_s6#Q3!INh$b~+Jg|KB)nbwSO8AN{-9h1 zsD$8s^VY~o5#mVSmTyawj$P_q8acJJn@Z0S-T302<7n^`z6sfT++s@L<_@e((EKvws2t433N$i_1`=w+u}2E@+A0+h z_~Oh_!o5o$HT*`UCZ1@}>zDFX2UfmHpQ-jWTeKAZuZO9_h^a2z#a>0`u$5R%CA zM-aVLNbEupZDV+{)UCW{_|dBeMYIm_vUWO?KYJ6ter&gpCtI(&8#B0cNLewlWmIxS z;S}=Dliq)z?fLa*%$J61l~g4P!8gq(v;U5!9Zb2-Y)Vu8S_Xs8H%3t)1#ET z$&M^VIc9rgngn7b@Js-gX5wf0L*S`A4$ojNg^Z{1`**N%u=uBFk9-!8X#G!1DJkn^ zR`K)xnjOk47FK~1Ma17qnL{({YdIJta2A-wf5rktP=AmBlw%NFyY#Xw%PR%6IL=kw*-!iB^?##*VKksnt&F50QP zohb7_&2w!0&|`EG_wz4iuo|WIOLBxn!ZLLA@Ep@LUN*d zkKw}fH()DA2argJ@L(Osb45)*pJ4O&hF$Ndqj}vE!m1z^q{S>{2}aKtpo+%^q28}3 zrKjc<{01cMAN**2tot2|xI5Gquze&@!sPZ(>d7S+YMUO4?B$+7n~I_k=}bn5A$rvq z1vjdm6H~9id8l`hY;A9Lv-&1je3FYqhleyHqkBOn_E;nh)%uY@Ea``5)|YiviVneZ z&STqy8*5)~=D|=Kowp_weV_=@2KJUP!q%z|0`K+Ix&LL%&{qkW_vnMT6^{We-h0c7 z-X(g3Bezpg9;bp9W8*jW`$Zb*$KaI3g$UP3jq!zJ2gutpKC;0w zIfsQHnK>~C@_A8OLDhB#V(F-q!Eq&~!o=nZWAzjU4o9BgN+>oS@C<6`vn=3*)F>cY`<&V;3wz7iDGZfB5gCH^`1k zXdfS}Okg1+Jr)8mI;|Cy#!XC&g4Zxu`Nd7R7clS^zP2a$>T_9(n=Be=5_friE8EcB zeX&enhdT8#1|^uLs5p_VXkFCT!@wheY96nX22+ZRs-K@bwBa4@(hSGgCAwPU#&H z#QaE+>&s%VQ&S)MVuqCSgWw4FyNuh;j>&V;b8z5&vW_)}gpNW0%)x1d)*9MlSH~|? z$sdH*+*n=Q5#Va~=1DdC&)&VT_DG};HR5#w$+I@fMEy%e7MpbZF`J=&Pj#y8+ntlG z>A$kThM<)V|ErZDSY|RFrgrr+NR=2@p) zL&AMvLx8?CT4W{7d&+n*w@HgLGbSF&!(X1IA6ZVyJ#P~9?3jxxhYt)efoEpsJ;Gv8 z)(~R`A8=6={V)+>G$9%dz%Yw^VQ_zKF+;UbT$dY}4!-9HKHIyf+_JA>U*MJ*xKKl~ zkBMdlF0UJx{&v%U@GpJp-(%k9{rlkXPzHFQKevCG=g4gfW;CDPuLs&>FUj@D~u@^*IT2YV^9x z&+R{rbkecUoSEPUw^@~Pf9MwIcM^RkdB<;z-NhJ>xe3?!e2%&voy7D}!vRG3Lqy2s z-(eN1SRhm)iVT%$AWEBXp(=hRWg*ywZrTp(1Is9(YJN8m7+vgWcV$<1Eh7h}yqT0m z(rxIl#LuT3Pt{*_lkuyGgNaQhS?jh-f5=W`CAH!L2;)S0UZq>|_u^N^=mTD^8nj4s zoaXPjiuP{5uHesS!uTDZL(5~JZ}wRItg(-l_J`KUAaK4meJCXjXRnCq@B^r#-Io(y zoj%)%SpGOAf6IAv8Q>lH7EwW66!_gg?4zJXDmG){8R-N(rI_H8MsjLhGOaYB+uICc z(LYB%iwPpewKIhgK7fRBZXZ|3Ebx*X+BEzECGkvfw(%k9 zYMm^$$sIC(tanTz4xOjhDOk!lHxzJN+n}PxOaBm@}d{=S3?SOly&-Ji2_&*--lAG^7=IyQNBB#3pe9@uoxv_ z;e(9NOjP({ad3PV$JNQTZEsp)_|DI@9uN|6Eoz*?Le7 ze+wxn@C=9hj_shxB}#ahTS9Eqq)39tDdvdU36kK#Ch!JwD}}9EBM)L|w4z-R>MH;d zek^+FW5X53l8B)K@}ORNQDqgu_XHXVjC-t>OSdeX7psg-*SVU0Z3kd(I1XH+45IDp zZ`afOY*O=JaBodw_O#u6?h%-N;SYpj9}CmSg1s=cQZoFhC?7f-1@g8|vZ~OpS{$H7 zW|*mh3iEep5KQ@a3M`!<6gC5LE!~)%J~00zpDzY4YY1XCQCi2J!7a7hg=5*18owVv zGOgc1zogO4ByG}-)GwL^2gK`$CSX8IkZiqZGp}xPD02gyv}ym()wxKGAYV9kJauxV ziTH$7e5NrkngaSh0g70_eEr*1QQw{r09Wv%jMEW#a8v^j(jxz1E&LZa8zJEjFMr$X zF?UMpKhqA%z`aF}RT77n_>Pw{M4&)9Fpv(sy1o=6ihtJTn=IK>s1$hlPbNbB#KG0rHyECRU$=UU5gvLJCE8rt8XSLv5*Dn8~t zF5~%?`ev%!WIX`@=-#KRoC!VzjQfjI?frBfeF-Az)P?Y2`aDAzt#_*MisI%5JwDo` zev7ogRFwLCcy~-=1?NhjJO42;kysmAakG|UPx((xpY%I?+!-`9LSlfiW4y8A-&KbX zBZ0S>Ta^+%bicw^tys&i z)JH?DAN_nJ`E7Un9rrFUb%-}VWCp{^HK+m?WZ0t%DQUU3mEP)8Jr9tXmA;r@A;bCl z81d{mgNs-|OJI5iQ9C;dsq%(>k>(zjJ0B1>Uw_ALdIKtfWzRq?x~7(b098P4}1Y%su8{4Lqv{83Pcb*GYaI0poM$qoIeKDcdHD6T{P*;9zTdShc1k5>YgP!HQ|3QNf~J%YXFAb zI{)@j0vZ`iJXXN%l-HcINaqDe)2$dUV?h$ohNQf|1kg3&HBQxyORu*3L87oaX~F0b z_!-MvgxhCIYo7ArvaBmx7$JTD4W=(mpOyjKkFQdx(>GpVU=PKS-nRldQXBLUBIx1o z=MLd;q~i7-UTE)!Hyh`Rd2fLwsC?@QdfR`t1!C|)_nxM|o@5-A5y$=yr6*=|B^!Y@K95eq)blE1FK?c$=i#j%aZx#zbgh@T%+PR zhR3b*+DbsCoVTA}0A_|QB zg&4WrAwk$EdNX|-$Lbu1?O106Ugg)R zmtq0~lO_G}bxS#t$jp{QDDyljUHK$zt$wMqq`eJtqZ`}6DR%k8%=_NKaiL$RuTkdJ zHILzCHrxNQqezfI;c80HanCh73o0w8?ptL4BnCHCV~4>zmiR@rQ`{=69FHLjod>EL zWPbd+N-59iR4aDq7Va5!rXMd_Tm)2BR6nT9;)E6YQ09oPv}ao4k|1#7EJZp$-rRwn zOcEgJD;aHOLvqBH{0nzV|JBWqtoAw4%*gx9uXI2gB7_toVks|S=~$zJXo3#iSC#F@ zc);_>Ul+cJ7<>-@Yt&`Sa&)}3)d*Rlfeo2EFg+T(Gt=YJ;bQrWTuo$=b;^7Y`*BGU z;vCf>weMYe%FYgUcx`q=%!43gHGKf_fi^3EiJKHUymFvWGms_K7^BOO*<2V*L{@T- z5RC=_Q{}%wiYsBM*Kp*c7M5b5YP;`Cw$5#g#W{C&@@`d}!WH{pQy23y&ZiK7gOVD? z`cNYtEZC$PdO1v0@`>i%v_}%|$n^<#!chUnuEeM>nw7u@iCh_DHvAU~)J{2qsBKxF z0Cb1d0f32zQ$=vcCsBEV42lUVLQ)-hWPn+5%4i8o?sTP!pZrbu+1M z+T3Xm?Mdlx;w;%dTSH(99kMox9&m4Bv}6>m?OMQcY*P#7v15Sav~BW#3K&6ULG7P^^u=+ zc@V^zki`ZZNA)BWs1Anm!KHq$J^iuno9e#!;%ZQ|5<46{LCkoq$&j--upOHl!c@=M z=)k46+hfl%(ml{A0&fNF>}Q`K)o3OS^h%Zla)_F~Cy+&fg)C1$QGGc&F zka}Ev)W~F@Luw;e0^Oh1hCjjGqT;YH*^_7gDg`SLo!ac0otA%(CfIOZLv&`&S_(_!TSWk-~CvKx*wFm;zQw* zbKaQVAE?J|mC-MMCN^gUNiUev@2s9q)|!=0!!p}u*T24%x?g3<2etX!YliEmt0yPO ziz@*dfswYy_XZ8_@jW6=fE%sFyr1bM_#4=YlR_E_5SmaEWdr>T7|goO=@>ANITC>< z6ONvztF;#f4*H&Be zsR=XwOp&iNVAyTGNrEPS{K%cuhXh-yLqu-#Pq2EYU z`oqo7^P2j=kw`P;lNiRak1dpId3O1$xf>fTGNOjPeMev}5DC!nNRZXp_5Ng}>NF%$ zX)YdM`1>Xz$HnzynHGzoTcBFutwmU7eIgbhPOYWPk9BqObCl#j_#C!abev zxTp-TFix)^dpWHHSj}OgqmAf&+jr)~ihGK=$gm4oQqyqLyo+_rcjZ0LdTa!|GyRo` z9VnP8DLWO&^WdH|Iu9U;1A0-Z-&q5-)j3x%@4H%N$)| zmh=hniz|L?RqegOC-|}8(J$L#h2i)=fA4WhA1%!^dI&A?6ZI_hUh0P_)Vfn!5lq;w zfMlFj_|k+j)v|cCsUCanXvJ7wbivyl2?`8mHA>9K%*+(*c=-sz=bvfs-Q)W}tO$c8 zV|adYf4*@xd)@rj>@3xJpa~UC({wh?dsSL9Zs5J!)Z*N4u)X8GSMN%>p6wXzO)(%s zX_#&;Jm$3U`A|4U8NdIRv5@)Cm*czzZZ|&e;%su|H-Z#Eb=SAJ;O30=jC&7Qn5h@0 zv6HH$kUvb#BP*zubEHOiVTW05b%?*b)SIr#F1SC7Y)q(;Lac(gRI70n#iEP%^iT0TK77Fy7j|d5r5Zzx{E+sv5Cw&GZ2VQw7rnr4NkoU6lJ+?-Rio_~< z4>4F-Vcynyi3UXnW|IC86O&_aQzSWTn_XkW2?(T`N6}^_LWz14Due6L))rY8%ge(xj*@VH?qXN>&8e$$Z9MR1grUWM(pfpFe(7*Hl|5RE+~<7%OzC~N$Tblg;LypaNU75ev^ zfde-a^_%2;Lh5_>TzdKn%kJww>q1(P#7%sE4^iiMkNv1{Pwys)G(eIz(^^r)iETS; z%A;S-FJ{?wzC8c|Rw8=1PT$7|YM^)SxOX4BPJ)}7diDL|?=;>)X};SQp_Lun4gn+X zY1r7r1n;uq(hKn3u|OM@J$`pDvVMyiS8g0j7Je9QEr<&?%%S5_M*(9oEB`aTwYtaw zB!ZdaH8wT@?jL4W4a$>-G$uzaiAS~$+>w$2d)Z6bq$j`00{m!@$8W|1O7Ep-G!QPi z;$HYgcDaG+4={koRQ?9l%ap*1WDgRt&$1vD^73bRQonXMHPH+6gd#Z3-^`p#g0H@N zj~pNjj|VDa@iqt{=>x*8-n}VyYBR*bTbPIP5&2;Kw_{ZZ8?%NNC7BT2A3jt$ zKGI7vh83F?PrHzaq=};dWGJ_%IeXiExH{={HQMLaPy-VJSIaQ5V*em2Z|tMM|@6`m(p8zY&jE_O5CpjW1qd zzmr)be)2O7mK52gAZnSUNH#<_AQlFN2~(m&9E-Hg)J6x>hXde0m!&M&cj#1-dYm>Y z(%4>hI<08hTfsUZckOP*$?zCWnA+K8t?$qyjA->w&w-1y;Z0E4mno{6z z$J1tv$uq`x@td7j`&L_nd(eP2+65qU$rPWcFHC9r%>#J%$DYBS)}y*GMl&7Z?9U1+ zw%VLYO!cif2t+DCud4as(hQ8<1zY4HpxSsVXRlE zip?O-i(Br86{n7xj%)5qoBX)0qB-!{!82+2UElM1vjYx^p|y=TP#pbZ;Ly3!skyCs ze)SXjL@c;+M8coI6<_vnoQ5J&HKWZtOFie%Tud=OFxsF(p1xtCUJ2SRkSQWT0l0*u z=-pwc4KhfG#P{yiYG)t@O_8hu4Ll^Oze`i2$_>Q)CJD(n?R=9^Mq z^p<~g4$+FbfDfFv1+n2?jHidL$ac#OKJW2`wfhVikP;2oh-747g34zI?V0mLvF+=<3-ghDmqe zPj1d)#T{WAj1!Q^wRGdpG?c$M{s=JI*}mkvl}&a9{>&O5;z+pH)yISP3v?mKD%ZYm z;2{9km9wj29<#3?u(9_7`~yeeJJ@-QR&cd-x+1JF0S2Yyzp50mmM^Jr036XrKc&8e zs!RD4i@YlMwA5m}uX4H8Os zV!{T76wK7bYw@YJf7otQAP9sK!Idzv0IVEGjLUwmQP-`{8Vhj1wU^wx3V)F7P$_Nk zWtEzK+q`(t4NQo7N_0YJm?yp&8>TYd(IA>u9f_(lae$))V7;W|`n#$YSg7pfxFTV2 z_1DKI3--%C#^=;Ezm{nzW-Uzg-HaQJ-Zjztr9tZY(_*u{Uj$(0;Xr9Z%;7dOm1eyZ zuD|PR0R(;tRH~C#+mf?4yUV=rI0n7r?98fWOw1fXL<4HN~I(>PhrceYVxZ{*TM7_Xed(> zi0m0ffFgS^WmeJZ%|E>1DKxmpoFU`$jt@J)ZS+cRXhlWS`t zbVM$tJ66Y}vi+*RP(wuH?wl-?uAH3nw%!WYnfwKS6hKo>7ri*+GQM41e37>?BiK6f zt3b^DsG#}p(MsV!wv6xU=+~Rv)d>|Vx&*obeoLV#a8yaRqk^nW5y-t~-lx|%2G>=d zxXu({aUTu9yojue*ta&gv86dG!VRJpM5}6?Jt7pQ)x)K>;6;h+pxuUq+Um8(g67n@JfzH7g7a4ssnDk!GoY_)O| z$7)!uu}8uiEQR`6il81dTOS5c_H&OQ9DX>+f?YtN`xiOIs90mH-|@Mp#AQ19e{jY z?A&MuI2=XfD#5S7kg*quyC%K@s}tYP zix0c}j<#}?lPbQ6|JQfn)a717x$+k67o1j0Z%9c1+;3PMbqnHf@`(U(=E>~<>vfoS zjiJnyD8^jBTT;E*rnJt^^h0Q^)XWLk0N7|y?Own0BQS%dH7e)kyDbkgG61(6mBp3Y zkM)A1yyjNMFWdYao&v0u-Gvg?r3BzOKzqV2eyLFpYr%ZD3q z;c#oQB=S%8-?42D8bCRMazl220pcXEnMq_|sz@%Ioct>ILD5Y#6C52F`V`TSw$bIb zbo?%1wz{R7P0w<=n(f(t4~I*8aKBS@J2zIj0XBW>)1{O%+!{$a`*Yy{zcmq+4Q>7l zzwMN`#NYL9j0f#?n={p4+2x3Om#Wr2Z>?_F7Pw5 zFaZ~?!#7BG_q~}5R;Gc(;$M8*&`6%6ioW{X)#8izL1t^#UcYpyLq-()Tj>T02W{e{~*@=Vpluikn4=>I`*_z z_&qM~bd=c@#_SqrtC=g4%%UqrJ*`+(I91X|#Z<hCp5cT1ljxXp(W70?oNGF!K8_&RHLO6fs|6hh|Pffn?eI4bks74AmjCqu(rLkkKD z^8I%*rt`Bs6H&}_%yN2#Dpz5vcIRwAs$=Q%+2V`XNV{U_!~ZwWDSQOFe&_Huaj+W(b=tZ2+;O@mNa`%vA#E*Zse5($OClnKb-ZT#=?4s6Q|a)Wq-ZA6 zTjyttGAJ;JLood0P)c=xumskcQ- zH29Vk!3Ok;9`|85BIlYM7TX@SW%)payDTetm3!3cO3Gav9T>w=*6QfqA^BEsV>8bFbSLT>e12XxDgS|c^` z6fd5n4rFBdeA&8^-`x081%?5MDs&#M{`x^7vg?{WBFk5s&!(W9rk(f|e>+F%zlI^j zn+UAg;3yu=_^}vFMtZgWOmmt02!a6Gt02}$f3Lx88Lj0=C9U^m?6`l3U#!Ba-oO9G zn0~3#;OSI@uj$VczV=JU@YQ%}x^2~z0z;vrwC*dSlm7-Q%X6cLW8)$RUC;cV?uc)0 zqeoX@0r-hJnROE@LE2+2mx6b&f{#b>wM6a61@k)1J z6$vHy&U5kai!x&V?x07Cv#emC)0Ni^f`~#u15h+B>1`?gk@)jlp;0aH$&XThq#EhY z7c{2%lsiQqOrz4$TQum5>~83Lb8%Upf3;;99TS^{gxG+b2U}^&^pO zdf@)o(y)M9J=LBOi%o~-&-vA1j?=+-#B#7D*QZg(_PiEiga2%e{>s=K&to+o=Vwg2 zaP5rZ0H5i)TPT7zaMtJ*5*qKdpfy3SX6w8=$!lz%9@;hV+X3NwZp z`Qv8aBrP?v=8_CdO1~!Mr)&%Uz#nw#*8^X;m+50B`xFv6dWQ2#T^QD>^b1POx z^N)BgM?R%9buo!e^$q>s$_*2`U18T3V#ASo>n?FK>jzbxG_lOr99yW{pm3jYoaP$$ z>;nyY-gFxnctN*f8_i|#jhS+a6P9j064#QEe&Z^A5eib4AyfTH=~=&R>&CRd8gAEP zs8#z4-b571T)3;_-qvVQi;(@CXmingfgHGT{tKs0S=K@u2=MuIQ2;i-2s!A=_lI97 zxp;WQIAjEVHMNkSzMqDc`s~Ep^|rcTq@ew)AERyVe5q0~kzsAgnu!%S<7m?$Q;Prn z^z!He;i;C70w;$>+WGhIj`6BoElI@mlT0M8Ez zuFSLm6*^);yfUh0xQUqb`F3{*^?IIY{)7Toj0LYdF8*Vid_^@K5jB;@oo_Rx_T#7> z8xQ>8?84>JeQAGc|7_qC-T4g#fDO3A&_plv2Cx^#VRDP}m;&Rrem0UD0TATQ%q!>~G#i)sPtKbF*hs?08&(f4Q$^=v(7oDNrs|(PD}L zTvZUmLk#hYrMgNC@sSY9Mi9{Bb@s!sy<$AFICM@d2u)Ct zOZtI!-Ln8&DgB&ULSEUU)0x{Yd?<6N!+-R)GXGLLs&VVCR8rXM1=2N@lf7Bc#_C?y zbUH;8V!mQ3tO}MYcF;xc+-Hs*jmLM~1p*@;JRId`OVDL!v_5-@J?3AVpLss6k?g)Q zbeo!t2Twvl>31OVWwFe|g@DzoL&f2yD)Zl7=I>>y8b?H=5F&7Mit4GGv+6XBX}x3aaynS6@F2Hld($>qO_`%)O{}0 z{X9H|sBLlHcT`jBrrH_bZtw~C>iIU`xd+z|w zaIjhFT(};J?3BlU!8s;Zwg#=Aa*9bjt9);MT2NQbBxm#aQpB%V z#uj{$d;8K7NJEmw2N$E=@p*jIFM4+rd0hLPSTxd5tr|~*%vdhG30M` z%X9ud%o(0}5+R`lKj^>3Gk+84a{kcw_Bg|EG@f37R0u3DVuohd=D9Y3TTYOH&Wu+A zLbA0`v&bBAOUmO8_ajOAtG!bCXvbx=KN1|{OhHJ7H@zwg!dEoa{_sm;$`Nnyj5NtF z(U1AOQ{xu|=|OqcrlSJ8C;tA?adWlPYLBG{XR98K2i8$R_YAw>15XwwA?1pwwivHRZHpYQ_nps~v0;1WgRdhijW`!>sJlw9=*a71Xa8Inbi)o z-&x9WmAuxHEaqUs6!urb_rixnl$6s!zK-*cuu(ad4W_%Ai>gOCe`rQk z(A1v0JTuH3?hzc&TDUd{a88fIhLv6F$-2Ax{kr zs)~2C_>1+Z~#9+cHJSi#4~_XICqllVJd;R|~B*{;2Xk$wbkLS!ik9~Qy`R(lgwCPAH>Be)tD z#_?(iy?3tt79DQ?6WTW$C_t;hf6sHCqRvA-udt_blt=h5OKhk?d9|rF`bN{T$k45b z+%&qD-y~|FwG#_2w)rQct9~>)Mm&1qujLAn4~9xyTJU3VsI_~oi0;+G*|f_S-m#5c zx92XGhf)RJyCyymf7la(AB}EC;i@f0;9{tXI1)=g%C6kfeTh$H6+7n2vR~u7Q}$Bt zrc!T}nAhgeF100KU0O zJHk(OIo@b~$|qieux5@6CczKmG*m%HYH(`pxkR1d>lfX+`k{p_+IvCyO$Jk4wRbJ} z*>ooA_99O7__BNXOZCb`uwk@mHO>#|B8hR6u6GYoFO{d#PMGzo#CzkKPN1WIj8& zC`uiFk1?5HQcsjl=xv!XUK=@U`)xkz`q9*WXX9qMJ6(&kP|x&%#EgQ&1e<+&%yFyG zVM#&`Sq zTNc4qsl(&)@r9_`4!S=c4^o$k76kK=%#@T}2>uX>mJ=t2k&Z%N(G?8IedG&ML)-90 z{ZmL3q1l|Iy)paLzI1&@P8kKU-2acgw+xGFi~B(L3lLSvIid%{gyavrJ}(c+48b>O_KoACMKmvkQDNM2r0Y{U2yrBGT6tWPBl7GJYMutg6P2j?a~EF&bPXfe=EbV19EqfPmQ9 zoPI0l3&9;%_QDA8y&t!|AQ-GQiU8$fA;>zKKynR&o`Z`!1lPz>^jbbY?G#K)Q1Vf=+`Eh&?bw7%*S zCP(?(>D|%0<_jSn+;xgC3#vlAk22BL^oHQ(HU;5T@C-doEChEo!auJf`*7KX5^t9V~jQij8S z{D`k8E6GoL6(9Q0^zN_wUuV}g7RGxUa78&OuU{p_zXAOvc532|Gv#XUjVP_aKHNN*wWhE=$HR7fb9)% zKPt4Uu5W&2YOrOdtPUr|wxtMsm7#N{Mn^@#W0*Ypp!e*94M0ay8`3R788nxB>&<7M%4=ERxJuC31u zf2}Sp%uapt=5=!Xi=amj|HsTbs^9-_GbcVjwYsr5y?^HaO#C(kxq4K89S0L1`#tgN zzn9LKxQW4jRSm-nE7L=N&HTPoc&V!q*xHnms_Lem-md1~GY|B85}x?3vZ^3f2P}PQ zRdJbD6=ii5zWhT;adA;;MJ2Y1zVgGH=SJZ7(~IkRJF3b{$}9cB)XR%flOi76)%|$` zOnmjn@R!QscUc+f>1io%UM0l@W9*4r{_FlUam%}#J{IS`O^kW|`@Qe#61TkgpNY@3 zRTYDUN!Ujc;CTYLKeoK~WBluX_mRJ8#v3~N>Fdbi>dbKKf46_#HS~p;hUS(g`daqi zvaPaM$X$mZ1o()6kYwP3VLSB*Two3WSwq>)tW)3*Ipf=kCMqh>N$?p7 z!TimCJ^%xMF@yghh$ImPk$@|Rd_qtn{NK9>D3Rp9&%`gb^-r_?dnk%CY_|Nsdu~m~ z37wY??~5IZwc)q_w!4=XyO#%? zh1ZTOoa+)sadA+_aw!WP@v%Qu)c#B&-Jv+ z9YEo-=wAC)Xk?LX*&A_f%;KlRj(z-D30Jk%T2`qA8Wx>YU2PiH!a_!Bf?_RPdOrI_ zJ`d+rJN8cHfR1RfXP>Dtt8M>eg7u(czEKFKXiU2Itv%x@48ez-G1z=}V{yc7?meS+ zae)%%ty+SoJ#eITI}}DEeyufH8bJq9z?I(pTz0xcUf@In<6!Y5#*kx@5~fR|bsCLF zU)s=YC_CVJqu)3*X}!D`oDuiKyvR0Pz_fefL4p8pZ_&{r>(a3kkz>x5gH{b!?eiRi zp9ROpWiO^2hBF*pdnqxTDnJ{jJ!q>GfMlTFc_CZm+0|p5Qy5z`SLAfj!uqvCL}5kk z8hienTh>e3-uwQU{p&j0>>ohY=XF?R@NwyXh=N%jf+b#SQZeQLgwh^@75~u|%qo8N z9?eVFCjZ8y@K*xqVuEHoVM@x*mj5L-kUL>{~(}9X9xGUmcNS@WzTa{^!|8S zXKU?2Y;c>CKw*oIuWXdQ=Vm;pHBTt8=K6;K(F#MMvhY6@N;hjTEt=K7UKJ~WNIU@h6?WIJE5 z?Vb|pG&o4XqvJd<)RYAdSPjUa!p;+0w zy&oSPC?*!MvrXLl+0~fu zwZaexgtZ;ndK1}p%+<|VEox0Y;dEAwcD%8RjC*0qWiYpo2rkH3_#@A@o{M&+SCP5- z;Q3e@R z#&*el!`$!45$c~We+f|43M@zi%tMU)Ue$_@>!M&0b55@EW6wAhwJh+@Tl5PYWK*s1 zbC@jh{1D|B;i)umxaDk`zGE(Nz0l%dck726Z-TF)k#Q6qQks$*DXxnxBBq0G%S_p7 zVD-T*SH{*18m2Qs4B`e=l;5;Gr$I`ZThhSIDpw-IKB7lMN1n2q%0h52hWCp#EKxC! zFk!As0{WSb=Q?=%DBCR>{~5=doKIrtL<6&S?zg4mF)!@afAoiR%}|TXVu|aAvVbF@ zYv%=@KSK8*h)Gj*2WXF7tg7+Rvl>|v%=3T$q^UdV6{cb=`hI78&p*@|j0o1!YSB^k zXXvsG;NiJr$;fcYY?*qtX;I=JI876scpZ%S{QJarFxT^lgGII@5^eGB7cR|p6u+q% zYxt62@UJN53&f7ITzN&xMfIYK-*AZD?fLMzqTNr)r>~X}_bw0xr~q-Z9*CqZ&ctIL zvHhDD-QJfrQiQ$|*M~lb9bez=AKdNtqI+6J253wf(1T$SgGD0joGrcwN$EDS}w^NR}`beMO7X4 zLdXd$q&!2Hr7xj%iMF7?)Qi2(sn_~KU>V97tj{o!l!~o$so)-rLT@lT<)HpINu1s` z@4(`zCVJ<50l@+|?}{!TuMFxs+`hD5D_+?AdghVNHGK?AFoK)_Z)NKEU^(0Vqq_9i{^pw|Ua-ahT@HcXf zB5q}Ai?n!FkImvXBieEXcEy`gB@3;XVd5k9ZzUVNI!og$2FDY6tsPQyYd_!T{iK2? zJ#d(j>&U%)Insaw-PYQjYfio2-^$N1E2G27_qvv7XEEdKvuorNTC&2S+RG6wmMmv+h}LD=7K z)_pts!w=VL(3wI774+yR-DD)-=i=95G;nT)_diN!nv3pN&7U3HO_|NJ&1dh+zgl)N z%0dh#K4U*!7$@#9e(Kw*mTK8rQ@rE_>JnSA)9JKcmE>1YT{sNpS6M~iZFQiQ_0jiF>QW z_Kge&UKHltFNQIl_J-6_gpRkX%x%boK|<* z?%FyGDbFP$GUj`VH~Ws2BauH6n#`Nq6#t>Z!rCLHVn6y#Q0&M8btWUO{Xnu?^XHKnEL`KRdZ3=a=K*eMUG>b#ym8~)Q;2HJ#KA{QJY z8a4^bIyK){a_(gmN;%`51sd)u@~N1A(A*oZ`*6Tz!hs~Rc8bpIAXuEsBIlpa`C(Ot z9=>CHST4RxF{f|tl5Bh(9Dn3cA+suZPoJjZk|i)@h$Qu$GqH}Gn{2l0-SO@U54X~G zJGh5QvsY@*mN_F_IBe+UA$t1|Zk~w8=`Lx?1ArNqc&@q>9?u2I25Ee!z5aU=$W#wxogF~ z16&I#Zt)<0^@7z8h$l4FBmBBo84%#3DiKQ-(nKTrj)k9|ZQwiCtwHmdHcLaX%fWOn z&Kh6MGx+EocFaS3qdrDA;g^{^>5oM~)a>dJ*hmJ_BJ18rAlz~jzKf-3!)s@c&d)db zd=P$!ZDLutQ8;eri1d+$V5p}~_&^3^A2^V)VeY_Cxl@`BzrK0&!`$b1k5;A0n=ba# z9pOarK<}@gFz4^l`dys;AGjdI15=UXJ7X~OE$g@}1;|(Tt=7{#KVHI0N99#$QpfD( zw6QZ+JecjsfM8a{rc7KGb#plBF<00bZ=7SHaT^!6SA2Usp7#A_zR}8ILA{ILXJ;JU zegOlt8DedIFd-0rDZ&8cxS5Y)9mRZ1POghpXgScfp+~n?DEHnsNEyPh~}~9zK2Ng~Z0Onw&S4TR)`-P>>Rg>Nl`{bY_!S zQ+Y~&M-Os&@yh-7ZwUVt{j*ijCTZ9N|DN*(<80K_`Tv= zrsSG7+$dB1=JLw*j*J}c;q9!54Jxp~5d0nEf*DMn+>FmFQd#22t&CW@g-mi-aqP`N zs*QL7@-bvaKrYV#0FA`auOC|=CmlW3x@Z-8A3 zc(Ht~@k%J2gyJOD;%EWO(;sH@=5zGQx9*{w49O5=oLESR?vm>1SiIZd_P{y*GX11o z_I!86?#>BULB>Q=g7G2HvF_)FEpei*p=FWoU!~a=bQzg8aC z-0*~>TMoMVz%MLoh!DPkt|Ak)9f%tToh`W)f>}?@x*oiE(ktP`k%hx+cecbCNs5A9 zxh`E2Jh zjg9PmnjvMWA47P;giFRMsgIt3*N7cGcI;SmkiIHTuQp}wH~#(3ITTJ+ibCDTk6#bW zcsAT&67G1<<74BNa1Iky&i&lS@7nuFnCNrk_olwJ5u~@h0gUTh8}>TXdWfP|b7OC5 ztf9@$(|0AK_Fox*MK2>iZ+5=+ZjmDFT#3MP9=PI5?~K2?=fD!P7!6L1wbV4!Ofo>O zprMqE1GiZv#JpH+%N8AP)z=CT%ErVWMO`7+g2!a4aqLWYOM&#sw)j0j2PU+JZ2#~* zSee%de)u`IvnXk_ELlYKo!rpakz9G5?03OA1RKT!o;jhX)cFvlfPq@M`DkVm@Sqoe zO3%~9^S8KUXmE(wlb|Lun zY{aqi978Qx)l&H!@LmUj=t@*8DUj}`QTMN45d4hLgTp>F1Pg`O6-y@doIi4 zXAJeP<(~Lu5<*^Q$en%gTdOnS6Y*}R#oad+UQF2GClSgB=Po~^K8tH{n8h(cjLZ6@ zLjK|3CVc`Y+7@%E*xO{JGZWAvX2Y1r1r2rN!3j*%q^H8oB>^Z?kXxUF|o@>-vZv#rb=&)Fm5@lIwl4FXZ)+;%RI!)*`1H zU7{zwEVD~Y0?V(e<}7S?I)Ssfk2N;8A(dlA1zslUH&?iBO*9T0BU7aB{{DqRUb}^% zk1Nj~F(6(@CC-ocS(xqxP}6RV5L==t48F1BM5qF{#?Yo%S>HtQS>Q>vA zv|Z=MQi8g9i9PTycH45q9e^RAA7EShK#%pPu4*pa-2_6Tfl(D*t)B4s+$XGL8#OVkeYA@#bq;<(*ym7Q_xml?h zNT7n+L1(6iXRiLs;b0DvSBN^j4zwZ;ySTS8QU}ENg=3uyY}<1#s|0b^l}UDD2mW5> zX7A}@I()b}>}y0wai4ud<8g)H9mb4#+`F>W6RSUp;_bIU*T*o`p%=8Pn9X zv?(K-Oy6;!G$^}y81;|h{rPfR^j(FPouA`iz&V|zPa61cBbRC0ln1e6>Vv%t`QJGS zM}N*bhqV^1!Q=%k5|~ciEgUN$Imq-WZO!jd`xI_6`3Z79Bw0QU@%v>bgYdw2@^usb zEnBw%;VqbS!9w;C;a;T=Ibpa#fA8$MlWR^FI@Zh(*d9?`g{oSu_k?Zhc}$VJQ|&9} z+^QQ*qnY{5S5Jd1STk&Em zRUppxT2(?pF_~Efbp5Am+@fzL2e)_C!JdFmUx|F2-l1{RDpfY`!PM8Vfjy9xz53wN zfqy+&Kt&1rU zLrc)dim%8~0VuZ%svlX6%lFvN8VNUJw1h4{H+by2EfSr;N=QmdV#xl?{V&iWikyYB zUZ5#4H?8D~dJJ$TZ!ZO#WKIddaOaHcBM3z%O);0%BGlK%FGHz{l-b&a7QQN1mlRBX zbcmc0KYVU#u7&it?;p}@R4#G&8jSWxjecPO92do?8hCoAdz46s~l-giCzBY?*<@G(xB3;J;DApIpRA z&UbPs+B9C#7fTfSTYcDqhUtyoL(~gWR^5*&YFpoeFm%y((D3JjGYD+rZ1q{$$y>|r zs62axA?gs#JNM=DoEN{}X?QF2o74eCMyQ~}pcvtWz3q855YW56HkR>zV0|`vFG_%U z=*!8|%_45c0b*jwNe($?3O43UEdkf%JI>_s?qoy4MHl;}n9edDm$uk}h{iba{Hq%8 z{}U--i|lz(6Z%yoKY(YFr|jxNE^J4VrG7iX>KXo3N!4q7A8_N2`q}4tTR9ONvV5cp z-8&4peLdC|7VMU4&R3i%0ld%f#2(puJM(8C?WZ+Ehs9$NE7N%1cxTSd#Sl!K)j*jG z{;Rjtu5|uFLRT)9{eZ2xEVUezS}|N3y-a8@sbSX+E;{Ajoo8HU9HkqXdHWsbJ4M;_ zlwi_7X`e3|59)&29%G5M3SmNY<`On7+ZZ!?98O6X?JV$=_m*L77Zt&@XEvJ9CbKuF zm2}isH)e6yH|dSRe=F+6%xL!cB8*mxao1a(q)&6?ZD8{Q1U4|HJ&q6(eRfUp!%keF zGT&?-Bd@A5I3%O<4dXV53TNcbs0;m;Z(!x7m4_CFtIXxF)vF4tNL>5 zz#(e8?a9b zK>}+=xCFRso?&)sG0I#NaxXj$WbiG(Me(vl?sl>EP0*RXdc1UVJT@oy-KB(lrFh-% z#+0}So@KW=OZ|qYd%of0zqLJJoimJLPP4a{h91%KNbL;MhLaqislL@Ac?h`Dm z5RP`a%jgo}qMIAe|*gg8F)Y~+Mh^o412_ZUPFjg-1 z(ouX_w<+5cZvg}Vf*NO|CEc9NJI7@Hq%$nO0WrE`nT#$M83G9cg7c~KG3Joq-XaLS zdd|eV{Rl{wNjgso9E1Y*a@J#QXqK~X&9;o)dBFV%p!=Mw*`?Fz_l7HdpWjJ%@*4vD zT*Dl$TwpznUKrd|T>@ohyyIw`y(zU+G+~9>jj__7=%=$55ysu(IS!3>-T5|yYY+U; zzr^CeU-T^5&)+{hVJj`+DiI!C&2Et=#`*u-moMai%fvU=ig7P55_XnfvEL3UXK8F? znSVbLyghAbBbg-!eNOA2Wx_;t-NQV*eZRrsWZtv8Ce3ltWn%)iibP81rr6!59U!WZvaf1r!a{76Lod;I5adOh@0DXaK4JUrIwM3j}=b0)h5Od^v0-%p;9 zVcgNZ|A}b|fzkeJz*P=|mtl1zv=>9&3EP7?+bkriF}ABZqT)lmGqSi#k(>}!*RAm# zLQ#Jrp)N2@paC=!K)G!94#uah|29>L%mTc|QCJ>|ogWWzv3(fAu44lGklO6(2#%;$ z7+0->7Wi|r+L)pG`(U&RaRPx8(%Cv|XlBOeGI3!rx@@Z>=f{k@>d(OE?{%!?0@jis z7x5gPXTS~NYi@A(R(I%V4zVFeIS-t5`nw&?lsC{hheNe#K?GEXhh5x$w5@1YHfwu& zL5pKgQ_sctr(ld0GL&IcuDSf*4uKy@RDgfeioUqgDmx|T6-bq8be4X|lM!|+2AP`@ zyykCm4vr2HxO;B5B~PQ`-lnc(JahH1=}X63OY!SvywMjP+R&{T{D-lK3RayTC^8zZ zLC{|#9F+QIc2P3jC=GyEvPPDc1U;sdVkt}Ii~{AM$)vQb2~2Q#!jg@~*X-Hh0u)W* z;<-9-R>-H>J?R3n%fAVU_?qr;P-FQ(g5LmCosH?c<4=JXY~h3r7=%G;)VFWEQUk5K z^ET&1Fb-;QVvEI2Bf4M4PJCo_0%D4rc-T(((Q_sUBSybJ2Zi8cjJZjTQ=wQ;;+*Rg zj))O-at3KWwwvD%qK;!9Z=yAjpve7P zohELp;~rsew=g{~0IF?jDd_HUp>qF%%4Ld{jmVu18o+Tsrx~c^;K!^JrGLcRY7dvC!`3Qf=>6v{O=)!NZrXU z&!nqFp0BED#&i_v50nbFx5RW1*yf!TVnlxYMV#nFHW+1!8d1zN0;f8tXYsfz8{f-z zs82LD+&XS-UEg);jhfUBIE9AH)BsP$0X;BdEuU_wR1)qb^j=_P=o<(A?CM$7W?)ZO zThTUOqWX(ej|*Y;c1A((oU27P{W0yv-sk{`=XR!R70WBt>}kGeJeyjpjBvb^DHXaLShYqDO;==%vHg) z<%xd|nV!P{2W1p!3?VMvKMaLuDuVD2UH-Hcr z)q22TYz~)oyMXT%EE#=voCoe+9Qs5~oez#ryDU6GD16J@Z_S?KH;`@XKEe_XTpT>n zAbLCb_AdLMFaf2m0UuZA6}>1Cc4Pq@vqh#)Nv)M@_+|bqy+KF-B!wIpqM(w4geK1q zx-Z{x*uxoTJUM0dC|fWMgMV1D{Ic%3rd}OCL04l0y>Fik=-{CGTqPpGbvkWGpDFbU z6w5m|-HF>(CMYC4>qsVSY?^mjY-C8ef6Qg?TEA+f}ay|?{HjOpA(srDkh_jZO$ zNwgk((c%s!sXTWN@7t?ZA^7->lrRVw!YbgzKQ^m55q7LRtTC^oeZWXIjbIOsJ67-( zDdMW~#`No6V^uEPB004^n_SOca7Ua#u^nY0zn@D{bPTZaFsqLAn^R>FNB8qWd07~U zS-(~}99y1HWc&)WSxye4ht}$G54HNGj!skOf{@ARBlaCsGwz4_{&~}J!OGt>^4w4> zvK@?{1;MNPgqDxN@# z*{GWOAnGO&_Glk$0Oo}NYjGu+KIP6LuyQq(DWv=pk#h;|OdBW@jWk z(@W}_aHD5EruM=>Se(aN_ikLh_&ym1A-s<#8WIosEsvWWvbrF07&{wdeHWhqw8BR+ zk?#T!@Fs0@k8Dtq=FgUF5YdoUiM?^l#C`Za%7wf_$*E{*d3n|1mBGoWbg!dh-nV`g z2M2;J8m(F26}*M>pjXLg$&#`fYjGPLI&a=yWjl3imZ+^4goo(5h?RJS^aXosC5+e53r~U>_ z__ZTN*`=5K&X;j;h3As~H912>v-m{Zs7Q{Bis9J0Ms6|$oK@o~szrt{+z9(!y~_en z*T&W$RoddgEewb}l8LjJT#5T@n8#1B1D=O^)Ul01(54yt=7PVJyY!uQwH%cKIG!5h z#J)=t(|oBnHeGZFK;gQ+5{Ha)*i(O+K|n^PVu>k8&oZ(p>Lry9lG=T*CQnHsU&3@s zRhK@!1s##{bO*~C3yc&_81_$lhX~UG5T{EgljUs5kSC1&V4pK-d+tCJzW4M8ij*5a z;L-IgruhU+rtw|>t196=Z!}dvlFx6XOZ+Gth8>_F#-c~_6Lzh7wvWL{BnG1Cb9vFIQCNuvTF`)AKq_*&;V6@>i3dqp8PF!?b;nGqVr8TF&II}*3OvTDq zrK#PPcOEAw_RmMki|Fw|VwyZ^4khR84jqu%h>5hm=Kl0F+@Lv599ISoGDR^H^T6vi zClc6w1dhP=tuPvO5N;apVschkIAXS&aa`Svk?fLH=AJHJ*;3wd2^bNtocCqeBRYW2 zE@Si_o*dgx@?YrGTee9L-w7oO7mBy4<4PvhVbH?70Ped8tea%|{jq*J>??(k_!BUc zPubm1ff56ZU4N}aq8&Ui^4sh-$A*oyM40}rgVegi7iyBnC*ebk2^-bMYZ3tg*33Bz zvBj%!jTBXtNPexarO_?FR}zpZ(bO}xoFbPV}V2T3&*w> zT0i?CZzVH8nO>LDFH>>|=oCGzBgmK`t%y(lM|IxZc0e0&B{dGeHS-y%4GGCTOIYe( z8>UqdmCI#_h3sx3%L%1|K=d5@I48~Y$CJd52NlqsZL+k!U+UuLb~S^t95z#OO2%VO zJRI~`5BrXc(6P6I<1=LGp+f@NH*A#bMfL$E2rlvyGT#G6hhhW5{ds%xO-ShY+um3T zJ=+FMW_2R`G;;dku3#Sk;1K_Bea*l-eJmLIHZOX}_4cA@ShJecS&I}KL zN5vQt-FwZJbJWm?3>^d-z|?LKAX_@+{eYnIIEr8nqQK8tzBNY`d`6H%UtXJWLhV8z z;!R$;7%yUZOZYsJX+Jlh)VW}rYDvoDr|D4_SU=9nKzwx?=Xu1tjRc)?2<^ z8+n)A4+Bo9XVbn&AVzT@nGOOCLnQ|gSj8kHR2#ycGeThd(?v{VL%x^jNjO%X7X?Ll zYCg692n-dgX;3~;>&podlPeEeb`x`$fAPmZRIW-)Y5gb%y;texriZkcVVUd_5BTPG zJ7>4&WJK#l7lF^vSpV6~e%(ly%1zwh2je}XOLIq5ZHnIo_a+~K4-L(&QU$cXN)IPz zxEYII{c9Q8y|FtfbUd&drg?tHtK*UxiE8YYiyNDm9V$o;In0yIN=CN-_2`cH;(-^- z`!Upd$A&{LBE;KbNcRglBzhQ+S0@udpAV8Fif0<_gA;#gs>hL7*FM>!a5}enoK5m1 z0;^sV3<6#UV5pv)6DL7V-XA|SDs2F~{pK4Oo&ZK z0x?MSbBd}jgrwPjWefecAO?tbV$lY0-C)%v!k$!!Cm)1lu7y3&zyW6y$khr7Jp9v>!{?3;p&p)? z*gwB(^j&$zNO$q;B+#psv@Ri6i_LhACSjW5D{l83Hz^prT5o&{ZqRju((e{LN3 z`5=x&J2&cHnm6kh;Qa|YLdap^*M_0ENKHW%NL_2Iy3l!NqYAB5zCYzUijEbwsgNW_ z@XiMsap(w>v3dj?>j(KPNuWjI6kv@BQn*y7*MG~JkBsWCizF<8#1=OHFn-+ZYT$K9 zeZ*Io3cWVTbT|+`6a*zp@0Xu3SI|ZT+53B+^gXp1^#~K|+5l~}r)h+T>WwAxK`O}i z52mi0w)_oejgWlpdw}&mD(~?wxLWFjUoU`TU3*egVk23_?YUm8^#PQ7_Tt63D{-j5 zSksIG=J>e2n+NtXv&Qh6Ywf)&in1_a#U##y`+|Z%$=>Bod^}53%pJ>u-==qMzm8%&G4g`Y zq$4)w0IC3VAuMp;v>%`tddR7?Z^uz5;h@>m-Q-q`Ky47qVdZ{d_K%?XD*IDOV`heO z2=!vxTVG^KhV{E+`4!j7 zV{lk$^A5--rM~`xFF%Wg8!}r8Q1^#VCdhGO51#w`4JGJ9mvO+7kvli*|KeURkbE-2 zSvO*txuM6I2rM}xPXt9t?~{_dho+@eidTok_AP0mI6`K=@gkrSVx-`FiuC0)^AQB} z?uCToG~boAfT0lRR9RU2>BkU< z#~VY+eQetr4Dxs!_53a-mCUx4Aznuzi4Sxzk2lG`Uwg_f zb&2TJm)Ndo&kAh=p8V?K+ z5&(Tp)O@iE6mfWd%cTn&b+FZ|lqxj0qcAm8Cb#y#51zceY0&w50Poi;Q}}ncY>vUv zN{nVj9!+L0M8`cb(9p_=xEj_b#!5~3w-o&R2+PCXsZ4O~*Jt}$6T}h@G9)@bw%1#8 zd6ua#PWpBB!a#Gi@WvRCQyv~ZCc{xxY}(h`iQ4|_6^NR=HG}$Zz39q~8k8B?1wf&9 zCha+!pw!$K1@^4jEyoW+^bni2a`|*1S!*9ed5HhYX^_Nr4>T3~DA5%&cfCH!isvr^ zoAd>&J*L)Pw;6Ri={`X@bihODIP|pgs^rX;g8DPM#A9neJtqZb*Ft5mwB)T)-t8Cu zX4fys&$g}AE)<)c>XW5h-R{7u7~Wa$GC)GFpk=xjvt5UMyOba?5M0xcM(5B`2}~tO zGa{C@p0sL{x&29ZbTqI{ah)P7#j3rTcCS>9Ui&>+)?_x-nWAC@EKxElEUPrlX}0Uk zQn%*HmLxT~x*WdDW%*gF40 zrpfJ|C8HlW!X9cTz2X%8=Kv%mDe80MTmVEYzi^CHCWpCNV&klXss=#ke5CLSP)v7$~?gK)=1-+5SOrLW{9z0IYusa}$U z^oex>>F!MaoD9OXUX-v#TA`t)k5hjtc)l0dosiw_^^^)9PWPF(gIc?I651QbPUxEY z8FdFkLWh!0uVoz8Z_cavnsL6o6LZmbKoDebYn3_Q-wMfCN@vb^B}kX%x5eq_t9-9%^3;?&!5IGLC2(lxGmsp2iq1en56jkenq|7FX!?4}R=K{r@j^*cWjM#!)ka{_<^2!nCKUsP73Yu}J zPB1k+T&OnvwY>Spa+{je%S?UTrTOF&IV9knX$-dd`AxOLptck>wfstZvZI|jF7Rft zk*5#hL2Balt(6dcr)MwTf!sA=20((UF~Vt9jPH;Aso0qn(O*hp#O@d_-F!fC2&Q|D zikO0>ox@q5(zph4Fnb)P+%on!n84ffc7Pq42>VMYS{wwPyd}OjUZ`$>M_m;a4#ixtZRLPzIe0kZfgSZ# z5DBVe%pT=En|2z)dx6Z7M^mS$xe>tW|0c7+f$h(IkdsHtdW>z<9-N-1e$DY|dR24x zN(aa&=6g{dXAgEah6T-uja#``r7Ju<1dPa-Hw-6FqV<`LxyfM+FfN-^&p>q)XCnXB z9b(IXUrw&XABek7I~}6ToV#5{Ave!PY4y(smCY$YpJUBpmsTVs#p_}^^f`7eaiLG% z9!T2WTZ5X!6W@t2kdVE^B&s~`vANDB!jHZNqoOu@@;K=CxB%B3;Xu{uSGlZGWtmQO zJ)2$!m@oy7e!7}rth4?AJgKJ-(D9-NdoBjhUQxEbL03`8R&EP_z~ke@+gPQ zcT4dXnbE_`@@aP&m?JVCQ-tD^_&>_ZU}sy^k^9&&Mh@Mw;Ew5RekUWq7Osbl7?-l&Dn1z{)R{E<- z3>TKKTCwV&Ft7LYJ~tY=5wS9xV`^(G$ygiLK9duQA!mCn1gf8Iw4S#2exApPb^Rog zfs1>flB#(_7^~SiK@mEMx+YWdv;@9#l~GrTN|?CHW#V`pU+(|-2F;Hc1+@j8qkS$d z+f2;IH|dFK5P1N>PtGtiZ|luTLzB;MtJa=cQD|P+*<9AYmMk+i7I%t2^{M7o-KHK8 zRWTmfkjFJ90d(rl>_u35{s4;DAmLwz!J=Q1Paf54X)~7Zxz%(v=Mu3)Ic0Qb=5*;N zXAcCHLg%JF#dVUy{I?eZ?=QM)U=>LC+%L;WAFZ39XkFz}H+zgeIuibX+E`x7%nUng z;EX;h&@A$MbkI=&m1yefXj8W+c-MRWqE+Jus?8H>7Z>G{b1~OFK-B(5-z|#uPPa26 zI+%>M3^Pc)8puD7gGSgKr2F+=jYK1>@hxu+F zo}(2GFzoUyY)kw=-@xuvQ&XIQuWl2hEla zhETM!!U8E;GZ^=wPrh($vi;b~w$Q-Y9NpEzcKXeB4YfD2J{d*6Gqjh1rW5iki5D={ zC?|{bsXH?+K z1g2ThCHjNMxCaHO<{wA9mg=0=~l{MY=vY4jhK!LeN9ysLn z2IBK8<$B~JfGUp6El`|VdGo5%oS1*|lAgeH;T-#pHH;!aQ?0BToBqrX+4%Cp`KC*9 zL|>h650~mOro7ml!;wP~JaqzpKzkW;9^rnr)b%of<-7)mrnV;+=f7uW)_C0G()XRa91{K(EAN>A{o1paI zt^-zE@AtlayO|Qrvu@;#yLI+HhM4TUT_4@a0_Xbq3m+^d#f&|=73Glf$k1hQc+;$~ zQrAKq$(zbU&p~28Sv|uwE;!#g7lUinzpI5nk(m*NZv@@}&@?s%7iExABN%kAzB+bD4mJ;yepm&bCa{zK{iE@fvxB30Jn0llKMQ^7N z%$Jkt`3+2hAi4^kcNeNc1SYHgr{@!$;aVyB!I<)1n|S5AFijB3N(AGur|`sJE@ z`C(Y1NmGX24(MwBh93AWpbNGqx4n%iphzhxsge>(N>33`x;vC^l$24!00b$KkVd4tI~0(T zjtMw0=#++0@0os$-{<{HMLp*^=iD9FjlE0F&Uu&U$9>pDm6J*!{v9IKr(hPaj9S*; z2xC7ZH1T+#rgL4#si`#Cg@PUg5@CqYHR!XFZsySllrjDAXb?*E8ALD~9s&ZXS$Za0 z$E^OB+EB}hP}95`n0Gd!DBsRIrW?#W#d8CGdXc8(pGR5zB-}U$! zby9EEf&nSS))${$+;|f^}^%Qm$#|Hi6XB3tAMCqphT-bFYr3^ zWWUQNnzMIP?_5WdYKt5{#Rd)uG3!5ukecRg-H$pR*e>)ESplxqil;H8>Frq{L?en* zc}+y>()=Q;sf$7TgnAp~`8gi(Jyj?pPpUB8zZSGCTk4#mgi~&;Nw2;2d983qA3?7+ z#lFT6wn4*07r#}n;xkCJQ6O)u_H~2{ zi*+_)fb3j>^rk*Q@}qPw$jISo-mT=GMgXC?rz7C290&tw*UL(D>V`?p{tl11)e(i)Z;9 z3f`(>d-YIS&gR>XDJCx%(*7sd{Ras<9*(%YeWS2+ZMfVOVP>dGuZL4|xQX`c@o4-unZ+|nU#sW>DLbO1q;d7A!;>}6ABK_+2+cL(n(?2=EkqWOX`^mT&2(Q~v z^2)&P5U4&y#h5DmH59Is{V?|Rz`l+v+#S`zkD>GH**(=Xx&QFP0yvej6?qROM*;15 zf%$q!0b)AewiIFEQ?e9t*JRmE-nlkB4gp;l^><(-l?7kxUK~-#ritiaenk)Z`HbnTc95 zG#^3#k@+K3BlZ2<%w;T*pj(2Nzm~% zHj3BEq|eiWC_Vp8vW1C8!{M1tE1{FpPT@@?0py&mhmXxth>R%;xg0|4QMkU+1=`N; zK7)vqx)DJ&`VK&bBi;gd%!Dxg7%fJC1V>?Uj!M4)1@fshbk<3O8{l$OSOn}(6^MRq5MtiGvxjJVTo!MYYXky zd#cV2r=^qng{}uWG}?0%h=HbX%){VSc98;gI#3Q~!zJojRPoCE97+F;gHq(cW?{l5 zHp5RpgwH%OM?Li~jcTQ{kYQ!Fp?>n{;Nodgc$XttAwbT;MP9P;p%Sq*Eo;ht5?n>G z(MaVXRYM6cbOnFDachaY0N5yf;JJ5-rrbHgi1h5_l{W!!^XrztUgzq*KT4vUM4<|> zBtUr`R{QC)sz0YO`qD!=kRX*IxI_9tZ2LEk6RyuVdsBuudv`UKzU|YMZ^%k5rzSc- z2`8O(#ZOlzhbz2rM=A^6xpPEnJ?r}%Vj&v18nJj*UFcCEzjcGfySa1yR6g27*^4U# z49uz7XITg(OxM(C^vPLN=jwLf8)nGhltf_C(kTLuE#QbI`B3T5Ob6B>f+~m7?x9xmCf8K|!yeboEqp!x| zE`|M4fX0ue$Lu{h`H7&lqL*$qG15J`E zapiRNHN-2#NI~nbBy%bud@GSj&ScDMr$U)C1vP%FPbN5iq}um(?8XG@DzP#!k{<-9 z#W3Obvk@eM$koi(FOyz{yvE^YBA(Dnt7kXJNn}f6AMV!RT_MWuWxf(l-Z6fOtoao5 zxl9mDPc;9(JTCHb|Kf7pcgC(Vgj2=yIcpiaF3{V}@a)leMULQ2h_!9Ehn~}Rb@zG{ z0n=RJ;w!h9j9Phk1XC)V!p6hB&AC1ms~1|Bt(MDeB2VX0TvmS9)(KBns0^Gdcn@j8 zFCG33h;SvRxyXuZZETmN*O%HOFxj7CvM3)Y6H{hD1PTh2x+Egw%rbb7v}QDWL6odV z((|6ZDPpJMIY8A?W+b1sKQMos>tTJjtJ+!nm70Mk5ZJWxskM>+DI+DOFA@jNdn~ix zmjlNZk?sThMM$jlk}F{pwf0CPusi4t3N9sN_;!_O2q0b;on6kXb-pI?!dSWFEL4xJ zJi+;vl&r*3OG}H5wuIpA<~CG>U-p$to(VU;+rLH05j}M`sVVrKUBHk=q!(GSi0n<) ztu0{^`>xNN?{|5X=xb3yK?r~(5RjmTXD)>)zQY&J%t)*;H*)rR^;q@9M+fvPR7Y&m z3_ik&$IEPM(nm*crOymN^#dfYhpw{Bx-f5TEt- z9hsC+VpWW$PR@9)olz^vSOLTN8GCiHTwn52;`#^$hu_^H!B--V9GvA$6rO*2izHRO zxHvY_a$u0czo>RL|0x2e%s0M%>QEnU$=^-34e)(76-a$9!hu>OCe6qz39nb3F;MmLp1U0?)$SXn3yaCuH|*k)|dpIUh^dHplW1g9G0E zdBD_T_!V*hf#l;Z*K}Nwe)hwJ(4^97+Fnb~E*osBG~BMf(4ChN|l$4PB307<0>!o zLfk@VQ%A6WNg>16f4&Z?QBVk9xM6jV=uRU;9(xL7!wvaCiBu~R59~IPEHJ3BY^o-G z`6r?-mUrP>cm;Q1+nmCoQsMVag%~-nfucOo57?V8UGnqi1F1EZ4xzR>R5wj2Z`E^e ze@PR)TBUp|+e};@@fZ~XW4KA$BC$rNi?e3{^vhFApZ3a~Z%bt=pS6c8ID{2plih1c zBta7QE6;0>L;;SMm?+TJwiAzOtR9IfRNd5lNhg(}tKv2&9eftH$PvDsCZoIx0KW$F zk#$U8TnJh@pJo@Xyd1C5F!0&}EdS_=|JhUeKVAP;Wdw1f*e14dxb|$GzB`sUH0kWN z*K3sA#YMea5=Z2pS(*Xdk^dp#kFD2I8uIqi2$OG%+%YcM`%qI?Z%sCmBomPL($`tz z(0Pi;mom@wV7rOfc0}7v&Qd;i)(}Fb8l7SxWtT?~NhokdsD6n&b(^gGa=Q>fNdGek%|C=qK*f0W$qxysk)93l%HIU+1ixOn6bCW$qffjvhX^(qh5};Q!Uu%he34>IY!lB$M+5i z+1#7=p&(KgaH@5+`ObXAm$dxa#ryKNP-kJ+1AD5@!!d`w7ur#svq8uB5I}9#LAv9{YSJZc6kbhhte%?~sZdAV&xI4)UK^5A$mE zK56~}c06r$htP+-Kej1R>WInO7qT5E%+e`>tIv(svXXFJz*iS9Umm_lhnHfH!GRO; z1)`*w1Ux$sO)GhUt`-vZp)prr)z_E?n$bq$9cKvBqgy0@q8?(o2R!`6HdbO*w*vL> z@^ks25`FtlHMfuBQY;ofD}N&XiAK>yIDcQJt2mL25K4=ODSumQ)jkjc&^;awsEcS< z)K{z`?`?ws(H(0e@jFk>Kd?$ocv)(SaL2U4xQ%Z2zXS!u(<+Fmg92ioy1v!ncC1*W zl%D*@Cn!2!iL7}K{U-Dn!?Ac*77+m=l^TeKwg(x*k_7WmS>~_gkSp+xchjt2Z=WWZxu zH}jz5>(JGmJG^8OEw6lLQW=Oa9HZgIqh?3Ym?-v}cRWExk%Lsi^$x+0d~8(if zhi@cLF#6wap?JlfpKdf!z>pl*Oe{U11F_LB#5FOsb7cwzbs9w(J9Y~qqib{G)#|cw zaMwPpOMtK4c7ECc&Q2Xp0UvNQajlE?N3j61tPAR#r7IU4duweAkNcUi$ZUy6LCfjs zN4cxV5pUd9(+1YkNOx+bM~b)$06ZX`USxCCzWRZ;-x9LP{ef{De2YFc(QVj3>Of*% zVJbzUefOE3LjGf*)rR-qOeq6VMVEGh4`d@LBan@I;{w67>*+%V{9Ta)SMkfvbI9kQ zNveH6`sCn`QAff3m){20g2;F^`xhe9e6Ogb>0KA&26erg2t$g<)ahH&Y+sxEHq9zN zI(8R&>7~=B`?#rK8MoHfmutmFb4`}qi^`mKGg5|D%ck&rU+}td0q4nD1#!ZLdjGa;D$u~e53485kq9#+YR8m z>-&g2M|P;aLh)`o(yiy$>Pl^}}@Lqzfd7lJ*n>NDdH z7Pz@fzH$jXa#{S$r6toK68e5Ca(FK5ms__-i5W)A1aRh_C|SQ#^+{&;R~=rz{HCQO z>S7>KsFNVD=6UZ=24qkPNK`OeD#N?c8lX^9Ct=}~sw)1YW{M0fIEA3y$Cy|jdt2eQ zKea)!C@ylCEd?cff(`8zJ*4eU@d@ZEL^pjH20!n>MOhgxaHNyMumkGsTsek7uBU+7 z*?5pGjxzo%1C_9T6sC6J$NlrPqF+1Ns9n_%4IEm}0_v20nR2Om@Iwz>AXo#p6Q+A5 zm3_-rPuZUJzX|dfMDh`vXD>IC=-;>Y;?a$SO&YAS9kc{JMa9YZj}o5NI?={Kao{o;ju8$W3@2zoiE`1x z_;Z-8oW#d@W;qg}uDyd|L{1%m3RuXxuhZv2FC2P$6X`GSXvX~_wLZIV^e zDvk3MI8y`(cvJ5i>he(do*Ea#_LPh*1O9g0RXazh$|5~lIzo!TCdb-84%ssybEZ5P z#_(;y@Tay#A$$nu$5;;PSija86-oBp*mf}E3PfPQH4QhMDq(~PvM}9mHc^<5T3zt( zn4^5~usOCwoGX;|%-%H^_jWT5K@f-RLRc<}B`;ywu=Fb`UHUo-@5bSBfQ+BDx*a;d z@X&fR|D7|R@Bt-^SAF;KCA`D0@+3ycj$jtk)Fk#)Q3ZIvH%wpt!aV~2DYBpMha+1F zY{S4>n6JyL3Bn=qvR6Y4hM?7iIuX#?7b1={CfH#dCA>1T4SNW4Y@A{|elSa7t&go` zG-%Jbbj91)KmRB=;>R86b3A<=cZM-Dy`M#({;LG@RjoGdTj4NHDfkE zxIWP;5HCtbD9!_c#^M}y!xyquAbhjjT!sy%$HtndVx8O`Mjk4Eh=pvLxLX} zZ%%JPe#MpiV+rTI)SB=B5^zo*IYfM9U-E&B*Pjoe1yA!BzbEsBlx^j@yj=H<8NPseWjF%Wn6;g>+^{?5mUu`j#LfzA=nMd+%T6IowFD-kA$ZGg z2=T(kI-tBmYcky1sjn&EhSdFdIgE32&uW)}&q>U1y}x!?5*IJ@FD2OXC}?y#5<}A; zyHClv?H_Z8Frsla_WjSnT5NpwMTrop*=S+t>2lJD@A)(b(G!>yB>RYTUQA;$1;MyP zd8Of-!SLWiBIoqv!u*>t&L%K;c@#tY>VduPm; za9bll)(t*L8uw5X>N~As^**MUu){y*PJevqZmHCAEh2*A>@7-y@rGozZA}a~!QeA! zL0(lDU~GYKlwXm}Yq!Piqq&LOEC-mljA0wE9qQ4a0ghBD@M=d7zvq(^{D7#!%z4yA zp(2A_E2~ZpoA_1|>{e0-?%dMynCu4z`g&K!iaosRiI&iq`xVD!A_B|bFUQj^XKu!mzQ}GL9FI!0ks)KZi}TMKJvrqE zL93H|Zrs9uc(OdFQ=#c|ND;bXA93T$V?-W;iS04?{#SC%O~Qv>t@KC$qgxlV^0N1r zvxnG&8~eT|n$qU7r-m}H(vE)7tg?eS=Tpe^^H`iXZKbY~Y>!#EHw?9S*OhKg&KB9& z>l7}(#QXLh)%w_8z<;#N%|Yk%1XI5&Z0y8stzy>!%c#-o*thZRkrGw7KQNhfGbv>bQN(rWmWp7X+cw-q8 zMo)cS5&Gv6%unu~$Z$(^GkDDUB!p>gSYXp;`m7K1iDxc@SA`PXMnIrUk7ZxfoIzew zbHeozvxlKh!b63GZ|*E&o9uhWrN%3l_dWBi0;xdRO}ay*^WzILOlqla3lkUar+&Xf z%ASDOIg!~-_1ig6>mGHZPoM7AP7rf&k_h{iLFzXIFVN#~pg(L#!oQk0{QlmHrwBZP zc|Y}B?llYmN*zCnTNa`z z5^{_^+%w*-5KDIW6&&-w1eoB$&1gQC%h$$RG##nZ0Qyv_He8&uBX;G*+D@Hxdj*5o zxE0me!+234JGrGAXS(RJ_o%b*bZ!>JdtxLe=d8`agwQh}Ztsde+2nLsmM}AMdi|VtLheW=r)%W7#QuhWaJ%UjmIu)jD}9dLqEo(MF^z?0W$o1i>K~>~>s~wKpKo@(>;Cd% zgd-gEVhaq06x?znsogB-Yb;#x^|K7`6rFFJssg-Xk>w^;HFY$$S!!YPAL8$?*LjUo zYh$Y*Mj58y5YI^~%>vm|TrtjB_L*O59KOCXI^nRn@ymMo{h()H-}9>3(N95XL#eW6 z)g16hey;WFoVed6f}rXbS5|vMV7MU=p#!8Epw1Q@5wEWFi@I?u`DfxR7X1)(ej@<- zvMVO|C<6&fCCmAz85mF=s9Y>5zJ3AxnpO^X|H&HveFiAh2dQDzUCI}qec`B%i#M7V z$)Ke7((nC~S3~?l>AS-$Lymy6zvQu~0*cp~<-OHEpP>slx^?g+85$4D^zB22?Jq|E zl}A7!e$Q;dvVa^PuSoAwAcPEZr23uipA~TUliAW&1wYHeQ2|pB79B=ts`(c~;-Am{ z>y~jThm5q@TY#HzkQ2jc(Z&DNZ>BPWzXppYsuPkzRXH7b{eFxyWhq|AxqyVvD4 zl)z^H^H$*C`EXM*h;r*VV)*J^Qb_gL|DhQm-EMz(l4XYAMiW1HCX5%$69<-ghvGP< zfCoVyog)5;u>JEm{vXa4&$T=$K?L1`JOX$+zMpAtzrMf>tV)85f?qh90p!_@xW8A( z$#f4yO%SI(x7SXml@Q!qW~|bbLwZSY2Z>vG zto1KRSi_*3ayuW?``7~@iMB67O9akrgRjcHjDREDmTUO_umZuW=1u?ckutpj0!U_; z{d~<%qUu>#Fofw$Dy0&|vq&(2MBsAtfA0ebyM`=I+;hXFhC=({P4HhpOQ{?rd(V<{ zV}k%9Gnirj_o;9~70>@k%Kk?ych^rkbv@vp&oUJj(fbeqjLFBiFL|K!_-{`N@P_)d zJ=g1t=tCj*?lE*-B%XODjUqrj7=J?;!vqsZi_ZCF3gFmlKDgP(h+Zq|3F~NU@AaNU zFl*unbmG%(-XPA#qkM+f5?@YKWyzkejWiKs3!CyFLsC% zg809oZ-gp-AJ%~DPh@jh`9z$4aIwt7`XUSw^ADme02NnGzVQ$SW%@GP#CC7ungaw@ z&^rT>dAJBD;l86o_-G%V;hP8z%&Ps@w28!u=>K%=Pbnl%@VN@WEG0!7)})5W^5diS zKIK80-ibp_VK^wL65K{hmnJoqCJxI!I$&l~D*D3hs+0~AUX>D+Zm*V0cq!^Ft=KQP z8%POZj|Tc`67l{M9AIrye5e=ep+23UXAR}RM`$W%fquo}O#^$c8f1Rkt<ly(OAy1du92==)$3Ir3Yt|n-~ls1{uOi2(XDN-1iIdIdD^~H>?H2Cf~2Y(yN zlc4*jWL;GOHUW}G+oAgUk^uvtK{RXeVun7ytbuGp9Z_I!QhWAIOHLgbpQCusa;r!S zGH67Nnl6~e{GWINNXaz@P7T|-FGfJW{v%LTPXR5K{BYXNHmQ`@EIDk-T71GN3sX7J zHSeAhn;_8$6!vjH8sp3Db=TK;C((VP^q|gY*BM!nGqEA^uTI#3Z~efYj5bn&JZT1` z7`eR|wSzjzqF?+tOG{4Oecz?MFhJ|-XLBol%9fi%>vlxy0lhs#vQ;@Le9s}&tyl4lHy!L2fzax5A2+B~LZ|BtXtje(CA>Xv-Vt0=EmNKdDL zX!?0IpGY}8e4{`~M|s2Fo%pTT!=rfP+pkM4RO_$>D%o=t-^F7JdW%zB47ztp^{X~< zS&=_4K?6Gp42ZIll&hkxfc!Y#Z92KT)Om0Vuu%V*nXd#w7cki)?sGRt8joUT=0a_) zsl*x*jh6MQx@?kbq>@kWU4H@(ilNR^Mi(O(I*e+s$h1pj0` za>BbpR$RdY4|X5MKD>l~e-3>y<lX9K>CcvP4u@z(xkay!`gJqYq5U+ezHZ@;gHN z9i=1DZ@iX3Ya~HC=!*91qt&?u$;pHx-M%3u8Z&i8<1s2nM|3|qL27QxnY&3j%jLuP zRA-}a-;yT7@A?MZciP^(hX!c1$3EO#J)Iq({Skn0ZTkastrL0W&+M5nSW;r+8^whY zj^*vWH_OB&hE_u%4&d0H8JD^~b_;dkA|N<#186YzSd@&<@oc=HU1hY_h;7j*H53u& zaI0C&VZF^Z(q-G1u-pZXNn6TPl&Ulm!6Y(HT<=YfMed6*U*qbcjK0`HiXt7)j`a%p z=TSQ0jT^Ck`>`oJ`|;5xg=#RAHKUmOGTOc*&v}DdmB9Z^;(Omv?v`Y}!U2b)gNnAk zCD){qohq@uz5!gW;*aR{C-TRPejVzV|M3B|sxyC~wA-8N5|GRjWLAB88J!pPX=%OT z4R`IK@iJj&Ov$pl0id0_slI_y!8TH8zdqYV`^1 z@`sdA&FlnpJkBfX5-ChmU%M!^!uHk&!wd#BC~Z{@VARz)zW_@tG!X z&8YNZbRMR>>!N@2(bG*ZX%^#@m*?c^u+8)jk{U`Frbo3_NV1thu zUj`G;j$-v%eIb`0p%Q2<<)^Nw3~gP%R3<8rQx%TXt=Tl!!lc9&b-P_HbD}hIW##?* zod{CcuJ@uw3f7gh^YVF7Pq5t836d{trSno@`75fzm+#3M(^JP(l050}%1zfvu~96N zq!!4DT@d6|89DOYr!*3Ny{TJF(tHW|`R{9{GyiyPKh%_RF|^X3q751W?cKq<(Fn?h zNvyICV4Jeu_^?f)3cg6C!I+sMmmZ=HQJeOc9~Ou4rBW0X*F5=_CK(MH=0;-wP9K24 zMErSyvGz@_w9FUXCriYL-<yH@I^JG$xsuI8~`<{&+QlpkIWKiLbvJVfl4OVDA>-%=3gKG0w~9+Bd+ z^wq$)qn3nuVvpVNd>5U7!*s-7dk+D^ql*U?N7WKkh7aCt9z}~Lzl?)MRA}w6q7q8y zsmi|731W_q4k&s+p&GJp~=S7r31xi_SQoU&+auGGr{{oz%klTipi zq*dkJR`Fg>p3`xK9c3(LsN$Q?Zkdxy4ro%t)I z`-2dbXU&L&9;+_(VFMv5ZmeEG98EH=8&`HaR zd{*p2UOp(2gS{x+C8)cpCiGa6S7CYAs6h$MHy4@^=JJmc_)3_)=DsyQ!2iO}Cc~f3 zVKMR9$vzlcah$D8@XTgS1NPDZyNfO*K335h(IXkAYW(p`Z&ol@zUzpAAX|dq==`XVm8G1l8(L^ir9Z2ny3Jp$O`kOhD3T<`eD$qm-_W)ZzwlUhLAQxZ?ZN}@$NX&_T4 zM^jCFc0ne+Vfx$XCoF8uR84zrpT?b>v6?iFwN7$mVMZxzEvr4J4D(bPycm^0~3} z-Q96X-*J*JBqu*e=9KwuuEu(A6U;L{QcTMuqct!x%MDjC^6m;Q=;{B5wzlP(uZS+Ial};!V{w+##yc79KjxR``IQ_U6cwaIT90#*c zPUg$}0r1MTgJmlzv7r}`TT<}g59W8wdd#W1%j3s=4#WdKxhCsmvAX@>$jddnn&(*S zxy>)KxvJAS_g6-u5GU~Rv8fy#tQ+ScfO@LA%#?7dnE(7%ktpFso7v7AkkSQ)6OB<> zJD;j32H76?UatqM$dguK<)V#`pEfzmGmF!@DxH0(t0gV8?w6G=W-g`sS||wSZhik} z6OzlJ!2^q6~5z;}a(@PKe(OrWE*EjHXJF=c)-tPrt)wOgvgh zIkw5Z6yX(&B56^1vq+nW+Lcb_aZ;E|Px9&7kcM*nA#o6GB<%PgirmWH?Lk-2q;Bq@ zO!n3pPu54=+~k=tSLh&mmrv|Rb)8m6sj^4R?GN`;PWG3p{0^$D!gM%PZH6c>ju-Rq zr?GoPI(brfoMX+)qnp{~$Sai8&Qzh4G#?pBas6kr8F=}m2|s8Ruo8I}mY?rOo0~{I z!@3691Df)YgHZHtSmPI|{b_)d;62M<_5`0~M{D|RR}NplH|;Zvd(z#!SNQ|%wATu2 z{Jt&!CiP(&secE$^!!CT21?P zpmz0D9EcyC9PRco_-qZtjUzW|HECYCOHruij997F?d9innv$SoT5J9*y9QKyNZ$X- zZ))j?%4YuKxN$r;;ocNwhSI|1%U7Hl`Q1IjQ}z5yttWNM$Rc9MLYf=PIQ0*JWm6Wy zQ)?X~a>;r7V|KAF)k-~eEZ`-}{jSw$qs`ZoS^2fK$wGiCV*ozyJ(=o>;^kwY z&H7@a1FkM8c5^E=gwjVc0J!n#y&>Ps@kFYq?}B zOX|ob2CnIU=8?(CXC1*3g1 z@XF6h$+u`^FdvWY(A(WNY*VCj$lMCzJul6u9~oLZ6-&cRMTBwQu(T0r2H+l+7lj=^ zjy#k@f}6N{Kglk}GH6Ts)yktq<;~7C(RxElx7C`30%b}AU*S-%M)oAHJ_(Oas=nwhuPYOdb2FeFo!AvKN4QolZkf?;AnbO>cpAP+=ZkSzBgL@^g1IEBi4>2(?s-l;+W_9P2 zGJh3O1@&W^7uV+pwea&ooGMwXxqUlnIrPh}@7iv1T5x7bH;P02fz{iu z(jrj)!>+Z_I!>B1A+ny_N?Nssq<*qDn;nMK*k8Q-`_xbv0BGo3VLlgR>$&wkTuRc# z{VQXAKz#JQO0!XuLnr=czD^G^U>p%|@t7{&KZ*R9_p0JP9WiPRTeud#kj8tOCdC;( z@85EbW6)-IY^J)S+KJ6azs4{|ORy-R(or-T&FYXKuI2X6Yob8M;bM5xclxzBpT1ph z702B>U0}S26+mGy#XX<{WL_4OQoil&Zd7`DgBSoEknA-N? z`t8+{VB9RD#bt??I$aULU#k~$^DM9G6z1orxkg`Z7KB{okNhG4r4iFQ9iEYsuv-2@ zgpJjycjd0J5UbXUQ&|rB-8!c}4OWaiJ89#5|Bt0=b-uq4yXM*FWmz?ew98p9q8syd z*#C&4Uak=FX{>Vuiu?+GcU0amKtgcrn`EKs=?z`;o)hakF4BF_7Q=n*;yuZ?qNg#3 zpFdxRDcumdYqwz*oG?Fi#X-^SHq{^V?V5o9S>F0h}QSY!2Cwy9EZaNWTppG|(7N@*6GVqiL71 z>FpAjd)ztbz_>AcA*$6PR!i$y{98dihYj6H(UR%BQ0Z6=IjX_G5rjBG0PgO-Gr8O7 z5ku2cF`}6a{@9ZYz%s@?Z?SUi?3Y5v!YyaMLI?;kfy=l!ikJNbOkh0^Ut#@57tff= z#kjV>lBj+-U*Na1IRq%7vOho zZlKEdtv1vjwBGs{VbGeX93PbTDZ%ywhq=E)mvvOuUHV(yPH)cI{0V_I#}RZ))_x1V zY6+%kPbIA_PHB6LDVXfNr?NcNQddyjyMG3m-#PhdXHs#V(Vdbm67`l20-CVuuDU?V zHzfBR&numnl$btqDyb2t;Rzv{VtOWfWjO2WY?prP@F2JR(1plO%|;n#jH^;N!Ry9Q zV}}ia9BG4nhfTqO(DJ|Rd*+CJb$}s#I#MnExMJ7fP51kv>En!w9EAjNZT{}Oxt87) zhUak)==x5KE%ggSJywTfPNPfBrjY?CyEp3fmET&=t*J zfF`-`VJ&-;ODNH}J9+GtqnEEoB}wzRJtHdibBLLw$_MC!K8f8#FEB7b>AJW$w*3=m z`2I2Xp6G&-hT3c9W9BD1Z)Bj_PQrOco1M+(xpXPcMhywcb)tej7x{ehk$OpH=)SEh ze>X27?U*bSssjk#8<*dPW@Nzi&!}FjH+vVc505cS;n>74VIS5CH>dj<>YMS~vGS|D zGTov_GSI|Z%jq9gkFq{p?jmTY>PwC0aU2Sfl}Ey;#|H|xiUn>MZEFnP5lmp08!-`0Jbdko9Yx`f5rNfl!riN(5;2k57X1m#I?;u^l#SchJ(aecqOzVJ zdfH69ngI8C+`n&RbmQ+vC1kpd-ky$IcEf)2H>Jl^NZs(N8+iuCuE#+T1lV>G~UBN+Yn=@l)DF z7amJrJl2-u771#LiDJ;#UU^#KfpJ5}tN3n21t!_0ODKH+A&=%AU50pF^wiSL(KNp; z;M6*mlN4Nty{TiFT^C?HcBG~=Ubew=weQVb@RGje)V^oHtPqRvZ|jem2550Xj1*;E zCux_^bD6BtV-ulNx#$=M5#e-geeaOm$Xrx+ zdghf#`Tgb61k+<7H`c!q!ubT$q-v(o5igh!WPNbNcWky061xy70&%xo3BXHT3-nO) zd_CZElgl{0Fks*f5?i0;;jmat11OLLp=&-y$TQYG$x90%9;y3SBlglS&gx5tNUD(Go zXbQ9YdKp&a#HeKoRJR4>!#7BOHkSIy@j743{#E!4eE#4lCGB<1$wwvn(`jy-EK>z$ z7hg-yIi+vbi*t-v7}MAMYGJ}{bQ>XtH31OgWq?7DloJ8dZu)n2G`K1aUpMMCk>ew1 z;?fE&*6N!OL!Zn%t#R&an(8ACoiG%@N}Uda^biECE8PB&6c!OsZ-)@#Zr`Zvnag07 z<7uVFW(TO~Np9Ud{YUivxOwmUhtQeUqSf#?UTW`$GN7D#siG0$`dn-z5b z=%~c3-ExC2^kI4Z;(dNO)bY)k2Ll@@<`-{8PvT-Sb9{|9pWh$i%d4)caoV$%mjLLf#P+O%!KV<&_!b zT{Tk^H7WJ(j4Uka-pHAHQ~8zQ_i;(t$@?>XV~vqEjU`jLTAlU&g}Ob5Wv5j})`H)K zT}?PP$=wR#Wu1ZaOLcv12~4*R15PsQ3glV`)~Z4e8o$oO_QKM%Iv_ve98E&WXvXJC zzVX?!oh{K0*c!CDgvZiia+bcy;_o6DgeZJC98>FN2Si|blR}fbqNcfU+r7gOJ)-VT z=_(^^z4d8Hp1802vKg=qM4rY`ntJSGu&rwf`IIj37M2avTz z8f=UgNz_Vw`6{>izVnb!n`$G}c&Ac&vR}-c?e;i|@8G9Y+R)56$E;xy@X|mlrEzVk zCQ;t#z*52U7ccu4!nec<27DbBg);_@F9~yB9VJ@TwZC!BGLzw@Gi3fYr4dhz;>U|3kAV}!ow%YWXB=!(Zg?Ye;iSZ#m9e$}?9~xB zeBq@o(c`%kKS{r5a`ORndEPyv{l0|GG1lJ^E~kfc!s!TwjP5)fXs)tKebf-PY#Og? zL9xAz9a|jJ>a9OCim&ZcIn+r z(wAUY(qU_7F0mU707`rJ*ye4*wG`Cxg8g@dowNwvv_ulsE4hn->~Z&Ph@n2OKV9eb z8*z)uaV_x{sS&LMywL8eTHV7!7&QRaby`i}xv@C7M5Y}(0 z4&6<`6Pdv?K1?(1j>MH)Rc^tiozKgBk!XCjOIr7OhxC{*@^ncnHtz`MpgmQdG&s?sCa zN19Y#U+-g;t|@|9H}v;dFv%HL@=2S!ls-Ulu2Jf)eQ17 zE)8$gY+Hi?xAwdC0QuA9*q61SeNb1Z(zpBuZ}x?g)p zs&ABE5~CZ8L4hDR8yyK_5jGcF%c29wl%MzYfLYcXrd z9s@Ef%L>|55*=s%OSd4XVfvYM0CUG%qRF(%i7K;oK|WgIZDaIydLV0BLwlyckx6}& z8<_ew7*y=;`hvyU_PJ1;F2G^q;$+DRTq5ev^hchye~rlIrA6N;-=y}vp%|M+>p8!H zK_>7}*6sc=V(%g0+6DU2MRVvSY<{BDJeLNG7QbGXXv)}qlVe0FbE@^zb66|ig^bt@X%hh?!!%L?98E z+|xN(17o}-r29C$?~FrJ@f9z&wv|(%7&txSx4I&jU%cZGAGUBC-bx11EDxYm00)dYxXBX5z@U~W%?qdz>Dc^kNe4Y8EO>3d%cL@|C5k5RM^vaj!C|Ivg z%22HHSk2EnNOG-SpAp~`SDl;1sB9w#0WrnP`pi5G=CIy8EAe3C7CDxUsYSW_y6Zee zs6OYtUWf#*wDkD(u$Zwe9z!RwaCG}&9z^pN<)0`rc(0A3-$Y^{z z=W4>A$oZBE;>erk5EMeMd7Ym>wtJ=hoOW+`qTiJNSdbtaI>r$IwzJjrA)^y>=c?Tq z(R6LlaJ9b7FM17+^KH&upk6ykXvUH5ADL4(BR+UwY!k?qJ}__b?YnK$@+B?Uu1D1V zO`&`x=!h8R(x*8buUDC4#@_sDdyT$xQD=$5%Qhu${LWDuZX(Q(P0%eRwy&Tt_F1N9 zdu7XaFbXu;DS+9@LhjuS`8h~yZVk+NqLj+7BXL{?;PWrhw%in2=~^B{Zg zmC>;G-XnV}yJLOt(|Y%LJbu5w>JhzOulv5Q>$56vgJrbw!S+UE_4&_U69urmPrpq%kJ?tvN^$R_|{D}abv0|mE zvnRBUAA?-W4~SA(cPRZ+Ov<2jP4?hZ+-8W>(PJB{?Tii(Nzqol{mAZfwFEm$tm9P; zvL}NYGVv$iTQ0;5I#O&&I#QZZNWkZbx2+RsCcX|;2weMdj!$yBh*am>Yk%px%AybEn%|{WeZl#N@O-6#s zX&4Bp%P}cuo4&HiVaEA0ucXYvO#Ao=#*C7?+_V}{`B{kvQ)tP3*2#h$jhv5F6m94?mRPWP|72mi{2lFFi40dspXp`RqjHF{JItsJz-VmS+xZD}jKqA^_ zHMATA-ZXtOsf1u+xS$RGwv8SZ#f&ws^FN!kmmtX69VByrs@ynTs9)IecQXUSFt`cY zzJVf7_p;w_k_SUQU|C!N*{wXg+`NBp5l>=^xun1+$bA7E^6PGk zsH~+atiaahb zFj~E8*^wi6-pxe(^c}Sx1#!ri8*vH}S^0!+om3BDUxu%HZoifR1X@WynAhJ|nxG2d zPJyPr7{z)|g#UNdVCY-xiZb_<$CAkvDTAK9cx)ulMc&KU^`e@@^J-C-$b%@j(5lqj zE3e{aJYC?E={3ue&Y|MCECQ4wbj$QYh-#K}3)FbG-)K9je-FOqCfe++O~aT?wQEEljJFVhtTYSaw@VDgsU zC5TiOtVM z77?I)p9gZd<+cu9p;V!dzYoYZpRi-@zrBvZP+V+3)9Ku1#qWoy3-`>*U#59@tl}K( zXqc7lKmJo~`GlZ{zE(Na*Wv}3*)oZkvE^I%Ayo?oah1hOAWV5b)3B;p+&#qt)87$X4SyE zZk2O!l>-ha;iIA^br~*&-|3dBGpdXz-)h<2Rrz$4&daSYsZ%6hr5sqBNbG!DND7(T zQD1Q89!nY~%aV;mgqiR#WFK4TXo2*zDN}jf(V44iTtR#Wn5ZOxmC|wn96~nO_ z#hDdHdI%|Hw$JMa+3DQFHr)M8WWY(1h_G)@6nU$J7#aG6&LL%iT9wVb8u{QRxDRwop0!^wnEg;{ArE`oR}4ijlpQ zvXR7>Trs?`AY|dETHbYXwaIoyB+*>l!~T`Nm_*q*GP7 zccp0Ih%E)wF{Q)xv!c(tG;WH)XGk70z$^<2Oc@ebixk+61D;!}{w9+Hj6O_LF7+|#D>?Xl%Ds9=bMVZIpb zeMk&-R1SB;3EBP_-&qHH_}1ryG&k?`hf<=B?Hx{*%{xV2!nBt&M29&9 zN9p0S@O)qj3`IH$}| zJtT`;zLfZ@1P9Uzz4JXz=+haI-uALyT0=8_C=xi{TwOF5#?7l`7u$V{aQ-6jzVEsgR`zMkJ=o z%=aL)&*I_hz^9m_hOH;(7zpm%?5Q?3ns zvOQ$7a&G$lWtCZ`NpjT*lutPAB)zVbG|p=H7~rC>_P*#z0c-AMOCh>_UqB2xcUU;s z4XF}CSsJ@pW48LFDt3qli!3QU2zqTCUk62C;@ouasAfGEBWmSW4GdWP@rw%YJ7uS9 zrP)>LAP*#twk?7n65^ds+1YAnODkET=2aYxa{)}#1DjRtDdWNV%OM02KSY}c!pbLe7&Edj-!7ewK3zKw+0+SMR%bG7_b#Z&AkcO~EJS&{nVqKn znQVK;ft7gI+fdNuF)(PJZv6P@4c~oOfy@@QAUBz&l!c8nZuzbkt>FbH4h#X7StjUG z6eVgt;OM2$n35o&&=QY*G(9wcp6K*l%UHeRgQ(Nk)3D%VWiyeFH%n)F<70Fr~bfHg@m&dyje{puR8P-uAE;hzNY3U_4@8?%nDOn7XIB1 zFkH?n3j3Z-?r?AWq+Rh;ua5)--kyj?_O5XQ@%mA+(5~aRxlb;{7mt#aFTQz7fR)j0 zxop}3ogudnD3&EG4aPf?j4vZ(3>&c<$t}ah){a$AXjx?X0}7bQ>7e`kC1tmy1ZRH4 zXR*|w5vW>GXwY!9w0-_nhg@s%JrJeNu_e zInh)Jj8?YPWdK(F3EO?&J=J}98fk~*zRmskAUe^x*ca^1_&PcmI7##|?26JG;8eY) zmF=WF@yL!|%eIRUHqC-PmfME5T8J8tAKD~s+kI$U6yL=hbUh54;bLG9TSiz^1esBu&V~DB&{8SGh@r)y#4M8pk4u54i7z> zzYREyQIUA5-9?)mi0aES$OQzdpQ4AvjVQ-magGu8uX*xgu32h?19eOTG%Q^b zZNHYli?ropF@I)jm_~XE93TdxXxNnn6V)Fo7lSn$IWm>)`VWkDm~NC4dJDjCZT*g! zgTl?x_j}Sln2_U@eUBYGA&NYtCFylLDP1%Fvu9d&0;eh9OsiNq2|;w;5n+&PffkM5 zW;hvyU6x)y!)6W0jebZ%ac4l3f}BAUq8B6Q)j%Ogb)oy~y1HvKXdRtmXPRz`fSNL} z4LmTM_*gN2|J+$L&wbt$SJO)&$pc~^8KDvcYwP}Kp888_HMwifSG7C^Cs*|rS4WMK z@d82q;w{G09Hbj3>}#a+mxgcf+G_4?=Xyy@IA$qGcH@{a1hr%hh3^~r1}?*9;i^P8 zllB~7do<-*es$qQ@+oE~8ZWMI21uKxE1@~F?^n44GNy_TapvBW_)%wXD59};Suj%O zW3y9DNOW9uV4_l`UA`FiN@3kx*+Z!j;X}_i$f`ATM6AB3w*OlLOaEPbs(Ue8X|~X@ z&SmYsYs(ZqCs0d8yx=M$XurQUvHMZS{+h?kD>*ZLbNSr_>kLz{dxHf!SM6^@oE?h9 zu-EQOx-Rt!5L8K^1PQjtlC`1eoCGx@)%yx)g|7(29v?G63w{xWv2MMkHt-@?=h2&= zS#@sACxM5=7QR!h+QlI0hCsh5n>9P?MVI@?dzHe|peoi5iQT1`>3wJpw@7~~ zBFpl(Rpw`o5oGj7KG}Scy7}3_x%+b6@dod4cZNWFv_Q^ zKvR_2e5~vJYEewb5F{nsWZ4!jE+oJ!hxrhIhDTFiwGlcgOsUU|{+UsSz*Ce^1em2T z>yA9C(_Y2dOKCwzCSK%IEZ{n9*a@Ya1np}r<}eFt%=LvKh^9o_mCml+EC@Q?68S6` zPahe5&Waa4ve&f5`d{w^2y~m_Cf{1Vsh|n2op$$}rkjYg^d(@H1nTc@N9p!?OC>>h z--aC%_#i0QFXpsiUy(L6TGYNhmA>h6>JStSM-Np2@4UQ6hK|rm6C-vVcQIbzcWm}E zGVJ7lwrvQ1uF1Vnj_&W^Rz#zbM?jezc^%Iqq4W>}p%*a_9kN1@nHB7Bu+IKKVtlx{ z_e33~eRkFA<0X7Kd-+g z@K(&gLkLMPPt=*DSv)I!TWWo!)!;ZJN+g#zr1PWMiNX8O;VY^=Vb@m_C;M-<5ERK_ z%$V|2FpB>qgdpDhXF8eUM0R@8j;WsFzT=Zl_vbl#MV|wIohI+B>8Q0BCI%va8^fl5 z2foG-%mKc2)+QIjaMfkzHUtzObV;rgy2eAqST*b!N^Y>23^o4GuAhU^3WYIed2?@% zrIMR8;8RU_mzAyZ)q{-H7X*fr;eF@o$E!Tdfn-Nz>y>YC*$N4d?+`9*p1Mi;0+2|} z_+5J!RlsYGT0j!(1Y?sCQO~h$uvx_9D%4zpTJLu-f)`PmNKE+ZuuZ>)>n5)ZS2W7{ zP=;5V=W?|581W=zp*^nd;Ou61i|j4o%}?M}}VIxJXDWr6l> z({lnZUZ&h$%mYQu*xD3t=5$uNUsV$PNf=TivQDz?Wn&L@?Uben=$Y^!4?yS!w-Tmfm%*rS#Ouwe`144?lrpZ>TOZ zLH6P902b^+CD!9QtaTJIHW`Xzp|x5HilNXc!ODos+bfR^oV$_68FdyjQuDSw4=*- zEjCIx^CcmR>E80&$!9{~@L!ba3m4zdCGMT`h}x*WIA~2^`ncg+-7F79XWWSr161R? zlWS+7-}%fj;YvSm&Oa7!@=Ts*p;?}C1tSL!d}@d#5LY0worAcAlu!VyIY3g`bM5SjRRU`vXbQZ}+)T!&N4 zoK|@&pe)jM+Di;-C}3i}r7J>;@pLQYQ9gdNzq{U%%3&Fcj%6ayqMKRlY^?kc%YW!- z?OzSXgj{0Auc;ceGCNZdFx1yO)go2rU$UJ38O;3DJ0j>dhv}AetpZv~42mdx62jlc z)1OuozIY}@4nkDhIIKtK(5RR?1aS`16m${Boljy#(IKsdo{~maxQ%-au9)V~+_)(H2ypvsVeL;{)fLPkxd~RFI&(EVQ~9V!F%>w;CbP^c{$vzc7Q1~V9jPPh=>c}UJfiiRcV={_Zv7VX81KQe`wx~?~?1MRn(_U@o z*-^EKNeJH=*1+wM!%wGpXFyi9Q}nb5Ypp&lIoO_Uhghgi?)$OBVsC8qmJHzllF9Go zmE}%rQsRHq>X1B?;&Rf2nXS=QgyT7mpdG2*QO7W^;s;{PIYxDX2guHd2|yjWL9tO0 zO+cNw(vIki$f(vcc81Hlwmr^!2Nmcnz5zTIq01~Ld5rXJB%!2p!5|G9G}L1nsZ zN5^{m<6xd0zwY-}UAeJ`$nOTNR!gprAZ#0Oi_h1T!zRieO)Et&6%)@PIuWJlueZ!v zrRz)YbEe6(L&RWC3)g_+W|6*4M#J9wiNOa&nb_P+{^&vIB`ESxgeDov+2(SAi=FBI z@Tf|?S1ZBe0PBxql6cb{<}z7evSp~wLXq^?O|6#8ta=T= z);gk#l~BR2Iz0#%8Wc?Li5Zy#M~3pBJGzJbc_81aFQaEUr~cao<8}<-t)F4tb|ADU8V}sc(W9On zSOLYCC~OtJDt)hz3-R|{44dIXdG9GeAxV&8i9(f8FE_WJ*6TZ+O#FxYZSs8_z#Bk! zucdRLkroD+zD%u-{w(e3WDRBOh-(ZR?aiU*TZ*_`J0ORRg96Y#R;N%I+4DN!O%DnQ zX0V1XC=1-*hD9bqm`HPObp&ZjhN$&f?xsE}FXinJw3}UF)GK!cSduSxT>YJZxbSl? zycrR9W~{5&hc{YZmaC1deqrJSdQYwjq6!H#LOSnj91aeV#SecPy9)l{aUmvzg9`a) zNhHcBpBqaYIyG{nkn4^x+S!P&xkFV~l%qCT<;1{pX7yf|XHeMdo|*LcqMbA-pf_t0 z3eD!l@t<%t!+56Iyu;9QB*a3eG)AwY_C;Q#GH{)v>FIfv^XvKEi)U186zZ#SPsJnq zCyunq6|IhZ_rp(g@zMYoUB>KW*)iCIc@Z`4jS zzG#lw0yw{<9(`C)nPOlv$C#a(BqzV{*Na7igjKujo_52!Us()0?d$}odRKczFs93U z*Bap^ZBt<_r@Cxb{|zOIb(i@mi8?Y<+yvDkc&%O=YBViQu%#{am^NV`!a06iyX`t3 zZ{-%bu^7xI93lw6@mD)ByfA^izJYw_gQXsd1M<8sQ2Ijea2#5MyvYaoUA`S^n}nLc zCVbx!>nLqL8PWu`eDdc)*MLC1(xI}|eyV%lF zcq_pyZ5mFxD-e_4elkzos#o7{{Gws*ewZLiksEi^rQtDLbgek^d$?e&8Sx}}UicqB zT`3xa<1|}|{yO10VS0%h3+1zI%$Av_Ia0U$@p$QN;!Q#HBFI+*m(*+@5p@>Z zhHzd8=u9aI`Eg1u_nV_Ag+}ZQNhrVM7wa?newgBPF&I~Wy&s6(@qQJ^Lvdh-;%P7P z85?|$+}F=9jf~+0)-ly8De2~RCvd^ z{e`2K?R&}0o&MKd_J^8#yAAQLqkuqk#%Ono&49{zq!}#hUcOOig%x}((9EMD>skiq z<2wOBb!PI=1T)!y7~{~{qW|6UDb?0%n?IwR-v zBMVBx_sTv%SA~Z8<+-kgNYlU_=Ie z8lebtoiHP|(DZ$tsE%@ekb>!A{vE1-tYvi|5=Y%K$w8usx=n-JUm|PS8!(5#>u&?w zGpNg#cZ5s43R3IUJbHytBbvpxq$M{{Qjx=xve88K0#<8D3PQ`*J@^+?Up#Wb=ynLC zVk(=kV)ni<%2P`%zq_75HD*b7(RECA%kl=_862zH)%OuN^j?^HGo?;55mcgs7 z)2YDsPmn{n1pfyjm;j}AP%TJ1JSilIa&M*pPB5pN<=7B3W1uq^=`>|L~6)V+eBjw_pP` zbVX2AD=lh-yP#r~6nT15Q(e7%7SZ_t^d6DOTbf~(GTn1@iZ4lRMM*oe+oYpboQvPV zx_h23vC3hV={wEC0sZ7J+xj9FgJZx22^t&B(+)L+2A0nD=H5MCto0^HmBUT48>=BcaXshaX!4-WucVll>$2M^fFF8kC%S$)b#$ zC5_0swQrL!*mZ*6BUum=B$6g+0qiqkKil@aEh$3P?0a^=j>cF{O+O~oONtjhoVE}w z+ERfKVZ2hpLem(fM(9w%m_a#fkm#6u8V*oaA9xVHpL?fu)gqUW;p9@NMbVfUqVbVn zIJQJhcQKD?dV(IB@uw&q28UCpWYGb6^7)-Hc@Nsfcatndl7lnEZ63E z;m1r#28RsW9`*eb3gxzGBi}%xo@9bBX#f?cf&RGEa3>hUA5`Cr>P;Bi*_N@7?&rMS zC6iTQMg5GlPovP&?21~{fnRG@Mu_PxdAF&hu!QT85sdeH%SrY(iC0Ok<>zU`con#7D(k&-648ZOp-r-%0JL!c>$w>>7sva$zhQZLQfJ{=NGF>9N7e6%)a0zkM z1M3kCOA&+XDBX860b!WodxSNl+q!q?%U*_E(+P?N!kS-dXo72b7*3JCxD|DpDak5O znhb+g5eJPTuTF`1b5m1Fm(LX`eqtkYvIO{k7a*);E{&8wY#kE6+{d^1kjc* zoAkkW2HJ+zzP+p!Y^9CTKAdgjn;z7^#N>yOOrK|F$AVx%J8F`AVNWtRT5Tv ztx!j*GKZh-d3>g@9sQ+xvjyWB<=v*d;scTWPETv~RbA!M5{MgA7&0>id=QGVQ#_*p;9j$7x0?QlWVYSs``JvKa5nE zf|-%O-)ckYGx6yIBh%}eK;piCUub%KYOy!nOa`pB6_;9 z*g~OhTejMm{(;o8uBfFM+Ik#?;OBew`QnnCgnhb&*PLvI3NE-lE8Er_`ym}aOVZob zrAFO~G!!Hpy|;VEG43t@Bq*VgOF;#fY`4Y(-Sr2A>)?o1R_uJ8?4IdfrJy9uV!T|? zGWjJ6rlCStz&(i6Q|W^qb{(Um>bo?CjKuk_u1y-dz`UtM3oa66Y$ zH`P7P2c;*hSZhWasa|`Sg(PfcOOuHf0>b$U6UZxO-InKi+I^Sa&+Zj{{5guekK~{S z=%9~r5~*_|(1RSI2$bSpwS2q`DwYKK34}qo4NkbLpmg6rpizG3s|@^6nah?rYnh`2 z;iCWoiX%q3HllRS2#3{moNk9e&O^GaCuR<@b`M8li6s z-y19T!#s^)&M0Ky9FTB|wlcXXcUDFW0^-% zXbTm%l0xGz2p5w1WJYu`M_{48wUr*!OJ0D+0Vbxs3rqypk3GaQt`BVxIMPHW)k>c`VT5Fuq~{nVs7a{>GCyjn}BAZ7KTO{z?RIHxqdj(ErY7uO?p9 z0#qwAaT_m;>^n*&F25Jya#?`cJU3PxgUf&GDzVKtmMC~5*066#oWTg&&X>Rl%XxIC z^oAoX6$60-%^(+nBXyZ&q@`*E-=Yy4_V}z|@7YSf>d$Rh-jt8nkbL1T1$fr_19jZ| zsyYETNchnMZ3#?@Wlv4^v_Y6thISPJbi)HxbF~-~#0WF*lZ;q-WYC(ge@1FsXr84X zXGiFjeajce{=<#3e9=Wg%Ore6-pfjz!T>8}EhQwLoVFftAZG?Tc-XBLBEPMf?~blT zOEap+cAkJK12B6{gHH@LdF%FLtiWTP1|?v_1KUWG(|fPd2eKRxWwQC=SONdl2HpI_ zhXY|(;xq(sHba`|*mo|FD&QK6{ES;`< zfO7~R3DDr>PQgSbqOhluBNCPN@nar4Hrlk6=8t#+rN|@6p>$)V6H0ZsV`v|6=nx}Mb?r?b~CEV7D6EzP$XawS9zNouC#Ek#uH7d8tWd-kZ`Z(oVxRiA`heP zwq*0sz|Z7@{(9z^qxG$!r?JtL(gS0TmAT984ee(ymsyT~*qEDe8{iJo4c51&T|PEb zi*%i+vYWRex*DN$b-;Q5ypB`OmdnHjPj`?9D91d3;TQ|5F=EXD6CpcZVg@H&K??16 zprfSW<%u~E&XSeV0xijmuP>Dhn@cCnn$a&i`b*cp9_LB;{PgN@LNY<13k`CL9nL2k z-N^zfiF|PA;rP30gBs^G2;?w}S?8GmGw{pkA&-g(bf^&DK5Iaxz9-2dY#pV!8C5&w z(}PYn@?(>(T$)sSE`76n|Drqv(qRtqN(MEbE`EdXgv!^SAuV|z2D!hZn=>JBSTgvC z-S-a`Ku`QhU;2;aG~D0~NwyV5XXlABCwBU{ph2&fS5Hy*KFWIso1>EN;&U-4wizzs z%&iu?(d%7MO8S0@Jbwo~2VdWMMBcgns%@$;aw6?f5rfWkkOTm8mlh|SFsNtn87ll- zVRb4dJ+*6t^U8@}cC=B@ zparq_h&P>FX5ufJ?Po05iR*{53lF_mS4*EBsa)J>1kETnAViQ3=_2?ZG_b_-(pkq? z*ex4d%fb`AUtc+*{KQc%HFqA)5DOXCnaP)BP)Cqilwfjx;Zrbyo5{AvwaRmOhFrwh zAYR?^Me2xuF9~cBRKP;-N3*LZX#{>Uq5UFrQ?CItQr$28S`aj&_^T6}wh-y1V#Iwj zDu36d0z)u|!S7z#=Lao?sx2)t1SL*dXFTMW24$Ur<0+pT5q+~ zHlyX*pz_ZtI6M;1k9=U%dhTj6%u?kg6F878&^YR=Xa!T^!)6Kc&fR3>?v6*oJy|bp z#`h~aWL9_J__NOirtxvzOTKu(BeJdFNLygjkIF9*2)8Z4)VbJZbqs-qPdpGoD_Lpv z9Qnn1|`Z+6ZLK|Nblk|s@EUhS%u`_rww2eLD@jEZb->?opI zLDetYw@{=oWS4kzoT zE5Yc~$?Lpy<)!Na=(t^pNOlS<`~)AMuf77AvW;%C*6i1gyha6KyNR`V>AgR?tmh}* z@89>Xn#mtb7wN~$f zjaJUd`Z+#TCGg1rEXVaJa?@-unmM;akNx6y}sCtBldwlB4G z2qTodF^3aNUefdaV~zu5rOUTOdATY?dC3NTmeoLe4ET8aq$Vr*dE)|Ql{x~7&Wj&n z;MC1W4WrgMudvH53l&e%E}M}y@%dXNr_UAhKhOrTOCiw=IiH-jk>i<#YejLU?vGBx zY>5YtwZ0$cwT8O(ym{MDXdwIi=eTl;0*FS0M$kgVnyEKqy?_w_1ftQ}d>xM;=8lw4 zO}TxKvYNWTsV3-1&h`2NYZE=p&L)~FYO{9BfGxm-+~RsIiPLP?rfK}@F?J=2PL* z`4;Kkv%>QjdYHhcEw}M54Wi3FkLlrA=&^hAE@{**cKLxGCjy-HKTaL^Y?_Zda}cNg zPAS{tO^3`&EIE9E<~i113Gqb^b=xO#y0))isS^8mB9OP~;d=Re&J)qtHulKU(b~3D zhdD8#nQIr%->Q@+(h`|(L(pgiaF?P>%s)wv98Nj!I`U`FTDp&IQ2Z_|__71%X@MGh z@EktpTtICGu6-sxG1$#{Z*Bt%n9=xdkjI!rgw0!4KWTodo*}gUfSMCYS^O+pr#Ui_ zdU^Elno9LsN`db75NviP1N1`0su;R_JA-xU*gzRU^oe@4FW7K7}>F$z!X z%matCjmb6l?B+sT^5y1!2?o=T1KR>adjAcZrsJ<^od9;tc(>U7FBuBXfRG16Vs_%N zCi1&Yz6TyHNzpiI5S@l0S*=~Xd(G?p)i z(!^!5y;y(MJrjh5hJFV_$GAyUjQ?*EZ1D6Z@++f&sl^>wKXB+Qq)fVUUocdn|t#u<>@A z2XCIN$ci}04GB?D1fvhgTanZA|5pfwB1nMCRg0SBEIALH)a@&;ni;{L|KG>dLRBH3 zYA1k{>-Jy~O7F_9tkls&O#(629Us zpN9Bpr+==f(;t{3&B4arU*)nCuK#%l6FzBv$9Cx1(sKf)gnD}EyOB`7r?S^?{`Xtn znqVu6KFOy1Dj|xPeuYdT@h|`V9e>iF3GQDZ@@f3(C;$Eg|4V!{;0t{cQYS0GQ+hAl z6la7-LMMG#{%!d&V#5$H)oV(p3W5{9LO{d_!|x^y-_+j@3kaMLe_VW9RC>QH>paL> zLl~)ELH}DRIV*S-f5}PlSa77Z$SZsQY!v>l*t6j0*?F(hRlu5Y@0GP%|92q|iA@ea z*EmRp`~aYQC^M!w8b?;_{;x9A*Bk@9^l#kw)p`uhhFl(l64)^V@DgCc=Df;eLgLB) zksz>ka-_EnYU7^CrD9DE0P|N`b7%`bfYEzTP=J8xNaU7+j2Yy8Z&WYfGyA=tP8^}z zWRDCAt(*y1{b2t}!Ln2gS^Nxb-X zWmh1N3ICiAc(fkuoy5k|eYe(m1up27K8Q+4Iddmk5% z#P94x?pE?4^|_oPo8Gm{U*EI3S%5R}we$Y|)?lagjlO!@=yEHB#y~geKP!chpKO7e z?(&EyBOwND3yaQ}XK>;&LY=35Nw*k?7k+&E5jY877-TZ}Z&v*!c_S_o54h73@??fp zPOz$)GRbbCHx{EZol_|yZ=qOAvTfus?5vfe@7NQr@3{H!KUfg3$MJB0-h7%KBI)fO zzMUF3%gl2ImP0}F@>ZCJaU9fcK>wl(w{MA{e#TazQ!C`5!lVEGH@o8Gb0PpzrOVkT z`R)S5>P^<>5#t>z`lStO=)emh*46Av`<$;XJ!QLB43uggQ~wy+t}EX!*G&n~ciiTw z?3b0HhuEgQ`tJbQjj0tlqY=WAM*A-gg>RcfU4~5nw%2~1=9Z#6h zd?{ROci0ef>m*N4Iopt7gpyQ5vHq##H%+cB8rm*n&B8>l(7!_LU&0c}<~^a3-47-P zd#`BA9XX~8pV@ZnK?TJ6AYa{_F5s>5yEKqJagESrOnG_pgHpA=`lt}Fd$$6&{>lWC z80`3a_5RvOm`*l84lp^rg|Z5|fgYz#a1JWxA-r#(wBHGM4l-|R2EWa`a^qr{flHhD z5c@=`lF6UZd|&|rLs0#^2fcemIsI3}h-&?$4jxnygLymzF-7PDO^!(Dd`hWx-GN=y zR8^!@N2bcf*z6CXAF={FogdEXzBAo6BE%^A|2G2)e4wF`)Vf}BR!TdMi~@osCH zHJ{v%8G1;D`CRson!>d4(C_qodcgsxi#|?j+%j~T0pNPSTysf(WFOr`*5{H^L-vEc z<(>dRt^CiJ_@@c+RyebFBcu3sH#D^B^ki4o$0N2r*=YAF|9YMHYgsmovZsKRk+p(VRHB}#JuNN<-N|d2?L}h zf;VDd?zsk?oz?d12mQj4kLG2yaKEQ}J zNj=Uy0fy~IoqCjW&9?Uk!X7Jes5S{0XRqj}Q%RZ#aSNKb$8YlkAf4?CEi)JG&Ttuo zU3>o@Sq6C|wRcv>p5pGf$GRiufVeghhIV!D`}DC$0O|WtOmCYMl(9aM40&WteLt~J z_t8M7tY-AJ?w*Zz?X94@=pScH04{_%sCj>X_N7Q> zEe_kaS?QzpEm^kJ0y*rNE8`!m!{r{0b+W7c4+aSS;8jM!6Fg+~eQ29GRw1f~5!|{v zUM5`$v|RFM#Jt&k<8;po;zq5NJB(j_T^hTYTEaE9F%lEqZrf}hm8uBtFN>avnLl`9 zAj`=Xx_uaIif-_dyuBK28T)|%&-x%4DLmI9`uX}24RIvY!dL$sgYm1bWK!FWlJwG9 zwQCw_mqwgcGU9o~^tYM*6@py&k(&ta*e3S^sm8qxQph9p;r2i=$z(JEf66@-I5pCn z#x9P@gUZ;pAZ^UQuDD74joR*JVnHNSHG*aF@9k4t2CmiWRDch&kz21HfE!l%1pW33 znA#itdBaGZ_-s`@Ap!VpWMRgi?FgmR?@7N z9*2;!f!y4^?t5d=3)XIP-?J+WG{G6aHvXZ+E(i&P|96SVN1*!W_s49OYF559Jp-fM zw~H4h+NP4iEcGv)^p;0ZonA@k6_B9%w7)_1y7WhEZwN~N!UwYDz!|jp9>qhLDv1(d;Mjl*7u2OHZIp} z^zI3*r+j};54pY#25V-$IufN;eS=12$kU7$-a)lEvX{tpam-~nu0qa^3e)J(ip96> z8yD?p@4-6X(EI~}^cZ1+uA2A(cyP9l1LcgpqHeeU1l9ZS2%v>qan?TaqIuOz>wq;BYU~LX-i)!Y~+Si%d~C;yLc$|UylVpJL3V!iB>); z_%;Cx-;77lWYtbOb`7)nPN6kSA}lz1{qBXL16B8qFzao8&&_V(s`Jt)q(ca|n17kT*)p$B*Zt;s!3V_&P%zZigSgU_;*VRz2{{=XLGReDi z1uK%vLq%NEiGx}TmkO;t4YpDL(8bg;!9CZ);tytyugW*QqQdL^p1C5_Qy?JD|2?;A z(o+;drXaDAsk9AY%R0K@Ysjx+_Cnz9F1bTxbJ2nAuRDfejU6mf5|<5_^nO#ZQz z_@O=Z;x^{l3t}hX-d4owB@Uw-Z!_-lr&SneqgvpaYadn;);li$4-G;RJC@@3s^Ijo zbyCiAx!FgMn5TFc0k6o|+wL-mkdC|LY67s#r$~S2Zq25Q3VYML$%>2BedT1;Xoo`g za?=8m|D`~<;2qyAa=5>$W_4cPk{*&;>p4llc;y`u%GfS>4u;>u%yDuYvu$v#Cx7S$|t*P#{2|V_SwmKZ{KShL*;n6+$kZpv1 zs^$s679$ml5L1psz5O_-)u&8W`k}yj?U1S?yWQUpVfO>Liis!wBA-AJcwc+k^E+5Y$4W+aP>KK zi>ZvMM;XTP4@TGp1h(JY#dUX>i-9OzV6}RxKy}_zySh5(?qUN8rdsEz!(V%fVT9r3 zkSn^a>U*D-!QnQY{f9^I7}G5kK0+U6NZ42Zn7b_CGkLT!eMcYP_q>9~6JKOz`66Q& zm%pekBS?a7zM(k^x7aKjAzJ^?EP68dHLDFXKbp_U_oj&!@|6wcfhk+I<8u z$woIYxN>!jpZq`+M;tlwnW2{(%~!;5Zd+ct2B8vkWR0l+;4 zJ@{tp@P}gX0?)CKapwVjDcAlsVuMI#M=R#qIr1)>zk_9+i; z5l)esD!xe9X6Q4mbb#lYVk?${T+gLt9sJ`s;aW)V!r zd8{>sAI9%1YU}2vjf~^L54k*UPOdb*Vs$PIZ5Q;GB$0`~#48|hZp_g+?Ut7F#M`sD z54R#R_La9XU*C1EQPBR^IRaEsB*ztng(|B=5AXMj9&C*Pzr^iYF^y~(fK)o~zL0P% zDRUGrT<5vanJ`NHaI)4rMO$Ir8xtu0=^^|HZQor$7qI_cRg+o}{p5@+^tJqO*fs2^X5gg(0oEgIewPV7;DxcUGAdI+9znmuV-Q6NvQlKW=2FKe&>M9a_ zn(!ajDESC-lvWZwZW%b&D4Asp1U{eQKhfh6*M4_*es)^??`tq9dU$WV$B)?vUEB6J z~4BKwt6+&X8kyZaoXel#v!grCy%}j{r zR*&l8$FN;(j(F2|S(1<)ZB54Q1d_keD`*1CtvSMR367fkj}W%ehO#o9lKS2i;_392 z{hMtIjZ8JT{R;Gtz1XZHclRymB~V^la$Z9F-4WGqLRj`gUk26z`O@Z-X{$2Z#l6Tr zkZjJ-^yJ67tHREd*rWP8 z_C<$0AzIF7M7moQWiwna7u#2^mN>tIev8(gyPFMfZF)ZdU*d*F=s7gmG`+r%I&sF3 z@L656-8^-KzOECm6OOqhM_qK$b=+;9a}oJ*t7Ndsa)67cGS%8;VyeK&cHQ~a`cl{Y zk87+IL8N%-$Ru%%rq_Pu0TJb=IW~Se_xKM3G*35C(T8_ew~jTJmISwt3xXz{E!1n* z%W+GYUO&3z7}3_x@^!u}s4IauvcFL(x_GdkJbMQ)w6x-pneliAGB4!jIAM2Xqsde+ zC51Q)FIZL7rNl4xrQEhVA2yxjsciB#ncH!vtis{HsF{h}7bCl0JU$`2f(~bSmx_xz zUi>j1e@upMKJSy&)Cy^oJ?3qq#YGg#5^I{frJnaX_&x+M$jkva&}9ZSk)%&X5^R8o zrUgLw7d|oFZO-AoRkLtkU7NXE5#L&NYs=EEZu20;abn3Ne~fqT^0=$iNO_&90QK1A z@Vf^#Zrm=je&SNwb?0t9N!N=v6?xUimd%;dxeV+chQ!elai8wINaE zvCnr`$E)^589n#Dp2KB+&AXs%Mu;+lSZp01be0vDe_20hU!U2BJ>#+V-x#5Bs8?`X z&9hcEZkf0ll4434>zO7_roYxX%K0Bxf>IDhb{?I*Yw+c^$VmFpK>^p%em1;Mg)7tA?FO9eCLYRaiH}J`lgdb_y5|4gzk~^ker-L ziXW@Y=BaDmO|{jyv`uArI0Jxc)*p5IYvv%a+n2ifBb~RnWJq_GE>Ve7r*t&KX$`F` zVN8h1Y``e}b)2vi(Cv@F7*m@xAG6%N-Nse@tztRHgC+XJw{rpADGs@!K93CzrQ+Wn z&wcoQ{;V5rG1a_g$GS$uW21?~gG=}@QIC~7W%w5F)!`-6ANyIxVFJl$kDLJ5p1KZk1s-_nJM@6Tfq|^UVbrlRzZe4d~ z7%53XC8R_^q+5^}M7lvhkZz_CS`?&2x?{eBSMPnlKk&pk zXYaFit!0P1?+nz)K5wfx*({}xkeMZ1K82OTn ze{uQ8W8t<&{@VXeV6GD4RBT)csdC6;QM^T$_c7i%KG+Yf5$4fYmf?#vsH$p42JsbuoS)p>S10I;*~a9XTum#$eG%b z+e+8(26<`I>78s2HjQ?)c3*R7eRCH(U^5xnDf-BDf8r5WzY4k1n1HhAv3AT+dTKJq zzk3CNh2YzQrsT7aL8N%o3;t0gza(}~QzX)>TqmWTtmi#VtHNQNsfC7tE* zt)D|>JK;Gqzc^9F*nJDBgXdBQH4oe`X2`FQpwfw;B_%z->0-yN5*EgHe<`ks6}-WO zBIsl)l+5X5D%Fw--D+pkP@82#Gx0Trg35aG)^VKwyKeU>B6}Z$aJ9ceq_VfhVVwWC z6;DzlwV<66Og_GoN+n#h+8gix5=8lZ#*_= zt0?KTzFjS7<+A^xY6TxFd3?DbV@R02rI6cdKe@v>x~7=(e}Nw->sv6DI(`fY@W%nS zfjV0w5D?hX%UK_S7P@jjp{A{};buvGgII$3k?%*x69laIz$d$bbh{Hw=;r-FubUg2?fEYhRz#*m0$g zy#9|=9D$~XjvE{7oy?K?KP}zlQ9LKONRVqcElMOQrC?koJ)5WVoXSvz##~hFgLDWx zeMwdQ{)O?mSfER<&{z*3J=A%4c{z-npCRFkAVIt_cIw4De5!l5n+zlVtyw=U}J6u==kf*L}7<&OBBQ&x!E&=3~@H6~*o)t&O+-c~EKHJ3Cs$Vvf%*Hhb9TDXjZhT$74>d!Ww2mujEYIf_%6x#UVta+$}MJEeYR z$~4B_3H47p@A&o({8PO6Acjr>y)zKAupO3~0i>oXLB?_P79B@Np4Oo3@v7W4 zSj;NS;~{4j_T0ld001p}+1@{Vprg3N7yZH`Ohj1({*kGhj!JI%@;=0U zJ9n-rhmki!#zjpLp%~8Q7>v)^o0ZL7Axr7czNVu>`56M6?57SR$Fg%hx}OXQMVW{= zo@)ub94!LnV56n_TC2})lAp!eKhR73i32Ry&_X8@^JU$LJgUYuN9W|z&h(ScpFkK% zlhJh_+CeEM^$^#^=L%Mfvdc^BI!K~|(HCdX_p&JP(CJ`z2Jmk9odsW1cYOJV25y+u zwkTlghU_ZVOr4LWYS*~@c%fl2qf3VSU*PuUQUIWQ>7Cgv_3VAJHnEU1p`5_oD}v*D zvf19$v3l#?^NtH_t)!OxpeAyGmfyeT`&mhO=$Q%N?h%j}ZhlTJtSuy0a%NPU6dFry zK$q$J+)~P`kFj@@`G$dtVm_|!bK9) z{w&a7?56kKc(2#5BtCfYtYj!aItA!nO8|ib?)s%nwBXOV`$!~~8CORf4CWZVE3blj|HHArG)5X#`=FT)j52ZmlScZM;O@@0JDR?Y^^!S{jYw_1?i@!YJ z`S2+9{57?l@w!m9gB-nOp6^**Gp+q5VAN>PoWM!++bYMKDPexDG9IHVoy(QQvfe!n zV}PL0>qlJwfB6+qGVC??1BwHZL#)VgqE+-rEHQI~U4NQ{baw%VA#&$#`lhqB7Z&Yw z_GO4=0n*W^J$5#;emWCPMPybIVb?%wog5@bTF|Id*g!ua+-8;R7S!|o%wn{_d1wa+ z1i7s)Y3SwlyXU5>CvIC-a}_yC4rQsH340Zb|98A2uS2QN^o%@4egZU*Y`4==_SH8|Cwz7pbVrA_)p4ezXkh#@;}^KXwrKO z##!DU?WuBT^S?P!>lN$|7fI?0=0j=$y7*o4fnx0WBqn-|OCCic(P~g8U?tNQ+Q2UG zHfZ3%mqjtxWO0vq-JC>&Ivw%azkH?;xGx1}2k;Ktr~0Q?CWP#s>r^;Z5{+OV@3Ol> zihTj^MQO+2r_Dl`-uRV8P!FjHV}6n#_~0VvbS2PB%WWVdz0^a_$c9h~hag4oQ}66u z(2DE(Y$#uv<9w^d&YQ!=*kS9(bi}f^p3&sIb4$bS_HG76~bdcqtw+_RB+ z7UgU^T}6O)_ud_u6Pe`k33>QrtwBHzRM7l1f){M)_Kd*E)-5&EzweCcpI|@)r9iy% zlc_#GzcphqN98;6wt=4pWMSNjIwN8Kru#mrw-RCPOY2wqGG z^S&nI_Rax8dccu{-R$Z#n(IkP4*%v;g$#XRoIoHvhYz{3}huk zCJ1*i2Ran(V%Ax$X{-c97^rLRR4o5m9OXN@`!3e~&Gy$9-1RlSO*TW;@E3m7@{T!j zkr*K|i>IS6dPWM=U&zGSd;B!;BqRGa_XpkYb_KL;p7f>=saaOae*ryH5C&?od2M%fppv4sV>u8ZyhR)EUBs^nOu&KLq zYm~jcSETy!_u-luAYxD?a`ObD`qD zM~lM@X8l3x?Z@hIkZ;_q`00wV-YggHL$y5(#RtZ2je&L$AD$Qr)%>gDEFmrHu+qJb$PfBZ(i70S%Cj=!uCAUDMyc`k}Tdj>Rh z)C;34(#>lGDy%Mh_tKJ}UZvG<3mHko2mJu?gW_$-)ZU0x&P*?RUy`w4AQEPHx|)_8 zMOBVhp{r9&UwsKr&9eT%R84K^;WW4g-4^~QiUqEMW2-6#J2|sgqhDM`yKb=fg$|OK z>LooU))pz1NDUcR*cIgqQ?ozv4VIRRNr8yXJ47)frjCWvp&FjrD+rNrMNU{*_gb9LinzJIn~h-;qX~b^=_w5Qvq%Y7~1PThXC@%H4ZA+>BRG z0Ns7J#_UMcYOMVU7d0NLwS69P+k0o}OWMn}qm^_S0lN90fbU|0!?fcojiYLqOZTK; zdc;wDoa0!1*FKB9_d)DPwXxHghBxshXYDSb7k#k4Lh4^Gi8nB4*oM6kR!7e$?x(GP zIUQ&gSUAxlB0-5JL$2u1uPuUdXSw^Ah-;$!6G52;-}rBUnOafUQQBqGHkF~hcfN&> zhZ@^DEvtH+-P))gPB*O3-wo$UG+LGO`!~+kkVPolgKJUr9PU~J`WDA&o|0Q^qsQm$ zxVe4aLf&0W?06_~Ihug*_x1uTc&KC2On)l6_Hepx8_V-%P(bfe8XzM3eR9Egf67W% zq`%RkyQ+)ukzBT~px)K%M%Xm)2k$f5L@6sfVCbdCPyGw@p#jv0y z=Vb?Y17cnD4{v>l6I~a-r{8RO{cooN7&iQUH|}(^YP2M{2nT>?@ezJENy?EtDidQ} z^p4h~4l&F1*bvh~>gCa+Yu?W=qQ_~rP%9TTQce7p(niPT1QqbI(cR*p50VypRVr`BQWG=i36ABZoHAxRk@B zCXe>K;&<6<>pi#kG`EGVsym0|jc(%n*{gtBf{wE<)%JRl6D@W_xm|t^Q`O7rcW8O5 zC4K!_5)vps8oMnd9X2GT;2>-TztMMdp8$@d?iM0*ul!R9u``y=12NZc_x$ot1(^|! z1xTDL7X&6KC+h}7>Zq|-c%ro%7rP$C_@{|8RNR;xDSHqf(QlEk&i}Ul!OxlR|Jgo} z?g-!j#AQFh$n)f~pAD_Pc5kKU`iw15LU7R}c|9ys0rWu{MZ6=cuD1T@P1g30ZyZ%u zhW9Y%?`MvB;MOX2d>JyseP@10Bq$Vg+q(L(21tflb9^+n`bpM`;hz0B z>ji)vvC7()^6xttez$-aK`$&m)$(-fiPp)&5q8q&YQ9AHR-g93XFbJu&W9CzxaMyK zKB;g=n&G_Q#igKn`w{lOv*(3F-*}>#XP>prhrpKtF~l>eA1%!o5w)pVC}?5`#TqM9 zWMaze_hg~e58jr)c5tv5k1h^b2m#OYsNO$(x6`rP^viGd*E?sO=@zlP=9PE#^(zG? zyJJTE+6gm&Kw$N>|3`MJRGu^qfv}`0s};o>ze>B-3RB)XUHi+yK_&ta*g1Jf z<@B-8AVbIp8j_KF{npTz-GHb&v(^SG)Ja0MNJ#PqdhS4tD2=$)9g{ zvetFOxzfb=LYUlHJO8PPA+9|{V;I7H9NzyncAW;N8@7Eg_nHTE4aV4)8A~a$P;+yhUf;6JT zc7uVTTNPW&b7fXAen1U?NKiVgA~Do+Q;Eq~P5xlD`F3@So%FBAnj_ONQL1#R_DUB& zcKJL|qg4T5(12ZfgGw(bBO0@gn+_69K+w9;=6URMe4?s8b%2#Fv%>fDr#udQOR8vT zIb-ceUu#sT0Fryih2=KUq#)r_Q6pELhiW(Vo*M3X5B{x@^3ubS7QFVxZEUoUa{!EE zxOx>DR%Kt0$_u;@x_z5ff{d}0fJEiCfQYXwj;WjQn>_3xk8;R zMI{Q?6pIV6KKsAIln(VA-#Jc>8s{+gdTroBB(4cwWX$b_c<|Uh7Yn;xxvAibrPiYN zXzA$I$Qp-8-a)LfJl7)Xi!&r;i3v|m;`(~%O(l~WV(CIH;eI7;=DWns)4PA6$slmP z)Q&T3Wnm|RD-j{-D7jOi)+<9DE%}EkUk?a`In1slsZ@G+8#qn;R2^!vNV>qtgw(Dt z70&XZp}MX_j^A<%y+GUSi3)`#v0!397%9EE^xCkK_+zf+jyQ|lQ^UK(OVKa3j?04v z2tpA5+;;)wmm;6>$eL&a?^6b)HuQ%3#x#8)f&kGvJ#Svx$fuOJ5Z6JR8*RIE6@kk| zkn&R*K^JFY;SiT~2>Ylvbtf5P**Ghon4W`#gMnQC*vH)Mb>8@?m1H@JLONPDxWbe3as!A*;^jRCH+~R1*q{C4Vtfxk{WxMc2L{~Pj zhK3i)5vbUE*dDaxX8y6t(2yk&hA7~Tjc4t%)r_Up+5)^C%jV^3?n{52DTWogE1Esu z@S(-Jmj?Iq1boJIX2L{y^~}N@=zGeCntNOyvL%9K7KBY#L1i7(Kq&BXkdn=C0$$ao zNGj(4WjXEfb5tm-{3io%SOv!~voF<}2rHk%ANVJDiXk=QjVXN3}(0U1rg>rQXrJBa&tj+2;YHC%vB*T63(-ZlTv{V&b5BHD(@JcOx^1YX9)jy&v z-?+zY9ePFVW4;rd!{kp0l#Mn~35rM!AwVruxSpnZoYHe!hW+%&TsO3`WaN6%UfD9% z!ZS+%lK+19?O+&nk(E+1Y~?tY{g%H4HmLBSKQ(;s=Xi|QLJkXu6B*_dT}JdNS0SOK zQmn+RU8lWZG{+(JZ~2^x5K63JcbF-+XEYbFyDBeZmZl|Pk5)j9q zn6R{tL%u&?Qh1N?gG`{gOGJ0K= z@DE}^gx*iD<+49ET$s3J*Bz_+`*?!8Xcj&!g?ZJ?aYD0fQ`y}7kfmv>Ix$W7Bt$3S zl4j@LM~1VvmG84D4P1wDAwrS#s3ek152kW4y`AkOS!5&hOmhtRH#i*elC>ffj-6QfR%831F>y{U^nH>;x_%j|_jeH5*wr|5; z!KYTj@ipi)uxOG1sT>-%T`BTITkqN3pB?+f@hMWO=1#`((Ibjo(C>{te#Q}>|9~s4gTMH;aW3tJ zstA;i97PJr`3OLO6M<>=&v;LwoMnmP{`JFruv0|1pD|+Jqon)kxwwdJV%iLRxYQ5c zllqbEURswNH-q3W*-yk0LCSgXB11uf!=wsO{yJm}=fi@?Y*P?vnut^qY8=5khzuf_ z*k}hO$zOD^0^cDS0WUZz-LWT@S|3{xuge5rkVAF#)FPd$ghqKZ*{PnLKtI_&F}R z#QxDV1pGIli&{HE2lGtY2NurNu3ZTq)UY%BNjYd$tl%kwo(cq~6;2!WQF;wQXn#>9kKImh39%*fLUC%gRd+Cxbqh$t7jci>kG_DuF%B+h+6_A1vz zrH%R%0d`5b#ba0pK4SweRY&is>|If+{wnQLE={Nx5Ew-$~R2c{kf`n4m?!FPN(Nd)kSTyy*B?jq0 zXqa2uk8DFb#nwcdw8S-B+GO7joB&0bfgE~VC`Q1+k}8tCH4NrNrSa-dE^$W|vAR)x zfA})8q&HydZdI3g(L+AK5x~)x7`an$<{HzCLBq5-~{wv*Z30aYI>8X0E`Pq3J1iB z{osoky(5!#C>dOK7VVSzQ92sWN8>LSfT;?6_}!q2%`zFgDA&-B$NnP^L)i=otS1x) zO(@f*h@nYtWp?}(l6J%VSMvNVk)<+M?5SZlct~I}ENE<#Visyl2Nyz(J9YDGI~86E z*>B4-yR^}q%yASm$7`=z!l)635|&D!XP#zaVOzk0g1d^^FDfbv$jx!WB$6x^NQ|!8 zspNUkXLPXJ&%COyf<+wVNj}{$WlcBsy^S9V8a29ug*Red5rL3>ev+rx1n}CPy@vMU)Fa3%vVc9$#TOq50C#&xHyytE$?= zAIUMXO%8OEYC%vm%Fmx!qQY_Txi6jF7d20?-NR>1vg9C2WgnBKmwWx z6xgD^@gNyx-vLlAD+TJw7muykM+-<3`5^bROZ~5vl#HpM8Z~A5)s)@?>eW=FoW{_7 zOZ<+>k*Oii%SzUrJUA#x*V}d3862WF@n8iM8zcu+iwIjv4P+DZD&13Ts@TPOF!EE+ z{Ix&rmr_dE4TdJtxI-7XNxRZ>@O|}6Xo=n(kIKw|FsJM{EtHNfrRt|STSO@>xoak` zp{68lTJu%`(d4G_T4f2z!gDbdCF=G|^;E@96ARk2CMJN_a4%7YGD_45&K=N71oKvm z^U^%TrU!NDjxBp8uG+kMZ+Gr}!pJd?*{{_lJZk|AJr2V&GI~d}9I>ImmDdsEx0GpO z^~JiUF1WkQfd;&$rP799nd-x2_C%1!&xXUl(%T&%Ats0 zNHKkg6+tW?0+&#=;UlohX^M@-pdjw|^Ue`$=Xq_6Ae8ultv`j{l8n_%goH!A!xs4G zBsMg4aMH_SmevBX-RDj%r+c!%D=AkKYIcP|(Q=ixo~NK9k;)5;P1VX$-|n<$MRB@m zeK`KP)Q!qeg|Wm46Ikja!jhjUGhxUBTxt+ci@%+E@pJrCxE~B^_1@PRbBvW5W>zI1 z0UDg0-O0<|r=y$mmDz0N?4W%-UmCIQN6fz>;59>ibvKm-Rs3y7GEuj>V%%R;%|A3`8|-{@4xD^h!to9X#aT07SicCbbdRDx?!te)!or z4Lmih$`UX&_h?-&9FD63H@`Ui#Q$M`34b3k)QPg=qE-3+QxV44PQZOcbumCAY7A?< zlvBHS`XpxtYt#NA_`EEpxLU>IK3rI|>ZHF)_Uo zDfP2SpuU{RaJnSVc0?$XuN~^q3c;8b*-nH#IZPmL9Xs%`dH0Bq#w%gnCmo{7q?Ni; zN54keDi@&hFdEEjp(yF~yt9dVzq1nKoK1$|pH0g6?|DH_ zzI^az-^a%9W`mi!VBsFY1vT=b+=!`2=8SU1ro0wYLx2=Pl7aROb{D()ZO8gSzy>`swg z#p82`g(!sY{M5yo1p71K1UR}5ZCzl;7C0MxxsqP9^%;V>q+gOcCbbHBiUe5n={Qsu z(?<_)F$c?uW%f?|?4KAXs``uwV6+csL|wVNU6RRV^upLWr0oA|^M9tlNc{g}A+ zmYpLZcHKsDJ8`@RvUb8=HjZl~diwFv5IOaAUbwq#>VK{25O|;p0{N3E{Gg~e`y#;W zui3E@Gp$q*gTOM)t<PR%|uJ+t?quDO)j7(#CRlNC^aKSZN9^3}gbD@rrayx`c^; z7W#Jm*Xje7W(6+DUrLV6P~F{sGLYAI-t5|jD9*wNn1zr1LBWs#Y$vclNUI|C1o@GbeFfwYUe<;A`%=^T4k4&%s?5-57N&zpLMP4XvsQCEH~a_{f{i_j{Prk{-8dzTyNWzEDew{5kfV6wC!p$ z8;Ta{`@FTr8s{mUr31bc%a?^>h@)@*R#iv=E$qJYzbTRPXSN{_KF<|56C`;p^A?B< zR?7kqhQ46EcQC9+d1ERN_U}$`jKV2g1KPyHRP{F6RHwMK$2!!o&}97<0ioOe8ah3Rsq@0_M567XXmK7-(*E=5i# zWC9WJ7v<-n2>~jB={ZVxb7=7-=|l^)C`H}1^wsBr?P*l(V|~`i8MMsds@Y8*YD;{~ zRrqgP`@1pyYWhgWMKnz1r{L zcdjf`_}2>Jn?jcAQUzIzyP-R;5n(Ta`fP9%n8rS4hpECoZk;@!-BYCZD$&_uKXyzg z!|T8y6^~rI3|Jp0cq7a3o)(e)&j{Ej1q9M^H&Lk9vaS;K-6{dW}2`gm_tB za3A0L8(*DQ`*_1p@jH(QO5&?(ntY!mT{B7_A_}^*-YAf~jPV$c)%$0eXgj4z!$9j9 zkJxH)WrYM}i+{wnHn&q5x;{~#Pj?I|05M+F*Qcm3dt304ArW>pu)6#Q#1-YNo|mr-dy?2j>lkPY#@YHu}9NYUIHaeH<41 z^a-o?a33^z?_PK8OIQ>XGM0l$gbFgF%k1Qj%mW&mZ!jw7TPA3tRTnE^C)&?$`MY6X z2zRqNpBwByxv_vb3Jrh5Qv=oQb?-e#PWNgRAf(j$^B05ib3sNtTof*2P1H+z!HOEY z31k#GVnJzhy;UeE4BAL>ExAK_AwkIZ}_6V5Uu+0|(k_otayu2gHZATn&YWylG z)VaG{8d3~*d5xlH1Zo@gRSSZ2idG#!vz-w0<0Ze!*S{w4XQy!ovv-QH64o#Eu2oe^ zrSB#`d6$hO!9mQgI<|pz7kiAk9{}o4Yg|aWEGFQMb_j;^Lg$V3;|m>BXe7>rdxd#d zkuSBpB~hd%*=7mtv+=La*F14>QTHbFu_;NxkAEcE zSO+^$msel$1C_4vk0oV1xbvOVzpgUcXAwasco4zf57pvT-feUtzA3}4dkbxq>9_ut zx4`}{1)?}kwN7$&1U?`gY_MQ1iF=~P@!_7R%p3Q|JZ&0;xF{-vjBKK#_Tj20`isGm z6mJsZoGJ6|)cE0_1V1av1y}ZoacoaCfKYFZ8uMf8!lpL$7C-JkdLD^JQSAx0|L369 z;@fVhoEo#A61sxBA|12!4bbCT21^;XouB4sj-__nTINEurW03T9}3x1_i!TA=8 zpc$cBtsvhw)zeMIc%f;Hhu~G#)2^U4i0iFx;bNTje~$5QTRA1$i1K4UaqQz<%X_k` zbeWcmee{)-GQ&!_%IPB_$m<$(#Jv4Zgwr`iQ`}lH_`@8OZX7HyUhjz5*g^v^gP8?${%=n~ibW6tsba{A${t(Z%cD zQf3pr0N$Zxn?udNl5v2MA+=id(k(NV*vGFPZ8{!=NElkwTzN!kOv}{O@a$I`MB-q= zt!pw23Tj^vYUBCpAjsc*+4(gg3Ef>6%rU8ys!nU^Ju^bu9rsJ0K4Cwb7&j5P@n&V# zKl#%wD2;M4mq3tVb9uTjUU5AS>grW);*DjU^0K_ans|2X(Ehnje(h5y?fD}n-%Z0vWrLJQ!fh&I$Plm*A@E&fsQI0}cwtJytAP6v{g zIbPa5$N*p821bE)KBYk&yLn_@b5?A*&1nSyeW?-0OQrwOa3}&@Ue0R^5l9zy)(-O= z$+Nw+$wVe{?TO+-`S8&rv7 z330JN5phP7{^zH(SkPw~xx3xU%L(KVy;Rguh}MbztVt@J9wkL9M5D)=*Tzz4__>TS zOmJ%|J7%jMXk$#G_SBsdpU$sB`hU~=*AY9i|WqJw@UmNBk1Ab{CzF3wYevMViP;V4+oZ;M^=58J;M`9y5~$k!JAFFzuv7GD(#xJ+X#CjEjP`AU=V`P~=53_}ZUzq5+l^en zK^Ux!)K*PARU`FwoFDtVxO6|zKU{rOof<}&yCOJIio87E4{qIJ?j&l)(!z&hPJ@hS zD|%3v(w2U?)kC&auXFQH#h&acl>K1Ezs{!D%V#aiDuu>q_?OHCU@R23hj@z6Q~; zZmN#!Zn3wgI2aADM;>)6u5SJYh?~1PFn+=vt0fJ#){;|xm5##-Xy+6T7>tsXG!q_s0d8KoP~~etYX$@tq%xH&mRh zfA8LJ*BM!c;(T|xsHWGOk;CdEDh6Q(`$DZl$P#uwtMgmHsVUxa-%iK!ePpfY1%BB^&kr+v+{l>SSYEvShYX4K{eoBrls zy|Vxd_>R+F!HL$vNRX*}%W;Fu&zzm^A_*5Vh4U4RH7JtN-{p_eD#S~nbYVv!McI@1 z?{#z!u4RoxJL0R^Z}f|A_w*D=R@_kDj8B+j#!V1W2C4rfy06ECJ6`FZS_!ECKt5G+ zOhdfnPe*pH-ADeR{-R9UKpo6H_5;Bxph&aJ7K6O>Bto%HR741$v| zb^R(@_2MpS&k81!NR3Wzl^?B6L{CWLMtrfxdm&O3%D=_0TWgVviedcSlnbbdF%5?6 zof-prSi;ZzX?J9Bu4x?su?*GIVc{xu@wMkScEQ=m?{^UtUAmA%tY!(vh;6({$sIUm z_2I`=fW}pbXM5;RTxCk3Lwk2oF@9I!^ue2-rtlKDa5oEOO?c1~(75{gPi`Pv0kJN{ zFrENVCgIE41N?lWs>dyjN4hspHmk`m37w;|$DHy}G4!u00+q@~1y86%p2hGXDq&Tg z0kM`K`9elD*aMk%C|m?O5CUaSUL&6%4oIVIC?f-8Jlvk6tfiJ7xc)hXh+gqyP7yo{HAh< zVuhrj)yb58s_S}Kd_169*b3oo({;}8n~3b&$Hh3H9_-=XEKCDEC)A8(S8I7FBKZ(q zi;*cSD?r|eCrn{Ub`duqR*uCzz4I$&-&cH_i?yzZZv1&ZBBEurT<&w^dBnu{v5w_VlIS(vydUM_x2@WA%Q-umWPccBe_yAW)%%GM4TsXwfv0St-VmGuD8=Lv=lv z6TpdW6Cn%r;zDW~b$wD++*2oB$zija2!ry!$lkji+qm+kQ~3;2;HYClEq(Vp%J2K1 zqpyZozeN4X=>7hFu-vY;507^${#7f-yt5SC0>O#0y-#2<)XCBECzKb%ACX}~vNKl+e_$ zdJ*K1G^utePsQ)7K&v|}N%2Ql(~K+4v}cb0QCy1ZOVq@D!WOxsg^?dru3B~y^FNb- znU}sMZ4_@Z6{1Bnj3^hVxr)`ug;lp1YA=1vfw70jCe%#}n*UN}jx~;VqlVAxEK=@~ z-qcq2z`g&jGYT@D#Sd5UrY1Bu8P&?2$v)4J@#4a?_6$4smyeIQWKH`0r#A5OBfcqN z$r2uulzqQ(!wP#k{zx7mz0+RyoMK*jk$p_$TGZ%bmh;WhcJ z(`44_;PBZ>#KFxLB5}7WpD`|JuL6K`BE2ulakkJ88(cw?>w#5fP$kamQ|G?Cp=x#A zDZEZLW^nZw?a z-W(tE;m89Lrs|_>E6Vlq;|zC;w1S#}=`S^0kke?E)2${50TRR0hZ>a34D4fC(56Vi zJEk2zcn2jb$9Nt1-*!hs#uJD_7Z!@WkBS2tCGZ3-TAOGuSaNREW}Gk_Ab;n4(L~@{ zb$UQ7!+sXOdrbL0L49EA4|Tzn&G2*x=?hA}6c`Al#^1qa zZ2$HI?BtjR^>wKK8N2&uV5gzEH(lAQZI3Hf{4`D8$N3TGn!+EY-(d+oM<%ZC{1>bB z@DQ{$wgz>=gepjV1UZ7e?aT^FSA;W9Sbo=)Dl=xVunf`BeHbDkNQgPSGrDCS^NxM4 zyfTCz2i1QCU*@#G_B~?%%J0PURruWn<8@y4eL`S4v*OH3ma z^MAIJ^;U}x8MGfu#nx^JSiu`WR97#orf)30){YG~jyaqn}JR73RB>V1_Uiu0A)+j&8j ze;2WiY+6Ukm`yv&tnJ^QyK8{IBMY3a$vnFVGdkg!oV1Vuw?*rNl(MWbwc}DsWu_-( z3E#<5DK*O)#`+VKo-QKjR1HO8<~o51v~W<<#l^vLF$aY6QO15(yM>>97txQ`q)r(a z+=SIl=_B1ujZwNotg5!Vmi@CxJxgPs8m!8zAh6I+C(Ns&6`-TaABdp_^t`NWIo$~t zpEiBItCCGgij18ihE3ep;1}Q5Top@b7qWq4_X-RizpG!AA znR|qPp9Q_2!?C0FP3D5sNeR~T)H=5Mmf4^l3))8o8Lu%n*0dPzgHa^A%SaE9$2Yr> z0p-lAfyRtl!r7E0j#;g@h{X?ILPhXvH5q;DbUQ^}R>j~#JuIimGBt2vhIin@nnO)G zKhC1Jcq~w~M0arl(zmz87MtlhJ1+y4b__O|V_TANy=7PGwpXzYQ`dd(HF3e$9;9kC zD;{NT&Lkx{1^to0j;P#LSq(&h4zrvgZD-gx{?}eMt6PHjH)n`p-UQ&E4RJFB`ff9C z7dD8s@xyER?lIAkMlFxNt~=9P$X(MWQ_ArfC%)ixW-;XGSp?4c)N1;;0bmA+XK=cb1};?N5&R9a}mNmnF0+q0Oa^}Ck4{ZvY? z+F_7121S{y_|mY&Bi(zct08X}vu^eBHa-!cy{(t5Mei5lUOSQ8cTw2Q;U=SE2DWVB zuzPQ%CnVQb#xD0oBc+9F%$PC=>j{JEsHN`{zz1PG2>fa&i3kMZ+fw|I5x%$5Bt(BK(X75YJKqoCL&J$ zjq!e;rQwzL4EUjMP-pTx;XC`;cSXFzs4nURwSGO{1Ye50hteMNF5BdhTN!1y4iYYZ z(&F)GngWt4HiSfRoAVV=U}Ad`aLV}98cCCjE;>DM!;IKaqn<0SSpi)aBc>0~2N+Yb zT!M%=r@>w^1{yBbvfbGuEPmosU#dQ_GVv3yOS!}mMg)4zvdbU&MM1A@63bT{95a(v ztaCEg>nX4+Z@`zls`HTJrsc`8c80Li0`|WCMz<>_?C;HjO!Jk>V;N@+F$GGS$%bOB z5{vHm$v4Puy`OWv+7`sRDs2qPHe&Fd;(_C7;#tXhhEbHKvBGl;{Lpj5+N|<$6I%E@ z>=$Fl0QGXLy_rWY=0PQBP^#gVuZ$=GSwgJw7&L}qqS%6eOF!fPlI0J^%?r?2~>j1Hs zTRSV3bAONmk}R^K%+n=*LwTIk=ISofRV$EpS_V&xRC^evrbPsC6|5Vj3OXiGxaA?} zdx)Zi2i`U)tv|+nK10*&eh$3(TJJmM$^65zt4bbO!Lu+UzninOI<1V&Xa6vd6X1Fd ztNNa(XO1?0{pJV|+0x?|zW~}4yXnNZu`NTumOzqkTv$W|3dI`v;k19!MjC-AN~B1> z@<2kr0QZo{EtwcWP^c0FJ|TBt&ae#rv~xGO#cdA2alj^^cfVbZ?izbHVbHuU&r6*m z-PHUm0vFWKU;oKshf_qBPtCsc=BXzQYuoX!H3GXT40hEvhTCiGdh5lvSDJ5fkJfvK zy*ZwNamRY18Y$)la4DrI6GXHTa!`ix&2iXK*l$!EUTs=!=Btz!Vi534oP{H`?KBomx-oXBb53A z7g$BE4I>$uQ4!fM+GT3xw?bis31U%mZR!rf54L}NbHfLpB1BNDX^_EjNSL!kI)}VZ zL7D*I+3WLNRghs~g|{gIlnS^J;=PcWyzVp}t{+i%y*%1JRL7bf-4EAURFrvTsdxH; z1@5QPE)W+ls|K2LF2G8s8a@EWS-jwteD~sY=JUb{_&PiH+hcd2O}05ibLUN!$^^bR zl2Yq*f+F|_p-}1z?kR4IT+THpxisGzaCj&S&;I$}4mPw+Uc~&W*K$|$-MZM>%ZEa& z=S+I7d|-!bDKc4GFWz4H@mjaGQy*szIUfj3mmoU}ueqxYk0HM&z`SKGZ#%365`g$q zx6!xHt1JP0WE+c(vEKfp$9zM3?Jjs4fI*ru0(_zPtxvKtjQ6K9$qA*Sfl#NrS6%0E zw+%tQMSfqVC%s2X(l!r|DV0LWLgZDD6}{Vf*~i~+^&JpS9IZ5T+R`^+@&C<9NJRtO zqm2DPz(`QSUMr2@){27N=qvBEi(#;p2laaL0y)R-NoI^GTwm|#+qWTlbbn+hb=M+(f-S#_#!{R3!qk8Rd*%k<%)O8lLK91yL#`QEEL)#l079wOzp2cc`q_eiJU_|2L zr`QuGd`u{G)*fNj<6)pd;0F#-$)%0O)Vu7v^ecxM7SvSRhBK9dJan$V^XVGrFL>0b zFwF-QgV5pR)#~Caye0{Q8!J5Z4@$M9Q$HgaI@(1B$#xUm7|V8TCB8tv$8~1`oWfm# zgUYUSJ*QzJ8HomSU%!zu2~qGeP>Kgn6r6Mv)Ecs*Qq_)V&U9kDS-;psu}0@~y7!%z zv%cBBbtn`kT8}wkE`eZ*H*zA4(CBfFIKI1VYdVLd7DJ$4v0z5X!XZW1r+@e>Id7n# zrc9)MvT~@tdzQq{ZZ}=RsKD4qx7@t248huYQy&{GQo9>!in=<#%ykoj`R_XPgU-t| zIPO1v$Zmc@yoFqqV$^tzI%~;pJQe_8DLuaIJ4W3{PUViCBI7@;`G`djS-6L%z>3Jw zF`6&0*fF_;qSocV2Eso7IOSnin+b!*w4XIB9a-cE9qY-3$EZt+Zp(@)2M~n8wM;*h zU0DLq-h$~XHjfZ#Y1~fFaBEjA&0Q(zA7`@(OqMsTMy(>(T_xH<_=ValRR1k}*}mfz zZNn(foDXH&?q+GK^y&|d(QZ=+^f-*41Vr!~@4kV2R2b^abBd8|eCo}DE1}Ff_OWq9 z=PZ4h%S0V7-9JSUUI$=nfz!>MW8oyqTdE2daPJ}7U|ycG*mSeT@aa`CDK-|?leKm~ z$vdKp|5x61_*4Bx|7#>OBZ&yv`^t=jA|+Yb+1WcY*ScKXZ9xC zYjfS-bHB~s?_cN-43Y+c zUqkGUy+yWHx%zzlOn5%xwooR2SU(l4O%R+0wp0>b{+#PT3%B?5VmZeOV zxu*pGa+(TT;?`xnnjo7oxg1Z7O$Yc9?sS=Kz99G{-=r52qq7UypCMQLu zC+^-Al-3hBnb)byHcKXQ76pwB=x0v{s8A=oTKSM+uyrHd20z% z%fFJMyA>K$QeXj-)4hIZJQw=)T=V&Pg{uA3oonl*022 zy$tS`Wc*7#yacAy@HI*!{QL;MWjN8FDfY@WYP0g?bYONcb(aoTi?Y0*SEjO z0}KfLeW@+!J5u_!-mWv{@_xkH+*6^&v<7l#6!adR%bHb&-ZcE$txkq9(vMv%l=+Fw z*ZI0C{ckA02Hf;z9dYAeB0dw}wxc*_bAIyN+~ygaqUzbCzwqE-d^$RpsIta1_vc>R)1dUw~zU?9UjnnWDhsr z;T*yDiSF+H=?MhCjv82ob8sM1lo26nV zXt**em3dzTB&`j~)BQ7&OfXv8P>usIwkJ42A*`x=^Pl;^2jjx0XZoTH=D@Y0<8?+O zM0jp6!}-s3K(%Gi$;$Pp94Vqe%LLNvzufdcKY(}!R`OYuE7dwZn5c0QsA znXL|H&_8&t2e%j(Qga{vJH397U{M7p2FI>5%)OjvIJSl4Jcj+}>0AGn;zmxyZ3bF#yUkpjB{+-XC=plI(S5*e$6_sg#v1?h%$uA}f ziFA@C{2N?#q8k3Dl<7Yw1$yj+@9n|@;VosvEztB`-WIS`rquqKcw%Blval#wrk8kA zf-bNQ|3RA5QO*=kp&a1Gp`zfvj|-EY%C`KK4hX(T!)aFCI;eOPo-ho$tsi1MX~opp z|1ztbminKy`tN1WX*_Gl_Vqf&H;H%NUs8Symh`pRJ5B*WKtkgzqxiSS6laU-rzsh~ zmQ=10i4w>Y=9@eJc*Sw55(gW~^^WQ`+6y@<66u?1^lk48a>cnCe&5A_K|7&ARUrq{ zo35?6Q}p$y>*Y8_&dt;hWT7Kk0$)6$hkn3ZRYj+zdc`zxIOt!K+D0?%4p_+?m30qE zKAjdPm;wZ%osf9jsr2Ku8_SHOxx=gJ6&@QUha38%3A}^{VR( zkO0gO9HZtCll;V%fv-4FULbTDKV9jNUEQGj#aZU?4aS&`bYTx>IfnBm3;$55ne`La z%f26_Y=@Y=^IDlOm3&Y1R!E(iIHr=VS@15pKc+7ng-Qr$-ux>4;uPcE{50V|F$O2i*IU-48Tm^ z<2|b^R>c5u@tbAbxV-!1;I0DOo+kGLH9os!Kz>ElHXM><;>=>D&bFcu{PxiI`2EYi zfW1ptG1!&A3X!#k5|5E~bXdJ@Jx2NpL7)ajar$V@sou7cn2#FQ6Y0(mc7i=&d~wgf zYs}NJ#u;|to77nS6`jxtY7|5%{)24zaXS*R81j=Z#UY%>s!{%3#NQ5T&o$4NMkS3w1H zY*en^CTPG>jCJYmY;+gM^4??XiA61wkLup2V+wK_;uOeTDR$5HF&^1Yfg6%9w82pq ztRc}(s(-Si0rM+OQQdsK@aF`IUdY4R^b^Zx6cP*4L8R~a9i7li)k(F|!LF)`eJJ;mw`>>}E z>^^?F01-kSqgvK>kB_f7e{=0G`QRp1*n0)q^#Rpo_*G^|yzT9)+Jzh~Z`GF~L8w1Q z8o2LXlOtN3gb(`KZX0U$fObBAQreVt{&e=-o7XZA@C%l@_#aHHzG&B}S8)HzS5Ym_ z8@CuUEHR>;+FdLA?7Czk4KlZercCUrAQ@%=5l2XqZpt?`T2u zB-Y=R?k){8vTAQrnYCI>UgiI4^`X6~Fqgk_Q7glb9O9Yde(leGy&cvt4KRE4l2SSR z#4@%7fmZ|!O6KJBg=?orNMFfBzt@SbtoHN@Dt4C5G1}O1dhD89d&q|j>&z*;?DmhU zxXW$k->7clzccViT|H)ZdfLFsoyX~%v5#(Gd*Q5u9*(n(l%XfHMPU@#UoZ~bdGJ5 z$hR-pR#oZSm5NJOyLN+Nv8%g~484LH?kH?DPjS%ZMmnb)g4Dc_3qyZR9x)RA$&J|| zBloTfu?#45hld;@K{j<1teAT0GsRQ+i_L1p$38*mYA#fKOAFcB$o-jEL+5!2IiMX%b#h^hux zd~FsOE0eAn@9W)$33(kHS}KhEyp<3IB%g;*uO{Hl?ax&fu(*;c(qd53EiD(kn-TU$ZkUl1IyNlI1x%Bf_5`@Ta|LT#Qmxxy-0cSK;jKI>>oQyQGKe2V)u9#Fey{sgxWRXhxJ0t zQcw8}OP^rJ^~0?5Z#C_yx{Q3p*Vl2)O{lLVRnjghb-vHx@`4MU8nc*(Rvn5s{1$1~^U;$N0gkV)SMH!SdLpe7ANuwxXWoHcYL zPf15DFBg1P{qkt5rn@9DJGDdZ)rQQxcRkw3(4#9)2IHq`Y@H0{i}U`YMInee5=Y}| zk7XA_!Gw$FRERsWDIhpfZE7u|@Am6E4{tb0*lQZYa>+iSHHSmcs72nIujT0IEQi|8 zOc<>GrrW?Z)98&dZ)g+)q>sn-myZ{iq#U=V0+o+rDHtVW;*;hmNM-Cnhez)P*3dys zj#s_B%dQt#4$vU@NVECfbP9NBYT9Z;+iy$B>dFe~wL3;!{4;L(Gzq*_I@trL(**XB z!(y~I5iWHZgA>SD`*;4xRBywudwzPGw1b|-3p(W{CgE>a!6>T>)N12$gu4f>rN-I3 zxdN4h3X0;q7JoHtB*!MR;U4xQ2d9fZU|48Dm;i#Sjq)>CaSAkNO)v>9?`x|UZ!$My zx|;f6CZ1NP;|C;lCdI8m)%TR^DOM{D0Mb^DKe0M zcIY2NPvCHOIV<&KkiW1tvKz^QWDtfBV$T)Ax*T>BFHP;xdHPaynJW?+EqeszlYC3) z%q4-{>u!Si80zGA=dF&(LSZ^YDv%EqOv`^xCGy&YCntbcD=yy@c~YGHe#L;E9CDVz z>nd}xWAXJqIxT-7g3&^ z9eF70WS7T?IL&CiwZ#{6T>qSmSnuQ4IC3rW7k*qwaQb#<_?;O&gmemdvQvmnVZbwS z$hwSAE4;$)6Wcf(bhpnk-m8FYBtf8Q^=(lrEa5FW=d#V$me@=SLpp6CV`rywW9KLqC_8VrFP|a4%Xi4L za#0@2^PohKG%_Z1*Gr(ibRC`Xl!N+@4h{t97%v0(R!k~p%|^1B&rHD09K!RBrh;k8 zWj**%TqTq`jj*sHikA1eQ{2^sH4_#k^~dN`>~Vfh z>v&cYNTKaTu9bA0jMCz-lWg8@Q@I^Wj|VuH&UAHs7|TN&qvAPL#ujVx_^tktex2$K zhd~#%;8G4J9ipEh8Yu&8U`&kaGFzYd*CS8!87cJ!lSJ!4(4jjH=&!0T(5tiyQgW$} z3Z7r-hU*^OTugkOZqIzPr1OKyfZNLZM+Pf%pUQuWFR%)ARQoO!3)piKD7XtWgZn-Y zQD7*AjVNBdi&CJ?RK|5W8(yv!()U$*= z1PF-j9{%=%0SU`$=3j=C_THT0mvkK7G-IO4U_V6^C^g#t5(0oY++rWh+u>=Lig5nDgMlW&)pG)9RJq)I4D8 z*~Tu%!KxhF)<;o7;8m&I3uoL{#poQDy-eK+BqiyHUeov!8IDm;fKiZ0w zFek>N<)&SlKZ@A z)|sm9LzX5c`FyaicgDO7YdW9)8H`yTVV;~<%>X8KG#Z=ur9G{~N0cCqV6=i`3U7>2 zUIjm(`}otD(D%ms~ukYEo%~CvktB=0bB2LdI>HYoN{celzs~tD? z+@kBBmoy$*w`p*$=hfbmHm&$>)t90D$nsZ;3!tFDuzzpMDIXn2*(YF;$DP2w9&%r7 z2y&-3BWf@jUO+D4Dvf0-gq*>=oli3sOpTZ0E=am552e~G?H#-ZC}}+B1>F5(s-sm` zmubJcq2D{PcZ-yK<%|3GFs#mA z8g};2#f~UpkWAsXXQQ4nK(1AMbfVfX#~kgMIWt82p0+!#x3Y=(D%q4B#-@1xDr3WFMV~-KA=Z$Um9j3PDs#YR1{Is1C(vDpC}_WU zPwL*WH80$%_nGn=kCe}(GkRt`@~j2)cf z!Mc`9i$d7!!)HtJ0=nyIAMQkQs>qtZt>a+ZdP{SYG%-B-7U!^hke$j_%4xlG1~T~} zR_$bcZs9SPlz#F3fJxq@#amS|cJR-hEM7j5^Wlqqrw`nN&oVgirPfsNB*)~wcAWg! zIQfxJhq<*dM3^N-P8_W>D07i?LTfXrP3v+OON`(<$La-6j(=(yBZ7$?EBsDgt^dHr z1f$p!>4=L6fd^65(k^r*s?fWcUt*Y>pj>$h99T~R?w>uy9eIn9^c~7WjzS?u%&ApM zRU(<6eKJobGkNd$D0}R^QMy2Y%o}S|W!8)9C(0xL_;YADHmi1W3&h}CS#lV=XlyIv zYX(S!WKTw%iBIbD{X_}Isc^yLq65>HMsr_3N8w94DavVYW@fD3oq9$_YEXX3I_5a{ zeLlZKoYg=~%<5mO(2}sM28*>|e1k;eD#}env;|)|1*8^j;B&#lIQT&v(xJV*qW}=h zPl}Cvw+S$I6!GF!j|xp(90-X>a~w%2Q2AojZf{rsL%E<5WPdyt8CU*E5rdN>K3to| zV-whQi3zOXwT|ms=STpanK-X|F7u^~`MgWjkLuMEKX5xCZIF{zNcA6Dne-iAr;3#4 zyU^PHiJg*40ZtvXB?5+nGDAEYutI+R^Z(ReY$bLqJv=!9B)p#GK?0g;MOz~Tte=!> z<|0*g>yGE4NEEJAQqSkfD_`LC)uG7+k0$2?dz4bp?TaNmxbv^UkapK2-2kiZ8b7C) zNv{*DRpr0FMk;E=X|a9VcPHoHppc*DJ`8?(nayT#9(?s(s>nEJI6T` zu;DxDo9-{YnV+eDQhyUO7xG>`jY&egyXyjzmTOnz`qz^+?hU<^Wi1hNU~cz-3VAHa$Ag>krY5HP=ohD>^p&>4 z1u;eU-P+S(B3f!uae}6MHz(Z&bJ+hT7~-)%MDEzhI-fj|7=S|+zkq07!|kz?nHNx5OP$Gw zpsd@;GDv1P?p`Z2eg~Gj^VpbO-Mmp?kl3bH3+FN@$hqC4Px$+fGTyR5ga6##c!JwiTc0r)L>B?tjTvXKP8LT1Y6$Q6StnOeFF zIT^|%#>8S|=M^90F;%(g=`ifAK22LG&oL)kl@4F?He;vuE* z6{^jYdx5;sVbNTB?-17RxSCMynd9qkxWfiWkbWIPdsy-O>s{)0#^g}N;r@3MkEdBR zZi9KdbV03lzZv@7ingGPf?yK9zc~%JZowuVym)YleZC;iZ9UX%WZR?#R)}70VU|W# zGp#IWE&5D|dKMHKKKh+v2w-I!WA=hh{?Qv_=irXx^|p*h7Yn?^b6P-1sX^bc{zjcs zQ-go39|jnNj|M>Y#-t-9BUq&wQiIoG*YQ>BpC)$Z3bkv*ZdN(h|6_DZvp#G+guHas+#Z<4ZJCpScJ`l%!)~B%iC8n==Mv09YvkWQ))Fov~GnnV>-Fz4%&_uI-hi~77>FL{bWQK zuwWCQq!sqvI+fb5Wj0*ygfY_$>u`iAb+;PayjjqxqjQ)@W%0cPBi%OT7UHVfs>>aY z>%Ce^b%nDD@To+}b&AS-RZ;otO}C8*l-N1qAM1kGIj!vJT(y?O(wT>I0tO-ryXDvw zJ8-4XB__~91H2dKp@VsWlVb3M1GQv+hXQ#$!STW&PxOLjd1payi0A5uPN5ExRXvaK z44Hq32kfb;CJx`GngF+&4$DF7tsjLElyNtv?11={p&+3~(`*{xNltk5T~(J}e$OwE ziXAv^MlVRNO7r@pmq-@&{(yD**3CJxg&XX=+NvF@DR5Ms*W$P}c5psM=4`528InURQimIaEu}>Z;;&CF!cP`iDmX^+0>_+d)^BF|VHl4vj0uj;0^)uJqO65tn`G)xX~SoNP$4iVUp?^XNB`ddJx`u-{HD~>o= z*kDg&F|iCNh&g0}hqOwiIi3_eX1V+3P>>8h>Q^YFjlZa~nb2twOKxtUif~|8ZyU6% zPl*dr9hgAd@tbz1{!SePI2Ed@$-{tAecvWrEmACWQAU%>_SYp`Z#T$tR&@j*^}fHv zI}ZghiF~i)v4x>GsU2PKY7fLqX@A(^i$}DS9ZN|j2cq>pYqgi~U(|N5zJvKO_Io|s!{>k< zW0MP=71xpO!>6~h!gDg9qPj@B*jM)1Y5pp&jp2M*%*OlUKdifEuL;BMo6aB&x+Iun zyfWN_!)?~u2ABw@Rh z-gbd?n+IHt{-$V_PTS(O4cOS-8Al{Ul&H2p4BmH~*i|TQx@0us{tkf0NGDbwghM;C zGtLT`YKc5OD8J-3b`T;GVinY4o*>;~o-*y4Ec5ZVYa8+H?65Q8i7DDtI0Jk2T^3#- z2e{Dfw{O1izh@wDE*hOQyEBF@0qhiU38)jgBSE;c0bju;ugAQc81a55o?Mn6CPBEs z5$6Bi9X7^y6$&qId*N~~xBx}jK@y&rNA^c?2`9^+_kXcW6D?iSd`N04f^-GhPm)F; zx}mOmOVCs5IcpCT><$bnYdex~EhsHybqBTEfH7tuxa%5sX=WEj*5os>w1sh9QjjgPTrT0&9`vU9@FqjcMJ-jV`n)C@Ga-EA@;x_cPeXn^Ud*L zUm!1hU)0H$*)+gZ&n-eZf&ds_M#FnTeZkDSwFb}FHGMKUNA+5JuiXv0{l$O(Hax56|#w#^V zVq_FXJ{S#Ij>=jRcWhfw>Qru4wN?M+b8n-*;)tnmxj#7t?ZO7V+MY}_qM)M3|9K#I zIcG;z6mmdf0ip*km5w8B2nGV7%KeT`WaCV1xlR<@slIln+}1Y-bZuhj#$cMK^C2x1 zR&tLdgkFTW+k6iCZKb`xF%@ujdvy?c6ncOJ;C%J0<~Niv!LwyrXp}R5^*XKOslw*RXMxIyA{gFzMilMW~;JX~+2L9%^K6dJlRg z{kGv*?*KB_>bB$Z1!RfOj=k59@RB!FANX;g6E;<;Z&cn3qNxXIB=1y>B@!N2S}uM~ zhF<187CFk#z{fWDWfedKZ_K!-%zU0r+XGYed;}lpr^^E$KM0tdru6jpHWHWX{q0xpp~su7-7t)u-I3r&yMS_s zd)G$we^?SCB5<~TZ*bP=4skr2ApiDW_z^z~Y%Zeo42!Jab4-2zSG%@`(ym*J@5iej zuTIx0;TbQ&yt7F|TE5|B^Ypx4xmUcx@oNWdUpFhQ^DQiw{Zf9KlKFTP)D6DuH2xBJ zKQ3^9eR@6KQrrZeU$4Ng!9Epa!O=4NZ+}}HD=00L!1C|X^jSadILGoXDw2_}dfL?( zb`44yWBSc?qNM6~ECn$~ye9D+$rUttczWpM8w-YdbwA4C2B8{G+4kQjhefd#0jmG8 zyBY^_73W7ILCNcrq>I?dx+xRu>D&Q1<1UtgHC!mHoJIO$k0#-d z4sw-&aw-FSU-FFFfJQ-!c$iEhanw=zM|sZFTY}SPj2><;X|A(us_dfUx^8_83AF5T zPsjh!q8nHHKEDNaz}FgnjeNFo)?hJ)?spupK^y?y-D10Uwto7qI;=-w+Iv` zvuKWs2)wRt5ov{qbqQEfVDY)qmcS}TsH6z&@MjkiKV&LQ0TM$c1V!ZG7T`UOtYjbxBDoM1$B{e0vqO!xBLavxnf~v zAoxHAqPRd~0vBQfJ#muHN{(TE3Ti03eiz@wnvv|}W!+P8m8qL_oY+3;xVK~!c+;+- zp4Y8^o=F-Y#4`39vxXonn|JMHLFM&lF2jfZ>%-w-57L08WZfcCJa(lK&M>8WG^sEA zqzH~Zu^E=dhl=DLzgVlSmtck4dx?CL1Bs6s13kq9&~FzmN&M_Gt2BPS7xrj33{zic zQCRurnIsNKFj`6sX6o1RfoFgLis)09^A8y?Iq7(72Hnb_ytdt=E(pv%E3dq+Q{pP} zrYyFKzOghyR<)Fi^J>8W5!N_cTO~V}dH3fC3Fchru3~0u>njBkDFyZ5J)6G`#B%G^HiUy?Kalw!9-$%=mAE zvwGqKYwKZD-I#OP^6_ZV#+SX?#cN|)g|sNJN6{c9NLcP_!BcrR!a=}p*YWgZbyhYC z4sgD?Knxt?AEjpyh@9bZbj+03C5Hd@liDUWsQJQ=!~%jQF->yEO-G|b(Z>L5T!u4v za_e5x;lDZyNWIE4F~;z5n}e}lgs5XvD%{&o4zG*$HTLwvc^i`bKLXs8P^@X=4Ei2Q z@=Y&1H%KzR1Z!rBuL&wozCHuYnB}r_kvGyr@oiFI3nu)I2u*p>Q)ig2q;*qTs}Sck zZMl2-rNdI#iST}HTw6qgYzJBwEji-5rvx6q%gU9BADzC>^Fjc0k(w%PR`#({W+;{I z2aCo9ifWbU9>%m#L!ln%|B(3L4n)5j6?y0 zU!i+qzv2-<0uSfp9O>@e9jScS2WaD*F;l1I_V;hYG@Jk^R{>}*>8GliI6_iT*fZ5{ zv>yM%5s2-jnj^Yt9yT?o8;sK=xBNQm1m9?QIp>=vgqy`ickZxU$&U8#m072p=;LkU;?Vu2ne$kx)@Y>8eUYC50!#YOwgW^T45)ORoL z^f!W>GP72IpZy8kre{C^*OG>o7~FdtnvDS}xy}kGN0~`-!UVyG2+!R{jiWP3^;7t` zEGK{=2ZWUMf+2>>hPhz7yR z@siP%^tw|bE=u^5?((9_2k4LwmO8m%8SmrKla+4&mn$GZ=t%!D5(D&gzMfqlODeeow0HVk<78j`^k z<;{o?8-9yd9n@qG=4=eO(FU>GQVXe0@03A(>CAwRLUdSV2wkQ8n;maTi)$?H0~vXI zdO`wd{mx>f&TN|lJ*nWje*VQ5C+akF-oq;A#XSBCs5YUR^s@|q5r&{@lDWalh} zHm*R`o?rXkBrGIT;9K8T`=Rx%+kB%#SToa+p?FGdN_BVp!>2>S-sdo>io^A%?{fLm z=&o)^8fL%RE13-S{o$TkGat%daK*mmXKJ7=&iD&PL|z2y0dTwzelqs!Q$Q=Qalpb1wf~uFnQTP=Hf=w-Jg9}N`WLo zyt4{ZGOVv~6+EA>UpSY%D^ZrJp9Plue4nA>o52?Ic(b>PV=iYW@se8TV zf82HS5FiN%Y!yG?HW+Jo0|f|7tNS{)nL)P)NUE~J)w)A%kqNcSy;Ge4>%baD|lBWI-A=I!5%o6$lMlA*0o)aZG9!bTF zM3#1q9FCU?Y>hU*IG<|K{?wX!sqzK`*C z4*K*_Sgi$Smj&kJmdRVRhhB_|rq8^QM}htEFdCrM#jPm~c$zVnw8mMa3mT5HF_;R= zCD}ykvauPK;hIMq7@qBFho7vJ8o&aRr)K!+RWakj6J<)mv6BsC#pF$HvZtbmDT*afU!YIQpjvUH|E`MYI#v zZ)ZUBg_~~$BhGnkh0ad%X$9!UM>NdFc9>Bm=^eYF4aT?jwFEjnV{O>C+Mm{@gq1vN z3-rEb@7W*hHCk+vp4qoi>MQbMNa||9a39b2ACtFevpg!c7c_bIGC#{%BY$RgLJ&Cr z&9k=*R6i@-E?i1erQX|^M9zQ!RD$tqhBJ=ApO!Pd^TnF)enDsn8aW5NNj9}YmUn-8 z4oroaq>Q$&2IFlD>U~n^j!p{*)l(9iTCN8vhX!C7YTc6DUeUV0daW|8%M)}Q$U7Zw z=slBU4F4P;_h6B7v~DZ@;znhaf>-$3fE3!-(`0D4JbY9n{uX@i5nK-j3~sPnK^hN8 zo;7=@dMD_=_i4)b@U8Rk;&us@zM=EF%(8y_mRd|!O!}7XGtVuw*hDRww%pXqdu+H` zArTi1y%TufhzPYNJIfy3dBU5~A=qt2XU*N{9$K_2bE0T_kXN#w+Isbo%r}~=j~;{v zpFK}>+Uw*sW_&~Q6wGe>FfEHjA#TVrg3bSi_Yvk<^3@Mz(iN;%E2`?e)|SQGQgk|3 z0%nGLZKJQbdpUVIx~h*x?}xm?Q1dRG?kr}n(_;HwUG=vQ^}iAQJ`w+?kbbWJ|KFEX zQV1-IhVVlZKGf$L2>4OHsis(P!|bu0#pTNo$f@4v8fv#FNH36re^DskR=fwES#iI_ zMBvfg$7dTn;kn@IYt? z_ZRTDH2gpRWlbaa`x^Jbyx<3D&;v0Xz(${>Jg!Y;PLHa^v~s<7y}tbIr&CsJFIhc6 z(NWG2u0}$dPw%pr-kPg@GOC?Rl4CvHZ9+>aawU%N(o>$9W@}asq9ryV+!WP=KHCHy9lU(`Ql|dn$K{pP)f&n9 zrJTaTM+5`}YBLKFp9jx(@**lKD#C7a%z%-{*9@_lcuh=96uf;qb15`BkZ{m6sWJ)4 zp7ta6wslokmnubnR8$oEHsSv5Xs+igqoem<&E@9uXNs~JbAO*^H<%KFLIV_~H5Pc(`vn4Z=e)Oh zHi;UD&ZO~*of;8jhUrinc?J=sJ05E`%v3O#J*|r!xgR#l|4|B#uR=QON zHWOg1+S}dyc*;nt=!?wE_M6njzP`Q*6pGhOrix)vjW-qUpv~G=my6=lV)e8s2oqtj zq!Xg<64tN$ElMULwD_;{X;p?p9`VpwdY>U+b;!wKyvOp8cxHCiLf{cUKmW27dz#st zlY>KUNi!p{zK{ij?(j7TzP}5CxFzUDSoC(eN3)v{Yi}Q;x*a~GxB)%V)00-oHu!oE zay^(VNcIjSnCZKSfy`sKg-_;Cl=ahf9YlW%v84>;3l%<75cPE;P98}WilnWM59Y9# z-Z=I?l^cB;UyyfHCuO}(7g0mL6lG;Bq;U{FVrJqjs;Y{QPfS!vrD(rx>+!iBU01_0@RYstxMMx zMuvxb$}WXS!O_7&^`A~N9B8hFhK6o4XXoX4XfKdhi#YlF`&068vXY%gSb4h%|H8<`gmInCTzQH-7C@U)v>=u;s!3hTd<06EJuD>%h$YiFlS=5}>Py2EbQTq=~O%p|<$ z7VlAn!pDqUQg2xXLPutZyX4>)4FC4Lt%f{V5yCLhpM_qtDeIh{l?!3Oo)DYajlt7Q zLE5!XY0!_?w;t3MKt&E&Z7*jym z5+1R;ytK4*PvQ%*Eun6P0Sbk}S(mrvO{$1;%%3A3^7XU_nHkN@8hvrisp*}JI5c8T zl$(R5o-A$3W3rC$$J(_h&6kZhaB}pIM0W;^IuJbB2M-T|d}u(z`CaHoOb1*e%(QL1UFSi!6;umAecH)0ZP zHy0O=K)ft6^7Hfz7npT8oIM>K`zX#(Qk|vKQ_~W1u!6bY2hYD6(&eylG Date: Sun, 16 Feb 2025 15:53:18 +0900 Subject: [PATCH 29/97] Add MAINTAINERS.md file Related: #3839 --- MAINTAINERS.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 MAINTAINERS.md diff --git a/MAINTAINERS.md b/MAINTAINERS.md new file mode 100644 index 000000000..e6b170b12 --- /dev/null +++ b/MAINTAINERS.md @@ -0,0 +1,5 @@ +Current Maintainers: + - You can check the list of maintainers at: https://github.com/orgs/sqlitebrowser/people + +Release Manager: + - SeongTae Jeong seongtaejg@sqlitebrowser.org 17ABC291B166F699409851AA9503B162E0416CE3 From ec0c3a3654e297f9479a696aaa6c3301fba7e299 Mon Sep 17 00:00:00 2001 From: Justin Clift Date: Sun, 16 Feb 2025 21:50:32 +1000 Subject: [PATCH 30/97] Sign the new MAINTAINERS.md with my GPG key --- MAINTAINERS.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index e6b170b12..7db6eeed2 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,5 +1,24 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + Current Maintainers: - You can check the list of maintainers at: https://github.com/orgs/sqlitebrowser/people Release Manager: - SeongTae Jeong seongtaejg@sqlitebrowser.org 17ABC291B166F699409851AA9503B162E0416CE3 +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCAAdFiEEBeRj/bWALD0AJX+ceerQqzvX3SwFAmex0J4ACgkQeerQqzvX +3SwZSA//Tsy5H49Hz1MWLcH5ckz179E7YLDR2p2VwdktbLHjiucWhLtjjXObG3VZ +oQauowsx+HoRk+Ki4+ND5L0fBP3JqPx3HxW6WMk/2gCy2HKEsZN2NxSItGp+HdXw +wTSFwda14mFoN1nxg173hTHH3bQtAWj/wafLvqep3LD10SIAn3sLq82S3lcSvQ6n +al/iC6hN4esDzSClke7nMk3xCwrx6o+hSY+oWl0h01DqkpjjJ0ugHJ+0+cTjn0OO +MZlnd3GKUbYk7hOazvx67/f6rfjc69FPjnVGFjYkBeAKlJkpoL3FP7kZGcbw0doR +BHBgWfmjw7XWQtZFeLKZiIqs7CN/nrhpu/vOgpzvlIog/lNl5a3fdEIcImsML8+8 +TP9G/ly2ZVAk9fVkzYlymMZomGK1LqFzlmR3gXZiJE91YkYq6Y5hIxXBp5XlxcTM +q7Gaxrajgk/pEqOYE2mKPeHFIaX3ofr5HdOtAMt1TFpoHUNhBTEdOkWQzk6uSf5a +zWQjq9JhNylcvrsguEwZV7gmw1pbpKRHp1NK6oGafiTMi65Q0skaT7h85B9Pwurv +235wXthl9Rt3cn6G6XYUEeF96c67ju0CTZ6h22f5cf0Kuk+NJRrggi9FIXcHtu3n +z7zPiZf5lziTJsFRrvhJowH6yXU3pNudl4Yu1g6ymb/1ynlEnns= +=t6/z +-----END PGP SIGNATURE----- From dc612464e5b2883f04d3a54030d1e0c60674cbae Mon Sep 17 00:00:00 2001 From: Justin Clift Date: Mon, 17 Feb 2025 17:18:18 +1000 Subject: [PATCH 31/97] Remove the GPG signing text from MAINTAINERS.md Just the commit(s) which change it need signing, not the file itself --- MAINTAINERS.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 7db6eeed2..e6b170b12 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,24 +1,5 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA256 - Current Maintainers: - You can check the list of maintainers at: https://github.com/orgs/sqlitebrowser/people Release Manager: - SeongTae Jeong seongtaejg@sqlitebrowser.org 17ABC291B166F699409851AA9503B162E0416CE3 ------BEGIN PGP SIGNATURE----- - -iQIzBAEBCAAdFiEEBeRj/bWALD0AJX+ceerQqzvX3SwFAmex0J4ACgkQeerQqzvX -3SwZSA//Tsy5H49Hz1MWLcH5ckz179E7YLDR2p2VwdktbLHjiucWhLtjjXObG3VZ -oQauowsx+HoRk+Ki4+ND5L0fBP3JqPx3HxW6WMk/2gCy2HKEsZN2NxSItGp+HdXw -wTSFwda14mFoN1nxg173hTHH3bQtAWj/wafLvqep3LD10SIAn3sLq82S3lcSvQ6n -al/iC6hN4esDzSClke7nMk3xCwrx6o+hSY+oWl0h01DqkpjjJ0ugHJ+0+cTjn0OO -MZlnd3GKUbYk7hOazvx67/f6rfjc69FPjnVGFjYkBeAKlJkpoL3FP7kZGcbw0doR -BHBgWfmjw7XWQtZFeLKZiIqs7CN/nrhpu/vOgpzvlIog/lNl5a3fdEIcImsML8+8 -TP9G/ly2ZVAk9fVkzYlymMZomGK1LqFzlmR3gXZiJE91YkYq6Y5hIxXBp5XlxcTM -q7Gaxrajgk/pEqOYE2mKPeHFIaX3ofr5HdOtAMt1TFpoHUNhBTEdOkWQzk6uSf5a -zWQjq9JhNylcvrsguEwZV7gmw1pbpKRHp1NK6oGafiTMi65Q0skaT7h85B9Pwurv -235wXthl9Rt3cn6G6XYUEeF96c67ju0CTZ6h22f5cf0Kuk+NJRrggi9FIXcHtu3n -z7zPiZf5lziTJsFRrvhJowH6yXU3pNudl4Yu1g6ymb/1ynlEnns= -=t6/z ------END PGP SIGNATURE----- From 1d5d3d5729cadd5d238a1aba6cdce19325a43b45 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Wed, 19 Feb 2025 10:02:29 +0900 Subject: [PATCH 32/97] Add runner architecture to the APT cache name --- .github/workflows/cppcmake-ubuntu.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 57e902e58..5bf2b8a47 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -29,6 +29,7 @@ jobs: uses: awalsh128/cache-apt-pkgs-action@v1.4.3 with: packages: libfuse2 libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev + version: ${{ matrix.os }} # This is required by the operating system version, not the architecture. # Related: https://github.com/AppImage/AppImageKit/wiki/FUSE From 943a81fdcb9065fb91d357ebef44384a4ba4586e Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Wed, 19 Feb 2025 10:32:12 +0900 Subject: [PATCH 33/97] Change all Ubuntu runners to use libfuse2 --- .github/workflows/cppcmake-ubuntu.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 5bf2b8a47..1de02e6dc 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -31,14 +31,6 @@ jobs: packages: libfuse2 libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev version: ${{ matrix.os }} - # This is required by the operating system version, not the architecture. - # Related: https://github.com/AppImage/AppImageKit/wiki/FUSE - - if: matrix.os == 'ubuntu-22.04-arm' - name: Install and cache 'libfuse2' - uses: awalsh128/cache-apt-pkgs-action@v1.4.3 - with: - packages: libfuse2 - - if: matrix.bundle == 'SQLCipher' name: Build SQLCipher run: | From 1d6932b7c003df562f1811b581407913ff808ada Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Tue, 25 Feb 2025 06:41:46 +0800 Subject: [PATCH 34/97] changing a file to UTF-8 BOM to avoiding the Compiler Error C2001 while Windows builds --- src/sqlitetablemodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index df7d4a451..1e01b2ca0 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -1,4 +1,4 @@ -#include "sqlitetablemodel.h" +#include "sqlitetablemodel.h" #include "sqlitedb.h" #include "sqlite.h" #include "Settings.h" From 890b0282986721d804797600ec74d4cd9e34ef61 Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Tue, 25 Feb 2025 06:44:42 +0800 Subject: [PATCH 35/97] CorrectToNearestValue for spinPrefetchSize --- src/PreferencesDialog.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index 2a5cb785e..a37d8ef3a 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -684,6 +684,9 @@ in new project file + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 255 From 84d67afbcd0982fc3bd37382b3b6c6b9cbe28547 Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Tue, 18 Feb 2025 07:33:32 +0800 Subject: [PATCH 36/97] add AnalyzeStatement for structure_updated --- src/RunSql.cpp | 4 +++- src/RunSql.h | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/RunSql.cpp b/src/RunSql.cpp index 31cada67d..537c5e202 100644 --- a/src/RunSql.cpp +++ b/src/RunSql.cpp @@ -117,7 +117,8 @@ bool RunSql::executeNextStatement() query_type == DropStatement || query_type == RollbackStatement || query_type == AttachStatement || - query_type == DetachStatement)) + query_type == DetachStatement || + query_type == AnalyzeStatement)) structure_updated = true; // Check whether this is trying to set a pragma or to vacuum the database @@ -319,6 +320,7 @@ RunSql::StatementType RunSql::getQueryType(const QString& query) if(query.startsWith("CREATE", Qt::CaseInsensitive)) return CreateStatement; if(query.startsWith("ATTACH", Qt::CaseInsensitive)) return AttachStatement; if(query.startsWith("DETACH", Qt::CaseInsensitive)) return DetachStatement; + if(query.startsWith("ANALYZE", Qt::CaseInsensitive)) return AnalyzeStatement; return OtherStatement; } diff --git a/src/RunSql.h b/src/RunSql.h index 15eb615e8..6a9f13c2b 100644 --- a/src/RunSql.h +++ b/src/RunSql.h @@ -41,6 +41,7 @@ class RunSql : public QThread CreateStatement, AttachStatement, DetachStatement, + AnalyzeStatement, OtherStatement, }; From 791a2d874e4edc43bad8c9cf857230c2da3d148f Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Mon, 24 Feb 2025 04:59:16 +0800 Subject: [PATCH 37/97] Avoid touching the Modified asterisk marker on Execute SQL tabs --- src/MainWindow.cpp | 50 ++++++++++++++++++++++++++-------------------- src/MainWindow.h | 1 + 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 89546255a..a3f653bda 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1147,7 +1147,7 @@ void MainWindow::executeQuery() SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->currentWidget()); SqlTextEdit* editor = sqlWidget->getEditor(); auto* current_tab = ui->tabSqlAreas->currentWidget(); - const QString tabName = ui->tabSqlAreas->tabText(ui->tabSqlAreas->currentIndex()).remove('&'); + const QString tabName = ui->tabSqlAreas->tabText(ui->tabSqlAreas->currentIndex()).remove('&').remove(QRegularExpression("\\*$")); // Remove any error indicators editor->clearErrorIndicators(); @@ -2149,6 +2149,26 @@ void MainWindow::closeSqlTab(int index, bool force, bool askSaving) focusSqlEditor(); } +void MainWindow::markTabsModified() +{ + // Add (and remove) an asterisk next to the filename of modified file tabs. + for (int i = 0; i < ui->tabSqlAreas->count(); ++i) { + SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->widget(i)); + QString currentText = ui->tabSqlAreas->tabText(i); + if (!currentText.endsWith("*")) { + if (sqlWidget->getEditor()->isModified()) { + ui->tabSqlAreas->setTabText(i, currentText + "*"); + } + } + else { + if (!sqlWidget->getEditor()->isModified()) { + currentText.chop(1); + ui->tabSqlAreas->setTabText(i, currentText); + } + } + } +} + int MainWindow::openSqlTab(bool resetCounter) { static int tabNumber = 0; @@ -2166,23 +2186,7 @@ int MainWindow::openSqlTab(bool resetCounter) w->getEditor()->setEnabledFindDialog(false); w->getEditor()->setFocus(); connect(w, &SqlExecutionArea::findFrameVisibilityChanged, ui->actionSqlFind, &QAction::setChecked); - // Add (and remove) an asterisk next to the filename of modified file tabs. - connect(w->getEditor(), &SqlTextEdit::modificationChanged, this, [this](bool) { - for(int i=0; i < ui->tabSqlAreas->count(); ++i) { - SqlExecutionArea* sqlWidget = qobject_cast(ui->tabSqlAreas->widget(i)); - QString currentText = ui->tabSqlAreas->tabText(i); - if(!currentText.endsWith("*")) { - if(sqlWidget->getEditor()->isModified()) { - ui->tabSqlAreas->setTabText(i, currentText + "*"); - } - } else { - if(!sqlWidget->getEditor()->isModified()) { - currentText.chop(1); - ui->tabSqlAreas->setTabText(i, currentText); - } - } - } - }); + connect(w->getEditor(), &SqlTextEdit::modificationChanged, this, &MainWindow::markTabsModified); // Connect now the find shortcut to the editor with widget context, so it isn't ambiguous with other Scintilla Widgets. QShortcut* shortcutFind = new QShortcut(ui->actionSqlFind->shortcut(), w->getEditor(), nullptr, nullptr, Qt::WidgetShortcut); @@ -3282,7 +3286,7 @@ void MainWindow::saveProject(const QString& currentFilename) SqlExecutionArea* sqlArea = qobject_cast(ui->tabSqlAreas->widget(i)); QString sqlFilename = sqlArea->fileName(); xml.writeStartElement("sql"); - xml.writeAttribute("name", ui->tabSqlAreas->tabText(i)); + xml.writeAttribute("name", ui->tabSqlAreas->tabText(i).remove(QRegularExpression("\\*$"))); if(sqlFilename.isEmpty()) { xml.writeCharacters(sqlArea->getSql()); sqlArea->getEditor()->setModified(false); @@ -3539,10 +3543,12 @@ void MainWindow::renameSqlTab(int index) qApp->applicationName(), tr("Set a new name for the SQL tab. Use the '&&' character to allow using the following character as a keyboard shortcut."), QLineEdit::EchoMode::Normal, - ui->tabSqlAreas->tabText(index)); + ui->tabSqlAreas->tabText(index).remove(QRegularExpression("\\*$"))); + if(!new_name.isNull()) // Don't do anything if the Cancel button was clicked ui->tabSqlAreas->setTabText(index, new_name); + markTabsModified(); } void MainWindow::setFindFrameVisibility(bool show) @@ -3826,7 +3832,7 @@ void MainWindow::showContextMenuSqlTabBar(const QPoint& pos) QAction* actionDuplicate = new QAction(this); actionDuplicate->setText(tr("Duplicate Tab")); connect(actionDuplicate, &QAction::triggered, this, [this, tab]() { - QString tab_name = ui->tabSqlAreas->tabText(tab).remove("&").remove(QRegularExpression(" \\(\\d+\\)$")); + QString tab_name = ui->tabSqlAreas->tabText(tab).remove("&").remove(QRegularExpression("\\*$")).remove(QRegularExpression(" \\(\\d+\\)$")); QString new_tab_name; for(int i=1;;i++) { @@ -3834,7 +3840,7 @@ void MainWindow::showContextMenuSqlTabBar(const QPoint& pos) bool name_already_exists = false; for(int j=0;jtabSqlAreas->count();j++) { - if(ui->tabSqlAreas->tabText(j).remove("&") == new_tab_name) + if(ui->tabSqlAreas->tabText(j).remove("&").remove(QRegularExpression("\\*$")) == new_tab_name) { name_already_exists = true; break; diff --git a/src/MainWindow.h b/src/MainWindow.h index 25f481851..768a9254a 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -244,6 +244,7 @@ private slots: void openUrlOrFile(const QString& urlString); void newRowCountsTab(); + void markTabsModified(); int openSqlTab(bool resetCounter = false); void closeSqlTab(int index, bool force = false, bool askSaving = true); void changeSqlTab(int index); From 22650108f0d26edd2484b632617d1705a19e6853 Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Sat, 22 Feb 2025 17:29:27 +0800 Subject: [PATCH 38/97] Fix progress and debug assertion failure when generating print preview --- src/ExtendedTableWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ExtendedTableWidget.cpp b/src/ExtendedTableWidget.cpp index 12dd30461..62d92dc06 100644 --- a/src/ExtendedTableWidget.cpp +++ b/src/ExtendedTableWidget.cpp @@ -637,7 +637,7 @@ void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMime // Disable context help button on Windows progress.setWindowFlags(progress.windowFlags() & ~Qt::WindowContextHelpButtonHint); - progress.setRange(*rowsInIndexes.begin(), *rowsInIndexes.end()); + progress.setRange(*rowsInIndexes.begin(), *rowsInIndexes.rbegin()); progress.setMinimumDuration(2000); // Iterate over rows x cols checking if the index actually exists when needed, in order From 7a2b94b8875d503dbb06240658df45de364a5bc4 Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Wed, 26 Feb 2025 04:46:32 +0800 Subject: [PATCH 39/97] Stop opening the print preview if canceled --- src/ExtendedTableWidget.cpp | 16 +++++++++++----- src/ExtendedTableWidget.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ExtendedTableWidget.cpp b/src/ExtendedTableWidget.cpp index 62d92dc06..1b8dd5b17 100644 --- a/src/ExtendedTableWidget.cpp +++ b/src/ExtendedTableWidget.cpp @@ -513,7 +513,7 @@ void ExtendedTableWidget::reloadSettings() m_frozen_table_view->reloadSettings(); } -void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL) +bool ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL) { QModelIndexList indices = fromIndices; @@ -528,7 +528,7 @@ void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMime // Abort if there's nothing to copy if (indices.isEmpty()) - return; + return false; SqliteTableModel* m = qobject_cast(model()); @@ -544,7 +544,7 @@ void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMime { // If it's an image, copy the image data to the clipboard mimeData->setImageData(img); - return; + return false; } } @@ -744,7 +744,7 @@ void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMime progress.setValue(row); // Abort the operation if the user pressed ESC key or Cancel button if (progress.wasCanceled()) { - return; + return false; } } @@ -757,6 +757,7 @@ void ExtendedTableWidget::copyMimeData(const QModelIndexList& fromIndices, QMime result.resize(result.size() - rowSepText.size()); } mimeData->setText(result); + return true; } void ExtendedTableWidget::copy(const bool withHeaders, const bool inSQL ) @@ -1243,7 +1244,12 @@ void ExtendedTableWidget::openPrintDialog() // Copy the specified indices content to mimeData for getting the HTML representation of // the table with headers. We can then print it using an HTML text document. - copyMimeData(indices, mimeData, true, false); + bool mimeReady = copyMimeData(indices, mimeData, true, false); + if (!mimeReady) + { + delete mimeData; + return; + } QPrinter printer; QPrintPreviewDialog *dialog = new QPrintPreviewDialog(&printer); diff --git a/src/ExtendedTableWidget.h b/src/ExtendedTableWidget.h index a4d78d939..9c4469e16 100644 --- a/src/ExtendedTableWidget.h +++ b/src/ExtendedTableWidget.h @@ -128,7 +128,7 @@ public slots: void requestUrlOrFileOpen(const QString& urlString); private: - void copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL); + bool copyMimeData(const QModelIndexList& fromIndices, QMimeData* mimeData, const bool withHeaders, const bool inSQL); void copy(const bool withHeaders, const bool inSQL); void paste(); void cut(); From 8690b8a6f5a03ef2b49c143fb651ff313218905e Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Thu, 27 Feb 2025 05:58:48 +0800 Subject: [PATCH 40/97] Fix bug to load pragma list when pragmas tab is activated Regression bug since 28ae7417454ee01f3d9d3b4eb403cc1db163bb6c --- src/MainWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 89546255a..f9e7434c8 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -585,9 +585,9 @@ bool MainWindow::fileOpen(const QString& fileName, bool openFromProject, bool re // loadProject will init the rest return true; } - if(ui->tabSqlAreas->count() == 0) + if(ui->tabSqlAreas->count() == 0) // Create a new tab if there isn't one. openSqlTab(true); - else if(ui->mainTab->currentWidget() == ui->pragmas) + if(ui->mainTab->currentWidget() == ui->pragmas) loadPragmas(); refreshTableBrowsers(); From 19d975af8fbeb50a9ac0db40ea854e72a3325157 Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Tue, 18 Feb 2025 08:25:53 +0800 Subject: [PATCH 41/97] Never export the sqlite internal tables --- src/sqlitedb.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 8f2cecb41..26291252d 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -871,8 +871,11 @@ bool DBBrowserDB::dump(const QString& filePath, std::vector tables; for(const auto& it : objMap.tables) { - // Never export the sqlite_stat1 and the sqlite_sequence tables if they exist. Also only export any tables which are selected for export. - if(!it.second->isView() && it.first != "sqlite_stat1" && it.first != "sqlite_sequence" && contains(tablesToDump, it.first)) + QString tableName = QString::fromStdString(it.first); + // Never export the sqlite internal tables. Also only export any tables which are selected for export. + if(!it.second->isView() + && !tableName.startsWith("sqlite_", Qt::CaseInsensitive) + && contains(tablesToDump, it.first)) { // Get the number of records in this table and remember to export it tables.push_back(it.second); From 00f6daef8c170a357e21aad904408f4fca9ee7ef Mon Sep 17 00:00:00 2001 From: Yisu Remy Wang Date: Thu, 3 Apr 2025 23:17:25 -0700 Subject: [PATCH 42/97] Use absolute tempPath for temporary CSV file QTemporaryFile(templateName) creates the file in the current working directory if given a relative path. When starting the app in Finder on macOS, the working directory is /, causing temporary file creation to fail. --- src/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index edec4f2e2..75d272161 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1439,7 +1439,7 @@ void MainWindow::importTableFromCSV() } else if(sender() == ui->actionFileImportCsvClipboard) { // Save clipboard content to temporary file - QTemporaryFile temp("csv_clipboard"); + QTemporaryFile temp(QDir::tempPath() + QDir::separator() + "csv_clipboard"); temp.open(); QClipboard* clipboard = QGuiApplication::clipboard(); temp.write(clipboard->text().toUtf8()); From 1f230b4891289bc990f24f3b4548cc65464f88dc Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 19 Apr 2025 20:42:50 +0900 Subject: [PATCH 43/97] Specify to use v4.6.1 instead of the latest version of SQLCipher THIS IS A TEMPORARY CHANGE. Due to a breaking change in SQLCipher v.4.7.0, where the SQLite3 and executable/library file names were made identical, we are locking to version 4.6.1 while we conside a solution. Related: #3915 --- .github/workflows/cppcmake-ubuntu.yml | 5 +++-- .github/workflows/cppcmake-windows.yml | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 1de02e6dc..39ebf3055 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -34,7 +34,8 @@ jobs: - if: matrix.bundle == 'SQLCipher' name: Build SQLCipher run: | - git clone https://github.com/sqlcipher/sqlcipher && cd sqlcipher && git checkout $(git describe --tags --abbrev=0) + # git clone https://github.com/sqlcipher/sqlcipher && cd sqlcipher && git checkout $(git describe --tags --abbrev=0) + git clone https://github.com/sqlcipher/sqlcipher && cd sqlcipher && git checkout v4.6.1 ./configure --enable-tempstore=yes --with-crypto-lib=openssl --enable-load-extension --disable-tcl CFLAGS="-DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_SNAPSHOT=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_HAS_CODEC -DSQLITE_SOUNDEX" make -j2 && sudo make install -j2 @@ -123,4 +124,4 @@ jobs: fi echo "## Libaries used" >> $GITHUB_STEP_SUMMARY - echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $GITHUB_STEP_SUMMARY \ No newline at end of file + echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 835f13eef..7670593ee 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -92,7 +92,8 @@ jobs: cd C:\dev git clone https://github.com/sqlcipher/sqlcipher SQLCipher/ cd SQLCipher - git switch $(git describe --tags --abbrev=0) + # git switch $(git describe --tags --abbrev=0) + git switch v4.6.1 nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include" mkdir sqlcipher copy sqlite3.h sqlcipher @@ -207,4 +208,4 @@ jobs: } echo "## Libaries used" >> $env:GITHUB_STEP_SUMMARY - echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $env:GITHUB_STEP_SUMMARY \ No newline at end of file + echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $env:GITHUB_STEP_SUMMARY From 8c54da96483c326f1618b32fe30751e41783824a Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 20 Apr 2025 15:35:29 +0900 Subject: [PATCH 44/97] Add SQLITE_EXTRA_* flags --- .github/workflows/cppcmake-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 7670593ee..7a9bee93b 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -94,7 +94,7 @@ jobs: cd SQLCipher # git switch $(git describe --tags --abbrev=0) git switch v4.6.1 - nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include" + nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -IC:\dev\OpenSSL\include" mkdir sqlcipher copy sqlite3.h sqlcipher From 419d56c072d8c33aa458c45e97d3394e28b60ccd Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Mon, 21 Apr 2025 09:56:58 +0900 Subject: [PATCH 45/97] Change to download the compressed SQLCipher bundle and build it --- .github/workflows/cppcmake-windows.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 7a9bee93b..70e8fe4e0 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -90,11 +90,11 @@ jobs: - name: Build SQLCipher run: | cd C:\dev - git clone https://github.com/sqlcipher/sqlcipher SQLCipher/ + Invoke-WebRequest -Uri https://github.com/sqlcipher/sqlcipher/archive/refs/tags/v4.6.1.zip -OutFile 'sqlcipher.zip' + Expand-Archive -Path sqlcipher.zip -DestinationPath C:\dev\ + Move-Item -Path C:\dev\sqlcipher-4.6.1 C:\dev\SQLCipher\ cd SQLCipher - # git switch $(git describe --tags --abbrev=0) - git switch v4.6.1 - nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -IC:\dev\OpenSSL\include" + nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include" mkdir sqlcipher copy sqlite3.h sqlcipher From 03be1c69c40c74f08e880e754ce30d7af647c020 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 3 May 2025 01:08:59 +0900 Subject: [PATCH 46/97] build(deps): bump awalsh128/cache-apt-pkgs-action from 1.4.3 to 1.5.0 (#3904) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cppcmake-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 39ebf3055..d443e0d35 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Install and cache dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.4.3 + uses: awalsh128/cache-apt-pkgs-action@v1.5.0 with: packages: libfuse2 libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev version: ${{ matrix.os }} From f37fd5d1b526ca9dce7c0f5be3fbf4d7d26870c6 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sun, 18 May 2025 20:33:02 +0200 Subject: [PATCH 47/97] Apply CorrectToNearestValue to all spin boxes with a range in Preferences See pull request #3882 --- src/PreferencesDialog.ui | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index a37d8ef3a..70e6b3829 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -582,6 +582,9 @@ + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 1 @@ -1214,6 +1217,9 @@ in new project file + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 1 @@ -1234,6 +1240,9 @@ Can be set to 0 for disabling the functionalities. This is the maximum number of rows in a table for enabling the value completion based on current values in the column. Can be set to 0 for disabling completion. + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 0 @@ -1544,6 +1553,9 @@ Can be set to 0 for disabling completion. + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 1 @@ -1563,6 +1575,9 @@ Can be set to 0 for disabling completion. + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 1 @@ -1580,6 +1595,9 @@ Can be set to 0 for disabling completion. + + QAbstractSpinBox::CorrectionMode::CorrectToNearestValue + 1 From 2f3f65b0267d39b2c58c4e2fe4f2c46d5f069f88 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 24 May 2025 22:02:43 +0200 Subject: [PATCH 48/97] Get object to modify or delete from the Table Browser This will allow to edit or delete the currently browsed table or view from the "Browse Table" tab. Before this change, the selected table or view was always taken form the "Database Structure" tab, even when it was invisible to the user. See issue #3939. --- src/MainWindow.cpp | 106 +++++++++++++++++++++++++++------------------ src/MainWindow.h | 3 +- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 75d272161..65251d2d0 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1,4 +1,6 @@ #include "MainWindow.h" +#include "sql/ObjectIdentifier.h" +#include "sql/sqlitetypes.h" #include "ui_MainWindow.h" #include "Application.h" @@ -441,7 +443,7 @@ void MainWindow::init() connect(editDock, &EditDialog::recordTextUpdated, this, &MainWindow::updateRecordText); connect(editDock, &EditDialog::evaluateText, this, &MainWindow::evaluateText); connect(editDock, &EditDialog::requestUrlOrFileOpen, this, &MainWindow::openUrlOrFile); - connect(ui->dbTreeWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MainWindow::changeTreeSelection); + connect(ui->dbTreeWidget->selectionModel(), &QItemSelectionModel::selectionChanged, this, &MainWindow::changeObjectSelection); connect(ui->dockEdit, &QDockWidget::visibilityChanged, this, &MainWindow::toggleEditDock); connect(remoteDock, SIGNAL(openFile(QString)), this, SLOT(fileOpen(QString))); connect(ui->actionDropSelectQueryCheck, &QAction::toggled, dbStructureModel, &DbStructureModel::setDropSelectQuery); @@ -916,8 +918,9 @@ void MainWindow::compact() void MainWindow::deleteObject() { // Get name and type of object to delete - sqlb::ObjectIdentifier obj = dbSelected->object(); - QString type = dbSelected->objectType(); + sqlb::ObjectIdentifier obj; + QString type; + getSelectedObject(type, obj); // Due to different grammar in languages (e.g. gender or declension), each message must be given separately to translation. QString message; @@ -951,19 +954,45 @@ void MainWindow::deleteObject() QMessageBox::warning(this, QApplication::applicationName(), message + " " + error); } else { refreshTableBrowsers(); - changeTreeSelection(); + changeObjectSelection(); + } + } +} + +void MainWindow::getSelectedObject(QString &type, sqlb::ObjectIdentifier& obj) { + + type = ""; + obj = sqlb::ObjectIdentifier(); + + QWidget* currentTab = ui->mainTab->currentWidget(); + if (currentTab == ui->structure) { + + if(!dbSelected->hasSelection()) + return; + + // Get name and type of the object to edit + obj = dbSelected->object(); + type = dbSelected->objectType(); + + } else if (currentTab == ui->browser) { + // Get name of the current table from the Data Browser + obj = currentlyBrowsedTableName(); + + sqlb::TablePtr tablePtr = db.getTableByName(obj); + if (!tablePtr) { + return; + } else { + type = tablePtr->isView()? "view" : "table"; } } } void MainWindow::editObject() { - if(!dbSelected->hasSelection()) - return; - - // Get name and type of the object to edit - sqlb::ObjectIdentifier obj = dbSelected->object(); - QString type = dbSelected->objectType(); + QString type; + sqlb::ObjectIdentifier obj; + // Get name and type of object to edit + getSelectedObject(type, obj); if(type == "table") { @@ -1113,6 +1142,7 @@ void MainWindow::dataTableSelectionChanged(const QModelIndex& index) if (editDock->isVisible()) { editDock->setCurrentIndex(index); } + changeObjectSelection(); } /* @@ -1457,40 +1487,32 @@ void MainWindow::exportTableToCSV() { // Get the current table name if we are in the Browse Data tab sqlb::ObjectIdentifier current_table; - if(ui->mainTab->currentWidget() == ui->structure) - { - QString type = dbSelected->objectType(); - if(type == "table" || type == "view") - { - current_table = dbSelected->object(); - } - } else if(ui->mainTab->currentWidget() == ui->browser) { - current_table = currentlyBrowsedTableName(); - } - // Open dialog - ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, "", current_table); - dialog.exec(); + QString type; + // Get name and type of object to export + getSelectedObject(type, current_table); + + if(type == "table" || type == "view") { + // Open dialog + ExportDataDialog dialog(db, ExportDataDialog::ExportFormatCsv, this, "", current_table); + dialog.exec(); + } } void MainWindow::exportTableToJson() { // Get the current table name if we are in the Browse Data tab sqlb::ObjectIdentifier current_table; - if(ui->mainTab->currentWidget() == ui->structure) - { - QString type = dbSelected->objectType(); - if(type == "table" || type == "view") - { - current_table = dbSelected->object(); - } - } else if(ui->mainTab->currentWidget() == ui->browser) { - current_table = currentlyBrowsedTableName(); - } - // Open dialog - ExportDataDialog dialog(db, ExportDataDialog::ExportFormatJson, this, "", current_table); - dialog.exec(); + QString type; + // Get name and type of object to export + getSelectedObject(type, current_table); + + if(type == "table" || type == "view") { + // Open dialog + ExportDataDialog dialog(db, ExportDataDialog::ExportFormatJson, this, "", current_table); + dialog.exec(); + } } void MainWindow::dbState(bool dirty) @@ -1638,7 +1660,7 @@ void MainWindow::createTreeContextMenu(const QPoint &qPoint) if(type == "table" || type == "view" || type == "trigger" || type == "index" || type == "database") { // needed for first click on treeView as for first time change QItemSelectionModel::currentChanged doesn't fire - changeTreeSelection(); + changeObjectSelection(); popupTableMenu->exec(ui->dbTreeWidget->mapToGlobal(qPoint)); } } @@ -1663,7 +1685,7 @@ void MainWindow::createSchemaDockContextMenu(const QPoint &qPoint) popupSchemaDockMenu->exec(ui->treeSchemaDock->mapToGlobal(qPoint)); } -void MainWindow::changeTreeSelection() +void MainWindow::changeObjectSelection() { // Just assume first that something's selected that can not be edited at all ui->editDeleteObjectAction->setEnabled(false); @@ -1675,12 +1697,14 @@ void MainWindow::changeTreeSelection() ui->fileDetachAction->setVisible(false); - if(!dbSelected->hasSelection()) + QString type; + sqlb::ObjectIdentifier obj; + getSelectedObject(type, obj); + if(obj.isEmpty()) return; // Change the text and tooltips of the actions - QString type = dbSelected->objectType(); - QString schema = dbSelected->schema(); + QString schema = QString::fromStdString(obj.schema()); if (type.isEmpty()) { diff --git a/src/MainWindow.h b/src/MainWindow.h index 768a9254a..500f274d9 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -148,6 +148,7 @@ friend TableBrowserDock; sqlb::ObjectIdentifier currentlyBrowsedTableName() const; QList allTableBrowserDocks() const; + void getSelectedObject(QString &type, sqlb::ObjectIdentifier& obj); protected: void closeEvent(QCloseEvent *) override; @@ -172,7 +173,7 @@ public slots: private slots: void createTreeContextMenu(const QPoint & qPoint); void createSchemaDockContextMenu(const QPoint & qPoint); - void changeTreeSelection(); + void changeObjectSelection(); void fileNew(); void fileNewInMemoryDatabase(bool open_create_dialog = true); // Refresh visible table browsers. When all is true, refresh all browsers. From 27179d769de5ad5236be75e94a96bc5012e7039b Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sat, 24 May 2025 23:47:59 +0200 Subject: [PATCH 49/97] Fix parenthesis imbalance when the max query is used without COALESCE When the DB doesn't have an "sqlite_sequence" table, the executed query is incorrectly parenthesised, provoking a failure in the inline record addition. See issue #3850. The problem was introduced in e65565859743891d8f54f918c2aafd0fa9fadf3a. --- src/sqlitedb.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 26291252d..6e50c858d 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -1339,7 +1339,7 @@ bool DBBrowserDB::getRow(const sqlb::ObjectIdentifier& table, const QString& row unsigned long DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, const std::string& field) const { // This query returns the maximum value of the given table and column - std::string query = "SELECT MAX(CAST(" + sqlb::escapeIdentifier(field) + " AS INTEGER)) FROM " + tableName.toString() + ")"; + std::string query = "SELECT MAX(CAST(" + sqlb::escapeIdentifier(field) + " AS INTEGER)) FROM " + tableName.toString(); // If, however, there is a sequence table in this database and the given column is the primary key of the table, we try to look up a value in the sequence table if(schemata.at(tableName.schema()).tables.count("sqlite_sequence")) @@ -1350,7 +1350,7 @@ unsigned long DBBrowserDB::max(const sqlb::ObjectIdentifier& tableName, const st // This SQL statement tries to do two things in one statement: get the current sequence number for this table from the sqlite_sequence table or, if there is no record for the table, return the highest integer value in the given column. // This works by querying the sqlite_sequence table and using an aggregate function (SUM in this case) to make sure to always get exactly one result row, no matter if there is a sequence record or not. We then let COALESCE decide // whether to return that sequence value if there is one or fall back to the SELECT MAX statement from avove if there is no sequence value. - query = "SELECT COALESCE(SUM(seq), (" + query + ") FROM sqlite_sequence WHERE name=" + sqlb::escapeString(tableName.name()); + query = "SELECT COALESCE(SUM(seq), (" + query + ")) FROM sqlite_sequence WHERE name=" + sqlb::escapeString(tableName.name()); } } From 94b2f23517e59fdd8dd222989f704bef2c9460a2 Mon Sep 17 00:00:00 2001 From: Patrick Ziegler Date: Wed, 4 Jun 2025 15:42:29 +0200 Subject: [PATCH 50/97] Fix enum class value conversion for storing last locations See issue #3949. --- src/FileDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FileDialog.cpp b/src/FileDialog.cpp index a3b611747..df4271b68 100644 --- a/src/FileDialog.cpp +++ b/src/FileDialog.cpp @@ -48,7 +48,7 @@ QString FileDialog::getFileDialogPath(const FileDialogTypes dialogType) case 2: { // Remember last location for current session only QHash lastLocations = Settings::getValue("db", "lastlocations").toHash(); - return lastLocations[QString(QChar(dialogType))].toString(); + return lastLocations[QString::number(static_cast(dialogType))].toString(); } case 1: // Always use this locations return Settings::getValue("db", "defaultlocation").toString(); @@ -62,7 +62,7 @@ void FileDialog::setFileDialogPath(const FileDialogTypes dialogType, const QStri QString dir = QFileInfo(new_path).absolutePath(); QHash lastLocations = Settings::getValue("db", "lastlocations").toHash(); - lastLocations[QString(QChar(dialogType))] = dir; + lastLocations[QString::number(static_cast(dialogType))] = dir; switch(Settings::getValue("db", "savedefaultlocation").toInt()) { From 4405d32ccb3a834303bf20efdd0f322854fcd7bf Mon Sep 17 00:00:00 2001 From: mgrojo Date: Fri, 6 Jun 2025 23:21:08 +0200 Subject: [PATCH 51/97] Last locations: fixed absolute path for "Execute SQL" dialogs Issue #3831 --- src/FileDialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FileDialog.cpp b/src/FileDialog.cpp index df4271b68..ed22c202b 100644 --- a/src/FileDialog.cpp +++ b/src/FileDialog.cpp @@ -15,7 +15,7 @@ QStringList FileDialog::getOpenFileNames(const FileDialogTypes dialogType, QWidg if(!result.isEmpty()) { QFileInfo path = QFileInfo(result.first()); - setFileDialogPath(dialogType, path.absolutePath()); + setFileDialogPath(dialogType, path.absoluteFilePath()); } return result; } @@ -50,7 +50,7 @@ QString FileDialog::getFileDialogPath(const FileDialogTypes dialogType) return lastLocations[QString::number(static_cast(dialogType))].toString(); } - case 1: // Always use this locations + case 1: // Always use this location return Settings::getValue("db", "defaultlocation").toString(); default: return QString(); From 3b210457f0a3f5016aed23e561bcd7df779ebf59 Mon Sep 17 00:00:00 2001 From: YFdyh000 Date: Sun, 8 Jun 2025 03:03:30 +0800 Subject: [PATCH 52/97] Set CMAKE_AUTO[MOC|RCC|UIC] option (#3881) --- src/tests/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index f0e0a8ef4..2ec5837f5 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -1,5 +1,9 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}" ..) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + find_package(${QT_MAJOR} REQUIRED COMPONENTS Test Widgets) if(QT_MAJOR STREQUAL "Qt6") find_package(Qt6 REQUIRED COMPONENTS Core5Compat) From 986830f7e4b88f33f8ce031b7accc274f3346cb7 Mon Sep 17 00:00:00 2001 From: Nikolay Zlatev Date: Fri, 20 Jun 2025 13:31:56 +0300 Subject: [PATCH 53/97] MainWindow::treeSchemaDock make copy shortcut use widget context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changed shortcut context to Qt::WidgetShortcut to restrict activation to when treeSchemaDock has focus. Previously, the shortcut used Qt::WindowShortcut, which allowed it to trigger anywhere in the window. This caused it to override other shortcuts—preventing ExtendedTableWidget from using its own copy shortcut. --- src/MainWindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 65251d2d0..7c9d3d26c 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -273,7 +273,7 @@ void MainWindow::init() connect(ui->actionCopyInSchema, &QAction::triggered, this, [=]() { dbStructureModel->copy(ui->treeSchemaDock->selectionModel()->selectedIndexes()); }); - auto copyShortcut = new QShortcut(QKeySequence::Copy, ui->treeSchemaDock); + auto copyShortcut = new QShortcut(QKeySequence::Copy, ui->treeSchemaDock, nullptr, nullptr, Qt::WidgetShortcut); connect(copyShortcut, &QShortcut::activated, this, [=]() { dbStructureModel->copy(ui->treeSchemaDock->selectionModel()->selectedIndexes()); }); From a1b5a9d035f765b65be3d7062c2c497dbe539f33 Mon Sep 17 00:00:00 2001 From: TheDcoder Date: Sun, 13 Jul 2025 11:18:58 +0530 Subject: [PATCH 54/97] Add JSON display format --- src/ColumnDisplayFormatDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ColumnDisplayFormatDialog.cpp b/src/ColumnDisplayFormatDialog.cpp index 69ca8c8b1..a7c7e3a3d 100644 --- a/src/ColumnDisplayFormatDialog.cpp +++ b/src/ColumnDisplayFormatDialog.cpp @@ -42,6 +42,7 @@ ColumnDisplayFormatDialog::ColumnDisplayFormatDialog(DBBrowserDB& db, const sqlb ui->comboDisplayFormat->addItem(tr("Binary GUID to text"), "guid"); ui->comboDisplayFormat->addItem(tr("SpatiaLite Geometry to SVG"), "geomToSVG"); ui->comboDisplayFormat->insertSeparator(ui->comboDisplayFormat->count()); + ui->comboDisplayFormat->addItem(tr("JSON"), "json"); ui->comboDisplayFormat->addItem(tr("Custom"), "custom"); ui->labelDisplayFormat->setText(ui->labelDisplayFormat->text().arg(column_name)); @@ -87,6 +88,7 @@ R"('' , 1, 5) || '" stroke="darkblue" fill="#b5cfed" stroke-width="1"/>' || '')").arg(e_column_name); + formatFunctions["json"] = "json(" + e_column_name + ")"; // Set the current format, if it's empty set the default format if(current_format.isEmpty()) From ffe7e576c1c0f4b46ce710a79c89b6d7d9506e62 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 19 Jul 2025 09:25:59 +0900 Subject: [PATCH 55/97] Temporaily disable Windows build CI Note: #3967 --- .github/workflows/cppcmake.yml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index cf3dd0ecb..c5fcff9e0 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -55,17 +55,18 @@ jobs: with: NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} - build-windows: - needs: check-skippable - if: needs.check-skippable.outputs.skip != 'true' - uses: ./.github/workflows/cppcmake-windows.yml - secrets: inherit - with: - NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} + # build-windows: + # needs: check-skippable + # if: needs.check-skippable.outputs.skip != 'true' + # uses: ./.github/workflows/cppcmake-windows.yml + # secrets: inherit + # with: + # NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} release: if: github.event_name != 'pull_request' - needs: [build-macos, build-ubuntu, build-windows] + needs: [build-macos, build-ubuntu] + # needs: [build-macos, build-ubuntu, build-windows] name: Release runs-on: ubuntu-24.04 env: @@ -83,17 +84,18 @@ jobs: with: path: target - - name: Remove unsigned Windows build - run: rm -rfv target/*unsigned* + # - name: Remove unsigned Windows build + # run: rm -rfv target/*unsigned* - run: find target -type f -exec mv -v {} target \; - - name: Unarchive Windows's build artifacts - run: for f in target/*.zip; do unzip -d target/ "$f" && rm -v "$f"; done + # - name: Unarchive Windows's build artifacts + # run: for f in target/*.zip; do unzip -d target/ "$f" && rm -v "$f"; done - name: Release uses: softprops/action-gh-release@v2 with: + body: "The Windows build will not be provided for the time being. Note: #3967" files: target/* prerelease: true tag_name: ${{ env.tag_name }} From 7f8acbd4677e73bd784fcd5f4d97a424c21a63d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 09:43:52 +0900 Subject: [PATCH 56/97] build(deps): bump awalsh128/cache-apt-pkgs-action from 1.5.0 to 1.5.1 (#3962) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cppcmake-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index d443e0d35..bd8230bbd 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Install and cache dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.5.0 + uses: awalsh128/cache-apt-pkgs-action@v1.5.1 with: packages: libfuse2 libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev version: ${{ matrix.os }} From a9b8c0cfa3ad41b9be23a7edbaa05ec41c402a89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:13:09 +0200 Subject: [PATCH 57/97] build(deps): bump actions/checkout from 4 to 5 (#3989) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql.yml | 2 +- .github/workflows/cppcmake-macos.yml | 2 +- .github/workflows/cppcmake-ubuntu.yml | 2 +- .github/workflows/cppcmake-windows.yml | 2 +- .github/workflows/cppcmake.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index d776b78cd..30856a32c 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -30,7 +30,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - if: matrix.language == 'cpp' name: Install dependencies diff --git a/.github/workflows/cppcmake-macos.yml b/.github/workflows/cppcmake-macos.yml index 1fe84f62b..203746074 100644 --- a/.github/workflows/cppcmake-macos.yml +++ b/.github/workflows/cppcmake-macos.yml @@ -21,7 +21,7 @@ jobs: MACOSX_DEPLOYMENT_TARGET: 10.13 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Uninstall Mono, which is included by default in GitHub-hosted macOS runners, # as it interferes with referencing our own compiled SQLite libraries. diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index bd8230bbd..11d95ed70 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -23,7 +23,7 @@ jobs: os: [ubuntu-22.04, ubuntu-22.04-arm] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install and cache dependencies uses: awalsh128/cache-apt-pkgs-action@v1.5.1 diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 70e8fe4e0..7130779da 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -23,7 +23,7 @@ jobs: QT_VERSION: 5.15.2 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install dependencies run: | diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index c5fcff9e0..8aeaaa772 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -23,7 +23,7 @@ jobs: outputs: skip: ${{ steps.set-skippable.outputs.skippable || 'false' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Check and set skippable id: set-skippable From 1bb4792c5bbd852937015c0fbb4b389c2997c837 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:52:33 +0900 Subject: [PATCH 58/97] build(deps): bump actions/download-artifact from 4 to 5 (#3988) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cppcmake.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index 8aeaaa772..a333e8f63 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -80,7 +80,7 @@ jobs: - run: mkdir -v target - name: Download artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: path: target From 6b2e021cae9118399d955c4be993581b0c62b38a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 09:52:44 +0900 Subject: [PATCH 59/97] build(deps): bump awalsh128/cache-apt-pkgs-action from 1.5.0 to 1.5.3 (#3987) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/cppcmake-ubuntu.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index 11d95ed70..e716de215 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@v5 - name: Install and cache dependencies - uses: awalsh128/cache-apt-pkgs-action@v1.5.1 + uses: awalsh128/cache-apt-pkgs-action@v1.5.3 with: packages: libfuse2 libqcustomplot-dev libqscintilla2-qt5-dev libqt5svg5 ninja-build qttools5-dev version: ${{ matrix.os }} From 3e3e367a33da2098e52a366314471582562a3005 Mon Sep 17 00:00:00 2001 From: virtual-hand Date: Sat, 30 Aug 2025 22:23:16 -0300 Subject: [PATCH 60/97] Update sqlb_pt_BR.ts Translation of untranslated items of the main screens --- src/translations/sqlb_pt_BR.ts | 62 +++++++++++++++++----------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/translations/sqlb_pt_BR.ts b/src/translations/sqlb_pt_BR.ts index 797f9621a..210210fa8 100644 --- a/src/translations/sqlb_pt_BR.ts +++ b/src/translations/sqlb_pt_BR.ts @@ -2060,7 +2060,7 @@ Deseja inserir mesmo assim? Cut - + Recortar @@ -2860,7 +2860,7 @@ x~y Intervalo: valores entre x e y E&xit - &Sair + Sair @@ -3129,7 +3129,7 @@ Se você disser que não, tentaremos importar os dados do arquivo SQL para o ban Clear List - + Limpar Lista @@ -3144,7 +3144,7 @@ Se você disser que não, tentaremos importar os dados do arquivo SQL para o ban Simplify Window Layout - + Simplificar layout da janela @@ -3711,7 +3711,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou &New Database - + &Novo banco de dados @@ -3727,13 +3727,13 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou &Undo - + &Desfazer Undo last change to the database - + Desfaz a última mudança feita no banco de dados @@ -3758,7 +3758,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou New &tab - + Nova a&ba @@ -3828,7 +3828,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou &Save Project - + &Salvar Projeto @@ -3838,12 +3838,12 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Open &Project - + Abrir &projeto &Attach Database... - &Anexar banco de dados... + A&nexar banco de dados... @@ -3992,7 +3992,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Show &Row Counts - + Mostrar quantidade de &Linhas @@ -4002,22 +4002,22 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Save Database &As... - + Salvar Banco de dados &como... Save the current database as a different file - + Salvar o banco de dados atual em um arquivo diferente Refresh - Atualizar + Atualizar Reload the database structure - + Recarrega a estrutura do banco de dados @@ -4029,33 +4029,33 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou &Database Structure This has to be equal to the tab title in all the main tabs - + &Estrutura do banco de dados &Browse Data This has to be equal to the tab title in all the main tabs - + &Ver dados Edit P&ragmas This has to be equal to the tab title in all the main tabs - + Editar &pragmas E&xecute SQL This has to be equal to the tab title in all the main tabs - + E&xecutar SQL &Recent Files - + Arquivos &Recentes @@ -4065,7 +4065,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou &Open Database - + &Abrir Banco de dados @@ -4258,13 +4258,13 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Close Pro&ject - + Fechar pro&jeto Close project and database files and return to the initial state - + Fecha os arquivos de projeto e banco de dados e retorna para o estado inicial @@ -4468,7 +4468,7 @@ Você tem certeza que quer salvar o banco de dados? Automatically load the last opened DB file at startup - + Automaticamente carregar o último BD aberto ao iniciar @@ -7333,13 +7333,13 @@ Segure %3Shift e clique para ir para lá Export to &JSON - + Exportar para &JSON Export the filtered data to JSON - + Exporta os dados filtrados para JSON @@ -7349,7 +7349,7 @@ Segure %3Shift e clique para ir para lá Copy column name - + Copiar nome da coluna @@ -7365,12 +7365,12 @@ Segure %3Shift e clique para ir para lá Add a new docked Data Browser - + Adicionar nova aba de ver dados This button adds a new docked Data Browser, which you can detach and arrange in different layouts. - + Este botão adiciona uma nova aba para ver dados, que você pode desacoplar e organizar em layouts diferentes. @@ -7854,7 +7854,7 @@ Segure %3Shift e clique para ir para lá Filter in any column - + Filtrar em qualquer coluna From a793da86142ce5d761b008ab580171a2896b9afb Mon Sep 17 00:00:00 2001 From: virtual-hand Date: Tue, 2 Sep 2025 12:03:24 -0300 Subject: [PATCH 61/97] Update sqlb_pt_BR.ts --- src/translations/sqlb_pt_BR.ts | 50 +++++++++++++++++----------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/translations/sqlb_pt_BR.ts b/src/translations/sqlb_pt_BR.ts index 210210fa8..2288f9204 100644 --- a/src/translations/sqlb_pt_BR.ts +++ b/src/translations/sqlb_pt_BR.ts @@ -2785,7 +2785,7 @@ x~y Intervalo: valores entre x e y &Open Database... - &Abrir banco de dados... + Abrir &banco de dados... @@ -2860,7 +2860,7 @@ x~y Intervalo: valores entre x e y E&xit - Sair + Sai&r @@ -2957,7 +2957,7 @@ x~y Intervalo: valores entre x e y &Recently opened - &Recentemente aberto + Re&centemente aberto @@ -3341,7 +3341,7 @@ Você tem certeza? &Create Table... - &Criar tabela... + Criar &tabela... @@ -3533,7 +3533,7 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe Foreign Keys - + Chaves estrangeiras @@ -3560,7 +3560,7 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe Normal - + Normal @@ -3576,13 +3576,13 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe File - Arquivo + Arquivo Memory - + Memória @@ -3607,12 +3607,12 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe Exclusive - + Exclusivo Automatic Index - + Índice automático @@ -3637,7 +3637,7 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe Synchronous - + Síncrono @@ -3647,12 +3647,12 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe None - Nenhum + Nenhum Incremental - + Incremental @@ -3662,7 +3662,7 @@ Você pode arrastar comandos SQL de uma linha e soltá-los em outras aplicaçõe Too&ls - Ferr&amentas + &Ferramentas @@ -3859,7 +3859,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou &Set Encryption... - Definir en&criptação... + Definir e&ncriptação... @@ -3879,7 +3879,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Open Data&base Read Only... - Abrir &banco de dados somente leitura... + Abrir banco de dados somente &leitura... @@ -3982,7 +3982,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Table from CSV data in Clipboard... - + Tabela de dados CSV na área de transferência... @@ -4002,7 +4002,7 @@ Você pode arrastar comandos SQL da coluna Esquema e largá-los no editor SQL ou Save Database &As... - Salvar Banco de dados &como... + Sal&var banco de dados como... @@ -4347,12 +4347,12 @@ Você tem certeza que quer salvar o banco de dados? Edit View %1 - + Editar Vista %1 Edit Trigger %1 - + Editar gatilho %1 @@ -4423,12 +4423,12 @@ Você tem certeza que quer salvar o banco de dados? Yes. Don't ask again - + Sim. Não perguntar novamente This action will open a new SQL tab with the following statements for you to edit and run: - + Essa ação abrirá uma nova aba de SQL com os seguintes comandos para você editar e executar: @@ -4504,7 +4504,7 @@ Você tem certeza que quer salvar o banco de dados? Attach Database... - Anexar banco de dados... + Anexar banco de dad&os... @@ -5122,7 +5122,7 @@ Aviso: nem todos os dados foram obtidos da tabela ainda devido ao mecanismo de o Save Settings File - + Salvar arquivo de configurações @@ -5139,7 +5139,7 @@ Aviso: nem todos os dados foram obtidos da tabela ainda devido ao mecanismo de o Open Settings File - + Abrir arquivo de configurações From 2b93615d24c7b95b299f95bfe2d5c41ee09cf404 Mon Sep 17 00:00:00 2001 From: bilimiyorum <131397022+bilimiyorum@users.noreply.github.com> Date: Fri, 5 Sep 2025 17:07:52 +0300 Subject: [PATCH 62/97] Turkish language support --- src/translations/sqlb_tr.ts | 982 ++++++++++++++++++------------------ 1 file changed, 498 insertions(+), 484 deletions(-) diff --git a/src/translations/sqlb_tr.ts b/src/translations/sqlb_tr.ts index fd55fee82..ed548917f 100644 --- a/src/translations/sqlb_tr.ts +++ b/src/translations/sqlb_tr.ts @@ -11,12 +11,12 @@ Version - Versiyon + Sürüm <html><head/><body><p>DB Browser for SQLite is an open source, freeware visual tool used to create, design and edit SQLite database files.</p><p>It is bi-licensed under the Mozilla Public License Version 2, as well as the GNU General Public License Version 3 or later. You can modify or redistribute it under the conditions of these licenses.</p><p>See <a href="https://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">https://www.gnu.org/licenses/gpl.html</span></a> and <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> for details.</p><p>For more information on this program please visit our website at: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">This software uses the GPL/LGPL Qt Toolkit from </span><a href="https://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://qt-project.org/</span></a><span style=" font-size:small;"><br/>See </span><a href="https://doc.qt.io/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://doc.qt.io/qt-5/licensing.html</span></a><span style=" font-size:small;"> for licensing terms and information.</span></p><p><span style=" font-size:8pt;">We use the nalgeon/sqlean library for SQLite extensions support.<br/>This library is licensed under the MIT license, see the following for more information:<br/></span><a href="https://github.com/nalgeon/sqlean"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">https://github.com/nalgeon/sqlean</span></a></p><p><span style=" font-size:small;">It also uses the Pastel SVG icon set by Michael Buckley under a Creative Commons Attribution Share Alike 4.0 license.<br/>See </span><a href="https://codefisher.org/pastel-svg/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://codefisher.org/pastel-svg/</span></a><span style=" font-size:small;"> for details.</span></p></body></html> - + <html><head/><body><p>DB Browser for SQLite, SQLite veritabanı dosyaları oluşturmak, tasarlamak ve düzenlemek için kullanılan açık kaynaklı, ücretsiz bir görsel araçtır.</p><p>Mozilla Public License Version 2 ve GNU General Public License Version 3 veya sonraki sürümleri altında çift lisanslıdır. Bu lisansların koşulları altında bunu değiştirebilir veya yeniden dağıtabilirsiniz.</p><p>Ayrıntılar için <a href="https://www.gnu.org/licenses/gpl.html"><span style=" text-decoration: underline; color:#0000ff;">https://www.gnu.org/licenses/gpl.html</span></a> ve <a href="https://www.mozilla.org/MPL/2.0/index.txt"><span style=" text-decoration: underline; color:#0000ff;">https://www.mozilla.org/MPL/2.0/index.txt</span></a> adreslerine bakın.</p><p>Bu program hakkında daha fazla bilgi için lütfen web sitemizi ziyaret edin: <a href="https://sqlitebrowser.org"><span style=" text-decoration: underline; color:#0000ff;">https://sqlitebrowser.org</span></a></p><p><span style=" font-size:small;">Bu yazılım, lisanslama koşulları ve diğer bilgiler için </span><a href="https://qt-project.org/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://qt-project.org/</span></a><span style=" font-size:small;"><br/>https://doc.qt.io/qt-5/licensing.html"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://doc.qt.io/qt-5/licensing.html</span></a><span style=" font-size:small;"> adresine bakın</span><a href="https://doc.qt.io/qt-5/licensing.html</span></a><span style=" font-size:small;"> bilgi.</span></p><p><span style=" font-size:8pt;">SQLite uzantılarını desteklemek için nalgeon/sqlean kütüphanesini kullanıyoruz.<br/>Bu kütüphane MIT lisansı altında lisanslanmıştır, daha fazla bilgi için aşağıdakilere bakın:<br/></span><a href="https://github.com/nalgeon/sqlean"><span style=" font-size:8pt; text-decoration: underline; color:#0000ff;">https://github.com/nalgeon/sqlean</span></a></p><p><span style=" font-size:small;">Ayrıca, Creative Commons Atıf-Benzer Paylaşım 4.0 lisansı altında Michael Buckley tarafından oluşturulan Pastel SVG simge setini kullanır.<br/>Bkz.</span><a href="https://codefisher.org/pastel-svg/"><span style=" font-size:small; text-decoration: underline; color:#0000ff;">https://codefisher.org/pastel-svg/</span></a><span style=" font-size:small;"> ayrıntılar için.</span></p></body></html> @@ -91,7 +91,7 @@ Foreign key: %1 - Yabancı anahatar: %1 + Yabancı anahtar: %1 @@ -126,12 +126,12 @@ The user settings file location is replaced with the argument value instead of the environment variable value. - + Kullanıcı ayarları dosyasının konumu, ortam değişkeni değeri yerine argüman değeriyle değiştirilir. Ignored environment variable (DB4S_SETTINGS_FILE) value: - + Yoksayılan ortam değişkeni (DB4S_SETTINGS_FILE) değeri: @@ -142,141 +142,141 @@ Usage - + Kullanım options - + seçenekler database - + veritabanı project - + proje csv-file - + csv dosyası Show command line options - + Komut satırı seçeneklerini göster Exit application after running scripts - + Betikleri çalıştırdıktan sonra uygulamadan çıkın file - + dosya Execute this SQL file after opening the DB - + Veritabanını açtıktan sonra bu SQL dosyasını çalıştırın Import this CSV file into the passed DB or into a new DB - + Bu CSV dosyasını geçirilen veritabanına veya yeni bir veritabanına aktarın table - + tablo Browse this table, or use it as target of a data import - + Bu tabloya göz atın veya bir veri içe aktarımının hedefi olarak kullanın Open database in read-only mode - + Veritabanını salt okunur modunda aç settings_file - + settings_file Run application based on this settings file - + Uygulamayı bu ayar dosyasına göre çalıştır group - + grup settings - + ayarlar value - + değer Run application with this setting temporarily set to value - + Bu ayarı geçici değere ayarlayarak uygulamayı çalıştırın Run application saving this value for this setting - + Bu ayar için bu değeri kaydederek uygulamayı çalıştırın Display the current version - + Mevcut sürümü görüntüle Open this SQLite database - + Bu SQLite veritabanını açın Open this project file (*.sqbpro) - + Bu proje dosyasını açın (*.sqbpro) Import this CSV file into an in-memory database - + Bu CSV dosyasını bellek içi bir veritabanına aktarın The %1 option requires an argument - + %1 seçeneği bir argüman gerektirir The -S/--settings option requires an argument. The option is ignored. - + -S/--settings seçeneği bir argüman gerektirir. Seçenek yok sayılır. @@ -291,32 +291,32 @@ SQLite Version - SQLite Versiyonu + SQLite Versiyonu SQLCipher Version %1 (based on SQLite %2) - + SQLCipher Sürümü %1 (%2 SQLite'a dayalı) DB Browser for SQLite Version %1. - + DB Browser for SQLite Versiyon %1. Last commit hash when built: %1 - + Derleme sırasında son commit karma değeri: %1 Built for %1, running on %2 - %1 için derlendi, %2 üzerinde çalışıyor + %1 için derlendi, %2 üzerinde çalışıyor Qt Version %1 - + Qt Sürümü %1 @@ -379,7 +379,7 @@ Plaintext Header Size - Düz Metin Üstbilgi Boyutu + Düz Metin Üst Bilgi Boyutu @@ -415,17 +415,17 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Choose display format - Görüntüleme formatını seçiniz + Görüntüleme formatını seçin Display format - Görüntüleme formatı + Formatı görüntüle Choose a display format for the column '%1' which is applied to each value prior to showing it. - '%1' sütunu için görüntülemeden önce uygulanacak bir görüntüleme formatı seçin. + Her değer gösterilmeden önce, '%1' sütunu için uygulanacak bir görüntüleme biçimi seçin. @@ -445,7 +445,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Hex blob - Onaltılık ikili veri + Onaltılık blob @@ -465,7 +465,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d .NET DateTime.Ticks to date - + .NET DateTime.Ticks tarihine @@ -480,12 +480,12 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d WebKit / Chromium epoch to date - + WebKit / Chromium'un bugüne kadarki tarihi WebKit / Chromium epoch to local time - + WebKit / Chromium dönemi yerel zamana göre @@ -500,12 +500,12 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Binary GUID to text - + İkili GUID'den metne SpatiaLite Geometry to SVG - + SpatiaLite Geometriden SVG'ye @@ -534,7 +534,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Round number - Küsüratsız sayı + Küsuratsız sayı @@ -587,7 +587,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d &Remove - &Sil + Kaldı&r @@ -607,7 +607,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Move &down - Aşağı &Taşı + Aşağı &taşı @@ -617,7 +617,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Text color - Yazı rengi + Metin rengi @@ -696,7 +696,7 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Exporting database to SQL file... - veritabanı, SQL dosyası olarak dışa aktarılıyor... + Veritabanı, SQL dosyası olarak dışa aktarılıyor... @@ -727,13 +727,13 @@ Bu veritabanı için herhangi bir başka ayar daha yapılmışsa, bu bilgileri d Cannot open destination file: '%1' - + Hedef dosya açılamıyor: '%1' Cannot backup to file: '%1'. Message: %2 - + Dosyaya yedekleme yapılamıyor: '%1'. Mesaj: %2 @@ -805,37 +805,37 @@ Yürütme durduruluyor %3. Creating savepoint failed. DB says: %1 - Kayıt noktası oluşturulamadı. Veritabanı mesajı: %1 + Kayıt noktası oluşturulamadı. DB mesajı: %1 Renaming the column failed. DB says: %1 - Sütun yeniden adlandırılamadı. Veritabanı motoru mesajı: + Sütun yeniden adlandırılamadı. DB mesajı: %1 Releasing savepoint failed. DB says: %1 - Kayıt noktası serbest bırakılamadı. Veritabanı motoru mesajı: %1 + Kayıt noktasının serbest bırakılması başarısız. DB mesajı: %1 Creating new table failed. DB says: %1 - Veri tabanı oluşturulamadı. Veritabanı mesajı: %1 + Veritabanı oluşturulamadı. DB mesajı: %1 Copying data to new table failed. DB says: %1 - Yeni tabloya veri kopyalanamadı. Veritabanı mesajı: + Yeni tabloya veri kopyalanamadı. DB mesajı: %1 Deleting old table failed. DB says: %1 - Eski tablolar silinemedi: Veritabanı mesajı: %1 + Eski tablolar silinemedi: DB mesajı: %1 @@ -863,7 +863,7 @@ Veritabanı motoru mesajı: could not get list of databases: %1 - veri tabanı listesi alınamadı: %1 + veritabanı listesi alınamadı: %1 @@ -873,7 +873,7 @@ Veritabanı motoru mesajı: Error loading built-in extension: %1 - + Yerleşik uzantı yüklenirken hata oluştu: %1 @@ -906,7 +906,7 @@ Veritabanı motoru mesajı: Type - Tip + Tür @@ -941,7 +941,7 @@ Veritabanı motoru mesajı: Indices (%1) - İndisler (%1) + İndeksler (%1) @@ -995,7 +995,7 @@ Veritabanı motoru mesajı: Evaluation - + Değerlendirme @@ -1016,22 +1016,22 @@ Veritabanı motoru mesajı: This Qt editor is used for right-to-left scripts, which are not supported by the default Text editor. The presence of right-to-left characters is detected and this editor mode is automatically selected. - Qt editör, varsayılan metin editörü tarafından desteklenmeyen sağdan sola okunan dillde yazılmış betikleri için kullanılır. + Qt editör, varsayılan metin editörü tarafından desteklenmeyen sağdan sola okunan dillde yazılmış betikler için kullanılır. Identification of the cell currently in the editor - + Şu anda düzenleyicide bulunan hücrenin tanımlanması Type and size of data currently in table - + Tabloda şu anda bulunan verilerin türü ve boyutu Open preview dialog for printing the data currently stored in the cell - Şu anda hücrede saklanan veriyi yazdırmak için önizleme penceresini aç + Şu anda hücrede saklanan veriyi yazdırmak için ön izleme penceresini aç @@ -1136,7 +1136,7 @@ Veritabanı motoru mesajı: Open preview dialog for printing displayed text - Görüntülenen yazıyı yazdırmak için önizleme penceresini aç + Görüntülenen metni yazdırmak için ön izleme penceresini aç @@ -1211,28 +1211,33 @@ Veritabanı motoru mesajı: Errors are indicated with a red squiggle underline. In the Evaluation mode, entered SQLite expressions are evaluated and the result applied to the cell. - + Metin düzenleyici modları, sözdizimi vurgulama, otomatik biçimlendirme ve kaydetmeden önce doğrulama ile düz metinlerin yanı sıra JSON veya XML verilerini düzenlemenize olanak tanır. + +Hatalar kırmızı kıvrımlı alt çizgiyle gösterilir. + +Değerlendirme modunda, girilen SQLite ifadeleri değerlendirilir ve sonuç hücreye uygulanır. Unsaved data in the cell editor - + Hücre düzenleyicide kaydedilmemiş veriler The cell editor contains data not yet applied to the database. Do you want to apply the edited data to row=%1, column=%2? - + Hücre düzenleyicisi henüz veritabanına uygulanmamış veriler içeriyor. +Düzenlenen verileri satır=%1, sütun=%2'ye uygulamak ister misiniz? Editing row=%1, column=%2 - + Satır=%1, sütun=%2 düzenleniyor No cell active. - + Hiçbir hücre aktif değil. @@ -1267,44 +1272,44 @@ Do you want to apply the edited data to row=%1, column=%2? Type: NULL; Size: 0 bytes - + Tür: NULL; Boyut: 0 bayt Type: Text / Numeric; Size: %n character(s) - + Type: %1 Image; Size: %2x%3 pixel(s) - + Tür: %1 Görüntü; Boyut: %2x%3 piksel Type: Valid JSON; Size: %n character(s) - - + + Tür: Geçerli JSON; Boyut: %n karakter Type: Binary; Size: %n byte(s) - - + + Tür: İkili; Boyut: %n bayt Choose a file to import - İçe aktarmak için dosya seçiniz + İçe aktarmak için dosya seçin %1 Image - %1 imajı + %1 Görüntü @@ -1319,12 +1324,12 @@ Do you want to apply the edited data to row=%1, column=%2? Couldn't save file: %1. - Dosya kaydedilemedi: %1. + Dosya kaydedilemedi: %1. The data has been saved to a temporary file and has been opened with the default application. You can now edit the file and, when you are ready, apply the saved new data to the cell or cancel any changes. - + Veriler geçici bir dosyaya kaydedildi ve varsayılan uygulamayla açıldı. Artık dosyayı düzenleyebilir ve hazır olduğunuzda kaydedilen yeni verileri hücreye uygulayabilir veya değişiklikleri iptal edebilirsiniz. @@ -1347,7 +1352,7 @@ Do you want to apply the edited data to row=%1, column=%2? Edit Index Schema - Index Şemasını Düzenle + İndeks Şemasını Düzenle @@ -1357,12 +1362,12 @@ Do you want to apply the edited data to row=%1, column=%2? For restricting the index to only a part of the table you can specify a WHERE clause here that selects the part of the table that should be indexed - Index'i tablonun yalnızca bir bölümüyle sınırlamak için, burada tablonun dizine alınması gereken kısmını seçen bir WHERE deyimi belirtebilirsiniz + İndeksi tablonun yalnızca bir bölümüyle sınırlamak için, burada tablonun dizine alınması gereken kısmını seçen bir WHERE deyimi belirtebilirsiniz Partial inde&x clause - Kısmi inde&x hükmü + Kısmi inde&ks hükmü @@ -1377,23 +1382,23 @@ Do you want to apply the edited data to row=%1, column=%2? Type - Tip + Tür Add a new expression column to the index. Expression columns contain SQL expression rather than column names. - Index için yeni bir ifade sütunu ekleyin. İfade sütunları, sütun adları değil SQL ifadesi içerir. + İndeks için yeni bir ifade sütunu ekleyin. İfade sütunları, sütun adları değil SQL ifadesi içerir. Index column - Index sütunu + İndeks sütunu Deleting the old index failed: %1 - Eski index silinemedi: + Eski indeks silinemedi: %1 @@ -1423,32 +1428,32 @@ Do you want to apply the edited data to row=%1, column=%2? Without Rowid - Satır ID(Rowid) Kullanma + Rowid olmadan Database sche&ma - Veritabanı &Şeması + Veritabanı şe&ması Make this a 'WITHOUT ROWID' table. Setting this flag requires specifying a PRIMARY KEY (which can be of any type, and can be composite), and forbids the AUTOINCREMENT flag. - + Bunu 'WITHOUT ROWID' tablosu yapın. Bu bayrağı ayarlamak, bir PRIMARY KEY (herhangi bir türde ve bileşik olabilir) belirtmeyi gerektirir ve AUTOINCREMENT bayrağını yasaklar. On Conflict - + On Conflict Strict - + Strict When the strict option is enabled SQLite enforces the data types of each column when updating or inserting data. - + Strict seçeneği etkinleştirildiğinde SQLite, veri güncellerken veya eklerken her sütunun veri türlerini uygular. @@ -1467,12 +1472,12 @@ Do you want to apply the edited data to row=%1, column=%2? Remove - Sil + Kaldır Move to top - En yukarı taşı + En üste taşı @@ -1487,7 +1492,7 @@ Do you want to apply the edited data to row=%1, column=%2? Move to bottom - En aşağı taşı + En alta taşı @@ -1501,7 +1506,7 @@ Do you want to apply the edited data to row=%1, column=%2? Type - Tip + Tür @@ -1511,17 +1516,17 @@ Do you want to apply the edited data to row=%1, column=%2? Not null - NULL Olamaz + NULL değil PK - Birincil Anahtar + PK <html><head/><body><p><img src=":/icons/field_key"/> Primary key</p></body></html> - + <html><head/><body><p><img src=":/icons/field_key"/> Birincil anahtar</p></body></html> @@ -1536,7 +1541,7 @@ Do you want to apply the edited data to row=%1, column=%2? U - Benzersiz + U @@ -1564,7 +1569,7 @@ Do you want to apply the edited data to row=%1, column=%2? Check constraint - Kısıtlama Kontrol + Kısıtlama kontrolü @@ -1579,12 +1584,12 @@ Do you want to apply the edited data to row=%1, column=%2? <html><head/><body><p><img src=":/icons/field_fk"/> Foreign Key</p></body></html> - + <html><head/><body><p><img src=":/icons/field_fk"/> Yabancı Anahtar</p></body></html> Index Constraints - + İndeks Kısıtlamaları @@ -1612,17 +1617,17 @@ Do you want to apply the edited data to row=%1, column=%2? Foreign Keys - + Yabancı Anahtarlar References - + Referanslar Check Constraints - + Kontrol Kısıtlamaları @@ -1660,7 +1665,7 @@ Do you want to apply the edited data to row=%1, column=%2? There already is a field with that name. Please rename it first or choose a different name for this field. - Bu isme sahip alan zaten var. Lütfen bu alan için farklı bir isim kullanın veya aynı isme sahip alanı yeniden adlandırın. + Bu isimde bir alan zaten var. Lütfen önce bu alanı yeniden adlandırın veya farklı bir isim seçin. @@ -1688,7 +1693,8 @@ Do you want to apply the edited data to row=%1, column=%2? Please add a field which meets the following criteria before setting the on conflict action: - Primary key flag set - + Lütfen çakışma eylemini ayarlamadan önce aşağıdaki ölçütleri karşılayan bir alan ekleyin: + - Birincil anahtar bayrağı ayarı @@ -1721,7 +1727,7 @@ All data currently stored in this field will be lost. Tab&le(s) - Tab&lolar + Tab&lo(lar) @@ -1731,7 +1737,7 @@ All data currently stored in this field will be lost. Fie&ld separator - &Alan ayracı + A&lan ayracı @@ -1793,7 +1799,7 @@ All data currently stored in this field will be lost. Pretty print - Düzenli baskı + Güzel baskı @@ -1821,7 +1827,7 @@ All data currently stored in this field will be lost. Error while writing the file '%1': %2 - + '%1' dosyası yazılırken hata oluştu: %2 @@ -1846,7 +1852,7 @@ All data currently stored in this field will be lost. Export finished with errors. - + Dışa aktarma hatalarla tamamlandı. @@ -1859,7 +1865,7 @@ All data currently stored in this field will be lost. Tab&le(s) - Tablo&lar + Tab&lo(lar) @@ -1899,7 +1905,7 @@ All data currently stored in this field will be lost. Keep original CREATE statements - + Orijinal CREATE ifadelerini koruyun @@ -2037,7 +2043,7 @@ All data currently stored in this field will be lost. Cut - + Kes @@ -2052,7 +2058,7 @@ All data currently stored in this field will be lost. Copy as SQL - SQL olarak Kopyala + SQL Olarak Kopyala @@ -2094,7 +2100,7 @@ Do you want to insert it anyway? <p>Not all data has been loaded. <b>Do you want to load all data before selecting all the rows?</b><p><p>Answering <b>No</b> means that no more data will be loaded and the selection will not be performed.<br/>Answering <b>Yes</b> might take some time while the data is loaded but the selection will be complete.</p>Warning: Loading all the data might require a great amount of memory for big tables. - <p> Tüm veriler yüklenmedi. <b>Tüm satırları seçmeden önce tüm verileri yüklemek istiyor musunuz?</b> </p> <p></p> <p> <b>Hayır</b> olarak cevaplamak, tüm verileri yüklemeyecek ve seçim işlemini uygulanmayacak. <br /> <b>Evet</b> seçeneği biraz zaman alabilir ama seçim işlemini gerçekleştirecektir. </p> Uyarı: Tüm verilerin yüklenmesi büyük tablolar için büyük miktarda bellek gerektirebilir. + <p> Tüm veriler yüklenmedi. <b>Tüm satırları seçmeden önce tüm verileri yüklemek istiyor musunuz?</b> </p> <p></p> <p> <b>Hayır</b> olarak cevaplamak, tüm verileri yüklemeyecek ve seçim işlemini uygulamayacak. <br /> <b>Evet</b> seçeneği biraz zaman alabilir ama seçim işlemini gerçekleştirecektir. </p> Uyarı: Tüm verilerin yüklenmesi büyük tablolar için büyük miktarda bellek gerektirebilir. @@ -2127,7 +2133,7 @@ Do you want to insert it anyway? &Remove - &Sil + &Kaldır @@ -2188,7 +2194,7 @@ x~y Aralık: değerler x ve y arasında Use for Conditional Format - Koşullu Biçim için Kullan + Koşullu Biçim İçin Kullan @@ -2281,7 +2287,7 @@ x~y Aralık: değerler x ve y arasında Fi&nd text: - &Aranan Metin: + Met&ni bul: @@ -2291,12 +2297,12 @@ x~y Aralık: değerler x ve y arasında Match &exact case - Büyük kü&çük harfe duyarlı + Büyük/küçük harf tam &eşleşme Match &only whole words - Kelimenin ta&mamını eşleştir + &Sadece tam kelimeleri eşleştir @@ -2326,7 +2332,7 @@ x~y Aralık: değerler x ve y arasında &Selection only - Sadece se&çimde ara + Sadece se&çim @@ -2351,7 +2357,7 @@ x~y Aralık: değerler x ve y arasında F3 - + F3 @@ -2361,7 +2367,7 @@ x~y Aralık: değerler x ve y arasında Highlight all the occurrences of the text in the page - Eşleşen tüm kelimeleri vurgula + Sayfadaki metnin tüm oluşumlarını vurgula @@ -2371,7 +2377,7 @@ x~y Aralık: değerler x ve y arasında Replace all the occurrences of the text in the page - Sayfadaki bulunan metinlerin tümünü değiştir + Sayfadaki metnin tüm oluşumlarını değiştir @@ -2386,7 +2392,7 @@ x~y Aralık: değerler x ve y arasında The searched text was not found. - The searched text was not found. + Aranan metin bulunamadı. @@ -2427,32 +2433,32 @@ x~y Aralık: değerler x ve y arasında Image Viewer - + İmaj Görüntüleyici Reset the scaling to match the original size of the image. - + Ölçeklemeyi görüntünün orijinal boyutuna uyacak şekilde sıfırla. Set the scaling to match the size of the viewport. - + Ölçeklemeyi, görünüm alanının boyutuna uyacak şekilde ayarla. Print... - Yazdır... + Yazdır... Open preview dialog for printing displayed image - Görüntülenen resmi yazdırmak için önizleme penceresini aç + Görüntülenen resmi yazdırmak için ön izleme penceresini aç Ctrl+P - + Ctrl+P @@ -2465,7 +2471,7 @@ x~y Aralık: değerler x ve y arasında Table na&me - Tablo İs&mi + Tablo is&mi @@ -2578,7 +2584,7 @@ x~y Aralık: değerler x ve y arasında Activate this option to stop the import when trying to import an empty value into a NOT NULL column without a default value. - Varsayılan değeri olmayan NOT NULL kısıtına sahip bir sütuna, boş bir değer içe aktarmaya çalışırken içe aktarmayı durdurmak için bu seçeneği etkinleştirin. + Varsayılan değeri olmayan bir NOT NULL sütununa boş bir değer aktarmaya çalışırken aktarmayı durdurmak için bu seçeneği etkinleştirin. @@ -2598,12 +2604,12 @@ x~y Aralık: değerler x ve y arasında Use local number conventions - + Yerel numara kurallarını kullanın Use decimal and thousands separators according to the system locale. - + Sistem yerel ayarlarına göre ondalık ve binlik ayraçlarını kullanın. @@ -2674,12 +2680,12 @@ x~y Aralık: değerler x ve y arasında Could not prepare INSERT statement: %1 - + INSERT ifadesi hazırlanamadı: %1 Unexpected end of file. Please make sure that you have configured the correct quote characters and the file is not malformed. - + Beklenmeyen dosya sonu. Lütfen tırnak işaretlerini doğru yapılandırdığınızdan ve dosyanın hatalı olmadığından emin olun. @@ -2707,7 +2713,7 @@ x~y Aralık: değerler x ve y arasında Opens the SQLCipher FAQ in a browser window - SQLCipher Hakkında SSS bölümünü tarayıcı penceresinde açar + SQLCipher SSS bölümünü bir tarayıcı penceresinde açar @@ -2717,7 +2723,7 @@ x~y Aralık: değerler x ve y arasında Open an existing database file in read only mode - Mevcut bir veritabanı dosyasını salt okunur modda açar + Mevcut bir veritabanı dosyasını salt okunur modda açın @@ -2894,7 +2900,7 @@ x~y Aralık: değerler x ve y arasında Compact the database file, removing space wasted by deleted records - Veritabanı dosyasını genişletmek, silinen kayıtlardan dolayı meydana gelen boşlukları temizler + Veritabanı dosyasını sıkıştırarak silinen kayıtların kapladığı alanı boşaltın @@ -3125,7 +3131,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Close the current database file - Geçerli veritabano dosyasını kapat + Geçerli veritabanı dosyasını kapat @@ -3151,32 +3157,32 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Compact &Database... - Veriabanını &Sıkıştır... + Veritabanını &Sıkıştır... New &tab - + Yeni &sekme Execute all/selected SQL - Tüm/seçin SQL sorgusunu yürüt + Tüm/seçili SQL'i çalıştır This button executes the currently selected SQL statements. If no text is selected, all SQL statements are executed. - Bu buton seçili olan SQL ifadesini yürütür. Hiçbir metin seçilmezse, tüm SQL ifadeleri yürütülür. + Bu düğme seçili olan SQL ifadesini yürütür. Hiçbir metin seçilmezse tüm SQL ifadeleri yürütülür. Open SQL file(s) - + SQL dosyasını/dosyalarını açın This button opens files containing SQL statements and loads them in new editor tabs - + Bu düğme, SQL ifadeleri içeren dosyaları açar ve bunları yeni düzenleyici sekmelerine yükler @@ -3186,7 +3192,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Execute line - Tek satır yürüt + Satırı yürüt @@ -3211,7 +3217,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Web&site - Web &Sitesi + Web &sitesi @@ -3221,30 +3227,30 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Close Pro&ject - + Pro&jeyi Kapat Close project and database files and return to the initial state - + Proje ve veritabanı dosyalarını kapatın ve başlangıç ​​durumuna dönün Ctrl+Shift+F4 - + Ctrl+Shift+F4 Detach Database - + Veritabanını Ayır Detach database file attached to the current database connection - + Geçerli veritabanı bağlantısına bağlı veritabanı dosyasını ayırın @@ -3260,7 +3266,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Add another database file to the current database connection - Şu anki veritabanı bağğlantısına başka bir veritabanı dosyası ekle + Şu anki veritabanı bağlantısına başka bir veritabanı dosyası ekle @@ -3285,7 +3291,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Open Data&base Read Only... - Salt &Okunur Veritabanı Aç... + Salt Okunur Verita&banı Aç... @@ -3311,7 +3317,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Find text in SQL editor - SQL editörünte metin ara + SQL editöründe metin ara @@ -3352,7 +3358,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Export to &CSV - &CSV dosyası olarak dışa aktar + &CSV'ye aktar @@ -3379,248 +3385,248 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul &Database Structure This has to be equal to the tab title in all the main tabs - + &Veritabanı Yapısı &Browse Data This has to be equal to the tab title in all the main tabs - + Verileri &Görüntüle Edit P&ragmas This has to be equal to the tab title in all the main tabs - + P&ragmaları Düzenle Temp Store - + Geçici Depo Secure Delete - + Güvenli Silme Case Sensitive Like - + Büyük/Küçük Harfe Duyarlı Like İşleci İle Journal Mode - + Günlük Modu Journal Size Limit - + Günlük Boyut Sınırı Recursive Triggers - + Özyinelemeli Tetikleyiciler Page Size - + Sayfa Boyutu Foreign Keys - + Yabancı Anahtarlar Auto Vacuum - + Otomatik Vakum Max Page Count - + Maksimum Sayfa Sayısı Checkpoint Full FSYNC - + Kontrol Noktası Tam FSYNC Off - + Kapalı Normal - + Normal Full - + Tam Default - Varsayılan + Varsayılan File - Dosya + Dosya Memory - + Bellek Delete - + Sil Truncate - + Kısalt Persist - + Sürdür WAL - + WA Exclusive - + Özel Automatic Index - + Otomatik İndeks Ignore Check Constraints - + Kontrol Kısıtlamalarını Yoksay Full FSYNC - + Tam FSYNC WAL Auto Checkpoint - + WAL Oto Kontrol Noktası User Version - + Kullanıcı Sürümü Synchronous - + Eş zamanlı None - Hiçbiri + Hiçbiri Incremental - + Artımlı Locking Mode - + Kilitleme Modu E&xecute SQL This has to be equal to the tab title in all the main tabs - + SQL'i &çalıştır &Recent Files - + &Son Dosyalar &New Database - + Ye&ni Veritabanı &Undo - + &Geri Al Undo last change to the database - + Veritabanındaki son değişikliği geri al This action undoes the last change performed to the database in the Database Browser or in Execute SQL. Redoing is not possible. - + Bu işlem, Veritabanı Tarayıcısı'nda veya SQL Çalıştır'da veritabanında gerçekleştirilen son değişikliği geri alır. Yeniden yapılması mümkün değildir. Open the Modify Table wizard, where it is possible to rename an existing table. It is also possible to add or delete fields from a table, as well as modify field names and types. - + Mevcut bir tablonun adını değiştirebileceğiniz Tablo Değiştirme sihirbazını açın. Ayrıca, bir tabloya alan ekleyebilir veya silebilir, alan adlarını ve türlerini değiştirebilirsiniz. Ctrl+Shift+T - + Ctrl+Shift+T &Save Project - + Projeyi &Kaydet This button lets you save all the settings associated to the open DB to a DB Browser for SQLite project file - + Bu düğme, açık DB ile ilişkili tüm ayarları SQLite proje dosyası için DB Tarayıcısına kaydetmenize olanak tanır Open &Project - + &Proje Aç This button lets you open a DB Browser for SQLite project file - + Bu düğme, SQLite proje dosyası için bir DB Tarayıcısı açmanıza olanak tanır Export to &JSON - + &JSON'a aktar @@ -3630,7 +3636,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul &Open Database - + Veritabanını &Aç @@ -3640,13 +3646,13 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Drag && Drop SELECT Query - + Sürükle && Bırak SEÇ Sorgusu When dragging fields from the same table or a single table, drop a SELECT query into the editor - + Aynı tablodan veya tek bir tablodan alanları sürüklerken, düzenleyiciye bir SEÇ sorgusu bırakın @@ -3668,7 +3674,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Use escaped identifiers (e.g. "Table1") when dragging the objects and dropping them into the editor - Nesneleri sürükleyip editöre bırakırken çıkış karakter belirleyicilerini kullanın(ör. "Tablo1") kullanın + Nesneleri sürükleyip düzenleyiciye bırakırken kaçış tanımlayıcıları (örneğin "Tablo1") kullanın @@ -3698,7 +3704,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Run a quick integrity check over the open DB - Açık veritabanı üzerinde hızlı bir bütünlük denetimi yapın + Açık DB üzerinde hızlı bir bütünlük denetimi yapın @@ -3739,7 +3745,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Print the structure of the opened database - Şu anda açık olan veritabanı yapısını yazdırın + Açılan veritabanının yapısını yazdırın @@ -3749,7 +3755,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul &Save Project As... - Projeyi &Farklı Kaydet... + Projeyi Farklı &Kaydet... @@ -3768,7 +3774,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Save DB file, project file and opened SQL files - Veritabanı dosyasını, proje dosyasını ve açılan SQL dosyalarını kaydedin + DB dosyasını, proje dosyasını ve açılan SQL dosyalarını kaydedin @@ -3779,47 +3785,47 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Ctrl+Shift+W - + Ctrl+Shift+W Table from CSV data in Clipboard... - + Panodaki CSV verilerinden tablo... This treats the current clipboard contents as a CSV file and opens the same import wizard that is used for importing CSV data from a file. - + Bu, geçerli panonun içeriğini bir CSV dosyası olarak ele alır ve bir dosyadan CSV verilerini içe aktarmak için kullanılan aynı içe aktarma sihirbazını açar. Show &Row Counts - + &Satır Sayılarını Göster This shows the number of rows for each table and view in the database. - + Bu, veritabanındaki her tablo ve görünüm için satır sayısını gösterir. Save Database &As... - + Veritabanını &Farklı Kaydet... Save the current database as a different file - + Geçerli veritabanını farklı bir dosya olarak kaydedin Refresh - Yenile + Yenile Reload the database structure - + Veritabanı yapısını yeniden yükle @@ -3859,7 +3865,7 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul Create &Index... - &Index Oluştur... + &İndeks Oluştur... @@ -3869,12 +3875,12 @@ SQL deyimlerini Şema sütunundan sürükleyip SQL editörüne veya diğer uygul &About - &İptal + &Hakkında This button opens a new tab for the SQL editor - Bu buton SQL editörü için yeni bir sekme açar + Bu düğme SQL editörü için yeni bir sekme açar @@ -4119,7 +4125,7 @@ Eğer cevabınız hayır ise biz SQL dosyasındaki verileri geçerli veritabanı Modify Index - Index'i Düzenle + İndeksi Düzenle @@ -4168,22 +4174,22 @@ Bunu yapmak istediğinize emin misiniz? Ctrl+Tab - + Ctrl+Tab Ctrl+Shift+Tab - + Ctrl+Shift+Tab Clear List - + Listeyi Temizle Window Layout - + Pencere Düzeni @@ -4193,32 +4199,32 @@ Bunu yapmak istediğinize emin misiniz? Simplify Window Layout - + Pencere Düzenini Basitleştirin Alt+Shift+0 - + Alt+Shift+0 Dock Windows at Bottom - + Pencereleri Altta Sabitle Dock Windows at Left Side - + Pencereleri Sol Tarafa Yerleştir Dock Windows at Top - + Pencereleri Üstte Sabitle The database is currently busy. - Verştabanı şu anda meşgul. + Veritabanı şu anda meşgul. @@ -4228,7 +4234,7 @@ Bunu yapmak istediğinize emin misiniz? Alt+Shift+W - + Alt+Shift+W @@ -4245,12 +4251,12 @@ Nedeni: %1 Choose a database file to save under - + Kaydedilecek bir veritabanı dosyası seçin Error while saving the database to the new file. - + Veritabanını yeni dosyaya kaydederken hata oluştu. @@ -4272,7 +4278,7 @@ Tabloyla ilişkili tüm veriler kaybedilecektir. Are you sure you want to delete the index '%1'? - '%1' indexsini silmek istediğinizden emin misiniz? + '%1' indeksini silmek istediğinizden emin misiniz? @@ -4292,7 +4298,7 @@ Tabloyla ilişkili tüm veriler kaybedilecektir. Error: could not delete the index. - Hata: index silinemedi. + Hata: indeks silinemedi. @@ -4311,12 +4317,12 @@ Veritabanını kaydetmek istediğinizden emin misiniz? Edit View %1 - + Görünümü Düzenle %1 Edit Trigger %1 - + Tetikleyiciyi Düzenle %1 @@ -4370,55 +4376,55 @@ Emin misiniz? Opened '%1' in read-only mode from recent file list - + Son dosya listesinden '%1' salt okunur modunda açıldı Opened '%1' from recent file list - + Son dosya listesinden '%1' açıldı Select the action to apply to the dropped file(s). <br/>Note: only 'Import' will process more than one file. Note for translation: Although there is no %n in the original, you can use the numerus-form to adjust 'files(s)' and remove the note when n = 1. Including %n in the translation will also work. - - Bırakılan dosyalara uygulanacak eylemi seçin. <br/>Not: yalnızca 'İçe Aktar' birden fazla dosyayı işleyecektir. + + Bırakılan dosyalara uygulanacak eylemi seçin. %n Not: yalnızca 'İçe Aktar' birden fazla dosyayı işler. The statements in the tab '%1' are still executing. Closing the tab will stop the execution. This might leave the database in an inconsistent state. Are you sure you want to close the tab? - + '%1' sekmesindeki ifadeler hâlâ yürütülüyor. Sekmeyi kapatmak yürütmeyi durduracaktır. Bu, veritabanını tutarsız bir durumda bırakabilir. Sekmeyi kapatmak istediğinizden emin misiniz? DB file '%1' could not be opened - + Veritabanı dosyası '%1' açılamadı This project file is using an old file format because it was created using DB Browser for SQLite version 3.10 or lower. Loading this file format is no longer fully supported. If you want to load it completely, please use DB Browser for SQLite version 3.12 to convert it to the new file format. - + Bu proje dosyası, DB Browser for SQLite sürüm 3.10 veya daha eski bir sürüm kullanılarak oluşturulduğu için eski bir dosya biçimi kullanıyor. Bu dosya biçiminin yüklenmesi artık tam olarak desteklenmiyor. Dosyayı tamamen yüklemek istiyorsanız lütfen DB Browser for SQLite sürüm 3.12'yi kullanarak yeni dosya biçimine dönüştürün. Table '%1' not found; settings ignored - + '%1' tablosu bulunamadı; ayarlar göz ardı edildi -- Reference to file "%1" (not supported by this version) -- - + -- "%1" dosyasına başvuru (bu sürüm tarafından desteklenmiyor) -- Yes. Don't ask again - + Evet. Bir daha sorma This action will open a new SQL tab with the following statements for you to edit and run: - + Bu eylem, düzenlemeniz ve çalıştırmanız için aşağıdaki ifadeleri içeren yeni bir SQL sekmesi açacaktır: @@ -4458,12 +4464,12 @@ Emin misiniz? Automatically load the last opened DB file at startup - + Başlangıçta son açılan DB dosyasını otomatik olarak yükle Ctrl+0 - + Ctrl+0 @@ -4504,7 +4510,7 @@ Emin misiniz? Don't show again - Bir daha gös'terme + Bir daha gösterme @@ -4568,7 +4574,7 @@ Bir yedek oluşturun! This action will open a new SQL tab for running: - Bu işlem çalıştırmak için yeni bir SQL sekmesi açar: + Bu işlem, çalıştırmak için yeni bir SQL sekmesi açar: @@ -4606,12 +4612,12 @@ Bir yedek oluşturun! Set to NULL - NULL olarak ayarlar + NULL olarak ayarla Alt+Del - + Alt+Del @@ -4639,17 +4645,17 @@ Bir yedek oluşturun! Y1 - + Y1 Y2 - + Y2 Axis Type - Eksen Tipi + Eksen Türü @@ -4815,7 +4821,7 @@ Yalnızca geçerli yönde sürüklemek ve yakınlaştırmak için eksen veya eks Help - + Yardım @@ -4830,7 +4836,7 @@ Yalnızca geçerli yönde sürüklemek ve yakınlaştırmak için eksen veya eks Fixed number format - + Sabit sayı biçimi @@ -4878,7 +4884,7 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Choose a filename to save under - Altına kaydetmek için dosya ismi seçiniz + Altına kaydetmek için dosya ismi seçin @@ -5008,17 +5014,17 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Default field type - Varsayılan dosya tipi + Varsayılan alan türü Font - Yazı + Yazı Tipi &Font - &Yazı + &Yazı Tipi @@ -5043,7 +5049,7 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Enable this option to show a preview of BLOBs containing image data in the cells. This can affect the performance of the data browser, however. - Hücrelerde görüntü verileri içeren BLOB tipindeki verilerin önizlemesini göstermek için bu seçeneği etkinleştirin. Ancak bu, veri görüntüleyicisinin performansını etkileyebilir. + Hücrelerde görüntü verileri içeren BLOB tipindeki verilerin ön izlemesini göstermek için bu seçeneği etkinleştirin. Ancak bu, veri görüntüleyicisinin performansını etkileyebilir. @@ -5063,7 +5069,7 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Background - Arka plan + Arka Plan @@ -5082,7 +5088,7 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Only display the icon - Sadece ikonu göster + Sadece simgeyi göster @@ -5143,17 +5149,17 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Browse Data - Verileri Görüntüle + Verilere Göz At Execute SQL - SQL kodunu yürütme + SQL kodunu yürüt Edit Database Cell - Veritabanı Hücresini Düzenleme + Veritabanı Hücresini Düzenle @@ -5168,12 +5174,12 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı Dark style - Koyu Tema + Koyu tema Light style - + Aydınlık stil @@ -5183,28 +5189,29 @@ Uyarı: Kısmi yükleme mekanizması nedeniyle tüm veriler tablodan henüz alı This sets the font size for all UI elements which do not have their own font size option. - + Bu, kendi yazı tipi boyutu seçeneği olmayan tüm kullanıcı arayüzü ögelerinin yazı tipi boyutunu ayarlar. Font size - + Yazı tipi boyutu Max Recent Files - + En Son Dosyalar Prompt to save SQL tabs in new project file - + SQL sekmelerini kaydetme istemi +yeni proje dosyasına If this is turned on, then changes to the SQL editor generate a save a project confirmation dialog when closing the SQL editor tab. - + Bu açıksa SQL düzenleyici sekmesi kapatıldığında SQL düzenleyicide yapılan değişiklikler bir proje kaydetme onay iletişim kutusu oluşturur. @@ -5214,17 +5221,17 @@ in new project file Database structure font size - + Veritabanı yapısı yazı tipi boyutu Font si&ze - Yazı B&oyutu + Yazı tipi b&oyutu Formatted - + Biçimlendirilmiş @@ -5232,9 +5239,9 @@ in new project file Maximum number of rows in a table for enabling the value completion based on current values in the column. Maximum number of indexes in a selection for calculating sum and average. Can be set to 0 for disabling the functionalities. - Bu, bazı hesaplama açısından pahalı işlevlerin etkinleştirilmesine izin verilen maksimum öğe sayısıdır: + Bu, bazı hesaplama açısından pahalı işlevlerin etkinleştirilmesine izin verilen maksimum öge sayısıdır: Sütundaki geçerli değerlere dayalı olarak değer tamamlamayı etkinleştirmek için bir tablodaki maksimum satır sayısı. -Toplam ve ortalamayı hesaplamak için bir seçimdeki maksimum index sayısı. +Toplam ve ortalamayı hesaplamak için bir seçimdeki maksimum indeks sayısı. İşlevleri devre dışı bırakmak için 0 olarak ayarlanabilir. @@ -5247,42 +5254,42 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Selection background - + Seçim arka planı Selection foreground - + Seçim ön planı Highlight - + Vurgu Use tabs for indentation - + Girinti için sekmeleri kullanın When set, the Tab key will insert tab and space characters for indentation. Otherwise, just spaces will be used. - + Ayarlandığında, Tab tuşu girinti için sekme ve boşluk karakterleri ekler. Aksi takdirde, yalnızca boşluklar kullanılır. Close button on tabs - + Sekmelerdeki düğmeyi kapat If enabled, SQL editor tabs will have a close button. In any case, you can use the contextual menu or the keyboard shortcut to close them. - + Etkinleştirildiğinde, SQL düzenleyici sekmelerinde bir kapatma düğmesi bulunur. Her durumda, bağlam menüsünü veya klavye kısayolunu kullanarak bunları kapatabilirsiniz. Select built-in extensions to load for every database: - + Her veritabanı için yüklenecek yerleşik uzantıları seçin: @@ -5297,12 +5304,12 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Export Settings - + Ayarları Dışa Aktar Import Settings - + Ayarları İçe Aktar @@ -5340,7 +5347,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Preview only (N/A) - Sadece önizleme (N/A) + Sadece ön izleme (N/A) @@ -5355,7 +5362,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Set the waiting time before a new filter value is applied. Can be set to 0 for disabling waiting. - Yeni bir filtre değeri uygulanmadan önce bekleme süresini ayarlayın. Beklemeyi devre dışı bırakmak için 0 olarak ayarlanabilir. + Yeni bir filtre değeri uygulanmadan önce bekleme süresini ayarla. Beklemeyi devre dışı bırakmak için 0 değeri ayarlanabilir. @@ -5415,7 +5422,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. String - String + Dize @@ -5425,7 +5432,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. SQL &editor font size - SQL &Editör yazı boyutu + SQL &editör yazı tipi boyutu @@ -5460,7 +5467,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. &Quotes for identifiers - Tanımlıyıcılar için &tırnaklar + Tanımlayıcılar için &tırnaklar @@ -5531,7 +5538,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Subject O - Konu O + O Konusu @@ -5542,7 +5549,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Valid from - Şundan tarihten itibaren geçerli + Şu tarihten itibaren geçerli @@ -5589,7 +5596,7 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. SQL editor &font - SQL Editör &yazı boyutu + SQL editör &yazı tipi @@ -5599,12 +5606,12 @@ Tamamlamayı devre dışı bırakmak için 0 olarak ayarlanabilir. Hori&zontal tiling - Ya&tay Döşeme + Ya&tay döşeme If enabled the SQL code editor and the result table view are shown side by side instead of one over the other. - Etkinleştirilirse, SQL kod düzenleyicisi ve sonuç tablosu görünümü üst üste yerine yan yana gösterilir. + Etkinleştirilirse SQL kod düzenleyicisi ve sonuç tablosu görünümü üst üste yerine yan yana gösterilir. @@ -5698,35 +5705,37 @@ Tüm tercihleriniz kaybolacak ve varsayılan değerler kullanılacak. Save Settings File - + Ayarlar Dosyasını Kaydet Initialization File (*.ini) - + Başlatma Dosyası (*.ini) The settings file has been saved in location : - + Ayarlar dosyası şu konuma kaydedildi: + Open Settings File - + Ayarlar Dosyasını Aç The settings file was loaded properly. - + Ayarlar dosyası düzgün bir şekilde yüklendi. The selected settings file is not a normal settings file. Please check again. - + Seçilen ayar dosyası normal bir ayar dosyası değil. + Lütfen tekrar kontrol edin. @@ -5739,7 +5748,7 @@ Please check again. Pro&xy Type - Pro&xy Tipi + Pro&xy Türü @@ -5893,7 +5902,7 @@ Please check again. JSON Files (*.json *.js) - JSON dosyaları (*.json *.js) + JSON Dosyaları (*.json *.js) @@ -5923,7 +5932,7 @@ Please check again. Initialization File (*.ini) - + Başlatma Dosyası (*.ini) @@ -6020,37 +6029,37 @@ Please check again. Commit ID - + Commit ID Message - + Mesaj Date - Tarih + Tarih Author - + Yazar Size - Boyut + Boyut Authored and committed by %1 - + %1 tarafından yazıldı ve işlendi Authored by %1, committed by %2 - + %1 tarafından yazıldı, %2 tarafından işlendi @@ -6090,142 +6099,142 @@ Please check again. Upload - + Yükle DBHub.io - + DBHub.io <html><head/><body><p>In this pane, remote databases from dbhub.io website can be added to DB Browser for SQLite. First you need an identity:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Login to the dbhub.io website (use your GitHub credentials or whatever you want)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click the button to &quot;Generate client certificate&quot; (that's your identity). That'll give you a certificate file (save it to your local disk).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Go to the Remote tab in DB Browser for SQLite Preferences. Click the button to add a new certificate to DB Browser for SQLite and choose the just downloaded certificate file.</li></ol><p>Now the Remote panel shows your identity and you can add remote databases.</p></body></html> - + <html><head/><body><p>Bu bölmede, dbhub.io web sitesinden uzak veritabanları SQLite için DB Tarayıcısına eklenebilir. Öncelikle bir kimliğe ihtiyacınız var:</p><ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">dbhub.io web sitesine giriş yapın (GitHub kimlik bilgilerinizi veya istediğiniz herhangi bir şeyi kullanın)</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">"İstemci sertifikası oluştur" düğmesine tıklayın (bu sizin kimliğinizdir). Bu size bir sertifika dosyası verecektir (bunu yerel diskinize kaydedin).</li><li style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SQLite için Veritabanı Tarayıcısı Tercihleri'ndeki Uzak sekmesine gidin. SQLite için Veritabanı Tarayıcısı'na yeni bir sertifika eklemek için düğmeye tıklayın ve az önce indirdiğiniz sertifika dosyasını seçin.</li></ol><p>Artık Uzak paneli kimliğinizi gösterecek ve uzak veritabanları ekleyebilirsiniz.</p></body></html> Local - + Yerel Current Database - + Güncel Veritabanı Clone - + Klonla Branch - Branch + Dal Commits - + Commitler Commits for - + Commitler için Delete Database - + Veritabanını Sil Delete the local clone of this database - + Bu veritabanının yerel klonunu silin Open in Web Browser - + Web Tarayıcısında Aç Open the web page for the current database in your browser - + Tarayıcınızda geçerli veritabanının web sayfasını açın Clone from Link - + Bağlantıdan Klonla Use this to download a remote database for local editing using a URL as provided on the web page of the database. - + Bunu, veritabanının web sayfasında sağlanan bir URL'yi kullanarak yerel düzenleme için uzak bir veritabanını indirmek için kullanın. Refresh - Yenile + Yenile Reload all data and update the views - + Tüm verileri yeniden yükle ve görünümleri güncelle Clone Database - + Veritabanını Klonla Open Database - + Veritabanını Aç Open the local copy of this database - + Bu veritabanının yerel kopyasını açın Check out Commit - + Commit'i Kontrol Edin Download and open this specific commit - + Bu özel commiti indirin ve açın Check out Latest Commit - + En Son Commiti Kontrol Edin Check out the latest commit of the current branch - + Mevcut dalın en son commitini kontrol edin Save Revision to File - + Revizyonu Dosyaya Kaydet Saves the selected revision of the database to another file - + Veritabanının seçili revizyonunu başka bir dosyaya kaydeder Upload Database - + Veritabanını Yükle Upload this database as a new commit - + Bu veritabanını yeni bir commit olarak yükleyin @@ -6235,12 +6244,12 @@ Please check again. &User - + &Kullanıcı &Database - &Veritabanı + &Veritabanı @@ -6250,12 +6259,12 @@ Please check again. Select an identity to connect - + Bağlanmak için bir kimlik seçin Public - + Genel @@ -6263,43 +6272,47 @@ Please check again. Please enter the URL to clone from. You can generate this URL by clicking the 'Clone Database in DB4S' button on the web page of the database. - + Bu, yerel düzenleme için uzak bir sunucudan bir veritabanı indirir. +Lütfen klonlanacak URL'yi girin. Bu URL'yi, veritabanının web +sayfasındaki 'DB4S'de Veritabanını Klonla' düğmesine +tıklayarak oluşturabilirsiniz. Invalid URL: The host name does not match the host name of the current identity. - + Geçersiz URL: Ana bilgisayar adı, geçerli kimliğin ana bilgisayar adıyla eşleşmiyor. Invalid URL: No branch name specified. - + Geçersiz URL: Herhangi bir dal adı belirtilmedi. Invalid URL: No commit ID specified. - + Geçersiz URL: Belirtilen bir commit kimliği yok. You have modified the local clone of the database. Fetching this commit overrides these local changes. Are you sure you want to proceed? - + Veritabanının yerel klonunu değiştirdiniz. Bu commit'i almak, bu yerel değişiklikleri geçersiz kılar. +Devam etmek istediğinizden emin misiniz? The database has unsaved changes. Are you sure you want to push it before saving? - + Veritabanında kaydedilmemiş değişiklikler var. Kaydetmeden önce göndermek istediğinizden emin misiniz? The database you are trying to delete is currently opened. Please close it before deleting. - + Silmeye çalıştığınız veritabanı şu anda açık. Lütfen silmeden önce kapatın. This deletes the local version of this database with all the changes you have not committed yet. Are you sure you want to delete this database? - + Bu, henüz kaydetmediğiniz tüm değişikliklerle birlikte bu veritabanının yerel sürümünü siler. Bu veritabanını silmek istediğinizden emin misiniz? @@ -6307,32 +6320,32 @@ Are you sure you want to proceed? Name - İsim + İsim Branch - Branch + Dal Last modified - Son değiştirilme + Son değiştirilme Size - Boyut + Boyut Commit - Commit + Commit File - Dosya + Dosya @@ -6340,42 +6353,42 @@ Are you sure you want to proceed? Name - İsim + İsim Commit - Commit + Commit Last modified - Son değiştirilme + Son değiştirilme Size - Boyut + Boyut Size: - + Boyut: Last Modified: - + Son Değiştirilme: Licence: - + Lisans: Default Branch: - + Varsayılan Dal: @@ -6383,47 +6396,48 @@ Are you sure you want to proceed? Choose a location to save the file - + Dosyayı kaydetmek için bir konum seçin Error opening remote file at %1. %2 - %1 adresinde bulunan dosya açılamadı. %2 + %1 adresinde bulunan dosya açılamadı. +%2 Error: Invalid client certificate specified. - Hata: Geçersiz istemci sertifikası belirtildi. + Hata: Geçersiz istemci sertifikası belirtildi. Please enter the passphrase for this client certificate in order to authenticate. - Kimlik doğrulaması için lütfen istemci sertifikasının parolasını girin. + Kimlik doğrulaması için lütfen istemci sertifikasının parolasını girin. Cancel - İptal + İptal Uploading remote database to %1 - Uzak veritabanı karşıya yükleniyor + Uzak veritabanı karşıya yükleniyor %1 Downloading remote database from %1 - Uzaktaki sunucu indiriliyor: + Uzaktaki sunucu indiriliyor: %1 Error: Cannot open the file for sending. - Hata: Dosya gönderim için açılamadı. + Hata: Dosya gönderim için açılamadı. @@ -6431,12 +6445,12 @@ Are you sure you want to proceed? Push database - Veritabanını aktar + Veritabanını zorla Database na&me to push to - Aktarılacak veritaba&nı adı + Gönderilecek veritaba&nı adı @@ -6451,22 +6465,22 @@ Are you sure you want to proceed? Public - Halka açık + Genel Branch - Branch + Dal Force push - Aktarmaya zorla + Zorla itme Username - + Kullanıcı adı @@ -6517,7 +6531,7 @@ Are you sure you want to proceed? Sele&cted - &Seçilen + &Seçili @@ -6540,7 +6554,7 @@ Are you sure you want to proceed? Shift+F3 - + Shift+F3 @@ -6565,12 +6579,12 @@ Are you sure you want to proceed? The found pattern must match in letter case - Bulunan desen büyük küçük harfe duyarlı olmalıdır + Bulunan desen büyük/küçük harfe duyarlı olmalıdır Case Sensitive - Büyük küçük harfe duyarı + Büyük/küçük harfe duyarı @@ -6585,7 +6599,7 @@ Are you sure you want to proceed? F3 - + F3 @@ -6606,7 +6620,7 @@ Are you sure you want to proceed? Close Find Bar - Araba çubuğunu kapat + Bulma Çubuğunu Kapat @@ -6626,17 +6640,17 @@ Are you sure you want to proceed? Ctrl+PgUp - + Ctrl+PgUp Ctrl+PgDown - + Ctrl+PgDown Couldn't read file "%1": %2. - + "%1" dosyası okunamadı: %2. @@ -6657,17 +6671,17 @@ Are you sure you want to proceed? Answer "Yes to All" to reload the file on any external update without further prompting. - + Herhangi bir harici güncellemede fazla soru sormadan dosyayı yeniden yüklemek için "Tümüne Evet" yanıtını verin. Answer "No to All" to ignore any external update without further prompting. - + Herhangi bir harici güncellemeyi fazla uyarı almadan yok saymak için "Tümüne Hayır" cevabını verin. Modifying and saving the file will restore prompting. - + Dosyayı düzenleyip kaydettiğinizde istem tekrar aktif olacak. @@ -6723,7 +6737,7 @@ Are you sure you want to proceed? (X,Y,Z) The iif(X,Y,Z) function returns the value Y if X is true, and Z otherwise. - + (X,Y,Z) The iif(X,Y,Z) fonksiyonu, X doğruysa Y değerini, aksi takdirde Z değerini döndürür. @@ -6970,13 +6984,13 @@ Bu işlevin kullanımına Tercihler'den izin verilmelidir. (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows before the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows before the current row, NULL is returned. - (expr,offset) Uzaklık değişkeni sağlanırsa, negatif olmayan bir tam sayı olmalıdır. Bu durumda, döndürülen değer, bölüm içindeki geçerli satırdan önce satır ofseti satırlarına göre ifade değerlendirmesinin sonucudur. Ofset 0 ise, ifade geçerli satıra göre değerlendirilir. Geçerli satırdan önce satır kaydırma satırları yoksa, NULL döndürülür. + (expr,offset) Uzaklık değişkeni sağlanırsa negatif olmayan bir tam sayı olmalıdır. Bu durumda, döndürülen değer, bölüm içindeki geçerli satırdan önce satır ofseti satırlarına göre ifade değerlendirmesinin sonucudur. Ofset 0 ise ifade geçerli satıra göre değerlendirilir. Geçerli satırdan önce satır kaydırma satırları yoksa NULL döndürülür. (expr,offset,default) If default is also provided, then it is returned instead of NULL if the row identified by offset does not exist. - (expr,offset,default) Varsayılan da sağlanmışsa, ofset ile tanımlanan satır yoksa NULL döndürülür. + (expr,offset,default) Varsayılan da sağlanmışsa ofset ile tanımlanan satır yoksa NULL döndürülür. @@ -6986,7 +7000,7 @@ Bu işlevin kullanımına Tercihler'den izin verilmelidir. (expr,offset) If the offset argument is provided, then it must be a non-negative integer. In this case the value returned is the result of evaluating expr against the row offset rows after the current row within the partition. If offset is 0, then expr is evaluated against the current row. If there is no row offset rows after the current row, NULL is returned. - (expr,offset) Uzaklık değişkeni sağlanırsa, negatif olmayan bir tam sayı olmalıdır. Bu durumda, döndürülen değer, bölüm içindeki geçerli satırdan sonra ifade ofset satırlarına göre ifade değerlendirmesinin sonucudur. Ofset 0 ise, ifade geçerli satıra göre değerlendirilir. Geçerli satırdan sonra satır ofseti satırı yoksa, NULL döndürülür. + (expr,offset) Uzaklık değişkeni sağlanırsa negatif olmayan bir tam sayı olmalıdır. Bu durumda, döndürülen değer, bölüm içindeki geçerli satırdan sonra ifade ofset satırlarına göre ifade değerlendirmesinin sonucudur. Ofset 0 ise ifade geçerli satıra göre değerlendirilir. Geçerli satırdan sonra satır ofseti satırı yoksa NULL döndürülür. @@ -7001,145 +7015,145 @@ Bu işlevin kullanımına Tercihler'den izin verilmelidir. (expr,N) This built-in window function calculates the window frame for each row in the same way as an aggregate window function. It returns the value of expr evaluated against the row N of the window frame. Rows are numbered within the window frame starting from 1 in the order defined by the ORDER BY clause if one is present, or in arbitrary order otherwise. If there is no Nth row in the partition, then NULL is returned. - (expr,N) Bu yerleşik pencere işlevi, her satır için pencere çerçevesini birleştirilmiş pencere işlevi ile aynı şekilde hesaplar. Pencere çerçevesinin N satırına göre değerlendirilen ifade değerini döndürür. Satırlar, pencere çerçevesi içinde 1'den başlayarak, ORDER BY deyimi tarafından varsa veya başka bir şekilde rastgele sırada numaralandırılır. Bölümde N'inci satırı yoksa, NULL döndürülür. + (expr,N) Bu yerleşik pencere işlevi, her satır için pencere çerçevesini birleştirilmiş pencere işlevi ile aynı şekilde hesaplar. Pencere çerçevesinin N satırına göre değerlendirilen ifade değerini döndürür. Satırlar, pencere çerçevesi içinde 1'den başlayarak, ORDER BY deyimi tarafından varsa veya başka bir şekilde rastgele sırada numaralandırılır. Bölümde N'inci satırı yoksa NULL döndürülür. (X) Return the arccosine of X. The result is in radians. - + (X) X'in ark kosinüsünü döndür. Sonuç radyan cinsindendir. (X) Return the hyperbolic arccosine of X. - + (X) X'in hiperbolik ark kosinüsünü döndür. (X) Return the arcsine of X. The result is in radians. - + (X) X'in ark sinüsünü döndürür. Sonuç radyan cinsindendir. (X) Return the hyperbolic arcsine of X. - + (X) X'in hiperbolik ark sinüsünü döndürür. (X) Return the arctangent of X. The result is in radians. - + (X) X'in ark tanjantını döndürür Sonuç radyan cinsindendir. (X,Y) Return the arctangent of Y/X. The result is in radians. The result is placed into correct quadrant depending on the signs of X and Y. - + (X,Y) Y/X'in ark tanjantını döndürür. Sonuç radyan cinsindendir. Sonuç, X ve Y'nin işaretlerine bağlı olarak doğru kadrana yerleştirilir. (X) Return the hyperbolic arctangent of X. - + (X) X'in hiperbolik ark tanjantını döndürür. (X) Return the first representable integer value greater than or equal to X. For positive values of X, this routine rounds away from zero. For negative values of X, this routine rounds toward zero. - + (X) X'ten büyük veya ona eşit ilk temsil edilebilir tam sayı değerini döndürür. X'in pozitif değerleri için bu rutin sıfırdan uzaklaşır. X'in negatif değerleri için bu rutin sıfıra doğru yuvarlar. (X) Return the cosine of X. X is in radians. - + (X) X'in kosinüsünü döndürür. X radyan cinsindendir. (X) Return the hyperbolic cosine of X. - + (X) X'in hiperbolik kosinüsünü döndürür. (X) Convert value X from radians into degrees. - + (X) X değerini radyandan dereceye dönüştürür. (X) Compute e (Euler's number, approximately 2.71828182845905) raised to the power X. - + (X) e'nin (Euler sayısı, yaklaşık 2.71828182845905) X kuvvetine yükseltilmiş halini hesaplayın. (X) Return the first representable integer value less than or equal to X. For positive numbers, this function rounds toward zero. For negative numbers, this function rounds away from zero. - + (X) X'ten küçük veya ona eşit ilk temsil edilebilir tam sayı değerini döndürür. Pozitif sayılar için bu fonksiyon sıfıra doğru yuvarlar. Negatif sayılar için bu fonksiyon sıfırdan uzaklaşır. (X) Return the natural logarithm of X. - + X) X'in doğal logaritmasını döndürür. (B,X) Return the base-B logarithm of X. - + (B,X) X'in B tabanındaki logaritmasını döndürür. (X) Return the base-10 logarithm for X. - + (X) X'in 10 tabanlı logaritmasını döndür. (X) Return the logarithm base-2 for the number X. - + (X) X sayısının 2 tabanındaki logaritmasını döndürür. (X,Y) Return the remainder after dividing X by Y. - + (X,Y) X'i Y'ye böldükten sonra kalanı döndürür. () Return an approximation for π. - + () π için bir yaklaşım değeri döndürür. (X,Y) Compute X raised to the power Y. - + (X,Y) X'in Y'ye yükseltilmiş değerini hesaplayın. (X) Convert X from degrees into radians. - + (X) X'i dereceden radyana dönüştürün. (X) Return the sine of X. X is in radians. - + (X) X'in sinüsünü döndürür. X radyan cinsindendir. (X) Return the hyperbolic sine of X. - + (X) X'in hiperbolik sinüsünü döndürür. (X) Return the square root of X. NULL is returned if X is negative. - + (X) X'in karekökünü döndürür. X negatifse NULL döndürülür. (X) Return the tangent of X. X is in radians. - + (X) X'in tanjantını döndürür. X radyan cinsindendir. (X) Return the hyperbolic tangent of X. - + (X) X'in hiperbolik tanjantını döndürür. (X) Return the representable integer in between X and 0 (inclusive) that is furthest away from zero. Or, in other words, return the integer part of X, rounding toward zero. - + (X) X ile 0 (dahil) arasında sıfırdan en uzak olan gösterilebilir tam sayıyı döndürür. Ya da başka bir deyişle, X'in tam sayı kısmını sıfıra yuvarlayarak döndürür. @@ -7216,12 +7230,12 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın - Ctrl+' for copying the value from the cell above. - Standard selection and copy/paste operations. Bu veritabanı tablosu görünümüdür. Aşağıdaki işlemleri yapabilirsiniz: -  - Satır içi değeri düzenlemek için yazmaya başlayın. +  - Değeri satır içi olarak düzenlemek için yazmaya başlayın.   - İçeriklerini hücre düzenleyici penceresinde düzenlemek için herhangi bir kaydı çift tıklayın. -  - Hücre içeriğini NULL'a dönüştürmek için Alt + Del tuşlarına basın. -  - Geçerli kaydı çoğaltmak için Ctrl + "tuşlarına basın. +  -Hücre içeriğini NULL olarak silmek için Alt+Del tuşlarına basın. +  - Geçerli kaydı kopyalamak için Ctrl + "tuşlarına basın.   - Yukarıdaki hücreden değeri kopyalamak için Ctrl + '. -  - Standart seçim ve kopyalama / yapıştırma işlemleri. +  - Standart seçim ve kopyala / yapıştır işlemleri. @@ -7271,7 +7285,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Case Sensitive - Büyük Küçük Harfe Duyarlı + Büyük/Küçük Harfe Duyarlı @@ -7286,7 +7300,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Interpret search pattern as a regular expression - Arama desenini düzenliifade olarak yorumlama + Arama desenini düzenli ifade olarak yorumla @@ -7338,44 +7352,44 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Export to &JSON - + &JSON'a aktar Export the filtered data to JSON - + Filtrelenmiş verileri JSON'a aktar This button exports the data of the browsed table as currently displayed (after filters, display formats and order column) as a JSON file. - + Bu buton, taranan tablonun verilerini şu anda görüntülendiği şekilde (filtreler, görüntüleme biçimleri ve sıralama sütunundan sonra) JSON dosyası olarak dışa aktarır. Copy column name - + Sütun adını kopyala Copy the database table column name to your clipboard - + Veritabanı tablosu sütun adını panonuza kopyalayın New Data Browser - + Yeni Veri Tarayıcısı Add a new docked Data Browser - + Yeni bir yerleşik Veri Tarayıcısı ekleyin This button adds a new docked Data Browser, which you can detach and arrange in different layouts. - + Bu düğme, farklı düzenlerde ayırıp düzenleyebileceğiniz yeni bir yerleşik Veri Tarayıcısı ekler. @@ -7435,7 +7449,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın <html><head/><body><p>Clicking this button navigates up to the end in the table view above.</p></body></html> - + <html><head/><body><p>Bu düğmeye tıklandığında yukarıdaki tablo görünümünde en sona gidilir.</p></body></html> @@ -7455,7 +7469,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Go to: - Bu kayda gidin: + Git: @@ -7465,7 +7479,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Type a record number in this area and click the Go to: button to display the record in the database view - Bu alana veritabanı görünümünde görüntülemek istediğiniz kayıt numarasını giriniz ve Bu kayda gidin butonuna tıklayınız + Bu alana veritabanı görünümünde görüntülemek istediğiniz kayıt numarasını giriniz ve Git butonuna tıklayınız @@ -7475,7 +7489,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Show rowid column - rowid sütununu göster + Rowid sütununu göster @@ -7609,7 +7623,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Hide selected column(s) - Seçilen sütunları gizle + Seçili sütunları gizle @@ -7625,22 +7639,22 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Set encoding - Kodlama seç + Kodlamayı ayarla Change the encoding of the text in the table cells - Tablo hücrelerindeki metnin kodlamasını değiştirme + Tablo hücrelerindeki metnin kodlamasını değiştir Set encoding for all tables - Tüm tablolar için kodlama seç + Tüm tablolar için kodlama ayarla Change the default encoding assumed for all tables in the database - Veritabanındaki tüm tablolar için varsayılan kodlamayı değiştirme + Veritabanındaki tüm tablolar için varsayılan kodlamayı değiştir @@ -7687,7 +7701,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Print currently browsed table data. Print selection if more than one cell is selected. - Şu anda görüntülenen tablo verilerini yazdırın. Birden fazla hücre seçilirse seçimi yazdırın. + Şu anda görüntülenen tablo verilerini yazdır. Birden fazla hücre seçilirse seçimi yazdır. @@ -7727,12 +7741,12 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Freeze columns - + Sütunları dondur Make all columns from the first column up to this column not move when scrolling horizontally - + Yatay kaydırma sırasında ilk sütundan bu sütuna kadar olan tüm sütunların hareket etmemesini sağlayın @@ -7817,7 +7831,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Font Color - Yazı Rengi + Yazı Tipi Rengi @@ -7859,7 +7873,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Filter in any column - + Herhangi bir sütunda filtreleme yapın @@ -7898,17 +7912,17 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın %L1 - %L2 of >= %L3 - + %L1 - %L2 of >= %L3 %L1 - %L2 of %L3 - + %L1 - %L2 of %L3 (clipped at %L1 rows) - + (%L1 satırlarında kesildi) @@ -7933,12 +7947,12 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Ctrl+" - + Ctrl+" Adjust rows to contents - Satırları içeriklere göre ayarlama + Satırları içeriklere göre ayarla @@ -7950,7 +7964,7 @@ Buraya atlamak için %3Shift'e basılı tutun ve tıklayın Please select a record first - Lütfen öncelikle kaydı seçiniz + Lütfen önce bir kayıt seçin @@ -7985,22 +7999,22 @@ Veritabanı kodlamasını kullanmak için alanı boş bırakın. New Data Browser - + Yeni Veri Tarayıcısı Rename Data Browser - + Veri Tarayıcısını Yeniden Adlandır Close Data Browser - + Veri Tarayıcısını Kapat Set a new name for the data browser. Use the '&&' character to allow using the following character as a keyboard shortcut. - + Veri tarayıcısı için yeni bir ad belirleyin. Aşağıdaki karakteri klavye kısayolu olarak kullanabilmek için '&&' karakterini kullanın. @@ -8018,7 +8032,7 @@ Veritabanı kodlamasını kullanmak için alanı boş bırakın. Please select the databases to co&mpact: - Sıkıştır&mak istediğiniz veritabanını seçiniz: + Sıkıştır&mak istediğiniz veritabanını seçin: From b49cf197317ab9724aec5bcdb365d28935cd228b Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 6 Sep 2025 14:13:40 +0900 Subject: [PATCH 63/97] Upgrade the Windows CI runner version to 2022 --- .github/workflows/cppcmake-windows.yml | 9 +++++++-- .github/workflows/cppcmake.yml | 26 ++++++++++++-------------- installer/windows/variables.wxi | 2 +- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 7130779da..5d355c700 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -16,7 +16,7 @@ jobs: fail-fast: false matrix: arch: [x86, x64] - os: [windows-2019] + os: [windows-2022] env: GH_TOKEN: ${{ github.token }} OPENSSL_VERSION: 1.1.1.2100 @@ -52,10 +52,14 @@ jobs: cache-key-prefix: "cache" version: ${{ env.QT_VERSION }} + - name: Install VS2019 + run: choco install visualstudio2019community --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows10SDK.19041 --add Microsoft.VisualStudio.Component.VC.Redist.MSM" + - name: Setup MSVC uses: ilammy/msvc-dev-cmd@v1 with: arch: ${{ matrix.arch == 'x86' && 'amd64_x86' || matrix.arch == 'x64' && 'amd64'}} + vsversion: 2019 - name: Build SQLite run: | @@ -73,7 +77,8 @@ jobs: - name: Download SQLean extension run: | if ("${{ matrix.arch }}" -eq "x86") { - gh release download --pattern "sqlean-win-x86.zip" --repo "nalgeon/sqlean" + # sqlean has discontinued x86 support starting from v0.28.0 + gh release download 0.27.4 --pattern "sqlean-win-x86.zip" --repo "nalgeon/sqlean" Expand-Archive -Path sqlean-win-x86.zip -DestinationPath .\sqlean } else { gh release download --pattern "sqlean-win-x64.zip" --repo "nalgeon/sqlean" diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index a333e8f63..daf7d404d 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -55,18 +55,17 @@ jobs: with: NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} - # build-windows: - # needs: check-skippable - # if: needs.check-skippable.outputs.skip != 'true' - # uses: ./.github/workflows/cppcmake-windows.yml - # secrets: inherit - # with: - # NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} + build-windows: + needs: check-skippable + if: needs.check-skippable.outputs.skip != 'true' + uses: ./.github/workflows/cppcmake-windows.yml + secrets: inherit + with: + NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} release: if: github.event_name != 'pull_request' - needs: [build-macos, build-ubuntu] - # needs: [build-macos, build-ubuntu, build-windows] + needs: [build-macos, build-ubuntu, build-windows] name: Release runs-on: ubuntu-24.04 env: @@ -84,18 +83,17 @@ jobs: with: path: target - # - name: Remove unsigned Windows build - # run: rm -rfv target/*unsigned* + - name: Remove unsigned Windows build + run: rm -rfv target/*unsigned* - run: find target -type f -exec mv -v {} target \; - # - name: Unarchive Windows's build artifacts - # run: for f in target/*.zip; do unzip -d target/ "$f" && rm -v "$f"; done + - name: Unarchive Windows's build artifacts + run: for f in target/*.zip; do unzip -d target/ "$f" && rm -v "$f"; done - name: Release uses: softprops/action-gh-release@v2 with: - body: "The Windows build will not be provided for the time being. Note: #3967" files: target/* prerelease: true tag_name: ${{ env.tag_name }} diff --git a/installer/windows/variables.wxi b/installer/windows/variables.wxi index b824b88e9..8fc77959a 100644 --- a/installer/windows/variables.wxi +++ b/installer/windows/variables.wxi @@ -40,7 +40,7 @@ Visual Studio 2017. The build "ARCH" will be set automatically. --> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SHORTCUT_SQLITE_DESKTOP + + + + + SHORTCUT_SQLCIPHER_DESKTOP + + + + + + + SHORTCUT_SQLITE_PROGRAMMENU + + + + + SHORTCUT_SQLCIPHER_PROGRAMMENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LicenseAccepted = "1" + NOT Installed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSIS_INSTALLDIR + + + + + + + NSIS_INSTALLDIR + + + + + diff --git a/installer/windows_on_arm/resources/background.xcf b/installer/windows_on_arm/resources/background.xcf new file mode 100644 index 0000000000000000000000000000000000000000..ebf51cf0f1e399841c501e83071c6408b573a8a4 GIT binary patch literal 33745 zcmeHQ33L?2x~}wOfe=8DsGvw(*wi4X&*z5MqxZaf-o4jBMI`}I5ilT2luZOQ?1F#+ zM8Xmh=*hlL_H8nmOa-z)$U;Jv$-c}agd}7SNoM-}HPe%s#7UFn9=Sem&pFk9O;vqe z)!jAqS9N{=KTc~md~LUV<(GEb<}X-)5Hf3o@Cro8=QM;#5X{Wr@F0XSZy!g91o%vW zU=DfKARp4j5h-U2X)l8u?*yl|U+KJI!|IJ&;JY@H6hIGXbJlKH;k4S`Y17(OY^E8S zvw6#R>sQ-tc3!`B)m-a2UplRHUhllgZjM&iZ*ux#h28vl^R*unkp*nlT!4OI0;h+-Zn0atapjuTn+e|e%P%*t-qPPdg8pri zE@dE;+y|qNS(NU}4<1H|`sg-@?1n&Y=-BnnPR{eb-sl8zWC;Nt3t}KVLE?Ye4M%u% z5JD&M0nU6d!LCp9pbM-&6>sYgj=bcyj)kY#ao7 zn#39SfPBg*ZrrsXS^uG;^)Zn88^E@UD%R!waMDB>ND`3ifzNacoqRDwCqFr-lL*a1 zj|gX=8NzAkX`wB8P}uU`@=f0#JbLoXMUih{NNA`)tPTwcnvBK^JKp_h{oa!o{39ju zln3zy#5mXpd)6N~9}p*h4BH@UVeisCXG4>o#A6Zj-WXx;;+^Lr<+HFAV*Y6*>|3(W zH|ZH{iL8X`?OsXt*c@33)gK;>o{uTS%(D=xKX6TW0pb=y&Cb}Dum-(tF4TN@@ny^) zh@T1h@heyzEDjRTnh^QRxHniFl@dnL8ehqO;r3v0M0{3yl!&Iq zvKMhHe2tdg$i9}~M~lK`3-BG15HBmt%g#=T5Q#!1&*MgIQlh-5^hS1eW>N_48!3HG zd!p$0L|IBfO?f_*efO#~nD&d1%*8Fb;V=50=Qc>4#3Ma9HPl9J^UaMb`rfkKDq?z!7_M^#<` z?dVNUiVhT6(|1MQK7RfIf#yMGfq4M~QN{hJ?#_<();qUq%8K%Hva?cUF`+(F=*&T- z8?~*1I<%!*nwxGn)YsKilol7{-?*MCi;E2Q5!ukYDcK<0ZBsa9ZFN;;d0B~~sPJZ9 zZdN*$#DoQU)0Zw?^z;~nZ!m!`EzHl&x|Vi1IWaa;91HihcUl2|_ik5b zdmDLdx9U}#_z?25fnP&vMrKZ4L2+$UGjzu;z;{6PO^prpDkUd=R@eZ1b)yd74fqyq z>yLxh1wwo%q5twL z;dcwy&$hmyURhIB!3qD6T8uxAP1fJOiuwjRQC3l z*WGGtZf%E$2Y9&mP<<(9_uED}GZzFnEmiyU%2f5Y;qn0v_x@I$vbwUYgcE*{+QoQS z;EeQ~g5ok|T?1TvXJ=arG+k8-RV(tjx~>~_g!#n^UrWm^sZljF-f8RXXd|sw)THtZis+?SR|W*ic8REH2FBsx#Od^noaG9L~O0q-ul9gqGG+mX{RW zyuk?z76HynG9KrqWEWMb>Xp@Sbug}Qg2d6`q_*fuI6E~n_hvy+L0%3wAVQuV2^uO; zYK!wOr>3W;rC#P5cv5q(#`(~qFxg|cQJyT5O5$UqqaxTr%HNOj)#;?GH?y;nLurv% zI$y7du9bkI%ZT@*17ecxaR)mJUac(41C@3q##a;)oBRysrx5%Uf}cXb)P_tuW#<`>0{Kr-K`BXP`A~bkG}miuDI=CW*X|5{*S!@#p=fyThuFfZA-ZF zX=XC&o4q-veGW4bsb4u-@*HD>)KBg$f1VkO`po_wr(VEVAvNWY_Yz}?G;d|S%$Ot1 zB+)C30BK&UewCq+#^LU3j2Y5=)b~20M$dP>!D!5`Eo2zsn+y{Gp%g+71oiI}THw5C z5Wanr(M)Pu$Y{{=h0qX-Drg8g2;XP)Kx_6viK`G=T_}dJ5o#9weHNM`v_sQi|EJy0 zi#~tq=RqEl<&JRX zScvv{u3zf-44gVtK=)qUylkoCT&#)l7SKHxzWD^c&4yyW=JefDPM?ymPeVH+eaz`D zj~_n&Oq=oqRwu^>SNR(c-^Wm^vTm8IWEl4if%cxcioq( z4H>q$H(3%D>N|#RazC=|tF=zXnGjS@=lpFAvQW9 zG|(5eNvh7D*#GS}UpxP{sCFY`GF|0y#`WNiZCkf&GFfU8UE+D}wCmwLyLRsQZu^kM z#=w4z@{))9Ik!`;M-J}aw`aG@58Mb3_w(n@xScwA!u98)M}9hd=-`3jpw68=bNbg) zznnb&=R!IB;je3SEkvWZE=M$S)bbDCa~Lsd`C_4PvEv9^cytG~IP=4ip>~O}zu@!S zr6Z`yC6I!lXCvjD_xW&9>s`amF%u=&b@PkiLH2tkT4KhZI#PIe7){%BM3gWFYh>rC zGm0PY(HpkyKOZ8q#u|A5MVDP#$5DFsiA&<7@i62D3h3(nOHG#CfBd|6Si&T%N%RxY zb*`TnmpXRT_0&1qFC;qA7W7AiNI*CL{OPi#4!(Z=fx)4$KNy!Ne-v_Jd<68}OZ&(u z?EpF_ISR(@?z5Y;!?pvcBT1;pobL48w^BE1JAkf|g!@>~?Vg9$>c?zgHt?#ESB?7a z;K-}S`=N$S4hi?3UJP#t96Ws*6>4-X9I?8Bv5HrXFdgPqqhZ3#t44m+s9kyTt46NX z>8OVFk1$x9!8)i~t4p8r>?#@3pmoOG$!m_8}6{a;|zvF7MSMzfb3?%KV?Fb5%IK&XLG_dA6WIByh$&!Ey$3uuJ;FQh4_ zwGHZefwbiY1^G)Lh#?d~P(o1MJ0Mk?o_?KCuB1LIU&d96J~Hr z+Z`>ZzAr5?9EhOZBEO)p=s1bY7S|e=%_}Hl+3t5+Rb^0fU%E8X-;!&xAVm`H|1h09u;?I8J)v8xs>+H9OB87J zVg8foD+2)vleBt5k0)%@n?S8kOP0h&h6MO}!>f?pl>E{lyeWD;aE!}JfHs?RJtH+G zIVmv#Xzs!OUZ&{r3RCoYLe%ACsT%0jilON7_X|(x@f|EZzP(k)Zzuff;nuHeZqd=> zfnVO%0u*hqYT(2Vq{l02f!)p0VUazP& zqQ?Wp8yMm`di;>rkAz=|jh-K&#~bMNKu`yQJ9qs;;i`~+^8f|#b3Ox zA?sg63GtGke$q%qJzRjEU$3oR$B!Qp??8Qwmw{Q6jvue6r~{rk;nx#>{B5}Us){ns z_OGE(}>Ie&TX)X$pZQY)N!B}-9T ze_O|{CvC2VTD2tkA*&4#xHEy)I4d=`{5Ij%6I+1Vs&X*iAtd=BVL|X}mx;8&IVsl_ zswP6@hmi$_B|?%P8WidasPG4HUPf+FX(h1`(vsvk0MSx^pw$P;9>nS^8JSd8A@}(s z60+n$H0>27e*{x03JgPBd`yHmBq(rzAy80gM6~Qi_LT?`?HltH?k0SCX`)18kI`{gKd~LDKVv_7)JNh7#~qcy!<(QOP4CUtf*GxW@l%mM0tCK#wE|i zt!xHPEl?_n*;rRrO0Sx>qLQI8TJIeZOG5et!%j6 z)O@P~lwJF^gUj5FR zPv8D(ZD%A_VZ<y)t;VLFR4y~g9{x>hKS?RBg*SSPt?R@s$s_WH3X<2o?{ELB2_i6xlMzN(gJ zoSR(TZ5+Cm53m}dowYEniUYGOP;nehoq)2+Dgi_cz=-8ozi#8eOhUQDOs&0NtCbL~ z#sQdu@>^i2YQ9ZuzO-WoSLvy!nCLxLjd7gzaa69*sydD`PobJgC@n=kgy|{2cp5a9 z=NC_0w$1)1Lhy^&mc;XjN{Nm}i4gvVZ6Tf)sg!!MrrohN?h$)sZ{1;6ve?>zB4PeZ&3<9D9;ohN?hN$by$-+3Ca^TY2v=^PUB zJ5Q$Fck(+=CcT>8W9P|*k}*slSeuta@P_av*ruZ}VwV0;oxwbgy3L>X=hv>{yrxH(nMi47`P5qdF9AGQ%0CxFWT7zf|ecSVwJaQTQ(be`{*w>nJ&HL?snp*y{xkj)1|Co7#CmibU%Cg zoj(B*ELxE|M5Ib zjdW_M^-VL1Y3!%`aV@Duoz>YE7%SK@6d&59f^nGtVO&g9VfD3tjTLN0_Z7xN-GvfmCt zcGq+`Y$KRJGvYrh82&~4c}A@{KvCdbOH=-iIeLy!x9_#KK+iDhuH#d!&>Tixv-82R zXeQIw75EQo9D0(t?Q)zj0X@$2sk|MN09@3{z!j$u4|FuFVD$$Q-67`fpk-Uc|KNu0-bd6H+=8E73^Q0yOiqk z_64&tj+K{9U?6Fay)J#vLRP-Z%H^!wz{>Agd5o18SQ*U9L{?_9vXqsLtW@jd-tnxQ z&Psb$E@b7qtX$5@4Xpg0mB(0lftA6mOk`yyD@$3~$V#8!M8CnCrBY1 KCw+Q0iT@umaze%c literal 0 HcmV?d00001 diff --git a/installer/windows_on_arm/resources/banner.xcf b/installer/windows_on_arm/resources/banner.xcf new file mode 100644 index 0000000000000000000000000000000000000000..10a3f83b7995370fb529555c422f2a7a68807d85 GIT binary patch literal 6302 zcmeHLX;4#F6uyZ;3s%vwF4fwJS`}u*LEGtcI%7Md)BdP6jxBa7Q(F)rMuEtpA}-)k zYXw|DQIIu}ofy_EkcIGuK~z+twxB4RY+(rj!Xkv%bCVa1viPT+>5tr*bI-VF zW8Qq=e-3&U8$vsIaD99{eFNbcVJ8+e$LQhsxU)T-*#4Z|*ai+7atH`K?Cr@6;Cgd* zJK8yTu|2rnTz{s6Q91duceyj2*E$=^1YjNIa)hS4CTME*GbabQX;8p^cMpy)o4L;1 z7Z?vuWTb3P2Yfk!OpdR|9?t;Wp6lfm;2HSp1##=~CX?mOrg$7I3a!xeuprFBXohP5 zID_B;we{w*xoh|Pvau7V1E+-qS%&e~p-@BWK(O7|fWn~Aatr*C1-7%mOba~I0>5v8 zXIWr-z|bE}0@?;-2Ia%?S5g=h`UGPV3g{IU*m7!t*<9!%GXiZM0Q^l*=xUQT)@C2J zYs_|AL~fbSnuBau!@mTET}n>QWaJO!r6wmuobh*Iu)xirvqrWaj?R+JBSs}@m%OL3 zY!IDgILMPPAq+(^d+01WqOr#Oa+eWg{hL|guXPN7rsL%yRXQTeoSapqST~QJ9h{rr8PAbGLclZkZ4hg z1^mRYy>8g7x?QVjuC0`datkDK)lA~KQZCLHr1BCXL%rD^6h+;r8yN0ses;f9B;en$ z$uMN5^Xa@$+BXTYQRj{a`uXgAlRDU^?Pz-bxRNN&&*mp3#9fb$I)C=}lgE!7dXw7# zVKMh%d5I)PkdewyjElJvc_HjAZVtSqx=yDb9_a0Ee>5f6H4}56clQtJdpcUCj_bPh z3~--y_73)Sw>7G#i0kh11LrJpOI@qc4fJ+4*Hul*-5Vv_;~5!E5M>Vau-bDNKV7-C$o=Ys2`|zUH2H*&ck3D7*Kxy=Oqz@#5K}T))d= z;wU%qx)SDry0KT=)_{lMttpPoGI-I4+;)Od zb*H|iPF*U=FDzEt6ZHydfgpt!7j}@n+vKiLH|YlY+v}=SqU^MctQk3>s4Fugg~v;Z zjXE3b=ezec(VW)ix|+Ks(%kHn6#W zDK4z;3iWf->ejr2n`h)|jjOx$;nZ=F6yoC5-QV5bq@I#XN7XO|o*GwoOZ`+_cLsWT z=i$>FuTd*Y$IY(U!` zNQ3^1YDbbR521yVWUV7PR`nZHtVF0z>%q|(LUSX@QFt6ohl;lascipN4|VII?|+Z{i+S%MT<@LMXM;ip3+}Y t`a4ShMCo0W_BCmQLS~1O|GL<%CqpQKeg;66QvDqPJ)6QCK;t`O^bfz=1RnqZ literal 0 HcmV?d00001 diff --git a/installer/windows_on_arm/resources/icon.png b/installer/windows_on_arm/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f6505e913f21fb03263c68534e7c34e09405ade4 GIT binary patch literal 7106 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 B7Nr0H literal 0 HcmV?d00001 diff --git a/installer/windows_on_arm/strings.wxl b/installer/windows_on_arm/strings.wxl new file mode 100644 index 000000000..f5af817de --- /dev/null +++ b/installer/windows_on_arm/strings.wxl @@ -0,0 +1,14 @@ + + + This Setup Wizard will install [ProductName] on your computer. If you have a previous version already installed, this installation process will update it. + + + [ProductName] Setup + {\WixUI_Font_Title}Shortcuts + Select the shortcuts for the application. + [ProductName] uses the latest version of SQLite, so you can enjoy all of its new features and bug fixes, but it does not have encryption support. It is also built with SQLCipher as a separate application. SQLCipher is an open source extension to SQLite providing transparent 256-bit AES encryption of database files, but uses a slightly older version of SQLite. Both applications (with and without SQLCipher) are installed and can run concurrently. This page allows you to choose the shortcuts for each application and where to place them. + DB Browser (SQLite) + DB Browser (SQLCipher) + Desktop + Program Menu + diff --git a/installer/windows_on_arm/translations.wxs b/installer/windows_on_arm/translations.wxs new file mode 100644 index 000000000..0bba89860 --- /dev/null +++ b/installer/windows_on_arm/translations.wxs @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/installer/windows_on_arm/ui.wxs b/installer/windows_on_arm/ui.wxs new file mode 100644 index 000000000..7fee7011f --- /dev/null +++ b/installer/windows_on_arm/ui.wxs @@ -0,0 +1,34 @@ + + + + +

+ + + + + + + + + + + + + + + + + + 1 + + + 1 + + + 1 + + + + + diff --git a/installer/windows_on_arm/variables.wxi b/installer/windows_on_arm/variables.wxi new file mode 100644 index 000000000..7c65c684e --- /dev/null +++ b/installer/windows_on_arm/variables.wxi @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2b39cefd985ffff83e381b5b89cf3333c3130d20 Mon Sep 17 00:00:00 2001 From: xduugu Date: Sat, 4 Apr 2026 13:34:24 +0200 Subject: [PATCH 92/97] [skip ci] Rename metainfo file and add more urls (#4117) Reference: https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#spec-component-location --- config/install.cmake | 2 +- ...rowser.desktop.appdata.xml => sqlitebrowser.metainfo.xml} | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) rename distri/{sqlitebrowser.desktop.appdata.xml => sqlitebrowser.metainfo.xml} (87%) diff --git a/config/install.cmake b/config/install.cmake index 5c538cf92..c10c608f7 100644 --- a/config/install.cmake +++ b/config/install.cmake @@ -19,7 +19,7 @@ if(UNIX) DESTINATION ${CMAKE_INSTALL_DATADIR}/applications/ ) - install(FILES distri/${PROJECT_NAME}.desktop.appdata.xml + install(FILES distri/${PROJECT_NAME}.metainfo.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo/ ) endif() diff --git a/distri/sqlitebrowser.desktop.appdata.xml b/distri/sqlitebrowser.metainfo.xml similarity index 87% rename from distri/sqlitebrowser.desktop.appdata.xml rename to distri/sqlitebrowser.metainfo.xml index a231014e4..7fe37f63f 100644 --- a/distri/sqlitebrowser.desktop.appdata.xml +++ b/distri/sqlitebrowser.metainfo.xml @@ -46,6 +46,11 @@ https://sqlitebrowser.org/ https://github.com/sqlitebrowser/sqlitebrowser/issues + https://github.com/sqlitebrowser/sqlitebrowser/wiki/Frequently-Asked-Questions + https://github.com/sqlitebrowser/sqlitebrowser/wiki + https://www.patreon.com/db4s + https://github.com/sqlitebrowser/sqlitebrowser/wiki/Translations + https://github.com/sqlitebrowser/sqlitebrowser From bcf4364cd8354d0754b76c82b945478e2f5e5822 Mon Sep 17 00:00:00 2001 From: Dor Alagem Date: Mon, 6 Apr 2026 22:34:03 +0300 Subject: [PATCH 93/97] Fix SQLITE_MISUSE to surface SQLite error message Previously, SQLITE_MISUSE was silently ignored (empty break), so errors like invalid JSON path syntax ('$[-1]') were never shown to the user. Now the error message from sqlite3_errmsg() is surfaced the same way as any other execution error, matching the behaviour of the sqlite3 CLI. Fixes #4113 --- src/RunSql.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/RunSql.cpp b/src/RunSql.cpp index 537c5e202..b49507a37 100644 --- a/src/RunSql.cpp +++ b/src/RunSql.cpp @@ -247,6 +247,7 @@ bool RunSql::executeNextStatement() break; } case SQLITE_MISUSE: + error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); break; default: error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); From fa9c02a805335f31d200a87f37b9caa6c3ce79ed Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sun, 12 Apr 2026 18:08:09 +0900 Subject: [PATCH 94/97] Change to the upstream download link for OpenSSL for Windows on ARM --- .github/workflows/cppcmake-windows_on_arm.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cppcmake-windows_on_arm.yml b/.github/workflows/cppcmake-windows_on_arm.yml index 4e18aab53..60de25bc0 100644 --- a/.github/workflows/cppcmake-windows_on_arm.yml +++ b/.github/workflows/cppcmake-windows_on_arm.yml @@ -29,8 +29,8 @@ jobs: run: | choco install --no-progress ninja wixtoolset - Invoke-WebRequest -Uri "https://slproweb.com/download/WinUniversalOpenSSL-3_6_1.exe" -OutFile WinUniversalOpenSSL-3_6_1.exe - Start-Process -FilePath .\WinUniversalOpenSSL-3_6_1.exe -ArgumentList '/ALLUSERS /verysilent /dir="C:\dev\OpenSSL"' -Wait + Invoke-WebRequest -Uri "https://slproweb.com/download/WinUniversalOpenSSL-3_6_2.exe" -OutFile WinUniversalOpenSSL-3_6_2.exe + Start-Process -FilePath .\WinUniversalOpenSSL-3_6_2.exe -ArgumentList '/ALLUSERS /verysilent /dir="C:\dev\OpenSSL"' -Wait - name: Install Qt uses: jurplel/install-qt-action@v4 From 964a00fd17065a6008e812626b5e734a8f1557c4 Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sun, 12 Apr 2026 14:46:15 +0200 Subject: [PATCH 95/97] Remove warning in UI generation (duplicated label) --- src/PreferencesDialog.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PreferencesDialog.ui b/src/PreferencesDialog.ui index 873489f30..1fd1bffed 100644 --- a/src/PreferencesDialog.ui +++ b/src/PreferencesDialog.ui @@ -637,7 +637,7 @@ in new project file - + Open databases with foreign keys enabled. From 0a0b0f4276a957c8f97a6ab6760c72d1b23701dc Mon Sep 17 00:00:00 2001 From: mgrojo Date: Sun, 12 Apr 2026 19:13:35 +0200 Subject: [PATCH 96/97] Surface errors returned by SQLite while stepping the query * Errors while executing sqlite3_step in RowLoader were ignored. Now they are caught and surfaced to the main window. * Avoid any case in which we run into an SQLITE_MISUSE, as that means that we are using the interface incorrectly. > If SQLite ever returns SQLITE_MISUSE from any interface, that means > that the application is incorrectly coded and needs to be fixed. > Do not ship an application that sometimes returns SQLITE_MISUSE from a > standard SQLite interface because that application contains potentially > serious bugs. From https://sqlite.org/rescode.html#misuse * Add a check in a while statement in `MainWindow::executeQuery()` to avoid entering in a endless loop. See issue #4113. --- src/MainWindow.cpp | 9 ++++++-- src/RowLoader.cpp | 8 ++++++- src/RowLoader.h | 1 + src/RunSql.cpp | 50 +++++++++++++++++++++++++--------------- src/sqlitedb.cpp | 47 +++++++++++++++++++------------------ src/sqlitetablemodel.cpp | 10 ++++++++ src/sqlitetablemodel.h | 6 +++++ 7 files changed, 87 insertions(+), 44 deletions(-) diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 02335ca91..5feeba3c7 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1245,7 +1245,8 @@ void MainWindow::executeQuery() if (char_at_index == '\r' || char_at_index == '\n') { execute_from_line++; // The next lines could be empty, so skip all of them too. - while(editor->text(execute_from_line).trimmed().isEmpty()) + while(execute_from_line <= editor->lines() && + editor->text(execute_from_line).trimmed().isEmpty()) execute_from_line++; execute_from_index = 0; } @@ -1326,7 +1327,11 @@ void MainWindow::executeQuery() auto time_end = std::chrono::high_resolution_clock::now(); auto time_in_ms = std::chrono::duration_cast(time_end-time_start); - query_logger(true, tr("%1 rows returned in %2ms").arg(model->rowCount()).arg(time_in_ms.count()+time_in_ms_so_far), from_position, to_position); + if (model->hasError()) { + query_logger(false, model->lastError(), from_position, to_position); + } else { + query_logger(true, tr("%1 rows returned in %2ms").arg(model->rowCount()).arg(time_in_ms.count()+time_in_ms_so_far), from_position, to_position); + } execute_sql_worker->startNextStatement(); }); }, Qt::QueuedConnection); diff --git a/src/RowLoader.cpp b/src/RowLoader.cpp index 2fa5c7213..fde19b88f 100644 --- a/src/RowLoader.cpp +++ b/src/RowLoader.cpp @@ -235,7 +235,8 @@ void RowLoader::process (Task & t) auto row = t.row_begin; if(sqlite3_prepare_v2(pDb.get(), utf8Query, utf8Query.size(), &stmt, nullptr) == SQLITE_OK) { - while(!t.cancel && sqlite3_step(stmt) == SQLITE_ROW) + int step_result = SQLITE_OK; + while(!t.cancel && (step_result = sqlite3_step(stmt)) == SQLITE_ROW) { size_t num_columns = static_cast(sqlite3_data_count(stmt)); @@ -257,6 +258,11 @@ void RowLoader::process (Task & t) cache_data.set(row++, std::move(rowdata)); } + if (step_result != SQLITE_ROW && step_result != SQLITE_DONE && step_result != SQLITE_OK && !t.cancel) { + QString errorMsg = QString::fromUtf8(sqlite3_errmsg(pDb.get())); + emit error(t.token, errorMsg); + } + sqlite3_finalize(stmt); // Query the total row count if and only if: diff --git a/src/RowLoader.h b/src/RowLoader.h index b3224bcf1..cba38221a 100644 --- a/src/RowLoader.h +++ b/src/RowLoader.h @@ -65,6 +65,7 @@ class RowLoader : public QThread signals: void fetched(int token, size_t row_begin, size_t row_end); void rowCountComplete(int token, int num_rows); + void error(int token, const QString& errMsg); private: const std::function()> db_getter; diff --git a/src/RunSql.cpp b/src/RunSql.cpp index b49507a37..29c25f3a6 100644 --- a/src/RunSql.cpp +++ b/src/RunSql.cpp @@ -104,6 +104,22 @@ bool RunSql::executeNextStatement() auto time_end_prepare = std::chrono::high_resolution_clock::now(); auto time_for_prepare_in_ms = std::chrono::duration_cast(time_end_prepare - time_start); + // If there was no actual statement (e.g. empty line or comments), SQLite returns SQLITE_OK but vm is nullptr. + // We can safely skip execution of this block. + if (sql3status == SQLITE_OK && !vm) + { + lk.lock(); + releaseDbAccess(); + + execute_current_position = end_of_current_statement_position; + if(execute_current_position >= execute_to_position) + { + stopExecution(); + return false; + } + return true; + } + // Execute prepared statement QString error; if (sql3status == SQLITE_OK) @@ -167,23 +183,24 @@ bool RunSql::executeNextStatement() // Start measuring time from here again time_start = std::chrono::high_resolution_clock::now(); - // Check if this statement returned any data. We skip this check if this is an ALTER TABLE statement which, for some reason, are reported to return one column. - if(query_type != AlterStatement && sqlite3_column_count(vm)) - { - // It did. So it is definitely some SELECT statement or similar and we don't need to actually execute it here - sql3status = SQLITE_ROW; - } else { - // It did not. So it's probably some modifying SQL statement and we want to execute it here. If for some reason - // it turns out to return data after all, we just change the status - sql3status = sqlite3_step(vm); - - // SQLite returns SQLITE_DONE when a valid SELECT statement was executed but returned no results. To run into the branch that updates - // the status message and the table view anyway manipulate the status value here. This is also done for PRAGMA statements as they (sometimes) - // return rows just like SELECT statements, too. - if((query_type == SelectStatement || query_type == PragmaStatement) && sql3status == SQLITE_DONE) + if(sql3status == SQLITE_OK || sql3status == SQLITE_ROW) { + // Check if this statement returned any data. We skip this check if this is an ALTER TABLE statement which, for some reason, are reported to return one column. + if(query_type != AlterStatement && sqlite3_column_count(vm)) + { + // It did. So it is definitely some SELECT statement or similar and we don't need to actually execute it here sql3status = SQLITE_ROW; + } else { + // It did not. So it's probably some modifying SQL statement and we want to execute it here. If for some reason + // it turns out to return data after all, we just change the status + sql3status = sqlite3_step(vm); + + // SQLite returns SQLITE_DONE when a valid SELECT statement was executed but returned no results. To run into the branch that updates + // the status message and the table view anyway manipulate the status value here. This is also done for PRAGMA statements as they (sometimes) + // return rows just like SELECT statements, too. + if((query_type == SelectStatement || query_type == PragmaStatement) && sql3status == SQLITE_DONE) + sql3status = SQLITE_ROW; + } } - // Destroy statement sqlite3_finalize(vm); @@ -246,9 +263,6 @@ bool RunSql::executeNextStatement() lk.unlock(); break; } - case SQLITE_MISUSE: - error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); - break; default: error = QString::fromUtf8(sqlite3_errmsg(pDb.get())); } diff --git a/src/sqlitedb.cpp b/src/sqlitedb.cpp index 6ee8c14d8..5d8bcf1fb 100644 --- a/src/sqlitedb.cpp +++ b/src/sqlitedb.cpp @@ -1210,30 +1210,31 @@ bool DBBrowserDB::executeMultiSQL(QByteArray query, bool dirty, bool log) // Execute next statement if(sqlite3_prepare_v2(_db, tail, static_cast(tail_end - tail + 1), &vm, &tail) == SQLITE_OK) { - switch(sqlite3_step(vm)) + if(vm) { - case SQLITE_OK: - case SQLITE_ROW: - case SQLITE_DONE: - case SQLITE_MISUSE: // This is a workaround around problematic user scripts. If they lead to empty commands, - // SQLite will return a misuse error which we hereby ignore. - sqlite3_finalize(vm); - break; - default: - // In case of *any* error abort the execution and roll back the transaction - - // Make sure to save the error message first before any other function can mess around with it - lastErrorMessage = tr("Error in statement #%1: %2.\nAborting execution%3.").arg( - QString::number(line), - sqlite3_errmsg(_db), - dirty ? tr(" and rolling back") : ""); - qWarning() << lastErrorMessage; - - // Clean up - sqlite3_finalize(vm); - if(dirty) - revertToSavepoint(savepoint_name); - return false; + switch(sqlite3_step(vm)) + { + case SQLITE_OK: + case SQLITE_ROW: + case SQLITE_DONE: + sqlite3_finalize(vm); + break; + default: + // In case of *any* error abort the execution and roll back the transaction + + // Make sure to save the error message first before any other function can mess around with it + lastErrorMessage = tr("Error in statement #%1: %2.\nAborting execution%3.").arg( + QString::number(line), + sqlite3_errmsg(_db), + dirty ? tr(" and rolling back") : ""); + qWarning() << lastErrorMessage; + + // Clean up + sqlite3_finalize(vm); + if(dirty) + revertToSavepoint(savepoint_name); + return false; + } } } else { lastErrorMessage = tr("Error in statement #%1: %2.\nAborting execution%3.").arg( diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index 1e01b2ca0..fe1b690cf 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -41,6 +41,7 @@ SqliteTableModel::SqliteTableModel(DBBrowserDB& db, QObject* parent, const QStri // any UI updates must be performed in the UI thread, not in the worker thread: connect(worker, &RowLoader::fetched, this, &SqliteTableModel::handleFinishedFetch, Qt::QueuedConnection); connect(worker, &RowLoader::rowCountComplete, this, &SqliteTableModel::handleRowCountComplete, Qt::QueuedConnection); + connect(worker, &RowLoader::error, this, &SqliteTableModel::handleError, Qt::QueuedConnection); reset(); } @@ -106,11 +107,20 @@ void SqliteTableModel::handleRowCountComplete (int life_id, int num_rows) emit finishedRowCount(); } +void SqliteTableModel::handleError(int life_id, const QString& errMsg) +{ + if (life_id < m_lifeCounter) + return; + + m_lastError = errMsg; +} + void SqliteTableModel::reset() { beginResetModel(); clearCache(); + m_lastError.clear(); m_sQuery.clear(); m_query.clear(); m_table_of_query.reset(); diff --git a/src/sqlitetablemodel.h b/src/sqlitetablemodel.h index b24ca058d..6a0bf6103 100644 --- a/src/sqlitetablemodel.h +++ b/src/sqlitetablemodel.h @@ -143,6 +143,9 @@ class SqliteTableModel : public QAbstractTableModel void reloadSettings(); + bool hasError() const { return !m_lastError.isEmpty(); } + QString lastError() const { return m_lastError; } + public slots: void updateFilter(const std::string& column, const QString& value); void updateGlobalFilter(const std::vector& values); @@ -165,6 +168,7 @@ public slots: void handleFinishedFetch(int life_id, unsigned int fetched_row_begin, unsigned int fetched_row_end); void handleRowCountComplete(int life_id, int num_rows); + void handleError(int life_id, const QString& errMsg); void updateAndRunQuery(); @@ -253,6 +257,8 @@ public slots: * to that row count. */ size_t m_chunkSize; + + QString m_lastError; }; #endif From dcd9b3c8d14d3950cad18c7526c1b0bb042b5c90 Mon Sep 17 00:00:00 2001 From: SeongTae Jeong Date: Sat, 25 Apr 2026 18:32:21 +0900 Subject: [PATCH 97/97] Consolidate CI release artifact publishing Add a reusable release workflow for publishing build artifacts from the top-level and per-platform CMake workflows. Standardize artifact upload, release tag selection, dependency summaries, and stale-release checks across macOS, Ubuntu, Windows, and Windows on ARM builds. Move shared build helper files under tools, add Windows scripts for fetching and verifying current SQLite/OpenSSL downloads, and let Dependabot track the new Python helper requirements. Update CTest registrations to run the generated test executables directly. --- .github/dependabot.yml | 5 + .github/workflows/cppcmake-macos.yml | 72 ++- .github/workflows/cppcmake-ubuntu.yml | 74 ++- .github/workflows/cppcmake-windows.yml | 136 +++-- .github/workflows/cppcmake-windows_on_arm.yml | 497 ++++++++++-------- .github/workflows/cppcmake.yml | 100 ++-- .github/workflows/release.yml | 118 +++++ .github/workflows/winget.yml | 5 +- .../get_nightlies_from_github_actions.sh | 71 --- installer/other/move_nightlies_into_dirs.sh | 24 - src/tests/CMakeLists.txt | 8 +- .../linux/sqlcipher_rename.sh | 0 .../windows}/add_sqlean_arm64_target.patch | 0 tools/windows/download_latest_openssl3.py | 83 +++ tools/windows/download_latest_sqlite.py | 80 +++ .../requirements/download_latest_openssl3.txt | 2 + 16 files changed, 858 insertions(+), 417 deletions(-) create mode 100644 .github/workflows/release.yml delete mode 100644 installer/other/get_nightlies_from_github_actions.sh delete mode 100644 installer/other/move_nightlies_into_dirs.sh rename {installer => tools}/linux/sqlcipher_rename.sh (100%) rename {installer/windows_on_arm => tools/windows}/add_sqlean_arm64_target.patch (100%) create mode 100644 tools/windows/download_latest_openssl3.py create mode 100644 tools/windows/download_latest_sqlite.py create mode 100644 tools/windows/requirements/download_latest_openssl3.txt diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5ace4600a..b7f03146c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,3 +4,8 @@ updates: directory: "/" schedule: interval: "weekly" + + - package-ecosystem: "pip" + directory: "/tools/windows/requirements" + schedule: + interval: "weekly" diff --git a/.github/workflows/cppcmake-macos.yml b/.github/workflows/cppcmake-macos.yml index 5ad2bc02c..0f0f01fab 100644 --- a/.github/workflows/cppcmake-macos.yml +++ b/.github/workflows/cppcmake-macos.yml @@ -6,12 +6,17 @@ on: NIGHTLY: default: false type: boolean + CONSOLIDATE_DEPENDENCY_SUMMARY: + default: false + type: boolean workflow_dispatch: jobs: build: name: ${{ matrix.os }} (${{ matrix.bundle }}) runs-on: ${{ matrix.os }} + permissions: + contents: read strategy: fail-fast: false matrix: @@ -89,12 +94,12 @@ jobs: SQLCIPHER: ${{ matrix.bundle == 'SQLCipher'}} TEAM_ID: ${{ secrets.MACOS_CODESIGN_TEAM_ID }} - - if: steps.notarization.conclusion != 'skipped' + - if: always() && steps.notarization.conclusion != 'skipped' name: Clear Keychain run: security delete-keychain $RUNNER_TEMP/app-signing.keychain-db continue-on-error: true - - if: github.event_name != 'pull_request' && github.workflow != 'Build (macOS)' + - if: github.event_name != 'pull_request' name: Upload artifacts uses: actions/upload-artifact@v7 with: @@ -102,14 +107,6 @@ jobs: path: DB.Browser.for.*.dmg retention-days: 1 - - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (macOS)' - name: Release - uses: softprops/action-gh-release@v2 - with: - files: DB.Browser.for.*.dmg - prerelease: true - tag_name: ${{ github.sha }}-macos - - name: Summary run: | QT_VERSION=$($(brew --prefix sqlb-qt@5)/bin/qmake --version | awk '/Using Qt version/ {print $4}') @@ -123,5 +120,56 @@ jobs: SQLITE_VERSION=$($(brew --prefix sqlb-sqlite)/bin/sqlite3 --version | awk '{print $1}') fi - echo "## Libaries used" >> $GITHUB_STEP_SUMMARY - echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $GITHUB_STEP_SUMMARY \ No newline at end of file + mkdir -p dependency-summary + SUMMARY_ROW="| Build (macOS) | ${{ matrix.os }} / ${{ matrix.bundle }} | $OPENSSL_VERSION | $QT_VERSION | $SQLCIPHER_VERSION | $SQLITE_VERSION |" + echo "$SUMMARY_ROW" > "dependency-summary/dependencies-macos-${{ matrix.os }}-${{ matrix.bundle }}.md" + + - name: Upload dependency summary + uses: actions/upload-artifact@v7 + with: + name: dependency-summary-macos-${{ matrix.os }}-${{ matrix.bundle }} + path: dependency-summary/*.md + retention-days: 1 + + summarize-dependencies: + if: always() && inputs.CONSOLIDATE_DEPENDENCY_SUMMARY != true && !cancelled() + needs: build + name: Summarize Dependencies + runs-on: ubuntu-24.04 + permissions: + actions: read + contents: read + steps: + - name: Download dependency summaries + uses: actions/download-artifact@v8 + continue-on-error: true + with: + pattern: dependency-summary-* + path: dependency-summary + merge-multiple: true + + - name: Summary + run: | + { + echo "## Dependencies used" + echo "" + echo "| Workflow | Target | OpenSSL | Qt | SQLCipher | SQLite |" + echo "| :---: | :---: | :---: | :---: | :---: | :---: |" + } >> "$GITHUB_STEP_SUMMARY" + + if [ -d dependency-summary ] && find dependency-summary -type f -name '*.md' | grep -q .; then + find dependency-summary -type f -name '*.md' -print | sort | while IFS= read -r file; do + cat "$file" >> "$GITHUB_STEP_SUMMARY" + done + else + echo "| Not available | No dependency summaries were uploaded. | - | - | - | - |" >> "$GITHUB_STEP_SUMMARY" + fi + + release: + if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (macOS)' + needs: build + name: Release + permissions: + actions: read + contents: write + uses: ./.github/workflows/release.yml diff --git a/.github/workflows/cppcmake-ubuntu.yml b/.github/workflows/cppcmake-ubuntu.yml index d2df24e26..0cb144251 100644 --- a/.github/workflows/cppcmake-ubuntu.yml +++ b/.github/workflows/cppcmake-ubuntu.yml @@ -10,12 +10,17 @@ on: NIGHTLY: default: false type: boolean + CONSOLIDATE_DEPENDENCY_SUMMARY: + default: false + type: boolean workflow_dispatch: jobs: build: name: ${{ matrix.os }} (${{ matrix.bundle }}) runs-on: ${{ matrix.os }} + permissions: + contents: read strategy: fail-fast: false matrix: @@ -38,7 +43,7 @@ jobs: git clone https://github.com/sqlcipher/sqlcipher && cd sqlcipher && git checkout $(git describe --tags --abbrev=0) LDFLAGS="-lcrypto -Wl,-soname,libsqlcipher.so.0" ./configure --prefix=./prefix --with-tempstore=yes --enable-load-extension --disable-tcl CFLAGS="-DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_SNAPSHOT=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_HAS_CODEC -DSQLITE_SOUNDEX" make -j2 && sudo make install -j2 - cp ${GITHUB_WORKSPACE}/installer/linux/sqlcipher_rename.sh . + cp ${GITHUB_WORKSPACE}/tools/linux/sqlcipher_rename.sh . chmod +x sqlcipher_rename.sh && sudo ./sqlcipher_rename.sh - if: matrix.bundle == 'SQLite' @@ -86,7 +91,7 @@ jobs: else export VERSION=$(printf "dev-`git -C . rev-parse --short HEAD`") fi - LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib;$RUNNER_TEMP/sqlcipher/prefix/lib" "./linuxdeploy-$(uname -m).AppImage" --appdir=appdir --desktop-file=appdir/usr/share/applications/sqlitebrowser.desktop --plugin qt --output appimage + LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib:$RUNNER_TEMP/sqlcipher/prefix/lib" "./linuxdeploy-$(uname -m).AppImage" --appdir=appdir --desktop-file=appdir/usr/share/applications/sqlitebrowser.desktop --plugin qt --output appimage - name: Rename a file run: | @@ -97,7 +102,7 @@ jobs: mv -v DB.Browser.for.SQLite*.AppImage $FILE fi - - if: github.event_name != 'pull_request' && github.workflow != 'Build (Ubuntu)' + - if: github.event_name != 'pull_request' name: Upload artifacts uses: actions/upload-artifact@v7 with: @@ -105,14 +110,6 @@ jobs: path: DB.Browser.for.*.AppImage retention-days: 1 - - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Ubuntu)' - name: Release - uses: softprops/action-gh-release@v2 - with: - files: DB.Browser.for.*.AppImage - prerelease: true - tag_name: ${{ github.sha }}-ubuntu - - name: Summary run: | QT_VERSION=$(qmake --version | awk '/Using Qt version/ {print $4}') @@ -126,5 +123,56 @@ jobs: SQLITE_VERSION=$(/usr/local/bin/sqlite3 --version | awk '{print $1}') fi - echo "## Libaries used" >> $GITHUB_STEP_SUMMARY - echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $GITHUB_STEP_SUMMARY + mkdir -p dependency-summary + SUMMARY_ROW="| Build (Ubuntu) | ${{ matrix.os }} / ${{ matrix.bundle }} | $OPENSSL_VERSION | $QT_VERSION | $SQLCIPHER_VERSION | $SQLITE_VERSION |" + echo "$SUMMARY_ROW" > "dependency-summary/dependencies-ubuntu-${{ matrix.os }}-${{ matrix.bundle }}.md" + + - name: Upload dependency summary + uses: actions/upload-artifact@v7 + with: + name: dependency-summary-ubuntu-${{ matrix.os }}-${{ matrix.bundle }} + path: dependency-summary/*.md + retention-days: 1 + + summarize-dependencies: + if: always() && inputs.CONSOLIDATE_DEPENDENCY_SUMMARY != true && !cancelled() + needs: build + name: Summarize Dependencies + runs-on: ubuntu-24.04 + permissions: + actions: read + contents: read + steps: + - name: Download dependency summaries + uses: actions/download-artifact@v8 + continue-on-error: true + with: + pattern: dependency-summary-* + path: dependency-summary + merge-multiple: true + + - name: Summary + run: | + { + echo "## Dependencies used" + echo "" + echo "| Workflow | Target | OpenSSL | Qt | SQLCipher | SQLite |" + echo "| :---: | :---: | :---: | :---: | :---: | :---: |" + } >> "$GITHUB_STEP_SUMMARY" + + if [ -d dependency-summary ] && find dependency-summary -type f -name '*.md' | grep -q .; then + find dependency-summary -type f -name '*.md' -print | sort | while IFS= read -r file; do + cat "$file" >> "$GITHUB_STEP_SUMMARY" + done + else + echo "| Not available | No dependency summaries were uploaded. | - | - | - | - |" >> "$GITHUB_STEP_SUMMARY" + fi + + release: + if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Ubuntu)' + needs: build + name: Release + permissions: + actions: read + contents: write + uses: ./.github/workflows/release.yml diff --git a/.github/workflows/cppcmake-windows.yml b/.github/workflows/cppcmake-windows.yml index 9cd2b70ae..f2530fbea 100644 --- a/.github/workflows/cppcmake-windows.yml +++ b/.github/workflows/cppcmake-windows.yml @@ -6,12 +6,18 @@ on: NIGHTLY: default: false type: boolean + CONSOLIDATE_DEPENDENCY_SUMMARY: + default: false + type: boolean workflow_dispatch: jobs: build: name: ${{ matrix.os }}-${{ matrix.arch }} runs-on: ${{ matrix.os }} + permissions: + actions: read + contents: read strategy: fail-fast: false matrix: @@ -20,7 +26,6 @@ jobs: env: GH_TOKEN: ${{ github.token }} OPENSSL_VERSION: 1.1.1.2100 - QT_VERSION: 5.15.2 steps: - name: Checkout uses: actions/checkout@v6 @@ -50,7 +55,7 @@ jobs: arch: ${{ matrix.arch == 'x86' && 'win32_msvc2019' || matrix.arch == 'x64' && 'win64_msvc2019_64'}} cache: true cache-key-prefix: "cache" - version: ${{ env.QT_VERSION }} + version: 5.15.2 - name: Install VS2019 run: choco install visualstudio2019community --package-parameters "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.Windows10SDK.19041 --add Microsoft.VisualStudio.Component.VC.Redist.MSM" @@ -63,13 +68,9 @@ jobs: - name: Build SQLite run: | - $htmlContent = Invoke-WebRequest -Uri "https://sqlite.org/download.html" | Select-Object -ExpandProperty Content - $regex = [regex]::new('PRODUCT,(\d+\.\d+\.\d+),(\d+/sqlite-amalgamation-\d+\.zip),\d+,(.+)') - $match = $regex.Match($htmlContent) - $relativeUrl = $match.Groups[2].Value - $downloadLink = "https://sqlite.org/$relativeUrl" - Invoke-WebRequest -Uri $downloadLink -OutFile 'sqlite.zip' - Expand-Archive -Path sqlite.zip -DestinationPath C:\dev\ + Set-Location "${{ github.workspace }}\tools\windows" + $SQLiteArchiveFileName = (python download_latest_sqlite.py).Trim() + Expand-Archive -Path $SQLiteArchiveFileName -DestinationPath C:\dev\ Move-Item -Path C:\dev\sqlite-amalgamation-* C:\dev\SQLite\ cd C:\dev\SQLite cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_MAX_ATTACHED=125 -DSQLITE_API="__declspec(dllexport)" -link -dll -out:sqlite3.dll @@ -106,23 +107,33 @@ jobs: - name: Configure build (SQLite) run: | mkdir release-sqlite && cd release-sqlite - cmake -G "Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:\dev\SQLite" ..\ + cmake -G "Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:\dev\SQLite" -DENABLE_TESTING=ON ..\ - name: Build (SQLite) run: | cd release-sqlite cmake --build . --config Release + - name: Tests (SQLite) + run: | + cd release-sqlite + ctest -C Release --output-on-failure + - name: Configure build (SQLCipher) run: | mkdir release-sqlcipher && cd release-sqlcipher - cmake -G "Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:\dev\OpenSSL;C:\dev\SQLCipher" ..\ + cmake -G "Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:\dev\OpenSSL;C:\dev\SQLCipher" -DENABLE_TESTING=ON ..\ - name: Build (SQLCipher) run: | cd release-sqlcipher cmake --build . --config Release + - name: Tests (SQLCipher) + run: | + cd release-sqlcipher + ctest -C Release --output-on-failure + - if: github.event_name != 'pull_request' name: Create MSI env: @@ -133,12 +144,12 @@ jobs: SQLitePath: C:\dev\SQLite run: | cd installer/windows - ./build.cmd "${{ matrix.arch }}".ToLower() + ./build.cmd ${{ matrix.arch }} $DATE=$(Get-Date -Format "yyyyMMdd") if ("${{ inputs.NIGHTLY }}" -eq "true") { - mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-$DATE-${{ matrix.arch }}.msi" + mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-$DATE-win-${{ matrix.arch }}.msi" } else { - mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-${{ matrix.arch }}.msi" + mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-win-${{ matrix.arch }}.msi" } - if: github.event_name != 'pull_request' @@ -146,20 +157,21 @@ jobs: id: unsigned-artifacts uses: actions/upload-artifact@v7 with: - name: build-artifacts-${{ matrix.os }}-${{ matrix.arch }}-unsigned + name: build-artifacts-${{ matrix.os }}-win-${{ matrix.arch }}-unsigned path: installer\windows\DB.Browser.for.SQLite-*.msi + retention-days: 1 # Change the signing-policy-slug when you release an RC, RTM or stable release. - if: github.event_name != 'pull_request' name: Code signing with SignPath uses: signpath/github-action-submit-signing-request@v2 with: - api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' - github-artifact-id: '${{ steps.unsigned-artifacts.outputs.artifact-id }}' - organization-id: '${{ secrets.SIGNPATH_ORGANIZATION_ID }}' + api-token: "${{ secrets.SIGNPATH_API_TOKEN }}" + github-artifact-id: "${{ steps.unsigned-artifacts.outputs.artifact-id }}" + organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}" output-artifact-directory: .\installer\windows - project-slug: 'sqlitebrowser' - signing-policy-slug: 'test-signing' + project-slug: "sqlitebrowser" + signing-policy-slug: "test-signing" wait-for-completion: true - if: github.event_name != 'pull_request' @@ -167,9 +179,9 @@ jobs: run: | $DATE=$(Get-Date -Format "yyyyMMdd") if ("${{ inputs.NIGHTLY }}" -eq "true") { - $FILENAME_FORMAT="DB.Browser.for.SQLite-$DATE-${{ matrix.arch }}.zip" + $FILENAME_FORMAT="DB.Browser.for.SQLite-$DATE-win-${{ matrix.arch }}.zip" } else { - $FILENAME_FORMAT="DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-${{ matrix.arch }}.zip" + $FILENAME_FORMAT="DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-win-${{ matrix.arch }}.zip" } Start-Process msiexec.exe -ArgumentList "/a $(dir installer\windows\DB.Browser.for.SQLite-*.msi) /q TARGETDIR=$PWD\target\" -Wait if ("${{ matrix.arch }}" -eq "x86") { @@ -179,28 +191,15 @@ jobs: } Compress-Archive -Path "target\DB Browser for SQLite\*" -DestinationPath $FILENAME_FORMAT - - if: github.event_name != 'pull_request' && github.workflow != 'Build (Windows)' - name: Prepare artifacts - run: | - mkdir build-artifacts - move installer\windows\DB.Browser.for.SQLite-*.msi build-artifacts\ - move DB.Browser.for.SQLite-*.zip build-artifacts\ - Compress-Archive -Path build-artifacts\* -DestinationPath build-artifacts-${{ matrix.arch }}.zip - - - if: github.event_name != 'pull_request' && github.workflow != 'Build (Windows)' + - if: github.event_name != 'pull_request' name: Upload artifacts uses: actions/upload-artifact@v7 with: - name: build-artifacts-${{ matrix.os }}-${{ matrix.arch }} - path: build-artifacts-${{ matrix.arch }}.zip - - - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Windows)' - name: Release - uses: softprops/action-gh-release@v2 - with: - files: installer/windows/DB.Browser.for.SQLite-*.msi, DB.Browser.for.SQLite-*.zip - prerelease: true - tag_name: ${{ github.sha }}-windows + name: build-artifacts-win-${{ matrix.arch }} + path: | + installer\windows\DB.Browser.for.SQLite-*.msi + DB.Browser.for.SQLite-*.zip + retention-days: 1 - name: Summary run: | @@ -212,5 +211,56 @@ jobs: $SQLITE_VERSION=$matches[1] } - echo "## Libaries used" >> $env:GITHUB_STEP_SUMMARY - echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $env:GITHUB_STEP_SUMMARY + New-Item -ItemType Directory -Force -Path dependency-summary | Out-Null + $SUMMARY_ROW = "| Build (Windows) | ${{ matrix.os }} / ${{ matrix.arch }} | $OPENSSL_VERSION | $QT_VERSION | $SQLCIPHER_VERSION | $SQLITE_VERSION |" + Set-Content -Path "dependency-summary/dependencies-windows-${{ matrix.os }}-${{ matrix.arch }}.md" -Value $SUMMARY_ROW + + - name: Upload dependency summary + uses: actions/upload-artifact@v7 + with: + name: dependency-summary-windows-${{ matrix.os }}-${{ matrix.arch }} + path: dependency-summary/*.md + retention-days: 1 + + summarize-dependencies: + if: always() && inputs.CONSOLIDATE_DEPENDENCY_SUMMARY != true && !cancelled() + needs: build + name: Summarize Dependencies + runs-on: ubuntu-24.04 + permissions: + actions: read + contents: read + steps: + - name: Download dependency summaries + uses: actions/download-artifact@v8 + continue-on-error: true + with: + pattern: dependency-summary-* + path: dependency-summary + merge-multiple: true + + - name: Summary + run: | + { + echo "## Dependencies used" + echo "" + echo "| Workflow | Target | OpenSSL | Qt | SQLCipher | SQLite |" + echo "| :---: | :---: | :---: | :---: | :---: | :---: |" + } >> "$GITHUB_STEP_SUMMARY" + + if [ -d dependency-summary ] && find dependency-summary -type f -name '*.md' | grep -q .; then + find dependency-summary -type f -name '*.md' -print | sort | while IFS= read -r file; do + cat "$file" >> "$GITHUB_STEP_SUMMARY" + done + else + echo "| Not available | No dependency summaries were uploaded. | - | - | - | - |" >> "$GITHUB_STEP_SUMMARY" + fi + + release: + if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Windows)' + needs: build + name: Release + permissions: + actions: read + contents: write + uses: ./.github/workflows/release.yml diff --git a/.github/workflows/cppcmake-windows_on_arm.yml b/.github/workflows/cppcmake-windows_on_arm.yml index 60de25bc0..c7052bb9a 100644 --- a/.github/workflows/cppcmake-windows_on_arm.yml +++ b/.github/workflows/cppcmake-windows_on_arm.yml @@ -1,225 +1,284 @@ -# NOTES: This CI workflow is scheduled to be integrated with the existing Windows CI workflow in the future. - name: Build (Windows on ARM) on: - workflow_call: - inputs: - NIGHTLY: - default: false - type: boolean - workflow_dispatch: + workflow_call: + inputs: + NIGHTLY: + default: false + type: boolean + CONSOLIDATE_DEPENDENCY_SUMMARY: + default: false + type: boolean + workflow_dispatch: jobs: - build: - name: ${{ matrix.os }}-arm64 - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [windows-11-arm] + build: + name: ${{ matrix.os }}-arm64 + runs-on: ${{ matrix.os }} + permissions: + actions: read + contents: read + strategy: + fail-fast: false + matrix: + os: [windows-11-arm] + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.14.4" + cache: "pip" + cache-dependency-path: tools/windows/requirements/download_latest_openssl3.txt + + - name: Install dependencies + run: | + choco install --no-progress ninja wixtoolset + + cd $env:GITHUB_WORKSPACE/tools/windows/ + python -m pip install --disable-pip-version-check -r requirements/download_latest_openssl3.txt + $OpenSSLInstallerFileName = (python download_latest_openssl3.py).Trim() + Start-Process -FilePath ".\$OpenSSLInstallerFileName" -ArgumentList '/ALLUSERS /verysilent /dir="C:\dev\OpenSSL"' -Wait + + - name: Install Qt + uses: jurplel/install-qt-action@v4 + with: + arch: "win64_msvc2022_arm64" + cache: true + cache-key-prefix: "cache" + modules: "debug_info qt5compat qtactiveqt qtcharts qtconnectivity qtgraphs qtgrpc qthttpserver qtimageformats qtlanguageserver qtlocation qtlottie qtmultimedia qtnetworkauth qtpositioning qtquick3d qtquick3dphysics qtquicktimeline qtremoteobjects qtscxml qtsensors qtserialbus qtserialport qtshadertools qtspeech qtvirtualkeyboard qtwebchannel qtwebsockets" + version: 6.8.3 + + - name: Setup MSVC for ARM64 + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: arm64 + vsversion: 2022 + + - name: Build SQLite + run: | + cd $env:GITHUB_WORKSPACE/tools/windows/ + $SQLiteArchiveFileName = (python download_latest_sqlite.py).Trim() + Expand-Archive -Path $SQLiteArchiveFileName -DestinationPath C:\dev\ + Move-Item -Path C:\dev\sqlite-amalgamation-* C:\dev\SQLite\ + cd C:\dev\SQLite + cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_MAX_ATTACHED=125 -DSQLITE_API="__declspec(dllexport)" -link -dll -out:sqlite3.dll + + # MSYS2 is required to build the SQLean extension. + - name: Setup MSYS2 + uses: msys2/setup-msys2@v2 + with: + msystem: CLANGARM64 + update: true + install: >- + curl + git + make + mingw-w64-clang-aarch64-clang + unzip + + - name: Build SQLean extension + shell: msys2 {0} + run: | + git clone https://www.github.com/nalgeon/sqlean /c/dev/sqlean + cd /c/dev/sqlean + cp /c/a/sqlitebrowser/sqlitebrowser/tools/windows/add_sqlean_arm64_target.patch . + git apply --ignore-space-change --ignore-whitespace add_sqlean_arm64_target.patch + make prepare-dist + make download-sqlite + make download-external + make compile-windows-arm64 + + - name: Build Extension + run: | + cp $env:GITHUB_WORKSPACE/src/extensions/extension-formats.c C:\dev\SQLite\ + cp $env:GITHUB_WORKSPACE/src/extensions/extension-formats.def C:\dev\SQLite\ + cd C:\dev\SQLite + cl /MD extension-formats.c -link -dll -def:extension-formats.def -out:formats.dll + + - name: Setup MSVC to x64 to build required SQLCipher binaries + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: x64 + vsversion: 2022 + + - name: Build x64 binaries for build SQLCipher + run: | + git clone https://www.github.com/sqlcipher/sqlcipher C:\dev\SQLCipher --branch v4.6.1 + cd C:\dev\SQLCipher + nmake /f Makefile.msc lemon.exe mkkeywordhash.exe mksourceid.exe src-verify.exe USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\VC\x64\MD\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include\x64" + + - name: Re-setup MSVC for ARM64 + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: arm64 + vsversion: 2022 + + - name: Build SQLCipher + run: | + cd C:\dev\SQLCipher + nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\VC\arm64\MD\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include\arm64" + mkdir sqlcipher + copy sqlite3.h sqlcipher + # Avoid the C2059 error. + mv VERSION VERSION.txt + + - name: Configure build (SQLite) + run: | + mkdir release-sqlite && cd release-sqlite + cmake -G "Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:\dev\SQLite" -DENABLE_TESTING=ON -DQT_MAJOR=Qt6 ..\ + + - name: Build (SQLite) + run: | + cd release-sqlite + cmake --build . --config Release + + - name: Tests (SQLite) + run: | + cd release-sqlite + ctest -C Release --output-on-failure + + - name: Configure build (SQLCipher) + run: | + mkdir release-sqlcipher && cd release-sqlcipher + cmake -G "Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:\dev\OpenSSL;C:\dev\SQLCipher" -DENABLE_TESTING=ON -DQT_MAJOR=Qt6 ..\ + + - name: Build (SQLCipher) + run: | + cd release-sqlcipher + cmake --build . --config Release + + - name: Tests (SQLCipher) + run: | + cd release-sqlcipher + ctest -C Release --output-on-failure + + - if: github.event_name != 'pull_request' + name: Create MSI env: - GH_TOKEN: ${{ github.token }} - QT_VERSION: 6.8.3 - steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Install dependencies - run: | - choco install --no-progress ninja wixtoolset - - Invoke-WebRequest -Uri "https://slproweb.com/download/WinUniversalOpenSSL-3_6_2.exe" -OutFile WinUniversalOpenSSL-3_6_2.exe - Start-Process -FilePath .\WinUniversalOpenSSL-3_6_2.exe -ArgumentList '/ALLUSERS /verysilent /dir="C:\dev\OpenSSL"' -Wait - - - name: Install Qt - uses: jurplel/install-qt-action@v4 - with: - arch: 'win64_msvc2022_arm64' - cache: true - cache-key-prefix: 'cache' - modules: 'debug_info qt5compat qtactiveqt qtcharts qtconnectivity qtgraphs qtgrpc qthttpserver qtimageformats qtlanguageserver qtlocation qtlottie qtmultimedia qtnetworkauth qtpositioning qtquick3d qtquick3dphysics qtquicktimeline qtremoteobjects qtscxml qtsensors qtserialbus qtserialport qtshadertools qtspeech qtvirtualkeyboard qtwebchannel qtwebsockets' - version: ${{ env.QT_VERSION }} - - - name: Setup MSVC - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: arm64 - vsversion: 2022 - - - name: Setup MSYS2 - uses: msys2/setup-msys2@v2 - with: - msystem: CLANGARM64 - update: true - install: >- - curl - git - make - mingw-w64-clang-aarch64-clang - unzip - - - name: Build SQLite - run: | - $htmlContent = Invoke-WebRequest -Uri "https://sqlite.org/download.html" | Select-Object -ExpandProperty Content - $regex = [regex]::new('PRODUCT,(\d+\.\d+\.\d+),(\d+/sqlite-amalgamation-\d+\.zip),\d+,(.+)') - $match = $regex.Match($htmlContent) - $relativeUrl = $match.Groups[2].Value - $downloadLink = "https://sqlite.org/$relativeUrl" - Invoke-WebRequest -Uri $downloadLink -OutFile 'sqlite.zip' - Expand-Archive -Path sqlite.zip -DestinationPath C:\dev\ - Move-Item -Path C:\dev\sqlite-amalgamation-* C:\dev\SQLite\ - cd C:\dev\SQLite - cl sqlite3.c -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_GEOPOLY -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MATH_FUNCTIONS -DSQLITE_MAX_ATTACHED=125 -DSQLITE_API="__declspec(dllexport)" -link -dll -out:sqlite3.dll - - - name: Build SQLean extension - shell: msys2 {0} - run: | - git clone https://www.github.com/nalgeon/sqlean /c/dev/sqlean - cd /c/dev/sqlean - cp /c/a/sqlitebrowser/sqlitebrowser/installer/windows_on_arm/add_sqlean_arm64_target.patch . - git apply --ignore-space-change --ignore-whitespace add_sqlean_arm64_target.patch - make prepare-dist - make download-sqlite - make download-external - make compile-windows-arm64 - - - name: Build 'formats' Extensions - run: | - cp .\src\extensions\extension-formats.c C:\dev\SQLite\ - cp .\src\extensions\extension-formats.def C:\dev\SQLite\ - cd C:\dev\SQLite - cl /MD extension-formats.c -link -dll -def:extension-formats.def -out:formats.dll - - - name: Setup MSVC - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: x64 - vsversion: 2022 - - - name: Build x64 binaries for build SQLCipher - run: | - git clone https://www.github.com/sqlcipher/sqlcipher C:\dev\SQLCipher --branch v4.6.1 - cd C:\dev\SQLCipher - nmake /f Makefile.msc lemon.exe mkkeywordhash.exe mksourceid.exe src-verify.exe USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\VC\x64\MD\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include\x64" - - - name: Setup MSVC - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: arm64 - vsversion: 2022 - - - name: Build SQLCipher - run: | - cd C:\dev\SQLCipher - nmake /f Makefile.msc sqlcipher.dll USE_AMALGAMATION=1 NO_TCL=1 SQLITE3DLL=sqlcipher.dll SQLITE3LIB=sqlcipher.lib SQLITE3EXE=sqlcipher.exe LTLINKOPTS="C:\dev\OpenSSL\lib\VC\arm64\MD\libcrypto.lib" OPT_FEATURE_FLAGS="-DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC=1 -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS5=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_STAT4=1 -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_GEOPOLY=1 -DSQLITE_ENABLE_RTREE=1 -DSQLCIPHER_CRYPTO_OPENSSL=1 -DSQLITE_MAX_ATTACHED=125 -IC:\dev\OpenSSL\include\arm64" - mkdir sqlcipher - copy sqlite3.h sqlcipher - mv VERSION VERSION.txt - - - name: Configure build (SQLite) - run: | - mkdir release-sqlite && cd release-sqlite - cmake -G "Ninja Multi-Config" -DCMAKE_PREFIX_PATH="C:\dev\SQLite" -DQT_MAJOR=Qt6 ..\ - - - name: Build (SQLite) - run: | - cd release-sqlite - cmake --build . --config Release - - - name: Configure build (SQLCipher) - run: | - mkdir release-sqlcipher && cd release-sqlcipher - cmake -G "Ninja Multi-Config" -Dsqlcipher=1 -DCMAKE_PREFIX_PATH="C:\dev\OpenSSL;C:\dev\SQLCipher" -DQT_MAJOR=Qt6 ..\ - - - name: Build (SQLCipher) - run: | - cd release-sqlcipher - cmake --build . --config Release - - - if: github.event_name != 'pull_request' - name: Create MSI - env: - ExePath: ${{ github.workspace }} - OpenSSLPath: C:\dev\OpenSSL - SQLCipherPath: C:\dev\SQLCipher - SqleanPath: C:\dev\sqlean - SQLitePath: C:\dev\SQLite - run: | - cd installer\windows_on_arm - ./build.cmd - $DATE=$(Get-Date -Format "yyyyMMdd") - if ("${{ inputs.NIGHTLY }}" -eq "true") { - mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-$DATE-arm64.msi" - } else { - mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-arm64.msi" - } - - - if: github.event_name != 'pull_request' - name: Upload artifacts for code signing with SignPath - id: unsigned-artifacts - uses: actions/upload-artifact@v7 - with: - name: build-artifacts-${{ matrix.os }}-arm64-unsigned - path: installer\windows_on_arm\DB.Browser.for.SQLite-*.msi - - # Change the signing-policy-slug when you release an RC, RTM or stable release. - - if: github.event_name != 'pull_request' - name: Code signing with SignPath - uses: signpath/github-action-submit-signing-request@v2 - with: - api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' - github-artifact-id: '${{ steps.unsigned-artifacts.outputs.artifact-id }}' - organization-id: '${{ secrets.SIGNPATH_ORGANIZATION_ID }}' - output-artifact-directory: .\installer\windows - project-slug: 'sqlitebrowser' - signing-policy-slug: 'test-signing' - wait-for-completion: true - - - if: github.event_name != 'pull_request' - name: Create ZIP - run: | - $DATE=$(Get-Date -Format "yyyyMMdd") - if ("${{ inputs.NIGHTLY }}" -eq "true") { - $FILENAME_FORMAT="DB.Browser.for.SQLite-$DATE-arm64.zip" - } else { - $FILENAME_FORMAT="DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-arm64.zip" - } - Start-Process msiexec.exe -ArgumentList "/a $(dir installer\windows_on_arm\DB.Browser.for.SQLite-*.msi) /q TARGETDIR=$PWD\target\" -Wait - Compress-Archive -Path "target\DB Browser for SQLite\*" -DestinationPath $FILENAME_FORMAT - - - if: github.event_name != 'pull_request' && github.workflow != 'Build (Windows)' - name: Prepare artifacts - run: | - mkdir build-artifacts - move installer\windows_on_arm\DB.Browser.for.SQLite-*.msi build-artifacts\ - move DB.Browser.for.SQLite-*.zip build-artifacts\ - Compress-Archive -Path build-artifacts\* -DestinationPath build-artifacts-arm64.zip - - - if: github.event_name != 'pull_request' && github.workflow != 'Build (Windows)' - name: Upload artifacts - uses: actions/upload-artifact@v7 - with: - name: build-artifacts-${{ matrix.os }}-arm64 - path: build-artifacts-arm64.zip - - - if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Windows)' - name: Release - uses: softprops/action-gh-release@v2 - with: - files: installer/windows_on_arm/DB.Browser.for.SQLite-*.msi, DB.Browser.for.SQLite-*.zip - prerelease: true - tag_name: ${{ github.sha }}-windows - - - name: Summary - run: | - $OPENSSL_VERSION=(C:\dev\OpenSSL\bin\arm64\openssl version) -replace "OpenSSL ([\d\.]+[a-z]+) .*", '$1' - $QT_VERSION = & "$env:QT_ROOT_DIR\bin\qmake.exe" --version | Select-String "Using Qt version" | ForEach-Object { $_.ToString().Split()[3] } - $SQLCIPHER_VERSION=(Get-Item "C:\dev\SQLCipher\sqlcipher.dll").VersionInfo.FileVersion - Select-String -Path "C:\dev\SQLite\sqlite3.h" -Pattern '#define SQLITE_VERSION\s+"([\d\.]+)"' | ForEach-Object { - ($_ -match '"([\d\.]+)"') | Out-Null - $SQLITE_VERSION=$matches[1] - } - - echo "## Libaries used" >> $env:GITHUB_STEP_SUMMARY - echo "OpenSSL: $OPENSSL_VERSION, Qt: $QT_VERSION, SQLCipher: $SQLCIPHER_VERSION, SQLite: $SQLITE_VERSION" >> $env:GITHUB_STEP_SUMMARY + ExePath: ${{ github.workspace }} + OpenSSLPath: C:\dev\OpenSSL + SQLCipherPath: C:\dev\SQLCipher + SqleanPath: C:\dev\sqlean + SQLitePath: C:\dev\SQLite + run: | + cd installer\windows_on_arm + ./build.cmd + $DATE=$(Get-Date -Format "yyyyMMdd") + if ("${{ inputs.NIGHTLY }}" -eq "true") { + mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-$DATE-win-arm64.msi" + } else { + mv DB.Browser.for.SQLite-*.msi "DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-win-arm64.msi" + } + + - if: github.event_name != 'pull_request' + name: Upload artifacts for code signing with SignPath + id: unsigned-artifacts + uses: actions/upload-artifact@v7 + with: + name: build-artifacts-${{ matrix.os }}-win-arm64-unsigned + path: installer\windows_on_arm\DB.Browser.for.SQLite-*.msi + retention-days: 1 + + # Change the signing-policy-slug when you release an RC, RTM or stable release. + - if: github.event_name != 'pull_request' + name: Code signing with SignPath + uses: signpath/github-action-submit-signing-request@v2 + with: + api-token: "${{ secrets.SIGNPATH_API_TOKEN }}" + github-artifact-id: "${{ steps.unsigned-artifacts.outputs.artifact-id }}" + organization-id: "${{ secrets.SIGNPATH_ORGANIZATION_ID }}" + output-artifact-directory: .\installer\windows_on_arm + project-slug: "sqlitebrowser" + signing-policy-slug: "test-signing" + wait-for-completion: true + + - if: github.event_name != 'pull_request' + name: Create ZIP + run: | + $DATE=$(Get-Date -Format "yyyyMMdd") + if ("${{ inputs.NIGHTLY }}" -eq "true") { + $FILENAME_FORMAT="DB.Browser.for.SQLite-$DATE-win-arm64.zip" + } else { + $FILENAME_FORMAT="DB.Browser.for.SQLite-dev-$(git rev-parse --short HEAD)-win-arm64.zip" + } + Start-Process msiexec.exe -ArgumentList "/a $(dir installer\windows_on_arm\DB.Browser.for.SQLite-*.msi) /q TARGETDIR=$PWD\target\" -Wait + Compress-Archive -Path "target\DB Browser for SQLite\*" -DestinationPath $FILENAME_FORMAT + + - if: github.event_name != 'pull_request' + name: Upload artifacts + uses: actions/upload-artifact@v7 + with: + name: build-artifacts-${{ matrix.os }}-win-arm64 + path: | + installer\windows_on_arm\DB.Browser.for.SQLite-*.msi + DB.Browser.for.SQLite-*.zip + retention-days: 1 + + - name: Summary + run: | + $OPENSSL_VERSION=(C:\dev\OpenSSL\bin\arm64\openssl version) -replace "OpenSSL ([\d\.]+[a-z]+) .*", '$1' + $QT_VERSION = & "$env:QT_ROOT_DIR\bin\qmake.exe" --version | Select-String "Using Qt version" | ForEach-Object { $_.ToString().Split()[3] } + $SQLCIPHER_VERSION=(Get-Item "C:\dev\SQLCipher\sqlcipher.dll").VersionInfo.FileVersion + Select-String -Path "C:\dev\SQLite\sqlite3.h" -Pattern '#define SQLITE_VERSION\s+"([\d\.]+)"' | ForEach-Object { + ($_ -match '"([\d\.]+)"') | Out-Null + $SQLITE_VERSION=$matches[1] + } + + New-Item -ItemType Directory -Force -Path dependency-summary | Out-Null + $SUMMARY_ROW = "| Build (Windows on ARM) | ${{ matrix.os }} / arm64 | $OPENSSL_VERSION | $QT_VERSION | $SQLCIPHER_VERSION | $SQLITE_VERSION |" + Set-Content -Path "dependency-summary/dependencies-windows-on-arm-${{ matrix.os }}-arm64.md" -Value $SUMMARY_ROW + + - name: Upload dependency summary + uses: actions/upload-artifact@v7 + with: + name: dependency-summary-windows-on-arm-${{ matrix.os }}-arm64 + path: dependency-summary/*.md + retention-days: 1 + + summarize-dependencies: + if: always() && inputs.CONSOLIDATE_DEPENDENCY_SUMMARY != true && !cancelled() + needs: build + name: Summarize Dependencies + runs-on: ubuntu-24.04 + permissions: + actions: read + contents: read + steps: + - name: Download dependency summaries + uses: actions/download-artifact@v8 + continue-on-error: true + with: + pattern: dependency-summary-* + path: dependency-summary + merge-multiple: true + + - name: Summary + run: | + { + echo "## Dependencies used" + echo "" + echo "| Workflow | Target | OpenSSL | Qt | SQLCipher | SQLite |" + echo "| :---: | :---: | :---: | :---: | :---: | :---: |" + } >> "$GITHUB_STEP_SUMMARY" + + if [ -d dependency-summary ] && find dependency-summary -type f -name '*.md' | grep -q .; then + find dependency-summary -type f -name '*.md' -print | sort | while IFS= read -r file; do + cat "$file" >> "$GITHUB_STEP_SUMMARY" + done + else + echo "| Not available | No dependency summaries were uploaded. | - | - | - | - |" >> "$GITHUB_STEP_SUMMARY" + fi + + release: + if: github.event_name == 'workflow_dispatch' && github.workflow == 'Build (Windows on ARM)' + needs: build + name: Release + permissions: + actions: read + contents: write + uses: ./.github/workflows/release.yml diff --git a/.github/workflows/cppcmake.yml b/.github/workflows/cppcmake.yml index f5478db07..3c75d112f 100644 --- a/.github/workflows/cppcmake.yml +++ b/.github/workflows/cppcmake.yml @@ -5,21 +5,30 @@ on: branches: [master] pull_request: schedule: - - cron: '0 0 * * *' # Every day at midnight UTC + - cron: "0 0 * * *" # Every day at midnight UTC workflow_dispatch: inputs: NIGHTLY: - description: 'Run as a nightly build' + description: "Run as a nightly build" default: false required: true type: boolean -run-name: "${{ (github.event_name == 'schedule' || inputs.NIGHTLY == true) && 'Build and Deploy Nightly Builds' || github.event.head_commit.message}}" +run-name: >- + ${{ + (github.event_name == 'schedule' || inputs.NIGHTLY == true) + && 'Build and Deploy Nightly Builds' + || github.event.pull_request.title + || github.event.head_commit.message + || format('{0} on {1}', github.workflow, github.ref_name) + }} jobs: check-skippable: name: Check Skippable runs-on: ubuntu-24.04 + permissions: + contents: read outputs: skip: ${{ steps.set-skippable.outputs.skippable || 'false' }} steps: @@ -43,65 +52,96 @@ jobs: build-macos: needs: check-skippable if: needs.check-skippable.outputs.skip != 'true' + permissions: + actions: read + contents: write uses: ./.github/workflows/cppcmake-macos.yml secrets: inherit with: NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} + CONSOLIDATE_DEPENDENCY_SUMMARY: true build-ubuntu: needs: check-skippable if: needs.check-skippable.outputs.skip != 'true' + permissions: + actions: read + contents: write uses: ./.github/workflows/cppcmake-ubuntu.yml with: NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} + CONSOLIDATE_DEPENDENCY_SUMMARY: true build-windows: needs: check-skippable if: needs.check-skippable.outputs.skip != 'true' + permissions: + actions: read + contents: write uses: ./.github/workflows/cppcmake-windows.yml secrets: inherit with: NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} + CONSOLIDATE_DEPENDENCY_SUMMARY: true build-windows_on_arm: needs: check-skippable if: needs.check-skippable.outputs.skip != 'true' + permissions: + actions: read + contents: write uses: ./.github/workflows/cppcmake-windows_on_arm.yml secrets: inherit with: NIGHTLY: ${{ github.event_name == 'schedule' || inputs.NIGHTLY == true }} + CONSOLIDATE_DEPENDENCY_SUMMARY: true - release: - if: github.event_name != 'pull_request' - needs: [build-macos, build-ubuntu, build-windows, build-windows_on_arm] - name: Release + summarize-dependencies: + needs: + [ + check-skippable, + build-macos, + build-ubuntu, + build-windows, + build-windows_on_arm, + ] + if: always() && needs.check-skippable.outputs.skip != 'true' && !cancelled() + name: Summarize Dependencies runs-on: ubuntu-24.04 - env: - GH_TOKEN: ${{ github.token }} - tag_name: ${{ (github.event_name == 'schedule' || inputs.NIGHTLY == true) && 'nightly' || 'continuous' }} + permissions: + actions: read + contents: read steps: - - name: Delete existing tag and release - run: gh release delete ${{ env.tag_name }} --cleanup-tag --yes --repo $GITHUB_REPOSITORY - continue-on-error: true - - - run: mkdir -v target - - - name: Download artifacts + - name: Download dependency summaries uses: actions/download-artifact@v8 + continue-on-error: true with: - path: target - - - name: Remove unsigned Windows build - run: rm -rfv target/*unsigned* + pattern: dependency-summary-* + path: dependency-summary + merge-multiple: true - - run: find target -type f -exec mv -v {} target \; + - name: Summary + run: | + { + echo "## Dependencies used" + echo "" + echo "| Workflow | Target | OpenSSL | Qt | SQLCipher | SQLite |" + echo "| :---: | :---: | :---: | :---: | :---: | :---: |" + } >> "$GITHUB_STEP_SUMMARY" - - name: Unarchive Windows's build artifacts - run: for f in target/*.zip; do unzip -d target/ "$f" && rm -v "$f"; done + if [ -d dependency-summary ] && find dependency-summary -type f -name '*.md' | grep -q .; then + find dependency-summary -type f -name '*.md' -print | sort | while IFS= read -r file; do + cat "$file" >> "$GITHUB_STEP_SUMMARY" + done + else + echo "| Not available | No dependency summaries were uploaded. | - | - | - | - |" >> "$GITHUB_STEP_SUMMARY" + fi - - name: Release - uses: softprops/action-gh-release@v2 - with: - files: target/* - prerelease: true - tag_name: ${{ env.tag_name }} + release: + if: github.event_name != 'pull_request' + needs: [build-macos, build-ubuntu, build-windows, build-windows_on_arm] + name: Release + permissions: + actions: read + contents: write + uses: ./.github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..5b54f1e84 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,118 @@ +name: Release Artifacts + +on: + workflow_call: + +jobs: + release: + name: Release + runs-on: ubuntu-24.04 + permissions: + actions: read + contents: write + concurrency: + group: release-${{ github.repository }}-${{ contains(github.workflow_ref, '/cppcmake.yml@') && ((github.event_name == 'schedule' || github.event.inputs.NIGHTLY == 'true') && 'nightly' || 'continuous') || format('{0}-{1}', github.workflow, github.sha) }} + cancel-in-progress: false + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Set release tag + id: release-tag + run: | + case "${{ github.workflow_ref }}" in + "$GITHUB_REPOSITORY/.github/workflows/cppcmake.yml@"*) + if [ "${{ github.event_name }}" = "schedule" ] || [ "${{ github.event.inputs.NIGHTLY }}" = "true" ]; then + TAG_NAME="nightly" + else + TAG_NAME="continuous" + fi + ;; + "$GITHUB_REPOSITORY/.github/workflows/cppcmake-ubuntu.yml@"*) + TAG_NAME="${GITHUB_SHA}-ubuntu" + ;; + "$GITHUB_REPOSITORY/.github/workflows/cppcmake-macos.yml@"*) + TAG_NAME="${GITHUB_SHA}-macos" + ;; + "$GITHUB_REPOSITORY/.github/workflows/cppcmake-windows.yml@"*) + TAG_NAME="${GITHUB_SHA}-windows" + ;; + "$GITHUB_REPOSITORY/.github/workflows/cppcmake-windows_on_arm.yml@"*) + TAG_NAME="${GITHUB_SHA}-windows-on-arm" + ;; + *) + echo "::error::Unsupported release caller workflow: ${{ github.workflow_ref }}" + exit 1 + ;; + esac + + echo "tag_name=$TAG_NAME" >> "$GITHUB_OUTPUT" + + - run: mkdir -v target release + + - name: Download artifacts + uses: actions/download-artifact@v8 + with: + path: target + + - name: Remove dependency summary artifacts + run: find target -depth -name 'dependency-summary-*' -exec rm -rfv {} + + + - name: Remove unsigned Windows artifacts + run: find target -depth -name '*unsigned*' -exec rm -rfv {} + + + - name: Flatten artifacts + run: find target -type f -exec mv -v {} release \; + + - name: Check release files + run: | + if ! find release -type f | grep -q .; then + echo "::error::No release files were prepared." + exit 1 + fi + + - name: Check if release is still current + id: publish-guard + run: | + case "${{ github.workflow_ref }}" in + "$GITHUB_REPOSITORY/.github/workflows/cppcmake.yml@"*) + ;; + *) + echo "releasable=true" >> "$GITHUB_OUTPUT" + exit 0 + ;; + esac + + REMOTE_SHA=$(git ls-remote "https://github.com/${GITHUB_REPOSITORY}.git" "refs/heads/${{ github.ref_name }}" | awk '{print $1}') + + if [ -z "$REMOTE_SHA" ]; then + echo "::warning::Unable to resolve the latest commit for refs/heads/${{ github.ref_name }} right before publishing. Skipping release." + echo "releasable=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + if [ "$REMOTE_SHA" = "$GITHUB_SHA" ]; then + echo "releasable=true" >> "$GITHUB_OUTPUT" + exit 0 + fi + + echo "::notice::Skipping release for ${GITHUB_SHA} because a newer commit exists on refs/heads/${{ github.ref_name }} (${REMOTE_SHA}) right before publishing." + echo "releasable=false" >> "$GITHUB_OUTPUT" + + - if: steps.publish-guard.outputs.releasable != 'true' + name: Summarize skipped publish + run: | + echo "## Publish skipped" >> "$GITHUB_STEP_SUMMARY" + echo "This run finished building, but a newer commit appeared while preparing artifacts, so the shared \`${{ steps.release-tag.outputs.tag_name }}\` release was left untouched." >> "$GITHUB_STEP_SUMMARY" + + - if: steps.publish-guard.outputs.releasable == 'true' + name: Delete existing tag and release + run: gh release delete ${{ steps.release-tag.outputs.tag_name }} --cleanup-tag --yes --repo $GITHUB_REPOSITORY + continue-on-error: true + + - if: steps.publish-guard.outputs.releasable == 'true' + name: Release + uses: softprops/action-gh-release@v2 + with: + files: release/* + prerelease: true + tag_name: ${{ steps.release-tag.outputs.tag_name }} diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml index 8e4f5b859..4f5da2bfd 100644 --- a/.github/workflows/winget.yml +++ b/.github/workflows/winget.yml @@ -4,6 +4,9 @@ on: release: types: [released] +permissions: + contents: read + jobs: publish: runs-on: ubuntu-latest @@ -11,5 +14,5 @@ jobs: - uses: vedantmgoyal9/winget-releaser@main with: identifier: DBBrowserForSQLite.DBBrowserForSQLite - installers-regex: '\.msi$' # Only .msi files + installers-regex: '\.msi$' # Only .msi files token: ${{ secrets.WINGET_TOKEN }} diff --git a/installer/other/get_nightlies_from_github_actions.sh b/installer/other/get_nightlies_from_github_actions.sh deleted file mode 100644 index 627540dad..000000000 --- a/installer/other/get_nightlies_from_github_actions.sh +++ /dev/null @@ -1,71 +0,0 @@ -# SPDX-FileCopyrightText: (C) 2024 SeongTae Jeong -# This script downloads the daily build output from GitHub Release, built by GitHub Actions, and archives it on our nightly server. - -#!/usr/bin/env bash - -source /root/.gh_token_secure - -set -ex - -echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S %Z"): [START]" -DATE=$(date +%Y%m%d) -echo "Clear the incoming directory" -DOWNLOAD_DIR="/tmp/incoming/" -rm -rfv $DOWNLOAD_DIR -mkdir -v $DOWNLOAD_DIR - -if [ $(ls -l /nightlies/appimage /nightlies/appimage-arm64 | grep -c "$DATE") ] && - [ $(ls -l /nightlies/macos-universal | grep -c "$DATE") ] && - [ $(ls -l /nightlies/win32 /nightlies/win64 | grep -c "$DATE") -ne 0 ]; then - echo "Nightly build already exists" - exit 1 -fi - -if ! gh auth login --with-token <<< "$GH_TOKEN"; then - echo "Unable to authenticate with GitHub" -fi -echo "Successfully authenticated with GitHub" - -IS_BUILD_SUCCESS=$(gh run list --created $(date '+%Y-%m-%d') --limit 1 --event "schedule" --status "success" --workflow "CI" --repo "sqlitebrowser/sqlitebrowser" | wc -l) -if [ $IS_BUILD_SUCCESS -eq 0 ]; then - echo "No successful build found" - exit 1 -fi -echo "Found a successful build" - -if ! gh release download --dir /tmp/incoming/ -R "sqlitebrowser/sqlitebrowser" nightly; then - echo "Unable to download the nightly build" -fi -echo "Successfully downloaded the nightly build" - - -# Check if the downloaded files are as expected -# This case is occuring when the nightly build is skipped -if [ $(ls -l $DOWNLOAD_DIR | grep -c "$DATE") -ne 10 ]; then - echo "Last nightly build is skipped" - exit 1 -fi - -mv -v $DOWNLOAD_DIR*x86.64*AppImage /nightlies/appimage/ -mv -v $DOWNLOAD_DIR*aarch64*AppImage /nightlies/appimage-arm64/ -mv -v $DOWNLOAD_DIR*x86* /nightlies/win32/ -mv -v $DOWNLOAD_DIR*x64* /nightlies/win64/ -mv -v $DOWNLOAD_DIR*dmg /nightlies/macos-universal/ - -rm -v /nightlies/latest/*.AppImage -rm -v /nightlies/latest/*.dmg -rm -v /nightlies/latest/*.msi -rm -v /nightlies/latest/*.zip - -ln -sv /nightlies/appimage/DB.Browser.for.SQLCipher-$DATE-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-x86.64.AppImage -ln -sv /nightlies/appimage/DB.Browser.for.SQLite-$DATE-x86.64.AppImage /nightlies/latest/DB.Browser.for.SQLite-x86.64.AppImage -ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLCipher-$DATE-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLCipher-aarch64.AppImage -ln -sv /nightlies/appimage-arm64/DB.Browser.for.SQLite-$DATE-aarch64.AppImage /nightlies/latest/DB.Browser.for.SQLite-aarch64.AppImage -ln -sv /nightlies/macos-universal/DB.Browser.for.SQLCipher-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLCipher-universal.dmg -ln -sv /nightlies/macos-universal/DB.Browser.for.SQLite-universal_$DATE.dmg /nightlies/latest/DB.Browser.for.SQLite-universal.dmg -ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-x86.msi /nightlies/latest/DB.Browser.for.SQLite-x86.msi -ln -sv /nightlies/win32/DB.Browser.for.SQLite-$DATE-x86.zip /nightlies/latest/DB.Browser.for.SQLite-x86.zip -ln -sv /nightlies/win64/DB.Browser.for.SQLite-$DATE-x64.msi /nightlies/latest/DB.Browser.for.SQLite-x64.msi -ln -sv /nightlies/win64/DB.Browser.for.SQLite-$DATE-x64.zip /nightlies/latest/DB.Browser.for.SQLite-x64.zip - -echo "[STOP]" diff --git a/installer/other/move_nightlies_into_dirs.sh b/installer/other/move_nightlies_into_dirs.sh deleted file mode 100644 index 9e5d8ad6e..000000000 --- a/installer/other/move_nightlies_into_dirs.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Moving the nightly builds into appropriate subdirs. Designed to be -# run automatically from cron, using something like this: -# 10 0 14 * * /usr/local/bin/move_nightlies_into_dirs.sh - -# Retrieve the month number for last month -YEARMONTH=`date -d "last month 13:00" '+%Y-%m'` -YEARMONTHOSX=`date -d "last month 13:00" '+%Y%m'` - -# Create appropriate new subfolders -mkdir /nightlies/macos-universal/${YEARMONTH} -mkdir /nightlies/win32/${YEARMONTH} -mkdir /nightlies/win64/${YEARMONTH} - -# Move builds -mv /nightlies/macos-universal/DB*${YEARMONTHOSX}* /nightlies/macos-universal/night*${YEARMONTHOSX}* /nightlies/macos-universal/${YEARMONTH}/ -mv /nightlies/win32/DB*${YEARMONTH}* /nightlies/win32/${YEARMONTH}/ -mv /nightlies/win64/DB*${YEARMONTH}* /nightlies/win64/${YEARMONTH}/ - -# Fix ownership and SELinux context's -chown -Rh nightlies: /nightlies/macos-universal/${YEARMONTH} /nightlies/win32/${YEARMONTH} /nightlies/win64/${YEARMONTH} - -echo Nightlies moved for $YEARMONTH diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index 2ec5837f5..d446d68fc 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -35,7 +35,7 @@ set(TESTSQLOBJECTS_HDR add_executable(test-sqlobjects ${TESTSQLOBJECTS_HDR} ${TESTSQLOBJECTS_SRC}) target_link_libraries(test-sqlobjects ${QT_MAJOR}::Test) -add_test(test-sqlobjects test-sqlobjects) +add_test(NAME test-sqlobjects COMMAND $) # test-import @@ -50,7 +50,7 @@ set(TESTIMPORT_MOC_HDR add_executable(test-import ${TESTIMPORT_MOC_HDR} ${TESTIMPORT_SRC}) target_link_libraries(test-import ${QT_MAJOR}::Test) -add_test(test-import test-import) +add_test(NAME test-import COMMAND $) # test regex @@ -66,7 +66,7 @@ set(TESTREGEX_HDR add_executable(test-regex ${TESTREGEX_HDR} ${TESTREGEX_SRC}) target_link_libraries(test-regex ${QT_MAJOR}::Test ${QT_MAJOR}::Widgets ${QT5_COMPAT}) -add_test(test-regex test-regex) +add_test(NAME test-regex COMMAND $) # test cache @@ -80,4 +80,4 @@ set(TESTCACHE_HDR add_executable(test-cache ${TESTCACHE_HDR} ${TESTCACHE_SRC}) target_link_libraries(test-cache ${QT_MAJOR}::Test) -add_test(test-cache test-cache) +add_test(NAME test-cache COMMAND $) diff --git a/installer/linux/sqlcipher_rename.sh b/tools/linux/sqlcipher_rename.sh similarity index 100% rename from installer/linux/sqlcipher_rename.sh rename to tools/linux/sqlcipher_rename.sh diff --git a/installer/windows_on_arm/add_sqlean_arm64_target.patch b/tools/windows/add_sqlean_arm64_target.patch similarity index 100% rename from installer/windows_on_arm/add_sqlean_arm64_target.patch rename to tools/windows/add_sqlean_arm64_target.patch diff --git a/tools/windows/download_latest_openssl3.py b/tools/windows/download_latest_openssl3.py new file mode 100644 index 000000000..74d55cf39 --- /dev/null +++ b/tools/windows/download_latest_openssl3.py @@ -0,0 +1,83 @@ +# SPDX-FileCopyrightText: (C) 2026 SeongTae Jeong +# SPDX-License-Identifier: MIT + +import requests +import hashlib +from packaging.version import Version +from pathlib import Path + +JSON_URL = "https://raw.githubusercontent.com/slproweb/opensslhashes/refs/heads/master/win32_openssl_hashes.json" +TARGET_MAJOR_PREFIX = "3." + + +def get_latest_universal_installer_info(): + response = requests.get(JSON_URL, timeout=30) + response.raise_for_status() + + data = response.json() + files = data.get("files", {}) + + matched = [] + for filename, meta in files.items(): + basever = meta.get("basever", "") + if ( + meta.get("arch") == "Universal" + and meta.get("light") is False + and meta.get("installer") == "exe" + and basever.startswith(TARGET_MAJOR_PREFIX) + ): + matched.append( + { + "filename": filename, + "basever": basever, + "url": meta["url"], + "sha256": meta["sha256"], + } + ) + + if not matched: + raise ValueError( + f"No files matching your criteria were found for {TARGET_MAJOR_PREFIX}x." + ) + + latest = max(matched, key=lambda x: Version(x["basever"])) + return latest + + +def download_file(url, destination): + destination.parent.mkdir(parents=True, exist_ok=True) + + with requests.get(url, stream=True, timeout=30) as response: + response.raise_for_status() + + with destination.open("wb") as file: + for chunk in response.iter_content(chunk_size=8192): + if chunk: + file.write(chunk) + + return destination + + +def verify_sha256(file_path, expected_sha256): + hasher = hashlib.sha256() + + with file_path.open("rb") as file: + for chunk in iter(lambda: file.read(8192), b""): + hasher.update(chunk) + + actual_sha256 = hasher.hexdigest() + if actual_sha256.lower() != expected_sha256.lower(): + raise ValueError( + f"SHA256 mismatch for {file_path}: expected {expected_sha256}, got {actual_sha256}" + ) + + return actual_sha256 + + +if __name__ == "__main__": + latest = get_latest_universal_installer_info() + download_path = Path(latest["filename"]) + saved_path = download_file(latest["url"], download_path) + sha256 = verify_sha256(saved_path, latest["sha256"]) + + print(latest["filename"]) diff --git a/tools/windows/download_latest_sqlite.py b/tools/windows/download_latest_sqlite.py new file mode 100644 index 000000000..4b37c955d --- /dev/null +++ b/tools/windows/download_latest_sqlite.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: (C) 2026 SeongTae Jeong +# SPDX-License-Identifier: MIT + +import hashlib +import re +from pathlib import Path +from urllib.request import urlopen + +DOWNLOAD_PAGE_URL = "https://sqlite.org/download.html" +DOWNLOAD_BASE_URL = "https://sqlite.org/" +PRODUCT_REGEX = re.compile( + r"PRODUCT,(\d+\.\d+\.\d+),(\d+/sqlite-amalgamation-\d+\.zip),\d+,([0-9a-fA-F]+)" +) + + +def fetch_download_page(): + with urlopen(DOWNLOAD_PAGE_URL, timeout=30) as response: + return response.read().decode("utf-8", errors="replace") + + +def version_key(version): + return tuple(int(part) for part in version.split(".")) + + +def get_latest_amalgamation_info(download_page): + matches = [] + for match in PRODUCT_REGEX.finditer(download_page): + version, relative_url, sha3_256 = match.groups() + matches.append( + { + "version": version, + "relative_url": relative_url, + "url": f"{DOWNLOAD_BASE_URL}{relative_url}", + "filename": Path(relative_url).name, + "sha3_256": sha3_256, + } + ) + + if not matches: + raise ValueError("No SQLite amalgamation download entries were found.") + + return max(matches, key=lambda entry: version_key(entry["version"])) + + +def download_file(url, destination): + destination.parent.mkdir(parents=True, exist_ok=True) + + with urlopen(url, timeout=30) as response, destination.open("wb") as file: + while True: + chunk = response.read(8192) + if not chunk: + break + file.write(chunk) + + return destination + + +def verify_sha3_256(file_path, expected_sha3_256): + hasher = hashlib.sha3_256() + + with file_path.open("rb") as file: + for chunk in iter(lambda: file.read(8192), b""): + hasher.update(chunk) + + actual_sha3_256 = hasher.hexdigest() + if actual_sha3_256.lower() != expected_sha3_256.lower(): + raise ValueError( + f"SHA3-256 mismatch for {file_path}: expected {expected_sha3_256}, got {actual_sha3_256}" + ) + + return actual_sha3_256 + + +if __name__ == "__main__": + latest = get_latest_amalgamation_info(fetch_download_page()) + download_path = Path(latest["filename"]) + saved_path = download_file(latest["url"], download_path) + verify_sha3_256(saved_path, latest["sha3_256"]) + + print(saved_path.name) diff --git a/tools/windows/requirements/download_latest_openssl3.txt b/tools/windows/requirements/download_latest_openssl3.txt new file mode 100644 index 000000000..1a41ddc4a --- /dev/null +++ b/tools/windows/requirements/download_latest_openssl3.txt @@ -0,0 +1,2 @@ +packaging==26.0 +requests==2.32.5