From 4af71d3d8e55e72c5c37be583ddcc3494ff69739 Mon Sep 17 00:00:00 2001 From: Yusufibin Date: Sun, 2 Nov 2025 11:44:20 +0100 Subject: [PATCH] update --- LiteJsonDb/LiteJsonDb.py | 44 +++++++++++------- .../__pycache__/LiteJsonDb.cpython-311.pyc | Bin 0 -> 15924 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 891 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 365 bytes .../__pycache__/db_operations.cpython-311.pyc | Bin 0 -> 6535 bytes .../__pycache__/encrypt.cpython-311.pyc | Bin 0 -> 7317 bytes .../__pycache__/method.cpython-311.pyc | Bin 0 -> 18804 bytes LiteJsonDb/handler/db_operations.py | 12 ++--- LiteJsonDb/handler/encrypt.py | 2 +- LiteJsonDb/handler/method.py | 41 ++++++++-------- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 347 bytes .../modules/__pycache__/csv.cpython-311.pyc | Bin 0 -> 3727 bytes .../__pycache__/search.cpython-311.pyc | Bin 0 -> 4632 bytes .../modules/__pycache__/tgbot.cpython-311.pyc | Bin 0 -> 7369 bytes LiteJsonDb/modules/csv.py | 3 +- LiteJsonDb/modules/search.py | 24 ++++++++-- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 594 bytes .../utility/__pycache__/utils.cpython-311.pyc | Bin 0 -> 7729 bytes 18 files changed, 76 insertions(+), 50 deletions(-) create mode 100644 LiteJsonDb/__pycache__/LiteJsonDb.cpython-311.pyc create mode 100644 LiteJsonDb/__pycache__/__init__.cpython-311.pyc create mode 100644 LiteJsonDb/handler/__pycache__/__init__.cpython-311.pyc create mode 100644 LiteJsonDb/handler/__pycache__/db_operations.cpython-311.pyc create mode 100644 LiteJsonDb/handler/__pycache__/encrypt.cpython-311.pyc create mode 100644 LiteJsonDb/handler/__pycache__/method.cpython-311.pyc create mode 100644 LiteJsonDb/modules/__pycache__/__init__.cpython-311.pyc create mode 100644 LiteJsonDb/modules/__pycache__/csv.cpython-311.pyc create mode 100644 LiteJsonDb/modules/__pycache__/search.cpython-311.pyc create mode 100644 LiteJsonDb/modules/__pycache__/tgbot.cpython-311.pyc create mode 100644 LiteJsonDb/utility/__pycache__/__init__.cpython-311.pyc create mode 100644 LiteJsonDb/utility/__pycache__/utils.cpython-311.pyc diff --git a/LiteJsonDb/LiteJsonDb.py b/LiteJsonDb/LiteJsonDb.py index aaca364..eef8238 100644 --- a/LiteJsonDb/LiteJsonDb.py +++ b/LiteJsonDb/LiteJsonDb.py @@ -1,5 +1,6 @@ import os import logging +import sys from typing import Any, Dict, Optional from .handler import ( Encryption, DatabaseOperations, DataManipulation @@ -24,6 +25,12 @@ def setup_logging(enable_log): if enable_log: logging.basicConfig(filename=os.path.join(DATABASE_DIR, 'LiteJsonDb.log'), level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + # Add console handler for user messages + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setLevel(logging.INFO) + console_formatter = logging.Formatter('%(message)s') + console_handler.setFormatter(console_formatter) + logging.getLogger().addHandler(console_handler) class JsonDB(Encryption, DatabaseOperations, DataManipulation): """ @@ -57,7 +64,8 @@ def __init__(self, filename="db.json", backup_filename="db_backup.json", self.observers = {} self.csv_exporter = CSVExporter(DATABASE_DIR) setup_logging(self.enable_log) - Encryption.__init__(self, encryption_method, encryption_key) + self.logger = logging.getLogger('LiteJsonDb') + Encryption.__init__(self, encryption_method, encryption_key) DatabaseOperations.__init__(self, enable_log, auto_backup) DataManipulation.__init__(self) self._load_db() @@ -75,7 +83,7 @@ def backup_to_telegram(self, token: str, chat_id: str): try: telegram_bot.backup_to_telegram(self.filename) except Exception as e: - print(f"\033[90m#bugs\033[0m Telegram backup took a wrong turn! Error: {e}") + self.logger.error(f"\033[90m#bugs\033[0m Telegram backup took a wrong turn! Error: {e}") if self.enable_log: logging.error(f"Error sending backup to Telegram: {e}") @@ -91,40 +99,42 @@ def export_to_csv(self, data_key: Optional[str] = None): data = self.db[data_key] csv_path = self.csv_exporter.export(data, f"{data_key}_export.csv") if csv_path: - print(f"🎉 Hooray! CSV exported to: {csv_path}") + self.logger.info(f"🎉 Hooray! CSV exported to: {csv_path}") else: - print(f"\033[90m#bugs\033[0m Could not export '{data_key}' to CSV!") + self.logger.error(f"\033[90m#bugs\033[0m Could not export '{data_key}' to CSV!") else: - print(f"\033[90m#bugs\033[0m Key '{data_key}' not found, is it hiding? Tip: Double-check it!") + self.logger.error(f"\033[90m#bugs\033[0m Key '{data_key}' not found, is it hiding? Tip: Double-check it!") else: if self.db: csv_path = self.csv_exporter.export(self.db, "full_database_export.csv") if csv_path: - print(f"🎉 Full database exported to: {csv_path}") + self.logger.info(f"🎉 Full database exported to: {csv_path}") else: - print("\033[90m#bugs\033[0m Database export failed. It's shy!") + self.logger.error("\033[90m#bugs\033[0m Database export failed. It's shy!") else: - print("\033[90m#bugs\033[0m Database is empty, ghost town vibes!") + self.logger.error("\033[90m#bugs\033[0m Database is empty, ghost town vibes!") - def search_data(self, value: Any, key: Optional[str] = None) -> Optional[Dict[str, Any]]: + def search_data(self, value: Any, key: Optional[str] = None, substring: bool = False, case_sensitive: bool = True) -> Optional[Dict[str, Any]]: """ Searches for a value within the database. - Args: - value (Any): The value to search for. - key (Optional[str]): If provided, searches only within the values associated with this key. - Returns: - Optional[Dict[str, Any]]: Returns the matching dictionary or None if not found. + Args: + value (Any): The value to search for. + key (Optional[str]): If provided, searches only within the values associated with this key. + substring (bool): If True, perform substring search. Defaults to False. + case_sensitive (bool): If False, perform case-insensitive search. Defaults to True. + Returns: + Optional[Dict[str, Any]]: Returns the matching dictionary or None if not found. """ try: - result = search_data(self.db, value, key) + result = search_data(self.db, value, key, substring=substring, case_sensitive=case_sensitive) if result: return result else: - print("\033[90m#info\033[0m Not found! Try another quest?") + self.logger.info("Not found! Try another quest?") return None except Exception as e: - print(f"\033[90m#bugs\033[0m Search party got lost! Error: {e}") + self.logger.error(f"Search party got lost! Error: {e}") return None @staticmethod diff --git a/LiteJsonDb/__pycache__/LiteJsonDb.cpython-311.pyc b/LiteJsonDb/__pycache__/LiteJsonDb.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0b41a60bda831c6c2fd9daba08d0b9eecb319f9 GIT binary patch literal 15924 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 literal 0 HcmV?d00001 diff --git a/LiteJsonDb/handler/__pycache__/__init__.cpython-311.pyc b/LiteJsonDb/handler/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1435b7354b077419ba244852a6605962b9b01880 GIT binary patch literal 365 zcmZ3^%ge<81a*4snPouwF^B^LOi;#WEg)k$LkdF*V-7#pF!3>(LFByRvG#PJkx#lGoRTh+F=H~%7LXWQZfZ$Jeo7H5kh7BEGmvEX z<>+h`6Iz^FR2<_G5aW_soL!P%5L1+x7vqyzlIm5QpXZW<%*;s4OUX$siiwZU%*!l^ zkJl@x{Ka9Do1apelWJGQ12hrjjbcY2@qw9fN4AqVRvFu|qt$;|y#+OrHnLTxwNq!S)4Ea83bIJsawX9v z>AEqTG${Izbs6do1`@0-=7%9mkv#-Mffd+*)m}R6ktzgKAYh=t(1*UMNCy~w+BugZ z^6#amJh(SIm`h$J`8YkTXPN-yAswO-PA$0+ou3Ysir64}J8BxrL|x!IXiTIvx}*<^YV+p^lE0>X?UXQ()p zqD`1xF{?o(>M~U%6$!=&8nBa#3u;XdO9iD2%d>_rv8c&$Qy|G! ztPQRzzCUQEOS8hPkhopF;(#}pQ!~+3cO+PAl5wJ6$fmSZBAr@>xxn7;ToiN0N>hlR zM3h-|h;|X*FqQi$9GjNqbPp_-xr@R>!qgm0v83P(n{qITv$MD=LR6YbET%O&`=g1p zDw!iUl?p<|kRMAg%4cAflh!0Zw1tVVL-D}GC|)371e_|RXUZiiPAc@|$I+3YOE0UE zqF#Fb7nh=v`i3SiTv8I*OJ`G>G^Wbg=yWAJM|ZArNt}+C_iW$7Wy2GXr(m+<@#WT? zliX)j0t^uKAdqXM$dlHi*SQ<@h1Ra?T;6j)r_TeZB!)|ov_&O5k+fGAN?q`$d*J}k zn?ys&Qku8r)@>ZH>M&m+^Y|rAw?X!XImKcUyAPoGVUALu8Ijl8UJhWo>PGl>4_YwKT zQ9TyWKF~q5VENllqI6sVE19=@z3wm9mN}7IaqOn=T^Pj`$5qD?vqa4PK4i9>)nnZ; zTLG&*n5(KaxPs%ttwEF0w!$i{D`dUiDyhs@*y?Wq0eGuE>s|p(<@f(#1wwnQfa_5! zAUY;t&L&CqI%w1rn*E%&*LKG7*z4nd-1P~2mZxp>ItxC;1U}o-*r+}>d2XVF-m)T4 z00)pv2w7=Kkh7AInh{c(Aj*=O?bZb8?UbsO@ylSACYD<)L#Jv=D#RgSxxe+|)5kL% z(~Gle>&1bL@G=E@gh;cQY6mnV7>u&qY%4>@CyCT$fUe#>b)j6Xrf{R-kX3_QNN970 zi*{NyJm{mciHu}$fLU3Cn+I4kIB_wvKmpNkmmu5VQrQ{VaG#rePElmVaACQm7*2`4 za@eBbPAZodG)V-+6D7(U4sqJ3$N7v(Nm-QW$6-!En=?3U++d(>Tmlv29)MjzK{Esu zs4^~2?+%)!O2kXG8*uF!`HzS2jW?D)xcdIpTjIx=TzyZzzNbh$-sYmi9cbQaI(Vz| z_b4|VZrrsi98jjryZUqmly>M%Ky)zf=&Ih~oV0V#)3R+9a_bB%Rl5*K@-1heN zZpGj1Z&`a5E6y@o!Pd32`jN5E2mf{oGI(;q@qBPx4~}ndZ|y%+B#uCHnH2con(u4= z$XEOkz5O*kb`fd&YdQY)Jpa1Rzh2;*pv~=~6TZUS}p-&uQSl`BApP8JE<(6Jt+Ss~Q^`^@h$ccQt_@qFm`YIN<)>X~ms z?Z^~;pnz(j(PgCE$9HZF3+y>Wy^zLP=zXczFC{<`6(+0EwA z@F2T6=tTZh({nueM`MIUL+t%VKfK%zanW}7{dN}lqYUz0UBG|IH;;PRFS|mc9Q#ks z3Ho5YJw4!UM0)eUd98_pgCz~9St+fvog56;+jnbgIjanZDk<96)sxFMhf zC;cb(HiQRv?GOQ+H^lt42aCsa-g~(YCydwb;cm`Wtdc-X!CbK6BsCf+K=#sDnop zKyLVc`B)8XkI0K@QOL>~m9b%aNC*cM0rV*t-vb^>SqiC23zjt_Ie-Kq&4Sf9TQokF5@_omf3_ zFZ!1k|NP%PnsFXy<3bTi4vR9a^ zOxZNCjWDQOs5gb;RuJ`YGyK#+!yeQ4aIvgVr>=CmN8@X=V!iU+NME@+0$-{3 zfS~yiKcDxt7Ks}p92Z15eDj*`R`lZ+?+oUjd^X3Q&hw{r{xo|0nh@k(G(Y%!O$-8I z2s{}5oJB(by8Z3LgOXSD$@6;qEAZs_sXRZW^Ha4!i4XgR9aIsjeid;<>d8iZUF0OY zaWE7)!ET&z0>Ar?|BCMT|IbNQ`E~W#Y~J4YHMU}(T6fyYx@{9M6g%Ap?ymhtZ3?dz zXabwsZ}DJL_Wq|fWn1WOyC3&@$)*tKOUbq=`<%L7VY8MLfiu?Q+7yibQM$P5z@lb^ z%~d0`dm}n)zp_RYb}bLu7W@*urmOX_^cZGZR)q;aVHrm0a<6m@DqZ-%Y3Rusw_3Jn z^ER-2w+BYO+*u<%A(u3n2euh`F)Q{h3%eDg6ECUk3-42Ki50w8P@0eoAn8NWkA(W^ zZsh2V(_SuGISwLfB`Emfr8W>1Le}6bQK4KvfggLRSB6uNf8UK0A3XE^Gq*bPhx&59 z{=BchNc`Sm#ykg^D3L!rfZni-5`6Gx;J1Mf>(}a6>ut!mXq{Rvd@-0GnbMD3fF~D> z<%2QZdJr-$QpmXYNXWRLzcQt_Uw|ja$MSqk=VP^y;UR&BazsCt^N;8KQ z>dpgt=yZ;cp46D$Kys_Jf4xoMYwp48~%9w&Ba8zRO61vML7w@9Nuy&xX~55sy)d46v-fv zPl{jQSCfYxb|`a5_D3b^_w}I=hPm$oe47J{M_LOPUWj;n-762K`u8 zO%D5<0J+uV5bwl^c^EbOjXe!}%`HuXOS+M9(;6=A@&a7lDu`POhXgUy93%!j<$?d` zIcd(~Gs;P*fNe?C-vEL2VVDB(UZcMP@m-_80tsBBzXI8Jjs6OxOW*q`a#IY0!`VCg N-mLrKAtJQ9{{;jZ=HdVV literal 0 HcmV?d00001 diff --git a/LiteJsonDb/handler/__pycache__/encrypt.cpython-311.pyc b/LiteJsonDb/handler/__pycache__/encrypt.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ce7795773f87199d38c25decb9bc5769eabac14 GIT binary patch literal 7317 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 literal 0 HcmV?d00001 diff --git a/LiteJsonDb/handler/__pycache__/method.cpython-311.pyc b/LiteJsonDb/handler/__pycache__/method.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8c66df6a58572b01d0535cdc9086a1eeab521c9 GIT binary patch literal 18804 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 literal 0 HcmV?d00001 diff --git a/LiteJsonDb/handler/db_operations.py b/LiteJsonDb/handler/db_operations.py index 5d4878a..d2548ff 100644 --- a/LiteJsonDb/handler/db_operations.py +++ b/LiteJsonDb/handler/db_operations.py @@ -33,7 +33,7 @@ def _load_db(self) -> None: if self.enable_log: logging.info(f"Database file created: {self.filename}") except OSError as e: - print(f"\033[91m#bugs\033[0m Unable to create database file: {e}") + self.logger.error(f"\033[91m#bugs\033[0m Unable to create database file: {e}") raise try: with open(self.filename, 'r') as file: @@ -45,7 +45,7 @@ def _load_db(self) -> None: if self.enable_log: logging.info(f"Database loaded from: {self.filename}") except (OSError, json.JSONDecodeError) as e: - print(f"\033[91m#bugs\033[0m Unable to load database file: {e}") + self.logger.error(f"\033[91m#bugs\033[0m Unable to load database file: {e}") raise def _save_db(self) -> None: @@ -59,7 +59,7 @@ def _save_db(self) -> None: if self.enable_log: logging.info(f"Database saved to {self.filename}") except OSError as e: - print(f"\033[91m#bugs\033[0m Could not save database: {e}") + self.logger.error(f"\033[91m#bugs\033[0m Could not save database: {e}") raise def _backup_db(self) -> None: @@ -72,7 +72,7 @@ def _backup_db(self) -> None: if self.enable_log: logging.info(f"Backup created: {self.backup_filename}") except OSError as e: - print(f"\033[91m#bugs\033[0m Unable to create backup: {e}") + self.logger.error(f"\033[91m#bugs\033[0m Unable to create backup: {e}") raise def _restore_db(self) -> None: @@ -86,9 +86,9 @@ def _restore_db(self) -> None: if self.enable_log: logging.info(f"Database restored from backup: {self.backup_filename}") except OSError as e: - print(f"\033[91m#bugs\033[0m Unable to restore database: {e}") + self.logger.error(f"\033[91m#bugs\033[0m Unable to restore database: {e}") raise else: - print("\033[91m#bugs\033[0m No backup file found.") + self.logger.error("\033[91m#bugs\033[0m No backup file found.") if self.enable_log: logging.error("No backup file found to restore.") \ No newline at end of file diff --git a/LiteJsonDb/handler/encrypt.py b/LiteJsonDb/handler/encrypt.py index fc221cc..ec36a86 100644 --- a/LiteJsonDb/handler/encrypt.py +++ b/LiteJsonDb/handler/encrypt.py @@ -140,5 +140,5 @@ def _fernet_decrypt(self, encoded_data: str) -> Dict[str, Any]: decoded_data = self.fernet.decrypt(encoded_data.encode('utf-8')) return json.loads(decoded_data) except Exception as e: - print("\033[91m#bugs\033[0m Fernet decryption failed.") + self.logger.error("\033[91m#bugs\033[0m Fernet decryption failed.") raise ValueError("\033[91m#bugs\033[0m Decryption failed: invalid key or data.") \ No newline at end of file diff --git a/LiteJsonDb/handler/method.py b/LiteJsonDb/handler/method.py index 6df5bf9..ba05518 100644 --- a/LiteJsonDb/handler/method.py +++ b/LiteJsonDb/handler/method.py @@ -30,13 +30,14 @@ def validate_data(self, data: Any) -> bool: types = {} for key, value in data.items(): if not isinstance(key, str): - print(f"\033[91m#bugs\033[0m Key '{key}' must be a string. Did we stumble upon a non-string key?") + self.logger.error(f"\033[91m#bugs\033[0m Key '{key}' must be a string. Did we stumble upon a non-string key?") return False if key in types and types[key] != type(value): - print(f"\033[91m#bugs\033[0m Conflicting types for key '{key}'.") + self.logger.error(f"\033[91m#bugs\033[0m Conflicting types for key '{key}'.") return False - types[key] = type(value) return all(isinstance(value, (str, int, float, list, dict, bool, None)) for value in data.values()) + self.logger.error(f"\033[91m#bugs\033[0m Data must be a dictionary.") + return False print(f"\033[91m#bugs\033[0m Data must be a dictionary.") return False @@ -107,7 +108,7 @@ def get_data(self, key: str) -> Optional[Any]: if k in data: data = data[k] else: - print(f"\033[91m#bugs\033[0m No data found at key '{key}'. Double-check the key or try a different path.") + self.logger.error(f"\033[91m#bugs\033[0m No data found at key '{key}'. Double-check the key or try a different path.") return None return data @@ -123,11 +124,11 @@ def set_data(self, key: str, value: Optional[Any] = None) -> None: value = {} if not self.validate_data(value): - print(f"\033[91m#bugs\033[0m Invalid data format. Ensure your data is a dictionary with consistent types.") + self.logger.error(f"\033[91m#bugs\033[0m Invalid data format. Ensure your data is a dictionary with consistent types.") return if self.key_exists(key): - print(f"\033[91m#bugs\033[0m Key '{key}' already exists. Use db.edit_data('{key}', new_value) to update or add new data.") + self.logger.error(f"\033[91m#bugs\033[0m Key '{key}' already exists. Use db.edit_data('{key}', new_value) to update or add new data.") return self._set_child(self.db, key, value) @@ -144,11 +145,11 @@ def edit_data(self, key: str, value: Any) -> None: value (Any): The new value. """ if not self.key_exists(key): - print(f"\033[91m#bugs\033[0m Key '{key}' doesn't exist, cannot edit. Use 'set_data' to add new data.") + self.logger.error(f"\033[91m#bugs\033[0m Key '{key}' doesn't exist, cannot edit. Use 'set_data' to add new data.") return if not self.validate_data(value): - print(f"\033[91m#bugs\033[0m Invalid data format. Ensure your data is a dictionary with consistent types.") + self.logger.error(f"\033[91m#bugs\033[0m Invalid data format. Ensure your data is a dictionary with consistent types.") return keys = key.split('/') @@ -165,13 +166,13 @@ def edit_data(self, key: str, value: Any) -> None: if isinstance(increment_value, (int, float)): current_data[field] += increment_value else: - print(f"\033[91m#bugs\033[0m Increment value for '{field}' is not a number. Provide a numeric value for incrementing (e.g., db.edit_data('users/1', {{'increment': {{'score': 5}}}})).") + self.logger.error(f"\033[91m#bugs\033[0m Increment value for '{field}' is not a number. Provide a numeric value for incrementing (e.g., db.edit_data('users/1', {{'increment': {{'score': 5}}}})).") return else: - print(f"\033[91m#bugs\033[0m Field '{field}' is not a number. Ensure the field exists and is a number before incrementing.") + self.logger.error(f"\033[91m#bugs\033[0m Field '{field}' is not a number. Ensure the field exists and is a number before incrementing.") return else: - print(f"\033[91m#bugs\033[0m Field '{field}' doesn't exist. Make sure the field exists in the data structure; use db.edit_data to set initial values.") + self.logger.error(f"\033[91m#bugs\033[0m Field '{field}' doesn't exist. Make sure the field exists in the data structure; use db.edit_data to set initial values.") return else: if isinstance(current_data, dict): @@ -238,14 +239,14 @@ def remove_data(self, key: str) -> None: if k in data: data = data[k] else: - print(f"\033[91m#bugs\033[0m Key '{key}' doesn't exist, cannot remove. Make sure the key path is correct.") + self.logger.error(f"\033[91m#bugs\033[0m Key '{key}' doesn't exist, cannot remove. Make sure the key path is correct.") return if keys[-1] in data: del data[keys[-1]] self._backup_db() self._save_db() else: - print(f"\033[91m#bugs\033[0m Key '{key}' doesn't exist, cannot remove. Make sure the key path is correct.") + self.logger.error(f"\033[91m#bugs\033[0m Key '{key}' doesn't exist, cannot remove. Make sure the key path is correct.") # ================================================== # WHOLE DATABASE @@ -289,7 +290,7 @@ def get_subcollection(self, collection_name: str, item_id: Optional[str] = None) if item_id in collection: return collection[item_id] else: - print(f"\033[91m#bugs\033[0m ID '{item_id}' not found in collection '{collection_name}'. Check if the ID is correct; use get_subcollection('{collection_name}') to see all items.") + self.logger.error(f"\033[91m#bugs\033[0m ID '{item_id}' not found in collection '{collection_name}'. Check if the ID is correct; use get_subcollection('{collection_name}') to see all items.") return None return collection @@ -303,14 +304,14 @@ def set_subcollection(self, collection_name: str, item_id: str, value: Any) -> N value (Any): The value to set. """ if not self.validate_data(value): - print(f"\033[91m#bugs\033[0m Invalid data format. Your data should look like this: {{'name': 'Aliou', 'age': 30}}.") + self.logger.error(f"\033[91m#bugs\033[0m Invalid data format. Your data should look like this: {{'name': 'Aliou', 'age': 30}}.") return if collection_name not in self.db: self.db[collection_name] = {} if item_id in self.db[collection_name]: - print(f"\033[91m#bugs\033[0m ID '{item_id}' already exists in collection '{collection_name}'. Use db.edit_subcollection('{collection_name}', '{item_id}', new_value) to update or add new data.") + self.logger.error(f"\033[91m#bugs\033[0m ID '{item_id}' already exists in collection '{collection_name}'. Use db.edit_subcollection('{collection_name}', '{item_id}', new_value) to update or add new data.") return self.db[collection_name][item_id] = value @@ -327,7 +328,7 @@ def edit_subcollection(self, collection_name: str, item_id: str, value: Any) -> value (Any): The new value. """ if not self.validate_data(value): - print(f"\033[91m#bugs\033[0m Invalid data format. Your data should look like this: {{'name': 'Aliou', 'age': 30}}.") + self.logger.error(f"\033[91m#bugs\033[0m Invalid data format. Your data should look like this: {{'name': 'Aliou', 'age': 30}}.") return if collection_name in self.db and item_id in self.db[collection_name]: @@ -338,7 +339,7 @@ def edit_subcollection(self, collection_name: str, item_id: str, value: Any) -> self._backup_db() self._save_db() else: - print(f"\033[91m#bugs\033[0m ID '{item_id}' not found in collection '{collection_name}', cannot edit. Use 'set_subcollection' to create a new item.") + self.logger.error(f"\033[91m#bugs\033[0m ID '{item_id}' not found in collection '{collection_name}', cannot edit. Use 'set_subcollection' to create a new item.") def remove_subcollection(self, collection_name: str, item_id: Optional[str] = None) -> None: """ @@ -354,7 +355,7 @@ def remove_subcollection(self, collection_name: str, item_id: Optional[str] = No self._backup_db() self._save_db() else: - print(f"\033[91m#bugs\033[0m Collection '{collection_name}' not found, cannot remove. Make sure the collection name is correct.") + self.logger.error(f"\033[91m#bugs\033[0m Collection '{collection_name}' not found, cannot remove. Make sure the collection name is correct.") return else: if collection_name in self.db and item_id in self.db[collection_name]: @@ -362,5 +363,5 @@ def remove_subcollection(self, collection_name: str, item_id: Optional[str] = No self._backup_db() self._save_db() else: - print(f"\033[91m#bugs\033[0m ID '{item_id}' not found in collection '{collection_name}', cannot remove. Check the ID and collection name; use get_subcollection('{collection_name}') to see all items.") + self.logger.error(f"\033[91m#bugs\033[0m ID '{item_id}' not found in collection '{collection_name}', cannot remove. Check the ID and collection name; use get_subcollection('{collection_name}') to see all items.") return \ No newline at end of file diff --git a/LiteJsonDb/modules/__pycache__/__init__.cpython-311.pyc b/LiteJsonDb/modules/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a2521ed92f9d9fbe1c42973d7f573f18f195b7c GIT binary patch literal 347 zcmZ3^%ge<81a*4snJGZ}F^B^LOi;#WEg)k$LkdF*V-7#pF!3>(LFByRvG#PJkI|qlkRutqHm82GdxW%c7MadcQDTyVCK(2sOVsdtA zK}dc`YEEi;QDUy2CfhCMQ$Vd=aPiX%*{_J%}FheiI30B%PfhH*DI*} u#bE;xwJYKQnh0`qu_KW9z|6?Vc!NRa0xG(}Ab$ZB-C$6@fDILa!W0130A8g4 literal 0 HcmV?d00001 diff --git a/LiteJsonDb/modules/__pycache__/csv.cpython-311.pyc b/LiteJsonDb/modules/__pycache__/csv.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e60390e4a9e498e5b38cb79ba1569042de9f2934 GIT binary patch literal 3727 zcmb7GU2GKB6}~e&vwvPg%x;_*chd_duD1cprl3%2kdPM~CkROGG|k#{8Fud4W5zSv znK6s4b>#=7;;Ii$)yi&4lznI^6=_AQN=2%w=7C7Gs?=SyQmm2u)Th2}>Qu6L>N$7z z*8z#n?4CLI-ZSU--tWw>J3GS!uGfbGS|~`!zi?2$q#Cn*9+-8a5>?Pi%6keafse(M z2v1S>%}Xh1UQWsL{*+%JA{is9?B=Rs;&qiHjGG=-M^rX&X=>dK9xX zcnPfOn(Y9SrL7AIZl=vL9e1d`kVCI+nzu9u9b}p_%Pgu;8%8>#8B^C8*N>_dgEGU> zEYI{+#b$$CuN%R@aGX{(E7K?yWD$8E{I_F3)=5DqkTh`K#S1Ae{go@htc@Gs1_ZnW zp@1Wpr+Qv#9$e#-U;dRE2O%I z#1prqO0cKIf7>uio`k(kGYINj34?ZnxbF;Qp1FRDISZDN!Sd8EJT1IjC2;?T!a8y4 zEAX5X>VslyiR+W3K;{~{3S#@IUG{~D6KaT(f=?AxIC~#UcK{>q)p3FxC(Dx4(Ue;i zoJe!juG6Bogsh;-H-oD}v3|~*!ob~u|Gmaca@Y7r!m40>u*=#D4RNx|+Wu8R^*52> zc`O>y=ksh?cA`zYa~w}`T#yR#$ANY~mi+~Pu_Z&z_u8Ws2*|bMt||B25sRyW0sk4{ z4pjbLqxu3-gLt?5B@m;dj|>xA%8NIA?~%M9koSlHcfmJ7`iQf?>A@jl9bXPO@#f6j z-a4;_+N~8^DpHprL=6`LzaSrq?XqZ54K4?M5KzU58kZOH#PcW7p>)8;Z2*A>EjCBg z1~e-Ta2})+b$I;$VXc>7f@|>8!{?lW zO~B*^Jf&)*UbO%zo6kYRgjcYkX`VBlEt*vT{Gc<`qj812OP1sXCwt@sen|lOGB;qb zysjC{4KgERs-Pv)*!r*m5vuU8Zc`vX1Bjdf;JX}N7FNZA(1eHg#UFP}klzpsr$Dzj zIOO`Su|*3vx{WwV>57Ht_(^yKdv?a0&z)ZCZ-x0SFu9&1vlL6K1&CBr@lEn-*26S^~2J-HPW|(sxc#xF2FNvUq;K-9` zAuxFTj5`(tOKI$GZot!SyM9l-D=-@yG`->#o~PaQdqFPk`*O;=LD>EsR2|a$-YaYmZOPEG*Kl&*XhlAt)NEtV}I)TL(lJf|JVzIa_^~1@2R!qX7r^hk-FX% zwuVkVIQD6*Jan!ybguNuyBlh8`1Z_4`Um>YjoZeC@hJJv@xPD%?X7>jwKldDr?QQYa%`Xy8z{vF_{^clu|vO2J&^vQmXC~9j*OOG zy;z(qPCh#HsJk4yREb?G#V%F%qWfMD9{rpL^aZD_^UvaUc6Oe%RDFTOzH;m0&eqUIfoUIrjfJh&l9Axywh$() zV@MDHypxEh-NFwQPW-^wOF&i{cU6?-V3i<=1mr|<0&S@w6dSpl&kd5QTSTS?= z8^zgQzH&cWI&iGgdz>$P66KH5cc=LCnZ$DoJ%WSvHFWH&NDc#W{mxJtQElZ03Jy-7kV{N5ycR`|V1`by9KRi%UgVSbr>j&ol; IWr0WYKT5B&MgRZ+ literal 0 HcmV?d00001 diff --git a/LiteJsonDb/modules/__pycache__/search.cpython-311.pyc b/LiteJsonDb/modules/__pycache__/search.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2bb2d018e32d5001c7b24c2d6cddfddcfa1e05b GIT binary patch literal 4632 zcmb6cZBHD>dG_}0UNJV<;jQ*27@LzX7@As65sl-7f}2{{F(hh%h#a>ATzt2OX7_MG zOT~vsfE6icDTK3Q)Jv5(R900!`a>(_AM`Fdsi&1JS+4q_-%fHZS(aM$nSHyx16S_c z?Ci`l&phwXvvc1?B0&T#)-NWnG$HhNx^UVdd-6ns$u^SFB$64~mtrOvc(W;Anw@0R z+$5LgCwT_R5m~?-7BD;KYj)LI?8N0g1H2@?l`h}EKAXLf{)!j3mZmTX_I;*(Ba|2t;yCw zaFc<<*pU+0QL8z|I)ILY*{}smo8YZRnH{(pW;O%UGq!L}m{B~-W5C{GbD#$tWnBD5 zI`tw_d%cKG1Ewp0Wddi{^?{=ai06cvMY_h|MV51gaERJRVA&8S&eG-Tvas1Z2z54c z>Fj6Za&#vR6hIlTTf9y<0B+jGhC7aOm+r(8&bzedmWLe!dlBG>yWBsqwRLrHCN8Ff z5d0^tjbl;PU@t1m1~;5cXommFqL$1k@zltK!O3wgZiH1FCy9lbrFbff4fZ--HUesP zR@F#SnKzmeaTU*~SW%N&atRv(!CICm3Er){2#GLf;dv5c5L#!~xpiS(+(t=sQ;O$!y(<(|pbjLUY0fw;^nZ8|)k>^Pfg;ikgSZCzONPWZ@q0xet%kR(ah=26Uf} zmKf5Z^988n`fz=nQZT?&rEGz-K2MZv_@X3EH^n1!*orq_|}ILP{zyRj{gIS(3qd)Nf>20*o6; zZNc1C7jYsvmrO|Dw!WZA=pva{2hABJOI6`)awKqNx_hzW2_dr&N4`=nt!7tf|NRRZ}&;wcr^M5_;HFHsY*MwKGIo>bh( zw?(ceP6e^ee$C7akLBxaJ}6!E8a$Cvw0Kg143pAvEdkD)mk3s=(3Y$QG8oz5t)vVk zvV>qon*qZn+&q9N^TX2u&l3nvw8d>B&CLpgbmYyh`gkUP(ow;U?pnMebPpEyUBEE< zC_fE&tL!QVS!U%BqqAS39ae$&DqqL3E}t7XHbMS`bxvn={vPOX-_?UbpS_{c8e%t{ ztIyC?p>CIH*cCT}YOgLFob~nEtO~mLQh4HKgama_7nTs=b#61H^FturXX_w6cips` z3bb^=n%CjnrWeXOt02w1`daEWSmm@9arCAhtJe*z-)>spzZx*D2i3%^VvO#m9@uBc zHp<()(6TH4c60a|hWJsTdZ(71#M2f?COf|Xndhwob|}-ltFIyyB74){Q;upiz$RKt zHhRn|6favj=m}4-OTAD$?22Q9rNy|mAZ6xg#Z#qOOfyF#@g+=DEZ0~+XU>jAMI)G0 zA&0fNlECn}qaQ#%so}J0ut3=0Q<)o>7+fl;YDNGn*)%3`4M&>@{6j&6{w*QRFc{2r zgIO{}1>c}4Xz*}&X2}TJ#nB{{RAl@cgQL_5b+;kf`D`@XXvA>?3BbNeSx|MYwg&C_ zg?9(1KTtuF=}T9qhp~EH%PdZlxH5ei$iAm$l;K(LG@X&NDXdQ0Wp8nryaqH^dTf5Q z^!E*=G6|@FZ}l|_(M4tW1j@y;HT3id3LneGcUnuKw*z+r zRdgsaU=Fvq9FrTU{P<_Zj^X@Nv7-dC?fUw3@dk$bPw8LcAU(Kjnn z&v&8UhrW({6UpnJ1d2?n zFrgn6GeoU87U)^PeU*Y~fTQFWuJr{~ezWp{Aqd$nm^hip0v1*xE=%3|5iAzg`J7<>ZYE z8y70!BcETsdAZnrZ7%_X)l1>=a(KLG_DA8aVz?_mQRu$=>)miEe6AcmS2X)0e_PSt zmTv{>{#e-`EBa%PLPsDZ`1hGgu=(>dH_sH0UD=z4!Rn>p)pGD^F?bcw*2c(5FhP_Z z8<~g(3~^>g&Ln1L$SD9Cg0{Q}9)q~AT4)s^r~ap@ejx(VOsgQf5^)Cw@5#r z(l5RG0EQ~dFih1aGF%nWp&2oU)|%+Af=(4*+^gIm(^5q+!JN8`Q^>FZa%DQh+5`xpH0@J%~-4jcQJvotmP EFL{=#?f?J) literal 0 HcmV?d00001 diff --git a/LiteJsonDb/modules/__pycache__/tgbot.cpython-311.pyc b/LiteJsonDb/modules/__pycache__/tgbot.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03459222a9d641480ab868604c2dd5f47d3e0907 GIT binary patch literal 7369 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 literal 0 HcmV?d00001 diff --git a/LiteJsonDb/modules/csv.py b/LiteJsonDb/modules/csv.py index 0ec8aed..98228e9 100644 --- a/LiteJsonDb/modules/csv.py +++ b/LiteJsonDb/modules/csv.py @@ -1,5 +1,6 @@ import csv import os +import logging from typing import Dict, Any, Union class CSVExporter: @@ -42,5 +43,5 @@ def export(self, data: Union[Dict[str, Any], Any], filename: str = "export.csv") writer.writerows(data if isinstance(data, list) else [data]) return filepath except Exception as e: - print(f"\033[91m#bugs\033[0m CSV export error: {e}") + logging.getLogger('LiteJsonDb').error(f"\033[91m#bugs\033[0m CSV export error: {e}") return "" \ No newline at end of file diff --git a/LiteJsonDb/modules/search.py b/LiteJsonDb/modules/search.py index 31307f5..625dd60 100644 --- a/LiteJsonDb/modules/search.py +++ b/LiteJsonDb/modules/search.py @@ -6,9 +6,10 @@ ██████╔╝███████╗██║░░██║██║░░██║╚█████╔╝██║░░██║██╗██║░░░░░░░░██║░░░ ╚═════╝░╚══════╝╚═╝░░╚═╝╚═╝░░╚═╝░╚════╝░╚═╝░░╚═╝╚═╝╚═╝░░░░░░░░╚═╝░░░ """ +import logging from typing import Any, Dict, Optional -def search_data(data: Dict[str, Any], search_value: Any, key: Optional[str] = None) -> Dict[str, Any]: +def search_data(data: Dict[str, Any], search_value: Any, key: Optional[str] = None, substring: bool = False, case_sensitive: bool = True) -> Dict[str, Any]: """ Search for a value in a nested dictionary or within a specific key. @@ -16,6 +17,8 @@ def search_data(data: Dict[str, Any], search_value: Any, key: Optional[str] = No data (Dict[str, Any]): The dictionary to search within. search_value (Any): The value to search for. key (Optional[str]): If provided, search within this specific key. + substring (bool): If True, perform substring search. Defaults to False. + case_sensitive (bool): If False, perform case-insensitive search. Defaults to True. Returns: Dict[str, Any]: A dictionary containing matching results. @@ -36,21 +39,32 @@ def search_recursive(d: Any, value: Any, current_key: str = ''): new_key = f"{current_key}/{k}" if current_key else k if isinstance(v, dict): search_recursive(v, value, new_key) - elif value in (v, str(v)): - results[new_key] = v + else: + str_v = str(v) + search_str = str(value) + if not case_sensitive: + str_v = str_v.lower() + search_str = search_str.lower() + if substring: + if search_str in str_v: + results[new_key] = v + else: + if value == v or search_str == str_v: + results[new_key] = v elif isinstance(d, list): for index, item in enumerate(d): search_recursive(item, value, f"{current_key}/{index}") + logger = logging.getLogger('LiteJsonDb') if key: if key not in data: - print(f"\033[91m#bugs\033[0m Key '{key}' not found for search.") + logger.error(f"\033[91m#bugs\033[0m Key '{key}' not found for search.") else: search_recursive(data[key], search_value) else: search_recursive(data, search_value) if not results: - print(f"\033[90m#info\033[0m Value '{search_value}' not found.") + logger.info(f"\033[90m#info\033[0m Value '{search_value}' not found.") return results \ No newline at end of file diff --git a/LiteJsonDb/utility/__pycache__/__init__.cpython-311.pyc b/LiteJsonDb/utility/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1181fa84527f57870915c583924a8afd65044427 GIT binary patch literal 594 zcmd6j%}N6?6or%dX=ggq`u7yw^Z|+pVizJJg189-A$C$5JDCj09kp(J23J0U_&n~i zb>*(mT~{We=p%R+U(UUOa}W2W-|rz;kE5=5bML!vek%AD>#-Bhs6-{Mki-PbfCMrm zp^Qi*V-m{_>BuhW%7i2`C8_L@p3F#wQ5jsIVfcZa!7#IXQ&rz`4HOhD8E_Di+rc#l zsx&S6jI|ZmodsV~elH9dKW1fV2es0YRpNnD_i1cCs~7;U>5Wmf&1Rwk?hF_(n;PZ( zzhr;T%$zpNm^-DN$#l-Ai{F0Buv&okR4p_u*u2pkU`ZP-YB(F_Hf}*wMu#rEjyz(I zjz`xc@kl-V4Rz*`d-NS%(b^Gh4v)sgrQzBX$LGa_n+2$*(5x;_1@IG>e{%I#`jrBf q1*O8Jqjc0PH_5(KWn1wBz3UwPEzOg|D#RGCf(QpI^e>>dU8+w7ZlP2F literal 0 HcmV?d00001 diff --git a/LiteJsonDb/utility/__pycache__/utils.cpython-311.pyc b/LiteJsonDb/utility/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..891d3a61ca0664b501ea951a27259110190d54e6 GIT binary patch literal 7729 zcmcIpU2GdycAnvnM3Is$ONwnNUgyg8T9%?PmH$?jQ`sA74Lf!eH?p&9#a?B^xfDkl zakw)>$>uepKUaEmsTn*dc81?q=B_@O}4hXO-`h1CHT2vYQ6-&D8{ zMSueR&K;8CNOsbPb~HTq@7#0GIrrRi&K><_Q&UvJ^9S*I?H_kY(!Wuo@-&t!PtyTO zx+|&Dn54>TK$pj4Q3l2Wq704&MHw0kp$zKbnYyt$nQ%jT{Y+#mGSe{DFcTe%&cw!I zGmT@77z^_zwT=g;f|bRRA+`QyXl$FhSB>x}Z{m?;puI9EsSUu7@(AWck`Xm_Gd#Ba zTkx8J*9eL`o{3ktbq#RP1pF5DrDx7)1_wI?*IT&5N-f~174sUm(yfuAl{ai1pOksC zPu99`rjo2v+rVd=%D#2IhUcv3*X>T;4849M=a6t0Bz!^LEi}*sUA2RUooWZ#USBi# zdJ%oQo~gZO>w6FIcLN{$ss=#wJ7~A7fl;ZuGy6{=Ns4~;izRyR-2Lhow<~Y8M^rq7 zT1d!#9N%<5oy`-!b+k&^k9p^AmDlP3DjxRjukL*O)tzN}%RL{Jn|JP4dTNk2MD<8{ zM5J1XS#mZ`$cx))4TM^U*0!GthX zcD>O`|Nk4Wkh8ii8#}Yr(rOi7qxCAg6-KckQKDEYoL`j6mU$adtGQ~=7WI&ZDh6Fk zxxA`3v4U`?mgc57Yo{K-pI0ql4cec#Efaoi?j7le*RZ% zVxC#qi5boI7GoFRKEy6&b)CJGh)fsW;in@ zrg*~cWS6J`)y{IAr41X{2|cTFHQpWY1R!j;DQOxrnq?#nb4IbdWwQaySi}JPdT?mq z>Sc?Y*448YuMTr-+BPy*O(lKxf@bqKEF(QUQCrR08a8kKDwS3|Gw-%0jPxuw?Qz=} zudrus2kACigW~U^^zX6OQf$wYSkL2F&q{wWcC-{b>V%Fy#h~PdFiUZR(|q2oS9wy& z>UM%OTX_(QJWa<@xhv(QLS@8P=Hy)9Q{+mY;paU;Rt?b~>x*S!msa9hzQGnN?<_In$EZInE#g z(<}x}Ti(twMVyT|Y%e&;?FT^xecYe4JhM=IbNo0?n38o!rBS2 zD18~*{$c+I{mVo7UBy^uDc0$PI?ZMb`Lsn8>GyOG0JJ6Nq*=*Ct~e^?0y(r_L%)df z!G+186i-YO_ln@1Ux(dWz2e-W6ZX{0tTb1qHGQ5bs>(E*&1rTD=oRUOUgGSW4fW|7 zPQL;TC2(F~iIXN*HJ-LRFP(WHnIwc?-W|}_xVI*WjRnjOAQ9u%UI2((A6-%xf4cb7 zwe77-_FD6<#o?vapPgHaH7_0WM6Vtq;FH+&dpZb!lv%#{Tx0nZ7@y(iJ;Rc}4Z{g6 zTpOXoqH7B{Un#@lkX%HOIv)6e-$pVj>eg#Zk$m14ph- zaP}bR2I9XX?9B~}t@7=_*U{Hhc)o-&lNnstm#)Y=PC~|C(~X3pTZ8cpobQ6Rbr4`t za$TP%k(Kb$(1+(fIQRbfTj%pHRENY4JpeCoBs10nSs1_Pb;<_sU(zJ{`)Q5x z?u#{6+y1WO*ByVe=Wq9ba4|MmLT_kL&~~M-<+vNoC?>3oxORgU&-ji*1muKG^uto_ zN|Vx!;PV`aU!lX&wXE2J(2a0THY4O-7Cfly2Y+&ZKSi1%(|5;Rd8pTe1O>y%6ez1{Vm7d?cz zf{sT;o_6I~w?571g#FfI6rPnHVQeNv4*|MRvHlDI{-tr-;t$rE+wMmHIC{JBqsDb9 z9PSd}{m_!U)VJ1i)M+`n+>^J8E&B?;S8O@xv>bfcxm5p~*bB?b{kCFkZz;BST?#gI ztu^lW@WKZd?(ZomE4x+`PWwQyeW27n@TC3p{Ff0#DFmTxL#c67RfMB7o7~iYk)Jx|y~~#hR|;2F>|c%l z`8ax(hN~k&$sQ8{&$7hwq+a%(=cr;eE1LZnI7~}?$6Mmd$`YWMzXVW>9V?+Pl!bDiC9%@V^jfveOMv*_(1Tu=!TOEN2N*6~BlXj0z8tq3p^a17QjE zo0Lr)Cj?4XDAC)od>}uxvdf9}6=Qv+Sf3N>^Q<^RRx@Xqs?Tu9X9_i#sQA?|RaFT* zcCFz9(|f+j3qIT5`e%p)@rp>ig+?;EqNRm(6Q32omN4ftwlRsTLrP2FiUY@IW;CAQ zEGyEy(X-!wr;xA(zOXFHl+Xwo-K_V5qBF>{JN@5 z;$XoU{w~C+jf+h*YrLW_a|pu&ghC#Vblh@lFn{QiS3iEW*zt0ywfs9@Q0^d;Wgn?@#H#;FbNe3$&M&T(!9K1?O45EqY4ON^0 z7G-zV3jmZ7@4WxYN~GA)SL*0{ykTrU6C?8yCiZ`k7G{TFm7_`;?pP#-xD#aU40%*s z(q;`!Wj`7nWwTj5%}r&3u1ey*dYk}KBIbYtmdU7MG{cBI+Gc@RtYvQ##8s*7FWN~)KgLp-(;2D}elty4%u zg_pkoN?bh$Q#a^hkDC#uW+zif_vcdcwf9J5{HNHP%KQY6$K&K(kl^E&;YLPBMx4Tx zU&B0{1X6?vEf_i+5W@ul?uh~mU9do&YbN~91cUe%-O7DCM6p^#k6)v5R}%T}rH%a8 zXPN=K#uaQzv%cp`$Tp=p&vqdyt_glB&%q0*K|dZ+K+3r<<5+}T`L%`6LES#-%7ds( z+9%;bUxqM9Nb&su0RXNA_D*@N&y|{;=vmlrl?`g#Gp3rLR?W|UKvSmy7NvDbZtUFv z|JvNK99+J<9+aAz|9QZ9=iPs~_FnP4QaZ0VJM=sIm-+3Uk9wZ89C+MvpfI{}u-MX9 zYUz8@a^i8ziHG|i&K6tFlv>U>cqjD@qN3(S#(h}SJV48nLoOf8?VDIO-^AGKghXP4 z$GQrSYkT*7GWGG)FZFx+dJvueLEQgmS%h$}SYwMdi1RuEO8$^gyT4OaJIIOujC>yS zC(izy1ON31VW+|i@4iXjsD!&OXEaD}yj$%ASMXIMi7!a_tR=pbP>NgL65kbiPQIgyF+YmTDgD)?2_}YLgiQ9-AxbNV`lryq4P_zUWcaq+M|9?D-7cEsDQ2Y5Su1Ta%id%DX1L z==k3?>A3U1d)Gq&`B-89x`bloP^ssnsBH$3fV_|T_T}61iNcY5>K^U{Xs#qg@o-2K zUmOv|W)KO>JMzPY)gAL+>MqiNd*f$+`R^XY87D`C94Xk44{RurnYZ zUsm%+3&Fx@A#!i9w6lj6JHC4TQQM=$7e^kY{$a0k`l9ppJI?8MO5gjT7<8__=P2As zYR+`pNv2DRQM#HDBbx#Ad6@bRFAr}>SZX^Y`c|$#Y`@Ao?WXTR9*^uJkp zRY-i;xpGb5I8$lIupE2Nna??Pu4LROO+nTQ*_s-bI*}LqbE4oCGWkGWwFK7-B;b#JI GJpKoO;wxVO literal 0 HcmV?d00001